| Index: chrome/browser/chromeos/ownership/owner_settings_service_chromeos.cc
|
| diff --git a/chrome/browser/chromeos/ownership/owner_settings_service_chromeos.cc b/chrome/browser/chromeos/ownership/owner_settings_service_chromeos.cc
|
| index f2b266485a86e94be1f639cba479736e2fecb1c3..9f4a2cdde71728f2cfbb10ec909393828a41de31 100644
|
| --- a/chrome/browser/chromeos/ownership/owner_settings_service_chromeos.cc
|
| +++ b/chrome/browser/chromeos/ownership/owner_settings_service_chromeos.cc
|
| @@ -148,8 +148,42 @@ void DoesPrivateKeyExistAsync(
|
| callback);
|
| }
|
|
|
| +// Returns true if it is okay to transfer from the current mode to the new
|
| +// mode. This function should be called in SetManagementMode().
|
| +bool CheckManagementModeTransition(em::PolicyData::ManagementMode current_mode,
|
| + em::PolicyData::ManagementMode new_mode) {
|
| + // Mode is not changed.
|
| + if (current_mode == new_mode)
|
| + return true;
|
| +
|
| + switch (current_mode) {
|
| + case em::PolicyData::LOCAL_OWNER:
|
| + // For consumer management enrollment.
|
| + return new_mode == em::PolicyData::CONSUMER_MANAGED;
|
| +
|
| + case em::PolicyData::ENTERPRISE_MANAGED:
|
| + // Management mode cannot be set when it is currently ENTERPRISE_MANAGED.
|
| + return false;
|
| +
|
| + case em::PolicyData::CONSUMER_MANAGED:
|
| + // For consumer management unenrollment.
|
| + return new_mode == em::PolicyData::LOCAL_OWNER;
|
| + }
|
| +
|
| + NOTREACHED();
|
| + return false;
|
| +}
|
| +
|
| } // namespace
|
|
|
| +OwnerSettingsServiceChromeOS::ManagementSettingsSetRequest::
|
| + ManagementSettingsSetRequest() {
|
| +}
|
| +
|
| +OwnerSettingsServiceChromeOS::ManagementSettingsSetRequest::
|
| + ~ManagementSettingsSetRequest() {
|
| +}
|
| +
|
| OwnerSettingsServiceChromeOS::OwnerSettingsServiceChromeOS(
|
| DeviceSettingsService* device_settings_service,
|
| Profile* profile,
|
| @@ -289,6 +323,17 @@ void OwnerSettingsServiceChromeOS::OnDeviceSettingsServiceShutdown() {
|
| device_settings_service_ = nullptr;
|
| }
|
|
|
| +void OwnerSettingsServiceChromeOS::SetManagementSettings(
|
| + const ManagementSettingsSetRequest& request) {
|
| + if (!IsOwner() && !IsOwnerInTests(user_id_)) {
|
| + if (!request.callback.is_null())
|
| + request.callback.Run(false /* success */);
|
| + return;
|
| + }
|
| + pending_management_settings_set_requests_.push_back(request);
|
| + StorePendingChanges();
|
| +}
|
| +
|
| // static
|
| void OwnerSettingsServiceChromeOS::IsOwnerForSafeModeAsync(
|
| const std::string& user_hash,
|
| @@ -617,6 +662,26 @@ void OwnerSettingsServiceChromeOS::StorePendingChanges() {
|
|
|
| scoped_ptr<em::PolicyData> policy = AssemblePolicy(
|
| user_id_, device_settings_service_->policy_data(), &settings);
|
| +
|
| + pending_callbacks_.clear();
|
| + for (const auto& change : pending_management_settings_set_requests_) {
|
| + em::PolicyData::ManagementMode current_mode = em::PolicyData::LOCAL_OWNER;
|
| + if (policy->has_management_mode())
|
| + current_mode = policy->management_mode();
|
| + if (!CheckManagementModeTransition(current_mode, change.management_mode)) {
|
| + LOG(ERROR) << "Invalid management mode transition: current mode = "
|
| + << current_mode << ", new mode = " << change.management_mode;
|
| + if (!change.callback.is_null())
|
| + change.callback.Run(false /* success */);
|
| + continue;
|
| + }
|
| + policy->set_management_mode(change.management_mode);
|
| + policy->set_request_token(change.request_token);
|
| + policy->set_device_id(change.device_id);
|
| + pending_callbacks_.push_back(change.callback);
|
| + }
|
| + pending_management_settings_set_requests_.clear();
|
| +
|
| bool rv = AssembleAndSignPolicyAsync(
|
| content::BrowserThread::GetBlockingPool(), policy.Pass(),
|
| base::Bind(&OwnerSettingsServiceChromeOS::OnPolicyAssembledAndSigned,
|
| @@ -641,7 +706,7 @@ void OwnerSettingsServiceChromeOS::OnPolicyAssembledAndSigned(
|
| void OwnerSettingsServiceChromeOS::OnSignedPolicyStored(bool success) {
|
| CHECK(device_settings_service_);
|
| ReportStatusAndContinueStoring(success &&
|
| - device_settings_service_->status() !=
|
| + device_settings_service_->status() ==
|
| DeviceSettingsService::STORE_SUCCESS);
|
| }
|
|
|
| @@ -650,6 +715,10 @@ void OwnerSettingsServiceChromeOS::ReportStatusAndContinueStoring(
|
| store_settings_factory_.InvalidateWeakPtrs();
|
| FOR_EACH_OBSERVER(OwnerSettingsService::Observer, observers_,
|
| OnSignedPolicyStored(success));
|
| + for (const auto& callback : pending_callbacks_) {
|
| + if (!callback.is_null())
|
| + callback.Run(success);
|
| + }
|
| StorePendingChanges();
|
| }
|
|
|
|
|