| Index: chrome/browser/chromeos/login/managed/managed_user_creation_controller_new.cc
|
| diff --git a/chrome/browser/chromeos/login/managed/managed_user_creation_controller_new.cc b/chrome/browser/chromeos/login/managed/managed_user_creation_controller_new.cc
|
| deleted file mode 100644
|
| index 89e22a8e5f98e059494e2854857754ea7fe8ea5b..0000000000000000000000000000000000000000
|
| --- a/chrome/browser/chromeos/login/managed/managed_user_creation_controller_new.cc
|
| +++ /dev/null
|
| @@ -1,402 +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/login/managed/managed_user_creation_controller_new.h"
|
| -
|
| -#include "base/base64.h"
|
| -#include "base/bind.h"
|
| -#include "base/file_util.h"
|
| -#include "base/files/file_path.h"
|
| -#include "base/strings/string_number_conversions.h"
|
| -#include "base/strings/string_util.h"
|
| -#include "base/sys_info.h"
|
| -#include "base/task_runner_util.h"
|
| -#include "base/threading/sequenced_worker_pool.h"
|
| -#include "base/values.h"
|
| -#include "chrome/browser/chromeos/login/auth/mount_manager.h"
|
| -#include "chrome/browser/chromeos/login/managed/locally_managed_user_constants.h"
|
| -#include "chrome/browser/chromeos/login/managed/supervised_user_authentication.h"
|
| -#include "chrome/browser/chromeos/login/users/supervised_user_manager.h"
|
| -#include "chrome/browser/chromeos/login/users/user.h"
|
| -#include "chrome/browser/chromeos/login/users/user_manager.h"
|
| -#include "chrome/browser/lifetime/application_lifetime.h"
|
| -#include "chrome/browser/sync/profile_sync_service.h"
|
| -#include "chrome/browser/sync/profile_sync_service_factory.h"
|
| -#include "chromeos/cryptohome/cryptohome_parameters.h"
|
| -#include "chromeos/dbus/dbus_thread_manager.h"
|
| -#include "chromeos/dbus/session_manager_client.h"
|
| -#include "chromeos/login/auth/key.h"
|
| -#include "chromeos/login/auth/user_context.h"
|
| -#include "content/public/browser/browser_thread.h"
|
| -#include "content/public/browser/user_metrics.h"
|
| -#include "crypto/random.h"
|
| -#include "google_apis/gaia/google_service_auth_error.h"
|
| -
|
| -namespace chromeos {
|
| -
|
| -namespace {
|
| -
|
| -const int kUserCreationTimeoutSeconds = 30; // 30 seconds.
|
| -
|
| -bool StoreManagedUserFiles(const std::string& token,
|
| - const base::FilePath& base_path) {
|
| - if (!base::SysInfo::IsRunningOnChromeOS()) {
|
| - // If running on desktop, cryptohome stub does not create home directory.
|
| - base::CreateDirectory(base_path);
|
| - }
|
| - base::FilePath token_file = base_path.Append(kSupervisedUserTokenFilename);
|
| - int bytes = base::WriteFile(token_file, token.c_str(), token.length());
|
| - return bytes >= 0;
|
| -}
|
| -
|
| -} // namespace
|
| -
|
| -ManagedUserCreationControllerNew::ManagedUserCreationControllerNew(
|
| - ManagedUserCreationControllerNew::StatusConsumer* consumer,
|
| - const std::string& manager_id)
|
| - : ManagedUserCreationController(consumer),
|
| - stage_(STAGE_INITIAL),
|
| - weak_factory_(this) {
|
| - creation_context_.reset(
|
| - new ManagedUserCreationControllerNew::UserCreationContext());
|
| - creation_context_->manager_id = manager_id;
|
| -}
|
| -
|
| -ManagedUserCreationControllerNew::~ManagedUserCreationControllerNew() {}
|
| -
|
| -ManagedUserCreationControllerNew::UserCreationContext::UserCreationContext() {}
|
| -
|
| -ManagedUserCreationControllerNew::UserCreationContext::~UserCreationContext() {}
|
| -
|
| -void ManagedUserCreationControllerNew::SetManagerProfile(
|
| - Profile* manager_profile) {
|
| - creation_context_->manager_profile = manager_profile;
|
| -}
|
| -
|
| -Profile* ManagedUserCreationControllerNew::GetManagerProfile() {
|
| - return creation_context_->manager_profile;
|
| -}
|
| -
|
| -void ManagedUserCreationControllerNew::StartCreation(
|
| - const base::string16& display_name,
|
| - const std::string& password,
|
| - int avatar_index) {
|
| - DCHECK(creation_context_);
|
| - creation_context_->creation_type = NEW_USER;
|
| - creation_context_->display_name = display_name;
|
| - creation_context_->password = password;
|
| - creation_context_->avatar_index = avatar_index;
|
| - StartCreationImpl();
|
| -}
|
| -
|
| -void ManagedUserCreationControllerNew::StartImport(
|
| - const base::string16& display_name,
|
| - const std::string& password,
|
| - int avatar_index,
|
| - const std::string& sync_id,
|
| - const std::string& master_key) {
|
| - DCHECK(creation_context_);
|
| - creation_context_->creation_type = USER_IMPORT_OLD;
|
| -
|
| - creation_context_->display_name = display_name;
|
| - creation_context_->password = password;
|
| - creation_context_->avatar_index = avatar_index;
|
| -
|
| - creation_context_->sync_user_id = sync_id;
|
| -
|
| - creation_context_->master_key = master_key;
|
| - StartCreationImpl();
|
| -}
|
| -
|
| -void ManagedUserCreationControllerNew::StartImport(
|
| - const base::string16& display_name,
|
| - int avatar_index,
|
| - const std::string& sync_id,
|
| - const std::string& master_key,
|
| - const base::DictionaryValue* password_data,
|
| - const std::string& encryption_key,
|
| - const std::string& signature_key) {
|
| - DCHECK(creation_context_);
|
| - creation_context_->creation_type = USER_IMPORT_NEW;
|
| -
|
| - creation_context_->display_name = display_name;
|
| -
|
| - creation_context_->avatar_index = avatar_index;
|
| -
|
| - creation_context_->sync_user_id = sync_id;
|
| -
|
| - creation_context_->master_key = master_key;
|
| -
|
| - password_data->GetStringWithoutPathExpansion(
|
| - kEncryptedPassword, &creation_context_->salted_password);
|
| -
|
| - creation_context_->signature_key = signature_key;
|
| - creation_context_->encryption_key = encryption_key;
|
| -
|
| - creation_context_->password_data.MergeDictionary(password_data);
|
| -
|
| - StartCreationImpl();
|
| -}
|
| -
|
| -void ManagedUserCreationControllerNew::StartCreationImpl() {
|
| - DCHECK(creation_context_);
|
| - DCHECK_EQ(STAGE_INITIAL, stage_);
|
| - VLOG(1) << "Starting supervised user creation";
|
| - VLOG(1) << " Phase 1 : Prepare keys";
|
| -
|
| - SupervisedUserManager* manager =
|
| - UserManager::Get()->GetSupervisedUserManager();
|
| - manager->StartCreationTransaction(creation_context_->display_name);
|
| -
|
| - creation_context_->local_user_id = manager->GenerateUserId();
|
| - if (creation_context_->creation_type == NEW_USER) {
|
| - creation_context_->sync_user_id =
|
| - SupervisedUserRegistrationUtility::GenerateNewSupervisedUserId();
|
| - }
|
| -
|
| - manager->SetCreationTransactionUserId(creation_context_->local_user_id);
|
| -
|
| - stage_ = TRANSACTION_STARTED;
|
| -
|
| - manager->CreateUserRecord(creation_context_->manager_id,
|
| - creation_context_->local_user_id,
|
| - creation_context_->sync_user_id,
|
| - creation_context_->display_name);
|
| -
|
| - SupervisedUserAuthentication* authentication =
|
| - UserManager::Get()->GetSupervisedUserManager()->GetAuthentication();
|
| -
|
| - // When importing M35+ users we need only to store data, for all other cases
|
| - // we need to create some keys.
|
| - if (creation_context_->creation_type != USER_IMPORT_NEW) {
|
| - // Of all required keys old imported users have only master key.
|
| - // Otherwise they are the same as newly created users in terms of keys.
|
| - if (creation_context_->creation_type == NEW_USER) {
|
| - creation_context_->master_key = authentication->GenerateMasterKey();
|
| - }
|
| -
|
| - base::DictionaryValue extra;
|
| - authentication->FillDataForNewUser(creation_context_->local_user_id,
|
| - creation_context_->password,
|
| - &creation_context_->password_data,
|
| - &extra);
|
| - creation_context_->password_data.GetStringWithoutPathExpansion(
|
| - kEncryptedPassword, &creation_context_->salted_password);
|
| - extra.GetStringWithoutPathExpansion(kPasswordEncryptionKey,
|
| - &creation_context_->encryption_key);
|
| - extra.GetStringWithoutPathExpansion(kPasswordSignatureKey,
|
| - &creation_context_->signature_key);
|
| - }
|
| -
|
| - authentication->StorePasswordData(creation_context_->local_user_id,
|
| - creation_context_->password_data);
|
| - stage_ = KEYS_GENERATED;
|
| -
|
| - VLOG(1) << " Phase 2 : Create cryptohome";
|
| -
|
| - timeout_timer_.Start(
|
| - FROM_HERE,
|
| - base::TimeDelta::FromSeconds(kUserCreationTimeoutSeconds),
|
| - this,
|
| - &ManagedUserCreationControllerNew::CreationTimedOut);
|
| - authenticator_ = new ExtendedAuthenticator(this);
|
| - UserContext user_context;
|
| - user_context.SetKey(Key(creation_context_->master_key));
|
| - authenticator_->TransformKeyIfNeeded(
|
| - user_context,
|
| - base::Bind(&ManagedUserCreationControllerNew::OnKeyTransformedIfNeeded,
|
| - weak_factory_.GetWeakPtr()));
|
| -}
|
| -
|
| -void ManagedUserCreationControllerNew::OnKeyTransformedIfNeeded(
|
| - const UserContext& user_context) {
|
| - VLOG(1) << " Phase 2.1 : Got hashed master key";
|
| - creation_context_->salted_master_key = user_context.GetKey()->GetSecret();
|
| -
|
| - // Create home dir with two keys.
|
| - std::vector<cryptohome::KeyDefinition> keys;
|
| -
|
| - // Main key is the master key. Just as keys for plain GAIA users, it is salted
|
| - // with system salt. It has all usual privileges.
|
| - cryptohome::KeyDefinition master_key(creation_context_->salted_master_key,
|
| - kCryptohomeMasterKeyLabel,
|
| - cryptohome::PRIV_DEFAULT);
|
| -
|
| - keys.push_back(master_key);
|
| - authenticator_->CreateMount(
|
| - creation_context_->local_user_id,
|
| - keys,
|
| - base::Bind(&ManagedUserCreationControllerNew::OnMountSuccess,
|
| - weak_factory_.GetWeakPtr()));
|
| -}
|
| -
|
| -void ManagedUserCreationControllerNew::OnAuthenticationFailure(
|
| - ExtendedAuthenticator::AuthState error) {
|
| - timeout_timer_.Stop();
|
| - ErrorCode code = NO_ERROR;
|
| - switch (error) {
|
| - case ManagedUserAuthenticator::NO_MOUNT:
|
| - code = CRYPTOHOME_NO_MOUNT;
|
| - break;
|
| - case ManagedUserAuthenticator::FAILED_MOUNT:
|
| - code = CRYPTOHOME_FAILED_MOUNT;
|
| - break;
|
| - case ManagedUserAuthenticator::FAILED_TPM:
|
| - code = CRYPTOHOME_FAILED_TPM;
|
| - break;
|
| - default:
|
| - NOTREACHED();
|
| - }
|
| - stage_ = STAGE_ERROR;
|
| - if (consumer_)
|
| - consumer_->OnCreationError(code);
|
| -}
|
| -
|
| -void ManagedUserCreationControllerNew::OnMountSuccess(
|
| - const std::string& mount_hash) {
|
| - DCHECK(creation_context_);
|
| - DCHECK_EQ(KEYS_GENERATED, stage_);
|
| - VLOG(1) << " Phase 2.2 : Created home dir with master key";
|
| -
|
| - creation_context_->mount_hash = mount_hash;
|
| -
|
| - // Plain text password, hashed and salted with individual salt.
|
| - // It can be used for mounting homedir, and can be replaced only when signed.
|
| - cryptohome::KeyDefinition password_key(
|
| - creation_context_->salted_password,
|
| - kCryptohomeSupervisedUserKeyLabel,
|
| - kCryptohomeSupervisedUserKeyPrivileges);
|
| - base::Base64Decode(creation_context_->encryption_key,
|
| - &password_key.encryption_key);
|
| - base::Base64Decode(creation_context_->signature_key,
|
| - &password_key.signature_key);
|
| -
|
| - Key key(Key::KEY_TYPE_SALTED_PBKDF2_AES256_1234,
|
| - std::string(), // The salt is stored elsewhere.
|
| - creation_context_->salted_master_key);
|
| - key.SetLabel(kCryptohomeMasterKeyLabel);
|
| - UserContext context(creation_context_->local_user_id);
|
| - context.SetKey(key);
|
| - context.SetIsUsingOAuth(false);
|
| -
|
| - authenticator_->AddKey(
|
| - context,
|
| - password_key,
|
| - true,
|
| - base::Bind(&ManagedUserCreationControllerNew::OnAddKeySuccess,
|
| - weak_factory_.GetWeakPtr()));
|
| -}
|
| -
|
| -void ManagedUserCreationControllerNew::OnAddKeySuccess() {
|
| - DCHECK(creation_context_);
|
| - DCHECK_EQ(KEYS_GENERATED, stage_);
|
| - stage_ = CRYPTOHOME_CREATED;
|
| -
|
| - VLOG(1) << " Phase 3 : Create/update user on chrome.com/manage";
|
| -
|
| - ProfileSyncService* sync_service =
|
| - ProfileSyncServiceFactory::GetInstance()->GetForProfile(
|
| - creation_context_->manager_profile);
|
| - ProfileSyncService::SyncStatusSummary status =
|
| - sync_service->QuerySyncStatusSummary();
|
| -
|
| - if (status == ProfileSyncService::DATATYPES_NOT_INITIALIZED)
|
| - consumer_->OnLongCreationWarning();
|
| -
|
| - creation_context_->registration_utility =
|
| - SupervisedUserRegistrationUtility::Create(
|
| - creation_context_->manager_profile);
|
| -
|
| - SupervisedUserRegistrationInfo info(creation_context_->display_name,
|
| - creation_context_->avatar_index);
|
| - info.master_key = creation_context_->master_key;
|
| - info.password_signature_key = creation_context_->signature_key;
|
| - info.password_encryption_key = creation_context_->encryption_key;
|
| -
|
| - info.password_data.MergeDictionary(&creation_context_->password_data);
|
| -
|
| - // Registration utility will update user data if user already exist.
|
| - creation_context_->registration_utility->Register(
|
| - creation_context_->sync_user_id,
|
| - info,
|
| - base::Bind(&ManagedUserCreationControllerNew::RegistrationCallback,
|
| - weak_factory_.GetWeakPtr()));
|
| -}
|
| -
|
| -void ManagedUserCreationControllerNew::RegistrationCallback(
|
| - const GoogleServiceAuthError& error,
|
| - const std::string& token) {
|
| - DCHECK(creation_context_);
|
| - DCHECK_EQ(CRYPTOHOME_CREATED, stage_);
|
| -
|
| - stage_ = DASHBOARD_CREATED;
|
| -
|
| - if (error.state() == GoogleServiceAuthError::NONE) {
|
| - creation_context_->token = token;
|
| -
|
| - PostTaskAndReplyWithResult(
|
| - content::BrowserThread::GetBlockingPool(),
|
| - FROM_HERE,
|
| - base::Bind(&StoreManagedUserFiles,
|
| - creation_context_->token,
|
| - MountManager::GetHomeDir(creation_context_->mount_hash)),
|
| - base::Bind(&ManagedUserCreationControllerNew::OnManagedUserFilesStored,
|
| - weak_factory_.GetWeakPtr()));
|
| - } else {
|
| - stage_ = STAGE_ERROR;
|
| - LOG(ERROR) << "Managed user creation failed. Error code " << error.state();
|
| - if (consumer_)
|
| - consumer_->OnCreationError(CLOUD_SERVER_ERROR);
|
| - }
|
| -}
|
| -
|
| -void ManagedUserCreationControllerNew::OnManagedUserFilesStored(bool success) {
|
| - DCHECK(creation_context_);
|
| - DCHECK_EQ(DASHBOARD_CREATED, stage_);
|
| -
|
| - if (!success) {
|
| - stage_ = STAGE_ERROR;
|
| - if (consumer_)
|
| - consumer_->OnCreationError(TOKEN_WRITE_FAILED);
|
| - return;
|
| - }
|
| - // Assume that new token is valid. It will be automatically invalidated if
|
| - // sync service fails to use it.
|
| - UserManager::Get()->SaveUserOAuthStatus(creation_context_->local_user_id,
|
| - User::OAUTH2_TOKEN_STATUS_VALID);
|
| -
|
| - stage_ = TOKEN_WRITTEN;
|
| -
|
| - timeout_timer_.Stop();
|
| - UserManager::Get()->GetSupervisedUserManager()->CommitCreationTransaction();
|
| - content::RecordAction(
|
| - base::UserMetricsAction("ManagedMode_LocallyManagedUserCreated"));
|
| -
|
| - stage_ = TRANSACTION_COMMITTED;
|
| -
|
| - if (consumer_)
|
| - consumer_->OnCreationSuccess();
|
| -}
|
| -
|
| -void ManagedUserCreationControllerNew::CreationTimedOut() {
|
| - LOG(ERROR) << "Supervised user creation timed out. stage = " << stage_;
|
| - if (consumer_)
|
| - consumer_->OnCreationTimeout();
|
| -}
|
| -
|
| -void ManagedUserCreationControllerNew::FinishCreation() {
|
| - chrome::AttemptUserExit();
|
| -}
|
| -
|
| -void ManagedUserCreationControllerNew::CancelCreation() {
|
| - creation_context_->registration_utility.reset();
|
| - chrome::AttemptUserExit();
|
| -}
|
| -
|
| -std::string ManagedUserCreationControllerNew::GetManagedUserId() {
|
| - DCHECK(creation_context_);
|
| - return creation_context_->local_user_id;
|
| -}
|
| -
|
| -} // namespace chromeos
|
|
|