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/policy/device_local_account_policy_store.h" | 5 #include "chrome/browser/chromeos/policy/device_local_account_policy_store.h" |
6 | 6 |
7 #include "base/bind.h" | 7 #include "base/bind.h" |
8 #include "base/callback.h" | 8 #include "base/callback.h" |
9 #include "base/values.h" | 9 #include "base/values.h" |
10 #include "chrome/browser/policy/cloud/device_management_service.h" | 10 #include "chrome/browser/policy/cloud/device_management_service.h" |
(...skipping 27 matching lines...) Expand all Loading... |
38 session_manager_client_->RetrieveDeviceLocalAccountPolicy( | 38 session_manager_client_->RetrieveDeviceLocalAccountPolicy( |
39 account_id_, | 39 account_id_, |
40 base::Bind(&DeviceLocalAccountPolicyStore::ValidateLoadedPolicyBlob, | 40 base::Bind(&DeviceLocalAccountPolicyStore::ValidateLoadedPolicyBlob, |
41 weak_factory_.GetWeakPtr())); | 41 weak_factory_.GetWeakPtr())); |
42 } | 42 } |
43 | 43 |
44 void DeviceLocalAccountPolicyStore::Store( | 44 void DeviceLocalAccountPolicyStore::Store( |
45 const em::PolicyFetchResponse& policy) { | 45 const em::PolicyFetchResponse& policy) { |
46 weak_factory_.InvalidateWeakPtrs(); | 46 weak_factory_.InvalidateWeakPtrs(); |
47 CheckKeyAndValidate( | 47 CheckKeyAndValidate( |
| 48 true, |
48 make_scoped_ptr(new em::PolicyFetchResponse(policy)), | 49 make_scoped_ptr(new em::PolicyFetchResponse(policy)), |
49 base::Bind(&DeviceLocalAccountPolicyStore::StoreValidatedPolicy, | 50 base::Bind(&DeviceLocalAccountPolicyStore::StoreValidatedPolicy, |
50 weak_factory_.GetWeakPtr())); | 51 weak_factory_.GetWeakPtr())); |
51 } | 52 } |
52 | 53 |
53 void DeviceLocalAccountPolicyStore::ValidateLoadedPolicyBlob( | 54 void DeviceLocalAccountPolicyStore::ValidateLoadedPolicyBlob( |
54 const std::string& policy_blob) { | 55 const std::string& policy_blob) { |
55 if (policy_blob.empty()) { | 56 if (policy_blob.empty()) { |
56 status_ = CloudPolicyStore::STATUS_LOAD_ERROR; | 57 status_ = CloudPolicyStore::STATUS_LOAD_ERROR; |
57 NotifyStoreError(); | 58 NotifyStoreError(); |
58 } else { | 59 } else { |
59 scoped_ptr<em::PolicyFetchResponse> policy(new em::PolicyFetchResponse()); | 60 scoped_ptr<em::PolicyFetchResponse> policy(new em::PolicyFetchResponse()); |
60 if (policy->ParseFromString(policy_blob)) { | 61 if (policy->ParseFromString(policy_blob)) { |
61 CheckKeyAndValidate( | 62 CheckKeyAndValidate( |
| 63 false, |
62 policy.Pass(), | 64 policy.Pass(), |
63 base::Bind(&DeviceLocalAccountPolicyStore::UpdatePolicy, | 65 base::Bind(&DeviceLocalAccountPolicyStore::UpdatePolicy, |
64 weak_factory_.GetWeakPtr())); | 66 weak_factory_.GetWeakPtr())); |
65 } else { | 67 } else { |
66 status_ = CloudPolicyStore::STATUS_PARSE_ERROR; | 68 status_ = CloudPolicyStore::STATUS_PARSE_ERROR; |
67 NotifyStoreError(); | 69 NotifyStoreError(); |
68 } | 70 } |
69 } | 71 } |
70 } | 72 } |
71 | 73 |
(...skipping 68 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
140 void DeviceLocalAccountPolicyStore::HandleStoreResult(bool success) { | 142 void DeviceLocalAccountPolicyStore::HandleStoreResult(bool success) { |
141 if (!success) { | 143 if (!success) { |
142 status_ = CloudPolicyStore::STATUS_STORE_ERROR; | 144 status_ = CloudPolicyStore::STATUS_STORE_ERROR; |
143 NotifyStoreError(); | 145 NotifyStoreError(); |
144 } else { | 146 } else { |
145 Load(); | 147 Load(); |
146 } | 148 } |
147 } | 149 } |
148 | 150 |
149 void DeviceLocalAccountPolicyStore::CheckKeyAndValidate( | 151 void DeviceLocalAccountPolicyStore::CheckKeyAndValidate( |
| 152 bool valid_timestamp_required, |
150 scoped_ptr<em::PolicyFetchResponse> policy, | 153 scoped_ptr<em::PolicyFetchResponse> policy, |
151 const UserCloudPolicyValidator::CompletionCallback& callback) { | 154 const UserCloudPolicyValidator::CompletionCallback& callback) { |
152 device_settings_service_->GetOwnershipStatusAsync( | 155 device_settings_service_->GetOwnershipStatusAsync( |
153 base::Bind(&DeviceLocalAccountPolicyStore::Validate, | 156 base::Bind(&DeviceLocalAccountPolicyStore::Validate, |
154 weak_factory_.GetWeakPtr(), | 157 weak_factory_.GetWeakPtr(), |
| 158 valid_timestamp_required, |
155 base::Passed(&policy), | 159 base::Passed(&policy), |
156 callback)); | 160 callback)); |
157 } | 161 } |
158 | 162 |
159 void DeviceLocalAccountPolicyStore::Validate( | 163 void DeviceLocalAccountPolicyStore::Validate( |
| 164 bool valid_timestamp_required, |
160 scoped_ptr<em::PolicyFetchResponse> policy_response, | 165 scoped_ptr<em::PolicyFetchResponse> policy_response, |
161 const UserCloudPolicyValidator::CompletionCallback& callback, | 166 const UserCloudPolicyValidator::CompletionCallback& callback, |
162 chromeos::DeviceSettingsService::OwnershipStatus ownership_status) { | 167 chromeos::DeviceSettingsService::OwnershipStatus ownership_status) { |
163 DCHECK_NE(chromeos::DeviceSettingsService::OWNERSHIP_UNKNOWN, | 168 DCHECK_NE(chromeos::DeviceSettingsService::OWNERSHIP_UNKNOWN, |
164 ownership_status); | 169 ownership_status); |
165 scoped_refptr<chromeos::OwnerKey> key = | 170 scoped_refptr<chromeos::OwnerKey> key = |
166 device_settings_service_->GetOwnerKey(); | 171 device_settings_service_->GetOwnerKey(); |
167 if (!key.get() || !key->public_key()) { | 172 if (!key.get() || !key->public_key()) { |
168 status_ = CloudPolicyStore::STATUS_BAD_STATE; | 173 status_ = CloudPolicyStore::STATUS_BAD_STATE; |
169 NotifyStoreLoaded(); | 174 NotifyStoreLoaded(); |
170 return; | 175 return; |
171 } | 176 } |
172 | 177 |
173 scoped_ptr<UserCloudPolicyValidator> validator( | 178 scoped_ptr<UserCloudPolicyValidator> validator( |
174 UserCloudPolicyValidator::Create(policy_response.Pass(), | 179 UserCloudPolicyValidator::Create(policy_response.Pass(), |
175 background_task_runner())); | 180 background_task_runner())); |
176 validator->ValidateUsername(account_id_); | 181 validator->ValidateUsername(account_id_); |
177 validator->ValidatePolicyType(dm_protocol::kChromePublicAccountPolicyType); | 182 validator->ValidatePolicyType(dm_protocol::kChromePublicAccountPolicyType); |
| 183 // The timestamp is verified when storing a new policy downloaded from the |
| 184 // server but not when loading a cached policy from disk. |
| 185 // See SessionManagerOperation::ValidateDeviceSettings for the rationale. |
178 validator->ValidateAgainstCurrentPolicy( | 186 validator->ValidateAgainstCurrentPolicy( |
179 policy(), | 187 policy(), |
180 CloudPolicyValidatorBase::TIMESTAMP_REQUIRED, | 188 valid_timestamp_required |
| 189 ? CloudPolicyValidatorBase::TIMESTAMP_REQUIRED |
| 190 : CloudPolicyValidatorBase::TIMESTAMP_NOT_REQUIRED, |
181 CloudPolicyValidatorBase::DM_TOKEN_REQUIRED); | 191 CloudPolicyValidatorBase::DM_TOKEN_REQUIRED); |
182 validator->ValidatePayload(); | 192 validator->ValidatePayload(); |
183 validator->ValidateSignature(*key->public_key(), false); | 193 validator->ValidateSignature(*key->public_key(), false); |
184 validator.release()->StartValidation(callback); | 194 validator.release()->StartValidation(callback); |
185 } | 195 } |
186 | 196 |
187 } // namespace policy | 197 } // namespace policy |
OLD | NEW |