| Index: chrome/browser/chromeos/login/login_utils.cc
|
| ===================================================================
|
| --- chrome/browser/chromeos/login/login_utils.cc (revision 99948)
|
| +++ chrome/browser/chromeos/login/login_utils.cc (working copy)
|
| @@ -192,9 +192,11 @@
|
| const std::string& auth) OVERRIDE {
|
| GaiaAuthConsumer::ClientLoginResult credentials(sid,
|
| lsid, auth, std::string());
|
| + UserManager::Get()->set_offline_login(false);
|
| BrowserThread::PostTask(BrowserThread::UI, FROM_HERE,
|
| new StartSyncOnUIThreadTask(credentials));
|
| }
|
| +
|
| virtual void OnOAuthLoginFailure(
|
| const GoogleServiceAuthError& error) OVERRIDE {
|
| LOG(WARNING) << "Failed to verify OAuth1 access tokens,"
|
| @@ -205,6 +207,8 @@
|
| if (error.state() != GoogleServiceAuthError::CONNECTION_FAILED) {
|
| UserManager::Get()->SaveUserOAuthStatus(username_,
|
| UserManager::OAUTH_TOKEN_STATUS_INVALID);
|
| + } else {
|
| + UserManager::Get()->set_offline_login(true);
|
| }
|
| }
|
|
|
| @@ -267,7 +271,8 @@
|
|
|
| class LoginUtilsImpl : public LoginUtils,
|
| public ProfileManagerObserver,
|
| - public GaiaOAuthConsumer {
|
| + public GaiaOAuthConsumer,
|
| + public net::NetworkChangeNotifier::OnlineStateObserver {
|
| public:
|
| LoginUtilsImpl()
|
| : background_view_(NULL),
|
| @@ -275,8 +280,13 @@
|
| using_oauth_(false),
|
| has_cookies_(false),
|
| delegate_(NULL) {
|
| + net::NetworkChangeNotifier::AddOnlineStateObserver(this);
|
| }
|
|
|
| + virtual ~LoginUtilsImpl() {
|
| + net::NetworkChangeNotifier::RemoveOnlineStateObserver(this);
|
| + }
|
| +
|
| virtual void PrepareProfile(
|
| const std::string& username,
|
| const std::string& password,
|
| @@ -348,6 +358,9 @@
|
| virtual void OnOAuthGetAccessTokenFailure(
|
| const GoogleServiceAuthError& error) OVERRIDE;
|
|
|
| + // net::NetworkChangeNotifier::OnlineStateObserver overrides.
|
| + virtual void OnOnlineStateChanged(bool online) OVERRIDE;
|
| +
|
| protected:
|
| virtual std::string GetOffTheRecordCommandLine(
|
| const GURL& start_url,
|
| @@ -933,6 +946,7 @@
|
| if (!encoded_token.length() || !encoded_secret.length())
|
| return false;
|
|
|
| + DCHECK(authenticator_.get());
|
| std::string decoded_token = authenticator_->DecryptToken(encoded_token);
|
| std::string decoded_secret = authenticator_->DecryptToken(encoded_secret);
|
| if (!decoded_token.length() || !decoded_secret.length()) {
|
| @@ -1017,6 +1031,22 @@
|
| LOG(WARNING) << "Failed fetching OAuth v1 token, error: " << error.state();
|
| }
|
|
|
| +void LoginUtilsImpl::OnOnlineStateChanged(bool online) {
|
| + // If we come online for the first time after successful offline login,
|
| + // we need to kick of OAuth token verification process again.
|
| + if (UserManager::Get()->user_is_logged_in() &&
|
| + UserManager::Get()->offline_login() && online) {
|
| + if (!authenticator_.get())
|
| + CreateAuthenticator(NULL);
|
| + std::string oauth1_token;
|
| + std::string oauth1_secret;
|
| + Profile* user_profile = ProfileManager::GetDefaultProfile();
|
| + if (ReadOAuth1AccessToken(user_profile, &oauth1_token, &oauth1_secret))
|
| + VerifyOAuth1AccessToken(user_profile, oauth1_token, oauth1_secret);
|
| + authenticator_ = NULL;
|
| + }
|
| +}
|
| +
|
| LoginUtils* LoginUtils::Get() {
|
| return LoginUtilsWrapper::GetInstance()->get();
|
| }
|
|
|