| 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..3c7ea6ad7ba8d67eac0719b3a7821000796f9f88 100644
|
| --- a/chrome/browser/policy/configuration_policy_pref_store.cc
|
| +++ b/chrome/browser/policy/configuration_policy_pref_store.cc
|
| @@ -8,10 +8,12 @@
|
| #include "base/lazy_instance.h"
|
| #include "base/logging.h"
|
| #include "base/path_service.h"
|
| +#include "base/stl_util-inl.h"
|
| #include "base/string16.h"
|
| #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)
|
| @@ -248,7 +250,7 @@ ConfigurationPolicyPrefStore::GetChromePolicyDefinitionList() {
|
| key::kDefaultSearchProviderIconURL },
|
| { kPolicyDefaultSearchProviderEncodings, Value::TYPE_STRING,
|
| key::kDefaultSearchProviderEncodings },
|
| - { kPolicyProxyServerMode, Value::TYPE_INTEGER, key::kProxyServerMode },
|
| + { kPolicyProxyMode, Value::TYPE_INTEGER, key::kProxyMode },
|
| { kPolicyProxyServer, Value::TYPE_STRING, key::kProxyServer },
|
| { kPolicyProxyPacUrl, Value::TYPE_STRING, key::kProxyPacUrl },
|
| { kPolicyProxyBypassList, Value::TYPE_STRING, key::kProxyBypassList },
|
| @@ -331,17 +333,16 @@ ConfigurationPolicyPrefStore::GetChromePolicyDefinitionList() {
|
| ConfigurationPolicyPrefStore::ConfigurationPolicyPrefStore(
|
| ConfigurationPolicyProvider* provider)
|
| : provider_(provider),
|
| - prefs_(new DictionaryValue()),
|
| - lower_priority_proxy_settings_overridden_(false),
|
| - proxy_disabled_(false),
|
| - proxy_configuration_specified_(false),
|
| - use_system_proxy_(false) {
|
| + prefs_(new DictionaryValue()) {
|
| if (!provider_->Provide(this))
|
| LOG(WARNING) << "Failed to get policy from provider.";
|
| + FinalizeProxyPolicySettings();
|
| FinalizeDefaultSearchPolicySettings();
|
| }
|
|
|
| -ConfigurationPolicyPrefStore::~ConfigurationPolicyPrefStore() {}
|
| +ConfigurationPolicyPrefStore::~ConfigurationPolicyPrefStore() {
|
| + DCHECK(proxy_policies_.empty());
|
| +}
|
|
|
| PrefStore::ReadResult ConfigurationPolicyPrefStore::GetValue(
|
| const std::string& key,
|
| @@ -415,17 +416,6 @@ ConfigurationPolicyPrefStore::CreateRecommendedPolicyPrefStore() {
|
| 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(
|
| ConfigurationPolicyType policy,
|
| @@ -469,108 +459,152 @@ bool ConfigurationPolicyPrefStore::ApplyPolicyFromMap(
|
| bool ConfigurationPolicyPrefStore::ApplyProxyPolicy(
|
| ConfigurationPolicyType policy,
|
| Value* value) {
|
| - bool result = false;
|
| - bool warn_about_proxy_disable_config = false;
|
| - bool warn_about_proxy_system_config = false;
|
| -
|
| - const PolicyToPreferenceMapEntry* match_entry =
|
| - FindPolicyInMap(policy, kProxyPolicyMap, arraysize(kProxyPolicyMap));
|
| -
|
| - // When the first proxy-related policy is applied, ALL proxy-related
|
| - // preferences that have been set by command-line switches, extensions,
|
| - // user preferences or any other mechanism are overridden. Otherwise
|
| - // it's possible for a user to interfere with proxy policy by setting
|
| - // proxy-related command-line switches or set proxy-related prefs in an
|
| - // extension that are related, but not identical, to the ones set through
|
| - // policy.
|
| - if (!lower_priority_proxy_settings_overridden_ &&
|
| - (match_entry ||
|
| - policy == kPolicyProxyServerMode)) {
|
| - ProxyPreferenceSet proxy_preference_set;
|
| - GetProxyPreferenceSet(&proxy_preference_set);
|
| - for (ProxyPreferenceSet::const_iterator i = proxy_preference_set.begin();
|
| - 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());
|
| - }
|
| - lower_priority_proxy_settings_overridden_ = true;
|
| + // We only collect the values until we have sufficient information when
|
| + // FinalizeProxyPolicySettings() is called to determine whether the presented
|
| + // values were correct and apply them in that case.
|
| + if (policy == kPolicyProxyMode ||
|
| + policy == kPolicyProxyServer ||
|
| + policy == kPolicyProxyPacUrl ||
|
| + policy == kPolicyProxyBypassList) {
|
| + delete proxy_policies_[policy];
|
| + proxy_policies_[policy] = value;
|
| + return true;
|
| }
|
| + // We are not interested in this policy.
|
| + return false;
|
| +}
|
|
|
| - // Translate the proxy policy into preferences.
|
| - if (policy == kPolicyProxyServerMode) {
|
| - int int_value;
|
| - bool proxy_auto_detect = false;
|
| - if (value->GetAsInteger(&int_value)) {
|
| - result = true;
|
| - switch (int_value) {
|
| - case kPolicyNoProxyServerMode:
|
| - if (!proxy_disabled_) {
|
| - if (proxy_configuration_specified_)
|
| - warn_about_proxy_disable_config = true;
|
| - proxy_disabled_ = true;
|
| - }
|
| - break;
|
| - case kPolicyAutoDetectProxyMode:
|
| - proxy_auto_detect = true;
|
| - break;
|
| - case kPolicyManuallyConfiguredProxyMode:
|
| - break;
|
| - case kPolicyUseSystemProxyMode:
|
| - if (!use_system_proxy_) {
|
| - if (proxy_configuration_specified_)
|
| - warn_about_proxy_system_config = true;
|
| - use_system_proxy_ = true;
|
| - }
|
| - break;
|
| - default:
|
| - // Not a valid policy, don't assume ownership of |value|
|
| - result = false;
|
| - break;
|
| - }
|
| +void ConfigurationPolicyPrefStore::FinalizeProxyPolicySettings() {
|
| + if (CheckProxySettings())
|
| + ApplyProxySettings();
|
|
|
| - if (int_value != kPolicyUseSystemProxyMode) {
|
| - prefs_->Set(prefs::kNoProxyServer,
|
| - Value::CreateBooleanValue(proxy_disabled_));
|
| - prefs_->Set(prefs::kProxyAutoDetect,
|
| - Value::CreateBooleanValue(proxy_auto_detect));
|
| - }
|
| - }
|
| - } else if (match_entry) {
|
| - // Determine if the applied proxy policy settings conflict and issue
|
| - // a corresponding warning if they do.
|
| - if (!proxy_configuration_specified_) {
|
| - if (proxy_disabled_)
|
| - warn_about_proxy_disable_config = true;
|
| - if (use_system_proxy_)
|
| - warn_about_proxy_system_config = true;
|
| - proxy_configuration_specified_ = true;
|
| - }
|
| - if (!use_system_proxy_ && !proxy_disabled_) {
|
| - prefs_->Set(match_entry->preference_path, value);
|
| - // The ownership of value has been passed on to |prefs_|,
|
| - // don't clean it up later.
|
| - value = NULL;
|
| - }
|
| - result = true;
|
| + STLDeleteContainerPairSecondPointers(proxy_policies_.begin(),
|
| + proxy_policies_.end());
|
| + proxy_policies_.clear();
|
| +}
|
| +
|
| +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 ConfigurationPolicyPrefStore::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 (warn_about_proxy_disable_config) {
|
| - LOG(WARNING) << "A centrally-administered policy disables the use of"
|
| - << " a proxy but also specifies an explicit proxy"
|
| - << " configuration.";
|
| + if (!mode)
|
| + return true;
|
| +
|
| + int mode_value;
|
| + if (!proxy_policies_[kPolicyProxyMode]->GetAsInteger(&mode_value)) {
|
| + LOG(WARNING) << "Invalid proxy mode value.";
|
| + return false;
|
| }
|
|
|
| - if (warn_about_proxy_system_config) {
|
| - LOG(WARNING) << "A centrally-administered policy dictates that the"
|
| - << " system proxy settings should be used but also specifies"
|
| - << " an explicit proxy configuration.";
|
| + switch (mode_value) {
|
| + case kPolicyNoProxyServerMode:
|
| + if (server || pac_url || bypass_list) {
|
| + LOG(WARNING) << "A centrally-administered policy disables the use of"
|
| + << " a proxy but also specifies an explicit proxy"
|
| + << " configuration.";
|
| + return false;
|
| + }
|
| + break;
|
| + case kPolicyAutoDetectProxyMode:
|
| + if (server || bypass_list) {
|
| + LOG(WARNING) << "A centrally-administered policy dictates that a proxy"
|
| + << " shall be auto configured but specifies fixed proxy"
|
| + << " servers or a by-pass list.";
|
| + return false;
|
| + }
|
| + break;
|
| + case kPolicyManuallyConfiguredProxyMode:
|
| + if (!server) {
|
| + LOG(WARNING) << "A centrally-administered policy dictates that the"
|
| + << " system proxy settings should use fixed proxy servers"
|
| + << " without specifying which ones.";
|
| + return false;
|
| + }
|
| + if (pac_url) {
|
| + LOG(WARNING) << "A centrally-administered policy dictates that the"
|
| + << " system proxy settings should use fixed proxy servers"
|
| + << " but also specifies a PAC script.";
|
| + return false;
|
| + }
|
| + break;
|
| + case kPolicyUseSystemProxyMode:
|
| + if (server || pac_url || bypass_list) {
|
| + LOG(WARNING) << "A centrally-administered policy dictates that the"
|
| + << " system proxy settings should be used but also "
|
| + << " specifies an explicit proxy configuration.";
|
| + return false;
|
| + }
|
| + break;
|
| + default:
|
| + LOG(WARNING) << "Invalid proxy mode " << mode_value;
|
| + return false;
|
| }
|
| + return true;
|
| +}
|
|
|
| - // If the policy was a proxy policy, cleanup |value|.
|
| - if (result && value)
|
| - delete value;
|
| - return result;
|
| +void ConfigurationPolicyPrefStore::ApplyProxySettings() {
|
| + if (!HasProxyPolicy(kPolicyProxyMode))
|
| + return;
|
| +
|
| + int int_mode;
|
| + CHECK(proxy_policies_[kPolicyProxyMode]->GetAsInteger(&int_mode));
|
| + ProxyPrefs::ProxyMode mode;
|
| + switch (int_mode) {
|
| + case kPolicyNoProxyServerMode:
|
| + mode = ProxyPrefs::MODE_DIRECT;
|
| + break;
|
| + case kPolicyAutoDetectProxyMode:
|
| + mode = ProxyPrefs::MODE_AUTO_DETECT;
|
| + if (HasProxyPolicy(kPolicyProxyPacUrl))
|
| + mode = ProxyPrefs::MODE_PAC_SCRIPT;
|
| + break;
|
| + case kPolicyManuallyConfiguredProxyMode:
|
| + mode = ProxyPrefs::MODE_FIXED_SERVERS;
|
| + break;
|
| + case kPolicyUseSystemProxyMode:
|
| + mode = ProxyPrefs::MODE_SYSTEM;
|
| + break;
|
| + default:
|
| + mode = ProxyPrefs::MODE_DIRECT;
|
| + NOTREACHED();
|
| + }
|
| + prefs_->Set(prefs::kProxyMode, Value::CreateIntegerValue(mode));
|
| +
|
| + if (HasProxyPolicy(kPolicyProxyServer)) {
|
| + prefs_->Set(prefs::kProxyServer, proxy_policies_[kPolicyProxyServer]);
|
| + proxy_policies_[kPolicyProxyServer] = NULL;
|
| + } else {
|
| + prefs_->Set(prefs::kProxyServer, Value::CreateNullValue());
|
| + }
|
| + if (HasProxyPolicy(kPolicyProxyPacUrl)) {
|
| + prefs_->Set(prefs::kProxyPacUrl, proxy_policies_[kPolicyProxyPacUrl]);
|
| + proxy_policies_[kPolicyProxyPacUrl] = NULL;
|
| + } else {
|
| + prefs_->Set(prefs::kProxyPacUrl, Value::CreateNullValue());
|
| + }
|
| + if (HasProxyPolicy(kPolicyProxyBypassList)) {
|
| + prefs_->Set(prefs::kProxyBypassList,
|
| + proxy_policies_[kPolicyProxyBypassList]);
|
| + proxy_policies_[kPolicyProxyBypassList] = NULL;
|
| + } else {
|
| + prefs_->Set(prefs::kProxyBypassList, Value::CreateNullValue());
|
| + }
|
| }
|
|
|
| bool ConfigurationPolicyPrefStore::ApplySyncPolicy(
|
|
|