OLD | NEW |
1 // Copyright 2013 The Chromium Authors. All rights reserved. | 1 // Copyright 2013 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/chromeos/policy/cloud_external_data_policy_observer.h" | 5 #include "chrome/browser/chromeos/policy/cloud_external_data_policy_observer.h" |
6 | 6 |
7 #include <set> | 7 #include <set> |
8 #include <vector> | 8 #include <vector> |
9 | 9 |
10 #include "base/bind.h" | 10 #include "base/bind.h" |
(...skipping 20 matching lines...) Expand all Loading... |
31 #include "content/public/browser/notification_source.h" | 31 #include "content/public/browser/notification_source.h" |
32 | 32 |
33 namespace policy { | 33 namespace policy { |
34 | 34 |
35 // Helper class that observes a policy for a logged-in user, notifying the | 35 // Helper class that observes a policy for a logged-in user, notifying the |
36 // |parent_| whenever the external data reference for this user changes. | 36 // |parent_| whenever the external data reference for this user changes. |
37 class CloudExternalDataPolicyObserver::PolicyServiceObserver | 37 class CloudExternalDataPolicyObserver::PolicyServiceObserver |
38 : public PolicyService::Observer { | 38 : public PolicyService::Observer { |
39 public: | 39 public: |
40 PolicyServiceObserver(CloudExternalDataPolicyObserver* parent, | 40 PolicyServiceObserver(CloudExternalDataPolicyObserver* parent, |
41 const std::string& user_id, | 41 const user_manager::UserID& user_id, |
42 PolicyService* policy_service); | 42 PolicyService* policy_service); |
43 ~PolicyServiceObserver() override; | 43 ~PolicyServiceObserver() override; |
44 | 44 |
45 // PolicyService::Observer: | 45 // PolicyService::Observer: |
46 void OnPolicyUpdated(const PolicyNamespace& ns, | 46 void OnPolicyUpdated(const PolicyNamespace& ns, |
47 const PolicyMap& previous, | 47 const PolicyMap& previous, |
48 const PolicyMap& current) override; | 48 const PolicyMap& current) override; |
49 | 49 |
50 private: | 50 private: |
51 CloudExternalDataPolicyObserver* parent_; | 51 CloudExternalDataPolicyObserver* parent_; |
52 const std::string user_id_; | 52 const user_manager::UserID user_id_; |
53 PolicyService* policy_service_; | 53 PolicyService* policy_service_; |
54 | 54 |
55 DISALLOW_COPY_AND_ASSIGN(PolicyServiceObserver); | 55 DISALLOW_COPY_AND_ASSIGN(PolicyServiceObserver); |
56 }; | 56 }; |
57 | 57 |
58 CloudExternalDataPolicyObserver::PolicyServiceObserver::PolicyServiceObserver( | 58 CloudExternalDataPolicyObserver::PolicyServiceObserver::PolicyServiceObserver( |
59 CloudExternalDataPolicyObserver* parent, | 59 CloudExternalDataPolicyObserver* parent, |
60 const std::string& user_id, | 60 const user_manager::UserID& user_id, |
61 PolicyService* policy_service) | 61 PolicyService* policy_service) |
62 : parent_(parent), | 62 : parent_(parent), |
63 user_id_(user_id), | 63 user_id_(user_id), |
64 policy_service_(policy_service) { | 64 policy_service_(policy_service) { |
65 policy_service_->AddObserver(POLICY_DOMAIN_CHROME, this); | 65 policy_service_->AddObserver(POLICY_DOMAIN_CHROME, this); |
66 | 66 |
67 if (!IsDeviceLocalAccountUser(user_id, NULL)) { | 67 if (!IsDeviceLocalAccountUser(user_id, NULL)) { |
68 // Notify |parent_| if the external data reference for |user_id_| is set | 68 // Notify |parent_| if the external data reference for |user_id_| is set |
69 // during login. This is omitted for device-local accounts because their | 69 // during login. This is omitted for device-local accounts because their |
70 // policy is available before login and the external data reference will | 70 // policy is available before login and the external data reference will |
(...skipping 24 matching lines...) Expand all Loading... |
95 (previous_entry && current_entry && | 95 (previous_entry && current_entry && |
96 !previous_entry->Equals(*current_entry))) { | 96 !previous_entry->Equals(*current_entry))) { |
97 // Notify |parent_| if the external data reference for |user_id_| has | 97 // Notify |parent_| if the external data reference for |user_id_| has |
98 // changed. | 98 // changed. |
99 parent_->HandleExternalDataPolicyUpdate(user_id_, current_entry); | 99 parent_->HandleExternalDataPolicyUpdate(user_id_, current_entry); |
100 } | 100 } |
101 } | 101 } |
102 | 102 |
103 void CloudExternalDataPolicyObserver::Delegate::OnExternalDataSet( | 103 void CloudExternalDataPolicyObserver::Delegate::OnExternalDataSet( |
104 const std::string& policy, | 104 const std::string& policy, |
105 const std::string& user_id) { | 105 const user_manager::UserID& user_id) { |
106 } | 106 } |
107 | 107 |
108 void CloudExternalDataPolicyObserver::Delegate::OnExternalDataCleared( | 108 void CloudExternalDataPolicyObserver::Delegate::OnExternalDataCleared( |
109 const std::string& policy, | 109 const std::string& policy, |
110 const std::string& user_id) { | 110 const user_manager::UserID& user_id) { |
111 } | 111 } |
112 | 112 |
113 void CloudExternalDataPolicyObserver::Delegate::OnExternalDataFetched( | 113 void CloudExternalDataPolicyObserver::Delegate::OnExternalDataFetched( |
114 const std::string& policy, | 114 const std::string& policy, |
115 const std::string& user_id, | 115 const user_manager::UserID& user_id, |
116 scoped_ptr<std::string> data) { | 116 scoped_ptr<std::string> data) { |
117 } | 117 } |
118 | 118 |
119 CloudExternalDataPolicyObserver::Delegate::~Delegate() { | 119 CloudExternalDataPolicyObserver::Delegate::~Delegate() { |
120 } | 120 } |
121 | 121 |
122 CloudExternalDataPolicyObserver::CloudExternalDataPolicyObserver( | 122 CloudExternalDataPolicyObserver::CloudExternalDataPolicyObserver( |
123 chromeos::CrosSettings* cros_settings, | 123 chromeos::CrosSettings* cros_settings, |
124 DeviceLocalAccountPolicyService* device_local_account_policy_service, | 124 DeviceLocalAccountPolicyService* device_local_account_policy_service, |
125 const std::string& policy, | 125 const std::string& policy, |
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
168 } | 168 } |
169 Profile* profile = content::Details<Profile>(details).ptr(); | 169 Profile* profile = content::Details<Profile>(details).ptr(); |
170 | 170 |
171 const user_manager::User* user = | 171 const user_manager::User* user = |
172 chromeos::ProfileHelper::Get()->GetUserByProfile(profile); | 172 chromeos::ProfileHelper::Get()->GetUserByProfile(profile); |
173 if (!user) { | 173 if (!user) { |
174 NOTREACHED(); | 174 NOTREACHED(); |
175 return; | 175 return; |
176 } | 176 } |
177 | 177 |
178 const std::string& user_id = user->email(); | 178 const user_manager::UserID& user_id = user->GetUserID(); |
179 if (ContainsKey(logged_in_user_observers_, user_id)) { | 179 if (ContainsKey(logged_in_user_observers_, user_id)) { |
180 NOTREACHED(); | 180 NOTREACHED(); |
181 return; | 181 return; |
182 } | 182 } |
183 | 183 |
184 ProfilePolicyConnector* policy_connector = | 184 ProfilePolicyConnector* policy_connector = |
185 ProfilePolicyConnectorFactory::GetForBrowserContext(profile); | 185 ProfilePolicyConnectorFactory::GetForBrowserContext(profile); |
186 logged_in_user_observers_[user_id] = make_linked_ptr( | 186 logged_in_user_observers_[user_id] = make_linked_ptr( |
187 new PolicyServiceObserver(this, | 187 new PolicyServiceObserver(this, |
188 user_id, | 188 user_id, |
189 policy_connector->policy_service())); | 189 policy_connector->policy_service())); |
190 } | 190 } |
191 | 191 |
192 void CloudExternalDataPolicyObserver::OnPolicyUpdated( | 192 void CloudExternalDataPolicyObserver::OnPolicyUpdated( |
193 const std::string& user_id) { | 193 const user_manager::UserID& user_id) { |
194 if (ContainsKey(logged_in_user_observers_, user_id)) { | 194 if (ContainsKey(logged_in_user_observers_, user_id)) { |
195 // When a device-local account is logged in, a policy change triggers both | 195 // When a device-local account is logged in, a policy change triggers both |
196 // OnPolicyUpdated() and PolicyServiceObserver::OnPolicyUpdated(). Ignore | 196 // OnPolicyUpdated() and PolicyServiceObserver::OnPolicyUpdated(). Ignore |
197 // the former so that the policy change is handled only once. | 197 // the former so that the policy change is handled only once. |
198 return; | 198 return; |
199 } | 199 } |
200 | 200 |
201 if (!device_local_account_policy_service_) { | 201 if (!device_local_account_policy_service_) { |
202 NOTREACHED(); | 202 NOTREACHED(); |
203 return; | 203 return; |
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
245 // Schedule a callback if device policy has not yet been verified. | 245 // Schedule a callback if device policy has not yet been verified. |
246 if (chromeos::CrosSettingsProvider::TRUSTED != | 246 if (chromeos::CrosSettingsProvider::TRUSTED != |
247 cros_settings_->PrepareTrustedValues(base::Bind( | 247 cros_settings_->PrepareTrustedValues(base::Bind( |
248 &CloudExternalDataPolicyObserver::RetrieveDeviceLocalAccounts, | 248 &CloudExternalDataPolicyObserver::RetrieveDeviceLocalAccounts, |
249 weak_factory_.GetWeakPtr()))) { | 249 weak_factory_.GetWeakPtr()))) { |
250 return; | 250 return; |
251 } | 251 } |
252 | 252 |
253 std::vector<DeviceLocalAccount> device_local_account_list = | 253 std::vector<DeviceLocalAccount> device_local_account_list = |
254 policy::GetDeviceLocalAccounts(cros_settings_); | 254 policy::GetDeviceLocalAccounts(cros_settings_); |
255 std::set<std::string> device_local_accounts; | 255 std::set<user_manager::UserID> device_local_accounts; |
256 for (std::vector<DeviceLocalAccount>::const_iterator it = | 256 for (std::vector<DeviceLocalAccount>::const_iterator it = |
257 device_local_account_list.begin(); | 257 device_local_account_list.begin(); |
258 it != device_local_account_list.end(); ++it) { | 258 it != device_local_account_list.end(); ++it) { |
259 device_local_accounts.insert(it->user_id); | 259 device_local_accounts.insert(it->user_id); |
260 } | 260 } |
261 | 261 |
262 for (DeviceLocalAccountEntryMap::iterator it = | 262 for (DeviceLocalAccountEntryMap::iterator it = |
263 device_local_account_entries_.begin(); | 263 device_local_account_entries_.begin(); |
264 it != device_local_account_entries_.end(); ) { | 264 it != device_local_account_entries_.end(); ) { |
265 if (!ContainsKey(device_local_accounts, it->first)) { | 265 if (!ContainsKey(device_local_accounts, it->first)) { |
266 const std::string user_id = it->first; | 266 const user_manager::UserID user_id = it->first; |
267 it->second.DeleteOwnedMembers(); | 267 it->second.DeleteOwnedMembers(); |
268 device_local_account_entries_.erase(it++); | 268 device_local_account_entries_.erase(it++); |
269 // When a device-local account whose external data reference was set is | 269 // When a device-local account whose external data reference was set is |
270 // removed, emit a notification that the external data reference has been | 270 // removed, emit a notification that the external data reference has been |
271 // cleared. | 271 // cleared. |
272 HandleExternalDataPolicyUpdate(user_id, NULL); | 272 HandleExternalDataPolicyUpdate(user_id, NULL); |
273 } else { | 273 } else { |
274 ++it; | 274 ++it; |
275 } | 275 } |
276 } | 276 } |
277 | 277 |
278 for (std::set<std::string>::const_iterator it = device_local_accounts.begin(); | 278 for (std::set<user_manager::UserID>::const_iterator it = device_local_accounts
.begin(); |
279 it != device_local_accounts.end(); ++it) { | 279 it != device_local_accounts.end(); ++it) { |
280 OnPolicyUpdated(*it); | 280 OnPolicyUpdated(*it); |
281 } | 281 } |
282 } | 282 } |
283 | 283 |
284 void CloudExternalDataPolicyObserver::HandleExternalDataPolicyUpdate( | 284 void CloudExternalDataPolicyObserver::HandleExternalDataPolicyUpdate( |
285 const std::string& user_id, | 285 const user_manager::UserID& user_id, |
286 const PolicyMap::Entry* entry) { | 286 const PolicyMap::Entry* entry) { |
287 if (!entry) { | 287 if (!entry) { |
288 delegate_->OnExternalDataCleared(policy_, user_id); | 288 delegate_->OnExternalDataCleared(policy_, user_id); |
289 fetch_weak_ptrs_.erase(user_id); | 289 fetch_weak_ptrs_.erase(user_id); |
290 return; | 290 return; |
291 } | 291 } |
292 | 292 |
293 delegate_->OnExternalDataSet(policy_, user_id); | 293 delegate_->OnExternalDataSet(policy_, user_id); |
294 | 294 |
295 linked_ptr<WeakPtrFactory>& weak_ptr_factory = fetch_weak_ptrs_[user_id]; | 295 linked_ptr<WeakPtrFactory>& weak_ptr_factory = fetch_weak_ptrs_[user_id]; |
296 weak_ptr_factory.reset(new WeakPtrFactory(this)); | 296 weak_ptr_factory.reset(new WeakPtrFactory(this)); |
297 if (entry->external_data_fetcher) { | 297 if (entry->external_data_fetcher) { |
298 entry->external_data_fetcher->Fetch(base::Bind( | 298 entry->external_data_fetcher->Fetch(base::Bind( |
299 &CloudExternalDataPolicyObserver::OnExternalDataFetched, | 299 &CloudExternalDataPolicyObserver::OnExternalDataFetched, |
300 weak_ptr_factory->GetWeakPtr(), | 300 weak_ptr_factory->GetWeakPtr(), |
301 user_id)); | 301 user_id)); |
302 } else { | 302 } else { |
303 NOTREACHED(); | 303 NOTREACHED(); |
304 } | 304 } |
305 } | 305 } |
306 | 306 |
307 void CloudExternalDataPolicyObserver::OnExternalDataFetched( | 307 void CloudExternalDataPolicyObserver::OnExternalDataFetched( |
308 const std::string& user_id, | 308 const user_manager::UserID& user_id, |
309 scoped_ptr<std::string> data) { | 309 scoped_ptr<std::string> data) { |
310 FetchWeakPtrMap::iterator it = fetch_weak_ptrs_.find(user_id); | 310 FetchWeakPtrMap::iterator it = fetch_weak_ptrs_.find(user_id); |
311 DCHECK(it != fetch_weak_ptrs_.end()); | 311 DCHECK(it != fetch_weak_ptrs_.end()); |
312 fetch_weak_ptrs_.erase(it); | 312 fetch_weak_ptrs_.erase(it); |
313 delegate_->OnExternalDataFetched(policy_, user_id, data.Pass()); | 313 delegate_->OnExternalDataFetched(policy_, user_id, data.Pass()); |
314 } | 314 } |
315 | 315 |
316 } // namespace policy | 316 } // namespace policy |
OLD | NEW |