| 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 48a81cb418a7dca2df0e0da89efb161a3cb84440..44fa47ed186f00cb5cf0427b677be82ffc965235 100644
|
| --- a/chrome/browser/chromeos/ownership/owner_settings_service_chromeos.cc
|
| +++ b/chrome/browser/chromeos/ownership/owner_settings_service_chromeos.cc
|
| @@ -4,6 +4,7 @@
|
|
|
| #include "chrome/browser/chromeos/ownership/owner_settings_service_chromeos.h"
|
|
|
| +#include <algorithm>
|
| #include <string>
|
|
|
| #include "base/bind.h"
|
| @@ -15,7 +16,6 @@
|
| #include "chrome/browser/chrome_notification_types.h"
|
| #include "chrome/browser/chromeos/ownership/owner_settings_service_chromeos_factory.h"
|
| #include "chrome/browser/chromeos/profiles/profile_helper.h"
|
| -#include "chrome/browser/chromeos/profiles/profile_helper.h"
|
| #include "chrome/browser/chromeos/settings/cros_settings.h"
|
| #include "chrome/browser/chromeos/settings/device_settings_provider.h"
|
| #include "chrome/browser/chromeos/settings/session_manager_operation.h"
|
| @@ -174,7 +174,6 @@ bool CheckManagementModeTransition(policy::ManagementMode current_mode,
|
| NOTREACHED();
|
| return false;
|
| }
|
| -
|
| } // namespace
|
|
|
| OwnerSettingsServiceChromeOS::ManagementSettings::ManagementSettings() {
|
| @@ -192,6 +191,7 @@ OwnerSettingsServiceChromeOS::OwnerSettingsServiceChromeOS(
|
| profile_(profile),
|
| waiting_for_profile_creation_(true),
|
| waiting_for_tpm_token_(true),
|
| + has_pending_fixups_(false),
|
| has_pending_management_settings_(false),
|
| weak_factory_(this),
|
| store_settings_factory_(this) {
|
| @@ -414,7 +414,9 @@ void OwnerSettingsServiceChromeOS::IsOwnerForSafeModeAsync(
|
| scoped_ptr<em::PolicyData> OwnerSettingsServiceChromeOS::AssemblePolicy(
|
| const std::string& user_id,
|
| const em::PolicyData* policy_data,
|
| - const em::ChromeDeviceSettingsProto* settings) {
|
| + bool apply_pending_management_settings,
|
| + const ManagementSettings& pending_management_settings,
|
| + em::ChromeDeviceSettingsProto* settings) {
|
| scoped_ptr<em::PolicyData> policy(new em::PolicyData());
|
| if (policy_data) {
|
| // Preserve management settings.
|
| @@ -429,10 +431,28 @@ scoped_ptr<em::PolicyData> OwnerSettingsServiceChromeOS::AssemblePolicy(
|
| // setting is set. We set the management mode to LOCAL_OWNER initially.
|
| policy->set_management_mode(em::PolicyData::LOCAL_OWNER);
|
| }
|
| + if (apply_pending_management_settings) {
|
| + policy::SetManagementMode(*policy,
|
| + pending_management_settings.management_mode);
|
| +
|
| + if (pending_management_settings.request_token.empty())
|
| + policy->clear_request_token();
|
| + else
|
| + policy->set_request_token(pending_management_settings.request_token);
|
| +
|
| + if (pending_management_settings.device_id.empty())
|
| + policy->clear_device_id();
|
| + else
|
| + policy->set_device_id(pending_management_settings.device_id);
|
| + }
|
| policy->set_policy_type(policy::dm_protocol::kChromeDevicePolicyType);
|
| policy->set_timestamp(
|
| (base::Time::Now() - base::Time::UnixEpoch()).InMilliseconds());
|
| policy->set_username(user_id);
|
| + if (policy_data->management_mode() == em::PolicyData::LOCAL_OWNER ||
|
| + policy_data->management_mode() == em::PolicyData::CONSUMER_MANAGED) {
|
| + FixupLocalOwnerPolicy(user_id, settings);
|
| + }
|
| if (!settings->SerializeToString(policy->mutable_policy_value()))
|
| return scoped_ptr<em::PolicyData>();
|
|
|
| @@ -440,6 +460,21 @@ scoped_ptr<em::PolicyData> OwnerSettingsServiceChromeOS::AssemblePolicy(
|
| }
|
|
|
| // static
|
| +void OwnerSettingsServiceChromeOS::FixupLocalOwnerPolicy(
|
| + const std::string& user_id,
|
| + enterprise_management::ChromeDeviceSettingsProto* settings) {
|
| + if (!settings->has_allow_new_users())
|
| + settings->mutable_allow_new_users()->set_allow_new_users(true);
|
| +
|
| + em::UserWhitelistProto* whitelist_proto = settings->mutable_user_whitelist();
|
| + if (whitelist_proto->user_whitelist().end() ==
|
| + std::find(whitelist_proto->user_whitelist().begin(),
|
| + whitelist_proto->user_whitelist().end(), user_id)) {
|
| + whitelist_proto->add_user_whitelist(user_id);
|
| + }
|
| +}
|
| +
|
| +// static
|
| void OwnerSettingsServiceChromeOS::UpdateDeviceSettings(
|
| const std::string& path,
|
| const base::Value& value,
|
| @@ -674,6 +709,8 @@ void OwnerSettingsServiceChromeOS::OnPostKeypairLoadedActions() {
|
| const bool is_owner = IsOwner() || IsOwnerInTests(user_id_);
|
| if (is_owner && device_settings_service_)
|
| device_settings_service_->InitOwner(user_id_, weak_factory_.GetWeakPtr());
|
| +
|
| + has_pending_fixups_ = true;
|
| }
|
|
|
| void OwnerSettingsServiceChromeOS::ReloadKeypairImpl(const base::Callback<
|
| @@ -716,23 +753,11 @@ void OwnerSettingsServiceChromeOS::StorePendingChanges() {
|
| UpdateDeviceSettings(change.first, *change.second, settings);
|
| pending_changes_.clear();
|
|
|
| - scoped_ptr<em::PolicyData> policy = AssemblePolicy(
|
| - user_id_, device_settings_service_->policy_data(), &settings);
|
| -
|
| - if (has_pending_management_settings_) {
|
| - policy::SetManagementMode(*policy,
|
| - pending_management_settings_.management_mode);
|
| -
|
| - if (pending_management_settings_.request_token.empty())
|
| - policy->clear_request_token();
|
| - else
|
| - policy->set_request_token(pending_management_settings_.request_token);
|
| -
|
| - if (pending_management_settings_.device_id.empty())
|
| - policy->clear_device_id();
|
| - else
|
| - policy->set_device_id(pending_management_settings_.device_id);
|
| - }
|
| + scoped_ptr<em::PolicyData> policy =
|
| + AssemblePolicy(user_id_, device_settings_service_->policy_data(),
|
| + has_pending_management_settings_,
|
| + pending_management_settings_, &settings);
|
| + has_pending_fixups_ = false;
|
| has_pending_management_settings_ = false;
|
|
|
| bool rv = AssembleAndSignPolicyAsync(
|
|
|