login_utils.cc revision 9ab5563a3196760eb381d102cbb2bc0f7abc6a50
15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/chromeos/login/login_utils.h" 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <algorithm> 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <vector> 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/chromeos/chromeos_version.h" 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/command_line.h" 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/compiler_specific.h" 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/file_util.h" 142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/files/file_path.h" 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/location.h" 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/ref_counted.h" 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/scoped_ptr.h" 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/singleton.h" 197d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "base/memory/weak_ptr.h" 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/path_service.h" 212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/prefs/pref_member.h" 222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/prefs/pref_registry_simple.h" 232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/prefs/pref_service.h" 245e3f23d412006dc4db4e659864679f29341e113fTorne (Richard Coles)#include "base/strings/string_util.h" 25868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/utf_string_conversions.h" 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/synchronization/lock.h" 272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/task_runner_util.h" 282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/threading/worker_pool.h" 29eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "base/time/time.h" 302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/about_flags.h" 312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/app_mode/app_mode_utils.h" 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/browser_process.h" 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/browser_shutdown.h" 347dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "chrome/browser/chrome_notification_types.h" 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/chromeos/boot_times_loader.h" 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/chromeos/input_method/input_method_util.h" 372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/chromeos/login/chrome_restart_request.h" 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/chromeos/login/language_switch_menu.h" 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/chromeos/login/login_display_host.h" 402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/chromeos/login/oauth_login_manager.h" 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/chromeos/login/parallel_authenticator.h" 422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/chromeos/login/profile_auth_data.h" 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/chromeos/login/screen_locker.h" 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/chromeos/login/user_manager.h" 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/chromeos/settings/cros_settings.h" 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/chromeos/settings/cros_settings_names.h" 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/extensions/extension_service.h" 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/first_run/first_run.h" 492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/google/google_util_chromeos.h" 507d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "chrome/browser/lifetime/application_lifetime.h" 517d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "chrome/browser/pref_service_flags_storage.h" 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/profiles/profile.h" 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/profiles/profile_manager.h" 542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/rlz/rlz.h" 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/signin/signin_manager.h" 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/signin/signin_manager_factory.h" 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/signin/token_service.h" 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/signin/token_service_factory.h" 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/sync/profile_sync_service.h" 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/sync/profile_sync_service_factory.h" 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/startup/startup_browser_creator.h" 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/chrome_paths.h" 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/chrome_switches.h" 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/logging_chrome.h" 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/pref_names.h" 66c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chromeos/chromeos_switches.h" 67c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chromeos/cryptohome/cryptohome_library.h" 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chromeos/dbus/dbus_thread_manager.h" 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chromeos/dbus/session_manager_client.h" 70c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chromeos/ime/input_method_manager.h" 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/browser_thread.h" 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/notification_service.h" 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "google_apis/gaia/gaia_auth_consumer.h" 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/base/network_change_notifier.h" 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/url_request/url_request_context.h" 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/url_request/url_request_context_getter.h" 777dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "url/gurl.h" 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::BrowserThread; 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace chromeos { 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace { 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if defined(ENABLE_RLZ) 862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Flag file that disables RLZ tracking, when present. 872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const base::FilePath::CharType kRLZDisabledFlagName[] = 882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) FILE_PATH_LITERAL(".rlz_disabled"); 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)base::FilePath GetRlzDisabledFlagPath() { 912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return file_util::GetHomeDir().Append(kRLZDisabledFlagName); 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class LoginUtilsImpl 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : public LoginUtils, 992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public OAuthLoginManager::Delegate, 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public net::NetworkChangeNotifier::ConnectionTypeObserver, 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public base::SupportsWeakPtr<LoginUtilsImpl> { 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LoginUtilsImpl() 1042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) : using_oauth_(false), 1052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) has_web_auth_cookies_(false), 1062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) login_manager_(OAuthLoginManager::Create(this)), 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delegate_(NULL), 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) should_restore_auth_session_(false), 109c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) session_restore_strategy_( 1107d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) OAuthLoginManager::RESTORE_FROM_SAVED_OAUTH2_REFRESH_TOKEN) { 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) net::NetworkChangeNotifier::AddConnectionTypeObserver(this); 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual ~LoginUtilsImpl() { 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) net::NetworkChangeNotifier::RemoveConnectionTypeObserver(this); 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // LoginUtils implementation: 1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void DoBrowserLaunch(Profile* profile, 1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LoginDisplayHost* login_host) OVERRIDE; 1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void PrepareProfile( 122c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const UserContext& user_context, 1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& display_email, 1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool using_oauth, 1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool has_cookies, 12690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) bool has_active_session, 1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LoginUtils::Delegate* delegate) OVERRIDE; 1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void DelegateDeleted(LoginUtils::Delegate* delegate) OVERRIDE; 1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void CompleteOffTheRecordLogin(const GURL& start_url) OVERRIDE; 1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void SetFirstLoginPrefs(PrefService* prefs) OVERRIDE; 1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual scoped_refptr<Authenticator> CreateAuthenticator( 1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LoginStatusConsumer* consumer) OVERRIDE; 1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void RestoreAuthenticationSession(Profile* profile) OVERRIDE; 1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void StopBackgroundFetchers() OVERRIDE; 1352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void InitRlzDelayed(Profile* user_profile) OVERRIDE; 1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // OAuthLoginManager::Delegate overrides. 1382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void OnCompletedMergeSession() OVERRIDE; 1392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void OnCompletedAuthentication(Profile* user_profile) OVERRIDE; 1402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void OnFoundStoredTokens() OVERRIDE; 1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // net::NetworkChangeNotifier::ConnectionTypeObserver overrides. 1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void OnConnectionTypeChanged( 1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) net::NetworkChangeNotifier::ConnectionType type) OVERRIDE; 1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Restarts OAuth session authentication check. 1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void KickStartAuthentication(Profile* profile); 1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Check user's profile for kApplicationLocale setting. 1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void RespectLocalePreference(Profile* pref); 1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Callback for Profile::CREATE_STATUS_CREATED profile state. 1542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Initializes basic preferences for newly created profile. Any other 1552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // early profile initialization that needs to happen before 1562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // ProfileManager::DoFinalInit() gets called is done here. 1572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void InitProfilePreferences(Profile* user_profile); 1582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Callback for asynchronous profile creation. 1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void OnProfileCreated(Profile* profile, 1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Profile::CreateStatus status); 1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Callback for Profile::CREATE_STATUS_INITIALIZED profile state. 1642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Profile is created, extensions and promo resources are initialized. 1652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void UserProfileInitialized(Profile* user_profile); 1662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Callback to resume profile creation after transferring auth data from 1682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // the authentication profile. 1692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void CompleteProfileCreate(Profile* user_profile); 1702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Finalized profile preparation. 1722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void FinalizePrepareProfile(Profile* user_profile); 1732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Initializes member variables needed for session restore process via 1752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // OAuthLoginManager. 1762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void InitSessionRestoreStrategy(); 1772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Restores GAIA auth cookies for the created user profile from OAuth2 token. 1792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void RestoreAuthSession(Profile* user_profile, 1802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool restore_from_auth_cookies); 1812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Initializes RLZ. If |disabled| is true, RLZ pings are disabled. 1832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void InitRlz(Profile* user_profile, bool disabled); 1842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Starts signing related services. Initiates TokenService token retrieval. 1862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void StartSignedInServices(Profile* profile); 1872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 188c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) UserContext user_context_; 1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool using_oauth_; 1902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // True if the authentication profile's cookie jar should contain 1912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // authentication cookies from the authentication extension log in flow. 1922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool has_web_auth_cookies_; 1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Has to be scoped_refptr, see comment for CreateAuthenticator(...). 1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_refptr<Authenticator> authenticator_; 1952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<OAuthLoginManager> login_manager_; 1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Delegate to be fired when the profile will be prepared. 1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LoginUtils::Delegate* delegate_; 1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // True if should restore authentication session when notified about 2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // online state change. 2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool should_restore_auth_session_; 2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Sesion restore strategy. 2052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) OAuthLoginManager::SessionRestoreStrategy session_restore_strategy_; 2062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // OAuth2 refresh token for session restore. 2072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::string oauth2_refresh_token_; 2082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(LoginUtilsImpl); 2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class LoginUtilsWrapper { 2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static LoginUtilsWrapper* GetInstance() { 2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return Singleton<LoginUtilsWrapper>::get(); 2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LoginUtils* get() { 2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::AutoLock create(create_lock_); 2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!ptr_.get()) 2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) reset(new LoginUtilsImpl); 2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return ptr_.get(); 2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void reset(LoginUtils* ptr) { 2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ptr_.reset(ptr); 2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) friend struct DefaultSingletonTraits<LoginUtilsWrapper>; 2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LoginUtilsWrapper() {} 2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Lock create_lock_; 2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<LoginUtils> ptr_; 2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(LoginUtilsWrapper); 2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void LoginUtilsImpl::DoBrowserLaunch(Profile* profile, 2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LoginDisplayHost* login_host) { 2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (browser_shutdown::IsTryingToQuit()) 2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!UserManager::Get()->GetCurrentUserFlow()->ShouldLaunchBrowser()) { 246c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) UserManager::Get()->GetCurrentUserFlow()->LaunchExtraSteps(profile); 2472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 2482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 2492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2507d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) CommandLine user_flags(CommandLine::NO_PROGRAM); 2517d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) about_flags::PrefServiceFlagsStorage flags_storage_(profile->GetPrefs()); 2527d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) about_flags::ConvertFlagsToSwitches(&flags_storage_, &user_flags); 253eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // Only restart if needed and if not going into managed mode. 254eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch if (!UserManager::Get()->IsLoggedInAsLocallyManagedUser() && 255eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch !about_flags::AreSwitchesIdenticalToCurrentCommandLine( 2567d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) user_flags, *CommandLine::ForCurrentProcess())) { 2577d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) CommandLine::StringVector flags; 2587d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) // argv[0] is the program name |CommandLine::NO_PROGRAM|. 2597d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) flags.assign(user_flags.argv().begin() + 1, user_flags.argv().end()); 2607d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) VLOG(1) << "Restarting to apply per-session flags..."; 2617d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) DBusThreadManager::Get()->GetSessionManagerClient()->SetFlagsForUser( 2627d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) UserManager::Get()->GetActiveUser()->email(), flags); 2637d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) chrome::ExitCleanly(); 2647d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) return; 2657d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) } 2667d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (login_host) { 2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) login_host->SetStatusAreaVisible(true); 2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) login_host->BeforeSessionStart(); 2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BootTimesLoader::Get()->AddLoginTimeMarker("BrowserLaunched", false); 2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VLOG(1) << "Launching browser..."; 2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) StartupBrowserCreator browser_creator; 2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int return_code; 2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) chrome::startup::IsFirstRun first_run = first_run::IsChromeFirstRun() ? 2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) chrome::startup::IS_FIRST_RUN : chrome::startup::IS_NOT_FIRST_RUN; 2792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) browser_creator.LaunchBrowser(*CommandLine::ForCurrentProcess(), 2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) profile, 2822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath(), 2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) chrome::startup::IS_PROCESS_STARTUP, 2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) first_run, 2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &return_code); 2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Mark login host for deletion after browser starts. This 2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // guarantees that the message loop will be referenced by the 2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // browser before it is dereferenced by the login host. 2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (login_host) 291868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) login_host->Finalize(); 2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) UserManager::Get()->SessionStarted(); 2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void LoginUtilsImpl::PrepareProfile( 296c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const UserContext& user_context, 2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& display_email, 2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool using_oauth, 2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool has_cookies, 30090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) bool has_active_session, 3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LoginUtils::Delegate* delegate) { 3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BootTimesLoader* btl = BootTimesLoader::Get(); 3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 304c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) VLOG(1) << "Completing login for " << user_context.username; 3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 30690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) if (!has_active_session) { 30790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) btl->AddLoginTimeMarker("StartSession-Start", false); 30890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) DBusThreadManager::Get()->GetSessionManagerClient()->StartSession( 30990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) user_context.username); 31090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) btl->AddLoginTimeMarker("StartSession-End", false); 31190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) } 3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) btl->AddLoginTimeMarker("UserLoggedIn-Start", false); 3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) UserManager* user_manager = UserManager::Get(); 315c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) user_manager->UserLoggedIn(user_context.username, 316c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) user_context.username_hash, 317c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) false); 3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) btl->AddLoginTimeMarker("UserLoggedIn-End", false); 3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Switch log file as soon as possible. 3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (base::chromeos::IsRunningOnChromeOS()) 3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) logging::RedirectChromeLogging(*(CommandLine::ForCurrentProcess())); 3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Update user's displayed email. 3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!display_email.empty()) 326c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) user_manager->SaveUserDisplayEmail(user_context.username, display_email); 3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 328c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) user_context_ = user_context; 3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) using_oauth_ = using_oauth; 3312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) has_web_auth_cookies_ = has_cookies; 3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delegate_ = delegate; 3332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) InitSessionRestoreStrategy(); 3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The default profile will have been changed because the ProfileManager 336c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // will process the notification that the UserManager sends out so 337c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // username_hash has been already propogated to ProfileManager. 3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ProfileManager::CreateDefaultProfileAsync( 3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Bind(&LoginUtilsImpl::OnProfileCreated, AsWeakPtr())); 3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void LoginUtilsImpl::DelegateDeleted(LoginUtils::Delegate* delegate) { 3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (delegate_ == delegate) 3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delegate_ = NULL; 3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void LoginUtilsImpl::InitProfilePreferences(Profile* user_profile) { 3482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (UserManager::Get()->IsCurrentUserNew()) 3492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SetFirstLoginPrefs(user_profile->GetPrefs()); 3502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (UserManager::Get()->IsLoggedInAsLocallyManagedUser()) { 3522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) user_profile->GetPrefs()->SetBoolean(prefs::kProfileIsManaged, true); 3532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } else { 3542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Make sure that the google service username is properly set (we do this 3552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // on every sign in, not just the first login, to deal with existing 3562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // profiles that might not have it set yet). 3572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) StringPrefMember google_services_username; 3582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) google_services_username.Init(prefs::kGoogleServicesUsername, 3592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) user_profile->GetPrefs()); 3602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) google_services_username.SetValue( 3612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) UserManager::Get()->GetLoggedInUser()->display_email()); 3622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 3632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) RespectLocalePreference(user_profile); 3652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 3662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void LoginUtilsImpl::InitSessionRestoreStrategy() { 3682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CommandLine* command_line = CommandLine::ForCurrentProcess(); 3692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool in_app_mode = chrome::IsRunningInForcedAppMode(); 3702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Are we in kiosk app mode? 3722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (in_app_mode) { 3732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (command_line->HasSwitch(::switches::kAppModeOAuth2Token)) { 3742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) oauth2_refresh_token_ = command_line->GetSwitchValueASCII( 3752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ::switches::kAppModeOAuth2Token); 3762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 3772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (command_line->HasSwitch(::switches::kAppModeAuthCode)) { 379c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) user_context_.auth_code = command_line->GetSwitchValueASCII( 3802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ::switches::kAppModeAuthCode); 3812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 3822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(!has_web_auth_cookies_); 384c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (!user_context_.auth_code.empty()) { 3852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) session_restore_strategy_ = OAuthLoginManager::RESTORE_FROM_AUTH_CODE; 3862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } else if (!oauth2_refresh_token_.empty()) { 3872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) session_restore_strategy_ = 3882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) OAuthLoginManager::RESTORE_FROM_PASSED_OAUTH2_REFRESH_TOKEN; 3892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } else { 3902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) session_restore_strategy_ = 3912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) OAuthLoginManager::RESTORE_FROM_SAVED_OAUTH2_REFRESH_TOKEN; 3922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 3932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 3942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 3952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (has_web_auth_cookies_) { 3972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) session_restore_strategy_ = OAuthLoginManager::RESTORE_FROM_COOKIE_JAR; 398c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } else if (!user_context_.auth_code.empty()) { 3992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) session_restore_strategy_ = OAuthLoginManager::RESTORE_FROM_AUTH_CODE; 4002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } else { 4012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) session_restore_strategy_ = 4022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) OAuthLoginManager::RESTORE_FROM_SAVED_OAUTH2_REFRESH_TOKEN; 4032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 4042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 4052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void LoginUtilsImpl::OnProfileCreated( 4085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Profile* user_profile, 4095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Profile::CreateStatus status) { 4105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CHECK(user_profile); 4112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switch (status) { 4135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case Profile::CREATE_STATUS_INITIALIZED: 4142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) UserProfileInitialized(user_profile); 4152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) break; 4162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case Profile::CREATE_STATUS_CREATED: 4172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) InitProfilePreferences(user_profile); 4185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 419868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) case Profile::CREATE_STATUS_LOCAL_FAIL: 420868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) case Profile::CREATE_STATUS_REMOTE_FAIL: 421868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) case Profile::CREATE_STATUS_CANCELED: 422868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) case Profile::MAX_CREATE_STATUS: 4235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NOTREACHED(); 4242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) break; 4255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 4275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void LoginUtilsImpl::UserProfileInitialized(Profile* user_profile) { 4295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BootTimesLoader* btl = BootTimesLoader::Get(); 4305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) btl->AddLoginTimeMarker("UserProfileGotten", false); 4315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (using_oauth_) { 4332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Transfer proxy authentication cache, cookies (optionally) and server 4342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // bound certs from the profile that was used for authentication. This 4352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // profile contains cookies that auth extension should have already put in 4362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // place that will ensure that the newly created session is authenticated 4372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // for the websites that work with the used authentication schema. 4382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ProfileAuthData::Transfer(authenticator_->authentication_profile(), 4392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) user_profile, 4402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) has_web_auth_cookies_, // transfer_cookies 4412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::Bind( 4422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) &LoginUtilsImpl::CompleteProfileCreate, 4432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) AsWeakPtr(), 4442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) user_profile)); 4452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 4462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 4475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4489ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch FinalizePrepareProfile(user_profile); 4492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 4502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void LoginUtilsImpl::CompleteProfileCreate(Profile* user_profile) { 4522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) RestoreAuthSession(user_profile, has_web_auth_cookies_); 4532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) FinalizePrepareProfile(user_profile); 4542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 4555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void LoginUtilsImpl::RestoreAuthSession(Profile* user_profile, 4572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool restore_from_auth_cookies) { 4587d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) CHECK((authenticator_.get() && authenticator_->authentication_profile()) || 4592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) !restore_from_auth_cookies); 4602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!login_manager_.get()) 4612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 4622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 463c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (chrome::IsRunningInForcedAppMode()) 464c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return; 465c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 4662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) UserManager::Get()->SetMergeSessionState( 4672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) UserManager::MERGE_STATUS_IN_PROCESS); 468c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 4692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Remove legacy OAuth1 token if we have one. If it's valid, we should already 4702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // have OAuth2 refresh token in TokenService that could be used to retrieve 471c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // all other tokens and user_context. 4722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) login_manager_->RestoreSession( 4732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) user_profile, 4747d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) authenticator_.get() && authenticator_->authentication_profile() 4757d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) ? authenticator_->authentication_profile()->GetRequestContext() 4767d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) : NULL, 4772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) session_restore_strategy_, 4782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) oauth2_refresh_token_, 479c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) user_context_.auth_code); 4802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 4812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void LoginUtilsImpl::FinalizePrepareProfile(Profile* user_profile) { 4832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) BootTimesLoader* btl = BootTimesLoader::Get(); 4845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Own TPM device if, for any reason, it has not been done in EULA 4855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // wizard screen. 486c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) CryptohomeLibrary* cryptohome = CryptohomeLibrary::Get(); 4875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) btl->AddLoginTimeMarker("TPMOwn-Start", false); 4885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (cryptohome->TpmIsEnabled() && !cryptohome->TpmIsBeingOwned()) { 4895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (cryptohome->TpmIsOwned()) { 4905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cryptohome->TpmClearStoredPassword(); 4915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 4925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cryptohome->TpmCanAttemptOwnership(); 4935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) btl->AddLoginTimeMarker("TPMOwn-End", false); 4965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) user_profile->OnLogin(); 4985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Send the notification before creating the browser so additional objects 5005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // that need the profile (e.g. the launcher) can be created first. 5015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::NotificationService::current()->Notify( 5025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) chrome::NOTIFICATION_LOGIN_USER_PROFILE_PREPARED, 5035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::NotificationService::AllSources(), 5045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::Details<Profile>(user_profile)); 5055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) InitRlzDelayed(user_profile); 5072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // TODO(altimofeev): This pointer should probably never be NULL, but it looks 5095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // like LoginUtilsImpl::OnProfileCreated() may be getting called before 5105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // LoginUtilsImpl::PrepareProfile() has set |delegate_| when Chrome is killed 5115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // during shutdown in tests -- see http://crosbug.com/18269. Replace this 5125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // 'if' statement with a CHECK(delegate_) once the underlying issue is 5135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // resolved. 5145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (delegate_) 5155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delegate_->OnProfilePrepared(user_profile); 5165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void LoginUtilsImpl::InitRlzDelayed(Profile* user_profile) { 5192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if defined(ENABLE_RLZ) 5202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!g_browser_process->local_state()->HasPrefPath(prefs::kRLZBrand)) { 5212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Read brand code asynchronously from an OEM file and repost ourselves. 5222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) google_util::chromeos::SetBrandFromFile( 5232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::Bind(&LoginUtilsImpl::InitRlzDelayed, AsWeakPtr(), user_profile)); 5245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 5252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 5262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::PostTaskAndReplyWithResult( 5272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::WorkerPool::GetTaskRunner(false), 5282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) FROM_HERE, 5297dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch base::Bind(&base::PathExists, GetRlzDisabledFlagPath()), 5302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::Bind(&LoginUtilsImpl::InitRlz, AsWeakPtr(), user_profile)); 5312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif 5322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 5335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void LoginUtilsImpl::InitRlz(Profile* user_profile, bool disabled) { 5352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if defined(ENABLE_RLZ) 5362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PrefService* local_state = g_browser_process->local_state(); 5372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (disabled) { 5382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Empty brand code means an organic install (no RLZ pings are sent). 5392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) google_util::chromeos::ClearBrandForCurrentSession(); 5402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 5412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (disabled != local_state->GetBoolean(prefs::kRLZDisabled)) { 5422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // When switching to RLZ enabled/disabled state, clear all recorded events. 5432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) RLZTracker::ClearRlzState(); 5442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) local_state->SetBoolean(prefs::kRLZDisabled, disabled); 5452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 5462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Init the RLZ library. 5472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int ping_delay = user_profile->GetPrefs()->GetInteger( 5482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) first_run::GetPingDelayPrefName().c_str()); 5492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Negative ping delay means to send ping immediately after a first search is 5502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // recorded. 5512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) RLZTracker::InitRlzFromProfileDelayed( 5522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) user_profile, UserManager::Get()->IsCurrentUserNew(), 5532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ping_delay < 0, base::TimeDelta::FromMilliseconds(abs(ping_delay))); 5542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (delegate_) 5552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) delegate_->OnRlzInitialized(user_profile); 5562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif 5575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void LoginUtilsImpl::StartSignedInServices(Profile* user_profile) { 5605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Fetch/Create the SigninManager - this will cause the TokenService to load 561c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // tokens for the currently signed-in user if the SigninManager hasn't 562c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // already been initialized. 563c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) SigninManagerBase* signin = 564c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) SigninManagerFactory::GetForProfile(user_profile); 5655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(signin); 5665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Make sure SigninManager is connected to our current user (this should 5675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // happen automatically because we set kGoogleServicesUsername in 5685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // OnProfileCreated()). 5695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK_EQ(UserManager::Get()->GetLoggedInUser()->display_email(), 5705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) signin->GetAuthenticatedUsername()); 5715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static bool initialized = false; 5725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!initialized) { 5735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) initialized = true; 5745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Notify the sync service that signin was successful. Note: Since the sync 5755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // service is lazy-initialized, we need to make sure it has been created. 5765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ProfileSyncService* sync_service = 5775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ProfileSyncServiceFactory::GetInstance()->GetForProfile(user_profile); 5785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // We may not always have a passphrase (for example, on a restart after a 5795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // browser crash). Only notify the sync service if we have a passphrase, 5805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // so it can do any required re-encryption. 581c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (!user_context_.password.empty() && sync_service) { 5825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GoogleServiceSigninSuccessDetails details( 5835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) signin->GetAuthenticatedUsername(), 584c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) user_context_.password); 5855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::NotificationService::current()->Notify( 5865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) chrome::NOTIFICATION_GOOGLE_SIGNIN_SUCCESSFUL, 5875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::Source<Profile>(user_profile), 5885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::Details<const GoogleServiceSigninSuccessDetails>(&details)); 5895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 591c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) user_context_.password.clear(); 592c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) user_context_.auth_code.clear(); 5935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void LoginUtilsImpl::RespectLocalePreference(Profile* profile) { 5965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(profile != NULL); 5975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrefService* prefs = profile->GetPrefs(); 5985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(prefs != NULL); 5995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (g_browser_process == NULL) 6005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 6015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string pref_locale = prefs->GetString(prefs::kApplicationLocale); 6035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (pref_locale.empty()) 6045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pref_locale = prefs->GetString(prefs::kApplicationLocaleBackup); 6055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (pref_locale.empty()) 6065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pref_locale = g_browser_process->GetApplicationLocale(); 6075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(!pref_locale.empty()); 6085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) profile->ChangeAppLocale(pref_locale, Profile::APP_LOCALE_CHANGED_VIA_LOGIN); 6095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Here we don't enable keyboard layouts. Input methods are set up when 6105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // the user first logs in. Then the user may customize the input methods. 6115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Hence changing input methods here, just because the user's UI language 6125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // is different from the login screen UI language, is not desirable. Note 6135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // that input method preferences are synced, so users can use their 6145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // farovite input methods as soon as the preferences are synced. 6155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LanguageSwitchMenu::SwitchLanguage(pref_locale); 6165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void LoginUtilsImpl::CompleteOffTheRecordLogin(const GURL& start_url) { 6195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VLOG(1) << "Completing incognito login"; 6205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // For guest session we ask session manager to restart Chrome with --bwsi 6225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // flag. We keep only some of the arguments of this process. 6235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const CommandLine& browser_command_line = *CommandLine::ForCurrentProcess(); 6245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CommandLine command_line(browser_command_line.GetProgram()); 6252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::string cmd_line_str = GetOffTheRecordCommandLine(start_url, 6262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) browser_command_line, 6272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) &command_line); 6285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) RestartChrome(cmd_line_str); 6305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void LoginUtilsImpl::SetFirstLoginPrefs(PrefService* prefs) { 6335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VLOG(1) << "Setting first login prefs"; 6345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BootTimesLoader* btl = BootTimesLoader::Get(); 6355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string locale = g_browser_process->GetApplicationLocale(); 6365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // First, we'll set kLanguagePreloadEngines. 6385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) input_method::InputMethodManager* manager = 639a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) input_method::InputMethodManager::Get(); 6405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::vector<std::string> input_method_ids; 6415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) manager->GetInputMethodUtil()->GetFirstLoginInputMethodIds( 6425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) locale, manager->GetCurrentInputMethod(), &input_method_ids); 6435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Save the input methods in the user's preferences. 6445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) StringPrefMember language_preload_engines; 6455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) language_preload_engines.Init(prefs::kLanguagePreloadEngines, 6462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) prefs); 6475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) language_preload_engines.SetValue(JoinString(input_method_ids, ',')); 6485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) btl->AddLoginTimeMarker("IMEStarted", false); 6495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Second, we'll set kLanguagePreferredLanguages. 6515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::vector<std::string> language_codes; 6525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The current locale should be on the top. 6535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) language_codes.push_back(locale); 6545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Add input method IDs based on the input methods, as there may be 6565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // input methods that are unrelated to the current locale. Example: the 6575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // hardware keyboard layout xkb:us::eng is used for logging in, but the 6585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // UI language is set to French. In this case, we should set "fr,en" 6595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // to the preferred languages preference. 6605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::vector<std::string> candidates; 6615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) manager->GetInputMethodUtil()->GetLanguageCodesFromInputMethodIds( 6625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) input_method_ids, &candidates); 6635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (size_t i = 0; i < candidates.size(); ++i) { 6645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& candidate = candidates[i]; 6655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Skip if it's already in language_codes. 6665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (std::count(language_codes.begin(), language_codes.end(), 6675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) candidate) == 0) { 6685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) language_codes.push_back(candidate); 6695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 6705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 6715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Save the preferred languages in the user's preferences. 6725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) StringPrefMember language_preferred_languages; 6735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) language_preferred_languages.Init(prefs::kLanguagePreferredLanguages, 6742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) prefs); 6755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) language_preferred_languages.SetValue(JoinString(language_codes, ',')); 6765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)scoped_refptr<Authenticator> LoginUtilsImpl::CreateAuthenticator( 6795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LoginStatusConsumer* consumer) { 6805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Screen locker needs new Authenticator instance each time. 6815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ScreenLocker::default_screen_locker()) { 6827d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) if (authenticator_.get()) 6835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) authenticator_->SetConsumer(NULL); 6845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) authenticator_ = NULL; 6855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 6865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6877d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) if (authenticator_.get() == NULL) { 6885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) authenticator_ = new ParallelAuthenticator(consumer); 6895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 6905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // TODO(nkostylev): Fix this hack by improving Authenticator dependencies. 6915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) authenticator_->SetConsumer(consumer); 6925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 6935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return authenticator_; 6945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void LoginUtilsImpl::RestoreAuthenticationSession(Profile* user_profile) { 6972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // We don't need to restore session for demo/guest/stub/public account users. 6985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!UserManager::Get()->IsUserLoggedIn() || 6995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) UserManager::Get()->IsLoggedInAsGuest() || 7002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) UserManager::Get()->IsLoggedInAsPublicAccount() || 7012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) UserManager::Get()->IsLoggedInAsDemoUser() || 7022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) UserManager::Get()->IsLoggedInAsStub()) { 7035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 7045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 7055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!net::NetworkChangeNotifier::IsOffline()) { 7075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) should_restore_auth_session_ = false; 7082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) RestoreAuthSession(user_profile, false); 7095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 7105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Even if we're online we should wait till initial 7115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // OnConnectionTypeChanged() call. Otherwise starting fetchers too early may 7125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // end up cancelling all request when initial network connection type is 7135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // processed. See http://crbug.com/121643. 7145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) should_restore_auth_session_ = true; 7155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 7165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 7175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void LoginUtilsImpl::StopBackgroundFetchers() { 7192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) login_manager_.reset(); 7205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 7215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void LoginUtilsImpl::OnCompletedAuthentication(Profile* user_profile) { 7232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) StartSignedInServices(user_profile); 7245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 7255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void LoginUtilsImpl::OnCompletedMergeSession() { 7272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) UserManager::Get()->SetMergeSessionState(UserManager::MERGE_STATUS_DONE); 7285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 7295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void LoginUtilsImpl::OnFoundStoredTokens() { 7312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // We don't need authenticator instance any more since its cookie jar 7322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // is not going to needed to mint OAuth tokens. Reset it so that 7335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // ScreenLocker would create a separate instance. 7345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) authenticator_ = NULL; 7355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 7365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void LoginUtilsImpl::OnConnectionTypeChanged( 7385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) net::NetworkChangeNotifier::ConnectionType type) { 7392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!login_manager_.get()) 7402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 7412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 7425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (type != net::NetworkChangeNotifier::CONNECTION_NONE && 7435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) UserManager::Get()->IsUserLoggedIn()) { 7442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (login_manager_->state() == 7452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) OAuthLoginManager::SESSION_RESTORE_IN_PROGRESS) { 7465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // If we come online for the first time after successful offline login, 7475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // we need to kick off OAuth token verification process again. 7482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) login_manager_->ContinueSessionRestore(); 7495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else if (should_restore_auth_session_) { 7505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) should_restore_auth_session_ = false; 7515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Profile* user_profile = ProfileManager::GetDefaultProfile(); 7522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) RestoreAuthSession(user_profile, has_web_auth_cookies_); 7535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 7545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 7555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 7565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static 7582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void LoginUtils::RegisterPrefs(PrefRegistrySimple* registry) { 7592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) registry->RegisterBooleanPref(prefs::kFactoryResetRequested, false); 7602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) registry->RegisterStringPref(prefs::kRLZBrand, std::string()); 7612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) registry->RegisterBooleanPref(prefs::kRLZDisabled, false); 7622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 7632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 7642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// static 7655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)LoginUtils* LoginUtils::Get() { 7665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return LoginUtilsWrapper::GetInstance()->get(); 7675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 7685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static 7705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void LoginUtils::Set(LoginUtils* mock) { 7715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LoginUtilsWrapper::GetInstance()->reset(mock); 7725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 7735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static 7755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool LoginUtils::IsWhitelisted(const std::string& username) { 7765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CrosSettings* cros_settings = CrosSettings::Get(); 7775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool allow_new_user = false; 7785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cros_settings->GetBoolean(kAccountsPrefAllowNewUser, &allow_new_user); 7795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (allow_new_user) 7805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 7815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return cros_settings->FindEmailInList(kAccountsPrefUsers, username); 7825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 7835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace chromeos 785