Chromium Code Reviews| 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(); |
|
Mattias Nissler (ping if slow)
2014/12/02 08:52:40
I think the preceding 3 lines should use David's n
ygorshenin1
2014/12/02 19:18:58
Done.
|
| + 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(); |
| } |