device_cloud_policy_manager_chromeos.cc revision 90dce4d38c5ff5333bea97d859d4e484e27edf0c
15d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
25d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// found in the LICENSE file.
45d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
55d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "chrome/browser/chromeos/policy/device_cloud_policy_manager_chromeos.h"
65d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
75d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "base/bind.h"
85d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "base/bind_helpers.h"
95d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "chrome/browser/chromeos/attestation/attestation_policy_observer.h"
105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "chrome/browser/chromeos/policy/device_cloud_policy_store_chromeos.h"
115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "chrome/browser/chromeos/policy/enrollment_handler_chromeos.h"
125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "chrome/browser/chromeos/policy/enterprise_install_attributes.h"
135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "chrome/browser/chromeos/system/statistics_provider.h"
145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "chrome/browser/policy/cloud/cloud_policy_constants.h"
155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "chrome/browser/policy/cloud/cloud_policy_store.h"
165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "chrome/browser/policy/cloud/device_management_service.h"
175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "chrome/browser/policy/proto/cloud/device_management_backend.pb.h"
185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "chrome/common/pref_names.h"
195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "chromeos/chromeos_constants.h"
205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)namespace em = enterprise_management;
225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)namespace policy {
245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)namespace {
265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// MachineInfo key names.
285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)const char kMachineInfoSystemHwqual[] = "hardware_class";
295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// These are the machine serial number keys that we check in order until we
315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// find a non-empty serial number. The VPD spec says the serial number should be
325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// in the "serial_number" key for v2+ VPDs. However, legacy devices used a
335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// different keys to report their serial number, which we fall back to if
345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// "serial_number" is not present.
355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)//
365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Product_S/N is still special-cased due to inconsistencies with serial
375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// numbers on Lumpy devices: On these devices, serial_number is identical to
385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Product_S/N with an appended checksum. Unfortunately, the sticker on the
395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// packaging doesn't include that checksum either (the sticker on the device
405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// does though!). The former sticker is the source of the serial number used by
415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// device management service, so we prefer Product_S/N over serial number to
4246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)// match the server.
4346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)//
445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// TODO(mnissler): Move serial_number back to the top once the server side uses
4546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)// the correct serial number.
4646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)const char* kMachineInfoSerialNumberKeys[] = {
4746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  "Product_S/N",    // Lumpy/Alex devices
485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  "serial_number",  // VPD v2+ devices
495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  "Product_SN",     // Mario
505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  "sn",             // old ZGB devices (more recent ones use serial_number)
515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)};
525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Fetches a machine statics from StatisticsProvider, returns an empty string on
545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// failure.
5546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)std::string GetMachineStatistic(const std::string& key) {
5646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  std::string value;
5746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  chromeos::system::StatisticsProvider* provider =
585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      chromeos::system::StatisticsProvider::GetInstance();
595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  if (!provider->GetMachineStatistic(key, &value))
605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    LOG(WARNING) << "Failed to get machine statistic " << key;
615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  return value;
635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}  // namespace
665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)DeviceCloudPolicyManagerChromeOS::DeviceCloudPolicyManagerChromeOS(
685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    scoped_ptr<DeviceCloudPolicyStoreChromeOS> store,
695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    EnterpriseInstallAttributes* install_attributes)
705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    : CloudPolicyManager(
715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)          PolicyNamespaceKey(dm_protocol::kChromeDevicePolicyType,
725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                             std::string()),
735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)          store.get()),
745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      device_store_(store.Pass()),
755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      install_attributes_(install_attributes),
765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      device_management_service_(NULL),
775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      local_state_(NULL) {}
785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
7946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)DeviceCloudPolicyManagerChromeOS::~DeviceCloudPolicyManagerChromeOS() {}
8046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
8146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)void DeviceCloudPolicyManagerChromeOS::Connect(
825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    PrefService* local_state,
8346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    DeviceManagementService* device_management_service,
8446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    scoped_ptr<CloudPolicyClient::StatusProvider> device_status_provider) {
8546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  CHECK(!device_management_service_);
865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  CHECK(device_management_service);
875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  CHECK(local_state);
885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  local_state_ = local_state;
905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  device_management_service_ = device_management_service;
915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  device_status_provider_ = device_status_provider.Pass();
925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  StartIfManaged();
945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void DeviceCloudPolicyManagerChromeOS::StartEnrollment(
975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    const std::string& auth_token,
985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    bool is_auto_enrollment,
995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    const AllowedDeviceModes& allowed_device_modes,
1005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    const EnrollmentCallback& callback) {
1015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  CHECK(device_management_service_);
1025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  core()->Disconnect();
1035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  if (requisition_.empty())
1055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    requisition_ = GetMachineStatistic(chromeos::kOemDeviceRequisitionKey);
1065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  enrollment_handler_.reset(
1085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      new EnrollmentHandlerChromeOS(
10946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)          device_store_.get(), install_attributes_, CreateClient(), auth_token,
11046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)          install_attributes_->GetDeviceId(), is_auto_enrollment,
11146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)          requisition_, allowed_device_modes,
1125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)          base::Bind(&DeviceCloudPolicyManagerChromeOS::EnrollmentCompleted,
1135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                     base::Unretained(this), callback)));
1145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  enrollment_handler_->StartEnrollment();
1155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
1165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void DeviceCloudPolicyManagerChromeOS::CancelEnrollment() {
1185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  if (enrollment_handler_.get()) {
1195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    enrollment_handler_.reset();
1205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    StartIfManaged();
1215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
1225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
1235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void DeviceCloudPolicyManagerChromeOS::Shutdown() {
1255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  CloudPolicyManager::Shutdown();
1265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  device_status_provider_.reset();
1275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
1285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void DeviceCloudPolicyManagerChromeOS::OnStoreLoaded(CloudPolicyStore* store) {
1305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  CloudPolicyManager::OnStoreLoaded(store);
1315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  if (!enrollment_handler_.get())
1335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    StartIfManaged();
1345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
1355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// static
1375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)std::string DeviceCloudPolicyManagerChromeOS::GetMachineID() {
1385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  std::string machine_id;
1395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  chromeos::system::StatisticsProvider* provider =
1405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      chromeos::system::StatisticsProvider::GetInstance();
1415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  for (size_t i = 0; i < arraysize(kMachineInfoSerialNumberKeys); i++) {
1425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    if (provider->GetMachineStatistic(kMachineInfoSerialNumberKeys[i],
1435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                      &machine_id) &&
1445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        !machine_id.empty()) {
1455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      break;
1465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    }
1475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
1485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  if (machine_id.empty())
1505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    LOG(WARNING) << "Failed to get machine id.";
1515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  return machine_id;
1535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
1545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// static
1565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)std::string DeviceCloudPolicyManagerChromeOS::GetMachineModel() {
1575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  return GetMachineStatistic(kMachineInfoSystemHwqual);
1585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
1595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)scoped_ptr<CloudPolicyClient> DeviceCloudPolicyManagerChromeOS::CreateClient() {
1615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  return make_scoped_ptr(
1625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      new CloudPolicyClient(GetMachineID(), GetMachineModel(),
1635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                            USER_AFFILIATION_NONE,
1645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                            device_status_provider_.get(),
1655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                            device_management_service_));
1665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
16746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
16846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)void DeviceCloudPolicyManagerChromeOS::EnrollmentCompleted(
16946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    const EnrollmentCallback& callback,
1705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    EnrollmentStatus status) {
17146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  if (status.status() == EnrollmentStatus::STATUS_SUCCESS) {
17246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    core()->Connect(enrollment_handler_->ReleaseClient());
17346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    core()->StartRefreshScheduler();
1745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    core()->TrackRefreshDelayPref(local_state_,
1755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                  prefs::kDevicePolicyRefreshRate);
1765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    attestation_policy_observer_.reset(
1775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        new chromeos::attestation::AttestationPolicyObserver(client()));
1785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  } else {
1791320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    StartIfManaged();
1801320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
1811320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1821320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  enrollment_handler_.reset();
1831320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (!callback.is_null())
1841320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    callback.Run(status);
1851320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
1861320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
18746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)void DeviceCloudPolicyManagerChromeOS::StartIfManaged() {
18846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  if (device_management_service_ &&
18946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      local_state_ &&
1905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      store()->is_initialized() &&
19146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      store()->is_managed() &&
19246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      !service()) {
19346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    core()->Connect(CreateClient());
1945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    core()->StartRefreshScheduler();
195010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    core()->TrackRefreshDelayPref(local_state_,
1965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                  prefs::kDevicePolicyRefreshRate);
1975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    attestation_policy_observer_.reset(
1985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        new chromeos::attestation::AttestationPolicyObserver(client()));
1995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
20046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)}
20146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
20246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)}  // namespace policy
2035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)