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