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(); |
} |