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