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)