Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1181)

Unified Diff: chrome/browser/chromeos/ownership/owner_settings_service_chromeos.cc

Issue 565293003: Revert of Non-plafrom-specific part of an OwnerSettingsService is moved to components/ownership/*. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 6 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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
deleted file mode 100644
index 6f04ebbf5160729816c18057aaec8f3a9da57a3c..0000000000000000000000000000000000000000
--- a/chrome/browser/chromeos/ownership/owner_settings_service_chromeos.cc
+++ /dev/null
@@ -1,326 +0,0 @@
-// Copyright 2014 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "chrome/browser/chromeos/ownership/owner_settings_service_chromeos.h"
-
-#include <string>
-
-#include "base/bind.h"
-#include "base/bind_helpers.h"
-#include "base/callback.h"
-#include "base/command_line.h"
-#include "base/prefs/pref_service.h"
-#include "base/threading/thread_checker.h"
-#include "chrome/browser/chrome_notification_types.h"
-#include "chrome/browser/chromeos/profiles/profile_helper.h"
-#include "chrome/browser/chromeos/settings/cros_settings.h"
-#include "chrome/browser/chromeos/settings/session_manager_operation.h"
-#include "chrome/browser/profiles/profile.h"
-#include "chromeos/dbus/dbus_thread_manager.h"
-#include "chromeos/tpm_token_loader.h"
-#include "components/ownership/owner_key_util.h"
-#include "components/policy/core/common/cloud/cloud_policy_constants.h"
-#include "content/public/browser/browser_thread.h"
-#include "content/public/browser/notification_details.h"
-#include "content/public/browser/notification_service.h"
-#include "content/public/browser/notification_source.h"
-#include "content/public/common/content_switches.h"
-#include "crypto/nss_util.h"
-#include "crypto/nss_util_internal.h"
-#include "crypto/rsa_private_key.h"
-#include "crypto/scoped_nss_types.h"
-#include "crypto/signature_creator.h"
-
-namespace em = enterprise_management;
-
-using content::BrowserThread;
-using ownership::OwnerKeyUtil;
-using ownership::PrivateKey;
-using ownership::PublicKey;
-
-namespace chromeos {
-
-namespace {
-
-DeviceSettingsService* g_device_settings_service_for_testing = NULL;
-
-bool IsOwnerInTests(const std::string& user_id) {
- if (user_id.empty() ||
- !CommandLine::ForCurrentProcess()->HasSwitch(::switches::kTestType) ||
- !CrosSettings::IsInitialized()) {
- return false;
- }
- const base::Value* value = CrosSettings::Get()->GetPref(kDeviceOwner);
- if (!value || value->GetType() != base::Value::TYPE_STRING)
- return false;
- return static_cast<const base::StringValue*>(value)->GetString() == user_id;
-}
-
-void LoadPrivateKeyByPublicKey(
- const scoped_refptr<OwnerKeyUtil>& owner_key_util,
- scoped_refptr<PublicKey> public_key,
- const std::string& username_hash,
- const base::Callback<void(const scoped_refptr<PublicKey>& public_key,
- const scoped_refptr<PrivateKey>& private_key)>&
- callback) {
- crypto::EnsureNSSInit();
- crypto::ScopedPK11Slot slot =
- crypto::GetPublicSlotForChromeOSUser(username_hash);
- scoped_refptr<PrivateKey> private_key(new PrivateKey(
- owner_key_util->FindPrivateKeyInSlot(public_key->data(), slot.get())));
- BrowserThread::PostTask(BrowserThread::UI,
- FROM_HERE,
- base::Bind(callback, public_key, private_key));
-}
-
-void LoadPrivateKey(
- const scoped_refptr<OwnerKeyUtil>& owner_key_util,
- const std::string username_hash,
- const base::Callback<void(const scoped_refptr<PublicKey>& public_key,
- const scoped_refptr<PrivateKey>& private_key)>&
- callback) {
- std::vector<uint8> public_key_data;
- scoped_refptr<PublicKey> public_key;
- if (!owner_key_util->ImportPublicKey(&public_key_data)) {
- scoped_refptr<PrivateKey> private_key;
- BrowserThread::PostTask(BrowserThread::UI,
- FROM_HERE,
- base::Bind(callback, public_key, private_key));
- return;
- }
- public_key = new PublicKey();
- public_key->data().swap(public_key_data);
- bool rv = BrowserThread::PostTask(BrowserThread::IO,
- FROM_HERE,
- base::Bind(&LoadPrivateKeyByPublicKey,
- owner_key_util,
- public_key,
- username_hash,
- callback));
- if (!rv) {
- // IO thread doesn't exists in unit tests, but it's safe to use NSS from
- // BlockingPool in unit tests.
- LoadPrivateKeyByPublicKey(
- owner_key_util, public_key, username_hash, callback);
- }
-}
-
-bool DoesPrivateKeyExistAsyncHelper(
- const scoped_refptr<OwnerKeyUtil>& owner_key_util) {
- std::vector<uint8> public_key;
- if (!owner_key_util->ImportPublicKey(&public_key))
- return false;
- scoped_ptr<crypto::RSAPrivateKey> key(
- crypto::RSAPrivateKey::FindFromPublicKeyInfo(public_key));
- bool is_owner = key.get() != NULL;
- return is_owner;
-}
-
-// Checks whether NSS slots with private key are mounted or
-// not. Responds via |callback|.
-void DoesPrivateKeyExistAsync(
- const scoped_refptr<OwnerKeyUtil>& owner_key_util,
- const OwnerSettingsServiceChromeOS::IsOwnerCallback& callback) {
- if (!owner_key_util) {
- callback.Run(false);
- return;
- }
- scoped_refptr<base::TaskRunner> task_runner =
- BrowserThread::GetBlockingPool()->GetTaskRunnerWithShutdownBehavior(
- base::SequencedWorkerPool::SKIP_ON_SHUTDOWN);
- base::PostTaskAndReplyWithResult(
- task_runner.get(),
- FROM_HERE,
- base::Bind(&DoesPrivateKeyExistAsyncHelper, owner_key_util),
- callback);
-}
-
-DeviceSettingsService* GetDeviceSettingsService() {
- if (g_device_settings_service_for_testing)
- return g_device_settings_service_for_testing;
- return DeviceSettingsService::IsInitialized() ? DeviceSettingsService::Get()
- : NULL;
-}
-
-} // namespace
-
-OwnerSettingsServiceChromeOS::OwnerSettingsServiceChromeOS(
- Profile* profile,
- const scoped_refptr<OwnerKeyUtil>& owner_key_util)
- : ownership::OwnerSettingsService(owner_key_util),
- profile_(profile),
- waiting_for_profile_creation_(true),
- waiting_for_tpm_token_(true),
- weak_factory_(this) {
- if (TPMTokenLoader::IsInitialized()) {
- TPMTokenLoader::TPMTokenStatus tpm_token_status =
- TPMTokenLoader::Get()->IsTPMTokenEnabled(
- base::Bind(&OwnerSettingsServiceChromeOS::OnTPMTokenReady,
- weak_factory_.GetWeakPtr()));
- waiting_for_tpm_token_ =
- tpm_token_status == TPMTokenLoader::TPM_TOKEN_STATUS_UNDETERMINED;
- }
-
- if (DBusThreadManager::IsInitialized() &&
- DBusThreadManager::Get()->GetSessionManagerClient()) {
- DBusThreadManager::Get()->GetSessionManagerClient()->AddObserver(this);
- }
-
- registrar_.Add(this,
- chrome::NOTIFICATION_PROFILE_CREATED,
- content::Source<Profile>(profile_));
-}
-
-OwnerSettingsServiceChromeOS::~OwnerSettingsServiceChromeOS() {
- DCHECK(thread_checker_.CalledOnValidThread());
- if (DBusThreadManager::IsInitialized() &&
- DBusThreadManager::Get()->GetSessionManagerClient()) {
- DBusThreadManager::Get()->GetSessionManagerClient()->RemoveObserver(this);
- }
-}
-
-void OwnerSettingsServiceChromeOS::OnTPMTokenReady(
- bool /* tpm_token_enabled */) {
- DCHECK(thread_checker_.CalledOnValidThread());
- waiting_for_tpm_token_ = false;
-
- // TPMTokenLoader initializes the TPM and NSS database which is necessary to
- // determine ownership. Force a reload once we know these are initialized.
- ReloadKeypair();
-}
-
-void OwnerSettingsServiceChromeOS::SignAndStorePolicyAsync(
- scoped_ptr<em::PolicyData> policy,
- const base::Closure& callback) {
- DCHECK(thread_checker_.CalledOnValidThread());
- SignAndStoreSettingsOperation* operation = new SignAndStoreSettingsOperation(
- base::Bind(&OwnerSettingsServiceChromeOS::HandleCompletedOperation,
- weak_factory_.GetWeakPtr(),
- callback),
- policy.Pass());
- operation->set_owner_settings_service(weak_factory_.GetWeakPtr());
- pending_operations_.push_back(operation);
- if (pending_operations_.front() == operation)
- StartNextOperation();
-}
-
-void OwnerSettingsServiceChromeOS::Observe(
- int type,
- const content::NotificationSource& source,
- const content::NotificationDetails& details) {
- DCHECK(thread_checker_.CalledOnValidThread());
- if (type != chrome::NOTIFICATION_PROFILE_CREATED) {
- NOTREACHED();
- return;
- }
-
- Profile* profile = content::Source<Profile>(source).ptr();
- if (profile != profile_) {
- NOTREACHED();
- return;
- }
-
- waiting_for_profile_creation_ = false;
- ReloadKeypair();
-}
-
-void OwnerSettingsServiceChromeOS::OwnerKeySet(bool success) {
- DCHECK(thread_checker_.CalledOnValidThread());
- if (success)
- ReloadKeypair();
-}
-
-// static
-void OwnerSettingsServiceChromeOS::IsOwnerForSafeModeAsync(
- const std::string& user_hash,
- const scoped_refptr<OwnerKeyUtil>& owner_key_util,
- const IsOwnerCallback& callback) {
- CHECK(chromeos::LoginState::Get()->IsInSafeMode());
-
- // Make sure NSS is initialized and NSS DB is loaded for the user before
- // searching for the owner key.
- BrowserThread::PostTaskAndReply(
- BrowserThread::IO,
- FROM_HERE,
- base::Bind(base::IgnoreResult(&crypto::InitializeNSSForChromeOSUser),
- user_hash,
- ProfileHelper::GetProfilePathByUserIdHash(user_hash)),
- base::Bind(&DoesPrivateKeyExistAsync, owner_key_util, callback));
-}
-
-// static
-void OwnerSettingsServiceChromeOS::SetDeviceSettingsServiceForTesting(
- DeviceSettingsService* device_settings_service) {
- DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
- g_device_settings_service_for_testing = device_settings_service;
-}
-
-void OwnerSettingsServiceChromeOS::OnPostKeypairLoadedActions() {
- DCHECK(thread_checker_.CalledOnValidThread());
-
- user_id_ = profile_->GetProfileName();
- const bool is_owner = IsOwner() || IsOwnerInTests(user_id_);
- if (is_owner && GetDeviceSettingsService())
- GetDeviceSettingsService()->InitOwner(user_id_, weak_factory_.GetWeakPtr());
-}
-
-void OwnerSettingsServiceChromeOS::ReloadKeypairImpl(const base::Callback<
- void(const scoped_refptr<PublicKey>& public_key,
- const scoped_refptr<PrivateKey>& private_key)>& callback) {
- DCHECK(thread_checker_.CalledOnValidThread());
-
- if (waiting_for_profile_creation_ || waiting_for_tpm_token_)
- return;
- scoped_refptr<base::TaskRunner> task_runner =
- BrowserThread::GetBlockingPool()->GetTaskRunnerWithShutdownBehavior(
- base::SequencedWorkerPool::SKIP_ON_SHUTDOWN);
- task_runner->PostTask(
- FROM_HERE,
- base::Bind(&LoadPrivateKey,
- owner_key_util_,
- ProfileHelper::GetUserIdHashFromProfile(profile_),
- callback));
-}
-
-void OwnerSettingsServiceChromeOS::StartNextOperation() {
- DeviceSettingsService* service = GetDeviceSettingsService();
- if (!pending_operations_.empty() && service &&
- service->session_manager_client()) {
- pending_operations_.front()->Start(
- service->session_manager_client(), owner_key_util_, public_key_);
- }
-}
-
-void OwnerSettingsServiceChromeOS::HandleCompletedOperation(
- const base::Closure& callback,
- SessionManagerOperation* operation,
- DeviceSettingsService::Status status) {
- DCHECK_EQ(operation, pending_operations_.front());
-
- DeviceSettingsService* service = GetDeviceSettingsService();
- if (status == DeviceSettingsService::STORE_SUCCESS) {
- service->set_policy_data(operation->policy_data().Pass());
- service->set_device_settings(operation->device_settings().Pass());
- }
-
- if ((operation->public_key() && !public_key_) ||
- (operation->public_key() && public_key_ &&
- operation->public_key()->data() != public_key_->data())) {
- // Public part changed so we need to reload private part too.
- ReloadKeypair();
- content::NotificationService::current()->Notify(
- chrome::NOTIFICATION_OWNERSHIP_STATUS_CHANGED,
- content::Source<OwnerSettingsServiceChromeOS>(this),
- content::NotificationService::NoDetails());
- }
- service->OnSignAndStoreOperationCompleted(status);
- if (!callback.is_null())
- callback.Run();
-
- pending_operations_.pop_front();
- delete operation;
- StartNextOperation();
-}
-
-} // namespace chromeos

Powered by Google App Engine
This is Rietveld 408576698