diff options
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. |