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