blob: fd01464160da61568b54782c055a4feae6b6c7f3 [file] [log] [blame]
// 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 "components/user_manager/user_manager.h"
#include "base/logging.h"
#include "components/account_id/account_id.h"
namespace user_manager {
const char kRegularUsersPref[] = "LoggedInUsers";
UserManager* UserManager::instance = nullptr;
UserManager::Observer::~Observer() = default;
void UserManager::Observer::LocalStateChanged(UserManager* user_manager) {}
void UserManager::Observer::OnUserImageChanged(const User& user) {}
void UserManager::Observer::OnUserProfileImageUpdateFailed(const User& user) {}
void UserManager::Observer::OnUserProfileImageUpdated(
const User& user,
const gfx::ImageSkia& profile_image) {}
void UserManager::Observer::OnUsersSignInConstraintsChanged() {}
void UserManager::UserSessionStateObserver::ActiveUserChanged(
User* active_user) {}
void UserManager::UserSessionStateObserver::UserAddedToSession(
const User* active_user) {}
void UserManager::UserSessionStateObserver::ActiveUserHashChanged(
const std::string& hash) {}
UserManager::UserSessionStateObserver::~UserSessionStateObserver() {}
UserManager::UserAccountData::UserAccountData(
const std::u16string& display_name,
const std::u16string& given_name,
const std::string& locale)
: display_name_(display_name), given_name_(given_name), locale_(locale) {}
UserManager::UserAccountData::~UserAccountData() {}
void UserManager::Initialize() {
DCHECK(!UserManager::instance);
UserManager::SetInstance(this);
}
// static
bool UserManager::IsInitialized() {
return UserManager::instance;
}
void UserManager::Destroy() {
DCHECK(UserManager::instance == this);
UserManager::SetInstance(nullptr);
}
// static
UserManager* user_manager::UserManager::Get() {
CHECK(UserManager::instance);
return UserManager::instance;
}
UserManager::~UserManager() {
}
// static
void UserManager::SetInstance(UserManager* user_manager) {
UserManager::instance = user_manager;
}
// static
UserManager* user_manager::UserManager::GetForTesting() {
return UserManager::instance;
}
// static
UserManager* UserManager::SetForTesting(UserManager* user_manager) {
UserManager* previous_instance = UserManager::instance;
UserManager::instance = user_manager;
return previous_instance;
}
UserType UserManager::CalculateUserType(const AccountId& account_id,
const User* user,
const bool browser_restart,
const bool is_child) const {
if (IsGuestAccountId(account_id))
return USER_TYPE_GUEST;
// This may happen after browser crash after device account was marked for
// removal, but before clean exit.
if (browser_restart && IsDeviceLocalAccountMarkedForRemoval(account_id))
return USER_TYPE_PUBLIC_ACCOUNT;
// If user already exists
if (user) {
// This branch works for any other user type, including PUBLIC_ACCOUNT.
const UserType user_type = user->GetType();
if (user_type == USER_TYPE_CHILD || user_type == USER_TYPE_REGULAR) {
const UserType new_user_type =
is_child ? USER_TYPE_CHILD : USER_TYPE_REGULAR;
if (new_user_type != user_type) {
LOG(WARNING) << "Child user type has changed: " << user_type << " => "
<< new_user_type;
}
return new_user_type;
} else if (is_child) {
LOG(FATAL) << "Incorrect child user type " << user_type;
}
// TODO (rsorokin): Check for reverse: account_id AD type should imply
// AD user type.
if (user_type == USER_TYPE_ACTIVE_DIRECTORY &&
account_id.GetAccountType() != AccountType::ACTIVE_DIRECTORY) {
LOG(FATAL) << "Incorrect AD user type " << user_type;
}
return user_type;
}
// User is new
if (is_child)
return USER_TYPE_CHILD;
if (IsDeprecatedSupervisedAccountId(account_id))
return USER_TYPE_SUPERVISED_DEPRECATED;
if (account_id.GetAccountType() == AccountType::ACTIVE_DIRECTORY)
return USER_TYPE_ACTIVE_DIRECTORY;
return USER_TYPE_REGULAR;
}
} // namespace user_manager