Index: chrome/browser/chromeos/login/login_utils.cc |
=================================================================== |
--- chrome/browser/chromeos/login/login_utils.cc (revision 100678) |
+++ chrome/browser/chromeos/login/login_utils.cc (working copy) |
@@ -50,6 +50,8 @@ |
#include "chrome/common/chrome_paths.h" |
#include "chrome/common/chrome_switches.h" |
#include "chrome/common/logging_chrome.h" |
+#include "chrome/common/net/gaia/gaia_auth_consumer.h" |
+#include "chrome/common/net/gaia/gaia_auth_fetcher.h" |
#include "chrome/common/net/gaia/gaia_constants.h" |
#include "chrome/common/net/gaia/gaia_urls.h" |
#include "chrome/common/pref_names.h" |
@@ -100,13 +102,13 @@ |
// Task override. |
virtual void Run() { |
DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
- |
+ LoginUtils::Get()->FetchCookies(ProfileManager::GetDefaultProfile(), |
+ credentials_); |
LoginUtils::Get()->StartSync(ProfileManager::GetDefaultProfile(), |
credentials_); |
} |
private: |
- Profile* user_profile_; |
GaiaAuthConsumer::ClientLoginResult credentials_; |
}; |
@@ -221,6 +223,62 @@ |
DISALLOW_COPY_AND_ASSIGN(OAuthLoginVerifier); |
}; |
+// Verifies OAuth1 access token by performing OAuthLogin. |
+class UserSessionCookieFetcher : public GaiaAuthConsumer { |
+ public: |
+ explicit UserSessionCookieFetcher(Profile* user_profile) |
+ : gaia_fetcher_(this, |
+ std::string(GaiaConstants::kChromeOSSource), |
+ user_profile->GetRequestContext()) { |
+ } |
+ virtual ~UserSessionCookieFetcher() {} |
+ |
+ void Start(const GaiaAuthConsumer::ClientLoginResult& credentials) { |
+ gaia_fetcher_.StartIssueAuthToken(credentials.sid, credentials.lsid, |
+ GaiaConstants::kGaiaService); |
+ } |
+ |
+ // GaiaAuthConsumer overrides. |
+ virtual void OnIssueAuthTokenSuccess(const std::string& service, |
+ const std::string& auth_token) OVERRIDE { |
+ gaia_fetcher_.StartMergeSession(auth_token); |
+ } |
+ |
+ virtual void OnIssueAuthTokenFailure(const std::string& service, |
+ const GoogleServiceAuthError& error) OVERRIDE { |
+ LOG(WARNING) << "Failed IssueAuthToken request," |
+ << " error.state=" << error.state(); |
+ HandlerGaiaAuthError(error); |
+ delete this; |
+ } |
+ |
+ virtual void OnMergeSessionSuccess(const std::string& data) OVERRIDE { |
+ VLOG(1) << "MergeSession successful."; |
+ delete this; |
+ } |
+ |
+ virtual void OnMergeSessionFailure( |
+ const GoogleServiceAuthError& error) OVERRIDE { |
+ LOG(WARNING) << "Failed MergeSession request," |
+ << " error.state=" << error.state(); |
+ HandlerGaiaAuthError(error); |
+ delete this; |
+ } |
+ |
+ private: |
+ void HandlerGaiaAuthError(const GoogleServiceAuthError& error) { |
+ // Mark this account's login state as offline if we encountered a network |
+ // error. That will make us verify user OAuth token and try to fetch session |
+ // cookies again once we detect that the machine comes online. |
+ if (error.state() == GoogleServiceAuthError::CONNECTION_FAILED) |
+ UserManager::Get()->set_offline_login(true); |
+ } |
+ |
+ GaiaAuthFetcher gaia_fetcher_; |
+ DISALLOW_COPY_AND_ASSIGN(UserSessionCookieFetcher); |
+}; |
+ |
+ |
// Fetches an OAuth token and initializes user policy with it. |
class PolicyOAuthFetcher : public GaiaOAuthConsumer { |
public: |
@@ -630,16 +688,21 @@ |
oauth_fetcher_->StartGetOAuthTokenRequest(); |
} |
-void LoginUtilsImpl::FetchCookies( |
- Profile* profile, |
+void LoginUtilsImpl::FetchCookies(Profile* user_profile, |
const GaiaAuthConsumer::ClientLoginResult& credentials) { |
- // Take the credentials passed in and try to exchange them for |
- // full-fledged Google authentication cookies. This is |
- // best-effort; it's possible that we'll fail due to network |
- // troubles or some such. |
- // CookieFetcher will delete itself once done. |
- CookieFetcher* cf = new CookieFetcher(profile); |
- cf->AttemptFetch(credentials.data); |
+ if (!using_oauth_) { |
+ // Take the credentials passed in and try to exchange them for |
+ // full-fledged Google authentication cookies. This is |
+ // best-effort; it's possible that we'll fail due to network |
+ // troubles or some such. |
+ // CookieFetcher will delete itself once done. |
+ CookieFetcher* cf = new CookieFetcher(user_profile); |
+ cf->AttemptFetch(credentials.data); |
+ } else { |
+ UserSessionCookieFetcher* cf = |
+ new UserSessionCookieFetcher(user_profile); |
+ cf->Start(credentials); |
+ } |
} |
void LoginUtilsImpl::StartTokenServices(Profile* user_profile) { |