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_settings_names.h" | 13 #include "chrome/browser/chromeos/cros_settings_names.h" |
13 #include "chrome/browser/chromeos/login/ownership_service.h" | 14 #include "chrome/browser/chromeos/login/ownership_service.h" |
14 #include "chrome/browser/chromeos/user_cros_settings_provider.h" | 15 #include "chrome/browser/chromeos/user_cros_settings_provider.h" |
15 #include "chrome/browser/policy/configuration_policy_pref_store.h" | 16 #include "chrome/browser/policy/configuration_policy_pref_store.h" |
16 #include "chrome/browser/policy/device_policy_identity_strategy.h" | 17 #include "chrome/browser/policy/device_policy_identity_strategy.h" |
17 #include "chrome/browser/policy/enterprise_install_attributes.h" | 18 #include "chrome/browser/policy/enterprise_install_attributes.h" |
| 19 #include "chrome/browser/policy/enterprise_metrics.h" |
18 #include "chrome/browser/policy/policy_map.h" | 20 #include "chrome/browser/policy/policy_map.h" |
19 #include "chrome/browser/policy/proto/device_management_backend.pb.h" | 21 #include "chrome/browser/policy/proto/device_management_backend.pb.h" |
20 #include "chrome/browser/policy/proto/device_management_constants.h" | 22 #include "chrome/browser/policy/proto/device_management_constants.h" |
21 #include "chrome/browser/policy/proto/device_management_local.pb.h" | 23 #include "chrome/browser/policy/proto/device_management_local.pb.h" |
22 #include "content/browser/browser_thread.h" | 24 #include "content/browser/browser_thread.h" |
23 #include "policy/configuration_policy_type.h" | 25 #include "policy/configuration_policy_type.h" |
24 | 26 |
25 namespace { | 27 namespace { |
26 | 28 |
27 // Stores policy, updates the owner key if required and reports the status | 29 // Stores policy, updates the owner key if required and reports the status |
(...skipping 99 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
127 signed_settings_helper_(signed_settings_helper), | 129 signed_settings_helper_(signed_settings_helper), |
128 starting_up_(true), | 130 starting_up_(true), |
129 ALLOW_THIS_IN_INITIALIZER_LIST(callback_factory_(this)) { | 131 ALLOW_THIS_IN_INITIALIZER_LIST(callback_factory_(this)) { |
130 } | 132 } |
131 | 133 |
132 DevicePolicyCache::~DevicePolicyCache() { | 134 DevicePolicyCache::~DevicePolicyCache() { |
133 signed_settings_helper_->CancelCallback(this); | 135 signed_settings_helper_->CancelCallback(this); |
134 } | 136 } |
135 | 137 |
136 void DevicePolicyCache::Load() { | 138 void DevicePolicyCache::Load() { |
| 139 UMA_HISTOGRAM_ENUMERATION(kMetricPolicy, kMetricPolicyLoadRequested, |
| 140 kMetricPolicySize); |
137 signed_settings_helper_->StartRetrievePolicyOp(this); | 141 signed_settings_helper_->StartRetrievePolicyOp(this); |
138 } | 142 } |
139 | 143 |
140 void DevicePolicyCache::SetPolicy(const em::PolicyFetchResponse& policy) { | 144 void DevicePolicyCache::SetPolicy(const em::PolicyFetchResponse& policy) { |
141 DCHECK(!starting_up_); | 145 DCHECK(!starting_up_); |
142 | 146 |
143 // Make sure we have an enterprise device. | 147 // Make sure we have an enterprise device. |
144 std::string registration_user(install_attributes_->GetRegistrationUser()); | 148 std::string registration_user(install_attributes_->GetRegistrationUser()); |
145 if (registration_user.empty()) { | 149 if (registration_user.empty()) { |
146 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); |
147 InformNotifier(CloudPolicySubsystem::LOCAL_ERROR, | 154 InformNotifier(CloudPolicySubsystem::LOCAL_ERROR, |
148 CloudPolicySubsystem::POLICY_LOCAL_ERROR); | 155 CloudPolicySubsystem::POLICY_LOCAL_ERROR); |
149 return; | 156 return; |
150 } | 157 } |
151 | 158 |
152 // 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. |
153 em::PolicyData policy_data; | 160 em::PolicyData policy_data; |
154 if (!policy_data.ParseFromString(policy.policy_data())) { | 161 if (!policy_data.ParseFromString(policy.policy_data())) { |
155 LOG(WARNING) << "Invalid policy protobuf"; | 162 LOG(WARNING) << "Invalid policy protobuf"; |
| 163 UMA_HISTOGRAM_ENUMERATION(kMetricPolicy, kMetricPolicyFetchInvalidPolicy, |
| 164 kMetricPolicySize); |
156 InformNotifier(CloudPolicySubsystem::LOCAL_ERROR, | 165 InformNotifier(CloudPolicySubsystem::LOCAL_ERROR, |
157 CloudPolicySubsystem::POLICY_LOCAL_ERROR); | 166 CloudPolicySubsystem::POLICY_LOCAL_ERROR); |
158 return; | 167 return; |
159 } | 168 } |
160 | 169 |
161 if (registration_user != policy_data.username()) { | 170 if (registration_user != policy_data.username()) { |
162 LOG(WARNING) << "Refusing policy blob for " << policy_data.username() | 171 LOG(WARNING) << "Refusing policy blob for " << policy_data.username() |
163 << " which doesn't match " << registration_user; | 172 << " which doesn't match " << registration_user; |
| 173 UMA_HISTOGRAM_ENUMERATION(kMetricPolicy, kMetricPolicyFetchUserMismatch, |
| 174 kMetricPolicySize); |
164 InformNotifier(CloudPolicySubsystem::LOCAL_ERROR, | 175 InformNotifier(CloudPolicySubsystem::LOCAL_ERROR, |
165 CloudPolicySubsystem::POLICY_LOCAL_ERROR); | 176 CloudPolicySubsystem::POLICY_LOCAL_ERROR); |
166 return; | 177 return; |
167 } | 178 } |
168 | 179 |
169 set_last_policy_refresh_time(base::Time::NowFromSystemTime()); | 180 set_last_policy_refresh_time(base::Time::NowFromSystemTime()); |
170 | 181 |
171 // Start a store operation. | 182 // Start a store operation. |
| 183 UMA_HISTOGRAM_ENUMERATION(kMetricPolicy, kMetricPolicyStoreRequested, |
| 184 kMetricPolicySize); |
172 new StorePolicyOperation(signed_settings_helper_, | 185 new StorePolicyOperation(signed_settings_helper_, |
173 policy, | 186 policy, |
174 callback_factory_.NewCallback( | 187 callback_factory_.NewCallback( |
175 &DevicePolicyCache::PolicyStoreOpCompleted)); | 188 &DevicePolicyCache::PolicyStoreOpCompleted)); |
176 } | 189 } |
177 | 190 |
178 void DevicePolicyCache::SetUnmanaged() { | 191 void DevicePolicyCache::SetUnmanaged() { |
179 LOG(WARNING) << "Tried to set DevicePolicyCache to 'unmanaged'!"; | 192 LOG(WARNING) << "Tried to set DevicePolicyCache to 'unmanaged'!"; |
180 // This is not supported for DevicePolicyCache. | 193 // This is not supported for DevicePolicyCache. |
181 } | 194 } |
(...skipping 11 matching lines...) Expand all Loading... |
193 if (code == chromeos::SignedSettings::NOT_FOUND || | 206 if (code == chromeos::SignedSettings::NOT_FOUND || |
194 code == chromeos::SignedSettings::KEY_UNAVAILABLE || | 207 code == chromeos::SignedSettings::KEY_UNAVAILABLE || |
195 !policy.has_policy_data()) { | 208 !policy.has_policy_data()) { |
196 InformNotifier(CloudPolicySubsystem::UNENROLLED, | 209 InformNotifier(CloudPolicySubsystem::UNENROLLED, |
197 CloudPolicySubsystem::NO_DETAILS); | 210 CloudPolicySubsystem::NO_DETAILS); |
198 return; | 211 return; |
199 } | 212 } |
200 em::PolicyData policy_data; | 213 em::PolicyData policy_data; |
201 if (!policy_data.ParseFromString(policy.policy_data())) { | 214 if (!policy_data.ParseFromString(policy.policy_data())) { |
202 LOG(WARNING) << "Failed to parse PolicyData protobuf."; | 215 LOG(WARNING) << "Failed to parse PolicyData protobuf."; |
| 216 UMA_HISTOGRAM_ENUMERATION(kMetricPolicy, kMetricPolicyLoadFailed, |
| 217 kMetricPolicySize); |
203 InformNotifier(CloudPolicySubsystem::LOCAL_ERROR, | 218 InformNotifier(CloudPolicySubsystem::LOCAL_ERROR, |
204 CloudPolicySubsystem::POLICY_LOCAL_ERROR); | 219 CloudPolicySubsystem::POLICY_LOCAL_ERROR); |
205 return; | 220 return; |
206 } | 221 } |
207 if (!policy_data.has_request_token() || | 222 if (!policy_data.has_request_token() || |
208 policy_data.request_token().empty()) { | 223 policy_data.request_token().empty()) { |
209 SetUnmanagedInternal(base::Time::NowFromSystemTime()); | 224 SetUnmanagedInternal(base::Time::NowFromSystemTime()); |
210 InformNotifier(CloudPolicySubsystem::UNMANAGED, | 225 InformNotifier(CloudPolicySubsystem::UNMANAGED, |
211 CloudPolicySubsystem::NO_DETAILS); | 226 CloudPolicySubsystem::NO_DETAILS); |
212 // TODO(jkummerow): Reminder: When we want to feed device-wide settings | 227 // TODO(jkummerow): Reminder: When we want to feed device-wide settings |
213 // made by a local owner into this cache, we need to call | 228 // made by a local owner into this cache, we need to call |
214 // SetPolicyInternal() here. | 229 // SetPolicyInternal() here. |
215 return; | 230 return; |
216 } | 231 } |
217 if (!policy_data.has_username() || !policy_data.has_device_id()) { | 232 if (!policy_data.has_username() || !policy_data.has_device_id()) { |
| 233 UMA_HISTOGRAM_ENUMERATION(kMetricPolicy, kMetricPolicyLoadFailed, |
| 234 kMetricPolicySize); |
218 InformNotifier(CloudPolicySubsystem::LOCAL_ERROR, | 235 InformNotifier(CloudPolicySubsystem::LOCAL_ERROR, |
219 CloudPolicySubsystem::POLICY_LOCAL_ERROR); | 236 CloudPolicySubsystem::POLICY_LOCAL_ERROR); |
220 return; | 237 return; |
221 } | 238 } |
222 identity_strategy_->SetDeviceManagementCredentials( | 239 identity_strategy_->SetDeviceManagementCredentials( |
223 policy_data.username(), | 240 policy_data.username(), |
224 policy_data.device_id(), | 241 policy_data.device_id(), |
225 policy_data.request_token()); | 242 policy_data.request_token()); |
226 SetPolicyInternal(policy, NULL, false); | 243 SetPolicyInternal(policy, NULL, false); |
227 } else { // In other words, starting_up_ == false. | 244 } else { // In other words, starting_up_ == false. |
228 if (code != chromeos::SignedSettings::SUCCESS) { | 245 if (code != chromeos::SignedSettings::SUCCESS) { |
229 if (code == chromeos::SignedSettings::BAD_SIGNATURE) { | 246 if (code == chromeos::SignedSettings::BAD_SIGNATURE) { |
| 247 UMA_HISTOGRAM_ENUMERATION(kMetricPolicy, kMetricPolicyFetchBadSignature, |
| 248 kMetricPolicySize); |
230 InformNotifier(CloudPolicySubsystem::LOCAL_ERROR, | 249 InformNotifier(CloudPolicySubsystem::LOCAL_ERROR, |
231 CloudPolicySubsystem::SIGNATURE_MISMATCH); | 250 CloudPolicySubsystem::SIGNATURE_MISMATCH); |
232 } else { | 251 } else { |
| 252 UMA_HISTOGRAM_ENUMERATION(kMetricPolicy, kMetricPolicyFetchOtherFailed, |
| 253 kMetricPolicySize); |
233 InformNotifier(CloudPolicySubsystem::LOCAL_ERROR, | 254 InformNotifier(CloudPolicySubsystem::LOCAL_ERROR, |
234 CloudPolicySubsystem::POLICY_LOCAL_ERROR); | 255 CloudPolicySubsystem::POLICY_LOCAL_ERROR); |
235 } | 256 } |
236 return; | 257 return; |
237 } | 258 } |
238 SetPolicyInternal(policy, NULL, false); | 259 bool ok = SetPolicyInternal(policy, NULL, false); |
| 260 if (ok) { |
| 261 UMA_HISTOGRAM_ENUMERATION(kMetricPolicy, kMetricPolicyFetchOK, |
| 262 kMetricPolicySize); |
| 263 } |
239 } | 264 } |
240 } | 265 } |
241 | 266 |
242 bool DevicePolicyCache::DecodePolicyData(const em::PolicyData& policy_data, | 267 bool DevicePolicyCache::DecodePolicyData(const em::PolicyData& policy_data, |
243 PolicyMap* mandatory, | 268 PolicyMap* mandatory, |
244 PolicyMap* recommended) { | 269 PolicyMap* recommended) { |
245 em::ChromeDeviceSettingsProto policy; | 270 em::ChromeDeviceSettingsProto policy; |
246 if (!policy.ParseFromString(policy_data.policy_value())) { | 271 if (!policy.ParseFromString(policy_data.policy_value())) { |
247 LOG(WARNING) << "Failed to parse ChromeDeviceSettingsProto."; | 272 LOG(WARNING) << "Failed to parse ChromeDeviceSettingsProto."; |
248 return false; | 273 return false; |
249 } | 274 } |
250 DecodeDevicePolicy(policy, mandatory, recommended); | 275 DecodeDevicePolicy(policy, mandatory, recommended); |
251 return true; | 276 return true; |
252 } | 277 } |
253 | 278 |
254 void DevicePolicyCache::PolicyStoreOpCompleted( | 279 void DevicePolicyCache::PolicyStoreOpCompleted( |
255 chromeos::SignedSettings::ReturnCode code) { | 280 chromeos::SignedSettings::ReturnCode code) { |
256 DCHECK(CalledOnValidThread()); | 281 DCHECK(CalledOnValidThread()); |
257 if (code != chromeos::SignedSettings::SUCCESS) { | 282 if (code != chromeos::SignedSettings::SUCCESS) { |
| 283 UMA_HISTOGRAM_ENUMERATION(kMetricPolicy, kMetricPolicyStoreFailed, |
| 284 kMetricPolicySize); |
258 if (code == chromeos::SignedSettings::BAD_SIGNATURE) { | 285 if (code == chromeos::SignedSettings::BAD_SIGNATURE) { |
| 286 UMA_HISTOGRAM_ENUMERATION(kMetricPolicy, kMetricPolicyFetchBadSignature, |
| 287 kMetricPolicySize); |
259 InformNotifier(CloudPolicySubsystem::LOCAL_ERROR, | 288 InformNotifier(CloudPolicySubsystem::LOCAL_ERROR, |
260 CloudPolicySubsystem::SIGNATURE_MISMATCH); | 289 CloudPolicySubsystem::SIGNATURE_MISMATCH); |
261 } else { | 290 } else { |
| 291 UMA_HISTOGRAM_ENUMERATION(kMetricPolicy, kMetricPolicyFetchOtherFailed, |
| 292 kMetricPolicySize); |
262 InformNotifier(CloudPolicySubsystem::LOCAL_ERROR, | 293 InformNotifier(CloudPolicySubsystem::LOCAL_ERROR, |
263 CloudPolicySubsystem::POLICY_LOCAL_ERROR); | 294 CloudPolicySubsystem::POLICY_LOCAL_ERROR); |
264 } | 295 } |
265 return; | 296 return; |
266 } | 297 } |
267 signed_settings_helper_->StartRetrievePolicyOp(this); | 298 signed_settings_helper_->StartRetrievePolicyOp(this); |
268 } | 299 } |
269 | 300 |
270 // static | 301 // static |
271 void DevicePolicyCache::DecodeDevicePolicy( | 302 void DevicePolicyCache::DecodeDevicePolicy( |
(...skipping 26 matching lines...) Expand all Loading... |
298 Value::CreateStringValue(container.proxy_pac_url())); | 329 Value::CreateStringValue(container.proxy_pac_url())); |
299 } | 330 } |
300 if (container.has_proxy_bypass_list()) { | 331 if (container.has_proxy_bypass_list()) { |
301 recommended->Set(kPolicyProxyBypassList, | 332 recommended->Set(kPolicyProxyBypassList, |
302 Value::CreateStringValue(container.proxy_bypass_list())); | 333 Value::CreateStringValue(container.proxy_bypass_list())); |
303 } | 334 } |
304 } | 335 } |
305 } | 336 } |
306 | 337 |
307 } // namespace policy | 338 } // namespace policy |
OLD | NEW |