Chromium Code Reviews| Index: chrome/browser/net/gaia/token_service.cc |
| =================================================================== |
| --- chrome/browser/net/gaia/token_service.cc (revision 111499) |
| +++ chrome/browser/net/gaia/token_service.cc (working copy) |
| @@ -160,6 +160,15 @@ |
| web_data_service_->RemoveAllTokens(); |
| } |
| +// static |
| +int TokenService::GetServiceIndex(const std::string& service) { |
| + for (int i = 0; i < kNumServices; ++i) { |
| + if (kServices[i] == service) |
| + return i; |
| + } |
| + return -1; |
| +} |
| + |
| bool TokenService::AreCredentialsValid() const { |
| return !credentials_.lsid.empty() && !credentials_.sid.empty(); |
| } |
| @@ -239,6 +248,18 @@ |
| return EmptyString(); |
| } |
| +bool TokenService::HasOAuthLoginToken() const { |
|
Rick Campbell
2011/11/28 22:51:07
See comment in header. I recommend removing these
Munjal (Google)
2011/11/28 23:41:14
Replied there.
|
| + return HasTokenForService(GaiaConstants::kGaiaOAuth2LoginRefreshToken); |
| +} |
| + |
| +const std::string& TokenService::GetOAuth2LoginRefreshToken() const { |
| + return GetTokenForService(GaiaConstants::kGaiaOAuth2LoginRefreshToken); |
| +} |
| + |
| +const std::string& TokenService::GetOAuth2LoginAccessToken() const { |
| + return GetTokenForService(GaiaConstants::kGaiaOAuth2LoginAccessToken); |
| +} |
| + |
| // Note that this can fire twice or more for any given service. |
| // It can fire once from the DB read, and then once from the initial |
| // fetcher. Future fetches can cause more notification firings. |
| @@ -279,6 +300,11 @@ |
| token_map_[service] = auth_token; |
| FireTokenAvailableNotification(service, auth_token); |
| SaveAuthTokenToDB(service, auth_token); |
| + if (service == GaiaConstants::kLSOService) { |
|
Rick Campbell
2011/11/28 22:51:07
Is there another way to accomplish this? Splicing
Munjal (Google)
2011/11/28 23:41:14
I thought about that but decided that this was the
|
| + int index = GetServiceIndex(service); |
| + DCHECK_NE(-1, index); |
| + fetchers_[index]->StartOAuthLoginTokenFetch(auth_token); |
| + } |
| } |
| void TokenService::OnIssueAuthTokenFailure(const std::string& service, |
| @@ -288,6 +314,31 @@ |
| FireTokenRequestFailedNotification(service, error); |
| } |
| +void TokenService::OnOAuthLoginTokenSuccess(const std::string& refresh_token, |
| + const std::string& access_token, |
| + int expires_in_secs) { |
| + DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
| + VLOG(1) << "Got OAuth2 login token pair"; |
| + token_map_[GaiaConstants::kGaiaOAuth2LoginRefreshToken] = refresh_token; |
| + token_map_[GaiaConstants::kGaiaOAuth2LoginAccessToken] = access_token; |
| + SaveAuthTokenToDB(GaiaConstants::kGaiaOAuth2LoginRefreshToken, |
| + refresh_token); |
| + SaveAuthTokenToDB(GaiaConstants::kGaiaOAuth2LoginAccessToken, |
| + access_token); |
| + // We don't save expiration information for now. |
| + |
| + FireTokenAvailableNotification(GaiaConstants::kGaiaOAuth2LoginRefreshToken, |
| + refresh_token); |
| +} |
| + |
| +void TokenService::OnOAuthLoginTokenFailure( |
| + const GoogleServiceAuthError& error) { |
| + DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
| + LOG(WARNING) << "OAuth2 login token pair fetch failed:"; |
| + FireTokenRequestFailedNotification( |
| + GaiaConstants::kGaiaOAuth2LoginRefreshToken, error); |
| +} |
| + |
| void TokenService::OnOAuthGetAccessTokenSuccess(const std::string& token, |
| const std::string& secret) { |
| DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
| @@ -348,25 +399,12 @@ |
| std::map<std::string, std::string>* in_memory_tokens) { |
| for (int i = 0; i < kNumServices; i++) { |
| - // OnIssueAuthTokenSuccess should come from the same thread. |
| - // If a token is already present in the map, it could only have |
| - // come from a DB read or from IssueAuthToken. Since we should never |
| - // fetch from the DB twice in a browser session, it must be from |
| - // OnIssueAuthTokenSuccess, which is a live fetcher. |
| - // |
| - // Network fetched tokens take priority over DB tokens, so exclude tokens |
| - // which have already been loaded by the fetcher. |
| - if (!in_memory_tokens->count(kServices[i]) && |
| - db_tokens.count(kServices[i])) { |
| - std::string db_token = db_tokens.find(kServices[i])->second; |
| - if (!db_token.empty()) { |
| - VLOG(1) << "Loading " << kServices[i] << " token from DB: " << db_token; |
| - (*in_memory_tokens)[kServices[i]] = db_token; |
| - FireTokenAvailableNotification(kServices[i], db_token); |
| - // Failures are only for network errors. |
| - } |
| - } |
| + LoadSingleTokenIntoMemory(db_tokens, in_memory_tokens, kServices[i]); |
| } |
| + LoadSingleTokenIntoMemory(db_tokens, in_memory_tokens, |
| + GaiaConstants::kGaiaOAuth2LoginRefreshToken); |
| + LoadSingleTokenIntoMemory(db_tokens, in_memory_tokens, |
| + GaiaConstants::kGaiaOAuth2LoginAccessToken); |
| if (credentials_.lsid.empty() && credentials_.sid.empty()) { |
| // Look for GAIA SID and LSID tokens. If we have both, and the current |
| @@ -389,25 +427,7 @@ |
| } |
| for (int i = 0; i < kNumOAuthServices; i++) { |
| - // OnIssueAuthTokenSuccess should come from the same thread. |
| - // If a token is already present in the map, it could only have |
| - // come from a DB read or from IssueAuthToken. Since we should never |
| - // fetch from the DB twice in a browser session, it must be from |
| - // OnIssueAuthTokenSuccess, which is a live fetcher. |
| - // |
| - // Network fetched tokens take priority over DB tokens, so exclude tokens |
| - // which have already been loaded by the fetcher. |
| - if (!in_memory_tokens->count(kOAuthServices[i]) && |
| - db_tokens.count(kOAuthServices[i])) { |
| - std::string db_token = db_tokens.find(kOAuthServices[i])->second; |
| - if (!db_token.empty()) { |
| - VLOG(1) << "Loading " << kOAuthServices[i] << " OAuth token from DB: " |
| - << db_token; |
| - (*in_memory_tokens)[kOAuthServices[i]] = db_token; |
| - FireTokenAvailableNotification(kOAuthServices[i], db_token); |
| - // Failures are only for network errors. |
| - } |
| - } |
| + LoadSingleTokenIntoMemory(db_tokens, in_memory_tokens, kOAuthServices[i]); |
| } |
| if (oauth_token_.empty() && oauth_secret_.empty()) { |
| @@ -428,6 +448,29 @@ |
| } |
| } |
| +void TokenService::LoadSingleTokenIntoMemory( |
| + const std::map<std::string, std::string>& db_tokens, |
| + std::map<std::string, std::string>* in_memory_tokens, |
| + const std::string& service) { |
| + // OnIssueAuthTokenSuccess should come from the same thread. |
| + // If a token is already present in the map, it could only have |
| + // come from a DB read or from IssueAuthToken. Since we should never |
| + // fetch from the DB twice in a browser session, it must be from |
| + // OnIssueAuthTokenSuccess, which is a live fetcher. |
| + // |
| + // Network fetched tokens take priority over DB tokens, so exclude tokens |
| + // which have already been loaded by the fetcher. |
| + if (!in_memory_tokens->count(service) && db_tokens.count(service)) { |
| + std::string db_token = db_tokens.find(service)->second; |
| + if (!db_token.empty()) { |
| + VLOG(1) << "Loading " << service << " token from DB: " << db_token; |
| + (*in_memory_tokens)[service] = db_token; |
| + FireTokenAvailableNotification(service, db_token); |
| + // Failures are only for network errors. |
| + } |
| + } |
| +} |
| + |
| void TokenService::Observe(int type, |
| const content::NotificationSource& source, |
| const content::NotificationDetails& details) { |