OLD | NEW |
---|---|
1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "chrome/browser/chromeos/login/session/user_session_manager.h" | 5 #include "chrome/browser/chromeos/login/session/user_session_manager.h" |
6 | 6 |
7 #include <string> | 7 #include <string> |
8 | 8 |
9 #include "base/base_paths.h" | 9 #include "base/base_paths.h" |
10 #include "base/bind.h" | 10 #include "base/bind.h" |
(...skipping 432 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
443 | 443 |
444 void UserSessionManager::StartSession( | 444 void UserSessionManager::StartSession( |
445 const UserContext& user_context, | 445 const UserContext& user_context, |
446 StartSessionType start_session_type, | 446 StartSessionType start_session_type, |
447 bool has_auth_cookies, | 447 bool has_auth_cookies, |
448 bool has_active_session, | 448 bool has_active_session, |
449 UserSessionManagerDelegate* delegate) { | 449 UserSessionManagerDelegate* delegate) { |
450 delegate_ = delegate; | 450 delegate_ = delegate; |
451 start_session_type_ = start_session_type; | 451 start_session_type_ = start_session_type; |
452 | 452 |
453 VLOG(1) << "Starting session for " << user_context.GetUserID(); | 453 VLOG(1) << "Starting session for " << user_context.GetUserID().GetUserEmail(); |
454 | 454 |
455 PreStartSession(); | 455 PreStartSession(); |
456 CreateUserSession(user_context, has_auth_cookies); | 456 CreateUserSession(user_context, has_auth_cookies); |
457 | 457 |
458 if (!has_active_session) | 458 if (!has_active_session) |
459 StartCrosSession(); | 459 StartCrosSession(); |
460 | 460 |
461 // TODO(nkostylev): Notify UserLoggedIn() after profile is actually | 461 // TODO(nkostylev): Notify UserLoggedIn() after profile is actually |
462 // ready to be used (http://crbug.com/361528). | 462 // ready to be used (http://crbug.com/361528). |
463 NotifyUserLoggedIn(); | 463 NotifyUserLoggedIn(); |
(...skipping 287 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
751 case OAuth2LoginManager::SESSION_RESTORE_PREPARING: | 751 case OAuth2LoginManager::SESSION_RESTORE_PREPARING: |
752 case OAuth2LoginManager::SESSION_RESTORE_IN_PROGRESS: | 752 case OAuth2LoginManager::SESSION_RESTORE_IN_PROGRESS: |
753 return; | 753 return; |
754 } | 754 } |
755 | 755 |
756 // We should not be clearing existing token state if that was a connection | 756 // We should not be clearing existing token state if that was a connection |
757 // error. http://crbug.com/295245 | 757 // error. http://crbug.com/295245 |
758 if (!connection_error) { | 758 if (!connection_error) { |
759 // We are in one of "done" states here. | 759 // We are in one of "done" states here. |
760 user_manager::UserManager::Get()->SaveUserOAuthStatus( | 760 user_manager::UserManager::Get()->SaveUserOAuthStatus( |
761 user_manager::UserManager::Get()->GetLoggedInUser()->email(), | 761 user_manager::UserManager::Get()->GetLoggedInUser()->GetUserID(), |
762 user_status); | 762 user_status); |
763 } | 763 } |
764 | 764 |
765 login_manager->RemoveObserver(this); | 765 login_manager->RemoveObserver(this); |
766 | 766 |
767 if (exit_after_session_restore_ && | 767 if (exit_after_session_restore_ && |
768 (state == OAuth2LoginManager::SESSION_RESTORE_DONE || | 768 (state == OAuth2LoginManager::SESSION_RESTORE_DONE || |
769 state == OAuth2LoginManager::SESSION_RESTORE_FAILED || | 769 state == OAuth2LoginManager::SESSION_RESTORE_FAILED || |
770 state == OAuth2LoginManager::SESSION_RESTORE_CONNECTION_FAILED)) { | 770 state == OAuth2LoginManager::SESSION_RESTORE_CONNECTION_FAILED)) { |
771 LOG(WARNING) << "Restarting Chrome after session restore finishes, " | 771 LOG(WARNING) << "Restarting Chrome after session restore finishes, " |
(...skipping 90 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
862 // Store obfuscated GAIA ID. | 862 // Store obfuscated GAIA ID. |
863 if (!user_context_.GetGaiaID().empty()) { | 863 if (!user_context_.GetGaiaID().empty()) { |
864 user_manager::UserManager::Get()->UpdateGaiaID(user_context_.GetUserID(), | 864 user_manager::UserManager::Get()->UpdateGaiaID(user_context_.GetUserID(), |
865 user_context_.GetGaiaID()); | 865 user_context_.GetGaiaID()); |
866 } | 866 } |
867 } | 867 } |
868 | 868 |
869 void UserSessionManager::StartCrosSession() { | 869 void UserSessionManager::StartCrosSession() { |
870 BootTimesRecorder* btl = BootTimesRecorder::Get(); | 870 BootTimesRecorder* btl = BootTimesRecorder::Get(); |
871 btl->AddLoginTimeMarker("StartSession-Start", false); | 871 btl->AddLoginTimeMarker("StartSession-Start", false); |
872 DBusThreadManager::Get()->GetSessionManagerClient()-> | 872 DBusThreadManager::Get()->GetSessionManagerClient()->StartSession( |
873 StartSession(user_context_.GetUserID()); | 873 user_context_.GetUserID().GetUserEmail()); |
874 btl->AddLoginTimeMarker("StartSession-End", false); | 874 btl->AddLoginTimeMarker("StartSession-End", false); |
875 } | 875 } |
876 | 876 |
877 void UserSessionManager::NotifyUserLoggedIn() { | 877 void UserSessionManager::NotifyUserLoggedIn() { |
878 BootTimesRecorder* btl = BootTimesRecorder::Get(); | 878 BootTimesRecorder* btl = BootTimesRecorder::Get(); |
879 btl->AddLoginTimeMarker("UserLoggedIn-Start", false); | 879 btl->AddLoginTimeMarker("UserLoggedIn-Start", false); |
880 user_manager::UserManager* user_manager = user_manager::UserManager::Get(); | 880 user_manager::UserManager* user_manager = user_manager::UserManager::Get(); |
881 user_manager->UserLoggedIn(user_context_.GetUserID(), | 881 user_manager->UserLoggedIn(user_context_.GetUserID(), |
882 user_context_.GetUserIDHash(), | 882 user_context_.GetUserIDHash(), |
883 false); | 883 false); |
884 btl->AddLoginTimeMarker("UserLoggedIn-End", false); | 884 btl->AddLoginTimeMarker("UserLoggedIn-End", false); |
885 } | 885 } |
886 | 886 |
887 void UserSessionManager::PrepareProfile() { | 887 void UserSessionManager::PrepareProfile() { |
888 bool is_demo_session = | 888 bool is_demo_session = DemoAppLauncher::IsDemoAppSession( |
achuithb
2015/10/23 00:08:50
const bool
Alexander Alekseev
2015/10/23 09:11:22
Done.
| |
889 DemoAppLauncher::IsDemoAppSession(user_context_.GetUserID()); | 889 user_context_.GetUserID().GetUserEmail()); |
890 | 890 |
891 // TODO(nkostylev): Figure out whether demo session is using the right profile | 891 // TODO(nkostylev): Figure out whether demo session is using the right profile |
892 // path or not. See https://codereview.chromium.org/171423009 | 892 // path or not. See https://codereview.chromium.org/171423009 |
893 g_browser_process->profile_manager()->CreateProfileAsync( | 893 g_browser_process->profile_manager()->CreateProfileAsync( |
894 ProfileHelper::GetProfilePathByUserIdHash(user_context_.GetUserIDHash()), | 894 ProfileHelper::GetProfilePathByUserIdHash(user_context_.GetUserIDHash()), |
895 base::Bind(&UserSessionManager::OnProfileCreated, | 895 base::Bind(&UserSessionManager::OnProfileCreated, |
896 AsWeakPtr(), | 896 AsWeakPtr(), |
897 user_context_, | 897 user_context_, |
898 is_demo_session), | 898 is_demo_session), |
899 base::string16(), | 899 base::string16(), |
(...skipping 61 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
961 } else if (user_manager::UserManager::Get()-> | 961 } else if (user_manager::UserManager::Get()-> |
962 IsLoggedInAsUserWithGaiaAccount()) { | 962 IsLoggedInAsUserWithGaiaAccount()) { |
963 // Get the Gaia ID from the user context. If it's not available, this may | 963 // Get the Gaia ID from the user context. If it's not available, this may |
964 // not be available when unlocking a previously opened profile, or when | 964 // not be available when unlocking a previously opened profile, or when |
965 // creating a supervised users. However, in these cases the gaia_id should | 965 // creating a supervised users. However, in these cases the gaia_id should |
966 // be already available in the account tracker. | 966 // be already available in the account tracker. |
967 std::string gaia_id = user_context.GetGaiaID(); | 967 std::string gaia_id = user_context.GetGaiaID(); |
968 if (gaia_id.empty()) { | 968 if (gaia_id.empty()) { |
969 AccountTrackerService* account_tracker = | 969 AccountTrackerService* account_tracker = |
970 AccountTrackerServiceFactory::GetForProfile(profile); | 970 AccountTrackerServiceFactory::GetForProfile(profile); |
971 AccountInfo info = | 971 AccountInfo info = account_tracker->FindAccountInfoByEmail( |
achuithb
2015/10/23 00:08:50
const
Alexander Alekseev
2015/10/23 09:11:22
Done.
| |
972 account_tracker->FindAccountInfoByEmail(user_context.GetUserID()); | 972 user_context.GetUserID().GetUserEmail()); |
973 gaia_id = info.gaia; | 973 gaia_id = info.gaia; |
974 DCHECK(!gaia_id.empty()); | 974 DCHECK(!gaia_id.empty()); |
975 } | 975 } |
976 | 976 |
977 // Make sure that the google service username is properly set (we do this | 977 // Make sure that the google service username is properly set (we do this |
978 // on every sign in, not just the first login, to deal with existing | 978 // on every sign in, not just the first login, to deal with existing |
979 // profiles that might not have it set yet). | 979 // profiles that might not have it set yet). |
980 SigninManagerBase* signin_manager = | 980 SigninManagerBase* signin_manager = |
981 SigninManagerFactory::GetForProfile(profile); | 981 SigninManagerFactory::GetForProfile(profile); |
982 signin_manager->SetAuthenticatedAccountInfo(gaia_id, | 982 signin_manager->SetAuthenticatedAccountInfo( |
983 user_context.GetUserID()); | 983 gaia_id, user_context.GetUserID().GetUserEmail()); |
984 | 984 |
985 // Backfill GAIA ID in user prefs stored in Local State. | 985 // Backfill GAIA ID in user prefs stored in Local State. |
986 std::string tmp_gaia_id; | 986 std::string tmp_gaia_id; |
987 user_manager::UserManager* user_manager = user_manager::UserManager::Get(); | 987 user_manager::UserManager* user_manager = user_manager::UserManager::Get(); |
988 if (!user_manager->FindGaiaID(user_context.GetUserID(), &tmp_gaia_id) && | 988 if (!user_manager->FindGaiaID(user_context.GetUserID(), &tmp_gaia_id) && |
989 !gaia_id.empty()) { | 989 !gaia_id.empty()) { |
990 user_manager->UpdateGaiaID(user_context.GetUserID(), gaia_id); | 990 user_manager->UpdateGaiaID(user_context.GetUserID(), gaia_id); |
991 } | 991 } |
992 } | 992 } |
993 } | 993 } |
994 | 994 |
995 void UserSessionManager::UserProfileInitialized(Profile* profile, | 995 void UserSessionManager::UserProfileInitialized(Profile* profile, |
996 bool is_incognito_profile, | 996 bool is_incognito_profile, |
997 const std::string& user_id) { | 997 const AccountId& user_id) { |
achuithb
2015/10/23 00:08:50
account_id
Alexander Alekseev
2015/10/23 09:11:22
Done.
| |
998 // Demo user signed in. | 998 // Demo user signed in. |
999 if (is_incognito_profile) { | 999 if (is_incognito_profile) { |
1000 profile->OnLogin(); | 1000 profile->OnLogin(); |
1001 | 1001 |
1002 // Send the notification before creating the browser so additional objects | 1002 // Send the notification before creating the browser so additional objects |
1003 // that need the profile (e.g. the launcher) can be created first. | 1003 // that need the profile (e.g. the launcher) can be created first. |
1004 content::NotificationService::current()->Notify( | 1004 content::NotificationService::current()->Notify( |
1005 chrome::NOTIFICATION_LOGIN_USER_PROFILE_PREPARED, | 1005 chrome::NOTIFICATION_LOGIN_USER_PROFILE_PREPARED, |
1006 content::NotificationService::AllSources(), | 1006 content::NotificationService::AllSources(), |
1007 content::Details<Profile>(profile)); | 1007 content::Details<Profile>(profile)); |
1008 | 1008 |
1009 if (delegate_) | 1009 if (delegate_) |
1010 delegate_->OnProfilePrepared(profile, false); | 1010 delegate_->OnProfilePrepared(profile, false); |
1011 | 1011 |
1012 return; | 1012 return; |
1013 } | 1013 } |
1014 | 1014 |
1015 BootTimesRecorder* btl = BootTimesRecorder::Get(); | 1015 BootTimesRecorder* btl = BootTimesRecorder::Get(); |
1016 btl->AddLoginTimeMarker("UserProfileGotten", false); | 1016 btl->AddLoginTimeMarker("UserProfileGotten", false); |
1017 | 1017 |
1018 if (user_context_.IsUsingOAuth()) { | 1018 if (user_context_.IsUsingOAuth()) { |
1019 // Retrieve the policy that indicates whether to continue copying | 1019 // Retrieve the policy that indicates whether to continue copying |
1020 // authentication cookies set by a SAML IdP on subsequent logins after the | 1020 // authentication cookies set by a SAML IdP on subsequent logins after the |
1021 // first. | 1021 // first. |
1022 bool transfer_saml_auth_cookies_on_subsequent_login = false; | 1022 bool transfer_saml_auth_cookies_on_subsequent_login = false; |
1023 if (has_auth_cookies_ && | 1023 if (has_auth_cookies_ && |
1024 g_browser_process->platform_part()-> | 1024 g_browser_process->platform_part() |
1025 browser_policy_connector_chromeos()->GetUserAffiliation(user_id) == | 1025 ->browser_policy_connector_chromeos() |
1026 policy::USER_AFFILIATION_MANAGED) { | 1026 ->GetUserAffiliation(user_id.GetUserEmail()) == |
1027 policy::USER_AFFILIATION_MANAGED) { | |
1027 CrosSettings::Get()->GetBoolean( | 1028 CrosSettings::Get()->GetBoolean( |
1028 kAccountsPrefTransferSAMLCookies, | 1029 kAccountsPrefTransferSAMLCookies, |
1029 &transfer_saml_auth_cookies_on_subsequent_login); | 1030 &transfer_saml_auth_cookies_on_subsequent_login); |
1030 } | 1031 } |
1031 | 1032 |
1032 // Transfers authentication-related data from the profile that was used for | 1033 // Transfers authentication-related data from the profile that was used for |
1033 // authentication to the user's profile. The proxy authentication state is | 1034 // authentication to the user's profile. The proxy authentication state is |
1034 // transferred unconditionally. If the user authenticated via an auth | 1035 // transferred unconditionally. If the user authenticated via an auth |
1035 // extension, authentication cookies and channel IDs will be transferred as | 1036 // extension, authentication cookies and channel IDs will be transferred as |
1036 // well when the user's cookie jar is empty. If the cookie jar is not empty, | 1037 // well when the user's cookie jar is empty. If the cookie jar is not empty, |
(...skipping 396 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1433 ++it) { | 1434 ++it) { |
1434 const user_manager::User* user = (*it); | 1435 const user_manager::User* user = (*it); |
1435 if (user->email() == user_id) { | 1436 if (user->email() == user_id) { |
1436 user_already_logged_in = true; | 1437 user_already_logged_in = true; |
1437 break; | 1438 break; |
1438 } | 1439 } |
1439 } | 1440 } |
1440 DCHECK(!user_already_logged_in); | 1441 DCHECK(!user_already_logged_in); |
1441 | 1442 |
1442 if (!user_already_logged_in) { | 1443 if (!user_already_logged_in) { |
1443 UserContext user_context(user_id); | 1444 UserContext user_context(AccountId::FromUserEmail(user_id)); |
1444 user_context.SetUserIDHash(user_id_hash); | 1445 user_context.SetUserIDHash(user_id_hash); |
1445 user_context.SetIsUsingOAuth(false); | 1446 user_context.SetIsUsingOAuth(false); |
1446 | 1447 |
1447 // Will call OnProfilePrepared() once profile has been loaded. | 1448 // Will call OnProfilePrepared() once profile has been loaded. |
1448 // Only handling secondary users here since primary user profile | 1449 // Only handling secondary users here since primary user profile |
1449 // (and session) has been loaded on Chrome startup. | 1450 // (and session) has been loaded on Chrome startup. |
1450 StartSession(user_context, | 1451 StartSession(user_context, |
1451 SECONDARY_USER_SESSION_AFTER_CRASH, | 1452 SECONDARY_USER_SESSION_AFTER_CRASH, |
1452 false, // has_auth_cookies | 1453 false, // has_auth_cookies |
1453 true, // has_active_session, this is restart after crash | 1454 true, // has_active_session, this is restart after crash |
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1496 | 1497 |
1497 base::ListValue empty_list; | 1498 base::ListValue empty_list; |
1498 if (!device_list) | 1499 if (!device_list) |
1499 device_list = &empty_list; | 1500 device_list = &empty_list; |
1500 | 1501 |
1501 EasyUnlockKeyManager* key_manager = GetEasyUnlockKeyManager(); | 1502 EasyUnlockKeyManager* key_manager = GetEasyUnlockKeyManager(); |
1502 running_easy_unlock_key_ops_ = true; | 1503 running_easy_unlock_key_ops_ = true; |
1503 key_manager->RefreshKeys( | 1504 key_manager->RefreshKeys( |
1504 user_context, *device_list, | 1505 user_context, *device_list, |
1505 base::Bind(&UserSessionManager::OnEasyUnlockKeyOpsFinished, AsWeakPtr(), | 1506 base::Bind(&UserSessionManager::OnEasyUnlockKeyOpsFinished, AsWeakPtr(), |
1506 user_context.GetUserID())); | 1507 user_context.GetUserID().GetUserEmail())); |
1507 } | 1508 } |
1508 | 1509 |
1509 net::URLRequestContextGetter* | 1510 net::URLRequestContextGetter* |
1510 UserSessionManager::GetAuthRequestContext() const { | 1511 UserSessionManager::GetAuthRequestContext() const { |
1511 net::URLRequestContextGetter* auth_request_context = nullptr; | 1512 net::URLRequestContextGetter* auth_request_context = nullptr; |
1512 | 1513 |
1513 if (StartupUtils::IsWebviewSigninEnabled()) { | 1514 if (StartupUtils::IsWebviewSigninEnabled()) { |
1514 // Webview uses different partition storage than iframe. We need to get | 1515 // Webview uses different partition storage than iframe. We need to get |
1515 // cookies from the right storage for url request to get auth token into | 1516 // cookies from the right storage for url request to get auth token into |
1516 // session. | 1517 // session. |
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1557 exit_after_session_restore_ = true; | 1558 exit_after_session_restore_ = true; |
1558 } | 1559 } |
1559 | 1560 |
1560 void UserSessionManager::OnEasyUnlockKeyOpsFinished( | 1561 void UserSessionManager::OnEasyUnlockKeyOpsFinished( |
1561 const std::string& user_id, | 1562 const std::string& user_id, |
1562 bool success) { | 1563 bool success) { |
1563 running_easy_unlock_key_ops_ = false; | 1564 running_easy_unlock_key_ops_ = false; |
1564 if (!easy_unlock_key_ops_finished_callback_.is_null()) | 1565 if (!easy_unlock_key_ops_finished_callback_.is_null()) |
1565 easy_unlock_key_ops_finished_callback_.Run(); | 1566 easy_unlock_key_ops_finished_callback_.Run(); |
1566 | 1567 |
1567 const user_manager::User* user = | 1568 const user_manager::User* user = user_manager::UserManager::Get()->FindUser( |
1568 user_manager::UserManager::Get()->FindUser(user_id); | 1569 AccountId::FromUserEmail(user_id)); |
1569 EasyUnlockService* easy_unlock_service = | 1570 EasyUnlockService* easy_unlock_service = |
1570 EasyUnlockService::GetForUser(*user); | 1571 EasyUnlockService::GetForUser(*user); |
1571 easy_unlock_service->CheckCryptohomeKeysAndMaybeHardlock(); | 1572 easy_unlock_service->CheckCryptohomeKeysAndMaybeHardlock(); |
1572 } | 1573 } |
1573 | 1574 |
1574 void UserSessionManager::ActiveUserChanged( | 1575 void UserSessionManager::ActiveUserChanged( |
1575 const user_manager::User* active_user) { | 1576 const user_manager::User* active_user) { |
1576 if (!user_manager::UserManager::Get()->IsCurrentUserNew()) | 1577 if (!user_manager::UserManager::Get()->IsCurrentUserNew()) |
1577 SendUserPodsMetrics(); | 1578 SendUserPodsMetrics(); |
1578 | 1579 |
(...skipping 151 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1730 token_handle_fetcher_.reset(new TokenHandleFetcher( | 1731 token_handle_fetcher_.reset(new TokenHandleFetcher( |
1731 token_handle_util_.get(), context.GetUserID())); | 1732 token_handle_util_.get(), context.GetUserID())); |
1732 token_handle_fetcher_->FillForNewUser( | 1733 token_handle_fetcher_->FillForNewUser( |
1733 context.GetAccessToken(), | 1734 context.GetAccessToken(), |
1734 base::Bind(&UserSessionManager::OnTokenHandleObtained, | 1735 base::Bind(&UserSessionManager::OnTokenHandleObtained, |
1735 weak_factory_.GetWeakPtr())); | 1736 weak_factory_.GetWeakPtr())); |
1736 } | 1737 } |
1737 } | 1738 } |
1738 } | 1739 } |
1739 | 1740 |
1740 void UserSessionManager::OnTokenHandleObtained(const user_manager::UserID& id, | 1741 void UserSessionManager::OnTokenHandleObtained(const AccountId& id, |
achuithb
2015/10/23 00:08:50
account_id
Alexander Alekseev
2015/10/23 09:11:22
Done.
| |
1741 bool success) { | 1742 bool success) { |
1742 if (!success) | 1743 if (!success) |
1743 LOG(ERROR) << "OAuth2 token handle fetch failed."; | 1744 LOG(ERROR) << "OAuth2 token handle fetch failed."; |
1744 token_handle_fetcher_.reset(); | 1745 token_handle_fetcher_.reset(); |
1745 } | 1746 } |
1746 | 1747 |
1747 bool UserSessionManager::TokenHandlesEnabled() { | 1748 bool UserSessionManager::TokenHandlesEnabled() { |
1748 if (!should_obtain_handles_) | 1749 if (!should_obtain_handles_) |
1749 return false; | 1750 return false; |
1750 bool ephemeral_users_enabled = false; | 1751 bool ephemeral_users_enabled = false; |
(...skipping 12 matching lines...) Expand all Loading... | |
1763 first_run::GoodiesDisplayer::Delete(); | 1764 first_run::GoodiesDisplayer::Delete(); |
1764 } | 1765 } |
1765 | 1766 |
1766 void UserSessionManager::CreateTokenUtilIfMissing() { | 1767 void UserSessionManager::CreateTokenUtilIfMissing() { |
1767 if (!token_handle_util_.get()) | 1768 if (!token_handle_util_.get()) |
1768 token_handle_util_.reset( | 1769 token_handle_util_.reset( |
1769 new TokenHandleUtil(user_manager::UserManager::Get())); | 1770 new TokenHandleUtil(user_manager::UserManager::Get())); |
1770 } | 1771 } |
1771 | 1772 |
1772 } // namespace chromeos | 1773 } // namespace chromeos |
OLD | NEW |