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

Side by Side Diff: chrome/browser/chromeos/settings/session_manager_operation.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 unified diff | Download patch
OLDNEW
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/session_manager_operation.h" 5 #include "chrome/browser/chromeos/settings/session_manager_operation.h"
6 6
7 #include <utility> 7 #include <utility>
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 52 matching lines...) Expand 10 before | Expand all | Expand 10 after
63 return; 63 return;
64 is_loading_ = true; 64 is_loading_ = true;
65 if (cloud_validations_) { 65 if (cloud_validations_) {
66 EnsurePublicKey(base::Bind(&SessionManagerOperation::RetrieveDeviceSettings, 66 EnsurePublicKey(base::Bind(&SessionManagerOperation::RetrieveDeviceSettings,
67 weak_factory_.GetWeakPtr())); 67 weak_factory_.GetWeakPtr()));
68 } else { 68 } else {
69 RetrieveDeviceSettings(); 69 RetrieveDeviceSettings();
70 } 70 }
71 } 71 }
72 72
73 void SessionManagerOperation::LoadImmediately() {
74 scoped_refptr<PublicKey> public_key(new PublicKey());
75
76 // Keep already-existing public key.
77 if (public_key_.get() && public_key_->is_loaded()) {
emaxx 2017/02/22 17:24:33 I believe you have to honor the force_key_load_ fl
Sergey Poromov 2017/02/28 14:01:17 Done.
78 public_key->data() = public_key_->data();
79 }
80 if (!public_key->is_loaded() && owner_key_util_->IsPublicKeyPresent()) {
81 if (!owner_key_util_->ImportPublicKey(&public_key->data()))
82 LOG(ERROR) << "Failed to load public owner key.";
83 }
84
85 public_key_ = public_key;
86
87 if (!public_key_.get() || !public_key_->is_loaded()) {
88 ReportResult(DeviceSettingsService::STORE_KEY_UNAVAILABLE);
89 return;
90 }
91
92 BlockingRetrieveDeviceSettings();
93 }
94
73 void SessionManagerOperation::ReportResult( 95 void SessionManagerOperation::ReportResult(
74 DeviceSettingsService::Status status) { 96 DeviceSettingsService::Status status) {
75 callback_.Run(this, status); 97 callback_.Run(this, status);
76 } 98 }
77 99
78 void SessionManagerOperation::EnsurePublicKey(const base::Closure& callback) { 100 void SessionManagerOperation::EnsurePublicKey(const base::Closure& callback) {
79 if (force_key_load_ || !public_key_.get() || !public_key_->is_loaded()) { 101 if (force_key_load_ || !public_key_.get() || !public_key_->is_loaded()) {
80 scoped_refptr<base::TaskRunner> task_runner = 102 scoped_refptr<base::TaskRunner> task_runner =
81 content::BrowserThread::GetBlockingPool() 103 content::BrowserThread::GetBlockingPool()
82 ->GetTaskRunnerWithShutdownBehavior( 104 ->GetTaskRunnerWithShutdownBehavior(
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after
125 147
126 callback.Run(); 148 callback.Run();
127 } 149 }
128 150
129 void SessionManagerOperation::RetrieveDeviceSettings() { 151 void SessionManagerOperation::RetrieveDeviceSettings() {
130 session_manager_client()->RetrieveDevicePolicy( 152 session_manager_client()->RetrieveDevicePolicy(
131 base::Bind(&SessionManagerOperation::ValidateDeviceSettings, 153 base::Bind(&SessionManagerOperation::ValidateDeviceSettings,
132 weak_factory_.GetWeakPtr())); 154 weak_factory_.GetWeakPtr()));
133 } 155 }
134 156
157 void SessionManagerOperation::BlockingRetrieveDeviceSettings() {
158 ValidateDeviceSettings(
159 session_manager_client()->BlockingRetrieveDevicePolicy());
160 }
161
135 void SessionManagerOperation::ValidateDeviceSettings( 162 void SessionManagerOperation::ValidateDeviceSettings(
136 const std::string& policy_blob) { 163 const std::string& policy_blob) {
137 std::unique_ptr<em::PolicyFetchResponse> policy( 164 std::unique_ptr<em::PolicyFetchResponse> policy(
138 new em::PolicyFetchResponse()); 165 new em::PolicyFetchResponse());
139 if (policy_blob.empty()) { 166 if (policy_blob.empty()) {
140 ReportResult(DeviceSettingsService::STORE_NO_POLICY); 167 ReportResult(DeviceSettingsService::STORE_NO_POLICY);
141 return; 168 return;
142 } 169 }
143 170
144 if (!policy->ParseFromString(policy_blob) || 171 if (!policy->ParseFromString(policy_blob) ||
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after
184 policy::CloudPolicyValidatorBase::DM_TOKEN_NOT_REQUIRED, 211 policy::CloudPolicyValidatorBase::DM_TOKEN_NOT_REQUIRED,
185 policy::CloudPolicyValidatorBase::DEVICE_ID_NOT_REQUIRED); 212 policy::CloudPolicyValidatorBase::DEVICE_ID_NOT_REQUIRED);
186 213
187 // We don't check the DMServer verification key below, because the signing 214 // We don't check the DMServer verification key below, because the signing
188 // key is validated when it is installed. 215 // key is validated when it is installed.
189 validator->ValidateSignature(public_key_->as_string()); 216 validator->ValidateSignature(public_key_->as_string());
190 } 217 }
191 218
192 validator->ValidatePolicyType(policy::dm_protocol::kChromeDevicePolicyType); 219 validator->ValidatePolicyType(policy::dm_protocol::kChromeDevicePolicyType);
193 validator->ValidatePayload(); 220 validator->ValidatePayload();
194 validator->StartValidation( 221 if (force_immediate_load_) {
195 base::Bind(&SessionManagerOperation::ReportValidatorStatus, 222 validator->RunValidation();
196 weak_factory_.GetWeakPtr())); 223 ReportValidatorStatus(validator);
224 } else {
225 validator->StartValidation(
226 base::Bind(&SessionManagerOperation::ReportValidatorStatus,
227 weak_factory_.GetWeakPtr()));
228 }
197 } 229 }
198 230
199 void SessionManagerOperation::ReportValidatorStatus( 231 void SessionManagerOperation::ReportValidatorStatus(
200 policy::DeviceCloudPolicyValidator* validator) { 232 policy::DeviceCloudPolicyValidator* validator) {
201 DeviceSettingsService::Status status = 233 DeviceSettingsService::Status status =
202 DeviceSettingsService::STORE_VALIDATION_ERROR; 234 DeviceSettingsService::STORE_VALIDATION_ERROR;
203 if (validator->success()) { 235 if (validator->success()) {
204 status = DeviceSettingsService::STORE_SUCCESS; 236 status = DeviceSettingsService::STORE_SUCCESS;
205 policy_data_ = std::move(validator->policy_data()); 237 policy_data_ = std::move(validator->policy_data());
206 device_settings_ = std::move(validator->payload()); 238 device_settings_ = std::move(validator->payload());
207 } else { 239 } else {
208 LOG(ERROR) << "Policy validation failed: " << validator->status(); 240 LOG(ERROR) << "Policy validation failed: " << validator->status();
209 241
210 // Those are mostly caused by RTC loss and are recoverable. 242 // Those are mostly caused by RTC loss and are recoverable.
211 if (validator->status() == 243 if (validator->status() ==
212 policy::DeviceCloudPolicyValidator::VALIDATION_BAD_TIMESTAMP) { 244 policy::DeviceCloudPolicyValidator::VALIDATION_BAD_TIMESTAMP) {
213 status = DeviceSettingsService::STORE_TEMP_VALIDATION_ERROR; 245 status = DeviceSettingsService::STORE_TEMP_VALIDATION_ERROR;
214 } 246 }
215 } 247 }
216 248
217 ReportResult(status); 249 ReportResult(status);
218 } 250 }
219 251
220 LoadSettingsOperation::LoadSettingsOperation(bool force_key_load, 252 LoadSettingsOperation::LoadSettingsOperation(bool force_key_load,
221 bool cloud_validations, 253 bool cloud_validations,
254 bool force_immediate_load,
222 const Callback& callback) 255 const Callback& callback)
223 : SessionManagerOperation(callback) { 256 : SessionManagerOperation(callback) {
224 force_key_load_ = force_key_load; 257 force_key_load_ = force_key_load;
225 cloud_validations_ = cloud_validations; 258 cloud_validations_ = cloud_validations;
259 force_immediate_load_ = force_immediate_load;
226 } 260 }
227 261
228 LoadSettingsOperation::~LoadSettingsOperation() {} 262 LoadSettingsOperation::~LoadSettingsOperation() {}
229 263
230 void LoadSettingsOperation::Run() { 264 void LoadSettingsOperation::Run() {
231 StartLoading(); 265 if (force_immediate_load_)
266 LoadImmediately();
267 else
268 StartLoading();
232 } 269 }
233 270
234 StoreSettingsOperation::StoreSettingsOperation( 271 StoreSettingsOperation::StoreSettingsOperation(
235 const Callback& callback, 272 const Callback& callback,
236 std::unique_ptr<em::PolicyFetchResponse> policy) 273 std::unique_ptr<em::PolicyFetchResponse> policy)
237 : SessionManagerOperation(callback), 274 : SessionManagerOperation(callback),
238 policy_(std::move(policy)), 275 policy_(std::move(policy)),
239 weak_factory_(this) {} 276 weak_factory_(this) {}
240 277
241 StoreSettingsOperation::~StoreSettingsOperation() {} 278 StoreSettingsOperation::~StoreSettingsOperation() {}
242 279
243 void StoreSettingsOperation::Run() { 280 void StoreSettingsOperation::Run() {
244 session_manager_client()->StoreDevicePolicy( 281 session_manager_client()->StoreDevicePolicy(
245 policy_->SerializeAsString(), 282 policy_->SerializeAsString(),
246 base::Bind(&StoreSettingsOperation::HandleStoreResult, 283 base::Bind(&StoreSettingsOperation::HandleStoreResult,
247 weak_factory_.GetWeakPtr())); 284 weak_factory_.GetWeakPtr()));
248 } 285 }
249 286
250 void StoreSettingsOperation::HandleStoreResult(bool success) { 287 void StoreSettingsOperation::HandleStoreResult(bool success) {
251 if (!success) 288 if (!success)
252 ReportResult(DeviceSettingsService::STORE_OPERATION_FAILED); 289 ReportResult(DeviceSettingsService::STORE_OPERATION_FAILED);
253 else 290 else
254 StartLoading(); 291 StartLoading();
255 } 292 }
256 293
257 } // namespace chromeos 294 } // namespace chromeos
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698