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

Side by Side Diff: chrome/browser/policy/cloud_policy_cache_base.cc

Issue 6979011: Move user cloud policy to BrowserProcess. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 9 years, 7 months 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 unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2011 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "chrome/browser/policy/cloud_policy_cache_base.h" 5 #include "chrome/browser/policy/cloud_policy_cache_base.h"
6 6
7 #include <set>
7 #include <string> 8 #include <string>
8 9
9 #include "base/logging.h" 10 #include "base/logging.h"
10 #include "base/values.h" 11 #include "base/values.h"
11 #include "chrome/browser/policy/configuration_policy_pref_store.h" 12 #include "chrome/browser/policy/configuration_policy_pref_store.h"
12 #include "chrome/browser/policy/policy_notifier.h" 13 #include "chrome/browser/policy/policy_notifier.h"
13 14
14 namespace policy { 15 namespace policy {
15 16
16 // A thin ConfigurationPolicyProvider implementation sitting on top of 17 CloudPolicyProvider::CloudPolicyProvider(
17 // CloudPolicyCacheBase for hooking up with ConfigurationPolicyPrefStore. 18 const ConfigurationPolicyProvider::PolicyDefinitionList* policy_list,
18 class CloudPolicyCacheBase::CloudPolicyProvider 19 CloudPolicyCacheBase::PolicyLevel level)
19 : public ConfigurationPolicyProvider { 20 : ConfigurationPolicyProvider(policy_list),
20 public: 21 cache_(NULL),
21 CloudPolicyProvider(const PolicyDefinitionList* policy_list, 22 level_(level) {}
22 CloudPolicyCacheBase* cache,
23 CloudPolicyCacheBase::PolicyLevel level)
24 : ConfigurationPolicyProvider(policy_list),
25 cache_(cache),
26 level_(level) {}
27 virtual ~CloudPolicyProvider() {}
28 23
29 virtual bool Provide(ConfigurationPolicyStoreInterface* store) { 24 CloudPolicyProvider::~CloudPolicyProvider() {
30 if (level_ == POLICY_LEVEL_MANDATORY) 25 FOR_EACH_OBSERVER(ConfigurationPolicyProvider::Observer,
31 ApplyPolicyMap(&cache_->mandatory_policy_, store); 26 observer_list_, OnProviderGoingAway());
32 else if (level_ == POLICY_LEVEL_RECOMMENDED) 27 if (cache_)
33 ApplyPolicyMap(&cache_->recommended_policy_, store); 28 cache_->RemoveObserver(this);
34 return true; 29 }
30
31 void CloudPolicyProvider::set_cache(CloudPolicyCacheBase* cache) {
32 cache_ = cache;
33 cache_->AddObserver(this);
34 }
35
36 bool CloudPolicyProvider::Provide(ConfigurationPolicyStoreInterface* store) {
37 if (!cache_)
38 return false;
39 if (level_ == CloudPolicyCacheBase::POLICY_LEVEL_MANDATORY)
40 ApplyPolicyMap(cache_->mandatory_policy(), store);
41 else if (level_ == CloudPolicyCacheBase::POLICY_LEVEL_RECOMMENDED)
42 ApplyPolicyMap(cache_->recommended_policy(), store);
43 return true;
44 }
45
46 bool CloudPolicyProvider::IsInitializationComplete() const {
47 return cache_ && cache_->initialization_complete();
48 }
49
50 void CloudPolicyProvider::AddObserver(
51 ConfigurationPolicyProvider::Observer* observer) {
52 observer_list_.AddObserver(observer);
53 }
54 void CloudPolicyProvider::RemoveObserver(
55 ConfigurationPolicyProvider::Observer* observer) {
56 observer_list_.RemoveObserver(observer);
57 }
58
59 void CloudPolicyProvider::OnUpdatePolicy() {
60 FOR_EACH_OBSERVER(ConfigurationPolicyProvider::Observer,
61 observer_list_, OnUpdatePolicy());
62 }
63
64 void CloudPolicyProvider::OnProviderGoingAway() {
65 cache_->RemoveObserver(this);
66 cache_ = NULL;
67 }
68
69 PolicyMap* CloudPolicyProvider::policy_map() {
70 if (!cache_)
71 return NULL;
72 if (level_ == CloudPolicyCacheBase::POLICY_LEVEL_MANDATORY)
73 return cache_->mandatory_policy();
74 else if (level_ == CloudPolicyCacheBase::POLICY_LEVEL_RECOMMENDED)
75 return cache_->recommended_policy();
76 NOTREACHED();
77 return NULL;
78 }
79
80 CombiningCloudPolicyProvider::CombiningCloudPolicyProvider(
81 const ConfigurationPolicyProvider::PolicyDefinitionList* policy_list)
82 : ConfigurationPolicyProvider(policy_list) {}
83
84 CombiningCloudPolicyProvider::~CombiningCloudPolicyProvider() {
85 FOR_EACH_OBSERVER(ConfigurationPolicyProvider::Observer,
86 observer_list_, OnProviderGoingAway());
87 }
88
89 void CombiningCloudPolicyProvider::AddCloudPolicyProvider(
90 CloudPolicyProvider* cloud_policy_provider) {
91 cloud_policy_providers_.push_back(
92 new CloudPolicyProviderWithObserver(this,
93 cloud_policy_provider));
94 }
95
96 bool CombiningCloudPolicyProvider::Provide(
97 ConfigurationPolicyStoreInterface* store) {
98 typedef std::set<ConfigurationPolicyType> PolicySet;
99 PolicySet already_applied;
100 PolicySet newly_applied;
101 for (ListType::iterator i = cloud_policy_providers_.begin();
102 i != cloud_policy_providers_.end(); ++i) {
103 if ((*i)->cloud_policy_provider() &&
104 (*i)->cloud_policy_provider()->IsInitializationComplete()) {
105 PolicyMap* policy_map = (*i)->cloud_policy_provider()->policy_map();
106 if (policy_map) {
107 const PolicyDefinitionList* policy_list(policy_definition_list());
108 for (const PolicyDefinitionList::Entry* j = policy_list->begin;
109 j != policy_list->end; ++j) {
110 // Already applied by a CloudProvider which takes precedence.
111 if (already_applied.find(j->policy_type)!=already_applied.end())
112 continue;
113 const Value* value = policy_map->Get(j->policy_type);
114 if (value && value->IsType(j->value_type)) {
115 newly_applied.insert(j->policy_type);
116 store->Apply(j->policy_type, value->DeepCopy());
117 }
118 }
119 // Update the already_applied PolicySet
120 for (PolicySet::iterator policy = newly_applied.begin();
121 policy != newly_applied.end(); ++policy) {
122 already_applied.insert(*policy);
123 // In case that one Proxy Policy got applied, we want to set all of
124 // them as applied. We need that in order not to end up with an
125 // inconsistend Proxy-state in case that the different Policy-related
126 // Policies got set by different CloudPolicyProviders.
127 if (*policy == kPolicyProxyMode ||
128 *policy == kPolicyProxyServerMode ||
129 *policy == kPolicyProxyServer ||
130 *policy == kPolicyProxyPacUrl ||
131 *policy == kPolicyProxyBypassList) {
132 already_applied.insert(kPolicyProxyMode);
133 already_applied.insert(kPolicyProxyServerMode);
134 already_applied.insert(kPolicyProxyServer);
135 already_applied.insert(kPolicyProxyPacUrl);
136 already_applied.insert(kPolicyProxyBypassList);
137 }
138 }
139 }
140 }
35 } 141 }
142 // Return true if we could apply at least one policy.
143 return !already_applied.empty();
144 }
36 145
37 virtual bool IsInitializationComplete() const { 146 bool CombiningCloudPolicyProvider::IsInitializationComplete() const {
38 return cache_->initialization_complete_; 147 bool initialization_complete = false;
148 for (ListType::const_iterator i = cloud_policy_providers_.begin();
149 i != cloud_policy_providers_.end(); ++i) {
150 initialization_complete = initialization_complete ||
151 ((*i)->cloud_policy_provider() &&
152 (*i)->cloud_policy_provider()->IsInitializationComplete());
39 } 153 }
154 return initialization_complete;
155 }
40 156
41 virtual void AddObserver(ConfigurationPolicyProvider::Observer* observer) { 157 void CombiningCloudPolicyProvider::AddObserver(
42 cache_->observer_list_.AddObserver(observer); 158 ConfigurationPolicyProvider::Observer* observer) {
159 observer_list_.AddObserver(observer);
160 }
161
162 void CombiningCloudPolicyProvider::RemoveObserver(
163 ConfigurationPolicyProvider::Observer* observer) {
164 observer_list_.RemoveObserver(observer);
165 }
166
167 // Note: we are triggering updates even though the change might not actually be
168 // visible to the outside.
169 void CombiningCloudPolicyProvider::OnUpdatePolicy(
170 CloudPolicyProvider* cloud_policy_provider) {
171 FOR_EACH_OBSERVER(ConfigurationPolicyProvider::Observer,
172 observer_list_, OnUpdatePolicy());
173 }
174
175 // Removes the going-away CloudPolicyProvider from |cloud_policy_providers_|.
176 void CombiningCloudPolicyProvider::OnProviderGoingAway(
177 CloudPolicyProvider* cloud_policy_provider) {
178 ListType::iterator i;
179 for (i = cloud_policy_providers_.begin();
180 i != cloud_policy_providers_.end(); ++i) {
181 if ((*i)->cloud_policy_provider() == cloud_policy_provider) {
182 cloud_policy_providers_.erase(i);
183 return;
184 }
43 } 185 }
44 virtual void RemoveObserver(ConfigurationPolicyProvider::Observer* observer) { 186 }
45 cache_->observer_list_.RemoveObserver(observer);
46 }
47
48 private:
49 // The underlying policy cache.
50 CloudPolicyCacheBase* cache_;
51 // Policy level this provider will handle.
52 CloudPolicyCacheBase::PolicyLevel level_;
53
54 DISALLOW_COPY_AND_ASSIGN(CloudPolicyProvider);
55 };
56 187
57 CloudPolicyCacheBase::CloudPolicyCacheBase() 188 CloudPolicyCacheBase::CloudPolicyCacheBase()
58 : notifier_(NULL), 189 : notifier_(NULL),
59 initialization_complete_(false), 190 initialization_complete_(false),
60 is_unmanaged_(false) { 191 is_unmanaged_(false) {
61 public_key_version_.valid = false; 192 public_key_version_.valid = false;
62 managed_policy_provider_.reset(
63 new CloudPolicyProvider(
64 ConfigurationPolicyPrefStore::GetChromePolicyDefinitionList(),
65 this,
66 POLICY_LEVEL_MANDATORY));
67 recommended_policy_provider_.reset(
68 new CloudPolicyProvider(
69 ConfigurationPolicyPrefStore::GetChromePolicyDefinitionList(),
70 this,
71 POLICY_LEVEL_RECOMMENDED));
72 } 193 }
73 194
74 CloudPolicyCacheBase::~CloudPolicyCacheBase() { 195 CloudPolicyCacheBase::~CloudPolicyCacheBase() {
75 FOR_EACH_OBSERVER(ConfigurationPolicyProvider::Observer, 196 FOR_EACH_OBSERVER(ConfigurationPolicyProvider::Observer,
76 observer_list_, OnProviderGoingAway()); 197 observer_list_, OnProviderGoingAway());
77 } 198 }
78 199
200 void CloudPolicyCacheBase::AddObserver(
201 ConfigurationPolicyProvider::Observer* observer) {
202 observer_list_.AddObserver(observer);
203 }
204
205 void CloudPolicyCacheBase::RemoveObserver(
206 ConfigurationPolicyProvider::Observer* observer) {
207 observer_list_.RemoveObserver(observer);
208 }
209
210 PolicyMap* CloudPolicyCacheBase::mandatory_policy() {
211 return &mandatory_policy_;
212 }
213
214 PolicyMap* CloudPolicyCacheBase::recommended_policy() {
215 return &recommended_policy_;
216 }
217
79 bool CloudPolicyCacheBase::GetPublicKeyVersion(int* version) { 218 bool CloudPolicyCacheBase::GetPublicKeyVersion(int* version) {
80 if (public_key_version_.valid) 219 if (public_key_version_.valid)
81 *version = public_key_version_.version; 220 *version = public_key_version_.version;
82 221
83 return public_key_version_.valid; 222 return public_key_version_.valid;
84 } 223 }
85 224
86 bool CloudPolicyCacheBase::SetPolicyInternal( 225 bool CloudPolicyCacheBase::SetPolicyInternal(
87 const em::PolicyFetchResponse& policy, 226 const em::PolicyFetchResponse& policy,
88 base::Time* timestamp, 227 base::Time* timestamp,
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after
132 initialization_complete_ = true; 271 initialization_complete_ = true;
133 public_key_version_.valid = false; 272 public_key_version_.valid = false;
134 mandatory_policy_.Clear(); 273 mandatory_policy_.Clear();
135 recommended_policy_.Clear(); 274 recommended_policy_.Clear();
136 last_policy_refresh_time_ = timestamp; 275 last_policy_refresh_time_ = timestamp;
137 276
138 FOR_EACH_OBSERVER(ConfigurationPolicyProvider::Observer, 277 FOR_EACH_OBSERVER(ConfigurationPolicyProvider::Observer,
139 observer_list_, OnUpdatePolicy()); 278 observer_list_, OnUpdatePolicy());
140 } 279 }
141 280
142 ConfigurationPolicyProvider* CloudPolicyCacheBase::GetManagedPolicyProvider() {
143 DCHECK(CalledOnValidThread());
144 return managed_policy_provider_.get();
145 }
146
147 ConfigurationPolicyProvider*
148 CloudPolicyCacheBase::GetRecommendedPolicyProvider() {
149 DCHECK(CalledOnValidThread());
150 return recommended_policy_provider_.get();
151 }
152
153 bool CloudPolicyCacheBase::DecodePolicyResponse( 281 bool CloudPolicyCacheBase::DecodePolicyResponse(
154 const em::PolicyFetchResponse& policy_response, 282 const em::PolicyFetchResponse& policy_response,
155 PolicyMap* mandatory, 283 PolicyMap* mandatory,
156 PolicyMap* recommended, 284 PolicyMap* recommended,
157 base::Time* timestamp, 285 base::Time* timestamp,
158 PublicKeyVersion* public_key_version) { 286 PublicKeyVersion* public_key_version) {
159 std::string data = policy_response.policy_data(); 287 std::string data = policy_response.policy_data();
160 em::PolicyData policy_data; 288 em::PolicyData policy_data;
161 if (!policy_data.ParseFromString(data)) { 289 if (!policy_data.ParseFromString(data)) {
162 LOG(WARNING) << "Failed to parse PolicyData protobuf."; 290 LOG(WARNING) << "Failed to parse PolicyData protobuf.";
(...skipping 15 matching lines...) Expand all
178 void CloudPolicyCacheBase::InformNotifier( 306 void CloudPolicyCacheBase::InformNotifier(
179 CloudPolicySubsystem::PolicySubsystemState state, 307 CloudPolicySubsystem::PolicySubsystemState state,
180 CloudPolicySubsystem::ErrorDetails error_details) { 308 CloudPolicySubsystem::ErrorDetails error_details) {
181 // TODO(jkummerow): To obsolete this NULL-check, make all uses of 309 // TODO(jkummerow): To obsolete this NULL-check, make all uses of
182 // UserPolicyCache explicitly set a notifier using |set_policy_notifier()|. 310 // UserPolicyCache explicitly set a notifier using |set_policy_notifier()|.
183 if (notifier_) 311 if (notifier_)
184 notifier_->Inform(state, error_details, PolicyNotifier::POLICY_CACHE); 312 notifier_->Inform(state, error_details, PolicyNotifier::POLICY_CACHE);
185 } 313 }
186 314
187 } // namespace policy 315 } // namespace policy
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698