| Index: chrome/browser/chromeos/policy/device_cloud_policy_store_chromeos.cc
|
| diff --git a/chrome/browser/chromeos/policy/device_cloud_policy_store_chromeos.cc b/chrome/browser/chromeos/policy/device_cloud_policy_store_chromeos.cc
|
| index 248c8c5a418e5a3f28b738c3b628cc838bced5e4..6d4b684f5bef61d090f32c6258d099267cfad010 100644
|
| --- a/chrome/browser/chromeos/policy/device_cloud_policy_store_chromeos.cc
|
| +++ b/chrome/browser/chromeos/policy/device_cloud_policy_store_chromeos.cc
|
| @@ -13,6 +13,7 @@
|
| #include "chrome/browser/chromeos/policy/enterprise_install_attributes.h"
|
| #include "chrome/browser/chromeos/policy/proto/chrome_device_policy.pb.h"
|
| #include "components/ownership/owner_key_util.h"
|
| +#include "components/policy/core/common/cloud/cloud_policy_constants.h"
|
| #include "policy/proto/device_management_backend.pb.h"
|
|
|
| namespace em = enterprise_management;
|
| @@ -136,61 +137,79 @@ void DeviceCloudPolicyStoreChromeOS::OnPolicyStored() {
|
| }
|
|
|
| void DeviceCloudPolicyStoreChromeOS::UpdateFromService() {
|
| - if (!install_attributes_->IsEnterpriseDevice()) {
|
| + const em::PolicyData* policy_data = device_settings_service_->policy_data();
|
| + const chromeos::DeviceSettingsService::Status status =
|
| + device_settings_service_->status();
|
| +
|
| + const bool is_enterprise_managed = install_attributes_->IsEnterpriseDevice();
|
| + bool is_or_was_consumer_managed = false;
|
| + if (policy_data) {
|
| + const ManagementMode management_mode = GetManagementMode(*policy_data);
|
| + if (management_mode == MANAGEMENT_MODE_CONSUMER_MANAGED ||
|
| + (management_mode == MANAGEMENT_MODE_LOCAL_OWNER &&
|
| + policy() &&
|
| + GetManagementMode(*policy()) == MANAGEMENT_MODE_CONSUMER_MANAGED)) {
|
| + // The device is consumer-managed, or was consumer-managed and is now
|
| + // unmanaged.
|
| + is_or_was_consumer_managed = true;
|
| + }
|
| + }
|
| +
|
| + if (!is_enterprise_managed && !is_or_was_consumer_managed) {
|
| status_ = STATUS_BAD_STATE;
|
| NotifyStoreError();
|
| return;
|
| }
|
|
|
| - // Once per session, validate internal consistency of enrollment state (DM
|
| - // token must be present on enrolled devices) and in case of failure set flag
|
| - // to indicate that recovery is required.
|
| - const chromeos::DeviceSettingsService::Status status =
|
| - device_settings_service_->status();
|
| - switch (status) {
|
| - case chromeos::DeviceSettingsService::STORE_SUCCESS:
|
| - case chromeos::DeviceSettingsService::STORE_KEY_UNAVAILABLE:
|
| - case chromeos::DeviceSettingsService::STORE_NO_POLICY:
|
| - case chromeos::DeviceSettingsService::STORE_INVALID_POLICY:
|
| - case chromeos::DeviceSettingsService::STORE_VALIDATION_ERROR: {
|
| - if (!enrollment_validation_done_) {
|
| - enrollment_validation_done_ = true;
|
| - const bool has_dm_token =
|
| - status == chromeos::DeviceSettingsService::STORE_SUCCESS &&
|
| - device_settings_service_->policy_data() &&
|
| - device_settings_service_->policy_data()->has_request_token();
|
| -
|
| - // At the time LoginDisplayHostImpl decides whether enrollment flow is
|
| - // to be started, policy hasn't been read yet. To work around this,
|
| - // once the need for recovery is detected upon policy load, a flag is
|
| - // stored in prefs which is accessed by LoginDisplayHostImpl early
|
| - // during (next) boot.
|
| - if (!has_dm_token) {
|
| - LOG(ERROR) << "Device policy read on enrolled device yields "
|
| - << "no DM token! Status: " << status << ".";
|
| - chromeos::StartupUtils::MarkEnrollmentRecoveryRequired();
|
| + // For enterprise devices, once per session, validate internal consistency of
|
| + // enrollment state (DM token must be present on enrolled devices) and in case
|
| + // of failure set flag to indicate that recovery is required.
|
| + if (is_enterprise_managed) {
|
| + switch (status) {
|
| + case chromeos::DeviceSettingsService::STORE_SUCCESS:
|
| + case chromeos::DeviceSettingsService::STORE_KEY_UNAVAILABLE:
|
| + case chromeos::DeviceSettingsService::STORE_NO_POLICY:
|
| + case chromeos::DeviceSettingsService::STORE_INVALID_POLICY:
|
| + case chromeos::DeviceSettingsService::STORE_VALIDATION_ERROR: {
|
| + if (!enrollment_validation_done_) {
|
| + enrollment_validation_done_ = true;
|
| + const bool has_dm_token =
|
| + status == chromeos::DeviceSettingsService::STORE_SUCCESS &&
|
| + policy_data &&
|
| + policy_data->has_request_token();
|
| +
|
| + // At the time LoginDisplayHostImpl decides whether enrollment flow is
|
| + // to be started, policy hasn't been read yet. To work around this,
|
| + // once the need for recovery is detected upon policy load, a flag is
|
| + // stored in prefs which is accessed by LoginDisplayHostImpl early
|
| + // during (next) boot.
|
| + if (!has_dm_token) {
|
| + LOG(ERROR) << "Device policy read on enrolled device yields "
|
| + << "no DM token! Status: " << status << ".";
|
| + chromeos::StartupUtils::MarkEnrollmentRecoveryRequired();
|
| + }
|
| + UMA_HISTOGRAM_BOOLEAN("Enterprise.EnrolledPolicyHasDMToken",
|
| + has_dm_token);
|
| }
|
| - UMA_HISTOGRAM_BOOLEAN("Enterprise.EnrolledPolicyHasDMToken",
|
| - has_dm_token);
|
| + break;
|
| }
|
| - break;
|
| + case chromeos::DeviceSettingsService::STORE_POLICY_ERROR:
|
| + case chromeos::DeviceSettingsService::STORE_OPERATION_FAILED:
|
| + case chromeos::DeviceSettingsService::STORE_TEMP_VALIDATION_ERROR:
|
| + // Do nothing for write errors or transient read errors.
|
| + break;
|
| }
|
| - case chromeos::DeviceSettingsService::STORE_POLICY_ERROR:
|
| - case chromeos::DeviceSettingsService::STORE_OPERATION_FAILED:
|
| - case chromeos::DeviceSettingsService::STORE_TEMP_VALIDATION_ERROR:
|
| - // Do nothing for write errors or transient read errors.
|
| - break;
|
| }
|
|
|
| switch (status) {
|
| case chromeos::DeviceSettingsService::STORE_SUCCESS: {
|
| status_ = STATUS_OK;
|
| policy_.reset(new em::PolicyData());
|
| - if (device_settings_service_->policy_data())
|
| - policy_->MergeFrom(*device_settings_service_->policy_data());
|
| + if (policy_data)
|
| + policy_->MergeFrom(*policy_data);
|
|
|
| PolicyMap new_policy_map;
|
| - if (is_managed()) {
|
| + if (is_enterprise_managed && is_managed()) {
|
| DecodeDevicePolicy(*device_settings_service_->device_settings(),
|
| &new_policy_map, install_attributes_);
|
| }
|
|
|