Index: chrome/browser/chromeos/login/login_utils.cc |
diff --git a/chrome/browser/chromeos/login/login_utils.cc b/chrome/browser/chromeos/login/login_utils.cc |
index cffb0b41796b20261d8c3a46a7cdc67c96d285dd..b675b8d2c61117ed6c3644d3ac84c24228636fa9 100644 |
--- a/chrome/browser/chromeos/login/login_utils.cc |
+++ b/chrome/browser/chromeos/login/login_utils.cc |
@@ -27,6 +27,7 @@ |
#include "base/time.h" |
#include "base/utf_string_conversions.h" |
#include "chrome/browser/about_flags.h" |
+#include "chrome/browser/app_mode/app_mode_utils.h" |
#include "chrome/browser/browser_process.h" |
#include "chrome/browser/browser_shutdown.h" |
#include "chrome/browser/chromeos/boot_times_loader.h" |
@@ -69,6 +70,7 @@ |
#include "chrome/browser/ui/startup/startup_browser_creator.h" |
#include "chrome/common/chrome_notification_types.h" |
#include "chrome/common/chrome_paths.h" |
+#include "chrome/common/chrome_switches.h" |
#include "chrome/common/logging_chrome.h" |
#include "chrome/common/pref_names.h" |
#include "chromeos/dbus/dbus_thread_manager.h" |
@@ -139,9 +141,8 @@ class LoginUtilsImpl |
virtual void DoBrowserLaunch(Profile* profile, |
LoginDisplayHost* login_host) OVERRIDE; |
virtual void PrepareProfile( |
- const std::string& username, |
+ const UserCredentials& credentials, |
const std::string& display_email, |
- const std::string& password, |
bool using_oauth, |
bool has_cookies, |
LoginUtils::Delegate* delegate) OVERRIDE; |
@@ -197,6 +198,10 @@ class LoginUtilsImpl |
// Finalized profile preparation. |
void FinalizePrepareProfile(Profile* user_profile); |
+ // Initializes member variables needed for session restore process via |
+ // OAuthLoginManager. |
+ void InitSessionRestoreStrategy(); |
+ |
// Restores GAIA auth cookies for the created user profile from OAuth2 token. |
void RestoreAuthSession(Profile* user_profile, |
bool restore_from_auth_cookies); |
@@ -210,7 +215,7 @@ class LoginUtilsImpl |
// Starts signing related services. Initiates TokenService token retrieval. |
void StartSignedInServices(Profile* profile); |
- std::string password_; |
+ UserCredentials credentials_; |
bool using_oauth_; |
// True if the authentication profile's cookie jar should contain |
// authentication cookies from the authentication extension log in flow. |
@@ -226,6 +231,11 @@ class LoginUtilsImpl |
// online state change. |
bool should_restore_auth_session_; |
+ // Sesion restore strategy. |
+ OAuthLoginManager::SessionRestoreStrategy session_restore_strategy_; |
+ // OAuth2 refresh token for session restore. |
+ std::string oauth2_refresh_token_; |
+ |
content::NotificationRegistrar registrar_; |
// This is set via a notification after the profile has initialized the |
@@ -305,24 +315,23 @@ void LoginUtilsImpl::DoBrowserLaunch(Profile* profile, |
} |
void LoginUtilsImpl::PrepareProfile( |
- const std::string& username, |
+ const UserCredentials& credentials, |
const std::string& display_email, |
- const std::string& password, |
bool using_oauth, |
bool has_cookies, |
LoginUtils::Delegate* delegate) { |
BootTimesLoader* btl = BootTimesLoader::Get(); |
- VLOG(1) << "Completing login for " << username; |
+ VLOG(1) << "Completing login for " << credentials.username; |
btl->AddLoginTimeMarker("StartSession-Start", false); |
DBusThreadManager::Get()->GetSessionManagerClient()->StartSession( |
- username); |
+ credentials.username); |
btl->AddLoginTimeMarker("StartSession-End", false); |
btl->AddLoginTimeMarker("UserLoggedIn-Start", false); |
UserManager* user_manager = UserManager::Get(); |
- user_manager->UserLoggedIn(username, false); |
+ user_manager->UserLoggedIn(credentials.username, false); |
btl->AddLoginTimeMarker("UserLoggedIn-End", false); |
// Switch log file as soon as possible. |
@@ -331,13 +340,14 @@ void LoginUtilsImpl::PrepareProfile( |
// Update user's displayed email. |
if (!display_email.empty()) |
- user_manager->SaveUserDisplayEmail(username, display_email); |
+ user_manager->SaveUserDisplayEmail(credentials.username, display_email); |
- password_ = password; |
+ credentials_ = credentials; |
using_oauth_ = using_oauth; |
has_web_auth_cookies_ = has_cookies; |
delegate_ = delegate; |
+ InitSessionRestoreStrategy(); |
policy::BrowserPolicyConnector* connector = |
g_browser_process->browser_policy_connector(); |
@@ -351,12 +361,12 @@ void LoginUtilsImpl::PrepareProfile( |
bool wait_for_policy_fetch = |
using_oauth_ && |
authenticator_.get() && |
- (connector->GetUserAffiliation(username) == |
+ (connector->GetUserAffiliation(credentials_.username) == |
policy::USER_AFFILIATION_MANAGED); |
// Initialize user policy before the profile is created so the profile |
// initialization code sees the cached policy settings. |
- connector->InitializeUserPolicy(username, |
+ connector->InitializeUserPolicy(credentials_.username, |
user_manager->IsLoggedInAsPublicAccount(), |
wait_for_policy_fetch); |
@@ -423,6 +433,46 @@ void LoginUtilsImpl::InitProfilePreferences(Profile* user_profile) { |
RespectLocalePreference(user_profile); |
} |
+void LoginUtilsImpl::InitSessionRestoreStrategy() { |
+ CommandLine* command_line = CommandLine::ForCurrentProcess(); |
+ bool in_app_mode = chrome::IsRunningInForcedAppMode(); |
+ |
+ // Are we in kiosk app mode? |
+ if (in_app_mode) { |
+ if (command_line->HasSwitch(::switches::kAppModeOAuth2Token)) { |
+ oauth2_refresh_token_ = command_line->GetSwitchValueASCII( |
+ ::switches::kAppModeOAuth2Token); |
+ } |
+ |
+ if (command_line->HasSwitch(::switches::kAppModeAuthCode)) { |
+ credentials_.auth_code = command_line->GetSwitchValueASCII( |
+ ::switches::kAppModeAuthCode); |
+ } |
+ |
+ DCHECK(!has_web_auth_cookies_); |
+ if (!credentials_.auth_code.empty()) { |
+ session_restore_strategy_ = OAuthLoginManager::RESTORE_FROM_AUTH_CODE; |
+ } else if (!oauth2_refresh_token_.empty()) { |
+ session_restore_strategy_ = |
+ OAuthLoginManager::RESTORE_FROM_PASSED_OAUTH2_REFRESH_TOKEN; |
+ } else { |
+ session_restore_strategy_ = |
+ OAuthLoginManager::RESTORE_FROM_SAVED_OAUTH2_REFRESH_TOKEN; |
+ } |
+ return; |
+ } |
+ |
+ if (has_web_auth_cookies_) { |
+ session_restore_strategy_ = OAuthLoginManager::RESTORE_FROM_COOKIE_JAR; |
+ } else if (!credentials_.auth_code.empty()) { |
+ session_restore_strategy_ = OAuthLoginManager::RESTORE_FROM_AUTH_CODE; |
+ } else { |
+ session_restore_strategy_ = |
+ OAuthLoginManager::RESTORE_FROM_SAVED_OAUTH2_REFRESH_TOKEN; |
+ } |
+} |
+ |
+ |
void LoginUtilsImpl::OnProfileCreated( |
Profile* user_profile, |
Profile::CreateStatus status) { |
@@ -499,7 +549,9 @@ void LoginUtilsImpl::RestoreAuthSession(Profile* user_profile, |
authenticator_ && authenticator_->authentication_profile() ? |
authenticator_->authentication_profile()->GetRequestContext() : |
NULL, |
- restore_from_auth_cookies); |
+ session_restore_strategy_, |
+ oauth2_refresh_token_, |
+ credentials_.auth_code); |
} |
void LoginUtilsImpl::FinalizePrepareProfile(Profile* user_profile) { |
@@ -600,17 +652,18 @@ void LoginUtilsImpl::StartSignedInServices(Profile* user_profile) { |
// We may not always have a passphrase (for example, on a restart after a |
// browser crash). Only notify the sync service if we have a passphrase, |
// so it can do any required re-encryption. |
- if (!password_.empty() && sync_service) { |
+ if (!credentials_.password.empty() && sync_service) { |
GoogleServiceSigninSuccessDetails details( |
signin->GetAuthenticatedUsername(), |
- password_); |
+ credentials_.password); |
content::NotificationService::current()->Notify( |
chrome::NOTIFICATION_GOOGLE_SIGNIN_SUCCESSFUL, |
content::Source<Profile>(user_profile), |
content::Details<const GoogleServiceSigninSuccessDetails>(&details)); |
} |
} |
- password_.clear(); |
+ credentials_.password.clear(); |
+ credentials_.auth_code.clear(); |
} |
void LoginUtilsImpl::RespectLocalePreference(Profile* profile) { |