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>
85d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include <set>
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <vector>
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "base/base_paths.h"
12f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "base/bind.h"
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/command_line.h"
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/compiler_specific.h"
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/file_util.h"
162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/files/file_path.h"
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/location.h"
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/ref_counted.h"
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/scoped_ptr.h"
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/singleton.h"
217d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "base/memory/weak_ptr.h"
222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/prefs/pref_member.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"
274e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "base/sys_info.h"
282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/task_runner_util.h"
292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/threading/worker_pool.h"
30eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "base/time/time.h"
312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/about_flags.h"
322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/app_mode/app_mode_utils.h"
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/browser_process.h"
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/browser_shutdown.h"
357dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "chrome/browser/chrome_notification_types.h"
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/chromeos/boot_times_loader.h"
37cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "chrome/browser/chromeos/login/auth/parallel_authenticator.h"
38cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "chrome/browser/chromeos/login/auth/user_context.h"
392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/chromeos/login/chrome_restart_request.h"
40a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "chrome/browser/chromeos/login/demo_mode/demo_app_launcher.h"
41cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "chrome/browser/chromeos/login/lock/screen_locker.h"
422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/chromeos/login/profile_auth_data.h"
435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "chrome/browser/chromeos/login/saml/saml_offline_signin_limiter.h"
445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "chrome/browser/chromeos/login/saml/saml_offline_signin_limiter_factory.h"
45f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "chrome/browser/chromeos/login/session/session_manager.h"
46cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "chrome/browser/chromeos/login/signin/oauth2_login_manager.h"
47cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "chrome/browser/chromeos/login/signin/oauth2_login_manager_factory.h"
48effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#include "chrome/browser/chromeos/login/startup_utils.h"
49cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "chrome/browser/chromeos/login/ui/input_events_blocker.h"
50cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "chrome/browser/chromeos/login/ui/login_display_host.h"
51cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "chrome/browser/chromeos/login/users/supervised_user_manager.h"
52cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "chrome/browser/chromeos/login/users/user.h"
53cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "chrome/browser/chromeos/login/users/user_manager.h"
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/chromeos/settings/cros_settings.h"
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/extensions/extension_service.h"
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/first_run/first_run.h"
5746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#include "chrome/browser/google/google_brand_chromeos.h"
587d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "chrome/browser/lifetime/application_lifetime.h"
597d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "chrome/browser/pref_service_flags_storage.h"
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/profiles/profile.h"
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/profiles/profile_manager.h"
622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/rlz/rlz.h"
63a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "chrome/browser/signin/signin_manager_factory.h"
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/sync/profile_sync_service.h"
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/sync/profile_sync_service_factory.h"
664e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "chrome/browser/ui/app_list/start_page_service.h"
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/startup/startup_browser_creator.h"
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/chrome_switches.h"
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/logging_chrome.h"
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/pref_names.h"
71c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chromeos/chromeos_switches.h"
724e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "chromeos/cryptohome/cryptohome_util.h"
734e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "chromeos/dbus/cryptohome_client.h"
744e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "chromeos/dbus/dbus_method_call_status.h"
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chromeos/dbus/dbus_thread_manager.h"
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chromeos/dbus/session_manager_client.h"
774e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "chromeos/settings/cros_settings_names.h"
78e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch#include "components/signin/core/browser/signin_manager.h"
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/browser_thread.h"
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/notification_service.h"
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "google_apis/gaia/gaia_auth_consumer.h"
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/base/network_change_notifier.h"
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/url_request/url_request_context.h"
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/url_request/url_request_context_getter.h"
857dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "url/gurl.h"
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::BrowserThread;
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace chromeos {
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
91f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)struct DoBrowserLaunchOnLocaleLoadedData;
92f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class LoginUtilsImpl
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    : public LoginUtils,
95f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      public base::SupportsWeakPtr<LoginUtilsImpl>,
96f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      public SessionManager::Delegate {
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  LoginUtilsImpl()
99f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      : delegate_(NULL) {
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~LoginUtilsImpl() {
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // LoginUtils implementation:
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void DoBrowserLaunch(Profile* profile,
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                               LoginDisplayHost* login_host) OVERRIDE;
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void PrepareProfile(
109c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      const UserContext& user_context,
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      bool has_cookies,
11190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      bool has_active_session,
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      LoginUtils::Delegate* delegate) OVERRIDE;
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void DelegateDeleted(LoginUtils::Delegate* delegate) OVERRIDE;
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void CompleteOffTheRecordLogin(const GURL& start_url) OVERRIDE;
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual scoped_refptr<Authenticator> CreateAuthenticator(
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      LoginStatusConsumer* consumer) OVERRIDE;
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
118f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  // SessionManager::Delegate implementation:
119f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)   virtual void OnProfilePrepared(Profile* profile) OVERRIDE;
120f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) #if defined(ENABLE_RLZ)
121f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)   virtual void OnRlzInitialized() OVERRIDE;
122f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) #endif
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
125f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // DoBrowserLaunch is split into two parts.
126f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  // This one is called after asynchronous locale switch.
127f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  void DoBrowserLaunchOnLocaleLoadedImpl(Profile* profile,
128f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                                         LoginDisplayHost* login_host);
129f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
130f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // Callback for locale_util::SwitchLanguage().
131f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  static void DoBrowserLaunchOnLocaleLoaded(
132f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      scoped_ptr<DoBrowserLaunchOnLocaleLoadedData> context,
133f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      const std::string& locale,
134f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      const std::string& loaded_locale,
135f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      const bool success);
136f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
1375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Attempts restarting the browser process and esures that this does
1385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // not happen while we are still fetching new OAuth refresh tokens.
1395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  void AttemptRestart(Profile* profile);
14068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Has to be scoped_refptr, see comment for CreateAuthenticator(...).
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_refptr<Authenticator> authenticator_;
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Delegate to be fired when the profile will be prepared.
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  LoginUtils::Delegate* delegate_;
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(LoginUtilsImpl);
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class LoginUtilsWrapper {
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static LoginUtilsWrapper* GetInstance() {
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return Singleton<LoginUtilsWrapper>::get();
1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  LoginUtils* get() {
1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    base::AutoLock create(create_lock_);
1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (!ptr_.get())
1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      reset(new LoginUtilsImpl);
1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return ptr_.get();
1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void reset(LoginUtils* ptr) {
1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ptr_.reset(ptr);
1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  friend struct DefaultSingletonTraits<LoginUtilsWrapper>;
1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  LoginUtilsWrapper() {}
1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::Lock create_lock_;
1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<LoginUtils> ptr_;
1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(LoginUtilsWrapper);
1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
178f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)struct DoBrowserLaunchOnLocaleLoadedData {
179f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  DoBrowserLaunchOnLocaleLoadedData(LoginUtilsImpl* login_utils_impl,
180f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                                    Profile* profile,
181f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                                    LoginDisplayHost* display_host)
182f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      : login_utils_impl(login_utils_impl),
183f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)        profile(profile),
184f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)        display_host(display_host) {}
185f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
186f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  LoginUtilsImpl* login_utils_impl;
187f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  Profile* profile;
188f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  chromeos::LoginDisplayHost* display_host;
189f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
190f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // Block UI events untill ResourceBundle is reloaded.
191f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  InputEventsBlocker input_events_blocker;
192f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)};
1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
194f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)// static
195f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)void LoginUtilsImpl::DoBrowserLaunchOnLocaleLoaded(
196f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    scoped_ptr<DoBrowserLaunchOnLocaleLoadedData> context,
197f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    const std::string& /* locale */,
198f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    const std::string& /* loaded_locale */,
199f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    const bool /* success */) {
200f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  context->login_utils_impl->DoBrowserLaunchOnLocaleLoadedImpl(
201f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      context->profile, context->display_host);
202f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)}
2034e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
204f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)// Called from DoBrowserLaunch() or from
205f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)// DoBrowserLaunchOnLocaleLoaded() depending on
206f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)// if locale switch was needed.
207f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)void LoginUtilsImpl::DoBrowserLaunchOnLocaleLoadedImpl(
208f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    Profile* profile,
209f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    LoginDisplayHost* login_host) {
2102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (!UserManager::Get()->GetCurrentUserFlow()->ShouldLaunchBrowser()) {
211c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    UserManager::Get()->GetCurrentUserFlow()->LaunchExtraSteps(profile);
2122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return;
2132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
2142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2157d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  CommandLine user_flags(CommandLine::NO_PROGRAM);
2167d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  about_flags::PrefServiceFlagsStorage flags_storage_(profile->GetPrefs());
217d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  about_flags::ConvertFlagsToSwitches(&flags_storage_, &user_flags,
218d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)                                      about_flags::kAddSentinels);
219eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // Only restart if needed and if not going into managed mode.
22058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  // Don't restart browser if it is not first profile in session.
22158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  if (UserManager::Get()->GetLoggedInUsers().size() == 1 &&
22258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      !UserManager::Get()->IsLoggedInAsLocallyManagedUser() &&
223eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      !about_flags::AreSwitchesIdenticalToCurrentCommandLine(
2247d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)          user_flags, *CommandLine::ForCurrentProcess())) {
2257d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    CommandLine::StringVector flags;
2267d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    // argv[0] is the program name |CommandLine::NO_PROGRAM|.
2277d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    flags.assign(user_flags.argv().begin() + 1, user_flags.argv().end());
2287d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    VLOG(1) << "Restarting to apply per-session flags...";
2297d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    DBusThreadManager::Get()->GetSessionManagerClient()->SetFlagsForUser(
2307d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)        UserManager::Get()->GetActiveUser()->email(), flags);
2315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    AttemptRestart(profile);
2327d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    return;
2337d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  }
2347d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (login_host) {
2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    login_host->SetStatusAreaVisible(true);
2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    login_host->BeforeSessionStart();
2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  BootTimesLoader::Get()->AddLoginTimeMarker("BrowserLaunched", false);
2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  VLOG(1) << "Launching browser...";
2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  StartupBrowserCreator browser_creator;
2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int return_code;
2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  chrome::startup::IsFirstRun first_run = first_run::IsChromeFirstRun() ?
2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      chrome::startup::IS_FIRST_RUN : chrome::startup::IS_NOT_FIRST_RUN;
2472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  browser_creator.LaunchBrowser(*CommandLine::ForCurrentProcess(),
2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                profile,
2502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                base::FilePath(),
2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                chrome::startup::IS_PROCESS_STARTUP,
2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                first_run,
2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                &return_code);
2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2554e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  // Triggers app launcher start page service to load start page web contents.
2564e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  app_list::StartPageService::Get(profile);
2574e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Mark login host for deletion after browser starts.  This
2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // guarantees that the message loop will be referenced by the
2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // browser before it is dereferenced by the login host.
2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (login_host)
262868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    login_host->Finalize();
2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  UserManager::Get()->SessionStarted();
264cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  chromeos::BootTimesLoader::Get()->LoginDone(
265cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      chromeos::UserManager::Get()->IsCurrentUserNew());
2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
268f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)void LoginUtilsImpl::DoBrowserLaunch(Profile* profile,
269f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                                     LoginDisplayHost* login_host) {
270f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  if (browser_shutdown::IsTryingToQuit())
271f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    return;
272f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
273f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  User* const user = UserManager::Get()->GetUserByProfile(profile);
274f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  scoped_ptr<DoBrowserLaunchOnLocaleLoadedData> data(
275f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      new DoBrowserLaunchOnLocaleLoadedData(this, profile, login_host));
276f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
277f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  scoped_ptr<locale_util::SwitchLanguageCallback> callback(
278f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      new locale_util::SwitchLanguageCallback(
279f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)          base::Bind(&LoginUtilsImpl::DoBrowserLaunchOnLocaleLoaded,
280f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                     base::Passed(data.Pass()))));
281f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  if (!UserManager::Get()->
282f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      RespectLocalePreference(profile, user, callback.Pass())) {
283f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    DoBrowserLaunchOnLocaleLoadedImpl(profile, login_host);
284f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  }
285f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)}
286f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void LoginUtilsImpl::PrepareProfile(
288c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    const UserContext& user_context,
2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    bool has_cookies,
29090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    bool has_active_session,
2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    LoginUtils::Delegate* delegate) {
292f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  // TODO(nkostylev): We have to initialize LoginUtils delegate as long
293f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  // as it coexist with SessionManager.
2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  delegate_ = delegate;
295f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
296f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  // For the transition part LoginUtils will just delegate profile
297f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  // creation and initialization to SessionManager. Later LoginUtils will be
298f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  // removed and all LoginUtils clients will just work with SessionManager
299f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  // directly.
300f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  SessionManager::GetInstance()->StartSession(user_context,
301f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                                              authenticator_,
302f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                                              has_cookies,
303f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                                              has_active_session,
304f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                                              this);
3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void LoginUtilsImpl::DelegateDeleted(LoginUtils::Delegate* delegate) {
3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (delegate_ == delegate)
3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    delegate_ = NULL;
3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void LoginUtilsImpl::CompleteOffTheRecordLogin(const GURL& start_url) {
3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  VLOG(1) << "Completing incognito login";
3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // For guest session we ask session manager to restart Chrome with --bwsi
3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // flag. We keep only some of the arguments of this process.
3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const CommandLine& browser_command_line = *CommandLine::ForCurrentProcess();
3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CommandLine command_line(browser_command_line.GetProgram());
319effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  std::string cmd_line_str =
320effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      GetOffTheRecordCommandLine(start_url,
321effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch                                 StartupUtils::IsOobeCompleted(),
322effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch                                 browser_command_line,
323effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch                                 &command_line);
3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  RestartChrome(cmd_line_str);
3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)scoped_refptr<Authenticator> LoginUtilsImpl::CreateAuthenticator(
3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    LoginStatusConsumer* consumer) {
3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Screen locker needs new Authenticator instance each time.
3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (ScreenLocker::default_screen_locker()) {
3327d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    if (authenticator_.get())
3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      authenticator_->SetConsumer(NULL);
3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    authenticator_ = NULL;
3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3377d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  if (authenticator_.get() == NULL) {
3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    authenticator_ = new ParallelAuthenticator(consumer);
3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } else {
3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // TODO(nkostylev): Fix this hack by improving Authenticator dependencies.
3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    authenticator_->SetConsumer(consumer);
3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return authenticator_;
3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
346f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)void LoginUtilsImpl::OnProfilePrepared(Profile* profile) {
347f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  if (delegate_)
348f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    delegate_->OnProfilePrepared(profile);
3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
351f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#if defined(ENABLE_RLZ)
352f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)void LoginUtilsImpl::OnRlzInitialized() {
353f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  if (delegate_)
354f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    delegate_->OnRlzInitialized();
3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
356f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#endif
3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void LoginUtilsImpl::AttemptRestart(Profile* profile) {
359f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  if (SessionManager::GetInstance()->GetSigninSessionRestoreStrategy() !=
36068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)      OAuth2LoginManager::RESTORE_FROM_COOKIE_JAR) {
3615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    chrome::AttemptRestart();
36268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    return;
36368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  }
36468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
36568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  // We can't really quit if the session restore process that mints new
36668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  // refresh token is still in progress.
36768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  OAuth2LoginManager* login_manager =
36868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)      OAuth2LoginManagerFactory::GetInstance()->GetForProfile(profile);
36968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  if (login_manager->state() !=
37068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)          OAuth2LoginManager::SESSION_RESTORE_PREPARING &&
37168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)      login_manager->state() !=
37268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)          OAuth2LoginManager::SESSION_RESTORE_IN_PROGRESS) {
3735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    chrome::AttemptRestart();
37468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    return;
37568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  }
37668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
37768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  LOG(WARNING) << "Attempting browser restart during session restore.";
378f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  SessionManager::GetInstance()->set_exit_after_session_restore(true);
3792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
3802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// static
3825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)LoginUtils* LoginUtils::Get() {
3835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return LoginUtilsWrapper::GetInstance()->get();
3845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static
3875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void LoginUtils::Set(LoginUtils* mock) {
3885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  LoginUtilsWrapper::GetInstance()->reset(mock);
3895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static
3925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)bool LoginUtils::IsWhitelisted(const std::string& username,
3935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                               bool* wildcard_match) {
394a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  // Skip whitelist check for tests.
395a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  if (CommandLine::ForCurrentProcess()->HasSwitch(
396a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      chromeos::switches::kOobeSkipPostLogin)) {
397a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    return true;
398a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  }
399a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
4005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CrosSettings* cros_settings = CrosSettings::Get();
4015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool allow_new_user = false;
4025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  cros_settings->GetBoolean(kAccountsPrefAllowNewUser, &allow_new_user);
4035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (allow_new_user)
4045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return true;
4055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  return cros_settings->FindEmailInList(
4065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      kAccountsPrefUsers, username, wildcard_match);
4075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace chromeos
410