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..3259e283b6479e23d993b511a28244a62222df88 100644 |
--- a/google_apis/gaia/oauth2_token_service.cc |
+++ b/google_apis/gaia/oauth2_token_service.cc |
@@ -19,48 +19,28 @@ |
int OAuth2TokenService::max_fetch_retry_num_ = 5; |
-OAuth2TokenService::ClientScopeSet::ClientScopeSet( |
+OAuth2TokenService::RequestParameters::RequestParameters( |
const std::string& client_id, |
+ const std::string& account_id, |
const ScopeSet& scopes) |
: client_id(client_id), |
+ account_id(account_id), |
scopes(scopes) { |
} |
-OAuth2TokenService::ClientScopeSet::~ClientScopeSet() { |
+OAuth2TokenService::RequestParameters::~RequestParameters() { |
} |
-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( |
- const std::string& client_id, |
- const std::string& refresh_token, |
- const ScopeSet& scopes) |
- : client_id(client_id), |
- refresh_token(refresh_token), |
- scopes(scopes) { |
-} |
- |
-OAuth2TokenService::FetchParameters::~FetchParameters() { |
-} |
- |
-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) |
return false; |
- if (refresh_token < p.refresh_token) |
+ if (account_id < p.account_id) |
return true; |
- else if (p.refresh_token < refresh_token) |
+ else if (p.account_id < account_id) |
return false; |
return scopes < p.scopes; |
@@ -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), |
@@ -267,7 +255,7 @@ void OAuth2TokenService::Fetcher::OnGetTokenSuccess( |
// This is intentional -- some consumers may need the token for cleanup |
// tasks. https://chromiumcodereview.appspot.com/11312124/ |
oauth2_token_service_->RegisterCacheEntry(client_id_, |
- refresh_token_, |
+ account_id_, |
scopes_, |
access_token_, |
expiration_date_); |
@@ -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, |
+ account_id, |
+ 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|, |
+ // If there is already a pending fetcher for |scopes| and |account_id|, |
// 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, |
+ account_id, |
+ 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,13 +519,34 @@ void OAuth2TokenService::StartCacheLookupRequest( |
cache_entry->expiration_date)); |
} |
-void OAuth2TokenService::InvalidateToken(const ScopeSet& scopes, |
- const std::string& invalid_token) { |
+void OAuth2TokenService::InvalidateToken(const std::string& account_id, |
+ const ScopeSet& scopes, |
+ const std::string& access_token) { |
+ InvalidateOAuth2Token(account_id, |
+ GaiaUrls::GetInstance()->oauth2_chrome_client_id(), |
+ scopes, |
+ access_token); |
+} |
+ |
+void OAuth2TokenService::InvalidateTokenForClient( |
+ const std::string& account_id, |
+ const std::string& client_id, |
+ const ScopeSet& scopes, |
+ const std::string& access_token) { |
+ InvalidateOAuth2Token(account_id, client_id, scopes, access_token); |
+} |
+ |
+void OAuth2TokenService::InvalidateOAuth2Token( |
+ const std::string& account_id, |
+ const std::string& client_id, |
+ const ScopeSet& scopes, |
+ const std::string& access_token) { |
DCHECK(CalledOnValidThread()); |
RemoveCacheEntry( |
- ClientScopeSet(GaiaUrls::GetInstance()->oauth2_chrome_client_id(), |
- scopes), |
- invalid_token); |
+ RequestParameters(client_id, |
+ account_id, |
+ scopes), |
+ access_token); |
} |
void OAuth2TokenService::OnFetchComplete(Fetcher* fetcher) { |
@@ -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,10 +582,10 @@ 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->GetAccountId(), |
fetcher->GetScopeSet())); |
DCHECK(iter != pending_fetchers_.end()); |
DCHECK_EQ(fetcher, iter->second); |
@@ -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); |
@@ -595,19 +626,22 @@ bool OAuth2TokenService::RemoveCacheEntry( |
void OAuth2TokenService::RegisterCacheEntry( |
const std::string& client_id, |
- const std::string& refresh_token, |
+ const std::string& account_id, |
const OAuth2TokenService::ScopeSet& scopes, |
const std::string& access_token, |
const base::Time& expiration_date) { |
DCHECK(CalledOnValidThread()); |
- CacheEntry& token = token_cache_[ClientScopeSet(client_id, |
- scopes)]; |
+ CacheEntry& token = token_cache_[RequestParameters(client_id, |
+ account_id, |
+ 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,22 @@ void OAuth2TokenService::ClearCache() { |
token_cache_.clear(); |
} |
+void OAuth2TokenService::ClearCacheForAccount(const std::string& account_id) { |
+ DCHECK(CalledOnValidThread()); |
+ for (TokenCache::iterator iter = token_cache_.begin(); |
+ iter != token_cache_.end(); |
+ /* iter incremented in body */) { |
+ if (iter->first.account_id == account_id) { |
+ token_cache_.erase(iter++); |
+ } else { |
+ ++iter; |
+ } |
+ } |
+} |
+ |
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) { |
@@ -627,14 +674,14 @@ void OAuth2TokenService::CancelAllRequests() { |
CancelFetchers(fetchers_to_cancel); |
} |
-void OAuth2TokenService::CancelRequestsForToken( |
- const std::string& refresh_token) { |
+void OAuth2TokenService::CancelRequestsForAccount( |
+ const std::string& account_id) { |
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) { |
- if (iter->first.refresh_token == refresh_token) |
+ if (iter->first.account_id == account_id) |
fetchers_to_cancel.push_back(iter->second); |
} |
CancelFetchers(fetchers_to_cancel); |
@@ -666,10 +713,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(); |
} |
@@ -682,12 +725,12 @@ void OAuth2TokenService::set_max_authorization_token_fetch_retries_for_testing( |
size_t OAuth2TokenService::GetNumPendingRequestsForTesting( |
const std::string& client_id, |
- const std::string& refresh_token, |
+ const std::string& account_id, |
const ScopeSet& scopes) const { |
PendingFetcherMap::const_iterator iter = pending_fetchers_.find( |
- OAuth2TokenService::FetchParameters( |
+ OAuth2TokenService::RequestParameters( |
client_id, |
- refresh_token, |
+ account_id, |
scopes)); |
return iter == pending_fetchers_.end() ? |
0 : iter->second->GetWaitingRequestCount(); |