// Copyright 2014 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #include "chrome/browser/chromeos/policy/consumer_unenrollment_handler.h" #include "base/bind.h" #include "base/logging.h" #include "chrome/browser/chromeos/ownership/owner_settings_service_chromeos.h" #include "chrome/browser/chromeos/policy/consumer_management_service.h" #include "chrome/browser/chromeos/policy/consumer_management_stage.h" #include "chrome/browser/chromeos/policy/device_cloud_policy_manager_chromeos.h" #include "chrome/browser/chromeos/settings/device_settings_service.h" #include "components/policy/core/common/cloud/cloud_policy_constants.h" #include "policy/proto/device_management_backend.pb.h" namespace em = enterprise_management; namespace policy { ConsumerUnenrollmentHandler::ConsumerUnenrollmentHandler( chromeos::DeviceSettingsService* device_settings_service, ConsumerManagementService* consumer_management_service, DeviceCloudPolicyManagerChromeOS* device_cloud_policy_manager, chromeos::OwnerSettingsServiceChromeOS* owner_settings_service) : device_settings_service_(device_settings_service), consumer_management_service_(consumer_management_service), device_cloud_policy_manager_(device_cloud_policy_manager), owner_settings_service_(owner_settings_service), weak_factory_(this) { } ConsumerUnenrollmentHandler::~ConsumerUnenrollmentHandler() { } void ConsumerUnenrollmentHandler::Start() { if (consumer_management_service_->GetStatus() != ConsumerManagementService::STATUS_ENROLLED) { return; } device_cloud_policy_manager_->Unregister( base::Bind(&ConsumerUnenrollmentHandler::OnUnregistered, weak_factory_.GetWeakPtr())); } void ConsumerUnenrollmentHandler::OnUnregistered(bool success) { if (!success) { consumer_management_service_->SetStage( ConsumerManagementStage::UnenrollmentDMServerFailed()); LOG(ERROR) << "Failed to unregister and disconnect device cloud policy " << "manager."; return; } chromeos::OwnerSettingsServiceChromeOS::ManagementSettings settings; settings.management_mode = MANAGEMENT_MODE_LOCAL_OWNER; owner_settings_service_->SetManagementSettings( settings, base::Bind(&ConsumerUnenrollmentHandler::OnManagementSettingsSet, weak_factory_.GetWeakPtr())); } void ConsumerUnenrollmentHandler::OnManagementSettingsSet(bool success) { if (!success) { consumer_management_service_->SetStage( ConsumerManagementStage::UnenrollmentUpdateDeviceSettingsFailed()); LOG(ERROR) << "Failed to unset request token and device ID."; return; } consumer_management_service_->SetStage( ConsumerManagementStage::UnenrollmentSuccess()); // Disconnecting the device cloud policy manager will restart the device // cloud policy initializer. So this must be done after the management // settings are updated, so that the initializer won't reconnect the manager. device_cloud_policy_manager_->Disconnect(); } } // namespace policy