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

Unified Diff: chrome/browser/chromeos/policy/device_local_account_policy_store.cc

Issue 2714493002: Load DeviceLocalAccount policy and DeviceSettings immediately on restore after Chrome crash. (Closed)
Patch Set: add flag to correctly process LoadImmediately() call Created 3 years, 10 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 side-by-side diff with in-line comments
Download patch
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..afb7372fd01b056758892233fa53107c8be9d490 100644
--- a/chrome/browser/chromeos/policy/device_local_account_policy_store.cc
+++ b/chrome/browser/chromeos/policy/device_local_account_policy_store.cc
@@ -43,6 +43,60 @@ void DeviceLocalAccountPolicyStore::Load() {
weak_factory_.GetWeakPtr()));
}
+void DeviceLocalAccountPolicyStore::LoadImmediately() {
Andrew T Wilson (Slow) 2017/02/23 12:05:48 In general, there will also be an asynchronous loa
Sergey Poromov 2017/02/28 14:01:17 Done.
+ // 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 happens when the browser crashes, or right after signin if
emaxx 2017/02/22 17:24:33 nit: It's a little bit unclear what "that happens"
Sergey Poromov 2017/02/28 14:01:17 Done.
+ // 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
+
+ std::string policy_blob =
emaxx 2017/02/22 17:24:33 nit: const
Sergey Poromov 2017/02/28 14:01:17 Done.
+ session_manager_client_->BlockingRetrieveDeviceLocalAccountPolicy(
+ account_id_);
+ if (policy_blob.empty()) {
+ status_ = CloudPolicyStore::STATUS_LOAD_ERROR;
emaxx 2017/02/22 17:24:33 Isn't it possible to get rid of this code duplicat
Sergey Poromov 2017/02/28 14:01:17 Done.
+ NotifyStoreError();
+ return;
+ }
+ std::unique_ptr<em::PolicyFetchResponse> policy(
+ new em::PolicyFetchResponse());
+ if (!policy->ParseFromString(policy_blob)) {
+ status_ = CloudPolicyStore::STATUS_PARSE_ERROR;
+ NotifyStoreError();
+ return;
+ }
+
+ chromeos::DeviceSettingsService::OwnershipStatus ownership_status =
+ device_settings_service_->GetOwnershipStatus();
+
+ DCHECK_NE(chromeos::DeviceSettingsService::OWNERSHIP_UNKNOWN,
+ ownership_status);
+ const em::PolicyData* device_policy_data =
+ device_settings_service_->policy_data();
+ // Note that the key is obtained through the device settings service instead
+ // of using |policy_signature_public_key_| member, as the latter one is
+ // updated only after the successful installation of the policy.
+ scoped_refptr<ownership::PublicKey> key =
+ device_settings_service_->GetPublicKey();
+ if (!key.get() || !key->is_loaded() || !device_policy_data) {
+ status_ = CloudPolicyStore::STATUS_BAD_STATE;
+ NotifyStoreLoaded();
+ return;
+ }
+
+ std::unique_ptr<UserCloudPolicyValidator> validator =
+ CreateValidatorForLoad(false /*valid_timestamp_required*/,
+ device_policy_data, key, std::move(policy));
+ // Start validation. The Validator will delete itself once validation is
+ // complete.
Andrew T Wilson (Slow) 2017/02/23 12:05:48 Wait, what? But we have a unique_ptr holding |vali
Sergey Poromov 2017/02/28 14:01:17 You are right, that was true only for StartValidat
+ validator->RunValidation();
+
+ UpdatePolicy(key->as_string(), validator.get());
+}
+
void DeviceLocalAccountPolicyStore::Store(
const em::PolicyFetchResponse& policy) {
weak_factory_.InvalidateWeakPtrs();
@@ -156,6 +210,20 @@ void DeviceLocalAccountPolicyStore::Validate(
return;
}
+ std::unique_ptr<UserCloudPolicyValidator> validator =
+ CreateValidatorForLoad(valid_timestamp_required, device_policy_data, key,
+ std::move(policy_response));
+ // Start validation. The Validator will delete itself once validation is
+ // complete.
+ validator.release()->StartValidation(base::Bind(callback, key->as_string()));
+}
+
+std::unique_ptr<UserCloudPolicyValidator>
+DeviceLocalAccountPolicyStore::CreateValidatorForLoad(
+ bool valid_timestamp_required,
+ const em::PolicyData* device_policy_data,
+ scoped_refptr<ownership::PublicKey> key,
+ std::unique_ptr<em::PolicyFetchResponse> policy_response) {
std::unique_ptr<UserCloudPolicyValidator> validator(
UserCloudPolicyValidator::Create(std::move(policy_response),
background_task_runner()));
@@ -182,7 +250,7 @@ void DeviceLocalAccountPolicyStore::Validate(
validator->ValidatePayload();
validator->ValidateSignature(key->as_string());
- validator.release()->StartValidation(base::Bind(callback, key->as_string()));
+ return validator;
}
} // namespace policy

Powered by Google App Engine
This is Rietveld 408576698