| Index: chrome/browser/signin/oauth2_token_service.cc
|
| diff --git a/chrome/browser/signin/oauth2_token_service.cc b/chrome/browser/signin/oauth2_token_service.cc
|
| index 0b6bd5dce376e5af55b6df43bd591f3e9129c0ef..d8d4cc6be4aa8e57a78fe45c0452a3bd5d8c78be 100644
|
| --- a/chrome/browser/signin/oauth2_token_service.cc
|
| +++ b/chrome/browser/signin/oauth2_token_service.cc
|
| @@ -91,6 +91,7 @@ class OAuth2TokenService::Fetcher : public OAuth2AccessTokenConsumer {
|
|
|
| const OAuth2TokenService::ScopeSet& GetScopeSet() const;
|
| const std::string& GetRefreshToken() const;
|
| + const std::string& GetClientId() const;
|
|
|
| // The error result from this fetcher.
|
| const GoogleServiceAuthError& error() const { return error_; }
|
| @@ -136,8 +137,8 @@ class OAuth2TokenService::Fetcher : public OAuth2AccessTokenConsumer {
|
| std::string access_token_;
|
| base::Time expiration_date_;
|
| // OAuth2 client id and secret.
|
| - std::string chrome_client_id_;
|
| - std::string chrome_client_secret_;
|
| + std::string client_id_;
|
| + std::string client_secret_;
|
|
|
| DISALLOW_COPY_AND_ASSIGN(Fetcher);
|
| };
|
| @@ -166,8 +167,8 @@ OAuth2TokenService::Fetcher* OAuth2TokenService::Fetcher::CreateAndStart(
|
| OAuth2TokenService::Fetcher::Fetcher(
|
| OAuth2TokenService* oauth2_token_service,
|
| net::URLRequestContextGetter* getter,
|
| - const std::string& chrome_client_id,
|
| - const std::string& chrome_client_secret,
|
| + const std::string& client_id,
|
| + const std::string& client_secret,
|
| const std::string& refresh_token,
|
| const OAuth2TokenService::ScopeSet& scopes,
|
| base::WeakPtr<RequestImpl> waiting_request)
|
| @@ -177,8 +178,8 @@ OAuth2TokenService::Fetcher::Fetcher(
|
| scopes_(scopes),
|
| retry_number_(0),
|
| error_(GoogleServiceAuthError::SERVICE_UNAVAILABLE),
|
| - chrome_client_id_(chrome_client_id),
|
| - chrome_client_secret_(chrome_client_secret) {
|
| + client_id_(client_id),
|
| + client_secret_(client_secret) {
|
| DCHECK(oauth2_token_service_);
|
| DCHECK(getter_.get());
|
| DCHECK(refresh_token_.length());
|
| @@ -193,8 +194,8 @@ OAuth2TokenService::Fetcher::~Fetcher() {
|
|
|
| void OAuth2TokenService::Fetcher::Start() {
|
| fetcher_.reset(new OAuth2AccessTokenFetcher(this, getter_.get()));
|
| - fetcher_->Start(chrome_client_id_,
|
| - chrome_client_secret_,
|
| + fetcher_->Start(client_id_,
|
| + client_secret_,
|
| refresh_token_,
|
| std::vector<std::string>(scopes_.begin(), scopes_.end()));
|
| retry_timer_.Stop();
|
| @@ -214,7 +215,8 @@ void OAuth2TokenService::Fetcher::OnGetTokenSuccess(
|
| // we still inform all waiting Consumers of a successful token fetch below.
|
| // This is intentional -- some consumers may need the token for cleanup
|
| // tasks. https://chromiumcodereview.appspot.com/11312124/
|
| - oauth2_token_service_->RegisterCacheEntry(refresh_token_,
|
| + oauth2_token_service_->RegisterCacheEntry(client_id_,
|
| + refresh_token_,
|
| scopes_,
|
| access_token_,
|
| expiration_date_);
|
| @@ -299,6 +301,10 @@ const std::string& OAuth2TokenService::Fetcher::GetRefreshToken() const {
|
| return refresh_token_;
|
| }
|
|
|
| +const std::string& OAuth2TokenService::Fetcher::GetClientId() const {
|
| + return client_id_;
|
| +}
|
| +
|
| OAuth2TokenService::Request::Request() {
|
| }
|
|
|
| @@ -345,6 +351,7 @@ scoped_ptr<OAuth2TokenService::Request> OAuth2TokenService::StartRequest(
|
| consumer);
|
| }
|
|
|
| +#if defined(OS_CHROMEOS)
|
| scoped_ptr<OAuth2TokenService::Request>
|
| OAuth2TokenService::StartRequestForClient(
|
| const std::string& client_id,
|
| @@ -358,6 +365,7 @@ OAuth2TokenService::StartRequestForClient(
|
| scopes,
|
| consumer);
|
| }
|
| +#endif
|
|
|
| scoped_ptr<OAuth2TokenService::Request>
|
| OAuth2TokenService::StartRequestWithContext(
|
| @@ -395,13 +403,15 @@ OAuth2TokenService::StartRequestForClientWithContext(
|
| return request.PassAs<Request>();
|
| }
|
|
|
| - if (HasCacheEntry(scopes))
|
| - return StartCacheLookupRequest(scopes, consumer);
|
| + ClientScopeSet client_scopes(client_id, scopes);
|
| + if (HasCacheEntry(client_scopes))
|
| + return StartCacheLookupRequest(client_scopes, consumer);
|
|
|
| // 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 = std::make_pair(refresh_token, scopes);
|
| + FetchParameters fetch_parameters = std::make_pair(
|
| + std::make_pair(client_id, refresh_token), scopes);
|
| std::map<FetchParameters, Fetcher*>::iterator iter =
|
| pending_fetchers_.find(fetch_parameters);
|
| if (iter != pending_fetchers_.end()) {
|
| @@ -422,10 +432,10 @@ OAuth2TokenService::StartRequestForClientWithContext(
|
|
|
| scoped_ptr<OAuth2TokenService::Request>
|
| OAuth2TokenService::StartCacheLookupRequest(
|
| - const OAuth2TokenService::ScopeSet& scopes,
|
| + const OAuth2TokenService::ClientScopeSet& client_scopes,
|
| OAuth2TokenService::Consumer* consumer) {
|
| - CHECK(HasCacheEntry(scopes));
|
| - const CacheEntry* cache_entry = GetCacheEntry(scopes);
|
| + CHECK(HasCacheEntry(client_scopes));
|
| + const CacheEntry* cache_entry = GetCacheEntry(client_scopes);
|
| scoped_ptr<RequestImpl> request(new RequestImpl(consumer));
|
| base::MessageLoop::current()->PostTask(FROM_HERE, base::Bind(
|
| &RequestImpl::InformConsumer,
|
| @@ -439,7 +449,10 @@ scoped_ptr<OAuth2TokenService::Request>
|
| void OAuth2TokenService::InvalidateToken(const ScopeSet& scopes,
|
| const std::string& invalid_token) {
|
| DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI));
|
| - RemoveCacheEntry(scopes, invalid_token);
|
| + RemoveCacheEntry(
|
| + ClientScopeSet(GaiaUrls::GetInstance()->oauth2_chrome_client_id(),
|
| + scopes),
|
| + invalid_token);
|
| }
|
|
|
| void OAuth2TokenService::OnFetchComplete(Fetcher* fetcher) {
|
| @@ -477,22 +490,24 @@ void OAuth2TokenService::OnFetchComplete(Fetcher* fetcher) {
|
| // Then by (3), |fetcher_| is mapped to its refresh token and ScopeSet.
|
| std::map<FetchParameters, Fetcher*>::iterator iter =
|
| pending_fetchers_.find(std::make_pair(
|
| - fetcher->GetRefreshToken(), fetcher->GetScopeSet()));
|
| + std::make_pair(fetcher->GetClientId(),
|
| + fetcher->GetRefreshToken()),
|
| + fetcher->GetScopeSet()));
|
| DCHECK(iter != pending_fetchers_.end());
|
| DCHECK_EQ(fetcher, iter->second);
|
| pending_fetchers_.erase(iter);
|
| }
|
|
|
| bool OAuth2TokenService::HasCacheEntry(
|
| - const OAuth2TokenService::ScopeSet& scopes) {
|
| - const CacheEntry* cache_entry = GetCacheEntry(scopes);
|
| + const ClientScopeSet& client_scopes) {
|
| + const CacheEntry* cache_entry = GetCacheEntry(client_scopes);
|
| return cache_entry && cache_entry->access_token.length();
|
| }
|
|
|
| const OAuth2TokenService::CacheEntry* OAuth2TokenService::GetCacheEntry(
|
| - const OAuth2TokenService::ScopeSet& scopes) {
|
| + const ClientScopeSet& client_scopes) {
|
| DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI));
|
| - TokenCache::iterator token_iterator = token_cache_.find(scopes);
|
| + TokenCache::iterator token_iterator = token_cache_.find(client_scopes);
|
| if (token_iterator == token_cache_.end())
|
| return NULL;
|
| if (token_iterator->second.expiration_date <= base::Time::Now()) {
|
| @@ -503,10 +518,10 @@ const OAuth2TokenService::CacheEntry* OAuth2TokenService::GetCacheEntry(
|
| }
|
|
|
| bool OAuth2TokenService::RemoveCacheEntry(
|
| - const OAuth2TokenService::ScopeSet& scopes,
|
| + const ClientScopeSet& client_scopes,
|
| const std::string& token_to_remove) {
|
| DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI));
|
| - TokenCache::iterator token_iterator = token_cache_.find(scopes);
|
| + TokenCache::iterator token_iterator = token_cache_.find(client_scopes);
|
| if (token_iterator != token_cache_.end() &&
|
| token_iterator->second.access_token == token_to_remove) {
|
| token_cache_.erase(token_iterator);
|
| @@ -516,13 +531,14 @@ bool OAuth2TokenService::RemoveCacheEntry(
|
| }
|
|
|
| void OAuth2TokenService::RegisterCacheEntry(
|
| + const std::string& client_id,
|
| const std::string& refresh_token,
|
| const OAuth2TokenService::ScopeSet& scopes,
|
| const std::string& access_token,
|
| const base::Time& expiration_date) {
|
| DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI));
|
|
|
| - CacheEntry& token = token_cache_[scopes];
|
| + CacheEntry& token = token_cache_[ClientScopeSet(client_id, scopes)];
|
| token.access_token = access_token;
|
| token.expiration_date = expiration_date;
|
| }
|
| @@ -554,7 +570,7 @@ void OAuth2TokenService::CancelRequestsForToken(
|
| pending_fetchers_.begin();
|
| iter != pending_fetchers_.end();
|
| ++iter) {
|
| - if (iter->first.first == refresh_token)
|
| + if (iter->first.first.second == refresh_token)
|
| fetchers_to_cancel.push_back(iter->second);
|
| }
|
| CancelFetchers(fetchers_to_cancel);
|
|
|