Chromium Code Reviews| Index: google_apis/gaia/oauth2_token_service.cc |
| diff --git a/google_apis/gaia/oauth2_token_service.cc b/google_apis/gaia/oauth2_token_service.cc |
| index 828f4cc630f31136f1b3c125c476b98d84dbefb3..458a0ec7c6878c5cac5e03230eddc71ad0c672c2 100644 |
| --- a/google_apis/gaia/oauth2_token_service.cc |
| +++ b/google_apis/gaia/oauth2_token_service.cc |
| @@ -19,27 +19,7 @@ |
| int OAuth2TokenService::max_fetch_retry_num_ = 5; |
| -OAuth2TokenService::ClientScopeSet::ClientScopeSet( |
| - const std::string& client_id, |
| - const ScopeSet& scopes) |
| - : client_id(client_id), |
| - scopes(scopes) { |
| -} |
| - |
| -OAuth2TokenService::ClientScopeSet::~ClientScopeSet() { |
| -} |
| - |
| -bool OAuth2TokenService::ClientScopeSet::operator<( |
| - const ClientScopeSet& s) const { |
| - if (client_id < s.client_id) |
| - return true; |
| - else if (s.client_id < client_id) |
| - return false; |
| - |
| - return scopes < s.scopes; |
| -} |
| - |
| -OAuth2TokenService::FetchParameters::FetchParameters( |
| +OAuth2TokenService::RequestParameters::RequestParameters( |
| const std::string& client_id, |
| const std::string& refresh_token, |
| const ScopeSet& scopes) |
| @@ -48,11 +28,11 @@ OAuth2TokenService::FetchParameters::FetchParameters( |
| scopes(scopes) { |
| } |
| -OAuth2TokenService::FetchParameters::~FetchParameters() { |
| +OAuth2TokenService::RequestParameters::~RequestParameters() { |
| } |
| -bool OAuth2TokenService::FetchParameters::operator<( |
| - const FetchParameters& p) const { |
| +bool OAuth2TokenService::RequestParameters::operator<( |
| + const RequestParameters& p) const { |
| if (client_id < p.client_id) |
| return true; |
| else if (p.client_id < client_id) |
| @@ -122,6 +102,7 @@ class OAuth2TokenService::Fetcher : public OAuth2AccessTokenConsumer { |
| // |refresh_token| and |scopes| in the request context obtained by |getter|. |
| // The given |oauth2_token_service| will be informed when fetching is done. |
| static Fetcher* CreateAndStart(OAuth2TokenService* oauth2_token_service, |
| + const std::string& account_id, |
| net::URLRequestContextGetter* getter, |
| const std::string& client_id, |
| const std::string& client_secret, |
| @@ -141,6 +122,7 @@ class OAuth2TokenService::Fetcher : public OAuth2AccessTokenConsumer { |
| const ScopeSet& GetScopeSet() const; |
| const std::string& GetRefreshToken() const; |
| const std::string& GetClientId() const; |
| + const std::string& GetAccountId() const; |
| // The error result from this fetcher. |
| const GoogleServiceAuthError& error() const { return error_; } |
| @@ -154,6 +136,7 @@ class OAuth2TokenService::Fetcher : public OAuth2AccessTokenConsumer { |
| private: |
| Fetcher(OAuth2TokenService* oauth2_token_service, |
| + const std::string& account_id, |
| net::URLRequestContextGetter* getter, |
| const std::string& client_id, |
| const std::string& client_secret, |
| @@ -172,6 +155,7 @@ class OAuth2TokenService::Fetcher : public OAuth2AccessTokenConsumer { |
| // (whichever comes first). |
| OAuth2TokenService* const oauth2_token_service_; |
| scoped_refptr<net::URLRequestContextGetter> getter_; |
| + const std::string account_id_; |
| const std::string refresh_token_; |
| const ScopeSet scopes_; |
| std::vector<base::WeakPtr<RequestImpl> > waiting_requests_; |
| @@ -197,6 +181,7 @@ class OAuth2TokenService::Fetcher : public OAuth2AccessTokenConsumer { |
| // static |
| OAuth2TokenService::Fetcher* OAuth2TokenService::Fetcher::CreateAndStart( |
| OAuth2TokenService* oauth2_token_service, |
| + const std::string& account_id, |
| net::URLRequestContextGetter* getter, |
| const std::string& client_id, |
| const std::string& client_secret, |
| @@ -205,6 +190,7 @@ OAuth2TokenService::Fetcher* OAuth2TokenService::Fetcher::CreateAndStart( |
| base::WeakPtr<RequestImpl> waiting_request) { |
| OAuth2TokenService::Fetcher* fetcher = new Fetcher( |
| oauth2_token_service, |
| + account_id, |
| getter, |
| client_id, |
| client_secret, |
| @@ -217,6 +203,7 @@ OAuth2TokenService::Fetcher* OAuth2TokenService::Fetcher::CreateAndStart( |
| OAuth2TokenService::Fetcher::Fetcher( |
| OAuth2TokenService* oauth2_token_service, |
| + const std::string& account_id, |
| net::URLRequestContextGetter* getter, |
| const std::string& client_id, |
| const std::string& client_secret, |
| @@ -225,6 +212,7 @@ OAuth2TokenService::Fetcher::Fetcher( |
| base::WeakPtr<RequestImpl> waiting_request) |
| : oauth2_token_service_(oauth2_token_service), |
| getter_(getter), |
| + account_id_(account_id), |
| refresh_token_(refresh_token), |
| scopes_(scopes), |
| retry_number_(0), |
| @@ -360,6 +348,10 @@ const std::string& OAuth2TokenService::Fetcher::GetClientId() const { |
| return client_id_; |
| } |
| +const std::string& OAuth2TokenService::Fetcher::GetAccountId() const { |
| + return account_id_; |
| +} |
| + |
| OAuth2TokenService::Request::Request() { |
| } |
| @@ -389,14 +381,22 @@ void OAuth2TokenService::RemoveObserver(Observer* observer) { |
| observer_list_.RemoveObserver(observer); |
| } |
| -bool OAuth2TokenService::RefreshTokenIsAvailable() { |
| - return !GetRefreshToken().empty(); |
| +bool OAuth2TokenService::RefreshTokenIsAvailable( |
| + const std::string& account_id) { |
| + DCHECK(CalledOnValidThread()); |
| + return !GetRefreshToken(account_id).empty(); |
| +} |
| + |
| +std::vector<std::string> OAuth2TokenService::GetAccounts() { |
| + return std::vector<std::string>(); |
| } |
| scoped_ptr<OAuth2TokenService::Request> OAuth2TokenService::StartRequest( |
| + const std::string& account_id, |
| const OAuth2TokenService::ScopeSet& scopes, |
| OAuth2TokenService::Consumer* consumer) { |
| return StartRequestForClientWithContext( |
| + account_id, |
| GetRequestContext(), |
| GaiaUrls::GetInstance()->oauth2_chrome_client_id(), |
| GaiaUrls::GetInstance()->oauth2_chrome_client_secret(), |
| @@ -406,11 +406,13 @@ scoped_ptr<OAuth2TokenService::Request> OAuth2TokenService::StartRequest( |
| scoped_ptr<OAuth2TokenService::Request> |
| OAuth2TokenService::StartRequestForClient( |
| + const std::string& account_id, |
| const std::string& client_id, |
| const std::string& client_secret, |
| const OAuth2TokenService::ScopeSet& scopes, |
| OAuth2TokenService::Consumer* consumer) { |
| return StartRequestForClientWithContext( |
| + account_id, |
| GetRequestContext(), |
| client_id, |
| client_secret, |
| @@ -420,10 +422,12 @@ OAuth2TokenService::StartRequestForClient( |
| scoped_ptr<OAuth2TokenService::Request> |
| OAuth2TokenService::StartRequestWithContext( |
| + const std::string& account_id, |
| net::URLRequestContextGetter* getter, |
| const ScopeSet& scopes, |
| Consumer* consumer) { |
| return StartRequestForClientWithContext( |
| + account_id, |
| getter, |
| GaiaUrls::GetInstance()->oauth2_chrome_client_id(), |
| GaiaUrls::GetInstance()->oauth2_chrome_client_secret(), |
| @@ -433,6 +437,7 @@ OAuth2TokenService::StartRequestWithContext( |
| scoped_ptr<OAuth2TokenService::Request> |
| OAuth2TokenService::StartRequestForClientWithContext( |
| + const std::string& account_id, |
| net::URLRequestContextGetter* getter, |
| const std::string& client_id, |
| const std::string& client_secret, |
| @@ -442,7 +447,7 @@ OAuth2TokenService::StartRequestForClientWithContext( |
| scoped_ptr<RequestImpl> request(new RequestImpl(consumer)); |
| - if (!RefreshTokenIsAvailable()) { |
| + if (!RefreshTokenIsAvailable(account_id)) { |
| base::MessageLoop::current()->PostTask(FROM_HERE, base::Bind( |
| &RequestImpl::InformConsumer, |
| request->AsWeakPtr(), |
| @@ -452,11 +457,14 @@ OAuth2TokenService::StartRequestForClientWithContext( |
| return request.PassAs<Request>(); |
| } |
| - ClientScopeSet client_scopes(client_id, scopes); |
| - if (HasCacheEntry(client_scopes)) { |
| - StartCacheLookupRequest(request.get(), client_scopes, consumer); |
| + RequestParameters request_parameters(client_id, |
| + GetRefreshToken(account_id), |
|
Roger Tawa OOO till Jul 10th
2013/09/13 14:53:56
GetRefreshToken() won't work on mobile platforms.
fgorski
2013/09/13 22:06:46
Done. But using only account id breaks the in flig
Roger Tawa OOO till Jul 10th
2013/09/16 17:31:51
What scenario are you thinking of? Something like
|
| + scopes); |
| + if (HasCacheEntry(request_parameters)) { |
| + StartCacheLookupRequest(request.get(), request_parameters, consumer); |
| } else { |
| FetchOAuth2Token(request.get(), |
| + account_id, |
| getter, |
| client_id, |
| client_secret, |
| @@ -466,27 +474,29 @@ OAuth2TokenService::StartRequestForClientWithContext( |
| } |
| void OAuth2TokenService::FetchOAuth2Token(RequestImpl* request, |
| + const std::string& account_id, |
| net::URLRequestContextGetter* getter, |
| const std::string& client_id, |
| const std::string& client_secret, |
| const ScopeSet& scopes) { |
| - std::string refresh_token = GetRefreshToken(); |
| + std::string refresh_token = GetRefreshToken(account_id); |
| // If there is already a pending fetcher for |scopes| and |refresh_token|, |
| // simply register this |request| for those results rather than starting |
| // a new fetcher. |
| - FetchParameters fetch_parameters = FetchParameters(client_id, |
| - refresh_token, |
| - scopes); |
| - std::map<FetchParameters, Fetcher*>::iterator iter = |
| - pending_fetchers_.find(fetch_parameters); |
| + RequestParameters request_parameters = RequestParameters(client_id, |
| + refresh_token, |
| + scopes); |
| + std::map<RequestParameters, Fetcher*>::iterator iter = |
| + pending_fetchers_.find(request_parameters); |
| if (iter != pending_fetchers_.end()) { |
| iter->second->AddWaitingRequest(request->AsWeakPtr()); |
| return; |
| } |
| - pending_fetchers_[fetch_parameters] = |
| + pending_fetchers_[request_parameters] = |
| Fetcher::CreateAndStart(this, |
| + account_id, |
| getter, |
| client_id, |
| client_secret, |
| @@ -497,10 +507,10 @@ void OAuth2TokenService::FetchOAuth2Token(RequestImpl* request, |
| void OAuth2TokenService::StartCacheLookupRequest( |
| RequestImpl* request, |
| - const OAuth2TokenService::ClientScopeSet& client_scopes, |
| + const OAuth2TokenService::RequestParameters& request_parameters, |
| OAuth2TokenService::Consumer* consumer) { |
| - CHECK(HasCacheEntry(client_scopes)); |
| - const CacheEntry* cache_entry = GetCacheEntry(client_scopes); |
| + CHECK(HasCacheEntry(request_parameters)); |
| + const CacheEntry* cache_entry = GetCacheEntry(request_parameters); |
| base::MessageLoop::current()->PostTask(FROM_HERE, base::Bind( |
| &RequestImpl::InformConsumer, |
| request->AsWeakPtr(), |
| @@ -509,12 +519,33 @@ void OAuth2TokenService::StartCacheLookupRequest( |
| cache_entry->expiration_date)); |
| } |
| -void OAuth2TokenService::InvalidateToken(const ScopeSet& scopes, |
| +void OAuth2TokenService::InvalidateToken(const std::string& account_id, |
| + const ScopeSet& scopes, |
| const std::string& invalid_token) { |
| + InvalidateOAuth2Token(account_id, |
| + GaiaUrls::GetInstance()->oauth2_chrome_client_id(), |
| + scopes, |
| + invalid_token); |
| +} |
| + |
| +void OAuth2TokenService::InvalidateTokenForClient( |
| + const std::string& account_id, |
| + const std::string& client_id, |
| + const ScopeSet& scopes, |
| + const std::string& invalid_token) { |
| + InvalidateOAuth2Token(account_id, client_id, scopes, invalid_token); |
| +} |
| + |
| +void OAuth2TokenService::InvalidateOAuth2Token( |
| + const std::string& account_id, |
| + const std::string& client_id, |
| + const ScopeSet& scopes, |
| + const std::string& invalid_token) { |
| DCHECK(CalledOnValidThread()); |
| RemoveCacheEntry( |
| - ClientScopeSet(GaiaUrls::GetInstance()->oauth2_chrome_client_id(), |
| - scopes), |
| + RequestParameters(client_id, |
| + GetRefreshToken(account_id), |
| + scopes), |
| invalid_token); |
| } |
| @@ -523,7 +554,7 @@ void OAuth2TokenService::OnFetchComplete(Fetcher* fetcher) { |
| // Update the auth error state so auth errors are appropriately communicated |
| // to the user. |
| - UpdateAuthError(fetcher->error()); |
| + UpdateAuthError(fetcher->GetAccountId(), fetcher->error()); |
| // Note |fetcher| is recorded in |pending_fetcher_| mapped to its refresh |
| // token and scope set. This is guaranteed as follows; here a Fetcher is said |
| @@ -551,8 +582,8 @@ void OAuth2TokenService::OnFetchComplete(Fetcher* fetcher) { |
| // By (1), |fetcher| is created by this service. |
| // Then by (2), |fetcher| is recorded in |pending_fetchers_|. |
| // Then by (3), |fetcher_| is mapped to its refresh token and ScopeSet. |
| - std::map<FetchParameters, Fetcher*>::iterator iter = |
| - pending_fetchers_.find(FetchParameters( |
| + std::map<RequestParameters, Fetcher*>::iterator iter = |
| + pending_fetchers_.find(RequestParameters( |
| fetcher->GetClientId(), |
| fetcher->GetRefreshToken(), |
| fetcher->GetScopeSet())); |
| @@ -562,15 +593,15 @@ void OAuth2TokenService::OnFetchComplete(Fetcher* fetcher) { |
| } |
| bool OAuth2TokenService::HasCacheEntry( |
| - const ClientScopeSet& client_scopes) { |
| - const CacheEntry* cache_entry = GetCacheEntry(client_scopes); |
| + const RequestParameters& request_parameters) { |
| + const CacheEntry* cache_entry = GetCacheEntry(request_parameters); |
| return cache_entry && cache_entry->access_token.length(); |
| } |
| const OAuth2TokenService::CacheEntry* OAuth2TokenService::GetCacheEntry( |
| - const ClientScopeSet& client_scopes) { |
| + const RequestParameters& request_parameters) { |
| DCHECK(CalledOnValidThread()); |
| - TokenCache::iterator token_iterator = token_cache_.find(client_scopes); |
| + TokenCache::iterator token_iterator = token_cache_.find(request_parameters); |
| if (token_iterator == token_cache_.end()) |
| return NULL; |
| if (token_iterator->second.expiration_date <= base::Time::Now()) { |
| @@ -581,10 +612,10 @@ const OAuth2TokenService::CacheEntry* OAuth2TokenService::GetCacheEntry( |
| } |
| bool OAuth2TokenService::RemoveCacheEntry( |
| - const ClientScopeSet& client_scopes, |
| + const RequestParameters& request_parameters, |
| const std::string& token_to_remove) { |
| DCHECK(CalledOnValidThread()); |
| - TokenCache::iterator token_iterator = token_cache_.find(client_scopes); |
| + TokenCache::iterator token_iterator = token_cache_.find(request_parameters); |
| if (token_iterator != token_cache_.end() && |
| token_iterator->second.access_token == token_to_remove) { |
| token_cache_.erase(token_iterator); |
| @@ -601,13 +632,16 @@ void OAuth2TokenService::RegisterCacheEntry( |
| const base::Time& expiration_date) { |
| DCHECK(CalledOnValidThread()); |
| - CacheEntry& token = token_cache_[ClientScopeSet(client_id, |
| - scopes)]; |
| + CacheEntry& token = token_cache_[RequestParameters(client_id, |
| + refresh_token, |
| + scopes)]; |
| token.access_token = access_token; |
| token.expiration_date = expiration_date; |
| } |
| -void OAuth2TokenService::UpdateAuthError(const GoogleServiceAuthError& error) { |
| +void OAuth2TokenService::UpdateAuthError( |
| + const std::string& account_id, |
| + const GoogleServiceAuthError& error) { |
| // Default implementation does nothing. |
| } |
| @@ -616,9 +650,25 @@ void OAuth2TokenService::ClearCache() { |
| token_cache_.clear(); |
| } |
| +void OAuth2TokenService::ClearCacheForAccount(const std::string& account_id) { |
| + DCHECK(CalledOnValidThread()); |
| + const std::string refresh_token = GetRefreshToken(account_id); |
| + for (TokenCache::iterator iter = token_cache_.begin(); |
| + iter != token_cache_.end(); |
| + /* iter incremented in body */) { |
| + if (iter->first.refresh_token == refresh_token) { |
| + token_cache_.erase(iter++); |
| + } else { |
| + ++iter; |
| + } |
| + } |
| + |
| + token_cache_.clear(); |
| +} |
| + |
| void OAuth2TokenService::CancelAllRequests() { |
| std::vector<Fetcher*> fetchers_to_cancel; |
| - for (std::map<FetchParameters, Fetcher*>::iterator iter = |
| + for (std::map<RequestParameters, Fetcher*>::iterator iter = |
| pending_fetchers_.begin(); |
| iter != pending_fetchers_.end(); |
| ++iter) { |
| @@ -630,7 +680,7 @@ void OAuth2TokenService::CancelAllRequests() { |
| void OAuth2TokenService::CancelRequestsForToken( |
| const std::string& refresh_token) { |
| std::vector<Fetcher*> fetchers_to_cancel; |
| - for (std::map<FetchParameters, Fetcher*>::iterator iter = |
| + for (std::map<RequestParameters, Fetcher*>::iterator iter = |
| pending_fetchers_.begin(); |
| iter != pending_fetchers_.end(); |
| ++iter) { |
| @@ -666,10 +716,6 @@ void OAuth2TokenService::FireRefreshTokensLoaded() { |
| FOR_EACH_OBSERVER(Observer, observer_list_, OnRefreshTokensLoaded()); |
| } |
| -void OAuth2TokenService::FireRefreshTokensCleared() { |
| - FOR_EACH_OBSERVER(Observer, observer_list_, OnRefreshTokensCleared()); |
| -} |
| - |
| int OAuth2TokenService::cache_size_for_testing() const { |
| return token_cache_.size(); |
| } |
| @@ -685,7 +731,7 @@ size_t OAuth2TokenService::GetNumPendingRequestsForTesting( |
| const std::string& refresh_token, |
| const ScopeSet& scopes) const { |
| PendingFetcherMap::const_iterator iter = pending_fetchers_.find( |
| - OAuth2TokenService::FetchParameters( |
| + OAuth2TokenService::RequestParameters( |
| client_id, |
| refresh_token, |
| scopes)); |