Index: chrome/browser/sync/signin_manager.cc |
diff --git a/chrome/browser/sync/signin_manager.cc b/chrome/browser/sync/signin_manager.cc |
index 6156351c003a86c3fce9c449a658f6e010cd014c..1c04c825603b6a2006df264b0124f7b9a277f2f5 100644 |
--- a/chrome/browser/sync/signin_manager.cc |
+++ b/chrome/browser/sync/signin_manager.cc |
@@ -32,10 +32,14 @@ void SigninManager::RegisterUserPrefs(PrefService* user_prefs) { |
void SigninManager::Initialize(Profile* profile) { |
profile_ = profile; |
- username_ = profile_->GetPrefs()->GetString(prefs::kGoogleServicesUsername); |
+ if (SyncSetupWizard::IsUsingOAuth()) |
+ oauth_username_ = |
+ profile_->GetPrefs()->GetString(prefs::kGoogleServicesUsername); |
+ else |
+ username_ = profile_->GetPrefs()->GetString(prefs::kGoogleServicesUsername); |
profile_->GetTokenService()->Initialize( |
GaiaConstants::kChromeSource, profile_); |
- if (!username_.empty()) { |
+ if (!username_.empty() || !oauth_username_.empty()) { |
profile_->GetTokenService()->LoadTokensFromDB(); |
} |
} |
@@ -59,11 +63,16 @@ void SigninManager::CleanupNotificationRegistration() { |
// If a username already exists, the user is logged in. |
const std::string& SigninManager::GetUsername() { |
+ if (SyncSetupWizard::IsUsingOAuth()) |
+ return oauth_username_; |
return username_; |
} |
void SigninManager::SetUsername(const std::string& username) { |
- username_ = username; |
+ if (SyncSetupWizard::IsUsingOAuth()) |
+ oauth_username_ = username; |
+ else |
+ username_ = username; |
} |
// static |
@@ -77,14 +86,26 @@ void SigninManager::PrepareForSignin() { |
#endif |
} |
+// static |
+void SigninManager::PrepareForOAuthSignin() { |
+ DCHECK(oauth_username_.empty()); |
+#if !defined(OS_CHROMEOS) |
+ // The Sign out should clear the token service credentials. |
+ // Note: In CHROMEOS we might have valid credentials but still need to |
+ // set up 2-factor authentication. |
+ DCHECK(!profile_->GetTokenService()->AreOAuthCredentialsValid()); |
+#endif |
+} |
+ |
// Users must always sign out before they sign in again. |
void SigninManager::StartOAuthSignIn() { |
- PrepareForSignin(); |
+ PrepareForOAuthSignin(); |
oauth_login_.reset(new GaiaOAuthFetcher(this, |
profile_->GetRequestContext(), |
profile_, |
GaiaConstants::kSyncServiceOAuth)); |
oauth_login_->StartGetOAuthToken(); |
+ // TODO(rogerta?): Bug 92325: Expand Autologin to include OAuth signin |
} |
// Users must always sign out before they sign in again. |
@@ -143,9 +164,11 @@ void SigninManager::SignOut() { |
client_login_.reset(); |
last_result_ = ClientLoginResult(); |
username_.clear(); |
+ oauth_username_.clear(); |
password_.clear(); |
had_two_factor_error_ = false; |
- profile_->GetPrefs()->SetString(prefs::kGoogleServicesUsername, username_); |
+ profile_->GetPrefs()->ClearPref(prefs::kGoogleServicesUsername); |
+ profile_->GetPrefs()->ClearPref(prefs::kSyncUsingOAuth, false); |
profile_->GetPrefs()->ScheduleSavePersistentPrefs(); |
profile_->GetTokenService()->ResetCredentialsInMemory(); |
profile_->GetTokenService()->EraseTokensFromDB(); |
@@ -157,12 +180,14 @@ void SigninManager::OnClientLoginSuccess(const ClientLoginResult& result) { |
client_login_->StartGetUserInfo(result.lsid, kGetInfoEmailKey); |
} |
+// NOTE: GetUserInfo is a ClientLogin request similar to OAuth's userinfo |
void SigninManager::OnGetUserInfoSuccess(const std::string& key, |
const std::string& value) { |
DCHECK(key == kGetInfoEmailKey); |
username_ = value; |
profile_->GetPrefs()->SetString(prefs::kGoogleServicesUsername, username_); |
+ profile_->GetPrefs()->SetBoolean(prefs::kSyncUsingOAuth, false); |
profile_->GetPrefs()->ScheduleSavePersistentPrefs(); |
GoogleServiceSigninSuccessDetails details(username_, password_); |
@@ -223,17 +248,18 @@ void SigninManager::OnGetOAuthTokenSuccess(const std::string& oauth_token) { |
} |
void SigninManager::OnGetOAuthTokenFailure() { |
- VLOG(1) << "SigninManager::OnGetOAuthTokenFailure"; |
+ LOG(WARNING) << "SigninManager::OnGetOAuthTokenFailure"; |
} |
void SigninManager::OnOAuthGetAccessTokenSuccess(const std::string& token, |
const std::string& secret) { |
VLOG(1) << "SigninManager::OnOAuthGetAccessTokenSuccess"; |
+ profile_->GetTokenService()->UpdateOAuthCredentials(token, secret); |
} |
void SigninManager::OnOAuthGetAccessTokenFailure( |
const GoogleServiceAuthError& error) { |
- VLOG(1) << "SigninManager::OnOAuthGetAccessTokenFailure"; |
+ LOG(WARNING) << "SigninManager::OnOAuthGetAccessTokenFailure"; |
} |
void SigninManager::OnOAuthWrapBridgeSuccess(const std::string& service_name, |
@@ -245,15 +271,31 @@ void SigninManager::OnOAuthWrapBridgeSuccess(const std::string& service_name, |
void SigninManager::OnOAuthWrapBridgeFailure( |
const std::string& service_scope, |
const GoogleServiceAuthError& error) { |
- VLOG(1) << "SigninManager::OnOAuthWrapBridgeFailure"; |
+ LOG(WARNING) << "SigninManager::OnOAuthWrapBridgeFailure"; |
} |
+// NOTE: userinfo is an OAuth request similar to ClientLogin's GetUserInfo |
void SigninManager::OnUserInfoSuccess(const std::string& email) { |
- VLOG(1) << "SigninManager::OnUserInfoSuccess(\"" << email << "\")"; |
+ VLOG(1) << "Sync signin for " << email << " is complete."; |
+ oauth_username_ = email; |
+ profile_->GetPrefs()->SetString( |
+ prefs::kGoogleServicesUsername, oauth_username_); |
+ profile_->GetPrefs()->SetBoolean(prefs::kSyncUsingOAuth, true); |
+ profile_->GetPrefs()->ScheduleSavePersistentPrefs(); |
+ |
+ DCHECK(password_.empty()); |
+ GoogleServiceSigninSuccessDetails details(oauth_username_, ""); |
+ NotificationService::current()->Notify( |
+ chrome::NOTIFICATION_GOOGLE_SIGNIN_SUCCESSFUL, |
+ Source<Profile>(profile_), |
+ Details<const GoogleServiceSigninSuccessDetails>(&details)); |
+ |
+ DCHECK(profile_->GetTokenService()->AreOAuthCredentialsValid()); |
+ profile_->GetTokenService()->StartFetchingOAuthTokens(); |
} |
void SigninManager::OnUserInfoFailure(const GoogleServiceAuthError& error) { |
- VLOG(1) << "SigninManager::OnUserInfoFailure"; |
+ LOG(WARNING) << "SigninManager::OnUserInfoFailure"; |
} |
void SigninManager::Observe(int type, |