| Index: chrome/browser/managed_mode/chromeos/manager_password_service.cc
|
| diff --git a/chrome/browser/managed_mode/chromeos/manager_password_service.cc b/chrome/browser/managed_mode/chromeos/manager_password_service.cc
|
| deleted file mode 100644
|
| index 0548b12cb58765d324338a1c1fffb71b4057ff02..0000000000000000000000000000000000000000
|
| --- a/chrome/browser/managed_mode/chromeos/manager_password_service.cc
|
| +++ /dev/null
|
| @@ -1,268 +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/managed_mode/chromeos/manager_password_service.h"
|
| -
|
| -#include "base/bind.h"
|
| -#include "base/logging.h"
|
| -#include "base/metrics/histogram.h"
|
| -#include "base/values.h"
|
| -#include "chrome/browser/chromeos/login/auth/key.h"
|
| -#include "chrome/browser/chromeos/login/auth/user_context.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/managed_mode/managed_user_constants.h"
|
| -#include "chrome/browser/managed_mode/managed_user_sync_service.h"
|
| -
|
| -namespace chromeos {
|
| -
|
| -ManagerPasswordService::ManagerPasswordService() : weak_ptr_factory_(this) {}
|
| -
|
| -ManagerPasswordService::~ManagerPasswordService() {}
|
| -
|
| -void ManagerPasswordService::Init(
|
| - const std::string& user_id,
|
| - ManagedUserSyncService* user_service,
|
| - ManagedUserSharedSettingsService* shared_settings_service) {
|
| - user_id_ = user_id;
|
| - user_service_ = user_service;
|
| - settings_service_ = shared_settings_service;
|
| - settings_service_subscription_ = settings_service_->Subscribe(
|
| - base::Bind(&ManagerPasswordService::OnSharedSettingsChange,
|
| - weak_ptr_factory_.GetWeakPtr()));
|
| -
|
| - authenticator_ = new ExtendedAuthenticator(this);
|
| -
|
| - UserManager* user_manager = UserManager::Get();
|
| -
|
| - SupervisedUserManager* supervised_user_manager =
|
| - user_manager->GetSupervisedUserManager();
|
| -
|
| - const UserList& users = user_manager->GetUsers();
|
| -
|
| - for (UserList::const_iterator it = users.begin(); it != users.end(); ++it) {
|
| - if ((*it)->GetType() != User::USER_TYPE_LOCALLY_MANAGED)
|
| - continue;
|
| - if (user_id != supervised_user_manager->GetManagerUserId((*it)->email()))
|
| - continue;
|
| - OnSharedSettingsChange(
|
| - supervised_user_manager->GetUserSyncId((*it)->email()),
|
| - managed_users::kChromeOSPasswordData);
|
| - }
|
| -}
|
| -
|
| -void ManagerPasswordService::OnSharedSettingsChange(
|
| - const std::string& mu_id,
|
| - const std::string& key) {
|
| - if (key != managed_users::kChromeOSPasswordData)
|
| - return;
|
| -
|
| - SupervisedUserManager* supervised_user_manager =
|
| - UserManager::Get()->GetSupervisedUserManager();
|
| - const User* user = supervised_user_manager->FindBySyncId(mu_id);
|
| - // No user on device.
|
| - if (user == NULL)
|
| - return;
|
| -
|
| - const base::Value* value = settings_service_->GetValue(mu_id, key);
|
| -
|
| - if (value == NULL) {
|
| - LOG(WARNING) << "Got empty value from sync.";
|
| - return;
|
| - }
|
| - const base::DictionaryValue* dict;
|
| - if (!value->GetAsDictionary(&dict)) {
|
| - LOG(WARNING) << "Got non-dictionary value from sync.";
|
| - return;
|
| - }
|
| -
|
| - SupervisedUserAuthentication* auth =
|
| - supervised_user_manager->GetAuthentication();
|
| -
|
| - if (!auth->NeedPasswordChange(user->email(), dict) &&
|
| - !auth->HasIncompleteKey(user->email())) {
|
| - return;
|
| - }
|
| - scoped_ptr<base::DictionaryValue> wrapper(dict->DeepCopy());
|
| - user_service_->GetManagedUsersAsync(
|
| - base::Bind(&ManagerPasswordService::GetManagedUsersCallback,
|
| - weak_ptr_factory_.GetWeakPtr(),
|
| - mu_id,
|
| - user->email(),
|
| - Passed(&wrapper)));
|
| -}
|
| -
|
| -void ManagerPasswordService::GetManagedUsersCallback(
|
| - const std::string& sync_mu_id,
|
| - const std::string& user_id,
|
| - scoped_ptr<base::DictionaryValue> password_data,
|
| - const base::DictionaryValue* managed_users) {
|
| - const base::DictionaryValue* managed_user = NULL;
|
| - if (!managed_users->GetDictionary(sync_mu_id, &managed_user))
|
| - return;
|
| - std::string master_key;
|
| - std::string encryption_key;
|
| - std::string signature_key;
|
| - if (!managed_user->GetString(ManagedUserSyncService::kMasterKey,
|
| - &master_key)) {
|
| - LOG(WARNING) << "Can not apply password change to " << user_id
|
| - << ": no master key found";
|
| - UMA_HISTOGRAM_ENUMERATION(
|
| - "ManagedUsers.ChromeOS.PasswordChange",
|
| - SupervisedUserAuthentication::PASSWORD_CHANGE_FAILED_NO_MASTER_KEY,
|
| - SupervisedUserAuthentication::PASSWORD_CHANGE_RESULT_MAX_VALUE);
|
| - return;
|
| - }
|
| -
|
| - if (!managed_user->GetString(ManagedUserSyncService::kPasswordSignatureKey,
|
| - &signature_key) ||
|
| - !managed_user->GetString(ManagedUserSyncService::kPasswordEncryptionKey,
|
| - &encryption_key)) {
|
| - LOG(WARNING) << "Can not apply password change to " << user_id
|
| - << ": no signature / encryption keys.";
|
| - UMA_HISTOGRAM_ENUMERATION(
|
| - "ManagedUsers.ChromeOS.PasswordChange",
|
| - SupervisedUserAuthentication::PASSWORD_CHANGE_FAILED_NO_SIGNATURE_KEY,
|
| - SupervisedUserAuthentication::PASSWORD_CHANGE_RESULT_MAX_VALUE);
|
| - return;
|
| - }
|
| -
|
| - UserContext manager_key(user_id);
|
| - manager_key.SetKey(Key(master_key));
|
| - manager_key.SetIsUsingOAuth(false);
|
| -
|
| - // As master key can have old label, leave label field empty - it will work
|
| - // as wildcard.
|
| -
|
| - std::string new_key;
|
| - int revision;
|
| -
|
| - bool has_data = password_data->GetStringWithoutPathExpansion(
|
| - kEncryptedPassword, &new_key);
|
| - has_data &= password_data->GetIntegerWithoutPathExpansion(kPasswordRevision,
|
| - &revision);
|
| - if (!has_data) {
|
| - LOG(WARNING) << "Can not apply password change to " << user_id
|
| - << ": incomplete password data.";
|
| - UMA_HISTOGRAM_ENUMERATION(
|
| - "ManagedUsers.ChromeOS.PasswordChange",
|
| - SupervisedUserAuthentication::PASSWORD_CHANGE_FAILED_NO_PASSWORD_DATA,
|
| - SupervisedUserAuthentication::PASSWORD_CHANGE_RESULT_MAX_VALUE);
|
| - return;
|
| - }
|
| -
|
| - cryptohome::KeyDefinition new_key_definition(
|
| - new_key,
|
| - kCryptohomeManagedUserKeyLabel,
|
| - cryptohome::PRIV_AUTHORIZED_UPDATE || cryptohome::PRIV_MOUNT);
|
| - new_key_definition.revision = revision;
|
| -
|
| - new_key_definition.encryption_key = encryption_key;
|
| - new_key_definition.signature_key = signature_key;
|
| -
|
| - authenticator_->AddKey(manager_key,
|
| - new_key_definition,
|
| - true /* replace existing */,
|
| - base::Bind(&ManagerPasswordService::OnAddKeySuccess,
|
| - weak_ptr_factory_.GetWeakPtr(),
|
| - manager_key,
|
| - user_id,
|
| - Passed(&password_data)));
|
| -}
|
| -
|
| -void ManagerPasswordService::OnAuthenticationFailure(
|
| - ExtendedAuthenticator::AuthState state) {
|
| - UMA_HISTOGRAM_ENUMERATION(
|
| - "ManagedUsers.ChromeOS.PasswordChange",
|
| - SupervisedUserAuthentication::PASSWORD_CHANGE_FAILED_MASTER_KEY_FAILURE,
|
| - SupervisedUserAuthentication::PASSWORD_CHANGE_RESULT_MAX_VALUE);
|
| - LOG(ERROR) << "Can not apply password change, master key failure";
|
| -}
|
| -
|
| -void ManagerPasswordService::OnAddKeySuccess(
|
| - const UserContext& master_key_context,
|
| - const std::string& user_id,
|
| - scoped_ptr<base::DictionaryValue> password_data) {
|
| - VLOG(0) << "Password changed for " << user_id;
|
| - UMA_HISTOGRAM_ENUMERATION(
|
| - "ManagedUsers.ChromeOS.PasswordChange",
|
| - SupervisedUserAuthentication::PASSWORD_CHANGED_IN_MANAGER_SESSION,
|
| - SupervisedUserAuthentication::PASSWORD_CHANGE_RESULT_MAX_VALUE);
|
| -
|
| - SupervisedUserAuthentication* auth =
|
| - UserManager::Get()->GetSupervisedUserManager()->GetAuthentication();
|
| - int old_schema = auth->GetPasswordSchema(user_id);
|
| - auth->StorePasswordData(user_id, *password_data.get());
|
| -
|
| - if (auth->HasIncompleteKey(user_id))
|
| - auth->MarkKeyIncomplete(user_id, false /* key is complete now */);
|
| -
|
| - // Check if we have legacy labels for keys.
|
| - // TODO(antrim): Migrate it to GetLabels call once wad@ implement it.
|
| - if (old_schema == SupervisedUserAuthentication::SCHEMA_PLAIN) {
|
| - // 1) Add new manager key (using old key).
|
| - // 2) Remove old supervised user key.
|
| - // 3) Remove old manager key.
|
| - authenticator_->TransformKeyIfNeeded(
|
| - master_key_context,
|
| - base::Bind(&ManagerPasswordService::OnKeyTransformedIfNeeded,
|
| - weak_ptr_factory_.GetWeakPtr()));
|
| - }
|
| -}
|
| -
|
| -void ManagerPasswordService::OnKeyTransformedIfNeeded(
|
| - const UserContext& master_key_context) {
|
| - const Key* const key = master_key_context.GetKey();
|
| - DCHECK_NE(Key::KEY_TYPE_PASSWORD_PLAIN, key->GetKeyType());
|
| - cryptohome::KeyDefinition new_master_key(key->GetSecret(),
|
| - kCryptohomeMasterKeyLabel,
|
| - cryptohome::PRIV_DEFAULT);
|
| - // Use new master key for further actions.
|
| - UserContext new_master_key_context = master_key_context;
|
| - new_master_key_context.GetKey()->SetLabel(kCryptohomeMasterKeyLabel);
|
| - authenticator_->AddKey(
|
| - master_key_context,
|
| - new_master_key,
|
| - true /* replace existing */,
|
| - base::Bind(&ManagerPasswordService::OnNewManagerKeySuccess,
|
| - weak_ptr_factory_.GetWeakPtr(),
|
| - new_master_key_context));
|
| -}
|
| -
|
| -void ManagerPasswordService::OnNewManagerKeySuccess(
|
| - const UserContext& master_key_context) {
|
| - VLOG(1) << "Added new master key for " << master_key_context.GetUserID();
|
| - authenticator_->RemoveKey(
|
| - master_key_context,
|
| - kLegacyCryptohomeManagedUserKeyLabel,
|
| - base::Bind(&ManagerPasswordService::OnOldManagedUserKeyDeleted,
|
| - weak_ptr_factory_.GetWeakPtr(),
|
| - master_key_context));
|
| -}
|
| -
|
| -void ManagerPasswordService::OnOldManagedUserKeyDeleted(
|
| - const UserContext& master_key_context) {
|
| - VLOG(1) << "Removed old managed user key for "
|
| - << master_key_context.GetUserID();
|
| - authenticator_->RemoveKey(
|
| - master_key_context,
|
| - kLegacyCryptohomeMasterKeyLabel,
|
| - base::Bind(&ManagerPasswordService::OnOldManagerKeyDeleted,
|
| - weak_ptr_factory_.GetWeakPtr(),
|
| - master_key_context));
|
| -}
|
| -
|
| -void ManagerPasswordService::OnOldManagerKeyDeleted(
|
| - const UserContext& master_key_context) {
|
| - VLOG(1) << "Removed old master key for " << master_key_context.GetUserID();
|
| -}
|
| -
|
| -void ManagerPasswordService::Shutdown() {
|
| - settings_service_subscription_.reset();
|
| -}
|
| -
|
| -} // namespace chromeos
|
|
|