1116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// Copyright 2014 The Chromium Authors. All rights reserved.
2116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// Use of this source code is governed by a BSD-style license that can be
3116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// found in the LICENSE file.
4116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
5116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "chrome/browser/chromeos/login/session/user_session_manager.h"
6116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
7116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include <string>
8116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
9116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "base/base_paths.h"
10116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "base/bind.h"
11116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "base/command_line.h"
12116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "base/logging.h"
13116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "base/path_service.h"
14116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "base/prefs/pref_member.h"
15116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "base/prefs/pref_registry_simple.h"
16116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "base/prefs/pref_service.h"
17116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "base/strings/string16.h"
18116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "base/sys_info.h"
19116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "base/task_runner_util.h"
20116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "base/threading/worker_pool.h"
21116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "chrome/browser/app_mode/app_mode_utils.h"
22116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "chrome/browser/browser_process.h"
235f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "chrome/browser/browser_process_platform_part_chromeos.h"
24116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "chrome/browser/chrome_notification_types.h"
25116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "chrome/browser/chromeos/base/locale_util.h"
26116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "chrome/browser/chromeos/boot_times_loader.h"
27116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "chrome/browser/chromeos/input_method/input_method_util.h"
28116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "chrome/browser/chromeos/login/demo_mode/demo_app_launcher.h"
291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "chrome/browser/chromeos/login/easy_unlock/easy_unlock_key_manager.h"
30116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "chrome/browser/chromeos/login/profile_auth_data.h"
31116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "chrome/browser/chromeos/login/saml/saml_offline_signin_limiter.h"
32116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "chrome/browser/chromeos/login/saml/saml_offline_signin_limiter_factory.h"
33116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "chrome/browser/chromeos/login/signin/oauth2_login_manager.h"
34116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "chrome/browser/chromeos/login/signin/oauth2_login_manager_factory.h"
356e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)#include "chrome/browser/chromeos/login/users/chrome_user_manager.h"
36116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "chrome/browser/chromeos/login/users/supervised_user_manager.h"
375f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "chrome/browser/chromeos/policy/browser_policy_connector_chromeos.h"
38116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "chrome/browser/chromeos/profiles/profile_helper.h"
395f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "chrome/browser/chromeos/settings/cros_settings.h"
40116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "chrome/browser/first_run/first_run.h"
41116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "chrome/browser/google/google_brand_chromeos.h"
42116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "chrome/browser/lifetime/application_lifetime.h"
435f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "chrome/browser/net/crl_set_fetcher.h"
44116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "chrome/browser/net/nss_context.h"
45116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "chrome/browser/profiles/profile.h"
46116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "chrome/browser/profiles/profile_manager.h"
47116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "chrome/browser/rlz/rlz.h"
481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "chrome/browser/signin/easy_unlock_service.h"
49116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "chrome/browser/signin/signin_manager_factory.h"
50116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "chrome/common/chrome_switches.h"
51116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "chrome/common/logging_chrome.h"
52116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "chrome/common/pref_names.h"
53116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "chromeos/cert_loader.h"
54116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "chromeos/chromeos_switches.h"
55116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "chromeos/cryptohome/cryptohome_util.h"
56116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "chromeos/dbus/cryptohome_client.h"
57116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "chromeos/dbus/dbus_thread_manager.h"
58116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "chromeos/dbus/session_manager_client.h"
59116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "chromeos/ime/input_method_manager.h"
60116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "chromeos/network/portal_detector/network_portal_detector.h"
61116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "chromeos/network/portal_detector/network_portal_detector_strategy.h"
625f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "chromeos/settings/cros_settings_names.h"
6303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)#include "components/component_updater/component_updater_service.h"
645f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "components/policy/core/common/cloud/cloud_policy_constants.h"
65116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "components/session_manager/core/session_manager.h"
66116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "components/signin/core/browser/signin_manager_base.h"
675f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "components/user_manager/user.h"
686e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)#include "components/user_manager/user_manager.h"
695f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "components/user_manager/user_type.h"
70116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "content/public/browser/browser_thread.h"
71116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "content/public/browser/notification_service.h"
72116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
73116680a4aac90f2aa7413d9095a592090648e557Ben Murdochnamespace chromeos {
74116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
75116680a4aac90f2aa7413d9095a592090648e557Ben Murdochnamespace {
76116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
775f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)void InitLocaleAndInputMethodsForNewUser(
7803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    UserSessionManager* session_manager,
7903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    Profile* profile,
805f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    const std::string& public_session_locale,
815f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    const std::string& public_session_input_method) {
8203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  PrefService* prefs = profile->GetPrefs();
835f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  std::string locale;
845f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  if (!public_session_locale.empty()) {
855f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    // If this is a public session and the user chose a |public_session_locale|,
865f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    // write it to |prefs| so that the UI switches to it.
875f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    locale = public_session_locale;
885f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    prefs->SetString(prefs::kApplicationLocale, locale);
895f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
905f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    // Suppress the locale change dialog.
915f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    prefs->SetString(prefs::kApplicationLocaleAccepted, locale);
925f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  } else {
935f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    // Otherwise, assume that the session will use the current UI locale.
945f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    locale = g_browser_process->GetApplicationLocale();
955f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  }
965f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
97116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // First, we'll set kLanguagePreloadEngines.
98116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  input_method::InputMethodManager* manager =
99116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      input_method::InputMethodManager::Get();
100116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  std::vector<std::string> input_method_ids;
1015f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
1025f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  if (!public_session_input_method.empty()) {
1035f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    // If this is a public session and the user chose a
1045f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    // |public_session_input_method|, set kLanguagePreloadEngines to this input
1055f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    // method only.
1065f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    input_method_ids.push_back(public_session_input_method);
1075f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  } else {
1085f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    // Otherwise, set kLanguagePreloadEngines to a list of input methods derived
1095f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    // from the |locale| and the currently active input method.
1105f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    manager->GetInputMethodUtil()->GetFirstLoginInputMethodIds(
11103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)        locale,
11203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)        session_manager->GetDefaultIMEState(profile)->GetCurrentInputMethod(),
11303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)        &input_method_ids);
1145f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  }
115116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
116116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // Save the input methods in the user's preferences.
117116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  StringPrefMember language_preload_engines;
118116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  language_preload_engines.Init(prefs::kLanguagePreloadEngines, prefs);
119116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  language_preload_engines.SetValue(JoinString(input_method_ids, ','));
120116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  BootTimesLoader::Get()->AddLoginTimeMarker("IMEStarted", false);
121116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
122116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // Second, we'll set kLanguagePreferredLanguages.
123116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  std::vector<std::string> language_codes;
124116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
125116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // The current locale should be on the top.
126116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  language_codes.push_back(locale);
127116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
128116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // Add input method IDs based on the input methods, as there may be
129116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // input methods that are unrelated to the current locale. Example: the
130116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // hardware keyboard layout xkb:us::eng is used for logging in, but the
131116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // UI language is set to French. In this case, we should set "fr,en"
132116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // to the preferred languages preference.
133116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  std::vector<std::string> candidates;
134116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  manager->GetInputMethodUtil()->GetLanguageCodesFromInputMethodIds(
135116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      input_method_ids, &candidates);
136116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  for (size_t i = 0; i < candidates.size(); ++i) {
137116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    const std::string& candidate = candidates[i];
138116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    // Skip if it's already in language_codes.
139116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    if (std::count(language_codes.begin(), language_codes.end(),
140116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                   candidate) == 0) {
141116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      language_codes.push_back(candidate);
142116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    }
143116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  }
144116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
145116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // Save the preferred languages in the user's preferences.
146116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  StringPrefMember language_preferred_languages;
147116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  language_preferred_languages.Init(prefs::kLanguagePreferredLanguages, prefs);
148116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  language_preferred_languages.SetValue(JoinString(language_codes, ','));
149116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
150116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
151116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#if defined(ENABLE_RLZ)
152116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// Flag file that disables RLZ tracking, when present.
153116680a4aac90f2aa7413d9095a592090648e557Ben Murdochconst base::FilePath::CharType kRLZDisabledFlagName[] =
154116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    FILE_PATH_LITERAL(".rlz_disabled");
155116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
156116680a4aac90f2aa7413d9095a592090648e557Ben Murdochbase::FilePath GetRlzDisabledFlagPath() {
157116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  base::FilePath homedir;
158116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  PathService::Get(base::DIR_HOME, &homedir);
159116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  return homedir.Append(kRLZDisabledFlagName);
160116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
161116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#endif
162116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
163116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// Callback to GetNSSCertDatabaseForProfile. It starts CertLoader using the
164116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// provided NSS database. It must be called for primary user only.
165116680a4aac90f2aa7413d9095a592090648e557Ben Murdochvoid OnGetNSSCertDatabaseForUser(net::NSSCertDatabase* database) {
166116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  if (!CertLoader::IsInitialized())
167116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    return;
168116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
169116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  CertLoader::Get()->StartWithNSSDB(database);
170116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
171116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
172116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}  // namespace
173116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
174116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#if defined(ENABLE_RLZ)
175116680a4aac90f2aa7413d9095a592090648e557Ben Murdochvoid UserSessionManagerDelegate::OnRlzInitialized() {
176116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
177116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#endif
178116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
179116680a4aac90f2aa7413d9095a592090648e557Ben MurdochUserSessionManagerDelegate::~UserSessionManagerDelegate() {
180116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
181116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
182116680a4aac90f2aa7413d9095a592090648e557Ben Murdochvoid UserSessionStateObserver::PendingUserSessionsRestoreFinished() {
183116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
184116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
185116680a4aac90f2aa7413d9095a592090648e557Ben MurdochUserSessionStateObserver::~UserSessionStateObserver() {
186116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
187116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
188116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// static
189116680a4aac90f2aa7413d9095a592090648e557Ben MurdochUserSessionManager* UserSessionManager::GetInstance() {
190116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  return Singleton<UserSessionManager,
191116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      DefaultSingletonTraits<UserSessionManager> >::get();
192116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
193116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
194116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// static
195116680a4aac90f2aa7413d9095a592090648e557Ben Murdochvoid UserSessionManager::OverrideHomedir() {
196116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // Override user homedir, check for ProfileManager being initialized as
197116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // it may not exist in unit tests.
198116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  if (g_browser_process->profile_manager()) {
1996e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    user_manager::UserManager* user_manager = user_manager::UserManager::Get();
200116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    if (user_manager->GetLoggedInUsers().size() == 1) {
201116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      base::FilePath homedir = ProfileHelper::GetProfilePathByUserIdHash(
202116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch          user_manager->GetPrimaryUser()->username_hash());
203116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      // This path has been either created by cryptohome (on real Chrome OS
204116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      // device) or by ProfileManager (on chromeos=1 desktop builds).
205116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      PathService::OverrideAndCreateIfNeeded(base::DIR_HOME,
206116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                                             homedir,
207116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                                             true /* path is absolute */,
208116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                                             false /* don't create */);
209116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    }
210116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  }
211116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
212116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
213116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// static
214116680a4aac90f2aa7413d9095a592090648e557Ben Murdochvoid UserSessionManager::RegisterPrefs(PrefRegistrySimple* registry) {
215116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  registry->RegisterStringPref(prefs::kRLZBrand, std::string());
216116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  registry->RegisterBooleanPref(prefs::kRLZDisabled, false);
217116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
218116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
219116680a4aac90f2aa7413d9095a592090648e557Ben MurdochUserSessionManager::UserSessionManager()
220116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    : delegate_(NULL),
221116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      has_auth_cookies_(false),
222116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      user_sessions_restored_(false),
2231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      user_sessions_restore_in_progress_(false),
224116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      exit_after_session_restore_(false),
225116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      session_restore_strategy_(
2261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          OAuth2LoginManager::RESTORE_FROM_SAVED_OAUTH2_REFRESH_TOKEN),
2271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      running_easy_unlock_key_ops_(false) {
228116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  net::NetworkChangeNotifier::AddConnectionTypeObserver(this);
22903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  user_manager::UserManager::Get()->AddSessionStateObserver(this);
230116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
231116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
232116680a4aac90f2aa7413d9095a592090648e557Ben MurdochUserSessionManager::~UserSessionManager() {
23303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  // UserManager is destroyed before singletons, so we need to check if it
23403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  // still exists.
23503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  // TODO(nkostylev): fix order of destruction of UserManager
23603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  // / UserSessionManager objects.
23703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  if (user_manager::UserManager::IsInitialized())
23803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    user_manager::UserManager::Get()->RemoveSessionStateObserver(this);
239116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  net::NetworkChangeNotifier::RemoveConnectionTypeObserver(this);
240116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
241116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
242116680a4aac90f2aa7413d9095a592090648e557Ben Murdochvoid UserSessionManager::StartSession(
243116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    const UserContext& user_context,
244116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    scoped_refptr<Authenticator> authenticator,
245116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    bool has_auth_cookies,
246116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    bool has_active_session,
247116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    UserSessionManagerDelegate* delegate) {
248116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  authenticator_ = authenticator;
249116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  delegate_ = delegate;
250116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
251116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  VLOG(1) << "Starting session for " << user_context.GetUserID();
252116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
253116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  PreStartSession();
254116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  CreateUserSession(user_context, has_auth_cookies);
255116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
256116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  if (!has_active_session)
257116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    StartCrosSession();
258116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
259116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // TODO(nkostylev): Notify UserLoggedIn() after profile is actually
260116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // ready to be used (http://crbug.com/361528).
261116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  NotifyUserLoggedIn();
262116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  PrepareProfile();
263116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
264116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
265116680a4aac90f2aa7413d9095a592090648e557Ben Murdochvoid UserSessionManager::PerformPostUserLoggedInActions() {
2666e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  user_manager::UserManager* user_manager = user_manager::UserManager::Get();
267116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  if (user_manager->GetLoggedInUsers().size() == 1) {
268116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    if (NetworkPortalDetector::IsInitialized()) {
269116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      NetworkPortalDetector::Get()->SetStrategy(
270116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch          PortalDetectorStrategy::STRATEGY_ID_SESSION);
271116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    }
272116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  }
273116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
274116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
275116680a4aac90f2aa7413d9095a592090648e557Ben Murdochvoid UserSessionManager::RestoreAuthenticationSession(Profile* user_profile) {
2766e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  user_manager::UserManager* user_manager = user_manager::UserManager::Get();
277116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // We need to restore session only for logged in regular (GAIA) users.
278116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // Note: stub user is a special case that is used for tests, running
279116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // linux_chromeos build on dev workstations w/o user_id parameters.
280116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // Stub user is considered to be a regular GAIA user but it has special
281116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // user_id (kStubUser) and certain services like restoring OAuth session are
282116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // explicitly disabled for it.
283116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  if (!user_manager->IsUserLoggedIn() ||
284116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      !user_manager->IsLoggedInAsRegularUser() ||
285116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      user_manager->IsLoggedInAsStub()) {
286116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    return;
287116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  }
288116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
2895f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  user_manager::User* user =
2905f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      ProfileHelper::Get()->GetUserByProfile(user_profile);
291116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  DCHECK(user);
292116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  if (!net::NetworkChangeNotifier::IsOffline()) {
293116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    pending_signin_restore_sessions_.erase(user->email());
294116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    RestoreAuthSessionImpl(user_profile, false /* has_auth_cookies */);
295116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  } else {
296116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    // Even if we're online we should wait till initial
297116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    // OnConnectionTypeChanged() call. Otherwise starting fetchers too early may
298116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    // end up canceling all request when initial network connection type is
299116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    // processed. See http://crbug.com/121643.
300116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    pending_signin_restore_sessions_.insert(user->email());
301116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  }
302116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
303116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
304116680a4aac90f2aa7413d9095a592090648e557Ben Murdochvoid UserSessionManager::RestoreActiveSessions() {
3051320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  user_sessions_restore_in_progress_ = true;
306116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  DBusThreadManager::Get()->GetSessionManagerClient()->RetrieveActiveSessions(
307116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      base::Bind(&UserSessionManager::OnRestoreActiveSessions,
308116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                 base::Unretained(this)));
309116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
310116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
311116680a4aac90f2aa7413d9095a592090648e557Ben Murdochbool UserSessionManager::UserSessionsRestored() const {
312116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI));
313116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  return user_sessions_restored_;
314116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
315116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
3161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccibool UserSessionManager::UserSessionsRestoreInProgress() const {
3171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI));
3181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  return user_sessions_restore_in_progress_;
3191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
3201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
321116680a4aac90f2aa7413d9095a592090648e557Ben Murdochvoid UserSessionManager::InitRlz(Profile* profile) {
322116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#if defined(ENABLE_RLZ)
323116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  if (!g_browser_process->local_state()->HasPrefPath(prefs::kRLZBrand)) {
324116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    // Read brand code asynchronously from an OEM data and repost ourselves.
325116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    google_brand::chromeos::InitBrand(
326116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch        base::Bind(&UserSessionManager::InitRlz, AsWeakPtr(), profile));
327116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    return;
328116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  }
329116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  base::PostTaskAndReplyWithResult(
3301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      base::WorkerPool::GetTaskRunner(false).get(),
331116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      FROM_HERE,
332116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      base::Bind(&base::PathExists, GetRlzDisabledFlagPath()),
333116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      base::Bind(&UserSessionManager::InitRlzImpl, AsWeakPtr(), profile));
334116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#endif
335116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
336116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
337116680a4aac90f2aa7413d9095a592090648e557Ben MurdochOAuth2LoginManager::SessionRestoreStrategy
338116680a4aac90f2aa7413d9095a592090648e557Ben MurdochUserSessionManager::GetSigninSessionRestoreStrategy() {
339116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  return session_restore_strategy_;
340116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
341116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
3425f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)void UserSessionManager::SetFirstLoginPrefs(
34303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    Profile* profile,
3445f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    const std::string& public_session_locale,
3455f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    const std::string& public_session_input_method) {
346116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  VLOG(1) << "Setting first login prefs";
34703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  InitLocaleAndInputMethodsForNewUser(
34803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)      this, profile, public_session_locale, public_session_input_method);
349116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
350116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
351116680a4aac90f2aa7413d9095a592090648e557Ben Murdochbool UserSessionManager::GetAppModeChromeClientOAuthInfo(
352116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    std::string* chrome_client_id, std::string* chrome_client_secret) {
353116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  if (!chrome::IsRunningInForcedAppMode() ||
354116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      chrome_client_id_.empty() ||
355116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      chrome_client_secret_.empty()) {
356116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    return false;
357116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  }
358116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
359116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  *chrome_client_id = chrome_client_id_;
360116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  *chrome_client_secret = chrome_client_secret_;
361116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  return true;
362116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
363116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
364116680a4aac90f2aa7413d9095a592090648e557Ben Murdochvoid UserSessionManager::SetAppModeChromeClientOAuthInfo(
365116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    const std::string& chrome_client_id,
366116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    const std::string& chrome_client_secret) {
367116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  if (!chrome::IsRunningInForcedAppMode())
368116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    return;
369116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
370116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  chrome_client_id_ = chrome_client_id;
371116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  chrome_client_secret_ = chrome_client_secret;
372116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
373116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
374116680a4aac90f2aa7413d9095a592090648e557Ben Murdochbool UserSessionManager::RespectLocalePreference(
375116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    Profile* profile,
3765f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    const user_manager::User* user,
377116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    scoped_ptr<locale_util::SwitchLanguageCallback> callback) const {
378116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // TODO(alemate): http://crbug.com/288941 : Respect preferred language list in
379116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // the Google user profile.
380116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  if (g_browser_process == NULL)
381116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    return false;
382116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
3836e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  user_manager::UserManager* user_manager = user_manager::UserManager::Get();
3845f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  if (!user || (user_manager->IsUserLoggedIn() &&
3855f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                user != user_manager->GetPrimaryUser())) {
386116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    return false;
3875f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  }
388116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
389116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // In case of multi-profiles session we don't apply profile locale
390116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // because it is unsafe.
391116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  if (user_manager->GetLoggedInUsers().size() != 1)
392116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    return false;
393116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
394116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  const PrefService* prefs = profile->GetPrefs();
395116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  if (prefs == NULL)
396116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    return false;
397116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
398116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  std::string pref_locale;
399116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  const std::string pref_app_locale =
400116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      prefs->GetString(prefs::kApplicationLocale);
401116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  const std::string pref_bkup_locale =
402116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      prefs->GetString(prefs::kApplicationLocaleBackup);
403116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
404116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  pref_locale = pref_app_locale;
405116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  if (pref_locale.empty())
406116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    pref_locale = pref_bkup_locale;
407116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
408116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  const std::string* account_locale = NULL;
409116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  if (pref_locale.empty() && user->has_gaia_account()) {
410116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    if (user->GetAccountLocale() == NULL)
411116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      return false;  // wait until Account profile is loaded.
412116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    account_locale = user->GetAccountLocale();
413116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    pref_locale = *account_locale;
414116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  }
415116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  const std::string global_app_locale =
416116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      g_browser_process->GetApplicationLocale();
417116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  if (pref_locale.empty())
418116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    pref_locale = global_app_locale;
419116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  DCHECK(!pref_locale.empty());
420116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  VLOG(1) << "RespectLocalePreference: "
421116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch          << "app_locale='" << pref_app_locale << "', "
422116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch          << "bkup_locale='" << pref_bkup_locale << "', "
423116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch          << (account_locale != NULL
424116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch              ? (std::string("account_locale='") + (*account_locale) +
425116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                 "'. ")
426116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch              : (std::string("account_locale - unused. ")))
427116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch          << " Selected '" << pref_locale << "'";
4285f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  profile->ChangeAppLocale(
4295f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      pref_locale,
4305f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      user->GetType() == user_manager::USER_TYPE_PUBLIC_ACCOUNT ?
4315f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)          Profile::APP_LOCALE_CHANGED_VIA_PUBLIC_SESSION_LOGIN :
4325f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)          Profile::APP_LOCALE_CHANGED_VIA_LOGIN);
433116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
434116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // Here we don't enable keyboard layouts for normal users. Input methods
435116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // are set up when the user first logs in. Then the user may customize the
436116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // input methods.  Hence changing input methods here, just because the user's
437116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // UI language is different from the login screen UI language, is not
438116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // desirable. Note that input method preferences are synced, so users can use
439116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // their farovite input methods as soon as the preferences are synced.
440116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  //
441116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // For Guest mode, user locale preferences will never get initialized.
442116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // So input methods should be enabled somewhere.
4436e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  const bool enable_layouts =
4446e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      user_manager::UserManager::Get()->IsLoggedInAsGuest();
445116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  locale_util::SwitchLanguage(pref_locale,
446116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                              enable_layouts,
447116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                              false /* login_layouts_only */,
448116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                              callback.Pass());
449116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
450116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  return true;
451116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
452116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
4531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccibool UserSessionManager::NeedsToUpdateEasyUnlockKeys() const {
4541675a649fd7a8b3cb80ffddae2dc181f122353c5Ben Murdoch  return EasyUnlockService::IsSignInEnabled() &&
4551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci         !user_context_.GetUserID().empty() &&
4561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci         user_context_.GetUserType() == user_manager::USER_TYPE_REGULAR &&
4571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci         user_context_.GetKey() && !user_context_.GetKey()->GetSecret().empty();
4581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
4591320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
4601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccibool UserSessionManager::CheckEasyUnlockKeyOps(const base::Closure& callback) {
4611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (!running_easy_unlock_key_ops_)
4621320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    return false;
4631320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
4641320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // Assumes only one deferred callback is needed.
4651320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  DCHECK(easy_unlock_key_ops_finished_callback_.is_null());
4661320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
4671320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  easy_unlock_key_ops_finished_callback_ = callback;
4681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  return true;
4691320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
4701320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
471116680a4aac90f2aa7413d9095a592090648e557Ben Murdochvoid UserSessionManager::AddSessionStateObserver(
47203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    chromeos::UserSessionStateObserver* observer) {
473116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI));
474116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  session_state_observer_list_.AddObserver(observer);
475116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
476116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
477116680a4aac90f2aa7413d9095a592090648e557Ben Murdochvoid UserSessionManager::RemoveSessionStateObserver(
47803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    chromeos::UserSessionStateObserver* observer) {
479116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI));
480116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  session_state_observer_list_.RemoveObserver(observer);
481116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
482116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
483116680a4aac90f2aa7413d9095a592090648e557Ben Murdochvoid UserSessionManager::OnSessionRestoreStateChanged(
484116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    Profile* user_profile,
485116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    OAuth2LoginManager::SessionRestoreState state) {
4865f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  user_manager::User::OAuthTokenStatus user_status =
4875f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      user_manager::User::OAUTH_TOKEN_STATUS_UNKNOWN;
488116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  OAuth2LoginManager* login_manager =
489116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      OAuth2LoginManagerFactory::GetInstance()->GetForProfile(user_profile);
490116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
491116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  bool connection_error = false;
492116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  switch (state) {
493116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    case OAuth2LoginManager::SESSION_RESTORE_DONE:
4945f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      user_status = user_manager::User::OAUTH2_TOKEN_STATUS_VALID;
495116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      break;
496116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    case OAuth2LoginManager::SESSION_RESTORE_FAILED:
4975f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      user_status = user_manager::User::OAUTH2_TOKEN_STATUS_INVALID;
498116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      break;
499116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    case OAuth2LoginManager::SESSION_RESTORE_CONNECTION_FAILED:
500116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      connection_error = true;
501116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      break;
502116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    case OAuth2LoginManager::SESSION_RESTORE_NOT_STARTED:
503116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    case OAuth2LoginManager::SESSION_RESTORE_PREPARING:
504116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    case OAuth2LoginManager::SESSION_RESTORE_IN_PROGRESS:
505116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      return;
506116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  }
507116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
508116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // We should not be clearing existing token state if that was a connection
509116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // error. http://crbug.com/295245
510116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  if (!connection_error) {
511116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    // We are in one of "done" states here.
5126e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    user_manager::UserManager::Get()->SaveUserOAuthStatus(
5136e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)        user_manager::UserManager::Get()->GetLoggedInUser()->email(),
514116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch        user_status);
515116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  }
516116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
517116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  login_manager->RemoveObserver(this);
518116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
519116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
520116680a4aac90f2aa7413d9095a592090648e557Ben Murdochvoid UserSessionManager::OnNewRefreshTokenAvaiable(Profile* user_profile) {
521116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // Check if we were waiting to restart chrome.
522116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  if (!exit_after_session_restore_)
523116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    return;
524116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
525116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  OAuth2LoginManager* login_manager =
526116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      OAuth2LoginManagerFactory::GetInstance()->GetForProfile(user_profile);
527116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  login_manager->RemoveObserver(this);
528116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
529116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // Mark user auth token status as valid.
5306e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  user_manager::UserManager::Get()->SaveUserOAuthStatus(
5316e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      user_manager::UserManager::Get()->GetLoggedInUser()->email(),
5325f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      user_manager::User::OAUTH2_TOKEN_STATUS_VALID);
533116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
534116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  VLOG(1) << "Exiting after new refresh token fetched";
535116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
536116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // We need to restart cleanly in this case to make sure OAuth2 RT is actually
537116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // saved.
538116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  chrome::AttemptRestart();
539116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
540116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
541116680a4aac90f2aa7413d9095a592090648e557Ben Murdochvoid UserSessionManager::OnConnectionTypeChanged(
542116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    net::NetworkChangeNotifier::ConnectionType type) {
543116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  bool is_running_test =
544116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      base::CommandLine::ForCurrentProcess()->HasSwitch(
545116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch          ::switches::kTestName) ||
546116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      base::CommandLine::ForCurrentProcess()->HasSwitch(::switches::kTestType);
5476e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  user_manager::UserManager* user_manager = user_manager::UserManager::Get();
548116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  if (type == net::NetworkChangeNotifier::CONNECTION_NONE ||
549116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      !user_manager->IsUserLoggedIn() ||
550116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      !user_manager->IsLoggedInAsRegularUser() ||
551116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      user_manager->IsLoggedInAsStub() || is_running_test) {
552116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    return;
553116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  }
554116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
555116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // Need to iterate over all users and their OAuth2 session state.
5565f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  const user_manager::UserList& users = user_manager->GetLoggedInUsers();
5575f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  for (user_manager::UserList::const_iterator it = users.begin();
5585f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)       it != users.end();
5595f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)       ++it) {
560116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    if (!(*it)->is_profile_created())
561116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      continue;
562116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
5636e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    Profile* user_profile = ProfileHelper::Get()->GetProfileByUserUnsafe(*it);
564116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    bool should_restore_session =
565116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch        pending_signin_restore_sessions_.find((*it)->email()) !=
566116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch        pending_signin_restore_sessions_.end();
567116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    OAuth2LoginManager* login_manager =
568116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch        OAuth2LoginManagerFactory::GetInstance()->GetForProfile(user_profile);
569116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    if (login_manager->state() ==
570116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch            OAuth2LoginManager::SESSION_RESTORE_IN_PROGRESS) {
571116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      // If we come online for the first time after successful offline login,
572116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      // we need to kick off OAuth token verification process again.
573116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      login_manager->ContinueSessionRestore();
574116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    } else if (should_restore_session) {
575116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      pending_signin_restore_sessions_.erase((*it)->email());
576116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      RestoreAuthSessionImpl(user_profile, false /* has_auth_cookies */);
577116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    }
578116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  }
579116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
580116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
581116680a4aac90f2aa7413d9095a592090648e557Ben Murdochvoid UserSessionManager::OnProfilePrepared(Profile* profile) {
582116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  LoginUtils::Get()->DoBrowserLaunch(profile, NULL);  // host_, not needed here
583116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
584116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  if (!CommandLine::ForCurrentProcess()->HasSwitch(::switches::kTestName)) {
585116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    // Did not log in (we crashed or are debugging), need to restore Sync.
586116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    // TODO(nkostylev): Make sure that OAuth state is restored correctly for all
587116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    // users once it is fully multi-profile aware. http://crbug.com/238987
588116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    // For now if we have other user pending sessions they'll override OAuth
589116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    // session restore for previous users.
590116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    UserSessionManager::GetInstance()->RestoreAuthenticationSession(profile);
591116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  }
592116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
593116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // Restore other user sessions if any.
594116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  RestorePendingUserSessions();
595116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
596116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
597116680a4aac90f2aa7413d9095a592090648e557Ben Murdochvoid UserSessionManager::CreateUserSession(const UserContext& user_context,
5985f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                                           bool has_auth_cookies) {
599116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  user_context_ = user_context;
600116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  has_auth_cookies_ = has_auth_cookies;
601116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  InitSessionRestoreStrategy();
602116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
603116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
604116680a4aac90f2aa7413d9095a592090648e557Ben Murdochvoid UserSessionManager::PreStartSession() {
605116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // Switch log file as soon as possible.
606116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  if (base::SysInfo::IsRunningOnChromeOS())
607116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    logging::RedirectChromeLogging(*(CommandLine::ForCurrentProcess()));
608116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
609116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
610116680a4aac90f2aa7413d9095a592090648e557Ben Murdochvoid UserSessionManager::StartCrosSession() {
611116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  BootTimesLoader* btl = BootTimesLoader::Get();
612116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  btl->AddLoginTimeMarker("StartSession-Start", false);
613116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  DBusThreadManager::Get()->GetSessionManagerClient()->
614116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      StartSession(user_context_.GetUserID());
615116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  btl->AddLoginTimeMarker("StartSession-End", false);
616116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
617116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
618116680a4aac90f2aa7413d9095a592090648e557Ben Murdochvoid UserSessionManager::NotifyUserLoggedIn() {
619116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  BootTimesLoader* btl = BootTimesLoader::Get();
620116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  btl->AddLoginTimeMarker("UserLoggedIn-Start", false);
6216e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  user_manager::UserManager* user_manager = user_manager::UserManager::Get();
622116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  user_manager->UserLoggedIn(user_context_.GetUserID(),
623116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                             user_context_.GetUserIDHash(),
624116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                             false);
625116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  btl->AddLoginTimeMarker("UserLoggedIn-End", false);
626116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
627116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
628116680a4aac90f2aa7413d9095a592090648e557Ben Murdochvoid UserSessionManager::PrepareProfile() {
629116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  bool is_demo_session =
630116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      DemoAppLauncher::IsDemoAppSession(user_context_.GetUserID());
631116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
632116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // TODO(nkostylev): Figure out whether demo session is using the right profile
633116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // path or not. See https://codereview.chromium.org/171423009
634116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  g_browser_process->profile_manager()->CreateProfileAsync(
6351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      ProfileHelper::GetProfilePathByUserIdHash(user_context_.GetUserIDHash()),
636116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      base::Bind(&UserSessionManager::OnProfileCreated,
637116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                 AsWeakPtr(),
6385f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                 user_context_,
639116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                 is_demo_session),
640116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      base::string16(),
641116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      base::string16(),
642116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      std::string());
643116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
644116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
6455f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)void UserSessionManager::OnProfileCreated(const UserContext& user_context,
6465f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                                          bool is_incognito_profile,
6475f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                                          Profile* profile,
6485f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                                          Profile::CreateStatus status) {
649116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  CHECK(profile);
650116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
651116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  switch (status) {
652116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    case Profile::CREATE_STATUS_CREATED:
653116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      // Profile created but before initializing extensions and promo resources.
6545f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      InitProfilePreferences(profile, user_context);
655116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      break;
656116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    case Profile::CREATE_STATUS_INITIALIZED:
657116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      // Profile is created, extensions and promo resources are initialized.
658116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      // At this point all other Chrome OS services will be notified that it is
659116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      // safe to use this profile.
6605f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      UserProfileInitialized(profile,
6615f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                             is_incognito_profile,
6625f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                             user_context.GetUserID());
663116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      break;
664116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    case Profile::CREATE_STATUS_LOCAL_FAIL:
665116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    case Profile::CREATE_STATUS_REMOTE_FAIL:
666116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    case Profile::CREATE_STATUS_CANCELED:
667116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    case Profile::MAX_CREATE_STATUS:
668116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      NOTREACHED();
669116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      break;
670116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  }
671116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
672116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
6735f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)void UserSessionManager::InitProfilePreferences(
6745f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    Profile* profile,
6755f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    const UserContext& user_context) {
6761320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  user_manager::User* user = ProfileHelper::Get()->GetUserByProfile(profile);
6771320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (user->is_active()) {
6781320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    input_method::InputMethodManager* manager =
6791320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        input_method::InputMethodManager::Get();
6801320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    manager->SetState(GetDefaultIMEState(profile));
6811320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
6826e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  if (user_manager::UserManager::Get()->IsCurrentUserNew()) {
68303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    SetFirstLoginPrefs(profile,
6845f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                       user_context.GetPublicSessionLocale(),
6855f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                       user_context.GetPublicSessionInputMethod());
6865f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  }
687116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
6886e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  if (user_manager::UserManager::Get()->IsLoggedInAsSupervisedUser()) {
6896e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    user_manager::User* active_user =
6906e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)        user_manager::UserManager::Get()->GetActiveUser();
6915f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    std::string supervised_user_sync_id =
6926e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)        ChromeUserManager::Get()->GetSupervisedUserManager()->GetUserSyncId(
6936e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)            active_user->email());
694116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    profile->GetPrefs()->SetString(prefs::kSupervisedUserId,
6955f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                                   supervised_user_sync_id);
6966e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  } else if (user_manager::UserManager::Get()->IsLoggedInAsRegularUser()) {
697116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    // Make sure that the google service username is properly set (we do this
698116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    // on every sign in, not just the first login, to deal with existing
699116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    // profiles that might not have it set yet).
700116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    SigninManagerBase* signin_manager =
701116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch        SigninManagerFactory::GetForProfile(profile);
7025f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    signin_manager->SetAuthenticatedUsername(user_context.GetUserID());
703116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  }
704116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
705116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
706116680a4aac90f2aa7413d9095a592090648e557Ben Murdochvoid UserSessionManager::UserProfileInitialized(Profile* profile,
7075f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                                                bool is_incognito_profile,
7085f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                                                const std::string& user_id) {
709116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  if (is_incognito_profile) {
710116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    profile->OnLogin();
711116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    // Send the notification before creating the browser so additional objects
712116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    // that need the profile (e.g. the launcher) can be created first.
713116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    content::NotificationService::current()->Notify(
714116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch        chrome::NOTIFICATION_LOGIN_USER_PROFILE_PREPARED,
715116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch        content::NotificationService::AllSources(),
716116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch        content::Details<Profile>(profile));
717116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
718116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    if (delegate_)
719116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      delegate_->OnProfilePrepared(profile);
720116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
721116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    return;
722116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  }
723116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
724116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  BootTimesLoader* btl = BootTimesLoader::Get();
725116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  btl->AddLoginTimeMarker("UserProfileGotten", false);
726116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
727116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  if (user_context_.IsUsingOAuth()) {
7285f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    // Retrieve the policy that indicates whether to continue copying
7295f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    // authentication cookies set by a SAML IdP on subsequent logins after the
7305f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    // first.
7315f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    bool transfer_saml_auth_cookies_on_subsequent_login = false;
7325f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    if (has_auth_cookies_ &&
7335f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        g_browser_process->platform_part()->
7345f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)            browser_policy_connector_chromeos()->GetUserAffiliation(user_id) ==
7355f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                policy::USER_AFFILIATION_MANAGED) {
7365f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      CrosSettings::Get()->GetBoolean(
7375f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)          kAccountsPrefTransferSAMLCookies,
7385f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)          &transfer_saml_auth_cookies_on_subsequent_login);
7395f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    }
7405f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
741116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    // Transfers authentication-related data from the profile that was used for
742116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    // authentication to the user's profile. The proxy authentication state is
743116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    // transferred unconditionally. If the user authenticated via an auth
7445f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    // extension, authentication cookies and channel IDs will be transferred as
7455f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    // well when the user's cookie jar is empty. If the cookie jar is not empty,
7465f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    // the authentication states in the login profile and the user's profile
7475f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    // must be merged using /MergeSession instead. Authentication cookies set by
7485f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    // a SAML IdP will also be transferred when the user's cookie jar is not
7495f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    // empty if |transfer_saml_auth_cookies_on_subsequent_login| is true.
7505f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    const bool transfer_auth_cookies_and_channel_ids_on_first_login =
7515f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        has_auth_cookies_;
752116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    ProfileAuthData::Transfer(
753116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch        authenticator_->authentication_profile(),
754116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch        profile,
7555f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        transfer_auth_cookies_and_channel_ids_on_first_login,
7565f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        transfer_saml_auth_cookies_on_subsequent_login,
757116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch        base::Bind(&UserSessionManager::CompleteProfileCreateAfterAuthTransfer,
758116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                   AsWeakPtr(),
759116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                   profile));
760116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    return;
761116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  }
762116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
763116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  FinalizePrepareProfile(profile);
764116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
765116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
766116680a4aac90f2aa7413d9095a592090648e557Ben Murdochvoid UserSessionManager::CompleteProfileCreateAfterAuthTransfer(
767116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    Profile* profile) {
768116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  RestoreAuthSessionImpl(profile, has_auth_cookies_);
769116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  FinalizePrepareProfile(profile);
770116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
771116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
772116680a4aac90f2aa7413d9095a592090648e557Ben Murdochvoid UserSessionManager::FinalizePrepareProfile(Profile* profile) {
773116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  BootTimesLoader* btl = BootTimesLoader::Get();
774116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
775116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // Own TPM device if, for any reason, it has not been done in EULA screen.
776116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  CryptohomeClient* client = DBusThreadManager::Get()->GetCryptohomeClient();
777116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  btl->AddLoginTimeMarker("TPMOwn-Start", false);
778116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  if (cryptohome_util::TpmIsEnabled() && !cryptohome_util::TpmIsBeingOwned()) {
7795f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    if (cryptohome_util::TpmIsOwned())
780116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      client->CallTpmClearStoredPasswordAndBlock();
7815f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    else
782116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      client->TpmCanAttemptOwnership(EmptyVoidDBusMethodCallback());
783116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  }
784116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  btl->AddLoginTimeMarker("TPMOwn-End", false);
785116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
7866e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  user_manager::UserManager* user_manager = user_manager::UserManager::Get();
787116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  if (user_manager->IsLoggedInAsRegularUser()) {
788116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    SAMLOfflineSigninLimiter* saml_offline_signin_limiter =
789116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch        SAMLOfflineSigninLimiterFactory::GetForProfile(profile);
790116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    if (saml_offline_signin_limiter)
791116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      saml_offline_signin_limiter->SignedIn(user_context_.GetAuthFlow());
792116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  }
793116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
794116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  profile->OnLogin();
795116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
796116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  g_browser_process->platform_part()->SessionManager()->SetSessionState(
797116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      session_manager::SESSION_STATE_LOGGED_IN_NOT_ACTIVE);
798116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
799116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // Send the notification before creating the browser so additional objects
800116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // that need the profile (e.g. the launcher) can be created first.
801116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  content::NotificationService::current()->Notify(
802116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      chrome::NOTIFICATION_LOGIN_USER_PROFILE_PREPARED,
803116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      content::NotificationService::AllSources(),
804116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      content::Details<Profile>(profile));
805116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
8065f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  // Initialize various services only for primary user.
8075f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  const user_manager::User* user =
8085f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      ProfileHelper::Get()->GetUserByProfile(profile);
8095f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  if (user_manager->GetPrimaryUser() == user) {
810116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    InitRlz(profile);
8115f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    InitializeCerts(profile);
8125f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    InitializeCRLSetFetcher(user);
8135f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  }
814116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
81534680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles)  UpdateEasyUnlockKeys(user_context_);
8161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  user_context_.ClearSecrets();
8171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
8185f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  // TODO(nkostylev): This pointer should probably never be NULL, but it looks
819116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // like LoginUtilsImpl::OnProfileCreated() may be getting called before
820116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // UserSessionManager::PrepareProfile() has set |delegate_| when Chrome is
821116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // killed during shutdown in tests -- see http://crosbug.com/18269.  Replace
822116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // this 'if' statement with a CHECK(delegate_) once the underlying issue is
823116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // resolved.
824116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  if (delegate_)
825116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    delegate_->OnProfilePrepared(profile);
826116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
827116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
828116680a4aac90f2aa7413d9095a592090648e557Ben Murdochvoid UserSessionManager::InitSessionRestoreStrategy() {
829116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  CommandLine* command_line = CommandLine::ForCurrentProcess();
830116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  bool in_app_mode = chrome::IsRunningInForcedAppMode();
831116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
832116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // Are we in kiosk app mode?
833116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  if (in_app_mode) {
834116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    if (command_line->HasSwitch(::switches::kAppModeOAuth2Token)) {
835116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      oauth2_refresh_token_ = command_line->GetSwitchValueASCII(
836116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch          ::switches::kAppModeOAuth2Token);
837116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    }
838116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
839116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    if (command_line->HasSwitch(::switches::kAppModeAuthCode)) {
840116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      user_context_.SetAuthCode(command_line->GetSwitchValueASCII(
841116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch          ::switches::kAppModeAuthCode));
842116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    }
843116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
844116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    DCHECK(!has_auth_cookies_);
845116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    if (!user_context_.GetAuthCode().empty()) {
846116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      session_restore_strategy_ = OAuth2LoginManager::RESTORE_FROM_AUTH_CODE;
847116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    } else if (!oauth2_refresh_token_.empty()) {
848116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      session_restore_strategy_ =
849116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch          OAuth2LoginManager::RESTORE_FROM_PASSED_OAUTH2_REFRESH_TOKEN;
850116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    } else {
851116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      session_restore_strategy_ =
852116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch          OAuth2LoginManager::RESTORE_FROM_SAVED_OAUTH2_REFRESH_TOKEN;
853116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    }
854116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    return;
855116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  }
856116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
857116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  if (has_auth_cookies_) {
858116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    session_restore_strategy_ = OAuth2LoginManager::RESTORE_FROM_COOKIE_JAR;
859116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  } else if (!user_context_.GetAuthCode().empty()) {
860116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    session_restore_strategy_ = OAuth2LoginManager::RESTORE_FROM_AUTH_CODE;
861116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  } else {
862116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    session_restore_strategy_ =
863116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch        OAuth2LoginManager::RESTORE_FROM_SAVED_OAUTH2_REFRESH_TOKEN;
864116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  }
865116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
866116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
867116680a4aac90f2aa7413d9095a592090648e557Ben Murdochvoid UserSessionManager::RestoreAuthSessionImpl(Profile* profile,
868116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                                            bool restore_from_auth_cookies) {
869116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  CHECK((authenticator_.get() && authenticator_->authentication_profile()) ||
870116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch        !restore_from_auth_cookies);
871116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
872116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  if (chrome::IsRunningInForcedAppMode() ||
873116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      CommandLine::ForCurrentProcess()->HasSwitch(
874116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch          chromeos::switches::kDisableGaiaServices)) {
875116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    return;
876116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  }
877116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
878116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  exit_after_session_restore_ = false;
879116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
880116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // Remove legacy OAuth1 token if we have one. If it's valid, we should already
881116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // have OAuth2 refresh token in OAuth2TokenService that could be used to
882116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // retrieve all other tokens and user_context.
883116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  OAuth2LoginManager* login_manager =
884116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      OAuth2LoginManagerFactory::GetInstance()->GetForProfile(profile);
885116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  login_manager->AddObserver(this);
886116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  login_manager->RestoreSession(
887116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      authenticator_.get() && authenticator_->authentication_profile()
888116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch          ? authenticator_->authentication_profile()->GetRequestContext()
889116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch          : NULL,
890116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      session_restore_strategy_,
891116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      oauth2_refresh_token_,
892116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      user_context_.GetAuthCode());
893116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
894116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
895116680a4aac90f2aa7413d9095a592090648e557Ben Murdochvoid UserSessionManager::InitRlzImpl(Profile* profile, bool disabled) {
896116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#if defined(ENABLE_RLZ)
897116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  PrefService* local_state = g_browser_process->local_state();
898116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  if (disabled) {
899116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    // Empty brand code means an organic install (no RLZ pings are sent).
900116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    google_brand::chromeos::ClearBrandForCurrentSession();
901116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  }
902116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  if (disabled != local_state->GetBoolean(prefs::kRLZDisabled)) {
903116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    // When switching to RLZ enabled/disabled state, clear all recorded events.
904116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    RLZTracker::ClearRlzState();
905116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    local_state->SetBoolean(prefs::kRLZDisabled, disabled);
906116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  }
907116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // Init the RLZ library.
908116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  int ping_delay = profile->GetPrefs()->GetInteger(
909116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      first_run::GetPingDelayPrefName().c_str());
910116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // Negative ping delay means to send ping immediately after a first search is
911116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // recorded.
912116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  RLZTracker::InitRlzFromProfileDelayed(
9136e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      profile,
9146e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      user_manager::UserManager::Get()->IsCurrentUserNew(),
9156e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      ping_delay < 0,
9166e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      base::TimeDelta::FromMilliseconds(abs(ping_delay)));
917116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  if (delegate_)
918116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    delegate_->OnRlzInitialized();
919116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#endif
920116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
921116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
9225f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)void UserSessionManager::InitializeCerts(Profile* profile) {
923116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // Now that the user profile has been initialized
924116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // |GetNSSCertDatabaseForProfile| is safe to be used.
9255f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  if (CertLoader::IsInitialized() && base::SysInfo::IsRunningOnChromeOS()) {
926116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    GetNSSCertDatabaseForProfile(profile,
927116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                                 base::Bind(&OnGetNSSCertDatabaseForUser));
928116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  }
929116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
930116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
9315f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)void UserSessionManager::InitializeCRLSetFetcher(
9325f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    const user_manager::User* user) {
9335f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  const std::string username_hash = user->username_hash();
9345f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  if (!username_hash.empty()) {
9355f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    base::FilePath path;
9365f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    path = ProfileHelper::GetProfilePathByUserIdHash(username_hash);
9375f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    component_updater::ComponentUpdateService* cus =
9385f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        g_browser_process->component_updater();
9395f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    CRLSetFetcher* crl_set = g_browser_process->crl_set_fetcher();
9405f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    if (crl_set && cus)
9415f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      crl_set->StartInitialLoad(cus, path);
9425f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  }
9435f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)}
9445f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
945116680a4aac90f2aa7413d9095a592090648e557Ben Murdochvoid UserSessionManager::OnRestoreActiveSessions(
946116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    const SessionManagerClient::ActiveSessionsMap& sessions,
947116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    bool success) {
948116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  if (!success) {
949116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    LOG(ERROR) << "Could not get list of active user sessions after crash.";
950116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    // If we could not get list of active user sessions it is safer to just
951116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    // sign out so that we don't get in the inconsistent state.
952116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    DBusThreadManager::Get()->GetSessionManagerClient()->StopSession();
953116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    return;
954116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  }
955116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
956116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // One profile has been already loaded on browser start.
9576e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  user_manager::UserManager* user_manager = user_manager::UserManager::Get();
958116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  DCHECK(user_manager->GetLoggedInUsers().size() == 1);
959116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  DCHECK(user_manager->GetActiveUser());
960116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  std::string active_user_id = user_manager->GetActiveUser()->email();
961116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
962116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  SessionManagerClient::ActiveSessionsMap::const_iterator it;
963116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  for (it = sessions.begin(); it != sessions.end(); ++it) {
964116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    if (active_user_id == it->first)
965116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      continue;
966116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    pending_user_sessions_[it->first] = it->second;
967116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  }
968116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  RestorePendingUserSessions();
969116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
970116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
971116680a4aac90f2aa7413d9095a592090648e557Ben Murdochvoid UserSessionManager::RestorePendingUserSessions() {
972116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  if (pending_user_sessions_.empty()) {
9731320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    user_manager::UserManager::Get()->SwitchToLastActiveUser();
974116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    NotifyPendingUserSessionsRestoreFinished();
975116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    return;
976116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  }
977116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
978116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // Get next user to restore sessions and delete it from list.
979116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  SessionManagerClient::ActiveSessionsMap::const_iterator it =
980116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      pending_user_sessions_.begin();
981116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  std::string user_id = it->first;
982116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  std::string user_id_hash = it->second;
983116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  DCHECK(!user_id.empty());
984116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  DCHECK(!user_id_hash.empty());
985116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  pending_user_sessions_.erase(user_id);
986116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
987116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // Check that this user is not logged in yet.
9885f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  user_manager::UserList logged_in_users =
9896e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      user_manager::UserManager::Get()->GetLoggedInUsers();
990116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  bool user_already_logged_in = false;
9915f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  for (user_manager::UserList::const_iterator it = logged_in_users.begin();
992116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch       it != logged_in_users.end();
993116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch       ++it) {
9945f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    const user_manager::User* user = (*it);
995116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    if (user->email() == user_id) {
996116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      user_already_logged_in = true;
997116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      break;
998116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    }
999116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  }
1000116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  DCHECK(!user_already_logged_in);
1001116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
1002116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  if (!user_already_logged_in) {
1003116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    UserContext user_context(user_id);
1004116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    user_context.SetUserIDHash(user_id_hash);
1005116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    user_context.SetIsUsingOAuth(false);
1006116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
1007116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    // Will call OnProfilePrepared() once profile has been loaded.
1008116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    StartSession(user_context,
1009116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                 NULL,   // authenticator
1010116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                 false,  // has_auth_cookies
1011116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                 true,   // has_active_session
1012116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                 this);
1013116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  } else {
1014116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    RestorePendingUserSessions();
1015116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  }
1016116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
1017116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
1018116680a4aac90f2aa7413d9095a592090648e557Ben Murdochvoid UserSessionManager::NotifyPendingUserSessionsRestoreFinished() {
1019116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI));
1020116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  user_sessions_restored_ = true;
10211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  user_sessions_restore_in_progress_ = false;
102203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  FOR_EACH_OBSERVER(chromeos::UserSessionStateObserver,
1023116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                    session_state_observer_list_,
1024116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                    PendingUserSessionsRestoreFinished());
1025116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
1026116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
102734680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles)void UserSessionManager::UpdateEasyUnlockKeys(const UserContext& user_context) {
102834680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles)  // Skip key update because FakeCryptohomeClient always return success
102934680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles)  // and RemoveKey op expects a failure to stop. As a result, some tests would
103034680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles)  // timeout.
103134680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles)  // TODO(xiyuan): Revisit this when adding tests.
103234680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles)  if (!base::SysInfo::IsRunningOnChromeOS())
103334680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles)    return;
103434680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles)
10351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // Only update Easy unlock keys for regular user.
103634680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles)  // TODO(xiyuan): Fix inconsistency user type of |user_context| introduced in
103734680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles)  // authenticator.
103834680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles)  const user_manager::User* user =
103934680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles)      user_manager::UserManager::Get()->FindUser(user_context.GetUserID());
104034680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles)  if (!user || user->GetType() != user_manager::USER_TYPE_REGULAR)
10411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    return;
10421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
104334680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles)  // Bail if |user_context| does not have secret.
104434680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles)  if (user_context.GetKey()->GetSecret().empty())
10451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    return;
10461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
10471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  const base::ListValue* device_list = NULL;
104834680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles)  EasyUnlockService* easy_unlock_service = EasyUnlockService::GetForUser(*user);
104934680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles)  if (easy_unlock_service) {
105034680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles)    device_list = easy_unlock_service->GetRemoteDevices();
105134680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles)    easy_unlock_service->SetHardlockState(
105234680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles)        EasyUnlockScreenlockStateHandler::NO_HARDLOCK);
105334680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles)  }
10541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
10551675a649fd7a8b3cb80ffddae2dc181f122353c5Ben Murdoch  EasyUnlockKeyManager* key_manager = GetEasyUnlockKeyManager();
10561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  running_easy_unlock_key_ops_ = true;
10571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (device_list) {
10581675a649fd7a8b3cb80ffddae2dc181f122353c5Ben Murdoch    key_manager->RefreshKeys(
105934680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles)        user_context,
10601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        *device_list,
10611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        base::Bind(&UserSessionManager::OnEasyUnlockKeyOpsFinished,
106234680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles)                   AsWeakPtr(),
106334680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles)                   user_context.GetUserID()));
10641320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  } else {
10651675a649fd7a8b3cb80ffddae2dc181f122353c5Ben Murdoch    key_manager->RemoveKeys(
106634680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles)        user_context,
10671320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        0,
10681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        base::Bind(&UserSessionManager::OnEasyUnlockKeyOpsFinished,
106934680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles)                   AsWeakPtr(),
107034680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles)                   user_context.GetUserID()));
10711320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
10721320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
10731320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
107434680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles)void UserSessionManager::OnEasyUnlockKeyOpsFinished(
107534680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles)    const std::string& user_id,
107634680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles)    bool success) {
10771320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  running_easy_unlock_key_ops_ = false;
10781320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (!easy_unlock_key_ops_finished_callback_.is_null())
10791320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    easy_unlock_key_ops_finished_callback_.Run();
108034680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles)
108134680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles)  const user_manager::User* user =
108234680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles)      user_manager::UserManager::Get()->FindUser(user_id);
108334680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles)  EasyUnlockService* easy_unlock_service =
108434680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles)        EasyUnlockService::GetForUser(*user);
108534680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles)  easy_unlock_service->CheckCryptohomeKeysAndMaybeHardlock();
10861320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
10871320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
108803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)void UserSessionManager::ActiveUserChanged(
108903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    const user_manager::User* active_user) {
10901320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  Profile* profile = ProfileHelper::Get()->GetProfileByUser(active_user);
10911320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // If profile has not yet been initialized, delay initialization of IME.
10921320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (!profile)
10931320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    return;
10941320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
109503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  input_method::InputMethodManager* manager =
109603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)      input_method::InputMethodManager::Get();
109703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  manager->SetState(
109803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)      GetDefaultIMEState(ProfileHelper::Get()->GetProfileByUser(active_user)));
109903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)}
110003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
110103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)scoped_refptr<input_method::InputMethodManager::State>
110203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)UserSessionManager::GetDefaultIMEState(Profile* profile) {
110303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  scoped_refptr<input_method::InputMethodManager::State> state =
110403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)      default_ime_states_[profile];
11051320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (!state.get()) {
110603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    // Profile can be NULL in tests.
110703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    state = input_method::InputMethodManager::Get()->CreateNewState(profile);
110803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    default_ime_states_[profile] = state;
110903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  }
111003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  return state;
111103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)}
111203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
11131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciEasyUnlockKeyManager* UserSessionManager::GetEasyUnlockKeyManager() {
11141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (!easy_unlock_key_manager_)
11151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    easy_unlock_key_manager_.reset(new EasyUnlockKeyManager);
11161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
11171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  return easy_unlock_key_manager_.get();
11181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
11191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1120116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}  // namespace chromeos
1121