summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--ash/test/test_session_state_delegate.cc2
-rw-r--r--chrome/browser/chromeos/login/app_launch_signin_screen.cc3
-rw-r--r--chrome/browser/chromeos/login/app_launch_signin_screen.h4
-rw-r--r--chrome/browser/chromeos/login/screens/chrome_user_selection_screen.cc33
-rw-r--r--chrome/browser/chromeos/login/screens/chrome_user_selection_screen.h10
-rw-r--r--chrome/browser/chromeos/login/screens/user_selection_screen.cc96
-rw-r--r--chrome/browser/chromeos/login/screens/user_selection_screen.h26
-rw-r--r--chrome/browser/chromeos/login/signin_screen_controller.cc4
-rw-r--r--chrome/browser/chromeos/login/signin_screen_controller.h2
-rw-r--r--chrome/browser/chromeos/login/supervised/supervised_user_test_base.cc3
-rw-r--r--chrome/browser/chromeos/login/ui/models/user_board_model.h6
-rw-r--r--chrome/browser/chromeos/login/ui/views/user_board_view.h12
-rw-r--r--chrome/browser/chromeos/login/ui/webui_login_display.cc4
-rw-r--r--chrome/browser/chromeos/login/ui/webui_login_display.h2
-rw-r--r--chrome/browser/chromeos/policy/device_local_account_browsertest.cc42
-rw-r--r--chrome/browser/ui/webui/chromeos/login/gaia_screen_handler.cc6
-rw-r--r--chrome/browser/ui/webui/chromeos/login/signin_screen_handler.cc69
-rw-r--r--chrome/browser/ui/webui/chromeos/login/signin_screen_handler.h25
-rw-r--r--chrome/browser/ui/webui/chromeos/login/signin_userlist_unittest.cc13
-rw-r--r--chrome/browser/ui/webui/chromeos/login/supervised_user_creation_screen_handler.cc29
-rw-r--r--chrome/browser/ui/webui/chromeos/login/supervised_user_creation_screen_handler.h10
-rw-r--r--chrome/browser/ui/webui/chromeos/login/user_board_screen_handler.cc35
-rw-r--r--chrome/browser/ui/webui/chromeos/login/user_board_screen_handler.h16
-rw-r--r--chrome/browser/ui/webui/options/chromeos/user_image_source.cc18
-rw-r--r--components/login.gypi1
-rw-r--r--components/login/BUILD.gn1
-rw-r--r--components/login/DEPS1
-rw-r--r--components/login/base_screen_handler_utils.cc23
-rw-r--r--components/login/base_screen_handler_utils.h20
-rw-r--r--components/signin/core/account_id/account_id.cc48
-rw-r--r--components/signin/core/account_id/account_id.h9
-rw-r--r--components/user_manager/empty_user_info.cc2
-rw-r--r--components/user_manager/empty_user_info.h2
-rw-r--r--components/user_manager/user.cc5
-rw-r--r--components/user_manager/user.h2
-rw-r--r--components/user_manager/user_info.h2
-rw-r--r--components/user_manager/user_info_impl.cc10
-rw-r--r--components/user_manager/user_info_impl.h4
-rw-r--r--components/user_manager/user_manager_base.cc52
-rw-r--r--components/user_manager/user_manager_base.h10
40 files changed, 416 insertions, 246 deletions
diff --git a/ash/test/test_session_state_delegate.cc b/ash/test/test_session_state_delegate.cc
index d7e8fbb..afab25d 100644
--- a/ash/test/test_session_state_delegate.cc
+++ b/ash/test/test_session_state_delegate.cc
@@ -56,7 +56,7 @@ class MockUserInfo : public user_manager::UserInfo {
std::string GetEmail() const override { return display_email_; }
- AccountId GetAccountId() const override { return account_id_; }
+ const AccountId& GetAccountId() const override { return account_id_; }
const gfx::ImageSkia& GetImage() const override { return user_image_; }
diff --git a/chrome/browser/chromeos/login/app_launch_signin_screen.cc b/chrome/browser/chromeos/login/app_launch_signin_screen.cc
index b841c3d..61fa439 100644
--- a/chrome/browser/chromeos/login/app_launch_signin_screen.cc
+++ b/chrome/browser/chromeos/login/app_launch_signin_screen.cc
@@ -214,8 +214,7 @@ void AppLaunchSigninScreen::HandleGetUsers() {
webui_handler_->LoadUsers(users_list, false);
}
-void AppLaunchSigninScreen::CheckUserStatus(const std::string& user_id) {
-}
+void AppLaunchSigninScreen::CheckUserStatus(const AccountId& account_id) {}
bool AppLaunchSigninScreen::IsUserWhitelisted(const std::string& user_id) {
NOTREACHED();
diff --git a/chrome/browser/chromeos/login/app_launch_signin_screen.h b/chrome/browser/chromeos/login/app_launch_signin_screen.h
index 1e8cbd4..14dfec1 100644
--- a/chrome/browser/chromeos/login/app_launch_signin_screen.h
+++ b/chrome/browser/chromeos/login/app_launch_signin_screen.h
@@ -15,6 +15,8 @@
#include "components/user_manager/user.h"
#include "components/user_manager/user_manager.h"
+class AccountId;
+
namespace chromeos {
class OobeUI;
@@ -77,7 +79,7 @@ class AppLaunchSigninScreen : public SigninScreenHandlerDelegate,
void SetDisplayEmail(const std::string& email) override;
void Signout() override;
void HandleGetUsers() override;
- void CheckUserStatus(const std::string& user_id) override;
+ void CheckUserStatus(const AccountId& account_id) override;
bool IsUserWhitelisted(const std::string& user_id) override;
// AuthStatusConsumer implementation:
diff --git a/chrome/browser/chromeos/login/screens/chrome_user_selection_screen.cc b/chrome/browser/chromeos/login/screens/chrome_user_selection_screen.cc
index e309e13..196b81b 100644
--- a/chrome/browser/chromeos/login/screens/chrome_user_selection_screen.cc
+++ b/chrome/browser/chromeos/login/screens/chrome_user_selection_screen.cc
@@ -77,19 +77,20 @@ void ChromeUserSelectionScreen::OnDeviceLocalAccountsChanged() {
void ChromeUserSelectionScreen::CheckForPublicSessionDisplayNameChange(
policy::DeviceLocalAccountPolicyBroker* broker) {
- const std::string& user_id = broker->user_id();
+ const AccountId& account_id = GetAccountIdOfKnownUser(broker->user_id());
+ DCHECK(account_id.is_valid());
const std::string& display_name = broker->GetDisplayName();
- if (display_name == public_session_display_names_[user_id])
+ if (display_name == public_session_display_names_[account_id])
return;
- public_session_display_names_[user_id] = display_name;
+ public_session_display_names_[account_id] = display_name;
if (!handler_initialized_)
return;
if (!display_name.empty()) {
// If a new display name was set by policy, notify the UI about it.
- view_->SetPublicSessionDisplayName(user_id, display_name);
+ view_->SetPublicSessionDisplayName(account_id, display_name);
return;
}
@@ -101,13 +102,13 @@ void ChromeUserSelectionScreen::CheckForPublicSessionDisplayNameChange(
base::MessageLoop::current()->PostTask(
FROM_HERE,
base::Bind(&ChromeUserSelectionScreen::SetPublicSessionDisplayName,
- weak_factory_.GetWeakPtr(),
- user_id));
+ weak_factory_.GetWeakPtr(), account_id));
}
void ChromeUserSelectionScreen::CheckForPublicSessionLocalePolicyChange(
policy::DeviceLocalAccountPolicyBroker* broker) {
- const std::string& user_id = broker->user_id();
+ const AccountId& account_id = GetAccountIdOfKnownUser(broker->user_id());
+ DCHECK(account_id.is_valid());
const policy::PolicyMap::Entry* entry =
broker->core()->store()->policy_map().Get(policy::key::kSessionLocales);
@@ -131,30 +132,30 @@ void ChromeUserSelectionScreen::CheckForPublicSessionLocalePolicyChange(
}
std::vector<std::string>& recommended_locales =
- public_session_recommended_locales_[user_id];
+ public_session_recommended_locales_[account_id];
if (new_recommended_locales != recommended_locales)
- SetPublicSessionLocales(user_id, new_recommended_locales);
+ SetPublicSessionLocales(account_id, new_recommended_locales);
if (new_recommended_locales.empty())
- public_session_recommended_locales_.erase(user_id);
+ public_session_recommended_locales_.erase(account_id);
else
recommended_locales = new_recommended_locales;
}
void ChromeUserSelectionScreen::SetPublicSessionDisplayName(
- const std::string& user_id) {
- const user_manager::User* user = user_manager::UserManager::Get()->FindUser(
- AccountId::FromUserEmail(user_id));
+ const AccountId& account_id) {
+ const user_manager::User* user =
+ user_manager::UserManager::Get()->FindUser(account_id);
if (!user || user->GetType() != user_manager::USER_TYPE_PUBLIC_ACCOUNT)
return;
- view_->SetPublicSessionDisplayName(user_id,
+ view_->SetPublicSessionDisplayName(account_id,
base::UTF16ToUTF8(user->GetDisplayName()));
}
void ChromeUserSelectionScreen::SetPublicSessionLocales(
- const std::string& user_id,
+ const AccountId& account_id,
const std::vector<std::string>& recommended_locales) {
if (!handler_initialized_)
return;
@@ -178,7 +179,7 @@ void ChromeUserSelectionScreen::SetPublicSessionLocales(
const bool two_or_more_recommended_locales = recommended_locales.size() >= 2;
// Notify the UI.
- view_->SetPublicSessionLocales(user_id, available_locales.Pass(),
+ view_->SetPublicSessionLocales(account_id, available_locales.Pass(),
default_locale,
two_or_more_recommended_locales);
}
diff --git a/chrome/browser/chromeos/login/screens/chrome_user_selection_screen.h b/chrome/browser/chromeos/login/screens/chrome_user_selection_screen.h
index e276911..11ab0d3 100644
--- a/chrome/browser/chromeos/login/screens/chrome_user_selection_screen.h
+++ b/chrome/browser/chromeos/login/screens/chrome_user_selection_screen.h
@@ -15,6 +15,8 @@
#include "chrome/browser/chromeos/login/screens/user_selection_screen.h"
#include "chrome/browser/chromeos/policy/device_local_account_policy_service.h"
+class AccountId;
+
namespace chromeos {
class ChromeUserSelectionScreen
@@ -45,20 +47,20 @@ class ChromeUserSelectionScreen
// Notify the UI that the display name for a public session has changed,
// taking the display name from the |User| owned by |UserManager|.
- void SetPublicSessionDisplayName(const std::string& user_id);
+ void SetPublicSessionDisplayName(const AccountId& account_id);
// Send an updated list of locales for a public session to the UI, consisting
// of the |recommended_locales| followed by all other available locales.
void SetPublicSessionLocales(
- const std::string& user_id,
+ const AccountId& account_id,
const std::vector<std::string>& recommended_locales);
bool handler_initialized_;
policy::DeviceLocalAccountPolicyService* device_local_account_policy_service_;
- // Map from public session user IDs to their display names set by policy.
- typedef std::map<std::string, std::string> DisplayNamesMap;
+ // Map from public session account IDs to their display names set by policy.
+ typedef std::map<AccountId, std::string> DisplayNamesMap;
DisplayNamesMap public_session_display_names_;
base::WeakPtrFactory<ChromeUserSelectionScreen> weak_factory_;
diff --git a/chrome/browser/chromeos/login/screens/user_selection_screen.cc b/chrome/browser/chromeos/login/screens/user_selection_screen.cc
index 37bb77b..645f100 100644
--- a/chrome/browser/chromeos/login/screens/user_selection_screen.cc
+++ b/chrome/browser/chromeos/login/screens/user_selection_screen.cc
@@ -148,7 +148,7 @@ void UserSelectionScreen::FillUserDictionary(
user->GetType() == user_manager::USER_TYPE_SUPERVISED;
const bool is_child_user = user->GetType() == user_manager::USER_TYPE_CHILD;
- user_dict->SetString(kKeyUsername, user->GetAccountId().GetUserEmail());
+ user_dict->SetString(kKeyUsername, user->GetAccountId().Serialize());
user_dict->SetString(kKeyEmailAddress, user->display_email());
user_dict->SetString(kKeyDisplayName, user->GetDisplayName());
user_dict->SetBoolean(kKeyPublicAccount, is_public_session);
@@ -246,6 +246,26 @@ bool UserSelectionScreen::ShouldForceOnlineSignIn(
(token_status == user_manager::User::OAUTH_TOKEN_STATUS_UNKNOWN);
}
+// static
+AccountId UserSelectionScreen::GetAccountIdOfKnownUser(
+ const std::string& user_id) {
+ if (user_id.empty())
+ return EmptyAccountId();
+
+ const AccountId initial_account_id = AccountId::FromUserEmail(user_id);
+
+ user_manager::UserManager* user_manager = user_manager::UserManager::Get();
+ if (!user_manager)
+ return initial_account_id;
+
+ AccountId known_account_id(EmptyAccountId());
+ if (user_manager->GetKnownUserAccountId(initial_account_id,
+ &known_account_id))
+ return known_account_id;
+
+ return initial_account_id;
+}
+
void UserSelectionScreen::SetHandler(LoginDisplayWebUIHandler* handler) {
handler_ = handler;
}
@@ -306,18 +326,17 @@ void UserSelectionScreen::OnUserActivity(const ui::Event* event) {
// static
const user_manager::UserList UserSelectionScreen::PrepareUserListForSending(
const user_manager::UserList& users,
- std::string owner,
+ const AccountId& owner,
bool is_signin_to_add) {
user_manager::UserList users_to_send;
- bool has_owner = owner.size() > 0;
+ bool has_owner = owner.is_valid();
size_t max_non_owner_users = has_owner ? kMaxUsers - 1 : kMaxUsers;
size_t non_owner_count = 0;
for (user_manager::UserList::const_iterator it = users.begin();
it != users.end();
++it) {
- const std::string& user_id = (*it)->email();
- bool is_owner = (user_id == owner);
+ bool is_owner = ((*it)->GetAccountId() == owner);
bool is_public_account =
((*it)->GetType() == user_manager::USER_TYPE_PUBLIC_ACCOUNT);
@@ -347,8 +366,10 @@ void UserSelectionScreen::SendUserList() {
bool single_user = users_.size() == 1;
bool is_signin_to_add = LoginDisplayHostImpl::default_host() &&
user_manager::UserManager::Get()->IsUserLoggedIn();
- std::string owner;
- chromeos::CrosSettings::Get()->GetString(chromeos::kDeviceOwner, &owner);
+ std::string owner_email;
+ chromeos::CrosSettings::Get()->GetString(chromeos::kDeviceOwner,
+ &owner_email);
+ const AccountId owner(GetAccountIdOfKnownUser(owner_email));
policy::BrowserPolicyConnectorChromeOS* connector =
g_browser_process->platform_part()->browser_policy_connector_chromeos();
@@ -363,22 +384,22 @@ void UserSelectionScreen::SendUserList() {
for (user_manager::UserList::const_iterator it = users_to_send.begin();
it != users_to_send.end();
++it) {
- const std::string& user_id = (*it)->email();
- bool is_owner = (user_id == owner);
+ const AccountId& account_id = (*it)->GetAccountId();
+ bool is_owner = (account_id == owner);
const bool is_public_account =
((*it)->GetType() == user_manager::USER_TYPE_PUBLIC_ACCOUNT);
const AuthType initial_auth_type =
is_public_account ? EXPAND_THEN_USER_CLICK
: (ShouldForceOnlineSignIn(*it) ? ONLINE_SIGN_IN
: OFFLINE_PASSWORD);
- user_auth_type_map_[user_id] = initial_auth_type;
+ user_auth_type_map_[account_id] = initial_auth_type;
base::DictionaryValue* user_dict = new base::DictionaryValue();
const std::vector<std::string>* public_session_recommended_locales =
- public_session_recommended_locales_.find(user_id) ==
- public_session_recommended_locales_.end() ?
- &kEmptyRecommendedLocales :
- &public_session_recommended_locales_[user_id];
+ public_session_recommended_locales_.find(account_id) ==
+ public_session_recommended_locales_.end()
+ ? &kEmptyRecommendedLocales
+ : &public_session_recommended_locales_[account_id];
FillUserDictionary(*it,
is_owner,
is_signin_to_add,
@@ -391,7 +412,7 @@ void UserSelectionScreen::SendUserList() {
// available when running into login screen on first boot.
// See http://crosbug.com/12723
bool can_remove_user =
- ((!single_user || is_enterprise_managed) && !user_id.empty() &&
+ ((!single_user || is_enterprise_managed) && account_id.is_valid() &&
!is_owner && !is_public_account && !signed_in && !is_signin_to_add);
user_dict->SetBoolean(kKeyCanRemove, can_remove_user);
users_list.Append(user_dict);
@@ -404,7 +425,7 @@ void UserSelectionScreen::HandleGetUsers() {
SendUserList();
}
-void UserSelectionScreen::CheckUserStatus(const std::string& user_email) {
+void UserSelectionScreen::CheckUserStatus(const AccountId& account_id) {
// No checks on lock screen.
if (ScreenLocker::default_screen_locker())
return;
@@ -414,7 +435,6 @@ void UserSelectionScreen::CheckUserStatus(const std::string& user_email) {
new TokenHandleUtil(user_manager::UserManager::Get()));
}
- const AccountId account_id = AccountId::FromUserEmail(user_email);
if (token_handle_util_->HasToken(account_id)) {
token_handle_util_->CheckToken(
account_id, base::Bind(&UserSelectionScreen::OnUserStatusChecked,
@@ -437,19 +457,21 @@ void UserSelectionScreen::OnUserStatusChecked(
void UserSelectionScreen::SetAuthType(const std::string& user_id,
AuthType auth_type,
const base::string16& initial_value) {
- if (GetAuthType(user_id) == FORCE_OFFLINE_PASSWORD)
+ const AccountId& account_id = GetAccountIdOfKnownUser(user_id);
+ if (GetAuthType(account_id.GetUserEmail()) == FORCE_OFFLINE_PASSWORD)
return;
- DCHECK(GetAuthType(user_id) != FORCE_OFFLINE_PASSWORD ||
+ DCHECK(GetAuthType(account_id.GetUserEmail()) != FORCE_OFFLINE_PASSWORD ||
auth_type == FORCE_OFFLINE_PASSWORD);
- user_auth_type_map_[user_id] = auth_type;
- view_->SetAuthType(user_id, auth_type, initial_value);
+ user_auth_type_map_[account_id] = auth_type;
+ view_->SetAuthType(account_id, auth_type, initial_value);
}
proximity_auth::ScreenlockBridge::LockHandler::AuthType
UserSelectionScreen::GetAuthType(const std::string& username) const {
- if (user_auth_type_map_.find(username) == user_auth_type_map_.end())
+ const AccountId& account_id = GetAccountIdOfKnownUser(username);
+ if (user_auth_type_map_.find(account_id) == user_auth_type_map_.end())
return OFFLINE_PASSWORD;
- return user_auth_type_map_.find(username)->second;
+ return user_auth_type_map_.find(account_id)->second;
}
proximity_auth::ScreenlockBridge::LockHandler::ScreenType
@@ -474,11 +496,13 @@ void UserSelectionScreen::ShowUserPodCustomIcon(
scoped_ptr<base::DictionaryValue> icon = icon_options.ToDictionaryValue();
if (!icon || icon->empty())
return;
- view_->ShowUserPodCustomIcon(user_id, *icon);
+ const AccountId account_id = GetAccountIdOfKnownUser(user_id);
+ view_->ShowUserPodCustomIcon(account_id, *icon);
}
void UserSelectionScreen::HideUserPodCustomIcon(const std::string& user_id) {
- view_->HideUserPodCustomIcon(user_id);
+ const AccountId account_id = GetAccountIdOfKnownUser(user_id);
+ view_->HideUserPodCustomIcon(account_id);
}
void UserSelectionScreen::EnableInput() {
@@ -499,7 +523,7 @@ void UserSelectionScreen::AttemptEasySignin(const std::string& user_id,
const std::string& key_label) {
DCHECK_EQ(GetScreenType(), SIGNIN_SCREEN);
- UserContext user_context(AccountId::FromUserEmail(user_id));
+ UserContext user_context(GetAccountIdOfKnownUser(user_id));
user_context.SetAuthFlow(UserContext::AUTH_FLOW_EASY_UNLOCK);
user_context.SetKey(Key(secret));
user_context.GetKey()->SetLabel(key_label);
@@ -507,36 +531,36 @@ void UserSelectionScreen::AttemptEasySignin(const std::string& user_id,
login_display_delegate_->Login(user_context, SigninSpecifics());
}
-void UserSelectionScreen::HardLockPod(const std::string& user_id) {
- view_->SetAuthType(user_id, OFFLINE_PASSWORD, base::string16());
- EasyUnlockService* service = GetEasyUnlockServiceForUser(user_id);
+void UserSelectionScreen::HardLockPod(const AccountId& account_id) {
+ view_->SetAuthType(account_id, OFFLINE_PASSWORD, base::string16());
+ EasyUnlockService* service = GetEasyUnlockServiceForUser(account_id);
if (!service)
return;
service->SetHardlockState(EasyUnlockScreenlockStateHandler::USER_HARDLOCK);
}
-void UserSelectionScreen::AttemptEasyUnlock(const std::string& user_id) {
- EasyUnlockService* service = GetEasyUnlockServiceForUser(user_id);
+void UserSelectionScreen::AttemptEasyUnlock(const AccountId& account_id) {
+ EasyUnlockService* service = GetEasyUnlockServiceForUser(account_id);
if (!service)
return;
- service->AttemptAuth(user_id);
+ service->AttemptAuth(account_id.GetUserEmail());
}
-void UserSelectionScreen::RecordClickOnLockIcon(const std::string& user_id) {
- EasyUnlockService* service = GetEasyUnlockServiceForUser(user_id);
+void UserSelectionScreen::RecordClickOnLockIcon(const AccountId& account_id) {
+ EasyUnlockService* service = GetEasyUnlockServiceForUser(account_id);
if (!service)
return;
service->RecordClickOnLockIcon();
}
EasyUnlockService* UserSelectionScreen::GetEasyUnlockServiceForUser(
- const std::string& user_id) const {
+ const AccountId& account_id) const {
if (GetScreenType() == OTHER_SCREEN)
return nullptr;
const user_manager::User* unlock_user = nullptr;
for (const user_manager::User* user : users_) {
- if (user->email() == user_id) {
+ if (user->GetAccountId() == account_id) {
unlock_user = user;
break;
}
diff --git a/chrome/browser/chromeos/login/screens/user_selection_screen.h b/chrome/browser/chromeos/login/screens/user_selection_screen.h
index 0c2879b..71dcb99 100644
--- a/chrome/browser/chromeos/login/screens/user_selection_screen.h
+++ b/chrome/browser/chromeos/login/screens/user_selection_screen.h
@@ -16,6 +16,7 @@
#include "chrome/browser/chromeos/login/ui/login_display.h"
#include "chrome/browser/chromeos/login/ui/models/user_board_model.h"
#include "components/proximity_auth/screenlock_bridge.h"
+#include "components/signin/core/account_id/account_id.h"
#include "components/user_manager/user.h"
#include "ui/base/user_activity/user_activity_observer.h"
@@ -42,10 +43,9 @@ class UserSelectionScreen
static const user_manager::UserList PrepareUserListForSending(
const user_manager::UserList& users,
- std::string owner,
+ const AccountId& owner,
bool is_signin_to_add);
-
virtual void Init(const user_manager::UserList& users, bool show_guest);
void OnUserImageChanged(const user_manager::User& user);
void OnBeforeUserRemoved(const std::string& username);
@@ -54,7 +54,7 @@ class UserSelectionScreen
void OnPasswordClearTimerExpired();
void HandleGetUsers();
- void CheckUserStatus(const std::string& user_id);
+ void CheckUserStatus(const AccountId& account_id);
// ui::UserActivityDetector implementation:
void OnUserActivity(const ui::Event* event) override;
@@ -83,9 +83,9 @@ class UserSelectionScreen
// UserBoardModel implementation.
void SendUserList() override;
- void HardLockPod(const std::string& user_id) override;
- void AttemptEasyUnlock(const std::string& user_id) override;
- void RecordClickOnLockIcon(const std::string& user_id) override;
+ void HardLockPod(const AccountId& account_id) override;
+ void AttemptEasyUnlock(const AccountId& account_id) override;
+ void RecordClickOnLockIcon(const AccountId& account_id) override;
// Fills |user_dict| with information about |user|.
static void FillUserDictionary(
@@ -109,18 +109,22 @@ class UserSelectionScreen
static bool ShouldForceOnlineSignIn(const user_manager::User* user);
protected:
+ // This call forms full account id of a known user by email.
+ // This is a temporary call while migrating to AccountId.
+ static AccountId GetAccountIdOfKnownUser(const std::string& user_id);
+
LoginDisplayWebUIHandler* handler_;
LoginDisplay::Delegate* login_display_delegate_;
UserBoardView* view_;
- // Map from public session user IDs to recommended locales set by policy.
- typedef std::map<std::string, std::vector<std::string> >
+ // Map from public session account IDs to recommended locales set by policy.
+ typedef std::map<AccountId, std::vector<std::string> >
PublicSessionRecommendedLocaleMap;
PublicSessionRecommendedLocaleMap public_session_recommended_locales_;
private:
EasyUnlockService* GetEasyUnlockServiceForUser(
- const std::string& user_id) const;
+ const AccountId& account_id) const;
void OnUserStatusChecked(const AccountId& account_id,
TokenHandleUtil::TokenHandleStatus status);
@@ -134,9 +138,9 @@ class UserSelectionScreen
// Set of Users that are visible.
user_manager::UserList users_;
- // Map of usernames to their current authentication type. If a user is not
+ // Map of accounnt ids to their current authentication type. If a user is not
// contained in the map, it is using the default authentication type.
- std::map<std::string, proximity_auth::ScreenlockBridge::LockHandler::AuthType>
+ std::map<AccountId, proximity_auth::ScreenlockBridge::LockHandler::AuthType>
user_auth_type_map_;
// Timer for measuring idle state duration before password clear.
diff --git a/chrome/browser/chromeos/login/signin_screen_controller.cc b/chrome/browser/chromeos/login/signin_screen_controller.cc
index fdcfd5a..eb09852 100644
--- a/chrome/browser/chromeos/login/signin_screen_controller.cc
+++ b/chrome/browser/chromeos/login/signin_screen_controller.cc
@@ -75,8 +75,8 @@ void SignInScreenController::SendUserList() {
user_selection_screen_->HandleGetUsers();
}
-void SignInScreenController::CheckUserStatus(const std::string& user_id) {
- user_selection_screen_->CheckUserStatus(user_id);
+void SignInScreenController::CheckUserStatus(const AccountId& account_id) {
+ user_selection_screen_->CheckUserStatus(account_id);
}
void SignInScreenController::SetWebUIHandler(
diff --git a/chrome/browser/chromeos/login/signin_screen_controller.h b/chrome/browser/chromeos/login/signin_screen_controller.h
index 2a8862e..e341062 100644
--- a/chrome/browser/chromeos/login/signin_screen_controller.h
+++ b/chrome/browser/chromeos/login/signin_screen_controller.h
@@ -43,7 +43,7 @@ class SignInScreenController : public user_manager::RemoveUserDelegate,
void SendUserList();
// Runs OAauth token validity check.
- void CheckUserStatus(const std::string& user_id);
+ void CheckUserStatus(const AccountId& account_id);
// Query to remove user with specified id.
// TODO(antrim): move to user selection screen handler.
diff --git a/chrome/browser/chromeos/login/supervised/supervised_user_test_base.cc b/chrome/browser/chromeos/login/supervised/supervised_user_test_base.cc
index ab41788..9cd935c 100644
--- a/chrome/browser/chromeos/login/supervised/supervised_user_test_base.cc
+++ b/chrome/browser/chromeos/login/supervised/supervised_user_test_base.cc
@@ -294,7 +294,8 @@ void SupervisedUserTestBase::StartFlowLoginAsManager() {
// Next button is now enabled.
JSExpect("!$('supervised-user-creation-next-button').disabled");
- UserContext user_context(AccountId::FromUserEmail(kTestManager));
+ UserContext user_context(AccountId::FromUserEmailGaiaId(
+ kTestManager, GetGaiaIDForUserID(kTestManager)));
user_context.SetGaiaID(GetGaiaIDForUserID(kTestManager));
user_context.SetKey(Key(kTestManagerPassword));
SetExpectedCredentials(user_context);
diff --git a/chrome/browser/chromeos/login/ui/models/user_board_model.h b/chrome/browser/chromeos/login/ui/models/user_board_model.h
index 757e558..c69fb30 100644
--- a/chrome/browser/chromeos/login/ui/models/user_board_model.h
+++ b/chrome/browser/chromeos/login/ui/models/user_board_model.h
@@ -18,9 +18,9 @@ class UserBoardModel : public BaseScreen {
virtual void SendUserList() = 0;
// Methods for easy unlock support.
- virtual void HardLockPod(const std::string& user_id) = 0;
- virtual void AttemptEasyUnlock(const std::string& user_id) = 0;
- virtual void RecordClickOnLockIcon(const std::string& user_id) = 0;
+ virtual void HardLockPod(const AccountId& account_id) = 0;
+ virtual void AttemptEasyUnlock(const AccountId& account_id) = 0;
+ virtual void RecordClickOnLockIcon(const AccountId& account_id) = 0;
// BaseScreen implementation:
std::string GetName() const override;
diff --git a/chrome/browser/chromeos/login/ui/views/user_board_view.h b/chrome/browser/chromeos/login/ui/views/user_board_view.h
index 30fe63f..7febe94 100644
--- a/chrome/browser/chromeos/login/ui/views/user_board_view.h
+++ b/chrome/browser/chromeos/login/ui/views/user_board_view.h
@@ -12,6 +12,8 @@
#include "base/values.h"
#include "components/proximity_auth/screenlock_bridge.h"
+class AccountId;
+
namespace chromeos {
class UserBoardModel;
@@ -25,18 +27,18 @@ class UserBoardView {
virtual void Bind(UserBoardModel& model) = 0;
virtual void Unbind() = 0;
- virtual void SetPublicSessionDisplayName(const std::string& user_id,
+ virtual void SetPublicSessionDisplayName(const AccountId& account_id,
const std::string& display_name) = 0;
- virtual void SetPublicSessionLocales(const std::string& user_id,
+ virtual void SetPublicSessionLocales(const AccountId& account_id,
scoped_ptr<base::ListValue> locales,
const std::string& default_locale,
bool multiple_recommended_locales) = 0;
virtual void ShowBannerMessage(const base::string16& message) = 0;
- virtual void ShowUserPodCustomIcon(const std::string& user_id,
+ virtual void ShowUserPodCustomIcon(const AccountId& account_id,
const base::DictionaryValue& icon) = 0;
- virtual void HideUserPodCustomIcon(const std::string& user_id) = 0;
+ virtual void HideUserPodCustomIcon(const AccountId& account_id) = 0;
virtual void SetAuthType(
- const std::string& user_id,
+ const AccountId& account_id,
proximity_auth::ScreenlockBridge::LockHandler::AuthType auth_type,
const base::string16& initial_value) = 0;
};
diff --git a/chrome/browser/chromeos/login/ui/webui_login_display.cc b/chrome/browser/chromeos/login/ui/webui_login_display.cc
index 4d7362d..522ca4e 100644
--- a/chrome/browser/chromeos/login/ui/webui_login_display.cc
+++ b/chrome/browser/chromeos/login/ui/webui_login_display.cc
@@ -77,8 +77,8 @@ void WebUILoginDisplay::HandleGetUsers() {
SignInScreenController::Get()->SendUserList();
}
-void WebUILoginDisplay::CheckUserStatus(const std::string& user_id) {
- SignInScreenController::Get()->CheckUserStatus(user_id);
+void WebUILoginDisplay::CheckUserStatus(const AccountId& account_id) {
+ SignInScreenController::Get()->CheckUserStatus(account_id);
}
// ---- Gaia screen methods
diff --git a/chrome/browser/chromeos/login/ui/webui_login_display.h b/chrome/browser/chromeos/login/ui/webui_login_display.h
index 8a13724..408bf28 100644
--- a/chrome/browser/chromeos/login/ui/webui_login_display.h
+++ b/chrome/browser/chromeos/login/ui/webui_login_display.h
@@ -78,7 +78,7 @@ class WebUILoginDisplay : public LoginDisplay,
void SetDisplayEmail(const std::string& email) override;
void HandleGetUsers() override;
- void CheckUserStatus(const std::string& user_id) override;
+ void CheckUserStatus(const AccountId& account_id) override;
bool IsUserWhitelisted(const std::string& user_id) override;
// ui::UserActivityDetector implementation:
diff --git a/chrome/browser/chromeos/policy/device_local_account_browsertest.cc b/chrome/browser/chromeos/policy/device_local_account_browsertest.cc
index 36f8e92..f1d2f1c 100644
--- a/chrome/browser/chromeos/policy/device_local_account_browsertest.cc
+++ b/chrome/browser/chromeos/policy/device_local_account_browsertest.cc
@@ -688,7 +688,7 @@ class DeviceLocalAccountTest : public DevicePolicyCrosBrowserTest,
" document.getElementById('pod-row').getPodWithUsername_('%s');"
"pod.click();"
"domAutomationController.send(pod.classList.contains('advanced'));",
- account_id_1_.GetUserEmail().c_str()),
+ account_id_1_.Serialize().c_str()),
&advanced));
// Verify that the pod expanded to its basic/advanced form, as expected.
EXPECT_EQ(expect_advanced, advanced);
@@ -895,7 +895,7 @@ IN_PROC_BROWSER_TEST_F(DeviceLocalAccountTest, DISABLED_DisplayName) {
const std::string get_compact_pod_display_name = base::StringPrintf(
"domAutomationController.send(document.getElementById('pod-row')"
" .getPodWithUsername_('%s').nameElement.textContent);",
- account_id_1_.GetUserEmail().c_str());
+ account_id_1_.Serialize().c_str());
std::string display_name;
ASSERT_TRUE(content::ExecuteScriptAndExtractString(
contents_,
@@ -906,7 +906,7 @@ IN_PROC_BROWSER_TEST_F(DeviceLocalAccountTest, DISABLED_DisplayName) {
"domAutomationController.send(document.getElementById('pod-row')"
" .getPodWithUsername_('%s').querySelector('.expanded-pane-name')"
" .textContent);",
- account_id_1_.GetUserEmail().c_str());
+ account_id_1_.Serialize().c_str());
display_name.clear();
ASSERT_TRUE(content::ExecuteScriptAndExtractString(
contents_,
@@ -920,7 +920,7 @@ IN_PROC_BROWSER_TEST_F(DeviceLocalAccountTest, DISABLED_DisplayName) {
base::StringPrintf(
"document.getElementById('pod-row').getPodWithUsername_('%s')"
" .click();",
- account_id_1_.GetUserEmail().c_str())));
+ account_id_1_.Serialize().c_str())));
// Change the display name.
device_local_account_policy_.payload().mutable_userdisplayname()->set_value(
@@ -957,7 +957,7 @@ IN_PROC_BROWSER_TEST_F(DeviceLocalAccountTest, DISABLED_DisplayName) {
base::StringPrintf(
"domAutomationController.send(document.getElementById('pod-row')"
" .getPodWithUsername_('%s').expanded);",
- account_id_1_.GetUserEmail().c_str()),
+ account_id_1_.Serialize().c_str()),
&expanded));
EXPECT_TRUE(expanded);
}
@@ -1677,7 +1677,7 @@ IN_PROC_BROWSER_TEST_F(DeviceLocalAccountTest, NoRecommendedLocaleNoSwitch) {
base::StringPrintf(
"document.getElementById('pod-row').getPodWithUsername_('%s')"
" .querySelector('.enter-button').click();",
- account_id_1_.GetUserEmail().c_str())));
+ account_id_1_.Serialize().c_str())));
WaitForSessionStart();
@@ -1706,7 +1706,7 @@ IN_PROC_BROWSER_TEST_F(DeviceLocalAccountTest, NoRecommendedLocaleSwitch) {
" document.getElementById('pod-row').getPodWithUsername_('%s');"
"pod.querySelector('.language-and-input').click();"
"domAutomationController.send(pod.classList.contains('advanced'));",
- account_id_1_.GetUserEmail().c_str()),
+ account_id_1_.Serialize().c_str()),
&advanced));
EXPECT_FALSE(advanced);
@@ -1720,7 +1720,7 @@ IN_PROC_BROWSER_TEST_F(DeviceLocalAccountTest, NoRecommendedLocaleSwitch) {
"var event = document.createEvent('HTMLEvents');"
"event.initEvent('change', false, true);"
"languageSelect.dispatchEvent(event);",
- account_id_1_.GetUserEmail().c_str(), kPublicSessionLocale)));
+ account_id_1_.Serialize().c_str(), kPublicSessionLocale)));
// The UI will have requested an updated list of keyboard layouts at this
// point. Wait for the constructions of this list to finish.
@@ -1735,7 +1735,7 @@ IN_PROC_BROWSER_TEST_F(DeviceLocalAccountTest, NoRecommendedLocaleSwitch) {
" document.getElementById('pod-row').getPodWithUsername_('%s');"
"pod.querySelector('.keyboard-select').value = '%s';"
"pod.querySelector('.enter-button').click();",
- account_id_1_.GetUserEmail().c_str(),
+ account_id_1_.Serialize().c_str(),
public_session_input_method_id_.c_str())));
WaitForSessionStart();
@@ -1768,7 +1768,7 @@ IN_PROC_BROWSER_TEST_F(DeviceLocalAccountTest, OneRecommendedLocale) {
base::StringPrintf(
"document.getElementById('pod-row').getPodWithUsername_('%s')"
" .querySelector('.enter-button').click();",
- account_id_1_.GetUserEmail().c_str())));
+ account_id_1_.Serialize().c_str())));
WaitForSessionStart();
@@ -1801,7 +1801,7 @@ IN_PROC_BROWSER_TEST_F(DeviceLocalAccountTest, MultipleRecommendedLocales) {
"for (var i = 0; i < languageSelect.length; ++i)"
" locales.push(languageSelect.options[i].value);"
"domAutomationController.send(JSON.stringify(locales));",
- account_id_1_.GetUserEmail().c_str());
+ account_id_1_.Serialize().c_str());
std::string json;
ASSERT_TRUE(content::ExecuteScriptAndExtractString(contents_,
get_locale_list,
@@ -1836,7 +1836,7 @@ IN_PROC_BROWSER_TEST_F(DeviceLocalAccountTest, MultipleRecommendedLocales) {
"domAutomationController.send(document.getElementById('pod-row')"
" .getPodWithUsername_('%s').querySelector('.language-select')"
" .value);",
- account_id_1_.GetUserEmail().c_str());
+ account_id_1_.Serialize().c_str());
std::string selected_locale;
ASSERT_TRUE(content::ExecuteScriptAndExtractString(contents_,
get_selected_locale,
@@ -1891,7 +1891,7 @@ IN_PROC_BROWSER_TEST_F(DeviceLocalAccountTest, MultipleRecommendedLocales) {
"var event = document.createEvent('HTMLEvents');"
"event.initEvent('change', false, true);"
"languageSelect.dispatchEvent(event);",
- account_id_1_.GetUserEmail().c_str(), kPublicSessionLocale)));
+ account_id_1_.Serialize().c_str(), kPublicSessionLocale)));
// Change the list of recommended locales.
SetRecommendedLocales(kRecommendedLocales2, arraysize(kRecommendedLocales2));
@@ -1917,7 +1917,7 @@ IN_PROC_BROWSER_TEST_F(DeviceLocalAccountTest, MultipleRecommendedLocales) {
base::StringPrintf(
"document.getElementById('pod-row').getPodWithUsername_('%s')"
" .querySelector('.keyboard-select').value = '%s';",
- account_id_1_.GetUserEmail().c_str(),
+ account_id_1_.Serialize().c_str(),
public_session_input_method_id_.c_str())));
// Click on a different pod, causing focus to shift away and the pod to
@@ -1927,7 +1927,7 @@ IN_PROC_BROWSER_TEST_F(DeviceLocalAccountTest, MultipleRecommendedLocales) {
base::StringPrintf(
"document.getElementById('pod-row').getPodWithUsername_('%s')"
" .click();",
- account_id_2_.GetUserEmail().c_str())));
+ account_id_2_.Serialize().c_str())));
// Click on the pod again, causing it to expand again. Verify that the pod has
// kept all its state (the advanced form is being shown, the manually selected
@@ -1944,7 +1944,7 @@ IN_PROC_BROWSER_TEST_F(DeviceLocalAccountTest, MultipleRecommendedLocales) {
"state.keyboardLayout = pod.querySelector('.keyboard-select').value;"
"console.log(JSON.stringify(state));"
"domAutomationController.send(JSON.stringify(state));",
- account_id_1_.GetUserEmail().c_str()),
+ account_id_1_.Serialize().c_str()),
&json));
LOG(ERROR) << json;
value_ptr = base::JSONReader::Read(json);
@@ -1966,7 +1966,7 @@ IN_PROC_BROWSER_TEST_F(DeviceLocalAccountTest, MultipleRecommendedLocales) {
base::StringPrintf(
"document.getElementById('pod-row').getPodWithUsername_('%s')"
" .querySelector('.enter-button').click();",
- account_id_1_.GetUserEmail().c_str())));
+ account_id_1_.Serialize().c_str())));
WaitForSessionStart();
@@ -2000,7 +2000,7 @@ IN_PROC_BROWSER_TEST_F(DeviceLocalAccountTest, InvalidRecommendedLocale) {
" document.getElementById('pod-row').getPodWithUsername_('%s');"
"pod.click();"
"domAutomationController.send(pod.classList.contains('advanced'));",
- account_id_1_.GetUserEmail().c_str()),
+ account_id_1_.Serialize().c_str()),
&advanced));
EXPECT_FALSE(advanced);
EXPECT_EQ(l10n_util::GetLanguage(initial_locale_),
@@ -2012,7 +2012,7 @@ IN_PROC_BROWSER_TEST_F(DeviceLocalAccountTest, InvalidRecommendedLocale) {
base::StringPrintf(
"document.getElementById('pod-row').getPodWithUsername_('%s')"
" .querySelector('.enter-button').click();",
- account_id_1_.GetUserEmail().c_str())));
+ account_id_1_.Serialize().c_str())));
WaitForSessionStart();
@@ -2105,7 +2105,7 @@ IN_PROC_BROWSER_TEST_F(DeviceLocalAccountTest, TermsOfServiceWithLocaleSwitch) {
"var event = document.createEvent('HTMLEvents');"
"event.initEvent('change', false, true);"
"languageSelect.dispatchEvent(event);",
- account_id_1_.GetUserEmail().c_str(), kPublicSessionLocale)));
+ account_id_1_.Serialize().c_str(), kPublicSessionLocale)));
// The UI will have requested an updated list of keyboard layouts at this
// point. Wait for the constructions of this list to finish.
@@ -2131,7 +2131,7 @@ IN_PROC_BROWSER_TEST_F(DeviceLocalAccountTest, TermsOfServiceWithLocaleSwitch) {
" document.getElementById('pod-row').getPodWithUsername_('%s');"
"pod.querySelector('.keyboard-select').value = '%s';"
"pod.querySelector('.enter-button').click();",
- account_id_1_.GetUserEmail().c_str(),
+ account_id_1_.Serialize().c_str(),
public_session_input_method_id_.c_str())));
// Spin the loop until the login observer fires. Then, unregister the
diff --git a/chrome/browser/ui/webui/chromeos/login/gaia_screen_handler.cc b/chrome/browser/ui/webui/chromeos/login/gaia_screen_handler.cc
index 89b5f4c..a158275 100644
--- a/chrome/browser/ui/webui/chromeos/login/gaia_screen_handler.cc
+++ b/chrome/browser/ui/webui/chromeos/login/gaia_screen_handler.cc
@@ -858,9 +858,11 @@ void GaiaScreenHandler::LoadAuthExtension(bool force,
context.is_enrolling_consumer_management = is_enrolling_consumer_management_;
std::string gaia_id;
- if (user_manager::UserManager::Get()->FindGaiaID(
- AccountId::FromUserEmail(context.email), &gaia_id))
+ if (!context.email.empty() &&
+ user_manager::UserManager::Get()->FindGaiaID(
+ AccountId::FromUserEmail(context.email), &gaia_id)) {
context.gaia_id = gaia_id;
+ }
if (Delegate()) {
context.show_users = Delegate()->IsShowUsers();
diff --git a/chrome/browser/ui/webui/chromeos/login/signin_screen_handler.cc b/chrome/browser/ui/webui/chromeos/login/signin_screen_handler.cc
index 1f05411..73ee81e 100644
--- a/chrome/browser/ui/webui/chromeos/login/signin_screen_handler.cc
+++ b/chrome/browser/ui/webui/chromeos/login/signin_screen_handler.cc
@@ -874,7 +874,7 @@ void SigninScreenHandler::OnUserRemoved(const std::string& username,
void SigninScreenHandler::OnUserImageChanged(const user_manager::User& user) {
if (page_is_ready())
- CallJS("login.AccountPickerScreen.updateUserImage", user.email());
+ CallJS("login.AccountPickerScreen.updateUserImage", user.GetAccountId());
}
void SigninScreenHandler::OnPreferencesChanged() {
@@ -988,12 +988,14 @@ void SigninScreenHandler::UpdateAddButtonStatus() {
AllWhitelistedUsersPresent());
}
-void SigninScreenHandler::HandleAuthenticateUser(const std::string& username,
+void SigninScreenHandler::HandleAuthenticateUser(const AccountId& account_id,
const std::string& password) {
if (!delegate_)
return;
- UserContext user_context(
- AccountId::FromUserEmail(gaia::SanitizeEmail(username)));
+ DCHECK_EQ(account_id.GetUserEmail(),
+ gaia::SanitizeEmail(account_id.GetUserEmail()));
+
+ UserContext user_context(account_id);
user_context.SetKey(Key(password));
delegate_->Login(user_context, SigninSpecifics());
}
@@ -1014,13 +1016,14 @@ void SigninScreenHandler::HandleShowSupervisedUserCreationScreen() {
}
void SigninScreenHandler::HandleLaunchPublicSession(
- const std::string& user_id,
+ const AccountId& account_id,
const std::string& locale,
const std::string& input_method) {
if (!delegate_)
return;
- UserContext context(user_manager::USER_TYPE_PUBLIC_ACCOUNT, user_id);
+ UserContext context(user_manager::USER_TYPE_PUBLIC_ACCOUNT,
+ account_id.GetUserEmail());
context.SetPublicSessionLocale(locale),
context.SetPublicSessionInputMethod(input_method);
delegate_->Login(context, SigninSpecifics());
@@ -1043,22 +1046,22 @@ void SigninScreenHandler::HandleShutdownSystem() {
ash::Shell::GetInstance()->lock_state_controller()->RequestShutdown();
}
-void SigninScreenHandler::HandleLoadWallpaper(const std::string& email) {
+void SigninScreenHandler::HandleLoadWallpaper(const AccountId& account_id) {
if (delegate_)
- delegate_->LoadWallpaper(email);
+ delegate_->LoadWallpaper(account_id.GetUserEmail());
}
void SigninScreenHandler::HandleRebootSystem() {
chromeos::DBusThreadManager::Get()->GetPowerManagerClient()->RequestRestart();
}
-void SigninScreenHandler::HandleRemoveUser(const std::string& email) {
+void SigninScreenHandler::HandleRemoveUser(const AccountId& account_id) {
ProfileMetrics::LogProfileDeleteUser(
ProfileMetrics::DELETE_PROFILE_USER_MANAGER);
if (!delegate_)
return;
- delegate_->RemoveUser(email);
+ delegate_->RemoveUser(account_id.GetUserEmail());
UpdateAddButtonStatus();
}
@@ -1174,10 +1177,10 @@ void SigninScreenHandler::HandleLoginVisible(const std::string& source) {
}
void SigninScreenHandler::HandleCancelPasswordChangedFlow(
- const std::string& user_id) {
- if (!user_id.empty())
- RecordReauthReason(AccountId::FromUserEmail(user_id),
- ReauthReason::PASSWORD_UPDATE_SKIPPED);
+ const AccountId& account_id) {
+ if (account_id.is_valid()) {
+ RecordReauthReason(account_id, ReauthReason::PASSWORD_UPDATE_SKIPPED);
+ }
gaia_screen_handler_->StartClearingCookies(
base::Bind(&SigninScreenHandler::CancelPasswordChangedFlowInternal,
weak_factory_.GetWeakPtr()));
@@ -1235,19 +1238,19 @@ void SigninScreenHandler::HandleShowLoadingTimeoutError() {
UpdateState(NetworkError::ERROR_REASON_LOADING_TIMEOUT);
}
-void SigninScreenHandler::HandleFocusPod(const std::string& user_id) {
- SetUserInputMethod(user_id, ime_state_.get());
- WallpaperManager::Get()->SetUserWallpaperDelayed(user_id);
- proximity_auth::ScreenlockBridge::Get()->SetFocusedUser(user_id);
+void SigninScreenHandler::HandleFocusPod(const AccountId& account_id) {
+ SetUserInputMethod(account_id.GetUserEmail(), ime_state_.get());
+ WallpaperManager::Get()->SetUserWallpaperDelayed(account_id.GetUserEmail());
+ proximity_auth::ScreenlockBridge::Get()->SetFocusedUser(
+ account_id.GetUserEmail());
if (delegate_)
- delegate_->CheckUserStatus(user_id);
+ delegate_->CheckUserStatus(account_id);
if (!test_focus_pod_callback_.is_null())
test_focus_pod_callback_.Run();
bool use_24hour_clock = false;
if (user_manager::UserManager::Get()->GetKnownUserBooleanPref(
- AccountId::FromUserEmail(user_id), prefs::kUse24HourClock,
- &use_24hour_clock)) {
+ account_id, prefs::kUse24HourClock, &use_24hour_clock)) {
g_browser_process->platform_part()
->GetSystemClock()
->SetLastFocusedPodHourClockType(use_24hour_clock ? base::k24HourClock
@@ -1256,29 +1259,26 @@ void SigninScreenHandler::HandleFocusPod(const std::string& user_id) {
}
void SigninScreenHandler::HandleGetPublicSessionKeyboardLayouts(
- const std::string& user_id,
+ const AccountId& account_id,
const std::string& locale) {
GetKeyboardLayoutsForLocale(
base::Bind(&SigninScreenHandler::SendPublicSessionKeyboardLayouts,
- weak_factory_.GetWeakPtr(),
- user_id,
- locale),
+ weak_factory_.GetWeakPtr(), account_id, locale),
locale);
}
void SigninScreenHandler::SendPublicSessionKeyboardLayouts(
- const std::string& user_id,
+ const AccountId& account_id,
const std::string& locale,
scoped_ptr<base::ListValue> keyboard_layouts) {
CallJS("login.AccountPickerScreen.setPublicSessionKeyboardLayouts",
- user_id,
- locale,
- *keyboard_layouts);
+ account_id, locale, *keyboard_layouts);
}
-void SigninScreenHandler::HandleLaunchKioskApp(const std::string& app_id,
+void SigninScreenHandler::HandleLaunchKioskApp(const AccountId& app_account_id,
bool diagnostic_mode) {
- UserContext context(user_manager::USER_TYPE_KIOSK_APP, app_id);
+ UserContext context(user_manager::USER_TYPE_KIOSK_APP,
+ app_account_id.GetUserEmail());
SigninSpecifics specifics;
specifics.kiosk_diagnostic_mode = diagnostic_mode;
if (delegate_)
@@ -1309,7 +1309,7 @@ void SigninScreenHandler::HandleLogRemoveUserWarningShown() {
}
void SigninScreenHandler::HandleFirstIncorrectPasswordAttempt(
- const std::string& email) {
+ const AccountId& account_id) {
// TODO(ginkage): Fix this case once crbug.com/469987 is ready.
/*
if (user_manager::UserManager::Get()->FindUsingSAML(email))
@@ -1318,9 +1318,8 @@ void SigninScreenHandler::HandleFirstIncorrectPasswordAttempt(
}
void SigninScreenHandler::HandleMaxIncorrectPasswordAttempts(
- const std::string& email) {
- RecordReauthReason(AccountId::FromUserEmail(email),
- ReauthReason::INCORRECT_PASSWORD_ENTERED);
+ const AccountId& account_id) {
+ RecordReauthReason(account_id, ReauthReason::INCORRECT_PASSWORD_ENTERED);
}
bool SigninScreenHandler::AllWhitelistedUsersPresent() {
diff --git a/chrome/browser/ui/webui/chromeos/login/signin_screen_handler.h b/chrome/browser/ui/webui/chromeos/login/signin_screen_handler.h
index 86ff579..0f5b3f0 100644
--- a/chrome/browser/ui/webui/chromeos/login/signin_screen_handler.h
+++ b/chrome/browser/ui/webui/chromeos/login/signin_screen_handler.h
@@ -185,7 +185,7 @@ class SigninScreenHandlerDelegate {
virtual void HandleGetUsers() = 0;
// Runs an OAuth token validation check for user.
- virtual void CheckUserStatus(const std::string& user_id) = 0;
+ virtual void CheckUserStatus(const AccountId& account_id) = 0;
// Returns true if user is allowed to log in by domain policy.
virtual bool IsUserWhitelisted(const std::string& user_id) = 0;
@@ -319,18 +319,18 @@ class SigninScreenHandler
// WebUI message handlers.
void HandleGetUsers();
- void HandleAuthenticateUser(const std::string& username,
+ void HandleAuthenticateUser(const AccountId& account_id,
const std::string& password);
void HandleAttemptUnlock(const std::string& username);
void HandleLaunchIncognito();
- void HandleLaunchPublicSession(const std::string& user_id,
+ void HandleLaunchPublicSession(const AccountId& account_id,
const std::string& locale,
const std::string& input_method);
void HandleOfflineLogin(const base::ListValue* args);
void HandleShutdownSystem();
- void HandleLoadWallpaper(const std::string& email);
+ void HandleLoadWallpaper(const AccountId& account_id);
void HandleRebootSystem();
- void HandleRemoveUser(const std::string& email);
+ void HandleRemoveUser(const AccountId& account_id);
void HandleShowAddUser(const base::ListValue* args);
void HandleToggleEnrollmentScreen();
void HandleToggleEnableDebuggingScreen();
@@ -342,7 +342,7 @@ class SigninScreenHandler
void HandleSignOutUser();
void HandleOpenProxySettings();
void HandleLoginVisible(const std::string& source);
- void HandleCancelPasswordChangedFlow(const std::string& user_id);
+ void HandleCancelPasswordChangedFlow(const AccountId& account_id);
void HandleCancelUserAdding();
void HandleMigrateUserData(const std::string& password);
void HandleResyncUserData();
@@ -351,21 +351,22 @@ class SigninScreenHandler
void HandleLoginScreenUpdate();
void HandleShowLoadingTimeoutError();
void HandleShowSupervisedUserCreationScreen();
- void HandleFocusPod(const std::string& user_id);
+ void HandleFocusPod(const AccountId& account_id);
void HandleHardlockPod(const std::string& user_id);
- void HandleLaunchKioskApp(const std::string& app_id, bool diagnostic_mode);
- void HandleGetPublicSessionKeyboardLayouts(const std::string& user_id,
+ void HandleLaunchKioskApp(const AccountId& app_account_id,
+ bool diagnostic_mode);
+ void HandleGetPublicSessionKeyboardLayouts(const AccountId& account_id,
const std::string& locale);
void HandleCancelConsumerManagementEnrollment();
void HandleGetTouchViewState();
void HandleLogRemoveUserWarningShown();
- void HandleFirstIncorrectPasswordAttempt(const std::string& email);
- void HandleMaxIncorrectPasswordAttempts(const std::string& email);
+ void HandleFirstIncorrectPasswordAttempt(const AccountId& account_id);
+ void HandleMaxIncorrectPasswordAttempts(const AccountId& account_id);
// Sends the list of |keyboard_layouts| available for the |locale| that is
// currently selected for the public session identified by |user_id|.
void SendPublicSessionKeyboardLayouts(
- const std::string& user_id,
+ const AccountId& account_id,
const std::string& locale,
scoped_ptr<base::ListValue> keyboard_layouts);
diff --git a/chrome/browser/ui/webui/chromeos/login/signin_userlist_unittest.cc b/chrome/browser/ui/webui/chromeos/login/signin_userlist_unittest.cc
index 0a69c1f..aa8f2ec 100644
--- a/chrome/browser/ui/webui/chromeos/login/signin_userlist_unittest.cc
+++ b/chrome/browser/ui/webui/chromeos/login/signin_userlist_unittest.cc
@@ -13,6 +13,7 @@
#include "chrome/test/base/testing_browser_process.h"
#include "chrome/test/base/testing_profile_manager.h"
#include "components/proximity_auth/screenlock_bridge.h"
+#include "components/signin/core/account_id/account_id.h"
#include "components/user_manager/user.h"
#include "testing/gtest/include/gtest/gtest.h"
@@ -86,7 +87,8 @@ TEST_F(SigninPrepareUserListTest, AlwaysKeepOwnerInList) {
EXPECT_LT(kMaxUsers, fake_user_manager_->GetUsers().size());
user_manager::UserList users_to_send =
UserSelectionScreen::PrepareUserListForSending(
- fake_user_manager_->GetUsers(), kOwner, true /* is signin to add */);
+ fake_user_manager_->GetUsers(), AccountId::FromUserEmail(kOwner),
+ true /* is signin to add */);
EXPECT_EQ(kMaxUsers, users_to_send.size());
EXPECT_EQ(kOwner, users_to_send.back()->email());
@@ -96,8 +98,7 @@ TEST_F(SigninPrepareUserListTest, AlwaysKeepOwnerInList) {
fake_user_manager_->RemoveUserFromList(
AccountId::FromUserEmail("a17@gmail.com"));
users_to_send = UserSelectionScreen::PrepareUserListForSending(
- fake_user_manager_->GetUsers(),
- kOwner,
+ fake_user_manager_->GetUsers(), AccountId::FromUserEmail(kOwner),
true /* is signin to add */);
EXPECT_EQ(kMaxUsers, users_to_send.size());
@@ -108,14 +109,14 @@ TEST_F(SigninPrepareUserListTest, AlwaysKeepOwnerInList) {
TEST_F(SigninPrepareUserListTest, PublicAccounts) {
user_manager::UserList users_to_send =
UserSelectionScreen::PrepareUserListForSending(
- fake_user_manager_->GetUsers(), kOwner, true /* is signin to add */);
+ fake_user_manager_->GetUsers(), AccountId::FromUserEmail(kOwner),
+ true /* is signin to add */);
EXPECT_EQ(kMaxUsers, users_to_send.size());
EXPECT_EQ("a0@gmail.com", users_to_send.front()->email());
users_to_send = UserSelectionScreen::PrepareUserListForSending(
- fake_user_manager_->GetUsers(),
- kOwner,
+ fake_user_manager_->GetUsers(), AccountId::FromUserEmail(kOwner),
false /* is signin to add */);
EXPECT_EQ(kMaxUsers, users_to_send.size());
diff --git a/chrome/browser/ui/webui/chromeos/login/supervised_user_creation_screen_handler.cc b/chrome/browser/ui/webui/chromeos/login/supervised_user_creation_screen_handler.cc
index c672a24..5a6cb43 100644
--- a/chrome/browser/ui/webui/chromeos/login/supervised_user_creation_screen_handler.cc
+++ b/chrome/browser/ui/webui/chromeos/login/supervised_user_creation_screen_handler.cc
@@ -18,6 +18,7 @@
#include "chrome/grit/generated_resources.h"
#include "chromeos/audio/chromeos_sounds.h"
#include "components/login/localized_values_builder.h"
+#include "components/signin/core/account_id/account_id.h"
#include "components/user_manager/user_manager.h"
#include "components/user_manager/user_type.h"
#include "google_apis/gaia/gaia_auth_util.h"
@@ -298,14 +299,14 @@ void SupervisedUserCreationScreenHandler::
}
void SupervisedUserCreationScreenHandler::HandleManagerSelected(
- const std::string& manager_id) {
+ const AccountId& manager_id) {
if (!delegate_)
return;
- WallpaperManager::Get()->SetUserWallpaperNow(manager_id);
+ WallpaperManager::Get()->SetUserWallpaperNow(manager_id.GetUserEmail());
}
void SupervisedUserCreationScreenHandler::HandleImportUserSelected(
- const std::string& user_id) {
+ const AccountId& account_id) {
if (!delegate_)
return;
}
@@ -368,35 +369,37 @@ void SupervisedUserCreationScreenHandler::HandleCreateSupervisedUser(
}
void SupervisedUserCreationScreenHandler::HandleImportSupervisedUser(
- const std::string& user_id) {
+ const AccountId& account_id) {
if (!delegate_)
return;
ShowStatusMessage(true /* progress */, l10n_util::GetStringUTF16(
IDS_CREATE_SUPERVISED_USER_CREATION_CREATION_PROGRESS_MESSAGE));
- delegate_->ImportSupervisedUser(user_id);
+ delegate_->ImportSupervisedUser(account_id.GetUserEmail());
}
void SupervisedUserCreationScreenHandler::
- HandleImportSupervisedUserWithPassword(
- const std::string& user_id,
- const std::string& password) {
+ HandleImportSupervisedUserWithPassword(const AccountId& account_id,
+ const std::string& password) {
if (!delegate_)
return;
ShowStatusMessage(true /* progress */, l10n_util::GetStringUTF16(
IDS_CREATE_SUPERVISED_USER_CREATION_CREATION_PROGRESS_MESSAGE));
- delegate_->ImportSupervisedUserWithPassword(user_id, password);
+ delegate_->ImportSupervisedUserWithPassword(account_id.GetUserEmail(),
+ password);
}
void SupervisedUserCreationScreenHandler::HandleAuthenticateManager(
- const std::string& raw_manager_username,
+ const AccountId& manager_raw_account_id,
const std::string& manager_password) {
- const std::string manager_username =
- gaia::SanitizeEmail(raw_manager_username);
- delegate_->AuthenticateManager(manager_username, manager_password);
+ const AccountId manager_account_id = AccountId::FromUserEmailGaiaId(
+ gaia::SanitizeEmail(manager_raw_account_id.GetUserEmail()),
+ manager_raw_account_id.GetGaiaId());
+ delegate_->AuthenticateManager(manager_account_id.GetUserEmail(),
+ manager_password);
}
// TODO(antrim) : this is an explicit code duplications with UserImageScreen.
diff --git a/chrome/browser/ui/webui/chromeos/login/supervised_user_creation_screen_handler.h b/chrome/browser/ui/webui/chromeos/login/supervised_user_creation_screen_handler.h
index 4d9284b..3af31ea 100644
--- a/chrome/browser/ui/webui/chromeos/login/supervised_user_creation_screen_handler.h
+++ b/chrome/browser/ui/webui/chromeos/login/supervised_user_creation_screen_handler.h
@@ -106,8 +106,8 @@ class SupervisedUserCreationScreenHandler : public BaseScreenHandler {
// WebUI message handlers.
void HandleCheckSupervisedUserName(const base::string16& name);
- void HandleManagerSelected(const std::string& manager_id);
- void HandleImportUserSelected(const std::string& user_id);
+ void HandleManagerSelected(const AccountId& manager_id);
+ void HandleImportUserSelected(const AccountId& account_id);
void HandleFinishLocalSupervisedUserCreation();
void HandleAbortLocalSupervisedUserCreation();
@@ -115,12 +115,12 @@ class SupervisedUserCreationScreenHandler : public BaseScreenHandler {
void HandleRetryLocalSupervisedUserCreation(const base::ListValue* args);
void HandleCurrentSupervisedUserPage(const std::string& current_page);
- void HandleAuthenticateManager(const std::string& raw_manager_username,
+ void HandleAuthenticateManager(const AccountId& manager_account_id,
const std::string& manager_password);
void HandleCreateSupervisedUser(const base::string16& new_raw_user_name,
const std::string& new_user_password);
- void HandleImportSupervisedUser(const std::string& user_id);
- void HandleImportSupervisedUserWithPassword(const std::string& user_id,
+ void HandleImportSupervisedUser(const AccountId& account_id);
+ void HandleImportSupervisedUserWithPassword(const AccountId& account_id,
const std::string& password);
void HandleGetImages();
diff --git a/chrome/browser/ui/webui/chromeos/login/user_board_screen_handler.cc b/chrome/browser/ui/webui/chromeos/login/user_board_screen_handler.cc
index 18c0ac3..2cd46ed 100644
--- a/chrome/browser/ui/webui/chromeos/login/user_board_screen_handler.cc
+++ b/chrome/browser/ui/webui/chromeos/login/user_board_screen_handler.cc
@@ -37,38 +37,38 @@ void UserBoardScreenHandler::HandleGetUsers() {
model_->SendUserList();
}
-void UserBoardScreenHandler::HandleHardlockPod(const std::string& user_id) {
+void UserBoardScreenHandler::HandleHardlockPod(const AccountId& account_id) {
CHECK(model_);
- model_->HardLockPod(user_id);
+ model_->HardLockPod(account_id);
}
-void UserBoardScreenHandler::HandleAttemptUnlock(const std::string& user_id) {
+void UserBoardScreenHandler::HandleAttemptUnlock(const AccountId& account_id) {
CHECK(model_);
- model_->AttemptEasyUnlock(user_id);
+ model_->AttemptEasyUnlock(account_id);
}
void UserBoardScreenHandler::HandleRecordClickOnLockIcon(
- const std::string& user_id) {
+ const AccountId& account_id) {
CHECK(model_);
- model_->RecordClickOnLockIcon(user_id);
+ model_->RecordClickOnLockIcon(account_id);
}
//----------------- API
void UserBoardScreenHandler::SetPublicSessionDisplayName(
- const std::string& user_id,
+ const AccountId& account_id,
const std::string& display_name) {
- CallJS("login.AccountPickerScreen.setPublicSessionDisplayName", user_id,
+ CallJS("login.AccountPickerScreen.setPublicSessionDisplayName", account_id,
display_name);
}
void UserBoardScreenHandler::SetPublicSessionLocales(
- const std::string& user_id,
+ const AccountId& account_id,
scoped_ptr<base::ListValue> locales,
const std::string& default_locale,
bool multiple_recommended_locales) {
- CallJS("login.AccountPickerScreen.setPublicSessionLocales", user_id, *locales,
- default_locale, multiple_recommended_locales);
+ CallJS("login.AccountPickerScreen.setPublicSessionLocales", account_id,
+ *locales, default_locale, multiple_recommended_locales);
}
void UserBoardScreenHandler::ShowBannerMessage(const base::string16& message) {
@@ -76,20 +76,21 @@ void UserBoardScreenHandler::ShowBannerMessage(const base::string16& message) {
}
void UserBoardScreenHandler::ShowUserPodCustomIcon(
- const std::string& user_id,
+ const AccountId& account_id,
const base::DictionaryValue& icon) {
- CallJS("login.AccountPickerScreen.showUserPodCustomIcon", user_id, icon);
+ CallJS("login.AccountPickerScreen.showUserPodCustomIcon", account_id, icon);
}
-void UserBoardScreenHandler::HideUserPodCustomIcon(const std::string& user_id) {
- CallJS("login.AccountPickerScreen.hideUserPodCustomIcon", user_id);
+void UserBoardScreenHandler::HideUserPodCustomIcon(
+ const AccountId& account_id) {
+ CallJS("login.AccountPickerScreen.hideUserPodCustomIcon", account_id);
}
void UserBoardScreenHandler::SetAuthType(
- const std::string& user_id,
+ const AccountId& account_id,
proximity_auth::ScreenlockBridge::LockHandler::AuthType auth_type,
const base::string16& initial_value) {
- CallJS("login.AccountPickerScreen.setAuthType", user_id,
+ CallJS("login.AccountPickerScreen.setAuthType", account_id,
static_cast<int>(auth_type), base::StringValue(initial_value));
}
diff --git a/chrome/browser/ui/webui/chromeos/login/user_board_screen_handler.h b/chrome/browser/ui/webui/chromeos/login/user_board_screen_handler.h
index 1c85437..fd8d52e 100644
--- a/chrome/browser/ui/webui/chromeos/login/user_board_screen_handler.h
+++ b/chrome/browser/ui/webui/chromeos/login/user_board_screen_handler.h
@@ -32,23 +32,23 @@ class UserBoardScreenHandler : public BaseScreenHandler, public UserBoardView {
// Handlers
void HandleGetUsers();
- void HandleHardlockPod(const std::string& user_id);
- void HandleAttemptUnlock(const std::string& user_id);
- void HandleRecordClickOnLockIcon(const std::string& user_id);
+ void HandleHardlockPod(const AccountId& account_id);
+ void HandleAttemptUnlock(const AccountId& account_id);
+ void HandleRecordClickOnLockIcon(const AccountId& account_id);
// UserBoardView implementation:
- void SetPublicSessionDisplayName(const std::string& user_id,
+ void SetPublicSessionDisplayName(const AccountId& account_id,
const std::string& display_name) override;
- void SetPublicSessionLocales(const std::string& user_id,
+ void SetPublicSessionLocales(const AccountId& account_id,
scoped_ptr<base::ListValue> locales,
const std::string& default_locale,
bool multiple_recommended_locales) override;
void ShowBannerMessage(const base::string16& message) override;
- void ShowUserPodCustomIcon(const std::string& user_id,
+ void ShowUserPodCustomIcon(const AccountId& account_id,
const base::DictionaryValue& icon) override;
- void HideUserPodCustomIcon(const std::string& user_id) override;
+ void HideUserPodCustomIcon(const AccountId& account_id) override;
void SetAuthType(
- const std::string& user_id,
+ const AccountId& account_id,
proximity_auth::ScreenlockBridge::LockHandler::AuthType auth_type,
const base::string16& initial_value) override;
diff --git a/chrome/browser/ui/webui/options/chromeos/user_image_source.cc b/chrome/browser/ui/webui/options/chromeos/user_image_source.cc
index 46572be..36ffb10 100644
--- a/chrome/browser/ui/webui/options/chromeos/user_image_source.cc
+++ b/chrome/browser/ui/webui/options/chromeos/user_image_source.cc
@@ -21,14 +21,24 @@
namespace {
// Parses the user image URL, which looks like
-// "chrome://userimage/user@host?key1=value1&...&key_n=value_n",
+// "chrome://userimage/serialized-user-id?key1=value1&...&key_n=value_n",
// to user email.
void ParseRequest(const GURL& url,
std::string* email) {
DCHECK(url.is_valid());
- *email = net::UnescapeURLComponent(url.path().substr(1),
- (net::UnescapeRule::URL_SPECIAL_CHARS |
- net::UnescapeRule::SPACES));
+ const std::string serialized_account_id = net::UnescapeURLComponent(
+ url.path().substr(1),
+ (net::UnescapeRule::URL_SPECIAL_CHARS | net::UnescapeRule::SPACES));
+ AccountId account_id(EmptyAccountId());
+ const bool status =
+ AccountId::Deserialize(serialized_account_id, &account_id);
+ // TODO(alemate): DCHECK(status) - should happen after options page is
+ // migrated.
+ if (!status) {
+ LOG(WARNING) << "Failed to deserialize '" << serialized_account_id << "'";
+ account_id = AccountId::FromUserEmail(serialized_account_id);
+ }
+ *email = account_id.GetUserEmail();
}
} // namespace
diff --git a/components/login.gypi b/components/login.gypi
index e8a6bb1..ac66212 100644
--- a/components/login.gypi
+++ b/components/login.gypi
@@ -8,6 +8,7 @@
'type': '<(component)',
'dependencies': [
'<(DEPTH)/base/base.gyp:base',
+ '<(DEPTH)/components/components.gyp:signin_core_account_id',
'<(DEPTH)/ui/base/ui_base.gyp:ui_base',
],
'export_dependent_settings': [
diff --git a/components/login/BUILD.gn b/components/login/BUILD.gn
index 26a2868..8d20888 100644
--- a/components/login/BUILD.gn
+++ b/components/login/BUILD.gn
@@ -16,6 +16,7 @@ component("login") {
deps = [
"//ui/base",
+ "//components/signin/core/account_id",
]
public_deps = [
diff --git a/components/login/DEPS b/components/login/DEPS
index 6df15b8..da38c4d 100644
--- a/components/login/DEPS
+++ b/components/login/DEPS
@@ -1,3 +1,4 @@
include_rules = [
+ "+components/signin/core/account_id/account_id.h",
"+ui/base/l10n"
]
diff --git a/components/login/base_screen_handler_utils.cc b/components/login/base_screen_handler_utils.cc
index 6454cdf..fd977a3 100644
--- a/components/login/base_screen_handler_utils.cc
+++ b/components/login/base_screen_handler_utils.cc
@@ -4,6 +4,8 @@
#include "components/login/base_screen_handler_utils.h"
+#include "components/signin/core/account_id/account_id.h"
+
namespace login {
namespace {
@@ -56,6 +58,20 @@ bool ParseValue(const base::Value* value, String16List* out_value) {
return ParseStringList(value, out_value);
}
+bool ParseValue(const base::Value* value, AccountId* out_value) {
+ std::string serialized;
+ const bool has_string = value->GetAsString(&serialized);
+ if (!has_string)
+ return false;
+
+ if (AccountId::Deserialize(serialized, out_value))
+ return true;
+
+ LOG(ERROR) << "Failed to deserialize '" << serialized << "'";
+ *out_value = AccountId::FromUserEmail(serialized);
+ return true;
+}
+
base::FundamentalValue MakeValue(bool v) {
return base::FundamentalValue(v);
}
@@ -76,4 +92,11 @@ base::StringValue MakeValue(const base::string16& v) {
return base::StringValue(v);
}
+base::StringValue MakeValue(const AccountId& v) {
+ return base::StringValue(v.Serialize());
+}
+
+ParsedValueContainer<AccountId>::ParsedValueContainer() {
+}
+
} // namespace login
diff --git a/components/login/base_screen_handler_utils.h b/components/login/base_screen_handler_utils.h
index 71d2e7f..7d884d2 100644
--- a/components/login/base_screen_handler_utils.h
+++ b/components/login/base_screen_handler_utils.h
@@ -14,6 +14,7 @@
#include "base/tuple.h"
#include "base/values.h"
#include "components/login/login_export.h"
+#include "components/signin/core/account_id/account_id.h"
namespace login {
@@ -40,6 +41,7 @@ bool LOGIN_EXPORT ParseValue(const base::Value* value,
const base::DictionaryValue** out_value);
bool LOGIN_EXPORT ParseValue(const base::Value* value, StringList* out_value);
bool LOGIN_EXPORT ParseValue(const base::Value* value, String16List* out_value);
+bool LOGIN_EXPORT ParseValue(const base::Value* value, AccountId* out_value);
template <typename T>
inline bool GetArg(const base::ListValue* args, size_t index, T* out_value) {
@@ -54,17 +56,29 @@ base::FundamentalValue LOGIN_EXPORT MakeValue(int v);
base::FundamentalValue LOGIN_EXPORT MakeValue(double v);
base::StringValue LOGIN_EXPORT MakeValue(const std::string& v);
base::StringValue LOGIN_EXPORT MakeValue(const base::string16& v);
+base::StringValue LOGIN_EXPORT MakeValue(const AccountId& v);
template <typename T>
inline const T& MakeValue(const T& v) {
return v;
}
+template <typename T>
+struct ParsedValueContainer {
+ T value;
+};
+
+template <>
+struct LOGIN_EXPORT ParsedValueContainer<AccountId> {
+ ParsedValueContainer();
+ AccountId value = EmptyAccountId();
+};
+
template <typename Arg, size_t index>
typename UnwrapConstRef<Arg>::Type ParseArg(const base::ListValue* args) {
- typename UnwrapConstRef<Arg>::Type parsed;
- CHECK(GetArg(args, index, &parsed));
- return parsed;
+ ParsedValueContainer<typename UnwrapConstRef<Arg>::Type> parsed;
+ CHECK(GetArg(args, index, &parsed.value));
+ return parsed.value;
}
template <typename... Args, size_t... Ns>
diff --git a/components/signin/core/account_id/account_id.cc b/components/signin/core/account_id/account_id.cc
index 65b237f..e933f4b 100644
--- a/components/signin/core/account_id/account_id.cc
+++ b/components/signin/core/account_id/account_id.cc
@@ -6,7 +6,10 @@
#include <functional>
+#include "base/json/json_reader.h"
+#include "base/json/json_writer.h"
#include "base/memory/singleton.h"
+#include "base/values.h"
#include "google_apis/gaia/gaia_auth_util.h"
namespace {
@@ -14,6 +17,10 @@ namespace {
// Known account types.
const char kGoogle[] = "google";
+// Serialization keys
+const char kGaiaIdKey[] = "gaia_id";
+const char kEmailKey[] = "email";
+
struct GoogleStringSingleton {
GoogleStringSingleton() : google(kGoogle) {}
@@ -115,6 +122,47 @@ AccountId AccountId::FromUserEmailGaiaId(const std::string& email,
return AccountId(gaia_id, email);
}
+std::string AccountId::Serialize() const {
+ base::DictionaryValue value;
+ value.SetString(kGaiaIdKey, gaia_id_);
+ value.SetString(kEmailKey, user_email_);
+
+ std::string serialized;
+ base::JSONWriter::Write(value, &serialized);
+ return serialized;
+}
+
+// static
+bool AccountId::Deserialize(const std::string& serialized,
+ AccountId* account_id) {
+ base::JSONReader reader;
+ scoped_ptr<const base::Value> value(reader.Read(serialized));
+ const base::DictionaryValue* dictionary_value = NULL;
+
+ if (!value || !value->GetAsDictionary(&dictionary_value))
+ return false;
+
+ std::string gaia_id;
+ std::string user_email;
+
+ const bool found_gaia_id = dictionary_value->GetString(kGaiaIdKey, &gaia_id);
+ const bool found_user_email =
+ dictionary_value->GetString(kEmailKey, &user_email);
+
+ if (!found_gaia_id)
+ LOG(ERROR) << "gaia_id is not found in '" << serialized << "'";
+
+ if (!found_user_email)
+ LOG(ERROR) << "user_email is not found in '" << serialized << "'";
+
+ if (!found_gaia_id && !found_user_email)
+ return false;
+
+ *account_id = FromUserEmailGaiaId(user_email, gaia_id);
+
+ return true;
+}
+
const AccountId& EmptyAccountId() {
return AccountId::EmptyAccountId::GetInstance()->user_id;
}
diff --git a/components/signin/core/account_id/account_id.h b/components/signin/core/account_id/account_id.h
index 73be450..9f72030 100644
--- a/components/signin/core/account_id/account_id.h
+++ b/components/signin/core/account_id/account_id.h
@@ -45,8 +45,13 @@ class AccountId {
static AccountId FromUserEmailGaiaId(const std::string& user_email,
const std::string& gaia_id);
- // std::string Serialize() const;
- // static AccountId Deserialize(const std::string& serialized);
+ // These are (for now) unstable and cannot be used to store serialized data to
+ // persistent storage. Only in-memory storage is safe.
+ // Serialize() returns JSON dictionary,
+ // Deserialize() restores AccountId after serialization.
+ std::string Serialize() const;
+ static bool Deserialize(const std::string& serialized,
+ AccountId* out_account_id);
private:
AccountId();
diff --git a/components/user_manager/empty_user_info.cc b/components/user_manager/empty_user_info.cc
index 08d4a19..07b4087 100644
--- a/components/user_manager/empty_user_info.cc
+++ b/components/user_manager/empty_user_info.cc
@@ -31,7 +31,7 @@ std::string EmptyUserInfo::GetEmail() const {
return std::string();
}
-AccountId EmptyUserInfo::GetAccountId() const {
+const AccountId& EmptyUserInfo::GetAccountId() const {
NOTIMPLEMENTED();
return EmptyAccountId();
}
diff --git a/components/user_manager/empty_user_info.h b/components/user_manager/empty_user_info.h
index 76c0d16..5fb41c9 100644
--- a/components/user_manager/empty_user_info.h
+++ b/components/user_manager/empty_user_info.h
@@ -25,7 +25,7 @@ class USER_MANAGER_EXPORT EmptyUserInfo : public UserInfo {
base::string16 GetDisplayName() const override;
base::string16 GetGivenName() const override;
std::string GetEmail() const override;
- AccountId GetAccountId() const override;
+ const AccountId& GetAccountId() const override;
const gfx::ImageSkia& GetImage() const override;
private:
diff --git a/components/user_manager/user.cc b/components/user_manager/user.cc
index 39ef430..3ead416 100644
--- a/components/user_manager/user.cc
+++ b/components/user_manager/user.cc
@@ -123,9 +123,8 @@ const gfx::ImageSkia& User::GetImage() const {
return user_image_.image();
}
-AccountId User::GetAccountId() const {
- return AccountId::FromUserEmail(
- gaia::CanonicalizeEmail(gaia::SanitizeEmail(email())));
+const AccountId& User::GetAccountId() const {
+ return account_id_;
}
void User::SetIsChild(bool is_child) {
diff --git a/components/user_manager/user.h b/components/user_manager/user.h
index fe0899e..71d7016 100644
--- a/components/user_manager/user.h
+++ b/components/user_manager/user.h
@@ -97,7 +97,7 @@ class USER_MANAGER_EXPORT User : public UserInfo {
base::string16 GetDisplayName() const override;
base::string16 GetGivenName() const override;
const gfx::ImageSkia& GetImage() const override;
- AccountId GetAccountId() const override;
+ const AccountId& GetAccountId() const override;
// Allows managing child status of the user. Used for RegularUser.
virtual void SetIsChild(bool is_child);
diff --git a/components/user_manager/user_info.h b/components/user_manager/user_info.h
index 2f0cf19..6a692d6 100644
--- a/components/user_manager/user_info.h
+++ b/components/user_manager/user_info.h
@@ -36,7 +36,7 @@ class USER_MANAGER_EXPORT UserInfo {
virtual std::string GetEmail() const = 0;
// Returns AccountId for the user.
- virtual AccountId GetAccountId() const = 0;
+ virtual const AccountId& GetAccountId() const = 0;
// Gets the avatar image for the user.
virtual const gfx::ImageSkia& GetImage() const = 0;
diff --git a/components/user_manager/user_info_impl.cc b/components/user_manager/user_info_impl.cc
index cf6d2ad..afb2e9d 100644
--- a/components/user_manager/user_info_impl.cc
+++ b/components/user_manager/user_info_impl.cc
@@ -10,8 +10,8 @@
namespace user_manager {
-UserInfoImpl::UserInfoImpl() {
-}
+UserInfoImpl::UserInfoImpl()
+ : account_id_(AccountId::FromUserEmail("stub-user@domain.com")) {}
UserInfoImpl::~UserInfoImpl() {
}
@@ -25,11 +25,11 @@ base::string16 UserInfoImpl::GetGivenName() const {
}
std::string UserInfoImpl::GetEmail() const {
- return "stub-user@domain.com";
+ return account_id_.GetUserEmail();
}
-AccountId UserInfoImpl::GetAccountId() const {
- return AccountId::FromUserEmail(GetEmail());
+const AccountId& UserInfoImpl::GetAccountId() const {
+ return account_id_;
}
const gfx::ImageSkia& UserInfoImpl::GetImage() const {
diff --git a/components/user_manager/user_info_impl.h b/components/user_manager/user_info_impl.h
index 4922e36..d2733eb 100644
--- a/components/user_manager/user_info_impl.h
+++ b/components/user_manager/user_info_impl.h
@@ -8,6 +8,7 @@
#include <string>
#include "base/strings/string16.h"
+#include "components/signin/core/account_id/account_id.h"
#include "components/user_manager/user_info.h"
#include "components/user_manager/user_manager_export.h"
#include "ui/gfx/image/image_skia.h"
@@ -24,10 +25,11 @@ class USER_MANAGER_EXPORT UserInfoImpl : public UserInfo {
base::string16 GetDisplayName() const override;
base::string16 GetGivenName() const override;
std::string GetEmail() const override;
- AccountId GetAccountId() const override;
+ const AccountId& GetAccountId() const override;
const gfx::ImageSkia& GetImage() const override;
private:
+ const AccountId account_id_;
gfx::ImageSkia user_image_;
DISALLOW_COPY_AND_ASSIGN(UserInfoImpl);
diff --git a/components/user_manager/user_manager_base.cc b/components/user_manager/user_manager_base.cc
index 81a68ff..f51d9b1 100644
--- a/components/user_manager/user_manager_base.cc
+++ b/components/user_manager/user_manager_base.cc
@@ -120,13 +120,13 @@ bool UserMatches(const AccountId& account_id,
const base::DictionaryValue& dict) {
std::string value;
- bool has_email = dict.GetString(kCanonicalEmail, &value);
- if (has_email && account_id.GetUserEmail() == value)
+ // TODO(alemate): update code once user id is really a struct.
+ bool has_gaia_id = dict.GetString(kGAIAIdKey, &value);
+ if (has_gaia_id && account_id.GetGaiaId() == value)
return true;
- // TODO(antrim): update code once user id is really a struct.
- bool has_gaia_id = dict.GetString(kGAIAIdKey, &value);
- if (has_gaia_id && account_id.GetUserEmail() == value)
+ bool has_email = dict.GetString(kCanonicalEmail, &value);
+ if (has_email && account_id.GetUserEmail() == value)
return true;
return false;
@@ -582,7 +582,6 @@ void UserManagerBase::UpdateUserAccountData(
UpdateUserAccountLocale(account_id, account_data.locale());
}
-// static
void UserManagerBase::ParseUserList(const base::ListValue& users_list,
const std::set<AccountId>& existing_users,
std::vector<AccountId>* users_vector,
@@ -595,7 +594,21 @@ void UserManagerBase::ParseUserList(const base::ListValue& users_list,
LOG(ERROR) << "Corrupt entry in user list at index " << i << ".";
continue;
}
- const AccountId account_id(AccountId::FromUserEmail(email));
+
+ const AccountId partial_account_id = AccountId::FromUserEmail(email);
+ AccountId account_id = EmptyAccountId();
+
+ const bool lookup_result =
+ GetKnownUserAccountId(partial_account_id, &account_id);
+ // TODO(alemate):
+ // DCHECK(lookup_result) << "KnownUser lookup falied for '" << email << "'";
+ // (tests do not initialize KnownUserData)
+
+ if (!lookup_result) {
+ account_id = partial_account_id;
+ LOG(WARNING) << "KnownUser lookup falied for '" << email << "'";
+ }
+
if (existing_users.find(account_id) != existing_users.end() ||
!users_set->insert(account_id).second) {
LOG(ERROR) << "Duplicate user: " << email;
@@ -849,6 +862,7 @@ void UserManagerBase::EnsureUsersLoaded() {
ChangeUserChildStatus(user, true /* is child */);
}
}
+ const AccountId account_id = user->GetAccountId();
user->set_oauth_token_status(LoadUserOAuthStatus(*it));
user->set_force_online_signin(LoadForceOnlineSignin(*it));
user->set_using_saml(FindUsingSAML(*it));
@@ -1152,15 +1166,25 @@ void UserManagerBase::SetKnownUserIntegerPref(const AccountId& account_id,
bool UserManagerBase::GetKnownUserAccountId(
const AccountId& authenticated_account_id,
AccountId* out_account_id) {
- DCHECK(!authenticated_account_id.GetGaiaId().empty());
- std::string canonical_email;
- if (!GetKnownUserStringPref(
- AccountId::FromGaiaId(authenticated_account_id.GetGaiaId()),
- kCanonicalEmail, &canonical_email))
+ if (!authenticated_account_id.GetGaiaId().empty()) {
+ std::string canonical_email;
+ if (!GetKnownUserStringPref(
+ AccountId::FromGaiaId(authenticated_account_id.GetGaiaId()),
+ kCanonicalEmail, &canonical_email)) {
+ return false;
+ }
+
+ *out_account_id = AccountId::FromUserEmailGaiaId(
+ canonical_email, authenticated_account_id.GetGaiaId());
+ return true;
+ }
+ DCHECK(!authenticated_account_id.GetUserEmail().empty());
+ std::string gaia_id;
+ if (!GetKnownUserStringPref(authenticated_account_id, kGAIAIdKey, &gaia_id))
return false;
- *out_account_id = authenticated_account_id;
- out_account_id->SetUserEmail(canonical_email);
+ *out_account_id = AccountId::FromUserEmailGaiaId(
+ authenticated_account_id.GetUserEmail(), gaia_id);
return true;
}
diff --git a/components/user_manager/user_manager_base.h b/components/user_manager/user_manager_base.h
index ead7d44..dd46c5d 100644
--- a/components/user_manager/user_manager_base.h
+++ b/components/user_manager/user_manager_base.h
@@ -154,13 +154,13 @@ class USER_MANAGER_EXPORT UserManagerBase : public UserManager {
// TODO(xiyuan): Figure out a better way to expose this info.
virtual bool HasPendingBootstrap(const AccountId& account_id) const;
- // Helper function that copies users from |users_list| to |users_vector| and
+ // Helper function that converts users from |users_list| to |users_vector| and
// |users_set|. Duplicates and users already present in |existing_users| are
// skipped.
- static void ParseUserList(const base::ListValue& users_list,
- const std::set<AccountId>& existing_users,
- std::vector<AccountId>* users_vector,
- std::set<AccountId>* users_set);
+ void ParseUserList(const base::ListValue& users_list,
+ const std::set<AccountId>& existing_users,
+ std::vector<AccountId>* users_vector,
+ std::set<AccountId>* users_set);
// Returns true if trusted device policies have successfully been retrieved
// and ephemeral users are enabled.