| Index: chrome/browser/chromeos/policy/device_local_account_policy_store.cc
|
| diff --git a/chrome/browser/chromeos/policy/device_local_account_policy_store.cc b/chrome/browser/chromeos/policy/device_local_account_policy_store.cc
|
| index 013bc40f290580a8c3a5f2577683fa3cb171f312..31f42df64268d730dab40792c82127a1b18fd5f1 100644
|
| --- a/chrome/browser/chromeos/policy/device_local_account_policy_store.cc
|
| +++ b/chrome/browser/chromeos/policy/device_local_account_policy_store.cc
|
| @@ -40,7 +40,26 @@ void DeviceLocalAccountPolicyStore::Load() {
|
| session_manager_client_->RetrieveDeviceLocalAccountPolicy(
|
| account_id_,
|
| base::Bind(&DeviceLocalAccountPolicyStore::ValidateLoadedPolicyBlob,
|
| - weak_factory_.GetWeakPtr()));
|
| + weak_factory_.GetWeakPtr(), true /*validate_in_background*/));
|
| +}
|
| +
|
| +void DeviceLocalAccountPolicyStore::LoadImmediately() {
|
| + // This blocking D-Bus call is in the startup path and will block the UI
|
| + // thread. This only happens when the Profile is created synchronously, which
|
| + // on Chrome OS happens whenever the browser is restarted into the same
|
| + // session, that is when the browser crashes, or right after signin if
|
| + // the user has flags configured in about:flags.
|
| + // However, on those paths we must load policy synchronously so that the
|
| + // Profile initialization never sees unmanaged prefs, which would lead to
|
| + // data loss. http://crbug.com/263061
|
| +
|
| + // Cancel all running async loads.
|
| + weak_factory_.InvalidateWeakPtrs();
|
| +
|
| + const std::string policy_blob =
|
| + session_manager_client_->BlockingRetrieveDeviceLocalAccountPolicy(
|
| + account_id_);
|
| + ValidateLoadedPolicyBlob(false /*validate_in_background*/, policy_blob);
|
| }
|
|
|
| void DeviceLocalAccountPolicyStore::Store(
|
| @@ -48,11 +67,13 @@ void DeviceLocalAccountPolicyStore::Store(
|
| weak_factory_.InvalidateWeakPtrs();
|
| CheckKeyAndValidate(
|
| true, base::MakeUnique<em::PolicyFetchResponse>(policy),
|
| + true /*validate_in_background*/,
|
| base::Bind(&DeviceLocalAccountPolicyStore::StoreValidatedPolicy,
|
| weak_factory_.GetWeakPtr()));
|
| }
|
|
|
| void DeviceLocalAccountPolicyStore::ValidateLoadedPolicyBlob(
|
| + bool validate_in_background,
|
| const std::string& policy_blob) {
|
| if (policy_blob.empty()) {
|
| status_ = CloudPolicyStore::STATUS_LOAD_ERROR;
|
| @@ -62,7 +83,7 @@ void DeviceLocalAccountPolicyStore::ValidateLoadedPolicyBlob(
|
| new em::PolicyFetchResponse());
|
| if (policy->ParseFromString(policy_blob)) {
|
| CheckKeyAndValidate(
|
| - false, std::move(policy),
|
| + false, std::move(policy), validate_in_background,
|
| base::Bind(&DeviceLocalAccountPolicyStore::UpdatePolicy,
|
| weak_factory_.GetWeakPtr()));
|
| } else {
|
| @@ -127,19 +148,26 @@ void DeviceLocalAccountPolicyStore::HandleStoreResult(bool success) {
|
| void DeviceLocalAccountPolicyStore::CheckKeyAndValidate(
|
| bool valid_timestamp_required,
|
| std::unique_ptr<em::PolicyFetchResponse> policy,
|
| + bool validate_in_background,
|
| const ValidateCompletionCallback& callback) {
|
| - device_settings_service_->GetOwnershipStatusAsync(
|
| - base::Bind(&DeviceLocalAccountPolicyStore::Validate,
|
| - weak_factory_.GetWeakPtr(),
|
| - valid_timestamp_required,
|
| - base::Passed(&policy),
|
| - callback));
|
| + if (validate_in_background) {
|
| + device_settings_service_->GetOwnershipStatusAsync(
|
| + base::Bind(&DeviceLocalAccountPolicyStore::Validate,
|
| + weak_factory_.GetWeakPtr(), valid_timestamp_required,
|
| + base::Passed(&policy), callback, validate_in_background));
|
| + } else {
|
| + chromeos::DeviceSettingsService::OwnershipStatus ownership_status =
|
| + device_settings_service_->GetOwnershipStatus();
|
| + Validate(valid_timestamp_required, std::move(policy), callback,
|
| + validate_in_background, ownership_status);
|
| + }
|
| }
|
|
|
| void DeviceLocalAccountPolicyStore::Validate(
|
| bool valid_timestamp_required,
|
| std::unique_ptr<em::PolicyFetchResponse> policy_response,
|
| const ValidateCompletionCallback& callback,
|
| + bool validate_in_background,
|
| chromeos::DeviceSettingsService::OwnershipStatus ownership_status) {
|
| DCHECK_NE(chromeos::DeviceSettingsService::OWNERSHIP_UNKNOWN,
|
| ownership_status);
|
| @@ -182,7 +210,17 @@ void DeviceLocalAccountPolicyStore::Validate(
|
|
|
| validator->ValidatePayload();
|
| validator->ValidateSignature(key->as_string());
|
| - validator.release()->StartValidation(base::Bind(callback, key->as_string()));
|
| +
|
| + if (validate_in_background) {
|
| + // The Validator will delete itself once validation is
|
| + // complete.
|
| + validator.release()->StartValidation(
|
| + base::Bind(callback, key->as_string()));
|
| + } else {
|
| + validator->RunValidation();
|
| +
|
| + UpdatePolicy(key->as_string(), validator.get());
|
| + }
|
| }
|
|
|
| } // namespace policy
|
|
|