Chromium Code Reviews| Index: chrome/browser/policy/configuration_policy_pref_store.cc |
| diff --git a/chrome/browser/policy/configuration_policy_pref_store.cc b/chrome/browser/policy/configuration_policy_pref_store.cc |
| index 3c7ea6ad7ba8d67eac0719b3a7821000796f9f88..c9e4054873eb45c51ad0ee42cc1869bdfad43b59 100644 |
| --- a/chrome/browser/policy/configuration_policy_pref_store.cc |
| +++ b/chrome/browser/policy/configuration_policy_pref_store.cc |
| @@ -4,6 +4,10 @@ |
| #include "chrome/browser/policy/configuration_policy_pref_store.h" |
| +#include <set> |
| +#include <string> |
| +#include <vector> |
| + |
| #include "base/command_line.h" |
| #include "base/lazy_instance.h" |
| #include "base/logging.h" |
| @@ -13,8 +17,6 @@ |
| #include "base/string_util.h" |
| #include "base/utf_string_conversions.h" |
| #include "base/values.h" |
| -#include "chrome/browser/prefs/proxy_prefs.h" |
| -#include "chrome/browser/profiles/profile.h" |
| #include "chrome/browser/policy/configuration_policy_provider.h" |
| #if defined(OS_WIN) |
| #include "chrome/browser/policy/configuration_policy_provider_win.h" |
| @@ -26,101 +28,137 @@ |
| #include "chrome/browser/policy/device_management_policy_provider.h" |
| #include "chrome/browser/policy/dummy_configuration_policy_provider.h" |
| #include "chrome/browser/policy/profile_policy_context.h" |
| +#include "chrome/browser/prefs/pref_value_map.h" |
| +#include "chrome/browser/prefs/proxy_prefs.h" |
| +#include "chrome/browser/profiles/profile.h" |
| #include "chrome/browser/search_engines/search_terms_data.h" |
| #include "chrome/browser/search_engines/template_url.h" |
| #include "chrome/common/chrome_paths.h" |
| #include "chrome/common/chrome_switches.h" |
| +#include "chrome/common/notification_service.h" |
| #include "chrome/common/policy_constants.h" |
| #include "chrome/common/pref_names.h" |
| namespace policy { |
| -// Manages the lifecycle of the shared platform-specific policy providers for |
| -// managed platform, device management and recommended policy. Instantiated as a |
| -// Singleton. |
| -class ConfigurationPolicyProviderKeeper { |
| +// Accepts policy settings from a ConfigurationPolicyProvider, converts them |
| +// to preferences and caches the result. |
| +class ConfigurationPolicyPrefKeeper |
| + : private ConfigurationPolicyStoreInterface { |
| public: |
| - ConfigurationPolicyProviderKeeper() |
| - : managed_platform_provider_(CreateManagedPlatformProvider()), |
| - device_management_provider_(CreateDeviceManagementProvider()), |
| - recommended_provider_(CreateRecommendedProvider()) {} |
| - virtual ~ConfigurationPolicyProviderKeeper() {} |
| - |
| - ConfigurationPolicyProvider* managed_platform_provider() const { |
| - return managed_platform_provider_.get(); |
| - } |
| + explicit ConfigurationPolicyPrefKeeper(ConfigurationPolicyProvider* provider); |
| + virtual ~ConfigurationPolicyPrefKeeper(); |
| - ConfigurationPolicyProvider* device_management_provider() const { |
| - return device_management_provider_.get(); |
| - } |
| + // Get a preference value. |
| + PrefStore::ReadResult GetValue(const std::string& key, Value** result) const; |
| - ConfigurationPolicyProvider* recommended_provider() const { |
| - return recommended_provider_.get(); |
| - } |
| + // Compute the set of preference names that are different in |keeper|. This |
| + // includes preferences that are missing in either one. |
| + void GetDifferingPrefPaths(const ConfigurationPolicyPrefKeeper* other, |
| + std::vector<std::string>* differing_prefs) const; |
| private: |
| - scoped_ptr<ConfigurationPolicyProvider> managed_platform_provider_; |
| - scoped_ptr<ConfigurationPolicyProvider> device_management_provider_; |
| - scoped_ptr<ConfigurationPolicyProvider> recommended_provider_; |
| - |
| - static ConfigurationPolicyProvider* CreateManagedPlatformProvider(); |
| - static ConfigurationPolicyProvider* CreateDeviceManagementProvider(); |
| - static ConfigurationPolicyProvider* CreateRecommendedProvider(); |
| + // ConfigurationPolicyStore methods: |
| + virtual void Apply(ConfigurationPolicyType setting, Value* value); |
| + |
| + // Policies that map to a single preference are handled |
| + // by an automated converter. Each one of these policies |
| + // has an entry in |simple_policy_map_| with the following type. |
| + struct PolicyToPreferenceMapEntry { |
| + Value::ValueType value_type; |
| + ConfigurationPolicyType policy_type; |
| + const char* preference_path; // A DictionaryValue path, not a file path. |
| + }; |
| - DISALLOW_COPY_AND_ASSIGN(ConfigurationPolicyProviderKeeper); |
| + typedef std::set<const char*> ProxyPreferenceSet; |
| + |
| + // Returns the map entry that corresponds to |policy| in the map. |
| + const PolicyToPreferenceMapEntry* FindPolicyInMap( |
| + ConfigurationPolicyType policy, |
| + const PolicyToPreferenceMapEntry* map, |
| + int size) const; |
| + |
| + // Remove the preferences found in the map from |prefs_|. Returns true if |
|
danno
2010/12/23 12:16:33
nit: comment indentation
|
| + // any such preferences were found and removed. |
| + bool RemovePreferencesOfMap(const PolicyToPreferenceMapEntry* map, |
| + int table_size); |
| + |
| + bool ApplyPolicyFromMap(ConfigurationPolicyType policy, |
| + Value* value, |
| + const PolicyToPreferenceMapEntry* map, |
| + int size); |
| + |
| + // Processes proxy-specific policies. Returns true if the specified policy |
| + // is a proxy-related policy. ApplyProxyPolicy assumes the ownership |
| + // of |value| in the case that the policy is proxy-specific. |
| + bool ApplyProxyPolicy(ConfigurationPolicyType policy, Value* value); |
| + |
| + // Handles sync-related policies. Returns true if the policy was handled. |
| + // Assumes ownership of |value| in that case. |
| + bool ApplySyncPolicy(ConfigurationPolicyType policy, Value* value); |
| + |
| + // Handles policies that affect AutoFill. Returns true if the policy was |
| + // handled and assumes ownership of |value| in that case. |
| + bool ApplyAutoFillPolicy(ConfigurationPolicyType policy, Value* value); |
| + |
| + // Make sure that the |path| if present in |prefs_|. If not, set it to |
| + // a blank string. |
| + void EnsureStringPrefExists(const std::string& path); |
| + |
| + // If the required entries for default search are specified and valid, |
| + // finalizes the policy-specified configuration by initializing the |
| + // unspecified map entries. Otherwise wipes all default search related |
| + // map entries from |prefs_|. |
| + void FinalizeDefaultSearchPolicySettings(); |
| + |
| + // If the required entries for the proxy settings are specified and valid, |
| + // finalizes the policy-specified configuration by initializing the |
| + // respective values in |prefs_|. |
| + void FinalizeProxyPolicySettings(); |
| + |
| + // Returns true if the policy values stored in proxy_* represent a valid |
| + // proxy configuration. |
| + bool CheckProxySettings(); |
| + |
| + // Assumes CheckProxySettings returns true and applies the values stored |
| + // in proxy_*. |
| + void ApplyProxySettings(); |
| + |
| + bool HasProxyPolicy(ConfigurationPolicyType policy) const; |
| + |
| + // Temporary cache that stores values until FinalizeProxyPolicySettings() |
| + // is called. |
| + std::map<ConfigurationPolicyType, Value*> proxy_policies_; |
| + |
| + // Set to false until the first proxy-relevant policy is applied. At that |
| + // time, default values are provided for all proxy-relevant prefs |
| + // to override any values set from stores with a lower priority. |
| + bool lower_priority_proxy_settings_overridden_; |
| + |
| + // The following are used to track what proxy-relevant policy has been applied |
| + // accross calls to Apply to provide a warning if a policy specifies a |
| + // contradictory proxy configuration. |proxy_disabled_| is set to true if and |
| + // only if the kPolicyNoProxyServer has been applied, |
| + // |proxy_configuration_specified_| is set to true if and only if any other |
| + // proxy policy other than kPolicyNoProxyServer has been applied. |
| + bool proxy_disabled_; |
| + bool proxy_configuration_specified_; |
| + |
| + // Set to true if a the proxy mode policy has been set to force Chrome |
| + // to use the system proxy. |
| + bool use_system_proxy_; |
| + |
| + PrefValueMap prefs_; |
| + |
| + static const PolicyToPreferenceMapEntry kSimplePolicyMap[]; |
| + static const PolicyToPreferenceMapEntry kProxyPolicyMap[]; |
| + static const PolicyToPreferenceMapEntry kDefaultSearchPolicyMap[]; |
| + |
| + DISALLOW_COPY_AND_ASSIGN(ConfigurationPolicyPrefKeeper); |
| }; |
| -static base::LazyInstance<ConfigurationPolicyProviderKeeper> |
| - g_configuration_policy_provider_keeper(base::LINKER_INITIALIZED); |
| - |
| -ConfigurationPolicyProvider* |
| - ConfigurationPolicyProviderKeeper::CreateManagedPlatformProvider() { |
| - const ConfigurationPolicyProvider::PolicyDefinitionList* policy_list = |
| - ConfigurationPolicyPrefStore::GetChromePolicyDefinitionList(); |
| -#if defined(OS_WIN) |
| - return new ConfigurationPolicyProviderWin(policy_list); |
| -#elif defined(OS_MACOSX) |
| - return new ConfigurationPolicyProviderMac(policy_list); |
| -#elif defined(OS_POSIX) |
| - FilePath config_dir_path; |
| - if (PathService::Get(chrome::DIR_POLICY_FILES, &config_dir_path)) { |
| - return new ConfigDirPolicyProvider( |
| - policy_list, |
| - config_dir_path.Append(FILE_PATH_LITERAL("managed"))); |
| - } else { |
| - return new DummyConfigurationPolicyProvider(policy_list); |
| - } |
| -#else |
| - return new DummyConfigurationPolicyProvider(policy_list); |
| -#endif |
| -} |
| - |
| -ConfigurationPolicyProvider* |
| - ConfigurationPolicyProviderKeeper::CreateDeviceManagementProvider() { |
| - return new DummyConfigurationPolicyProvider( |
| - ConfigurationPolicyPrefStore::GetChromePolicyDefinitionList()); |
| -} |
| - |
| -ConfigurationPolicyProvider* |
| - ConfigurationPolicyProviderKeeper::CreateRecommendedProvider() { |
| - const ConfigurationPolicyProvider::PolicyDefinitionList* policy_list = |
| - ConfigurationPolicyPrefStore::GetChromePolicyDefinitionList(); |
| -#if defined(OS_POSIX) && !defined(OS_MACOSX) |
| - FilePath config_dir_path; |
| - if (PathService::Get(chrome::DIR_POLICY_FILES, &config_dir_path)) { |
| - return new ConfigDirPolicyProvider( |
| - policy_list, |
| - config_dir_path.Append(FILE_PATH_LITERAL("recommended"))); |
| - } else { |
| - return new DummyConfigurationPolicyProvider(policy_list); |
| - } |
| -#else |
| - return new DummyConfigurationPolicyProvider(policy_list); |
| -#endif |
| -} |
| - |
| -const ConfigurationPolicyPrefStore::PolicyToPreferenceMapEntry |
| - ConfigurationPolicyPrefStore::kSimplePolicyMap[] = { |
| +const ConfigurationPolicyPrefKeeper::PolicyToPreferenceMapEntry |
| + ConfigurationPolicyPrefKeeper::kSimplePolicyMap[] = { |
| { Value::TYPE_STRING, kPolicyHomePage, prefs::kHomePage }, |
| { Value::TYPE_BOOLEAN, kPolicyHomepageIsNewTabPage, |
| prefs::kHomePageIsNewTabPage }, |
| @@ -201,8 +239,8 @@ const ConfigurationPolicyPrefStore::PolicyToPreferenceMapEntry |
| #endif |
| }; |
| -const ConfigurationPolicyPrefStore::PolicyToPreferenceMapEntry |
| - ConfigurationPolicyPrefStore::kDefaultSearchPolicyMap[] = { |
| +const ConfigurationPolicyPrefKeeper::PolicyToPreferenceMapEntry |
| + ConfigurationPolicyPrefKeeper::kDefaultSearchPolicyMap[] = { |
| { Value::TYPE_BOOLEAN, kPolicyDefaultSearchProviderEnabled, |
| prefs::kDefaultSearchProviderEnabled }, |
| { Value::TYPE_STRING, kPolicyDefaultSearchProviderName, |
| @@ -219,153 +257,53 @@ const ConfigurationPolicyPrefStore::PolicyToPreferenceMapEntry |
| prefs::kDefaultSearchProviderEncodings }, |
| }; |
| -const ConfigurationPolicyPrefStore::PolicyToPreferenceMapEntry |
| - ConfigurationPolicyPrefStore::kProxyPolicyMap[] = { |
| +const ConfigurationPolicyPrefKeeper::PolicyToPreferenceMapEntry |
| + ConfigurationPolicyPrefKeeper::kProxyPolicyMap[] = { |
| { Value::TYPE_STRING, kPolicyProxyServer, prefs::kProxyServer }, |
| { Value::TYPE_STRING, kPolicyProxyPacUrl, prefs::kProxyPacUrl }, |
| { Value::TYPE_STRING, kPolicyProxyBypassList, prefs::kProxyBypassList } |
| }; |
| -/* static */ |
| -const ConfigurationPolicyProvider::PolicyDefinitionList* |
| -ConfigurationPolicyPrefStore::GetChromePolicyDefinitionList() { |
| - static ConfigurationPolicyProvider::PolicyDefinitionList::Entry entries[] = { |
| - { kPolicyHomePage, Value::TYPE_STRING, key::kHomepageLocation }, |
| - { kPolicyHomepageIsNewTabPage, Value::TYPE_BOOLEAN, |
| - key::kHomepageIsNewTabPage }, |
| - { kPolicyRestoreOnStartup, Value::TYPE_INTEGER, key::kRestoreOnStartup }, |
| - { kPolicyURLsToRestoreOnStartup, Value::TYPE_LIST, |
| - key::kURLsToRestoreOnStartup }, |
| - { kPolicyDefaultSearchProviderEnabled, Value::TYPE_BOOLEAN, |
| - key::kDefaultSearchProviderEnabled }, |
| - { kPolicyDefaultSearchProviderName, Value::TYPE_STRING, |
| - key::kDefaultSearchProviderName }, |
| - { kPolicyDefaultSearchProviderKeyword, Value::TYPE_STRING, |
| - key::kDefaultSearchProviderKeyword }, |
| - { kPolicyDefaultSearchProviderSearchURL, Value::TYPE_STRING, |
| - key::kDefaultSearchProviderSearchURL }, |
| - { kPolicyDefaultSearchProviderSuggestURL, Value::TYPE_STRING, |
| - key::kDefaultSearchProviderSuggestURL }, |
| - { kPolicyDefaultSearchProviderIconURL, Value::TYPE_STRING, |
| - key::kDefaultSearchProviderIconURL }, |
| - { kPolicyDefaultSearchProviderEncodings, Value::TYPE_STRING, |
| - key::kDefaultSearchProviderEncodings }, |
| - { kPolicyProxyMode, Value::TYPE_INTEGER, key::kProxyMode }, |
| - { kPolicyProxyServer, Value::TYPE_STRING, key::kProxyServer }, |
| - { kPolicyProxyPacUrl, Value::TYPE_STRING, key::kProxyPacUrl }, |
| - { kPolicyProxyBypassList, Value::TYPE_STRING, key::kProxyBypassList }, |
| - { kPolicyAlternateErrorPagesEnabled, Value::TYPE_BOOLEAN, |
| - key::kAlternateErrorPagesEnabled }, |
| - { kPolicySearchSuggestEnabled, Value::TYPE_BOOLEAN, |
| - key::kSearchSuggestEnabled }, |
| - { kPolicyDnsPrefetchingEnabled, Value::TYPE_BOOLEAN, |
| - key::kDnsPrefetchingEnabled }, |
| - { kPolicyDisableSpdy, Value::TYPE_BOOLEAN, key::kDisableSpdy }, |
| - { kPolicySafeBrowsingEnabled, Value::TYPE_BOOLEAN, |
| - key::kSafeBrowsingEnabled }, |
| - { kPolicyMetricsReportingEnabled, Value::TYPE_BOOLEAN, |
| - key::kMetricsReportingEnabled }, |
| - { kPolicyPasswordManagerEnabled, Value::TYPE_BOOLEAN, |
| - key::kPasswordManagerEnabled }, |
| - { kPolicyPasswordManagerAllowShowPasswords, Value::TYPE_BOOLEAN, |
| - key::kPasswordManagerAllowShowPasswords }, |
| - { kPolicyAutoFillEnabled, Value::TYPE_BOOLEAN, key::kAutoFillEnabled }, |
| - { kPolicyDisabledPlugins, Value::TYPE_LIST, key::kDisabledPlugins }, |
| - { kPolicyApplicationLocale, Value::TYPE_STRING, |
| - key::kApplicationLocaleValue }, |
| - { kPolicySyncDisabled, Value::TYPE_BOOLEAN, key::kSyncDisabled }, |
| - { kPolicyExtensionInstallAllowList, Value::TYPE_LIST, |
| - key::kExtensionInstallAllowList }, |
| - { kPolicyExtensionInstallDenyList, Value::TYPE_LIST, |
| - key::kExtensionInstallDenyList }, |
| - { kPolicyExtensionInstallForceList, Value::TYPE_LIST, |
| - key::kExtensionInstallForceList }, |
| - { kPolicyShowHomeButton, Value::TYPE_BOOLEAN, key::kShowHomeButton }, |
| - { kPolicyPrintingEnabled, Value::TYPE_BOOLEAN, key::kPrintingEnabled }, |
| - { kPolicyJavascriptEnabled, Value::TYPE_BOOLEAN, key::kJavascriptEnabled }, |
| - { kPolicySavingBrowserHistoryDisabled, Value::TYPE_BOOLEAN, |
| - key::kSavingBrowserHistoryDisabled }, |
| - { kPolicyDeveloperToolsDisabled, Value::TYPE_BOOLEAN, |
| - key::kDeveloperToolsDisabled }, |
| - { kPolicyBlockThirdPartyCookies, Value::TYPE_BOOLEAN, |
| - key::kBlockThirdPartyCookies }, |
| - { kPolicyDefaultCookiesSetting, Value::TYPE_INTEGER, |
| - key::kDefaultCookiesSetting }, |
| - { kPolicyDefaultImagesSetting, Value::TYPE_INTEGER, |
| - key::kDefaultImagesSetting }, |
| - { kPolicyDefaultJavaScriptSetting, Value::TYPE_INTEGER, |
| - key::kDefaultJavaScriptSetting }, |
| - { kPolicyDefaultPluginsSetting, Value::TYPE_INTEGER, |
| - key::kDefaultPluginsSetting }, |
| - { kPolicyDefaultPopupsSetting, Value::TYPE_INTEGER, |
| - key::kDefaultPopupsSetting }, |
| - { kPolicyDefaultNotificationSetting, Value::TYPE_INTEGER, |
| - key::kDefaultNotificationSetting }, |
| - { kPolicyDefaultGeolocationSetting, Value::TYPE_INTEGER, |
| - key::kDefaultGeolocationSetting }, |
| - { kPolicyAuthSchemes, Value::TYPE_STRING, key::kAuthSchemes }, |
| - { kPolicyDisableAuthNegotiateCnameLookup, Value::TYPE_BOOLEAN, |
| - key::kDisableAuthNegotiateCnameLookup }, |
| - { kPolicyEnableAuthNegotiatePort, Value::TYPE_BOOLEAN, |
| - key::kEnableAuthNegotiatePort }, |
| - { kPolicyAuthServerWhitelist, Value::TYPE_STRING, |
| - key::kAuthServerWhitelist }, |
| - { kPolicyAuthNegotiateDelegateWhitelist, Value::TYPE_STRING, |
| - key::kAuthNegotiateDelegateWhitelist }, |
| - { kPolicyGSSAPILibraryName, Value::TYPE_STRING, |
| - key::kGSSAPILibraryName }, |
| - { kPolicyDisable3DAPIs, Value::TYPE_BOOLEAN, |
| - key::kDisable3DAPIs }, |
| - |
| -#if defined(OS_CHROMEOS) |
| - { kPolicyChromeOsLockOnIdleSuspend, Value::TYPE_BOOLEAN, |
| - key::kChromeOsLockOnIdleSuspend }, |
| -#endif |
| - }; |
| - |
| - static ConfigurationPolicyProvider::PolicyDefinitionList policy_list = { |
| - entries, |
| - entries + arraysize(entries), |
| - }; |
| - return &policy_list; |
| -} |
| - |
| -ConfigurationPolicyPrefStore::ConfigurationPolicyPrefStore( |
| +ConfigurationPolicyPrefKeeper::ConfigurationPolicyPrefKeeper( |
| ConfigurationPolicyProvider* provider) |
| - : provider_(provider), |
| - prefs_(new DictionaryValue()) { |
| - if (!provider_->Provide(this)) |
| + : lower_priority_proxy_settings_overridden_(false), |
| + proxy_disabled_(false), |
| + proxy_configuration_specified_(false), |
| + use_system_proxy_(false) { |
| + if (!provider->Provide(this)) |
| LOG(WARNING) << "Failed to get policy from provider."; |
| FinalizeProxyPolicySettings(); |
| FinalizeDefaultSearchPolicySettings(); |
| } |
| -ConfigurationPolicyPrefStore::~ConfigurationPolicyPrefStore() { |
| +ConfigurationPolicyPrefKeeper::~ConfigurationPolicyPrefKeeper() { |
| DCHECK(proxy_policies_.empty()); |
| } |
| -PrefStore::ReadResult ConfigurationPolicyPrefStore::GetValue( |
| - const std::string& key, |
| - Value** value) const { |
| - Value* configured_value = NULL; |
| - if (!prefs_->Get(key, &configured_value) || !configured_value) |
| - return READ_NO_VALUE; |
| +PrefStore::ReadResult |
| +ConfigurationPolicyPrefKeeper::GetValue(const std::string& key, |
| + Value** result) const { |
| + Value* stored_value = NULL; |
| + if (!prefs_.GetValue(key, &stored_value)) |
| + return PrefStore::READ_NO_VALUE; |
| // Check whether there's a default value, which indicates READ_USE_DEFAULT |
| // should be returned. |
| - if (configured_value->IsType(Value::TYPE_NULL)) |
| - return READ_USE_DEFAULT; |
| + if (stored_value->IsType(Value::TYPE_NULL)) |
| + return PrefStore::READ_USE_DEFAULT; |
| - *value = configured_value; |
| - return READ_OK; |
| + *result = stored_value; |
| + return PrefStore::READ_OK; |
| } |
| -DictionaryValue* ConfigurationPolicyPrefStore::prefs() const { |
| - return prefs_.get(); |
| +void ConfigurationPolicyPrefKeeper::GetDifferingPrefPaths( |
| + const ConfigurationPolicyPrefKeeper* other, |
| + std::vector<std::string>* differing_prefs) const { |
| + prefs_.GetDifferingKeys(&other->prefs_, differing_prefs); |
| } |
| -void ConfigurationPolicyPrefStore::Apply(ConfigurationPolicyType policy, |
| - Value* value) { |
| +void ConfigurationPolicyPrefKeeper::Apply(ConfigurationPolicyType policy, |
| + Value* value) { |
| if (ApplyProxyPolicy(policy, value)) |
| return; |
| @@ -388,36 +326,8 @@ void ConfigurationPolicyPrefStore::Apply(ConfigurationPolicyType policy, |
| delete value; |
| } |
| -// static |
| -ConfigurationPolicyPrefStore* |
| -ConfigurationPolicyPrefStore::CreateManagedPlatformPolicyPrefStore() { |
| - return new ConfigurationPolicyPrefStore( |
| - g_configuration_policy_provider_keeper.Get().managed_platform_provider()); |
| -} |
| - |
| -// static |
| -ConfigurationPolicyPrefStore* |
| -ConfigurationPolicyPrefStore::CreateDeviceManagementPolicyPrefStore( |
| - Profile* profile) { |
| - ConfigurationPolicyProviderKeeper* keeper = |
| - g_configuration_policy_provider_keeper.Pointer(); |
| - ConfigurationPolicyProvider* provider = NULL; |
| - if (profile) |
| - provider = profile->GetPolicyContext()->GetDeviceManagementPolicyProvider(); |
| - if (!provider) |
| - provider = keeper->device_management_provider(); |
| - return new ConfigurationPolicyPrefStore(provider); |
| -} |
| - |
| -// static |
| -ConfigurationPolicyPrefStore* |
| -ConfigurationPolicyPrefStore::CreateRecommendedPolicyPrefStore() { |
| - return new ConfigurationPolicyPrefStore( |
| - g_configuration_policy_provider_keeper.Get().recommended_provider()); |
| -} |
| - |
| -const ConfigurationPolicyPrefStore::PolicyToPreferenceMapEntry* |
| -ConfigurationPolicyPrefStore::FindPolicyInMap( |
| +const ConfigurationPolicyPrefKeeper::PolicyToPreferenceMapEntry* |
| +ConfigurationPolicyPrefKeeper::FindPolicyInMap( |
| ConfigurationPolicyType policy, |
| const PolicyToPreferenceMapEntry* map, |
| int table_size) const { |
| @@ -428,17 +338,17 @@ ConfigurationPolicyPrefStore::FindPolicyInMap( |
| return NULL; |
| } |
| -bool ConfigurationPolicyPrefStore::RemovePreferencesOfMap( |
| +bool ConfigurationPolicyPrefKeeper::RemovePreferencesOfMap( |
| const PolicyToPreferenceMapEntry* map, int table_size) { |
| bool found_any = false; |
| for (int i = 0; i < table_size; ++i) { |
| - if (prefs_->Remove(map[i].preference_path, NULL)) |
| + if (prefs_.RemoveValue(map[i].preference_path)) |
| found_any = true; |
| } |
| return found_any; |
| } |
| -bool ConfigurationPolicyPrefStore::ApplyPolicyFromMap( |
| +bool ConfigurationPolicyPrefKeeper::ApplyPolicyFromMap( |
| ConfigurationPolicyType policy, |
| Value* value, |
| const PolicyToPreferenceMapEntry* map, |
| @@ -449,14 +359,14 @@ bool ConfigurationPolicyPrefStore::ApplyPolicyFromMap( |
| << "mismatch in provided and expected policy value for preferences" |
| << map[current].preference_path << ". expected = " |
| << map[current].value_type << ", actual = "<< value->GetType(); |
| - prefs_->Set(map[current].preference_path, value); |
| + prefs_.SetValue(map[current].preference_path, value); |
| return true; |
| } |
| } |
| return false; |
| } |
| -bool ConfigurationPolicyPrefStore::ApplyProxyPolicy( |
| +bool ConfigurationPolicyPrefKeeper::ApplyProxyPolicy( |
| ConfigurationPolicyType policy, |
| Value* value) { |
| // We only collect the values until we have sufficient information when |
| @@ -474,36 +384,133 @@ bool ConfigurationPolicyPrefStore::ApplyProxyPolicy( |
| return false; |
| } |
| -void ConfigurationPolicyPrefStore::FinalizeProxyPolicySettings() { |
| - if (CheckProxySettings()) |
| - ApplyProxySettings(); |
| - |
| - STLDeleteContainerPairSecondPointers(proxy_policies_.begin(), |
| - proxy_policies_.end()); |
| - proxy_policies_.clear(); |
| +bool ConfigurationPolicyPrefKeeper::ApplySyncPolicy( |
| + ConfigurationPolicyType policy, Value* value) { |
| + if (policy == kPolicySyncDisabled) { |
| + bool disable_sync; |
| + if (value->GetAsBoolean(&disable_sync) && disable_sync) |
| + prefs_.SetValue(prefs::kSyncManaged, value); |
| + else |
| + delete value; |
| + return true; |
| + } |
| + return false; |
| } |
| -bool ConfigurationPolicyPrefStore::HasProxyPolicy( |
| - ConfigurationPolicyType policy) const { |
| - std::map<ConfigurationPolicyType, Value*>::const_iterator iter; |
| - iter = proxy_policies_.find(policy); |
| - return iter != proxy_policies_.end() && |
| - iter->second && !iter->second->IsType(Value::TYPE_NULL); |
| +bool ConfigurationPolicyPrefKeeper::ApplyAutoFillPolicy( |
| + ConfigurationPolicyType policy, Value* value) { |
| + if (policy == kPolicyAutoFillEnabled) { |
| + bool auto_fill_enabled; |
| + if (value->GetAsBoolean(&auto_fill_enabled) && !auto_fill_enabled) |
| + prefs_.SetValue(prefs::kAutoFillEnabled, |
| + Value::CreateBooleanValue(false)); |
| + delete value; |
| + return true; |
| + } |
| + return false; |
| } |
| -bool ConfigurationPolicyPrefStore::CheckProxySettings() { |
| - bool mode = HasProxyPolicy(kPolicyProxyMode); |
| - bool server = HasProxyPolicy(kPolicyProxyServer); |
| - bool pac_url = HasProxyPolicy(kPolicyProxyPacUrl); |
| - bool bypass_list = HasProxyPolicy(kPolicyProxyBypassList); |
| +void ConfigurationPolicyPrefKeeper::EnsureStringPrefExists( |
| + const std::string& path) { |
| + std::string value; |
| + if (!prefs_.GetString(path, &value)) |
| + prefs_.SetString(path, value); |
| +} |
| - if ((server || pac_url || bypass_list) && !mode) { |
| - LOG(WARNING) << "A centrally-administered policy defines proxy setting" |
| - << " details without setting a proxy mode."; |
| - return false; |
| - } |
| +namespace { |
| - if (!mode) |
| +// Implementation of SearchTermsData just for validation. |
| +class SearchTermsDataForValidation : public SearchTermsData { |
| + public: |
| + SearchTermsDataForValidation() {} |
| + |
| + // Implementation of SearchTermsData. |
| + virtual std::string GoogleBaseURLValue() const { |
| + return "http://www.google.com/"; |
| + } |
| + virtual std::string GetApplicationLocale() const { |
| + return "en"; |
| + } |
| +#if defined(OS_WIN) && defined(GOOGLE_CHROME_BUILD) |
| + virtual std::wstring GetRlzParameterValue() const { |
| + return std::wstring(); |
| + } |
| +#endif |
| + private: |
| + DISALLOW_COPY_AND_ASSIGN(SearchTermsDataForValidation); |
| +}; |
| + |
| +} // namepsace |
| + |
| +void ConfigurationPolicyPrefKeeper::FinalizeDefaultSearchPolicySettings() { |
| + bool enabled = true; |
| + if (prefs_.GetBoolean(prefs::kDefaultSearchProviderEnabled, &enabled) && |
| + !enabled) { |
| + // If default search is disabled, we ignore the other fields. |
| + prefs_.SetString(prefs::kDefaultSearchProviderName, std::string()); |
| + prefs_.SetString(prefs::kDefaultSearchProviderSearchURL, std::string()); |
| + prefs_.SetString(prefs::kDefaultSearchProviderSuggestURL, std::string()); |
| + prefs_.SetString(prefs::kDefaultSearchProviderIconURL, std::string()); |
| + prefs_.SetString(prefs::kDefaultSearchProviderEncodings, std::string()); |
| + prefs_.SetString(prefs::kDefaultSearchProviderKeyword, std::string()); |
| + return; |
| + } |
| + std::string search_url; |
| + // The search URL is required. |
| + if (prefs_.GetString(prefs::kDefaultSearchProviderSearchURL, &search_url) && |
| + !search_url.empty()) { |
| + SearchTermsDataForValidation search_terms_data; |
| + const TemplateURLRef search_url_ref(search_url, 0, 0); |
| + // It must support replacement (which implies it is valid). |
| + if (search_url_ref.SupportsReplacementUsingTermsData(search_terms_data)) { |
| + // The other entries are optional. Just make sure that they are all |
| + // specified via policy, so that we don't use regular prefs. |
| + EnsureStringPrefExists(prefs::kDefaultSearchProviderSuggestURL); |
| + EnsureStringPrefExists(prefs::kDefaultSearchProviderIconURL); |
| + EnsureStringPrefExists(prefs::kDefaultSearchProviderEncodings); |
| + EnsureStringPrefExists(prefs::kDefaultSearchProviderKeyword); |
| + |
| + // For the name, default to the host if not specified. |
| + std::string name; |
| + if (!prefs_.GetString(prefs::kDefaultSearchProviderName, &name) || |
| + name.empty()) |
| + prefs_.SetString(prefs::kDefaultSearchProviderName, |
| + GURL(search_url).host()); |
| + |
| + // And clear the IDs since these are not specified via policy. |
| + prefs_.SetString(prefs::kDefaultSearchProviderID, std::string()); |
| + prefs_.SetString(prefs::kDefaultSearchProviderPrepopulateID, |
| + std::string()); |
| + return; |
| + } |
| + } |
| + // Required entries are not there. Remove any related entries. |
| + RemovePreferencesOfMap(kDefaultSearchPolicyMap, |
| + arraysize(kDefaultSearchPolicyMap)); |
| +} |
| + |
| +void ConfigurationPolicyPrefKeeper::FinalizeProxyPolicySettings() { |
| + if (CheckProxySettings()) |
| + ApplyProxySettings(); |
| + |
| + STLDeleteContainerPairSecondPointers(proxy_policies_.begin(), |
| + proxy_policies_.end()); |
| + proxy_policies_.clear(); |
| +} |
| + |
| +bool ConfigurationPolicyPrefKeeper::CheckProxySettings() { |
| + bool mode = HasProxyPolicy(kPolicyProxyMode); |
| + bool server = HasProxyPolicy(kPolicyProxyServer); |
| + bool pac_url = HasProxyPolicy(kPolicyProxyPacUrl); |
| + bool bypass_list = HasProxyPolicy(kPolicyProxyBypassList); |
| + |
| + if ((server || pac_url || bypass_list) && !mode) { |
| + LOG(WARNING) << "A centrally-administered policy defines proxy setting" |
| + << " details without setting a proxy mode."; |
| + return false; |
| + } |
| + |
| + if (!mode) |
| return true; |
| int mode_value; |
| @@ -558,7 +565,7 @@ bool ConfigurationPolicyPrefStore::CheckProxySettings() { |
| return true; |
| } |
| -void ConfigurationPolicyPrefStore::ApplyProxySettings() { |
| +void ConfigurationPolicyPrefKeeper::ApplyProxySettings() { |
| if (!HasProxyPolicy(kPolicyProxyMode)) |
| return; |
| @@ -584,131 +591,322 @@ void ConfigurationPolicyPrefStore::ApplyProxySettings() { |
| mode = ProxyPrefs::MODE_DIRECT; |
| NOTREACHED(); |
| } |
| - prefs_->Set(prefs::kProxyMode, Value::CreateIntegerValue(mode)); |
| + prefs_.SetValue(prefs::kProxyMode, Value::CreateIntegerValue(mode)); |
| if (HasProxyPolicy(kPolicyProxyServer)) { |
| - prefs_->Set(prefs::kProxyServer, proxy_policies_[kPolicyProxyServer]); |
| + prefs_.SetValue(prefs::kProxyServer, proxy_policies_[kPolicyProxyServer]); |
| proxy_policies_[kPolicyProxyServer] = NULL; |
| } else { |
| - prefs_->Set(prefs::kProxyServer, Value::CreateNullValue()); |
| + prefs_.SetValue(prefs::kProxyServer, Value::CreateNullValue()); |
| } |
| if (HasProxyPolicy(kPolicyProxyPacUrl)) { |
| - prefs_->Set(prefs::kProxyPacUrl, proxy_policies_[kPolicyProxyPacUrl]); |
| + prefs_.SetValue(prefs::kProxyPacUrl, proxy_policies_[kPolicyProxyPacUrl]); |
| proxy_policies_[kPolicyProxyPacUrl] = NULL; |
| } else { |
| - prefs_->Set(prefs::kProxyPacUrl, Value::CreateNullValue()); |
| + prefs_.SetValue(prefs::kProxyPacUrl, Value::CreateNullValue()); |
| } |
| if (HasProxyPolicy(kPolicyProxyBypassList)) { |
| - prefs_->Set(prefs::kProxyBypassList, |
| + prefs_.SetValue(prefs::kProxyBypassList, |
| proxy_policies_[kPolicyProxyBypassList]); |
| proxy_policies_[kPolicyProxyBypassList] = NULL; |
| } else { |
| - prefs_->Set(prefs::kProxyBypassList, Value::CreateNullValue()); |
| + prefs_.SetValue(prefs::kProxyBypassList, Value::CreateNullValue()); |
| } |
| } |
| -bool ConfigurationPolicyPrefStore::ApplySyncPolicy( |
| - ConfigurationPolicyType policy, Value* value) { |
| - if (policy == kPolicySyncDisabled) { |
| - bool disable_sync; |
| - if (value->GetAsBoolean(&disable_sync) && disable_sync) |
| - prefs_->Set(prefs::kSyncManaged, value); |
| - else |
| - delete value; |
| - return true; |
| - } |
| - return false; |
| -} |
| - |
| -bool ConfigurationPolicyPrefStore::ApplyAutoFillPolicy( |
| - ConfigurationPolicyType policy, Value* value) { |
| - if (policy == kPolicyAutoFillEnabled) { |
| - bool auto_fill_enabled; |
| - if (value->GetAsBoolean(&auto_fill_enabled) && !auto_fill_enabled) |
| - prefs_->Set(prefs::kAutoFillEnabled, Value::CreateBooleanValue(false)); |
| - delete value; |
| - return true; |
| - } |
| - return false; |
| -} |
| - |
| -void ConfigurationPolicyPrefStore::EnsureStringPrefExists( |
| - const std::string& path) { |
| - std::string value; |
| - if (!prefs_->GetString(path, &value)) |
| - prefs_->SetString(path, value); |
| +bool ConfigurationPolicyPrefKeeper::HasProxyPolicy( |
| + ConfigurationPolicyType policy) const { |
| + std::map<ConfigurationPolicyType, Value*>::const_iterator iter; |
| + iter = proxy_policies_.find(policy); |
| + return iter != proxy_policies_.end() && |
| + iter->second && !iter->second->IsType(Value::TYPE_NULL); |
| } |
| namespace { |
| -// Implementation of SearchTermsData just for validation. |
| -class SearchTermsDataForValidation : public SearchTermsData { |
| +// Manages the lifecycle of the shared platform-specific policy providers for |
| +// managed platform, device management and recommended policy. Instantiated as a |
| +// Singleton. |
| +class ConfigurationPolicyProviderKeeper { |
| public: |
| - SearchTermsDataForValidation() {} |
| + ConfigurationPolicyProviderKeeper() |
| + : managed_platform_provider_(CreateManagedPlatformProvider()), |
| + device_management_provider_(CreateDeviceManagementProvider()), |
| + recommended_provider_(CreateRecommendedProvider()) {} |
| + virtual ~ConfigurationPolicyProviderKeeper() {} |
| - // Implementation of SearchTermsData. |
| - virtual std::string GoogleBaseURLValue() const { |
| - return "http://www.google.com/"; |
| + ConfigurationPolicyProvider* managed_platform_provider() const { |
| + return managed_platform_provider_.get(); |
| } |
| - virtual std::string GetApplicationLocale() const { |
| - return "en"; |
| + |
| + ConfigurationPolicyProvider* device_management_provider() const { |
| + return device_management_provider_.get(); |
| } |
| -#if defined(OS_WIN) && defined(GOOGLE_CHROME_BUILD) |
| - virtual std::wstring GetRlzParameterValue() const { |
| - return std::wstring(); |
| + |
| + ConfigurationPolicyProvider* recommended_provider() const { |
| + return recommended_provider_.get(); |
| } |
| -#endif |
| + |
| private: |
| - DISALLOW_COPY_AND_ASSIGN(SearchTermsDataForValidation); |
| + scoped_ptr<ConfigurationPolicyProvider> managed_platform_provider_; |
| + scoped_ptr<ConfigurationPolicyProvider> device_management_provider_; |
| + scoped_ptr<ConfigurationPolicyProvider> recommended_provider_; |
| + |
| + static ConfigurationPolicyProvider* CreateManagedPlatformProvider(); |
| + static ConfigurationPolicyProvider* CreateDeviceManagementProvider(); |
| + static ConfigurationPolicyProvider* CreateRecommendedProvider(); |
| + |
| + DISALLOW_COPY_AND_ASSIGN(ConfigurationPolicyProviderKeeper); |
| }; |
| -} // namepsace |
| +static base::LazyInstance<ConfigurationPolicyProviderKeeper> |
| + g_configuration_policy_provider_keeper(base::LINKER_INITIALIZED); |
| -void ConfigurationPolicyPrefStore::FinalizeDefaultSearchPolicySettings() { |
| - bool enabled = true; |
| - if (prefs_->GetBoolean(prefs::kDefaultSearchProviderEnabled, &enabled) && |
| - !enabled) { |
| - // If default search is disabled, we ignore the other fields. |
| - prefs_->SetString(prefs::kDefaultSearchProviderName, std::string()); |
| - prefs_->SetString(prefs::kDefaultSearchProviderSearchURL, std::string()); |
| - prefs_->SetString(prefs::kDefaultSearchProviderSuggestURL, std::string()); |
| - prefs_->SetString(prefs::kDefaultSearchProviderIconURL, std::string()); |
| - prefs_->SetString(prefs::kDefaultSearchProviderEncodings, std::string()); |
| - prefs_->SetString(prefs::kDefaultSearchProviderKeyword, std::string()); |
| - return; |
| +ConfigurationPolicyProvider* |
| +ConfigurationPolicyProviderKeeper::CreateManagedPlatformProvider() { |
| + const ConfigurationPolicyProvider::PolicyDefinitionList* policy_list = |
| + ConfigurationPolicyPrefStore::GetChromePolicyDefinitionList(); |
| +#if defined(OS_WIN) |
| + return new ConfigurationPolicyProviderWin(policy_list); |
| +#elif defined(OS_MACOSX) |
| + return new ConfigurationPolicyProviderMac(policy_list); |
| +#elif defined(OS_POSIX) |
| + FilePath config_dir_path; |
| + if (PathService::Get(chrome::DIR_POLICY_FILES, &config_dir_path)) { |
| + return new ConfigDirPolicyProvider( |
| + policy_list, |
| + config_dir_path.Append(FILE_PATH_LITERAL("managed"))); |
| + } else { |
| + return new DummyConfigurationPolicyProvider(policy_list); |
| } |
| - std::string search_url; |
| - // The search URL is required. |
| - if (prefs_->GetString(prefs::kDefaultSearchProviderSearchURL, &search_url) && |
| - !search_url.empty()) { |
| - SearchTermsDataForValidation search_terms_data; |
| - const TemplateURLRef search_url_ref(search_url, 0, 0); |
| - // It must support replacement (which implies it is valid). |
| - if (search_url_ref.SupportsReplacementUsingTermsData(search_terms_data)) { |
| - // The other entries are optional. Just make sure that they are all |
| - // specified via policy, so that we don't use regular prefs. |
| - EnsureStringPrefExists(prefs::kDefaultSearchProviderSuggestURL); |
| - EnsureStringPrefExists(prefs::kDefaultSearchProviderIconURL); |
| - EnsureStringPrefExists(prefs::kDefaultSearchProviderEncodings); |
| - EnsureStringPrefExists(prefs::kDefaultSearchProviderKeyword); |
| +#else |
| + return new DummyConfigurationPolicyProvider(policy_list); |
| +#endif |
| +} |
| - // For the name, default to the host if not specified. |
| - std::string name; |
| - if (!prefs_->GetString(prefs::kDefaultSearchProviderName, &name) || |
| - name.empty()) |
| - prefs_->SetString(prefs::kDefaultSearchProviderName, |
| - GURL(search_url).host()); |
| +ConfigurationPolicyProvider* |
| +ConfigurationPolicyProviderKeeper::CreateDeviceManagementProvider() { |
| + return new DummyConfigurationPolicyProvider( |
| + ConfigurationPolicyPrefStore::GetChromePolicyDefinitionList()); |
| +} |
| - // And clear the IDs since these are not specified via policy. |
| - prefs_->SetString(prefs::kDefaultSearchProviderID, std::string()); |
| - prefs_->SetString(prefs::kDefaultSearchProviderPrepopulateID, |
| - std::string()); |
| - return; |
| - } |
| +ConfigurationPolicyProvider* |
| +ConfigurationPolicyProviderKeeper::CreateRecommendedProvider() { |
| + const ConfigurationPolicyProvider::PolicyDefinitionList* policy_list = |
| + ConfigurationPolicyPrefStore::GetChromePolicyDefinitionList(); |
| +#if defined(OS_POSIX) && !defined(OS_MACOSX) |
| + FilePath config_dir_path; |
| + if (PathService::Get(chrome::DIR_POLICY_FILES, &config_dir_path)) { |
| + return new ConfigDirPolicyProvider( |
| + policy_list, |
| + config_dir_path.Append(FILE_PATH_LITERAL("recommended"))); |
| + } else { |
| + return new DummyConfigurationPolicyProvider(policy_list); |
| + } |
| +#else |
| + return new DummyConfigurationPolicyProvider(policy_list); |
| +#endif |
| +} |
| + |
| +} |
| + |
| +ConfigurationPolicyPrefStore::ConfigurationPolicyPrefStore( |
| + ConfigurationPolicyProvider* provider) |
| + : provider_(provider), |
| + initialization_complete_(provider->IsInitializationComplete()) { |
| + // Read initial policy. |
| + policy_keeper_.reset(new ConfigurationPolicyPrefKeeper(provider)); |
| + |
| + // TODO(mnissler): Remove after provider has proper observer interface. |
| + registrar_.Add(this, |
| + NotificationType(NotificationType::POLICY_CHANGED), |
| + NotificationService::AllSources()); |
| +} |
| + |
| +ConfigurationPolicyPrefStore::~ConfigurationPolicyPrefStore() { |
| +} |
| + |
| +void ConfigurationPolicyPrefStore::AddObserver(PrefStore::Observer* observer) { |
| + observers_.AddObserver(observer); |
| +} |
| + |
| +void ConfigurationPolicyPrefStore::RemoveObserver( |
| + PrefStore::Observer* observer) { |
| + observers_.RemoveObserver(observer); |
| +} |
| + |
| +bool ConfigurationPolicyPrefStore::IsInitializationComplete() const { |
| + return initialization_complete_; |
| +} |
| + |
| +PrefStore::ReadResult |
| +ConfigurationPolicyPrefStore::GetValue(const std::string& key, |
| + Value** value) const { |
| + return policy_keeper_->GetValue(key, value); |
| +} |
| + |
| +// static |
| +ConfigurationPolicyPrefStore* |
| +ConfigurationPolicyPrefStore::CreateManagedPlatformPolicyPrefStore() { |
| + return new ConfigurationPolicyPrefStore( |
| + g_configuration_policy_provider_keeper.Get().managed_platform_provider()); |
| +} |
| + |
| +// static |
| +ConfigurationPolicyPrefStore* |
| +ConfigurationPolicyPrefStore::CreateDeviceManagementPolicyPrefStore( |
| + Profile* profile) { |
| + ConfigurationPolicyProviderKeeper* keeper = |
| + g_configuration_policy_provider_keeper.Pointer(); |
| + ConfigurationPolicyProvider* provider = NULL; |
| + if (profile) |
| + provider = profile->GetPolicyContext()->GetDeviceManagementPolicyProvider(); |
| + if (!provider) |
| + provider = keeper->device_management_provider(); |
| + return new ConfigurationPolicyPrefStore(provider); |
| +} |
| + |
| +// static |
| +ConfigurationPolicyPrefStore* |
| +ConfigurationPolicyPrefStore::CreateRecommendedPolicyPrefStore() { |
| + return new ConfigurationPolicyPrefStore( |
| + g_configuration_policy_provider_keeper.Get().recommended_provider()); |
| +} |
| + |
| +/* static */ |
| +const ConfigurationPolicyProvider::PolicyDefinitionList* |
| +ConfigurationPolicyPrefStore::GetChromePolicyDefinitionList() { |
| + static ConfigurationPolicyProvider::PolicyDefinitionList::Entry entries[] = { |
| + { kPolicyHomePage, Value::TYPE_STRING, key::kHomepageLocation }, |
| + { kPolicyHomepageIsNewTabPage, Value::TYPE_BOOLEAN, |
| + key::kHomepageIsNewTabPage }, |
| + { kPolicyRestoreOnStartup, Value::TYPE_INTEGER, key::kRestoreOnStartup }, |
| + { kPolicyURLsToRestoreOnStartup, Value::TYPE_LIST, |
| + key::kURLsToRestoreOnStartup }, |
| + { kPolicyDefaultSearchProviderEnabled, Value::TYPE_BOOLEAN, |
| + key::kDefaultSearchProviderEnabled }, |
| + { kPolicyDefaultSearchProviderName, Value::TYPE_STRING, |
| + key::kDefaultSearchProviderName }, |
| + { kPolicyDefaultSearchProviderKeyword, Value::TYPE_STRING, |
| + key::kDefaultSearchProviderKeyword }, |
| + { kPolicyDefaultSearchProviderSearchURL, Value::TYPE_STRING, |
| + key::kDefaultSearchProviderSearchURL }, |
| + { kPolicyDefaultSearchProviderSuggestURL, Value::TYPE_STRING, |
| + key::kDefaultSearchProviderSuggestURL }, |
| + { kPolicyDefaultSearchProviderIconURL, Value::TYPE_STRING, |
| + key::kDefaultSearchProviderIconURL }, |
| + { kPolicyDefaultSearchProviderEncodings, Value::TYPE_STRING, |
| + key::kDefaultSearchProviderEncodings }, |
| + { kPolicyProxyMode, Value::TYPE_INTEGER, key::kProxyMode }, |
| + { kPolicyProxyServer, Value::TYPE_STRING, key::kProxyServer }, |
| + { kPolicyProxyPacUrl, Value::TYPE_STRING, key::kProxyPacUrl }, |
| + { kPolicyProxyBypassList, Value::TYPE_STRING, key::kProxyBypassList }, |
| + { kPolicyAlternateErrorPagesEnabled, Value::TYPE_BOOLEAN, |
| + key::kAlternateErrorPagesEnabled }, |
| + { kPolicySearchSuggestEnabled, Value::TYPE_BOOLEAN, |
| + key::kSearchSuggestEnabled }, |
| + { kPolicyDnsPrefetchingEnabled, Value::TYPE_BOOLEAN, |
| + key::kDnsPrefetchingEnabled }, |
| + { kPolicyDisableSpdy, Value::TYPE_BOOLEAN, key::kDisableSpdy }, |
| + { kPolicySafeBrowsingEnabled, Value::TYPE_BOOLEAN, |
| + key::kSafeBrowsingEnabled }, |
| + { kPolicyMetricsReportingEnabled, Value::TYPE_BOOLEAN, |
| + key::kMetricsReportingEnabled }, |
| + { kPolicyPasswordManagerEnabled, Value::TYPE_BOOLEAN, |
| + key::kPasswordManagerEnabled }, |
| + { kPolicyPasswordManagerAllowShowPasswords, Value::TYPE_BOOLEAN, |
| + key::kPasswordManagerAllowShowPasswords }, |
| + { kPolicyAutoFillEnabled, Value::TYPE_BOOLEAN, key::kAutoFillEnabled }, |
| + { kPolicyDisabledPlugins, Value::TYPE_LIST, key::kDisabledPlugins }, |
| + { kPolicyApplicationLocale, Value::TYPE_STRING, |
| + key::kApplicationLocaleValue }, |
| + { kPolicySyncDisabled, Value::TYPE_BOOLEAN, key::kSyncDisabled }, |
| + { kPolicyExtensionInstallAllowList, Value::TYPE_LIST, |
| + key::kExtensionInstallAllowList }, |
| + { kPolicyExtensionInstallDenyList, Value::TYPE_LIST, |
| + key::kExtensionInstallDenyList }, |
| + { kPolicyExtensionInstallForceList, Value::TYPE_LIST, |
| + key::kExtensionInstallForceList }, |
| + { kPolicyShowHomeButton, Value::TYPE_BOOLEAN, key::kShowHomeButton }, |
| + { kPolicyPrintingEnabled, Value::TYPE_BOOLEAN, key::kPrintingEnabled }, |
| + { kPolicyJavascriptEnabled, Value::TYPE_BOOLEAN, key::kJavascriptEnabled }, |
| + { kPolicySavingBrowserHistoryDisabled, Value::TYPE_BOOLEAN, |
| + key::kSavingBrowserHistoryDisabled }, |
| + { kPolicyDeveloperToolsDisabled, Value::TYPE_BOOLEAN, |
| + key::kDeveloperToolsDisabled }, |
| + { kPolicyBlockThirdPartyCookies, Value::TYPE_BOOLEAN, |
| + key::kBlockThirdPartyCookies }, |
| + { kPolicyDefaultCookiesSetting, Value::TYPE_INTEGER, |
| + key::kDefaultCookiesSetting }, |
| + { kPolicyDefaultImagesSetting, Value::TYPE_INTEGER, |
| + key::kDefaultImagesSetting }, |
| + { kPolicyDefaultJavaScriptSetting, Value::TYPE_INTEGER, |
| + key::kDefaultJavaScriptSetting }, |
| + { kPolicyDefaultPluginsSetting, Value::TYPE_INTEGER, |
| + key::kDefaultPluginsSetting }, |
| + { kPolicyDefaultPopupsSetting, Value::TYPE_INTEGER, |
| + key::kDefaultPopupsSetting }, |
| + { kPolicyDefaultNotificationSetting, Value::TYPE_INTEGER, |
| + key::kDefaultNotificationSetting }, |
| + { kPolicyDefaultGeolocationSetting, Value::TYPE_INTEGER, |
| + key::kDefaultGeolocationSetting }, |
| + { kPolicyAuthSchemes, Value::TYPE_STRING, key::kAuthSchemes }, |
| + { kPolicyDisableAuthNegotiateCnameLookup, Value::TYPE_BOOLEAN, |
| + key::kDisableAuthNegotiateCnameLookup }, |
| + { kPolicyEnableAuthNegotiatePort, Value::TYPE_BOOLEAN, |
| + key::kEnableAuthNegotiatePort }, |
| + { kPolicyAuthServerWhitelist, Value::TYPE_STRING, |
| + key::kAuthServerWhitelist }, |
| + { kPolicyAuthNegotiateDelegateWhitelist, Value::TYPE_STRING, |
| + key::kAuthNegotiateDelegateWhitelist }, |
| + { kPolicyGSSAPILibraryName, Value::TYPE_STRING, |
| + key::kGSSAPILibraryName }, |
| + { kPolicyDisable3DAPIs, Value::TYPE_BOOLEAN, |
| + key::kDisable3DAPIs }, |
| + |
| +#if defined(OS_CHROMEOS) |
| + { kPolicyChromeOsLockOnIdleSuspend, Value::TYPE_BOOLEAN, |
| + key::kChromeOsLockOnIdleSuspend }, |
| +#endif |
| + }; |
| + |
| + static ConfigurationPolicyProvider::PolicyDefinitionList policy_list = { |
| + entries, |
| + entries + arraysize(entries), |
| + }; |
| + return &policy_list; |
| +} |
| + |
| +void ConfigurationPolicyPrefStore::Observe(NotificationType type, |
| + const NotificationSource& source, |
| + const NotificationDetails& details) { |
| + if (type == NotificationType::POLICY_CHANGED) |
| + Refresh(); |
| +} |
| + |
| +void ConfigurationPolicyPrefStore::Refresh() { |
| + // Construct a new keeper, determine what changed and swap the keeper in. |
| + scoped_ptr<ConfigurationPolicyPrefKeeper> new_keeper( |
| + new ConfigurationPolicyPrefKeeper(provider_)); |
| + std::vector<std::string> changed_prefs; |
| + new_keeper->GetDifferingPrefPaths(policy_keeper_.get(), &changed_prefs); |
| + policy_keeper_.reset(new_keeper.release()); |
| + |
| + // Send out change notifications. |
| + for (std::vector<std::string>::const_iterator pref(changed_prefs.begin()); |
| + pref != changed_prefs.end(); |
| + ++pref) { |
| + FOR_EACH_OBSERVER(PrefStore::Observer, observers_, |
| + OnPrefValueChanged(*pref)); |
| + } |
| + |
| + // Update the initialization flag. |
| + if (!initialization_complete_ && |
| + provider_->IsInitializationComplete()) { |
| + initialization_complete_ = true; |
| + FOR_EACH_OBSERVER(PrefStore::Observer, observers_, |
| + OnInitializationCompleted()); |
| } |
| - // Required entries are not there. Remove any related entries. |
| - RemovePreferencesOfMap(kDefaultSearchPolicyMap, |
| - arraysize(kDefaultSearchPolicyMap)); |
| } |
| } // namespace policy |