OLD | NEW |
1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2011 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/policy/device_policy_cache.h" | 5 #include "chrome/browser/policy/device_policy_cache.h" |
6 | 6 |
7 #include "base/basictypes.h" | 7 #include "base/basictypes.h" |
8 #include "base/compiler_specific.h" | 8 #include "base/compiler_specific.h" |
9 #include "base/logging.h" | 9 #include "base/logging.h" |
| 10 #include "base/metrics/histogram.h" |
10 #include "base/task.h" | 11 #include "base/task.h" |
11 #include "base/values.h" | 12 #include "base/values.h" |
12 #include "chrome/browser/chromeos/cros/cros_library.h" | 13 #include "chrome/browser/chromeos/cros/cros_library.h" |
13 #include "chrome/browser/chromeos/cros/update_library.h" | 14 #include "chrome/browser/chromeos/cros/update_library.h" |
14 #include "chrome/browser/chromeos/cros_settings_names.h" | 15 #include "chrome/browser/chromeos/cros_settings_names.h" |
15 #include "chrome/browser/chromeos/login/ownership_service.h" | 16 #include "chrome/browser/chromeos/login/ownership_service.h" |
16 #include "chrome/browser/chromeos/user_cros_settings_provider.h" | 17 #include "chrome/browser/chromeos/user_cros_settings_provider.h" |
17 #include "chrome/browser/policy/configuration_policy_pref_store.h" | 18 #include "chrome/browser/policy/configuration_policy_pref_store.h" |
18 #include "chrome/browser/policy/device_policy_identity_strategy.h" | 19 #include "chrome/browser/policy/device_policy_identity_strategy.h" |
19 #include "chrome/browser/policy/enterprise_install_attributes.h" | 20 #include "chrome/browser/policy/enterprise_install_attributes.h" |
| 21 #include "chrome/browser/policy/enterprise_metrics.h" |
20 #include "chrome/browser/policy/policy_map.h" | 22 #include "chrome/browser/policy/policy_map.h" |
21 #include "chrome/browser/policy/proto/device_management_backend.pb.h" | 23 #include "chrome/browser/policy/proto/device_management_backend.pb.h" |
22 #include "chrome/browser/policy/proto/device_management_constants.h" | 24 #include "chrome/browser/policy/proto/device_management_constants.h" |
23 #include "chrome/browser/policy/proto/device_management_local.pb.h" | 25 #include "chrome/browser/policy/proto/device_management_local.pb.h" |
24 #include "content/browser/browser_thread.h" | 26 #include "content/browser/browser_thread.h" |
25 #include "policy/configuration_policy_type.h" | 27 #include "policy/configuration_policy_type.h" |
26 | 28 |
27 namespace { | 29 namespace { |
28 | 30 |
29 // Stores policy, updates the owner key if required and reports the status | 31 // Stores policy, updates the owner key if required and reports the status |
(...skipping 109 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
139 signed_settings_helper_->StartRetrievePolicyOp(this); | 141 signed_settings_helper_->StartRetrievePolicyOp(this); |
140 } | 142 } |
141 | 143 |
142 void DevicePolicyCache::SetPolicy(const em::PolicyFetchResponse& policy) { | 144 void DevicePolicyCache::SetPolicy(const em::PolicyFetchResponse& policy) { |
143 DCHECK(!starting_up_); | 145 DCHECK(!starting_up_); |
144 | 146 |
145 // Make sure we have an enterprise device. | 147 // Make sure we have an enterprise device. |
146 std::string registration_user(install_attributes_->GetRegistrationUser()); | 148 std::string registration_user(install_attributes_->GetRegistrationUser()); |
147 if (registration_user.empty()) { | 149 if (registration_user.empty()) { |
148 LOG(WARNING) << "Refusing to accept policy on non-enterprise device."; | 150 LOG(WARNING) << "Refusing to accept policy on non-enterprise device."; |
| 151 UMA_HISTOGRAM_ENUMERATION(kMetricPolicy, |
| 152 kMetricPolicyFetchNonEnterpriseDevice, |
| 153 kMetricPolicySize); |
149 InformNotifier(CloudPolicySubsystem::LOCAL_ERROR, | 154 InformNotifier(CloudPolicySubsystem::LOCAL_ERROR, |
150 CloudPolicySubsystem::POLICY_LOCAL_ERROR); | 155 CloudPolicySubsystem::POLICY_LOCAL_ERROR); |
151 return; | 156 return; |
152 } | 157 } |
153 | 158 |
154 // Check the user this policy is for against the device-locked name. | 159 // Check the user this policy is for against the device-locked name. |
155 em::PolicyData policy_data; | 160 em::PolicyData policy_data; |
156 if (!policy_data.ParseFromString(policy.policy_data())) { | 161 if (!policy_data.ParseFromString(policy.policy_data())) { |
157 LOG(WARNING) << "Invalid policy protobuf"; | 162 LOG(WARNING) << "Invalid policy protobuf"; |
| 163 UMA_HISTOGRAM_ENUMERATION(kMetricPolicy, kMetricPolicyFetchInvalidPolicy, |
| 164 kMetricPolicySize); |
158 InformNotifier(CloudPolicySubsystem::LOCAL_ERROR, | 165 InformNotifier(CloudPolicySubsystem::LOCAL_ERROR, |
159 CloudPolicySubsystem::POLICY_LOCAL_ERROR); | 166 CloudPolicySubsystem::POLICY_LOCAL_ERROR); |
160 return; | 167 return; |
161 } | 168 } |
162 | 169 |
163 if (registration_user != policy_data.username()) { | 170 if (registration_user != policy_data.username()) { |
164 LOG(WARNING) << "Refusing policy blob for " << policy_data.username() | 171 LOG(WARNING) << "Refusing policy blob for " << policy_data.username() |
165 << " which doesn't match " << registration_user; | 172 << " which doesn't match " << registration_user; |
| 173 UMA_HISTOGRAM_ENUMERATION(kMetricPolicy, kMetricPolicyFetchUserMismatch, |
| 174 kMetricPolicySize); |
166 InformNotifier(CloudPolicySubsystem::LOCAL_ERROR, | 175 InformNotifier(CloudPolicySubsystem::LOCAL_ERROR, |
167 CloudPolicySubsystem::POLICY_LOCAL_ERROR); | 176 CloudPolicySubsystem::POLICY_LOCAL_ERROR); |
168 return; | 177 return; |
169 } | 178 } |
170 | 179 |
171 set_last_policy_refresh_time(base::Time::NowFromSystemTime()); | 180 set_last_policy_refresh_time(base::Time::NowFromSystemTime()); |
172 | 181 |
173 // Start a store operation. | 182 // Start a store operation. |
174 new StorePolicyOperation(signed_settings_helper_, | 183 new StorePolicyOperation(signed_settings_helper_, |
175 policy, | 184 policy, |
(...skipping 19 matching lines...) Expand all Loading... |
195 if (code == chromeos::SignedSettings::NOT_FOUND || | 204 if (code == chromeos::SignedSettings::NOT_FOUND || |
196 code == chromeos::SignedSettings::KEY_UNAVAILABLE || | 205 code == chromeos::SignedSettings::KEY_UNAVAILABLE || |
197 !policy.has_policy_data()) { | 206 !policy.has_policy_data()) { |
198 InformNotifier(CloudPolicySubsystem::UNENROLLED, | 207 InformNotifier(CloudPolicySubsystem::UNENROLLED, |
199 CloudPolicySubsystem::NO_DETAILS); | 208 CloudPolicySubsystem::NO_DETAILS); |
200 return; | 209 return; |
201 } | 210 } |
202 em::PolicyData policy_data; | 211 em::PolicyData policy_data; |
203 if (!policy_data.ParseFromString(policy.policy_data())) { | 212 if (!policy_data.ParseFromString(policy.policy_data())) { |
204 LOG(WARNING) << "Failed to parse PolicyData protobuf."; | 213 LOG(WARNING) << "Failed to parse PolicyData protobuf."; |
| 214 UMA_HISTOGRAM_ENUMERATION(kMetricPolicy, kMetricPolicyLoadFailed, |
| 215 kMetricPolicySize); |
205 InformNotifier(CloudPolicySubsystem::LOCAL_ERROR, | 216 InformNotifier(CloudPolicySubsystem::LOCAL_ERROR, |
206 CloudPolicySubsystem::POLICY_LOCAL_ERROR); | 217 CloudPolicySubsystem::POLICY_LOCAL_ERROR); |
207 return; | 218 return; |
208 } | 219 } |
209 if (!policy_data.has_request_token() || | 220 if (!policy_data.has_request_token() || |
210 policy_data.request_token().empty()) { | 221 policy_data.request_token().empty()) { |
211 SetUnmanagedInternal(base::Time::NowFromSystemTime()); | 222 SetUnmanagedInternal(base::Time::NowFromSystemTime()); |
212 InformNotifier(CloudPolicySubsystem::UNMANAGED, | 223 InformNotifier(CloudPolicySubsystem::UNMANAGED, |
213 CloudPolicySubsystem::NO_DETAILS); | 224 CloudPolicySubsystem::NO_DETAILS); |
214 // TODO(jkummerow): Reminder: When we want to feed device-wide settings | 225 // TODO(jkummerow): Reminder: When we want to feed device-wide settings |
215 // made by a local owner into this cache, we need to call | 226 // made by a local owner into this cache, we need to call |
216 // SetPolicyInternal() here. | 227 // SetPolicyInternal() here. |
217 return; | 228 return; |
218 } | 229 } |
219 if (!policy_data.has_username() || !policy_data.has_device_id()) { | 230 if (!policy_data.has_username() || !policy_data.has_device_id()) { |
| 231 UMA_HISTOGRAM_ENUMERATION(kMetricPolicy, kMetricPolicyLoadFailed, |
| 232 kMetricPolicySize); |
220 InformNotifier(CloudPolicySubsystem::LOCAL_ERROR, | 233 InformNotifier(CloudPolicySubsystem::LOCAL_ERROR, |
221 CloudPolicySubsystem::POLICY_LOCAL_ERROR); | 234 CloudPolicySubsystem::POLICY_LOCAL_ERROR); |
222 return; | 235 return; |
223 } | 236 } |
| 237 UMA_HISTOGRAM_ENUMERATION(kMetricPolicy, kMetricPolicyLoadSucceeded, |
| 238 kMetricPolicySize); |
224 identity_strategy_->SetDeviceManagementCredentials( | 239 identity_strategy_->SetDeviceManagementCredentials( |
225 policy_data.username(), | 240 policy_data.username(), |
226 policy_data.device_id(), | 241 policy_data.device_id(), |
227 policy_data.request_token()); | 242 policy_data.request_token()); |
228 SetPolicyInternal(policy, NULL, false); | 243 SetPolicyInternal(policy, NULL, false); |
229 } else { // In other words, starting_up_ == false. | 244 } else { // In other words, starting_up_ == false. |
230 if (code != chromeos::SignedSettings::SUCCESS) { | 245 if (code != chromeos::SignedSettings::SUCCESS) { |
231 if (code == chromeos::SignedSettings::BAD_SIGNATURE) { | 246 if (code == chromeos::SignedSettings::BAD_SIGNATURE) { |
| 247 UMA_HISTOGRAM_ENUMERATION(kMetricPolicy, kMetricPolicyFetchBadSignature, |
| 248 kMetricPolicySize); |
232 InformNotifier(CloudPolicySubsystem::LOCAL_ERROR, | 249 InformNotifier(CloudPolicySubsystem::LOCAL_ERROR, |
233 CloudPolicySubsystem::SIGNATURE_MISMATCH); | 250 CloudPolicySubsystem::SIGNATURE_MISMATCH); |
234 } else { | 251 } else { |
| 252 UMA_HISTOGRAM_ENUMERATION(kMetricPolicy, kMetricPolicyFetchOtherFailed, |
| 253 kMetricPolicySize); |
235 InformNotifier(CloudPolicySubsystem::LOCAL_ERROR, | 254 InformNotifier(CloudPolicySubsystem::LOCAL_ERROR, |
236 CloudPolicySubsystem::POLICY_LOCAL_ERROR); | 255 CloudPolicySubsystem::POLICY_LOCAL_ERROR); |
237 } | 256 } |
238 return; | 257 return; |
239 } | 258 } |
240 SetPolicyInternal(policy, NULL, false); | 259 bool ok = SetPolicyInternal(policy, NULL, false); |
| 260 if (ok) { |
| 261 UMA_HISTOGRAM_ENUMERATION(kMetricPolicy, kMetricPolicyFetchOK, |
| 262 kMetricPolicySize); |
| 263 } |
241 } | 264 } |
242 } | 265 } |
243 | 266 |
244 bool DevicePolicyCache::DecodePolicyData(const em::PolicyData& policy_data, | 267 bool DevicePolicyCache::DecodePolicyData(const em::PolicyData& policy_data, |
245 PolicyMap* mandatory, | 268 PolicyMap* mandatory, |
246 PolicyMap* recommended) { | 269 PolicyMap* recommended) { |
247 em::ChromeDeviceSettingsProto policy; | 270 em::ChromeDeviceSettingsProto policy; |
248 if (!policy.ParseFromString(policy_data.policy_value())) { | 271 if (!policy.ParseFromString(policy_data.policy_value())) { |
249 LOG(WARNING) << "Failed to parse ChromeDeviceSettingsProto."; | 272 LOG(WARNING) << "Failed to parse ChromeDeviceSettingsProto."; |
250 return false; | 273 return false; |
251 } | 274 } |
252 DecodeDevicePolicy(policy, mandatory, recommended); | 275 DecodeDevicePolicy(policy, mandatory, recommended); |
253 return true; | 276 return true; |
254 } | 277 } |
255 | 278 |
256 void DevicePolicyCache::PolicyStoreOpCompleted( | 279 void DevicePolicyCache::PolicyStoreOpCompleted( |
257 chromeos::SignedSettings::ReturnCode code) { | 280 chromeos::SignedSettings::ReturnCode code) { |
258 DCHECK(CalledOnValidThread()); | 281 DCHECK(CalledOnValidThread()); |
259 if (code != chromeos::SignedSettings::SUCCESS) { | 282 if (code != chromeos::SignedSettings::SUCCESS) { |
| 283 UMA_HISTOGRAM_ENUMERATION(kMetricPolicy, kMetricPolicyStoreFailed, |
| 284 kMetricPolicySize); |
260 if (code == chromeos::SignedSettings::BAD_SIGNATURE) { | 285 if (code == chromeos::SignedSettings::BAD_SIGNATURE) { |
| 286 UMA_HISTOGRAM_ENUMERATION(kMetricPolicy, kMetricPolicyFetchBadSignature, |
| 287 kMetricPolicySize); |
261 InformNotifier(CloudPolicySubsystem::LOCAL_ERROR, | 288 InformNotifier(CloudPolicySubsystem::LOCAL_ERROR, |
262 CloudPolicySubsystem::SIGNATURE_MISMATCH); | 289 CloudPolicySubsystem::SIGNATURE_MISMATCH); |
263 } else { | 290 } else { |
| 291 UMA_HISTOGRAM_ENUMERATION(kMetricPolicy, kMetricPolicyFetchOtherFailed, |
| 292 kMetricPolicySize); |
264 InformNotifier(CloudPolicySubsystem::LOCAL_ERROR, | 293 InformNotifier(CloudPolicySubsystem::LOCAL_ERROR, |
265 CloudPolicySubsystem::POLICY_LOCAL_ERROR); | 294 CloudPolicySubsystem::POLICY_LOCAL_ERROR); |
266 } | 295 } |
267 return; | 296 return; |
268 } | 297 } |
| 298 UMA_HISTOGRAM_ENUMERATION(kMetricPolicy, kMetricPolicyStoreSucceeded, |
| 299 kMetricPolicySize); |
269 signed_settings_helper_->StartRetrievePolicyOp(this); | 300 signed_settings_helper_->StartRetrievePolicyOp(this); |
270 } | 301 } |
271 | 302 |
272 // static | 303 // static |
273 void DevicePolicyCache::DecodeDevicePolicy( | 304 void DevicePolicyCache::DecodeDevicePolicy( |
274 const em::ChromeDeviceSettingsProto& policy, | 305 const em::ChromeDeviceSettingsProto& policy, |
275 PolicyMap* mandatory, | 306 PolicyMap* mandatory, |
276 PolicyMap* recommended) { | 307 PolicyMap* recommended) { |
277 if (policy.has_device_policy_refresh_rate()) { | 308 if (policy.has_device_policy_refresh_rate()) { |
278 const em::DevicePolicyRefreshRateProto container = | 309 const em::DevicePolicyRefreshRateProto container = |
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
310 std::string channel = policy.release_channel().release_channel(); | 341 std::string channel = policy.release_channel().release_channel(); |
311 mandatory->Set( | 342 mandatory->Set( |
312 kPolicyChromeOsReleaseChannel, Value::CreateStringValue(channel)); | 343 kPolicyChromeOsReleaseChannel, Value::CreateStringValue(channel)); |
313 // TODO: We should probably set the release track somewhere else, but this | 344 // TODO: We should probably set the release track somewhere else, but this |
314 // policy is a work-in-progress (http://crosbug.com/15382). | 345 // policy is a work-in-progress (http://crosbug.com/15382). |
315 chromeos::CrosLibrary::Get()->GetUpdateLibrary()->SetReleaseTrack(channel); | 346 chromeos::CrosLibrary::Get()->GetUpdateLibrary()->SetReleaseTrack(channel); |
316 } | 347 } |
317 } | 348 } |
318 | 349 |
319 } // namespace policy | 350 } // namespace policy |
OLD | NEW |