OLD | NEW |
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 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 | 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/settings/device_settings_service.h" | 5 #include "chrome/browser/chromeos/settings/device_settings_service.h" |
6 | 6 |
7 #include "base/bind.h" | 7 #include "base/bind.h" |
8 #include "base/logging.h" | 8 #include "base/logging.h" |
9 #include "base/message_loop/message_loop.h" | 9 #include "base/message_loop/message_loop.h" |
10 #include "base/stl_util.h" | 10 #include "base/stl_util.h" |
(...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
67 // static | 67 // static |
68 DeviceSettingsService* DeviceSettingsService::Get() { | 68 DeviceSettingsService* DeviceSettingsService::Get() { |
69 CHECK(g_device_settings_service); | 69 CHECK(g_device_settings_service); |
70 return g_device_settings_service; | 70 return g_device_settings_service; |
71 } | 71 } |
72 | 72 |
73 DeviceSettingsService::DeviceSettingsService() | 73 DeviceSettingsService::DeviceSettingsService() |
74 : session_manager_client_(NULL), | 74 : session_manager_client_(NULL), |
75 weak_factory_(this), | 75 weak_factory_(this), |
76 store_status_(STORE_SUCCESS), | 76 store_status_(STORE_SUCCESS), |
| 77 certificates_loaded_(false), |
| 78 owner_key_loaded_with_certificates_(false), |
77 load_retries_left_(kMaxLoadRetries) { | 79 load_retries_left_(kMaxLoadRetries) { |
78 if (CertLoader::IsInitialized()) | 80 if (CertLoader::IsInitialized()) { |
| 81 certificates_loaded_ = CertLoader::Get()->certificates_loaded(); |
79 CertLoader::Get()->AddObserver(this); | 82 CertLoader::Get()->AddObserver(this); |
| 83 } |
80 } | 84 } |
81 | 85 |
82 DeviceSettingsService::~DeviceSettingsService() { | 86 DeviceSettingsService::~DeviceSettingsService() { |
83 DCHECK(pending_operations_.empty()); | 87 DCHECK(pending_operations_.empty()); |
84 if (CertLoader::IsInitialized()) | 88 if (CertLoader::IsInitialized()) |
85 CertLoader::Get()->RemoveObserver(this); | 89 CertLoader::Get()->RemoveObserver(this); |
86 } | 90 } |
87 | 91 |
88 void DeviceSettingsService::SetSessionManager( | 92 void DeviceSettingsService::SetSessionManager( |
89 SessionManagerClient* session_manager_client, | 93 SessionManagerClient* session_manager_client, |
(...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
149 | 153 |
150 return OWNERSHIP_UNKNOWN; | 154 return OWNERSHIP_UNKNOWN; |
151 } | 155 } |
152 | 156 |
153 void DeviceSettingsService::GetOwnershipStatusAsync( | 157 void DeviceSettingsService::GetOwnershipStatusAsync( |
154 const OwnershipStatusCallback& callback) { | 158 const OwnershipStatusCallback& callback) { |
155 if (owner_key_.get()) { | 159 if (owner_key_.get()) { |
156 // If there is a key, report status immediately. | 160 // If there is a key, report status immediately. |
157 base::MessageLoop::current()->PostTask( | 161 base::MessageLoop::current()->PostTask( |
158 FROM_HERE, | 162 FROM_HERE, |
159 base::Bind(callback, | 163 base::Bind( |
160 owner_key_->public_key() ? OWNERSHIP_TAKEN : OWNERSHIP_NONE, | 164 callback, |
161 owner_key_->private_key() != NULL)); | 165 owner_key_->public_key() ? OWNERSHIP_TAKEN : OWNERSHIP_NONE)); |
162 } else { | 166 } else { |
163 // If the key hasn't been loaded yet, enqueue the callback to be fired when | 167 // If the key hasn't been loaded yet, enqueue the callback to be fired when |
164 // the next SessionManagerOperation completes. If no operation is pending, | 168 // the next SessionManagerOperation completes. If no operation is pending, |
165 // start a load operation to fetch the key and report the result. | 169 // start a load operation to fetch the key and report the result. |
166 pending_ownership_status_callbacks_.push_back(callback); | 170 pending_ownership_status_callbacks_.push_back(callback); |
167 if (pending_operations_.empty()) | 171 if (pending_operations_.empty()) |
168 EnqueueLoad(false); | 172 EnqueueLoad(false); |
169 } | 173 } |
170 } | 174 } |
171 | 175 |
172 bool DeviceSettingsService::HasPrivateOwnerKey() { | 176 bool DeviceSettingsService::HasPrivateOwnerKey() { |
173 return owner_key_.get() && owner_key_->private_key(); | 177 return owner_key_.get() && owner_key_->private_key(); |
174 } | 178 } |
175 | 179 |
| 180 void DeviceSettingsService::IsCurrentUserOwnerAsync( |
| 181 const IsCurrentUserOwnerCallback& callback) { |
| 182 if (owner_key_loaded_with_certificates_) { |
| 183 // If the current owner key was loaded while the certificates were loaded, |
| 184 // or the certificate loader is not initialized, in which case the private |
| 185 // key cannot be set, report status immediately. |
| 186 base::MessageLoop::current()->PostTask( |
| 187 FROM_HERE, |
| 188 base::Bind(callback, HasPrivateOwnerKey())); |
| 189 } else { |
| 190 // If the key hasn't been loaded with the known certificates, enqueue the |
| 191 // callback to be fired when the next SessionManagerOperation completes in |
| 192 // an environment where the certificates are loaded. There is no need to |
| 193 // start a new operation, as the reload operation will be started when the |
| 194 // certificates are loaded. |
| 195 pending_is_current_user_owner_callbacks_.push_back(callback); |
| 196 } |
| 197 } |
| 198 |
176 void DeviceSettingsService::SetUsername(const std::string& username) { | 199 void DeviceSettingsService::SetUsername(const std::string& username) { |
177 username_ = username; | 200 username_ = username; |
178 | 201 |
179 // The private key may have become available, so force a key reload. | 202 // The private key may have become available, so force a key reload. |
180 owner_key_ = NULL; | 203 owner_key_ = NULL; |
181 EnsureReload(true); | 204 EnsureReload(true); |
182 } | 205 } |
183 | 206 |
184 const std::string& DeviceSettingsService::GetUsername() const { | 207 const std::string& DeviceSettingsService::GetUsername() const { |
185 return username_; | 208 return username_; |
(...skipping 22 matching lines...) Expand all Loading... |
208 LOG(ERROR) << "Policy update failed."; | 231 LOG(ERROR) << "Policy update failed."; |
209 return; | 232 return; |
210 } | 233 } |
211 | 234 |
212 EnsureReload(false); | 235 EnsureReload(false); |
213 } | 236 } |
214 | 237 |
215 void DeviceSettingsService::OnCertificatesLoaded( | 238 void DeviceSettingsService::OnCertificatesLoaded( |
216 const net::CertificateList& cert_list, | 239 const net::CertificateList& cert_list, |
217 bool initial_load) { | 240 bool initial_load) { |
| 241 certificates_loaded_ = true; |
218 // CertLoader initializes the TPM and NSS database which is necessary to | 242 // CertLoader initializes the TPM and NSS database which is necessary to |
219 // determine ownership. Force a reload once we know these are initialized. | 243 // determine ownership. Force a reload once we know these are initialized. |
220 EnsureReload(true); | 244 EnsureReload(true); |
221 } | 245 } |
222 | 246 |
223 void DeviceSettingsService::Enqueue(SessionManagerOperation* operation) { | 247 void DeviceSettingsService::Enqueue(SessionManagerOperation* operation) { |
224 pending_operations_.push_back(operation); | 248 pending_operations_.push_back(operation); |
225 if (pending_operations_.front() == operation) | 249 if (pending_operations_.front() == operation) |
226 StartNextOperation(); | 250 StartNextOperation(); |
227 } | 251 } |
(...skipping 76 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
304 content::Source<DeviceSettingsService>(this), | 328 content::Source<DeviceSettingsService>(this), |
305 content::NotificationService::NoDetails()); | 329 content::NotificationService::NoDetails()); |
306 } | 330 } |
307 | 331 |
308 FOR_EACH_OBSERVER(Observer, observers_, DeviceSettingsUpdated()); | 332 FOR_EACH_OBSERVER(Observer, observers_, DeviceSettingsUpdated()); |
309 | 333 |
310 std::vector<OwnershipStatusCallback> callbacks; | 334 std::vector<OwnershipStatusCallback> callbacks; |
311 callbacks.swap(pending_ownership_status_callbacks_); | 335 callbacks.swap(pending_ownership_status_callbacks_); |
312 for (std::vector<OwnershipStatusCallback>::iterator iter(callbacks.begin()); | 336 for (std::vector<OwnershipStatusCallback>::iterator iter(callbacks.begin()); |
313 iter != callbacks.end(); ++iter) { | 337 iter != callbacks.end(); ++iter) { |
314 iter->Run(ownership_status, is_owner); | 338 iter->Run(ownership_status); |
| 339 } |
| 340 |
| 341 if (certificates_loaded_) { |
| 342 owner_key_loaded_with_certificates_ = true; |
| 343 std::vector<IsCurrentUserOwnerCallback> is_owner_callbacks; |
| 344 is_owner_callbacks.swap(pending_is_current_user_owner_callbacks_); |
| 345 for (std::vector<IsCurrentUserOwnerCallback>::iterator iter( |
| 346 is_owner_callbacks.begin()); |
| 347 iter != is_owner_callbacks.end(); ++iter) { |
| 348 iter->Run(is_owner); |
| 349 } |
315 } | 350 } |
316 | 351 |
317 // The completion callback happens after the notification so clients can | 352 // The completion callback happens after the notification so clients can |
318 // filter self-triggered updates. | 353 // filter self-triggered updates. |
319 if (!callback.is_null()) | 354 if (!callback.is_null()) |
320 callback.Run(); | 355 callback.Run(); |
321 | 356 |
322 // Only remove the pending operation here, so new operations triggered by any | 357 // Only remove the pending operation here, so new operations triggered by any |
323 // of the callbacks above are queued up properly. | 358 // of the callbacks above are queued up properly. |
324 pending_operations_.pop_front(); | 359 pending_operations_.pop_front(); |
325 delete operation; | 360 delete operation; |
326 | 361 |
327 StartNextOperation(); | 362 StartNextOperation(); |
328 } | 363 } |
329 | 364 |
330 ScopedTestDeviceSettingsService::ScopedTestDeviceSettingsService() { | 365 ScopedTestDeviceSettingsService::ScopedTestDeviceSettingsService() { |
331 DeviceSettingsService::Initialize(); | 366 DeviceSettingsService::Initialize(); |
332 } | 367 } |
333 | 368 |
334 ScopedTestDeviceSettingsService::~ScopedTestDeviceSettingsService() { | 369 ScopedTestDeviceSettingsService::~ScopedTestDeviceSettingsService() { |
335 DeviceSettingsService::Shutdown(); | 370 DeviceSettingsService::Shutdown(); |
336 } | 371 } |
337 | 372 |
338 } // namespace chromeos | 373 } // namespace chromeos |
OLD | NEW |