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 9bfd8694ee772013331c8de8e7f3f58d678a4d0a..29837956429bcfc6776db8e276f196727b17d8ea 100644 |
--- a/chrome/browser/chromeos/login/login_utils.cc |
+++ b/chrome/browser/chromeos/login/login_utils.cc |
@@ -188,7 +188,7 @@ class LoginUtilsImpl |
LoginUtilsImpl() |
: pending_requests_(false), |
using_oauth_(false), |
- has_cookies_(false), |
+ has_web_auth_cookies_(false), |
delegate_(NULL), |
job_restart_request_(NULL), |
should_restore_auth_session_(false), |
@@ -298,17 +298,32 @@ class LoginUtilsImpl |
// Check user's profile for kApplicationLocale setting. |
void RespectLocalePreference(Profile* pref); |
+ // Initializes basic preferences for newly created profile. |
+ void InitProfilePreferences(Profile* user_profile); |
+ |
// Callback for asynchronous profile creation. |
void OnProfileCreated(Profile* profile, |
Profile::CreateStatus status); |
+ // Finalized profile preparation. |
+ void FinalizePrepareProfile(Profile* user_profile); |
+ |
+ // Restores GAIA auth cookies for the created profile. |
+ void RestoreAuthCookies(Profile* user_profile); |
+ |
+ // Kicks off OAuth verification and profile preparation after the initial |
+ // cookie jar transfer. |
+ void OnCookieJarTransferCompleted(Profile* user_profile); |
+ |
// Initializes RLZ. If |disabled| is true, financial pings are turned off. |
void InitRlz(Profile* user_profile, bool disabled); |
std::string password_; |
bool pending_requests_; |
bool using_oauth_; |
- bool has_cookies_; |
+ // True if the authenrication profile's cookie jar should contain |
+ // authentication cookies from the authentication extension log in flow. |
+ bool has_web_auth_cookies_; |
// Has to be scoped_refptr, see comment for CreateAuthenticator(...). |
scoped_refptr<Authenticator> authenticator_; |
scoped_ptr<PolicyOAuthFetcher> policy_oauth_fetcher_; |
@@ -428,7 +443,7 @@ void LoginUtilsImpl::PrepareProfile( |
pending_requests_ = pending_requests; |
using_oauth_ = using_oauth; |
- has_cookies_ = has_cookies; |
+ has_web_auth_cookies_ = has_cookies; |
delegate_ = delegate; |
policy::BrowserPolicyConnector* connector = |
@@ -480,6 +495,31 @@ void LoginUtilsImpl::DelegateDeleted(LoginUtils::Delegate* delegate) { |
delegate_ = NULL; |
} |
+void LoginUtilsImpl::InitProfilePreferences(Profile* user_profile) { |
+ if (UserManager::Get()->IsCurrentUserNew()) |
+ SetFirstLoginPrefs(user_profile->GetPrefs()); |
+ // Make sure that the google service username is properly set (we do this |
+ // on every sign in, not just the first login, to deal with existing |
+ // profiles that might not have it set yet). |
+ StringPrefMember google_services_username; |
+ google_services_username.Init(prefs::kGoogleServicesUsername, |
+ user_profile->GetPrefs()); |
+ google_services_username.SetValue( |
+ UserManager::Get()->GetLoggedInUser()->display_email()); |
+ // Make sure we flip every profile to not share proxies if the user hasn't |
+ // specified so explicitly. |
+ const PrefService::Preference* use_shared_proxies_pref = |
+ user_profile->GetPrefs()->FindPreference(prefs::kUseSharedProxies); |
+ if (use_shared_proxies_pref->IsDefaultValue()) |
+ user_profile->GetPrefs()->SetBoolean(prefs::kUseSharedProxies, false); |
+ policy::NetworkConfigurationUpdater* network_configuration_updater = |
+ g_browser_process->browser_policy_connector()-> |
+ GetNetworkConfigurationUpdater(); |
+ if (network_configuration_updater) |
+ network_configuration_updater->OnUserPolicyInitialized(); |
+ RespectLocalePreference(user_profile); |
+} |
+ |
void LoginUtilsImpl::OnProfileCreated( |
Profile* user_profile, |
Profile::CreateStatus status) { |
@@ -488,28 +528,7 @@ void LoginUtilsImpl::OnProfileCreated( |
case Profile::CREATE_STATUS_INITIALIZED: |
break; |
case Profile::CREATE_STATUS_CREATED: { |
- if (UserManager::Get()->IsCurrentUserNew()) |
- SetFirstLoginPrefs(user_profile->GetPrefs()); |
- // Make sure that the google service username is properly set (we do this |
- // on every sign in, not just the first login, to deal with existing |
- // profiles that might not have it set yet). |
- StringPrefMember google_services_username; |
- google_services_username.Init(prefs::kGoogleServicesUsername, |
- user_profile->GetPrefs()); |
- google_services_username.SetValue( |
- UserManager::Get()->GetLoggedInUser()->display_email()); |
- // Make sure we flip every profile to not share proxies if the user hasn't |
- // specified so explicitly. |
- const PrefService::Preference* use_shared_proxies_pref = |
- user_profile->GetPrefs()->FindPreference(prefs::kUseSharedProxies); |
- if (use_shared_proxies_pref->IsDefaultValue()) |
- user_profile->GetPrefs()->SetBoolean(prefs::kUseSharedProxies, false); |
- policy::NetworkConfigurationUpdater* network_configuration_updater = |
- g_browser_process->browser_policy_connector()-> |
- GetNetworkConfigurationUpdater(); |
- if (network_configuration_updater) |
- network_configuration_updater->OnUserPolicyInitialized(); |
- RespectLocalePreference(user_profile); |
+ InitProfilePreferences(user_profile); |
return; |
} |
case Profile::CREATE_STATUS_FAIL: |
@@ -532,40 +551,57 @@ void LoginUtilsImpl::OnProfileCreated( |
policy_oauth_fetcher_->oauth1_secret()); |
} |
- // Transfer proxy authentication cache and optionally cookies and server |
+ // Transfer proxy authentication cache, cookies (optionally) and server |
// bound certs from the profile that was used for authentication. This |
// profile contains cookies that auth extension should have already put in |
// place that will ensure that the newly created session is authenticated |
// for the websites that work with the used authentication schema. |
ProfileAuthData::Transfer(authenticator_->authentication_profile(), |
user_profile, |
- has_cookies_); // transfer_cookies |
- |
- std::string oauth1_token; |
- std::string oauth1_secret; |
- if (ReadOAuth1AccessToken(user_profile, &oauth1_token, &oauth1_secret) || |
- !has_cookies_) { |
- // Verify OAuth access token when we find it in the profile and always if |
- // if we don't have cookies. |
- // TODO(xiyuan): Change back to use authenticator to verify token when |
- // we support Gaia in lock screen. |
- VerifyOAuth1AccessToken(user_profile, oauth1_token, oauth1_secret); |
- } else { |
- // If we don't have it, fetch OAuth1 access token. |
- // Once we get that, we will kick off individual requests for OAuth2 |
- // tokens for all our services. |
- // Use off-the-record profile that was used for this step. It should |
- // already contain all needed cookies that will let us skip GAIA's user |
- // authentication UI. |
- // |
- // TODO(rickcam) We should use an isolated App here. |
- oauth1_token_fetcher_.reset( |
- new OAuth1TokenFetcher(this, |
- authenticator_->authentication_profile())); |
- oauth1_token_fetcher_->Start(); |
- } |
+ has_web_auth_cookies_, // transfer_cookies |
xiyuan
2012/12/20 01:57:45
nit: two-space after comma
zel
2012/12/20 16:56:19
Done.
|
+ base::Bind( |
+ &LoginUtilsImpl::OnCookieJarTransferCompleted, |
+ AsWeakPtr(), |
+ user_profile)); |
+ return; |
+ } |
+ |
+ FinalizePrepareProfile(user_profile); |
+} |
+ |
+void LoginUtilsImpl::RestoreAuthCookies(Profile* user_profile) { |
+ std::string oauth1_token; |
+ std::string oauth1_secret; |
+ if (ReadOAuth1AccessToken(user_profile, &oauth1_token, &oauth1_secret) || |
+ !has_web_auth_cookies_) { |
+ // Verify OAuth access token when we find it in the profile and always if |
+ // if we don't have cookies. |
+ // TODO(xiyuan): Change back to use authenticator to verify token when |
+ // we support Gaia in lock screen. |
+ VerifyOAuth1AccessToken(user_profile, oauth1_token, oauth1_secret); |
+ } else { |
+ // If we don't have it, fetch OAuth1 access token. |
+ // Once we get that, we will kick off individual requests for OAuth2 |
+ // tokens for all our services. |
+ // Use off-the-record profile that was used for this step. It should |
+ // already contain all needed cookies that will let us skip GAIA's user |
+ // authentication UI. |
+ // |
+ // TODO(rickcam) We should use an isolated App here. |
+ oauth1_token_fetcher_.reset( |
+ new OAuth1TokenFetcher(this, |
+ authenticator_->authentication_profile())); |
+ oauth1_token_fetcher_->Start(); |
} |
+} |
+ |
+void LoginUtilsImpl::OnCookieJarTransferCompleted(Profile* user_profile) { |
+ RestoreAuthCookies(user_profile); |
+ FinalizePrepareProfile(user_profile); |
+} |
+void LoginUtilsImpl::FinalizePrepareProfile(Profile* user_profile) { |
+ BootTimesLoader* btl = BootTimesLoader::Get(); |
// Own TPM device if, for any reason, it has not been done in EULA |
// wizard screen. |
CryptohomeLibrary* cryptohome = CrosLibrary::Get()->GetCryptohomeLibrary(); |
@@ -600,6 +636,7 @@ void LoginUtilsImpl::OnProfileCreated( |
delegate_->OnProfilePrepared(user_profile); |
} |
+ |
xiyuan
2012/12/20 01:57:45
nit: nuke one of the empty lines
zel
2012/12/20 16:56:19
Done.
|
void LoginUtilsImpl::InitRlzDelayed(Profile* user_profile) { |
#if defined(ENABLE_RLZ) |
if (!g_browser_process->local_state()->HasPrefPath(prefs::kRLZBrand)) { |
@@ -1135,7 +1172,9 @@ void LoginUtilsImpl::OnOAuth1AccessTokenAvailable(const std::string& token, |
Profile* user_profile = ProfileManager::GetDefaultProfile(); |
StoreOAuth1AccessToken(user_profile, token, secret); |
- // Verify OAuth1 token by doing OAuthLogin and fetching credentials. |
+ // Verify OAuth1 token by doing OAuthLogin and fetching credentials. If we |
+ // have just transfered auth cookies out of authenticated cookie jar, there |
+ // is no need to try to mint them from OAuth token again. |
VerifyOAuth1AccessToken(user_profile, token, secret); |
} |