Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "chrome/browser/chromeos/ownership/owner_settings_service_chromeos.h" | 5 #include "chrome/browser/chromeos/ownership/owner_settings_service_chromeos.h" |
| 6 | 6 |
| 7 #include <algorithm> | |
| 7 #include <string> | 8 #include <string> |
| 8 | 9 |
| 9 #include "base/bind.h" | 10 #include "base/bind.h" |
| 10 #include "base/bind_helpers.h" | 11 #include "base/bind_helpers.h" |
| 11 #include "base/callback.h" | 12 #include "base/callback.h" |
| 12 #include "base/command_line.h" | 13 #include "base/command_line.h" |
| 13 #include "base/prefs/pref_service.h" | 14 #include "base/prefs/pref_service.h" |
| 14 #include "base/threading/thread_checker.h" | 15 #include "base/threading/thread_checker.h" |
| 15 #include "chrome/browser/chrome_notification_types.h" | 16 #include "chrome/browser/chrome_notification_types.h" |
| 16 #include "chrome/browser/chromeos/ownership/owner_settings_service_chromeos_fact ory.h" | 17 #include "chrome/browser/chromeos/ownership/owner_settings_service_chromeos_fact ory.h" |
| 17 #include "chrome/browser/chromeos/profiles/profile_helper.h" | 18 #include "chrome/browser/chromeos/profiles/profile_helper.h" |
| 18 #include "chrome/browser/chromeos/profiles/profile_helper.h" | |
| 19 #include "chrome/browser/chromeos/settings/cros_settings.h" | 19 #include "chrome/browser/chromeos/settings/cros_settings.h" |
| 20 #include "chrome/browser/chromeos/settings/device_settings_provider.h" | 20 #include "chrome/browser/chromeos/settings/device_settings_provider.h" |
| 21 #include "chrome/browser/chromeos/settings/session_manager_operation.h" | 21 #include "chrome/browser/chromeos/settings/session_manager_operation.h" |
| 22 #include "chrome/browser/profiles/profile.h" | 22 #include "chrome/browser/profiles/profile.h" |
| 23 #include "chromeos/dbus/dbus_thread_manager.h" | 23 #include "chromeos/dbus/dbus_thread_manager.h" |
| 24 #include "chromeos/tpm/tpm_token_loader.h" | 24 #include "chromeos/tpm/tpm_token_loader.h" |
| 25 #include "components/ownership/owner_key_util.h" | 25 #include "components/ownership/owner_key_util.h" |
| 26 #include "components/user_manager/user.h" | 26 #include "components/user_manager/user.h" |
| 27 #include "content/public/browser/browser_thread.h" | 27 #include "content/public/browser/browser_thread.h" |
| 28 #include "content/public/browser/notification_details.h" | 28 #include "content/public/browser/notification_details.h" |
| (...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 88 } | 88 } |
| 89 | 89 |
| 90 void LoadPrivateKey( | 90 void LoadPrivateKey( |
| 91 const scoped_refptr<OwnerKeyUtil>& owner_key_util, | 91 const scoped_refptr<OwnerKeyUtil>& owner_key_util, |
| 92 const std::string username_hash, | 92 const std::string username_hash, |
| 93 const base::Callback<void(const scoped_refptr<PublicKey>& public_key, | 93 const base::Callback<void(const scoped_refptr<PublicKey>& public_key, |
| 94 const scoped_refptr<PrivateKey>& private_key)>& | 94 const scoped_refptr<PrivateKey>& private_key)>& |
| 95 callback) { | 95 callback) { |
| 96 std::vector<uint8> public_key_data; | 96 std::vector<uint8> public_key_data; |
| 97 scoped_refptr<PublicKey> public_key; | 97 scoped_refptr<PublicKey> public_key; |
| 98 | |
| 98 if (!owner_key_util->ImportPublicKey(&public_key_data)) { | 99 if (!owner_key_util->ImportPublicKey(&public_key_data)) { |
| 99 scoped_refptr<PrivateKey> private_key; | 100 scoped_refptr<PrivateKey> private_key; |
| 100 BrowserThread::PostTask(BrowserThread::UI, | 101 BrowserThread::PostTask(BrowserThread::UI, |
| 101 FROM_HERE, | 102 FROM_HERE, |
| 102 base::Bind(callback, public_key, private_key)); | 103 base::Bind(callback, public_key, private_key)); |
| 103 return; | 104 return; |
| 104 } | 105 } |
| 105 public_key = new PublicKey(); | 106 public_key = new PublicKey(); |
| 106 public_key->data().swap(public_key_data); | 107 public_key->data().swap(public_key_data); |
| 108 | |
| 107 bool rv = BrowserThread::PostTask(BrowserThread::IO, | 109 bool rv = BrowserThread::PostTask(BrowserThread::IO, |
| 108 FROM_HERE, | 110 FROM_HERE, |
| 109 base::Bind(&LoadPrivateKeyByPublicKey, | 111 base::Bind(&LoadPrivateKeyByPublicKey, |
| 110 owner_key_util, | 112 owner_key_util, |
| 111 public_key, | 113 public_key, |
| 112 username_hash, | 114 username_hash, |
| 113 callback)); | 115 callback)); |
| 114 if (!rv) { | 116 if (!rv) { |
| 115 // IO thread doesn't exists in unit tests, but it's safe to use NSS from | 117 // IO thread doesn't exists in unit tests, but it's safe to use NSS from |
| 116 // BlockingPool in unit tests. | 118 // BlockingPool in unit tests. |
| (...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 167 return false; | 169 return false; |
| 168 | 170 |
| 169 case policy::MANAGEMENT_MODE_CONSUMER_MANAGED: | 171 case policy::MANAGEMENT_MODE_CONSUMER_MANAGED: |
| 170 // For consumer management unenrollment. | 172 // For consumer management unenrollment. |
| 171 return new_mode == policy::MANAGEMENT_MODE_LOCAL_OWNER; | 173 return new_mode == policy::MANAGEMENT_MODE_LOCAL_OWNER; |
| 172 } | 174 } |
| 173 | 175 |
| 174 NOTREACHED(); | 176 NOTREACHED(); |
| 175 return false; | 177 return false; |
| 176 } | 178 } |
| 177 | |
| 178 } // namespace | 179 } // namespace |
| 179 | 180 |
| 180 OwnerSettingsServiceChromeOS::ManagementSettings::ManagementSettings() { | 181 OwnerSettingsServiceChromeOS::ManagementSettings::ManagementSettings() { |
| 181 } | 182 } |
| 182 | 183 |
| 183 OwnerSettingsServiceChromeOS::ManagementSettings::~ManagementSettings() { | 184 OwnerSettingsServiceChromeOS::ManagementSettings::~ManagementSettings() { |
| 184 } | 185 } |
| 185 | 186 |
| 186 OwnerSettingsServiceChromeOS::OwnerSettingsServiceChromeOS( | 187 OwnerSettingsServiceChromeOS::OwnerSettingsServiceChromeOS( |
| 187 DeviceSettingsService* device_settings_service, | 188 DeviceSettingsService* device_settings_service, |
| 189 CrosSettings* cros_settings, | |
| 188 Profile* profile, | 190 Profile* profile, |
| 189 const scoped_refptr<OwnerKeyUtil>& owner_key_util) | 191 const scoped_refptr<OwnerKeyUtil>& owner_key_util) |
| 190 : ownership::OwnerSettingsService(owner_key_util), | 192 : ownership::OwnerSettingsService(owner_key_util), |
| 191 device_settings_service_(device_settings_service), | 193 device_settings_service_(device_settings_service), |
| 194 cros_settings_(cros_settings), | |
| 192 profile_(profile), | 195 profile_(profile), |
| 193 waiting_for_profile_creation_(true), | 196 waiting_for_profile_creation_(true), |
| 194 waiting_for_tpm_token_(true), | 197 waiting_for_tpm_token_(true), |
| 195 has_pending_management_settings_(false), | 198 has_pending_management_settings_(false), |
| 196 weak_factory_(this), | 199 weak_factory_(this), |
| 197 store_settings_factory_(this) { | 200 store_settings_factory_(this) { |
| 198 if (TPMTokenLoader::IsInitialized()) { | 201 if (TPMTokenLoader::IsInitialized()) { |
| 199 TPMTokenLoader::TPMTokenStatus tpm_token_status = | 202 TPMTokenLoader::TPMTokenStatus tpm_token_status = |
| 200 TPMTokenLoader::Get()->IsTPMTokenEnabled( | 203 TPMTokenLoader::Get()->IsTPMTokenEnabled( |
| 201 base::Bind(&OwnerSettingsServiceChromeOS::OnTPMTokenReady, | 204 base::Bind(&OwnerSettingsServiceChromeOS::OnTPMTokenReady, |
| (...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 262 pending_changes_.add(setting, make_scoped_ptr(value.DeepCopy())); | 265 pending_changes_.add(setting, make_scoped_ptr(value.DeepCopy())); |
| 263 | 266 |
| 264 em::ChromeDeviceSettingsProto settings; | 267 em::ChromeDeviceSettingsProto settings; |
| 265 if (tentative_settings_.get()) { | 268 if (tentative_settings_.get()) { |
| 266 settings = *tentative_settings_; | 269 settings = *tentative_settings_; |
| 267 } else if (device_settings_service_->status() == | 270 } else if (device_settings_service_->status() == |
| 268 DeviceSettingsService::STORE_SUCCESS && | 271 DeviceSettingsService::STORE_SUCCESS && |
| 269 device_settings_service_->device_settings()) { | 272 device_settings_service_->device_settings()) { |
| 270 settings = *device_settings_service_->device_settings(); | 273 settings = *device_settings_service_->device_settings(); |
| 271 } | 274 } |
| 272 UpdateDeviceSettings(setting, value, settings); | 275 UpdateDeviceSettings(setting, value, settings); |
|
Mattias Nissler (ping if slow)
2015/03/16 08:51:42
nit: blank line here
| |
| 276 // Perform fixups required to ensure sensical local-owner device policy: | |
| 277 // 1) The owner must be in the username field, | |
| 278 // 2) user whitelisting must be explicitly allowed or disallowed, and | |
| 279 // 3) the owner user must be on the whitelist, if it's enforced. | |
| 280 // We can enforce the first two here, but need to check the whitelist before | |
|
Mattias Nissler (ping if slow)
2015/03/16 08:51:42
I don't get why we can't update the whitelist here
Chris Masone
2015/03/16 16:45:57
I don't think we're actually assured that we've lo
Mattias Nissler (ping if slow)
2015/03/17 14:05:53
Ah, right, the |settings| may have come from elsew
Chris Masone
2015/03/17 15:00:48
Yeah, the pending_changes_ stuff is why I did this
Mattias Nissler (ping if slow)
2015/03/17 15:15:57
Well, I think it's fair to just force an initial w
| |
| 281 // modifying it, so that will be taken care of in a separate class. | |
| 273 em::PolicyData policy_data; | 282 em::PolicyData policy_data; |
| 274 policy_data.set_username(user_id_); | 283 policy_data.set_username(user_id_); |
| 284 if (!settings.has_allow_new_users()) | |
| 285 settings.mutable_allow_new_users()->set_allow_new_users(true); | |
| 286 | |
| 275 CHECK(settings.SerializeToString(policy_data.mutable_policy_value())); | 287 CHECK(settings.SerializeToString(policy_data.mutable_policy_value())); |
| 276 FOR_EACH_OBSERVER(OwnerSettingsService::Observer, observers_, | 288 FOR_EACH_OBSERVER(OwnerSettingsService::Observer, observers_, |
| 277 OnTentativeChangesInPolicy(policy_data)); | 289 OnTentativeChangesInPolicy(policy_data)); |
| 278 StorePendingChanges(); | 290 StorePendingChanges(); |
| 279 return true; | 291 return true; |
| 280 } | 292 } |
| 281 | 293 |
| 282 bool OwnerSettingsServiceChromeOS::AppendToList(const std::string& setting, | 294 bool OwnerSettingsServiceChromeOS::AppendToList(const std::string& setting, |
| 283 const base::Value& value) { | 295 const base::Value& value) { |
| 284 DCHECK(thread_checker_.CalledOnValidThread()); | 296 DCHECK(thread_checker_.CalledOnValidThread()); |
| 285 const base::Value* old_value = CrosSettings::Get()->GetPref(setting); | 297 const base::Value* old_value = cros_settings_->GetPref(setting); |
| 286 if (old_value && !old_value->IsType(base::Value::TYPE_LIST)) | 298 if (old_value && !old_value->IsType(base::Value::TYPE_LIST)) |
| 287 return false; | 299 return false; |
| 288 scoped_ptr<base::ListValue> new_value( | 300 scoped_ptr<base::ListValue> new_value( |
| 289 old_value ? static_cast<const base::ListValue*>(old_value)->DeepCopy() | 301 old_value ? static_cast<const base::ListValue*>(old_value)->DeepCopy() |
| 290 : new base::ListValue()); | 302 : new base::ListValue()); |
| 291 new_value->Append(value.DeepCopy()); | 303 new_value->Append(value.DeepCopy()); |
| 292 return Set(setting, *new_value); | 304 return Set(setting, *new_value); |
| 293 } | 305 } |
| 294 | 306 |
| 295 bool OwnerSettingsServiceChromeOS::RemoveFromList(const std::string& setting, | 307 bool OwnerSettingsServiceChromeOS::RemoveFromList(const std::string& setting, |
| 296 const base::Value& value) { | 308 const base::Value& value) { |
| 297 DCHECK(thread_checker_.CalledOnValidThread()); | 309 DCHECK(thread_checker_.CalledOnValidThread()); |
| 298 const base::Value* old_value = CrosSettings::Get()->GetPref(setting); | 310 const base::Value* old_value = cros_settings_->GetPref(setting); |
| 299 if (old_value && !old_value->IsType(base::Value::TYPE_LIST)) | 311 if (old_value && !old_value->IsType(base::Value::TYPE_LIST)) |
| 300 return false; | 312 return false; |
| 301 scoped_ptr<base::ListValue> new_value( | 313 scoped_ptr<base::ListValue> new_value( |
| 302 old_value ? static_cast<const base::ListValue*>(old_value)->DeepCopy() | 314 old_value ? static_cast<const base::ListValue*>(old_value)->DeepCopy() |
| 303 : new base::ListValue()); | 315 : new base::ListValue()); |
| 304 new_value->Remove(value, nullptr); | 316 new_value->Remove(value, nullptr); |
| 305 return Set(setting, *new_value); | 317 return Set(setting, *new_value); |
| 306 } | 318 } |
| 307 | 319 |
| 308 bool OwnerSettingsServiceChromeOS::CommitTentativeDeviceSettings( | 320 bool OwnerSettingsServiceChromeOS::CommitTentativeDeviceSettings( |
| (...skipping 358 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 667 void OwnerSettingsServiceChromeOS::OnPostKeypairLoadedActions() { | 679 void OwnerSettingsServiceChromeOS::OnPostKeypairLoadedActions() { |
| 668 DCHECK(thread_checker_.CalledOnValidThread()); | 680 DCHECK(thread_checker_.CalledOnValidThread()); |
| 669 | 681 |
| 670 const user_manager::User* user = | 682 const user_manager::User* user = |
| 671 ProfileHelper::Get()->GetUserByProfile(profile_); | 683 ProfileHelper::Get()->GetUserByProfile(profile_); |
| 672 user_id_ = user ? user->GetUserID() : std::string(); | 684 user_id_ = user ? user->GetUserID() : std::string(); |
| 673 | 685 |
| 674 const bool is_owner = IsOwner() || IsOwnerInTests(user_id_); | 686 const bool is_owner = IsOwner() || IsOwnerInTests(user_id_); |
| 675 if (is_owner && device_settings_service_) | 687 if (is_owner && device_settings_service_) |
| 676 device_settings_service_->InitOwner(user_id_, weak_factory_.GetWeakPtr()); | 688 device_settings_service_->InitOwner(user_id_, weak_factory_.GetWeakPtr()); |
| 689 | |
| 690 if (is_owner) | |
| 691 FixupLocalOwnerPolicy(); | |
| 692 } | |
| 693 | |
| 694 void OwnerSettingsServiceChromeOS::FixupLocalOwnerPolicy() { | |
| 695 if (CrosSettingsProvider::TRUSTED != cros_settings_->PrepareTrustedValues( | |
| 696 base::Bind(&OwnerSettingsServiceChromeOS::FixupLocalOwnerPolicy, | |
| 697 weak_factory_.GetWeakPtr()))) { | |
| 698 return; | |
| 699 } | |
| 700 DCHECK(IsOwner()); | |
| 701 DCHECK(!user_id_.empty()); | |
| 702 | |
| 703 bool wildcard = false; | |
| 704 if (!cros_settings_->FindEmailInList(kAccountsPrefUsers, user_id_, | |
| 705 &wildcard) || | |
| 706 wildcard) { | |
| 707 cros_settings_->AppendToList(kAccountsPrefUsers, | |
|
Mattias Nissler (ping if slow)
2015/03/16 08:51:42
This is a bit of a step backwards, as the write pa
Chris Masone
2015/03/16 16:45:57
Ah. How's it supposed to work, then?
Mattias Nissler (ping if slow)
2015/03/17 14:05:53
You could just update the protobuf field, i.e. |se
| |
| 708 new base::StringValue(user_id_)); | |
| 709 } | |
| 677 } | 710 } |
| 678 | 711 |
| 679 void OwnerSettingsServiceChromeOS::ReloadKeypairImpl(const base::Callback< | 712 void OwnerSettingsServiceChromeOS::ReloadKeypairImpl(const base::Callback< |
| 680 void(const scoped_refptr<PublicKey>& public_key, | 713 void(const scoped_refptr<PublicKey>& public_key, |
| 681 const scoped_refptr<PrivateKey>& private_key)>& callback) { | 714 const scoped_refptr<PrivateKey>& private_key)>& callback) { |
| 682 DCHECK(thread_checker_.CalledOnValidThread()); | 715 DCHECK(thread_checker_.CalledOnValidThread()); |
| 683 | 716 |
| 684 if (waiting_for_profile_creation_ || waiting_for_tpm_token_) | 717 if (waiting_for_profile_creation_ || waiting_for_tpm_token_) |
| 685 return; | 718 return; |
| 686 scoped_refptr<base::TaskRunner> task_runner = | 719 scoped_refptr<base::TaskRunner> task_runner = |
| (...skipping 85 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 772 std::vector<OnManagementSettingsSetCallback> callbacks; | 805 std::vector<OnManagementSettingsSetCallback> callbacks; |
| 773 pending_management_settings_callbacks_.swap(callbacks); | 806 pending_management_settings_callbacks_.swap(callbacks); |
| 774 for (const auto& callback : callbacks) { | 807 for (const auto& callback : callbacks) { |
| 775 if (!callback.is_null()) | 808 if (!callback.is_null()) |
| 776 callback.Run(success); | 809 callback.Run(success); |
| 777 } | 810 } |
| 778 StorePendingChanges(); | 811 StorePendingChanges(); |
| 779 } | 812 } |
| 780 | 813 |
| 781 } // namespace chromeos | 814 } // namespace chromeos |
| OLD | NEW |