OLD | NEW |
1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 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/ownership/owner_settings_service_chromeos.h" | 5 #include "chrome/browser/chromeos/ownership/owner_settings_service_chromeos.h" |
6 | 6 |
7 #include <string> | 7 #include <string> |
8 | 8 |
9 #include "base/bind.h" | 9 #include "base/bind.h" |
10 #include "base/bind_helpers.h" | 10 #include "base/bind_helpers.h" |
(...skipping 139 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
150 | 150 |
151 OwnerSettingsServiceChromeOS::OwnerSettingsServiceChromeOS( | 151 OwnerSettingsServiceChromeOS::OwnerSettingsServiceChromeOS( |
152 DeviceSettingsService* device_settings_service, | 152 DeviceSettingsService* device_settings_service, |
153 Profile* profile, | 153 Profile* profile, |
154 const scoped_refptr<OwnerKeyUtil>& owner_key_util) | 154 const scoped_refptr<OwnerKeyUtil>& owner_key_util) |
155 : ownership::OwnerSettingsService(owner_key_util), | 155 : ownership::OwnerSettingsService(owner_key_util), |
156 device_settings_service_(device_settings_service), | 156 device_settings_service_(device_settings_service), |
157 profile_(profile), | 157 profile_(profile), |
158 waiting_for_profile_creation_(true), | 158 waiting_for_profile_creation_(true), |
159 waiting_for_tpm_token_(true), | 159 waiting_for_tpm_token_(true), |
160 has_pending_changes_(false), | |
161 weak_factory_(this), | 160 weak_factory_(this), |
162 store_settings_factory_(this) { | 161 store_settings_factory_(this) { |
163 if (TPMTokenLoader::IsInitialized()) { | 162 if (TPMTokenLoader::IsInitialized()) { |
164 TPMTokenLoader::TPMTokenStatus tpm_token_status = | 163 TPMTokenLoader::TPMTokenStatus tpm_token_status = |
165 TPMTokenLoader::Get()->IsTPMTokenEnabled( | 164 TPMTokenLoader::Get()->IsTPMTokenEnabled( |
166 base::Bind(&OwnerSettingsServiceChromeOS::OnTPMTokenReady, | 165 base::Bind(&OwnerSettingsServiceChromeOS::OnTPMTokenReady, |
167 weak_factory_.GetWeakPtr())); | 166 weak_factory_.GetWeakPtr())); |
168 waiting_for_tpm_token_ = | 167 waiting_for_tpm_token_ = |
169 tpm_token_status == TPMTokenLoader::TPM_TOKEN_STATUS_UNDETERMINED; | 168 tpm_token_status == TPMTokenLoader::TPM_TOKEN_STATUS_UNDETERMINED; |
170 } | 169 } |
171 | 170 |
172 if (DBusThreadManager::IsInitialized() && | 171 if (DBusThreadManager::IsInitialized() && |
173 DBusThreadManager::Get()->GetSessionManagerClient()) { | 172 DBusThreadManager::Get()->GetSessionManagerClient()) { |
174 DBusThreadManager::Get()->GetSessionManagerClient()->AddObserver(this); | 173 DBusThreadManager::Get()->GetSessionManagerClient()->AddObserver(this); |
175 } | 174 } |
176 | 175 |
177 if (device_settings_service_) | 176 if (device_settings_service_) |
178 device_settings_service_->AddObserver(this); | 177 device_settings_service_->AddObserver(this); |
179 | 178 |
180 registrar_.Add(this, | 179 registrar_.Add(this, |
181 chrome::NOTIFICATION_PROFILE_CREATED, | 180 chrome::NOTIFICATION_PROFILE_CREATED, |
182 content::Source<Profile>(profile_)); | 181 content::Source<Profile>(profile_)); |
183 | |
184 UpdateFromService(); | |
185 } | 182 } |
186 | 183 |
187 OwnerSettingsServiceChromeOS::~OwnerSettingsServiceChromeOS() { | 184 OwnerSettingsServiceChromeOS::~OwnerSettingsServiceChromeOS() { |
188 DCHECK(thread_checker_.CalledOnValidThread()); | 185 DCHECK(thread_checker_.CalledOnValidThread()); |
189 | 186 |
190 if (device_settings_service_) | 187 if (device_settings_service_) |
191 device_settings_service_->RemoveObserver(this); | 188 device_settings_service_->RemoveObserver(this); |
192 | 189 |
193 if (DBusThreadManager::IsInitialized() && | 190 if (DBusThreadManager::IsInitialized() && |
194 DBusThreadManager::Get()->GetSessionManagerClient()) { | 191 DBusThreadManager::Get()->GetSessionManagerClient()) { |
(...skipping 13 matching lines...) Expand all Loading... |
208 | 205 |
209 bool OwnerSettingsServiceChromeOS::HandlesSetting(const std::string& setting) { | 206 bool OwnerSettingsServiceChromeOS::HandlesSetting(const std::string& setting) { |
210 return DeviceSettingsProvider::IsDeviceSetting(setting); | 207 return DeviceSettingsProvider::IsDeviceSetting(setting); |
211 } | 208 } |
212 | 209 |
213 bool OwnerSettingsServiceChromeOS::Set(const std::string& setting, | 210 bool OwnerSettingsServiceChromeOS::Set(const std::string& setting, |
214 const base::Value& value) { | 211 const base::Value& value) { |
215 if (!IsOwner() && !IsOwnerInTests(user_id_)) | 212 if (!IsOwner() && !IsOwnerInTests(user_id_)) |
216 return false; | 213 return false; |
217 | 214 |
218 UpdateDeviceSettings(setting, value, device_settings_); | 215 pending_changes_.add(setting, make_scoped_ptr(value.DeepCopy())); |
| 216 |
| 217 em::ChromeDeviceSettingsProto settings; |
| 218 if (tentative_settings_.get()) { |
| 219 settings = *tentative_settings_; |
| 220 } else if (device_settings_service_->status() == |
| 221 DeviceSettingsService::STORE_SUCCESS && |
| 222 device_settings_service_->device_settings()) { |
| 223 settings = *device_settings_service_->device_settings(); |
| 224 } |
| 225 UpdateDeviceSettings(setting, value, settings); |
219 em::PolicyData policy_data; | 226 em::PolicyData policy_data; |
220 policy_data.set_username(user_id_); | 227 policy_data.set_username(user_id_); |
221 CHECK(device_settings_.SerializeToString(policy_data.mutable_policy_value())); | 228 CHECK(settings.SerializeToString(policy_data.mutable_policy_value())); |
222 FOR_EACH_OBSERVER(OwnerSettingsService::Observer, | 229 FOR_EACH_OBSERVER(OwnerSettingsService::Observer, observers_, |
223 observers_, | |
224 OnTentativeChangesInPolicy(policy_data)); | 230 OnTentativeChangesInPolicy(policy_data)); |
225 has_pending_changes_ = true; | 231 StorePendingChanges(); |
226 StoreDeviceSettings(); | |
227 return true; | 232 return true; |
228 } | 233 } |
229 | 234 |
230 bool OwnerSettingsServiceChromeOS::CommitTentativeDeviceSettings( | 235 bool OwnerSettingsServiceChromeOS::CommitTentativeDeviceSettings( |
231 scoped_ptr<enterprise_management::PolicyData> policy) { | 236 scoped_ptr<enterprise_management::PolicyData> policy) { |
232 if (!IsOwner() && !IsOwnerInTests(user_id_)) | 237 if (!IsOwner() && !IsOwnerInTests(user_id_)) |
233 return false; | 238 return false; |
234 if (policy->username() != user_id_) { | 239 if (policy->username() != user_id_) { |
235 LOG(ERROR) << "Username mismatch: " << policy->username() << " vs. " | 240 LOG(ERROR) << "Username mismatch: " << policy->username() << " vs. " |
236 << user_id_; | 241 << user_id_; |
237 return false; | 242 return false; |
238 } | 243 } |
239 CHECK(device_settings_.ParseFromString(policy->policy_value())); | 244 tentative_settings_.reset(new em::ChromeDeviceSettingsProto); |
240 FOR_EACH_OBSERVER(OwnerSettingsService::Observer, | 245 CHECK(tentative_settings_->ParseFromString(policy->policy_value())); |
241 observers_, | 246 StorePendingChanges(); |
242 OnTentativeChangesInPolicy(*policy)); | |
243 has_pending_changes_ = true; | |
244 StoreDeviceSettings(); | |
245 return true; | 247 return true; |
246 } | 248 } |
247 | 249 |
248 void OwnerSettingsServiceChromeOS::Observe( | 250 void OwnerSettingsServiceChromeOS::Observe( |
249 int type, | 251 int type, |
250 const content::NotificationSource& source, | 252 const content::NotificationSource& source, |
251 const content::NotificationDetails& details) { | 253 const content::NotificationDetails& details) { |
252 DCHECK(thread_checker_.CalledOnValidThread()); | 254 DCHECK(thread_checker_.CalledOnValidThread()); |
253 if (type != chrome::NOTIFICATION_PROFILE_CREATED) { | 255 if (type != chrome::NOTIFICATION_PROFILE_CREATED) { |
254 NOTREACHED(); | 256 NOTREACHED(); |
(...skipping 11 matching lines...) Expand all Loading... |
266 } | 268 } |
267 | 269 |
268 void OwnerSettingsServiceChromeOS::OwnerKeySet(bool success) { | 270 void OwnerSettingsServiceChromeOS::OwnerKeySet(bool success) { |
269 DCHECK(thread_checker_.CalledOnValidThread()); | 271 DCHECK(thread_checker_.CalledOnValidThread()); |
270 if (success) | 272 if (success) |
271 ReloadKeypair(); | 273 ReloadKeypair(); |
272 } | 274 } |
273 | 275 |
274 void OwnerSettingsServiceChromeOS::OwnershipStatusChanged() { | 276 void OwnerSettingsServiceChromeOS::OwnershipStatusChanged() { |
275 DCHECK(thread_checker_.CalledOnValidThread()); | 277 DCHECK(thread_checker_.CalledOnValidThread()); |
276 StoreDeviceSettings(); | 278 StorePendingChanges(); |
277 } | 279 } |
278 | 280 |
279 void OwnerSettingsServiceChromeOS::DeviceSettingsUpdated() { | 281 void OwnerSettingsServiceChromeOS::DeviceSettingsUpdated() { |
280 DCHECK(thread_checker_.CalledOnValidThread()); | 282 DCHECK(thread_checker_.CalledOnValidThread()); |
281 StoreDeviceSettings(); | 283 StorePendingChanges(); |
282 } | 284 } |
283 | 285 |
284 void OwnerSettingsServiceChromeOS::OnDeviceSettingsServiceShutdown() { | 286 void OwnerSettingsServiceChromeOS::OnDeviceSettingsServiceShutdown() { |
285 device_settings_service_ = nullptr; | 287 device_settings_service_ = nullptr; |
286 } | 288 } |
287 | 289 |
288 // static | 290 // static |
289 void OwnerSettingsServiceChromeOS::IsOwnerForSafeModeAsync( | 291 void OwnerSettingsServiceChromeOS::IsOwnerForSafeModeAsync( |
290 const std::string& user_hash, | 292 const std::string& user_hash, |
291 const scoped_refptr<OwnerKeyUtil>& owner_key_util, | 293 const scoped_refptr<OwnerKeyUtil>& owner_key_util, |
(...skipping 287 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
579 BrowserThread::GetBlockingPool()->GetTaskRunnerWithShutdownBehavior( | 581 BrowserThread::GetBlockingPool()->GetTaskRunnerWithShutdownBehavior( |
580 base::SequencedWorkerPool::SKIP_ON_SHUTDOWN); | 582 base::SequencedWorkerPool::SKIP_ON_SHUTDOWN); |
581 task_runner->PostTask( | 583 task_runner->PostTask( |
582 FROM_HERE, | 584 FROM_HERE, |
583 base::Bind(&LoadPrivateKey, | 585 base::Bind(&LoadPrivateKey, |
584 owner_key_util_, | 586 owner_key_util_, |
585 ProfileHelper::GetUserIdHashFromProfile(profile_), | 587 ProfileHelper::GetUserIdHashFromProfile(profile_), |
586 callback)); | 588 callback)); |
587 } | 589 } |
588 | 590 |
589 void OwnerSettingsServiceChromeOS::StoreDeviceSettings() { | 591 void OwnerSettingsServiceChromeOS::StorePendingChanges() { |
590 if (!has_pending_changes_ || store_settings_factory_.HasWeakPtrs()) | 592 if (!has_pending_changes() || store_settings_factory_.HasWeakPtrs() || |
| 593 !device_settings_service_) { |
591 return; | 594 return; |
592 if (!UpdateFromService()) | 595 } |
| 596 |
| 597 em::ChromeDeviceSettingsProto settings; |
| 598 if (tentative_settings_.get()) { |
| 599 settings.Swap(tentative_settings_.get()); |
| 600 tentative_settings_.reset(); |
| 601 } else if (device_settings_service_->status() == |
| 602 DeviceSettingsService::STORE_SUCCESS && |
| 603 device_settings_service_->device_settings()) { |
| 604 settings = *device_settings_service_->device_settings(); |
| 605 } else { |
593 return; | 606 return; |
| 607 } |
| 608 |
| 609 for (const auto& change : pending_changes_) |
| 610 UpdateDeviceSettings(change.first, *change.second, settings); |
| 611 pending_changes_.clear(); |
| 612 |
594 scoped_ptr<em::PolicyData> policy = AssemblePolicy( | 613 scoped_ptr<em::PolicyData> policy = AssemblePolicy( |
595 user_id_, device_settings_service_->policy_data(), &device_settings_); | 614 user_id_, device_settings_service_->policy_data(), &settings); |
596 has_pending_changes_ = false; | |
597 bool rv = AssembleAndSignPolicyAsync( | 615 bool rv = AssembleAndSignPolicyAsync( |
598 content::BrowserThread::GetBlockingPool(), | 616 content::BrowserThread::GetBlockingPool(), policy.Pass(), |
599 policy.Pass(), | |
600 base::Bind(&OwnerSettingsServiceChromeOS::OnPolicyAssembledAndSigned, | 617 base::Bind(&OwnerSettingsServiceChromeOS::OnPolicyAssembledAndSigned, |
601 store_settings_factory_.GetWeakPtr())); | 618 store_settings_factory_.GetWeakPtr())); |
602 if (!rv) | 619 if (!rv) |
603 OnSignedPolicyStored(false /* success */); | 620 OnSignedPolicyStored(false /* success */); |
604 } | 621 } |
605 | 622 |
606 void OwnerSettingsServiceChromeOS::OnPolicyAssembledAndSigned( | 623 void OwnerSettingsServiceChromeOS::OnPolicyAssembledAndSigned( |
607 scoped_ptr<em::PolicyFetchResponse> policy_response) { | 624 scoped_ptr<em::PolicyFetchResponse> policy_response) { |
608 if (!policy_response.get() || !device_settings_service_) { | 625 if (!policy_response.get() || !device_settings_service_) { |
609 OnSignedPolicyStored(false /* success */); | 626 OnSignedPolicyStored(false /* success */); |
610 return; | 627 return; |
611 } | 628 } |
612 device_settings_service_->Store( | 629 device_settings_service_->Store( |
613 policy_response.Pass(), | 630 policy_response.Pass(), |
614 base::Bind(&OwnerSettingsServiceChromeOS::OnSignedPolicyStored, | 631 base::Bind(&OwnerSettingsServiceChromeOS::OnSignedPolicyStored, |
615 store_settings_factory_.GetWeakPtr(), | 632 store_settings_factory_.GetWeakPtr(), |
616 true /* success */)); | 633 true /* success */)); |
617 } | 634 } |
618 | 635 |
619 void OwnerSettingsServiceChromeOS::OnSignedPolicyStored(bool success) { | 636 void OwnerSettingsServiceChromeOS::OnSignedPolicyStored(bool success) { |
620 store_settings_factory_.InvalidateWeakPtrs(); | 637 store_settings_factory_.InvalidateWeakPtrs(); |
621 FOR_EACH_OBSERVER(OwnerSettingsService::Observer, | 638 FOR_EACH_OBSERVER(OwnerSettingsService::Observer, |
622 observers_, | 639 observers_, |
623 OnSignedPolicyStored(success)); | 640 OnSignedPolicyStored(success)); |
624 StoreDeviceSettings(); | 641 StorePendingChanges(); |
625 if (!success) | |
626 has_pending_changes_ = true; | |
627 } | |
628 | |
629 bool OwnerSettingsServiceChromeOS::UpdateFromService() { | |
630 if (!device_settings_service_ || | |
631 device_settings_service_->status() != | |
632 DeviceSettingsService::STORE_SUCCESS || | |
633 !device_settings_service_->device_settings()) { | |
634 return false; | |
635 } | |
636 enterprise_management::ChromeDeviceSettingsProto settings = | |
637 *device_settings_service_->device_settings(); | |
638 settings.MergeFrom(device_settings_); | |
639 device_settings_.Swap(&settings); | |
640 return true; | |
641 } | 642 } |
642 | 643 |
643 } // namespace chromeos | 644 } // namespace chromeos |
OLD | NEW |