| Index: chrome/browser/sync/signin_manager.cc
|
| diff --git a/chrome/browser/sync/signin_manager.cc b/chrome/browser/sync/signin_manager.cc
|
| index 1feb5fc9b8e3ebd8183d4f8a534e317df42bf9e2..cdcad9f3e3ef8c098f125b577666d22bc9255f3b 100644
|
| --- a/chrome/browser/sync/signin_manager.cc
|
| +++ b/chrome/browser/sync/signin_manager.cc
|
| @@ -10,10 +10,11 @@
|
| #include "chrome/browser/prefs/pref_service.h"
|
| #include "chrome/browser/profiles/profile.h"
|
| #include "chrome/browser/sync/profile_sync_service.h"
|
| +#include "chrome/browser/sync/util/oauth.h"
|
| #include "chrome/common/chrome_notification_types.h"
|
| +#include "chrome/common/chrome_switches.h"
|
| #include "chrome/common/net/gaia/gaia_constants.h"
|
| #include "chrome/common/pref_names.h"
|
| -#include "chrome/common/chrome_switches.h"
|
| #include "content/common/notification_service.h"
|
|
|
| const char kGetInfoEmailKey[] = "email";
|
| @@ -25,6 +26,9 @@ SigninManager::~SigninManager() {}
|
|
|
| // static
|
| void SigninManager::RegisterUserPrefs(PrefService* user_prefs) {
|
| + user_prefs->RegisterBooleanPref(prefs::kSyncUsingOAuth,
|
| + "",
|
| + PrefService::UNSYNCABLE_PREF);
|
| user_prefs->RegisterStringPref(prefs::kGoogleServicesUsername,
|
| "",
|
| PrefService::UNSYNCABLE_PREF);
|
| @@ -35,10 +39,10 @@ void SigninManager::RegisterUserPrefs(PrefService* user_prefs) {
|
|
|
| void SigninManager::Initialize(Profile* profile) {
|
| profile_ = profile;
|
| - username_ = profile_->GetPrefs()->GetString(prefs::kGoogleServicesUsername);
|
| + SetUsername(profile_->GetPrefs()->GetString(prefs::kGoogleServicesUsername));
|
| profile_->GetTokenService()->Initialize(
|
| GaiaConstants::kChromeSource, profile_);
|
| - if (!username_.empty()) {
|
| + if (!GetUsername().empty()) {
|
| profile_->GetTokenService()->LoadTokensFromDB();
|
| }
|
| }
|
| @@ -62,11 +66,14 @@ void SigninManager::CleanupNotificationRegistration() {
|
|
|
| // If a username already exists, the user is logged in.
|
| const std::string& SigninManager::GetUsername() {
|
| - return username_;
|
| + return browser_sync::IsUsingOAuth() ? oauth_username_ : username_;
|
| }
|
|
|
| void SigninManager::SetUsername(const std::string& username) {
|
| - username_ = username;
|
| + if (browser_sync::IsUsingOAuth())
|
| + oauth_username_ = username;
|
| + else
|
| + username_ = username;
|
| }
|
|
|
| // static
|
| @@ -80,14 +87,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.
|
| @@ -146,26 +165,32 @@ 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);
|
| profile_->GetPrefs()->ScheduleSavePersistentPrefs();
|
| profile_->GetTokenService()->ResetCredentialsInMemory();
|
| profile_->GetTokenService()->EraseTokensFromDB();
|
| }
|
|
|
| void SigninManager::OnClientLoginSuccess(const ClientLoginResult& result) {
|
| + DCHECK(!browser_sync::IsUsingOAuth());
|
| last_result_ = result;
|
| // Make a request for the canonical email address.
|
| 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(!browser_sync::IsUsingOAuth());
|
| DCHECK(key == kGetInfoEmailKey);
|
|
|
| username_ = value;
|
| profile_->GetPrefs()->SetString(prefs::kGoogleServicesUsername, username_);
|
| + profile_->GetPrefs()->SetBoolean(prefs::kSyncUsingOAuth, false);
|
| profile_->GetPrefs()->ScheduleSavePersistentPrefs();
|
|
|
| GoogleServiceSigninSuccessDetails details(username_, password_);
|
| @@ -182,6 +207,7 @@ void SigninManager::OnGetUserInfoSuccess(const std::string& key,
|
| }
|
|
|
| void SigninManager::OnGetUserInfoKeyNotFound(const std::string& key) {
|
| + DCHECK(!browser_sync::IsUsingOAuth());
|
| DCHECK(key == kGetInfoEmailKey);
|
| LOG(ERROR) << "Account is not associated with a valid email address. "
|
| << "Login failed.";
|
| @@ -190,11 +216,13 @@ void SigninManager::OnGetUserInfoKeyNotFound(const std::string& key) {
|
| }
|
|
|
| void SigninManager::OnGetUserInfoFailure(const GoogleServiceAuthError& error) {
|
| + DCHECK(!browser_sync::IsUsingOAuth());
|
| LOG(ERROR) << "Unable to retreive the canonical email address. Login failed.";
|
| OnClientLoginFailure(error);
|
| }
|
|
|
| void SigninManager::OnTokenAuthFailure(const GoogleServiceAuthError& error) {
|
| + DCHECK(!browser_sync::IsUsingOAuth());
|
| #if !defined(OS_CHROMEOS)
|
| VLOG(1) << "Unable to retrieve the token auth.";
|
| CleanupNotificationRegistration();
|
| @@ -202,6 +230,7 @@ void SigninManager::OnTokenAuthFailure(const GoogleServiceAuthError& error) {
|
| }
|
|
|
| void SigninManager::OnClientLoginFailure(const GoogleServiceAuthError& error) {
|
| + DCHECK(!browser_sync::IsUsingOAuth());
|
| NotificationService::current()->Notify(
|
| chrome::NOTIFICATION_GOOGLE_SIGNIN_FAILED,
|
| Source<Profile>(profile_),
|
| @@ -222,41 +251,66 @@ void SigninManager::OnClientLoginFailure(const GoogleServiceAuthError& error) {
|
| }
|
|
|
| void SigninManager::OnGetOAuthTokenSuccess(const std::string& oauth_token) {
|
| + DCHECK(browser_sync::IsUsingOAuth());
|
| VLOG(1) << "SigninManager::SigninManager::OnGetOAuthTokenSuccess";
|
| }
|
|
|
| void SigninManager::OnGetOAuthTokenFailure() {
|
| - VLOG(1) << "SigninManager::OnGetOAuthTokenFailure";
|
| + DCHECK(browser_sync::IsUsingOAuth());
|
| + LOG(WARNING) << "SigninManager::OnGetOAuthTokenFailure";
|
| }
|
|
|
| void SigninManager::OnOAuthGetAccessTokenSuccess(const std::string& token,
|
| const std::string& secret) {
|
| + DCHECK(browser_sync::IsUsingOAuth());
|
| VLOG(1) << "SigninManager::OnOAuthGetAccessTokenSuccess";
|
| + profile_->GetTokenService()->UpdateOAuthCredentials(token, secret);
|
| }
|
|
|
| void SigninManager::OnOAuthGetAccessTokenFailure(
|
| const GoogleServiceAuthError& error) {
|
| - VLOG(1) << "SigninManager::OnOAuthGetAccessTokenFailure";
|
| + DCHECK(browser_sync::IsUsingOAuth());
|
| + LOG(WARNING) << "SigninManager::OnOAuthGetAccessTokenFailure";
|
| }
|
|
|
| void SigninManager::OnOAuthWrapBridgeSuccess(const std::string& service_name,
|
| const std::string& token,
|
| const std::string& expires_in) {
|
| + DCHECK(browser_sync::IsUsingOAuth());
|
| VLOG(1) << "SigninManager::OnOAuthWrapBridgeSuccess";
|
| }
|
|
|
| void SigninManager::OnOAuthWrapBridgeFailure(
|
| const std::string& service_scope,
|
| const GoogleServiceAuthError& error) {
|
| - VLOG(1) << "SigninManager::OnOAuthWrapBridgeFailure";
|
| + DCHECK(browser_sync::IsUsingOAuth());
|
| + 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 << "\")";
|
| + DCHECK(browser_sync::IsUsingOAuth());
|
| + 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";
|
| + DCHECK(browser_sync::IsUsingOAuth());
|
| + LOG(WARNING) << "SigninManager::OnUserInfoFailure";
|
| }
|
|
|
| void SigninManager::Observe(int type,
|
|
|