| 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 |