Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(2590)

Unified Diff: chrome/browser/policy/configuration_policy_pref_store.cc

Issue 6074003: Handle policy refresh internally in ConfigurationPolicyPrefStore. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 10 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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 3971980cae376ee8c14f998a5ec04c78361d4315..db9bc0dea7e4272e78bf9aa18ef4ddd6b97a1273 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"
@@ -12,7 +16,6 @@
#include "base/string_util.h"
#include "base/utf_string_conversions.h"
#include "base/values.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"
@@ -24,101 +27,120 @@
#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/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() {}
+ ConfigurationPolicyPrefKeeper(ConfigurationPolicyProvider* provider);
- ConfigurationPolicyProvider* managed_platform_provider() const {
- return managed_platform_provider_.get();
- }
+ // Get a preference value.
+ PrefStore::ReadResult GetValue(const std::string& key, Value** result) const;
- ConfigurationPolicyProvider* device_management_provider() const {
- return device_management_provider_.get();
- }
-
- 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_;
+ // 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.
+ };
- static ConfigurationPolicyProvider* CreateManagedPlatformProvider();
- static ConfigurationPolicyProvider* CreateDeviceManagementProvider();
- static ConfigurationPolicyProvider* CreateRecommendedProvider();
+ typedef std::set<const char*> ProxyPreferenceSet;
- DISALLOW_COPY_AND_ASSIGN(ConfigurationPolicyProviderKeeper);
-};
+ // Returns the map entry that corresponds to |policy| in the map.
+ const PolicyToPreferenceMapEntry* FindPolicyInMap(
+ ConfigurationPolicyType policy,
+ const PolicyToPreferenceMapEntry* map,
+ int size) const;
-static base::LazyInstance<ConfigurationPolicyProviderKeeper>
- g_configuration_policy_provider_keeper(base::LINKER_INITIALIZED);
+ // Remove the preferences found in the map from |prefs_|. Returns true if
+ // any such preferences were found and removed.
+ bool RemovePreferencesOfMap(const PolicyToPreferenceMapEntry* map,
+ int table_size);
-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
-}
+ bool ApplyPolicyFromMap(ConfigurationPolicyType policy,
+ Value* value,
+ const PolicyToPreferenceMapEntry* map,
+ int size);
-ConfigurationPolicyProvider*
- ConfigurationPolicyProviderKeeper::CreateDeviceManagementProvider() {
- return new DummyConfigurationPolicyProvider(
- ConfigurationPolicyPrefStore::GetChromePolicyDefinitionList());
-}
+ // 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);
-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
-}
+ // 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);
-const ConfigurationPolicyPrefStore::PolicyToPreferenceMapEntry
- ConfigurationPolicyPrefStore::kSimplePolicyMap[] = {
+ // 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();
+
+ // Returns the set of preference paths that can be affected by a proxy
+ // policy.
+ static void GetProxyPreferenceSet(ProxyPreferenceSet* proxy_pref_set);
+
+ // 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);
+};
+
+const ConfigurationPolicyPrefKeeper::PolicyToPreferenceMapEntry
+ ConfigurationPolicyPrefKeeper::kSimplePolicyMap[] = {
{ Value::TYPE_STRING, kPolicyHomePage, prefs::kHomePage },
{ Value::TYPE_BOOLEAN, kPolicyHomepageIsNewTabPage,
prefs::kHomePageIsNewTabPage },
@@ -199,8 +221,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,
@@ -217,154 +239,48 @@ 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 },
- { kPolicyProxyServerMode, Value::TYPE_INTEGER, key::kProxyServerMode },
- { 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()),
- lower_priority_proxy_settings_overridden_(false),
- proxy_disabled_(false),
- proxy_configuration_specified_(false),
- use_system_proxy_(false) {
- 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.";
FinalizeDefaultSearchPolicySettings();
}
-ConfigurationPolicyPrefStore::~ConfigurationPolicyPrefStore() {}
-
-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;
@@ -387,47 +303,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());
-}
-
-// static
-void ConfigurationPolicyPrefStore::GetProxyPreferenceSet(
- ProxyPreferenceSet* proxy_pref_set) {
- proxy_pref_set->clear();
- for (size_t current = 0; current < arraysize(kProxyPolicyMap); ++current) {
- proxy_pref_set->insert(kProxyPolicyMap[current].preference_path);
- }
- proxy_pref_set->insert(prefs::kNoProxyServer);
- proxy_pref_set->insert(prefs::kProxyAutoDetect);
-}
-
-const ConfigurationPolicyPrefStore::PolicyToPreferenceMapEntry*
-ConfigurationPolicyPrefStore::FindPolicyInMap(
+const ConfigurationPolicyPrefKeeper::PolicyToPreferenceMapEntry*
+ConfigurationPolicyPrefKeeper::FindPolicyInMap(
ConfigurationPolicyType policy,
const PolicyToPreferenceMapEntry* map,
int table_size) const {
@@ -438,17 +315,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,
@@ -459,14 +336,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) {
bool result = false;
@@ -492,7 +369,7 @@ bool ConfigurationPolicyPrefStore::ApplyProxyPolicy(
i != proxy_preference_set.end(); ++i) {
// We use values of TYPE_NULL to mark preferences for which
// READ_USE_DEFAULT should be returned by GetValue().
- prefs_->Set(*i, Value::CreateNullValue());
+ prefs_.SetValue(*i, Value::CreateNullValue());
}
lower_priority_proxy_settings_overridden_ = true;
}
@@ -530,10 +407,10 @@ bool ConfigurationPolicyPrefStore::ApplyProxyPolicy(
}
if (int_value != kPolicyUseSystemProxyMode) {
- prefs_->Set(prefs::kNoProxyServer,
- Value::CreateBooleanValue(proxy_disabled_));
- prefs_->Set(prefs::kProxyAutoDetect,
- Value::CreateBooleanValue(proxy_auto_detect));
+ prefs_.SetValue(prefs::kNoProxyServer,
+ Value::CreateBooleanValue(proxy_disabled_));
+ prefs_.SetValue(prefs::kProxyAutoDetect,
+ Value::CreateBooleanValue(proxy_auto_detect));
}
}
} else if (match_entry) {
@@ -547,7 +424,7 @@ bool ConfigurationPolicyPrefStore::ApplyProxyPolicy(
proxy_configuration_specified_ = true;
}
if (!use_system_proxy_ && !proxy_disabled_) {
- prefs_->Set(match_entry->preference_path, value);
+ prefs_.SetValue(match_entry->preference_path, value);
// The ownership of value has been passed on to |prefs_|,
// don't clean it up later.
value = NULL;
@@ -573,12 +450,12 @@ bool ConfigurationPolicyPrefStore::ApplyProxyPolicy(
return result;
}
-bool ConfigurationPolicyPrefStore::ApplySyncPolicy(
+bool ConfigurationPolicyPrefKeeper::ApplySyncPolicy(
ConfigurationPolicyType policy, Value* value) {
if (policy == kPolicySyncDisabled) {
bool disable_sync;
if (value->GetAsBoolean(&disable_sync) && disable_sync)
- prefs_->Set(prefs::kSyncManaged, value);
+ prefs_.SetValue(prefs::kSyncManaged, value);
else
delete value;
return true;
@@ -586,23 +463,24 @@ bool ConfigurationPolicyPrefStore::ApplySyncPolicy(
return false;
}
-bool ConfigurationPolicyPrefStore::ApplyAutoFillPolicy(
+bool ConfigurationPolicyPrefKeeper::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));
+ prefs_.SetValue(prefs::kAutoFillEnabled,
+ Value::CreateBooleanValue(false));
delete value;
return true;
}
return false;
}
-void ConfigurationPolicyPrefStore::EnsureStringPrefExists(
+void ConfigurationPolicyPrefKeeper::EnsureStringPrefExists(
const std::string& path) {
std::string value;
- if (!prefs_->GetString(path, &value))
- prefs_->SetString(path, value);
+ if (!prefs_.GetString(path, &value))
+ prefs_.SetString(path, value);
}
namespace {
@@ -630,22 +508,22 @@ class SearchTermsDataForValidation : public SearchTermsData {
} // namepsace
-void ConfigurationPolicyPrefStore::FinalizeDefaultSearchPolicySettings() {
+void ConfigurationPolicyPrefKeeper::FinalizeDefaultSearchPolicySettings() {
bool enabled = true;
- if (prefs_->GetBoolean(prefs::kDefaultSearchProviderEnabled, &enabled) &&
+ 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());
+ 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) &&
+ if (prefs_.GetString(prefs::kDefaultSearchProviderSearchURL, &search_url) &&
!search_url.empty()) {
SearchTermsDataForValidation search_terms_data;
const TemplateURLRef search_url_ref(search_url, 0, 0);
@@ -660,14 +538,14 @@ void ConfigurationPolicyPrefStore::FinalizeDefaultSearchPolicySettings() {
// For the name, default to the host if not specified.
std::string name;
- if (!prefs_->GetString(prefs::kDefaultSearchProviderName, &name) ||
+ if (!prefs_.GetString(prefs::kDefaultSearchProviderName, &name) ||
name.empty())
- prefs_->SetString(prefs::kDefaultSearchProviderName,
+ 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,
+ prefs_.SetString(prefs::kDefaultSearchProviderID, std::string());
+ prefs_.SetString(prefs::kDefaultSearchProviderPrepopulateID,
std::string());
return;
}
@@ -677,4 +555,302 @@ void ConfigurationPolicyPrefStore::FinalizeDefaultSearchPolicySettings() {
arraysize(kDefaultSearchPolicyMap));
}
+// static
+void ConfigurationPolicyPrefKeeper::GetProxyPreferenceSet(
+ ProxyPreferenceSet* proxy_pref_set) {
+ proxy_pref_set->clear();
+ for (size_t current = 0; current < arraysize(kProxyPolicyMap); ++current) {
+ proxy_pref_set->insert(kProxyPolicyMap[current].preference_path);
+ }
+ proxy_pref_set->insert(prefs::kNoProxyServer);
+ proxy_pref_set->insert(prefs::kProxyAutoDetect);
+}
+
+namespace {
+
+// 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:
+ ConfigurationPolicyProviderKeeper()
+ : managed_platform_provider_(CreateManagedPlatformProvider()),
+ device_management_provider_(CreateDeviceManagementProvider()),
+ recommended_provider_(CreateRecommendedProvider()) {}
+ virtual ~ConfigurationPolicyProviderKeeper() {}
+
+ ConfigurationPolicyProvider* managed_platform_provider() const {
+ return managed_platform_provider_.get();
+ }
+
+ ConfigurationPolicyProvider* device_management_provider() const {
+ return device_management_provider_.get();
+ }
+
+ ConfigurationPolicyProvider* recommended_provider() const {
+ return recommended_provider_.get();
+ }
+
+ 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();
+
+ DISALLOW_COPY_AND_ASSIGN(ConfigurationPolicyProviderKeeper);
+};
+
+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
+}
+
+}
+
+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 },
+ { kPolicyProxyServerMode, Value::TYPE_INTEGER, key::kProxyServerMode },
+ { 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());
+ }
+}
+
} // namespace policy

Powered by Google App Engine
This is Rietveld 408576698