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