Home | History | Annotate | Download | only in policy
      1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
      2 // Use of this source code is governed by a BSD-style license that can be
      3 // found in the LICENSE file.
      4 
      5 #include "chrome/browser/policy/configuration_policy_provider.h"
      6 
      7 #include "base/callback.h"
      8 #include "chrome/browser/policy/external_data_fetcher.h"
      9 #include "chrome/browser/policy/policy_domain_descriptor.h"
     10 #include "chrome/browser/policy/policy_map.h"
     11 #include "policy/policy_constants.h"
     12 
     13 namespace policy {
     14 
     15 namespace {
     16 
     17 const char* kProxyPolicies[] = {
     18   key::kProxyMode,
     19   key::kProxyServerMode,
     20   key::kProxyServer,
     21   key::kProxyPacUrl,
     22   key::kProxyBypassList,
     23 };
     24 
     25 // Helper that converts deprecated chrome policies into their corresponding
     26 // actual policies.
     27 void FixDeprecatedPolicies(PolicyMap* policies) {
     28   // Proxy settings have been configured by 5 policies that didn't mix well
     29   // together, and maps of policies had to take this into account when merging
     30   // policy sources. The proxy settings will eventually be configured by a
     31   // single Dictionary policy when all providers have support for that. For
     32   // now, the individual policies are mapped here to a single Dictionary policy
     33   // that the rest of the policy machinery uses.
     34 
     35   // The highest (level, scope) pair for an existing proxy policy is determined
     36   // first, and then only policies with those exact attributes are merged.
     37   PolicyMap::Entry current_priority;  // Defaults to the lowest priority.
     38   scoped_ptr<DictionaryValue> proxy_settings(new DictionaryValue);
     39   for (size_t i = 0; i < arraysize(kProxyPolicies); ++i) {
     40     const PolicyMap::Entry* entry = policies->Get(kProxyPolicies[i]);
     41     if (entry) {
     42       if (entry->has_higher_priority_than(current_priority)) {
     43         proxy_settings->Clear();
     44         current_priority = *entry;
     45       }
     46       if (!entry->has_higher_priority_than(current_priority) &&
     47           !current_priority.has_higher_priority_than(*entry)) {
     48         proxy_settings->Set(kProxyPolicies[i], entry->value->DeepCopy());
     49       }
     50       policies->Erase(kProxyPolicies[i]);
     51     }
     52   }
     53   // Sets the new |proxy_settings| if kProxySettings isn't set yet, or if the
     54   // new priority is higher.
     55   const PolicyMap::Entry* existing = policies->Get(key::kProxySettings);
     56   if (!proxy_settings->empty() &&
     57       (!existing || current_priority.has_higher_priority_than(*existing))) {
     58     policies->Set(key::kProxySettings,
     59                   current_priority.level,
     60                   current_priority.scope,
     61                   proxy_settings.release(),
     62                   NULL);
     63   }
     64 }
     65 
     66 }  // namespace
     67 
     68 ConfigurationPolicyProvider::Observer::~Observer() {}
     69 
     70 ConfigurationPolicyProvider::ConfigurationPolicyProvider()
     71     : did_shutdown_(false) {}
     72 
     73 ConfigurationPolicyProvider::~ConfigurationPolicyProvider() {
     74   DCHECK(did_shutdown_);
     75 }
     76 
     77 void ConfigurationPolicyProvider::Init() {}
     78 
     79 void ConfigurationPolicyProvider::Shutdown() {
     80   did_shutdown_ = true;
     81 }
     82 
     83 bool ConfigurationPolicyProvider::IsInitializationComplete(
     84     PolicyDomain domain) const {
     85   return true;
     86 }
     87 
     88 void ConfigurationPolicyProvider::UpdatePolicy(
     89     scoped_ptr<PolicyBundle> bundle) {
     90   if (bundle.get())
     91     policy_bundle_.Swap(bundle.get());
     92   else
     93     policy_bundle_.Clear();
     94   FixDeprecatedPolicies(&policy_bundle_.Get(
     95       PolicyNamespace(POLICY_DOMAIN_CHROME, std::string())));
     96   FOR_EACH_OBSERVER(ConfigurationPolicyProvider::Observer,
     97                     observer_list_,
     98                     OnUpdatePolicy(this));
     99 }
    100 
    101 void ConfigurationPolicyProvider::AddObserver(Observer* observer) {
    102   observer_list_.AddObserver(observer);
    103 }
    104 
    105 void ConfigurationPolicyProvider::RemoveObserver(Observer* observer) {
    106   observer_list_.RemoveObserver(observer);
    107 }
    108 
    109 void ConfigurationPolicyProvider::RegisterPolicyDomain(
    110     scoped_refptr<const PolicyDomainDescriptor> descriptor) {}
    111 
    112 }  // namespace policy
    113