login_utils.cc revision 1320f92c476a1ad9d19dba2a48c72b75566198e9
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" 135f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "base/bind_helpers.h" 145f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "base/callback.h" 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/command_line.h" 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/compiler_specific.h" 172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/files/file_path.h" 181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "base/files/file_util.h" 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/location.h" 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/ref_counted.h" 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/scoped_ptr.h" 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/singleton.h" 237d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "base/memory/weak_ptr.h" 242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/prefs/pref_member.h" 252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/prefs/pref_service.h" 265e3f23d412006dc4db4e659864679f29341e113fTorne (Richard Coles)#include "base/strings/string_util.h" 27868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/utf_string_conversions.h" 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/synchronization/lock.h" 294e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "base/sys_info.h" 302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/task_runner_util.h" 312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/threading/worker_pool.h" 32eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "base/time/time.h" 332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/about_flags.h" 342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/app_mode/app_mode_utils.h" 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/browser_process.h" 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/browser_shutdown.h" 377dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "chrome/browser/chrome_notification_types.h" 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/chromeos/boot_times_loader.h" 3903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)#include "chrome/browser/chromeos/login/auth/chrome_cryptohome_authenticator.h" 402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/chromeos/login/chrome_restart_request.h" 41a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "chrome/browser/chromeos/login/demo_mode/demo_app_launcher.h" 42116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "chrome/browser/chromeos/login/existing_user_controller.h" 43cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "chrome/browser/chromeos/login/lock/screen_locker.h" 442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/chromeos/login/profile_auth_data.h" 455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "chrome/browser/chromeos/login/saml/saml_offline_signin_limiter.h" 465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "chrome/browser/chromeos/login/saml/saml_offline_signin_limiter_factory.h" 47116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "chrome/browser/chromeos/login/session/user_session_manager.h" 48cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "chrome/browser/chromeos/login/signin/oauth2_login_manager.h" 49cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "chrome/browser/chromeos/login/signin/oauth2_login_manager_factory.h" 50effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#include "chrome/browser/chromeos/login/startup_utils.h" 51cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "chrome/browser/chromeos/login/ui/input_events_blocker.h" 52cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "chrome/browser/chromeos/login/ui/login_display_host.h" 536e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)#include "chrome/browser/chromeos/login/user_flow.h" 546e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)#include "chrome/browser/chromeos/login/users/chrome_user_manager.h" 55cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "chrome/browser/chromeos/login/users/supervised_user_manager.h" 56116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "chrome/browser/chromeos/profiles/profile_helper.h" 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/chromeos/settings/cros_settings.h" 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/extensions/extension_service.h" 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/first_run/first_run.h" 6046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#include "chrome/browser/google/google_brand_chromeos.h" 617d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "chrome/browser/lifetime/application_lifetime.h" 627d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "chrome/browser/pref_service_flags_storage.h" 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/profiles/profile.h" 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/profiles/profile_manager.h" 652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/rlz/rlz.h" 66a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "chrome/browser/signin/signin_manager_factory.h" 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/sync/profile_sync_service.h" 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/sync/profile_sync_service_factory.h" 694e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "chrome/browser/ui/app_list/start_page_service.h" 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/startup/startup_browser_creator.h" 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/chrome_switches.h" 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/logging_chrome.h" 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/pref_names.h" 74c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chromeos/chromeos_switches.h" 754e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "chromeos/cryptohome/cryptohome_util.h" 764e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "chromeos/dbus/cryptohome_client.h" 774e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "chromeos/dbus/dbus_method_call_status.h" 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chromeos/dbus/dbus_thread_manager.h" 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chromeos/dbus/session_manager_client.h" 80116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "chromeos/login/auth/user_context.h" 814e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "chromeos/settings/cros_settings_names.h" 82e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch#include "components/signin/core/browser/signin_manager.h" 835f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "components/user_manager/user.h" 846e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)#include "components/user_manager/user_manager.h" 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/browser_thread.h" 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/notification_service.h" 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "google_apis/gaia/gaia_auth_consumer.h" 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/base/network_change_notifier.h" 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/url_request/url_request_context.h" 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/url_request/url_request_context_getter.h" 917dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "url/gurl.h" 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 931320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#if defined(USE_ATHENA) 941320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "athena/extensions/public/extensions_delegate.h" 951320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "athena/main/public/athena_launcher.h" 961320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#endif 971320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::BrowserThread; 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1006e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)namespace { 1016e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) 1026e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)void LogCustomSwitches(const std::set<std::string>& switches) { 1036e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) if (!VLOG_IS_ON(1)) 1046e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) return; 1056e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) for (std::set<std::string>::const_iterator it = switches.begin(); 1066e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) it != switches.end(); 1076e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) ++it) { 1086e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) VLOG(1) << "Switch leading to restart: '" << *it << "'"; 1096e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) } 1106e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)} 1116e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) 1126e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)} // anonymous namespace 1136e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace chromeos { 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 116116680a4aac90f2aa7413d9095a592090648e557Ben Murdochnamespace { 117116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 118116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// Returns new CommandLine with per-user flags. 119116680a4aac90f2aa7413d9095a592090648e557Ben MurdochCommandLine CreatePerSessionCommandLine(Profile* profile) { 120116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch CommandLine user_flags(CommandLine::NO_PROGRAM); 121116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch about_flags::PrefServiceFlagsStorage flags_storage_(profile->GetPrefs()); 122116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch about_flags::ConvertFlagsToSwitches( 123116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch &flags_storage_, &user_flags, about_flags::kAddSentinels); 124116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch return user_flags; 125116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch} 126116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 127116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// Returns true if restart is needed to apply per-session flags. 1286e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)bool NeedRestartToApplyPerSessionFlags( 1296e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) const CommandLine& user_flags, 1306e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) std::set<CommandLine::StringType>* out_command_line_difference) { 131116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // Don't restart browser if it is not first profile in session. 1326e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) if (user_manager::UserManager::Get()->GetLoggedInUsers().size() != 1) 133116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch return false; 134116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 135116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // Only restart if needed and if not going into managed mode. 1366e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) if (user_manager::UserManager::Get()->IsLoggedInAsSupervisedUser()) 137116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch return false; 138116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 139116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch if (about_flags::AreSwitchesIdenticalToCurrentCommandLine( 1406e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) user_flags, 1416e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) *CommandLine::ForCurrentProcess(), 1426e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) out_command_line_difference)) { 143116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch return false; 144116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch } 145116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 146116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch return true; 147116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch} 148116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 149116680a4aac90f2aa7413d9095a592090648e557Ben Murdochbool CanPerformEarlyRestart() { 150116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // Desktop build is used for development only. Early restart is not supported. 151116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch if (!base::SysInfo::IsRunningOnChromeOS()) 152116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch return false; 153116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 154116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch const ExistingUserController* controller = 155116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch ExistingUserController::current_controller(); 156116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch if (!controller) 157116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch return true; 158116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 159116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // Early restart is possible only if OAuth token is up to date. 160116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 161116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch if (controller->password_changed()) 162116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch return false; 163116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 164116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch if (controller->auth_mode() != LoginPerformer::AUTH_MODE_INTERNAL) 165116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch return false; 166116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 1671320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // No early restart if Easy unlock key needs to be updated. 1681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (UserSessionManager::GetInstance()->NeedsToUpdateEasyUnlockKeys()) 1691320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return false; 1701320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 171116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch return true; 172116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch} 173116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 174116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch} // namespace 175116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 176116680a4aac90f2aa7413d9095a592090648e557Ben Murdochclass LoginUtilsImpl : public LoginUtils, 177116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch public base::SupportsWeakPtr<LoginUtilsImpl>, 178116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch public UserSessionManagerDelegate { 1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LoginUtilsImpl() 181f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) : delegate_(NULL) { 1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual ~LoginUtilsImpl() { 1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // LoginUtils implementation: 1885f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) virtual void RespectLocalePreference(Profile* profile, 1895f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) const base::Closure& callback) OVERRIDE; 1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void DoBrowserLaunch(Profile* profile, 1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LoginDisplayHost* login_host) OVERRIDE; 1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void PrepareProfile( 193c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const UserContext& user_context, 194116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch bool has_auth_cookies, 19590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) bool has_active_session, 1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LoginUtils::Delegate* delegate) OVERRIDE; 1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void DelegateDeleted(LoginUtils::Delegate* delegate) OVERRIDE; 1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void CompleteOffTheRecordLogin(const GURL& start_url) OVERRIDE; 1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual scoped_refptr<Authenticator> CreateAuthenticator( 200116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch AuthStatusConsumer* consumer) OVERRIDE; 201116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch virtual bool RestartToApplyPerSessionFlagsIfNeed(Profile* profile, 202116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch bool early_restart) OVERRIDE; 2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 204116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // UserSessionManager::Delegate implementation: 205f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) virtual void OnProfilePrepared(Profile* profile) OVERRIDE; 206f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) #if defined(ENABLE_RLZ) 207f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) virtual void OnRlzInitialized() OVERRIDE; 208f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) #endif 2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 2115f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) void DoBrowserLaunchInternal(Profile* profile, 2125f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) LoginDisplayHost* login_host, 2135f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) bool locale_pref_checked); 2145f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 2155f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) static void RunCallbackOnLocaleLoaded( 2165f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) const base::Closure& callback, 2175f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) InputEventsBlocker* input_events_blocker, 218f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) const std::string& locale, 219f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) const std::string& loaded_locale, 220f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) const bool success); 221f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 2225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Attempts restarting the browser process and esures that this does 2235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // not happen while we are still fetching new OAuth refresh tokens. 2245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) void AttemptRestart(Profile* profile); 22568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Has to be scoped_refptr, see comment for CreateAuthenticator(...). 2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_refptr<Authenticator> authenticator_; 2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Delegate to be fired when the profile will be prepared. 2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LoginUtils::Delegate* delegate_; 2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(LoginUtilsImpl); 2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class LoginUtilsWrapper { 2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static LoginUtilsWrapper* GetInstance() { 2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return Singleton<LoginUtilsWrapper>::get(); 2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LoginUtils* get() { 2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::AutoLock create(create_lock_); 2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!ptr_.get()) 2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) reset(new LoginUtilsImpl); 2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return ptr_.get(); 2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void reset(LoginUtils* ptr) { 2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ptr_.reset(ptr); 2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) friend struct DefaultSingletonTraits<LoginUtilsWrapper>; 2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LoginUtilsWrapper() {} 2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Lock create_lock_; 2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<LoginUtils> ptr_; 2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(LoginUtilsWrapper); 2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2635f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)void LoginUtilsImpl::DoBrowserLaunchInternal(Profile* profile, 2645f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) LoginDisplayHost* login_host, 2655f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) bool locale_pref_checked) { 2665f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) if (browser_shutdown::IsTryingToQuit()) 2675f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) return; 2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2695f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) if (!locale_pref_checked) { 2705f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) RespectLocalePreference(profile, 2715f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) base::Bind(&LoginUtilsImpl::DoBrowserLaunchInternal, 2725f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) base::Unretained(this), 2735f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) profile, 2745f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) login_host, 2755f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) true /* locale_pref_checked */)); 2765f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) return; 2775f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) } 2784e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 2796e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) if (!ChromeUserManager::Get()->GetCurrentUserFlow()->ShouldLaunchBrowser()) { 2806e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) ChromeUserManager::Get()->GetCurrentUserFlow()->LaunchExtraSteps(profile); 2812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 2822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 2832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 284116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch if (RestartToApplyPerSessionFlagsIfNeed(profile, false)) 2857d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) return; 2867d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (login_host) { 2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) login_host->SetStatusAreaVisible(true); 2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) login_host->BeforeSessionStart(); 2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BootTimesLoader::Get()->AddLoginTimeMarker("BrowserLaunched", false); 2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VLOG(1) << "Launching browser..."; 295116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch TRACE_EVENT0("login", "LaunchBrowser"); 2961320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 2971320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#if defined(USE_ATHENA) 2981320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci athena::ExtensionsDelegate::CreateExtensionsDelegateForChrome(profile); 2991320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci athena::StartAthenaSessionWithContext(profile); 3001320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#else 3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) StartupBrowserCreator browser_creator; 3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int return_code; 3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) chrome::startup::IsFirstRun first_run = first_run::IsChromeFirstRun() ? 3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) chrome::startup::IS_FIRST_RUN : chrome::startup::IS_NOT_FIRST_RUN; 3052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) browser_creator.LaunchBrowser(*CommandLine::ForCurrentProcess(), 3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) profile, 3082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath(), 3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) chrome::startup::IS_PROCESS_STARTUP, 3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) first_run, 3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &return_code); 3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3134e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // Triggers app launcher start page service to load start page web contents. 3144e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) app_list::StartPageService::Get(profile); 3151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#endif 3164e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Mark login host for deletion after browser starts. This 3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // guarantees that the message loop will be referenced by the 3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // browser before it is dereferenced by the login host. 3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (login_host) 321868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) login_host->Finalize(); 3226e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) user_manager::UserManager::Get()->SessionStarted(); 323cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) chromeos::BootTimesLoader::Get()->LoginDone( 3246e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) user_manager::UserManager::Get()->IsCurrentUserNew()); 3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3275f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)// static 3285f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)void LoginUtilsImpl::RunCallbackOnLocaleLoaded( 3295f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) const base::Closure& callback, 3305f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) InputEventsBlocker* /* input_events_blocker */, 3315f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) const std::string& /* locale */, 3325f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) const std::string& /* loaded_locale */, 3335f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) const bool /* success */) { 3345f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) callback.Run(); 3355f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)} 3365f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 3375f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)void LoginUtilsImpl::RespectLocalePreference(Profile* profile, 3385f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) const base::Closure& callback) { 339f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) if (browser_shutdown::IsTryingToQuit()) 340f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) return; 341f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 3425f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) user_manager::User* const user = 3435f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) ProfileHelper::Get()->GetUserByProfile(profile); 3445f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) scoped_ptr<locale_util::SwitchLanguageCallback> locale_switched_callback( 3455f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) new locale_util::SwitchLanguageCallback(base::Bind( 3465f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) &LoginUtilsImpl::RunCallbackOnLocaleLoaded, 3475f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) callback, 3485f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) base::Owned(new InputEventsBlocker)))); // Block UI events until 3495f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) // the ResourceBundle is 3505f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) // reloaded. 3515f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) if (!UserSessionManager::GetInstance()->RespectLocalePreference( 3525f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) profile, 3535f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) user, 3545f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) locale_switched_callback.Pass())) { 3555f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) callback.Run(); 356f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) } 357f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)} 358f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 3595f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)void LoginUtilsImpl::DoBrowserLaunch(Profile* profile, 3605f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) LoginDisplayHost* login_host) { 3615f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) DoBrowserLaunchInternal(profile, login_host, false /* locale_pref_checked */); 3625f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)} 3635f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 3645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void LoginUtilsImpl::PrepareProfile( 365c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const UserContext& user_context, 366116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch bool has_auth_cookies, 36790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) bool has_active_session, 3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LoginUtils::Delegate* delegate) { 369f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) // TODO(nkostylev): We have to initialize LoginUtils delegate as long 370f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) // as it coexist with SessionManager. 3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delegate_ = delegate; 372f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 373f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) // For the transition part LoginUtils will just delegate profile 374f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) // creation and initialization to SessionManager. Later LoginUtils will be 375f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) // removed and all LoginUtils clients will just work with SessionManager 376f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) // directly. 377116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch UserSessionManager::GetInstance()->StartSession( 378116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch user_context, authenticator_, has_auth_cookies, has_active_session, this); 3795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void LoginUtilsImpl::DelegateDeleted(LoginUtils::Delegate* delegate) { 3825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (delegate_ == delegate) 3835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delegate_ = NULL; 3845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 386116680a4aac90f2aa7413d9095a592090648e557Ben Murdochbool LoginUtilsImpl::RestartToApplyPerSessionFlagsIfNeed(Profile* profile, 387116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch bool early_restart) { 388116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch if (ProfileHelper::IsSigninProfile(profile)) 389116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch return false; 390116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 391116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch if (early_restart && !CanPerformEarlyRestart()) 392116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch return false; 393116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 394116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch const CommandLine user_flags(CreatePerSessionCommandLine(profile)); 3956e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) std::set<CommandLine::StringType> command_line_difference; 3966e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) if (!NeedRestartToApplyPerSessionFlags(user_flags, &command_line_difference)) 397116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch return false; 398116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 3996e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) LogCustomSwitches(command_line_difference); 4006e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) 4016e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) about_flags::ReportCustomFlags("Login.CustomFlags", command_line_difference); 4026e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) 403116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch CommandLine::StringVector flags; 404116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // argv[0] is the program name |CommandLine::NO_PROGRAM|. 405116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch flags.assign(user_flags.argv().begin() + 1, user_flags.argv().end()); 406116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch VLOG(1) << "Restarting to apply per-session flags..."; 407116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch DBusThreadManager::Get()->GetSessionManagerClient()->SetFlagsForUser( 4086e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) user_manager::UserManager::Get()->GetActiveUser()->email(), flags); 409116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch AttemptRestart(profile); 410116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch return true; 411116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch} 412116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 4135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void LoginUtilsImpl::CompleteOffTheRecordLogin(const GURL& start_url) { 4145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VLOG(1) << "Completing incognito login"; 4155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // For guest session we ask session manager to restart Chrome with --bwsi 4175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // flag. We keep only some of the arguments of this process. 4185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const CommandLine& browser_command_line = *CommandLine::ForCurrentProcess(); 4195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CommandLine command_line(browser_command_line.GetProgram()); 420effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch std::string cmd_line_str = 421effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch GetOffTheRecordCommandLine(start_url, 422effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch StartupUtils::IsOobeCompleted(), 423effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch browser_command_line, 424effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch &command_line); 4255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) RestartChrome(cmd_line_str); 4275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)scoped_refptr<Authenticator> LoginUtilsImpl::CreateAuthenticator( 430116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch AuthStatusConsumer* consumer) { 4315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Screen locker needs new Authenticator instance each time. 4325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ScreenLocker::default_screen_locker()) { 4337d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) if (authenticator_.get()) 4345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) authenticator_->SetConsumer(NULL); 4355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) authenticator_ = NULL; 4365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4387d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) if (authenticator_.get() == NULL) { 43903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) authenticator_ = new ChromeCryptohomeAuthenticator(consumer); 4405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 4415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // TODO(nkostylev): Fix this hack by improving Authenticator dependencies. 4425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) authenticator_->SetConsumer(consumer); 4435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return authenticator_; 4455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 447f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)void LoginUtilsImpl::OnProfilePrepared(Profile* profile) { 448f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) if (delegate_) 449f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) delegate_->OnProfilePrepared(profile); 4505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 452f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#if defined(ENABLE_RLZ) 453f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)void LoginUtilsImpl::OnRlzInitialized() { 454f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) if (delegate_) 455f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) delegate_->OnRlzInitialized(); 4565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 457f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#endif 4585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void LoginUtilsImpl::AttemptRestart(Profile* profile) { 4601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (UserSessionManager::GetInstance() 4611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ->CheckEasyUnlockKeyOps( 4621320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci base::Bind(&LoginUtilsImpl::AttemptRestart, 4631320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci base::Unretained(this), 4641320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci profile))) { 4651320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return; 4661320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 4671320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 468116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch if (UserSessionManager::GetInstance()->GetSigninSessionRestoreStrategy() != 46968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) OAuth2LoginManager::RESTORE_FROM_COOKIE_JAR) { 4705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) chrome::AttemptRestart(); 47168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) return; 47268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) } 47368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 47468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) // We can't really quit if the session restore process that mints new 47568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) // refresh token is still in progress. 47668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) OAuth2LoginManager* login_manager = 47768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) OAuth2LoginManagerFactory::GetInstance()->GetForProfile(profile); 47868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) if (login_manager->state() != 47968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) OAuth2LoginManager::SESSION_RESTORE_PREPARING && 48068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) login_manager->state() != 48168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) OAuth2LoginManager::SESSION_RESTORE_IN_PROGRESS) { 4825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) chrome::AttemptRestart(); 48368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) return; 48468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) } 48568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 48668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) LOG(WARNING) << "Attempting browser restart during session restore."; 487116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch UserSessionManager::GetInstance()->set_exit_after_session_restore(true); 4882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 4892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// static 4915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)LoginUtils* LoginUtils::Get() { 4925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return LoginUtilsWrapper::GetInstance()->get(); 4935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static 4965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void LoginUtils::Set(LoginUtils* mock) { 4975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LoginUtilsWrapper::GetInstance()->reset(mock); 4985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static 5015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)bool LoginUtils::IsWhitelisted(const std::string& username, 5025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) bool* wildcard_match) { 503a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // Skip whitelist check for tests. 504a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (CommandLine::ForCurrentProcess()->HasSwitch( 505a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) chromeos::switches::kOobeSkipPostLogin)) { 506a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return true; 507a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } 508a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 5095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CrosSettings* cros_settings = CrosSettings::Get(); 5105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool allow_new_user = false; 5115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cros_settings->GetBoolean(kAccountsPrefAllowNewUser, &allow_new_user); 5125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (allow_new_user) 5135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 5145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return cros_settings->FindEmailInList( 5155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) kAccountsPrefUsers, username, wildcard_match); 5165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace chromeos 519