Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(305)

Side by Side Diff: chrome/browser/signin/oauth2_token_service.cc

Issue 23382008: Making OAuth2TokenService multi-login aware, updating callers, minor fixes (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Addressing CR comments. Created 7 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright 2012 The Chromium Authors. All rights reserved. 1 // Copyright 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "chrome/browser/signin/oauth2_token_service.h" 5 #include "chrome/browser/signin/oauth2_token_service.h"
6 6
7 #include <vector> 7 #include <vector>
8 8
9 #include "base/bind.h" 9 #include "base/bind.h"
10 #include "base/memory/weak_ptr.h" 10 #include "base/memory/weak_ptr.h"
(...skipping 61 matching lines...) Expand 10 before | Expand all | Expand 10 after
72 // with error). 72 // with error).
73 class OAuth2TokenService::Fetcher : public OAuth2AccessTokenConsumer { 73 class OAuth2TokenService::Fetcher : public OAuth2AccessTokenConsumer {
74 public: 74 public:
75 // Creates a Fetcher and starts fetching an OAuth2 access token for 75 // Creates a Fetcher and starts fetching an OAuth2 access token for
76 // |refresh_token| and |scopes| in the request context obtained by |getter|. 76 // |refresh_token| and |scopes| in the request context obtained by |getter|.
77 // The given |oauth2_token_service| will be informed when fetching is done. 77 // The given |oauth2_token_service| will be informed when fetching is done.
78 static Fetcher* CreateAndStart(OAuth2TokenService* oauth2_token_service, 78 static Fetcher* CreateAndStart(OAuth2TokenService* oauth2_token_service,
79 net::URLRequestContextGetter* getter, 79 net::URLRequestContextGetter* getter,
80 const std::string& chrome_client_id, 80 const std::string& chrome_client_id,
81 const std::string& chrome_client_secret, 81 const std::string& chrome_client_secret,
82 const std::string& account_id,
82 const std::string& refresh_token, 83 const std::string& refresh_token,
83 const OAuth2TokenService::ScopeSet& scopes, 84 const OAuth2TokenService::ScopeSet& scopes,
84 base::WeakPtr<RequestImpl> waiting_request); 85 base::WeakPtr<RequestImpl> waiting_request);
85 virtual ~Fetcher(); 86 virtual ~Fetcher();
86 87
87 // Add a request that is waiting for the result of this Fetcher. 88 // Add a request that is waiting for the result of this Fetcher.
88 void AddWaitingRequest(base::WeakPtr<RequestImpl> waiting_request); 89 void AddWaitingRequest(base::WeakPtr<RequestImpl> waiting_request);
89 90
90 void Cancel(); 91 void Cancel();
91 92
92 const OAuth2TokenService::ScopeSet& GetScopeSet() const; 93 const OAuth2TokenService::ScopeSet& GetScopeSet() const;
93 const std::string& GetRefreshToken() const; 94 const std::string& GetRefreshToken() const;
95 const std::string& GetAccountId() const;
94 96
95 // The error result from this fetcher. 97 // The error result from this fetcher.
96 const GoogleServiceAuthError& error() const { return error_; } 98 const GoogleServiceAuthError& error() const { return error_; }
97 99
98 protected: 100 protected:
99 // OAuth2AccessTokenConsumer 101 // OAuth2AccessTokenConsumer
100 virtual void OnGetTokenSuccess(const std::string& access_token, 102 virtual void OnGetTokenSuccess(const std::string& access_token,
101 const base::Time& expiration_date) OVERRIDE; 103 const base::Time& expiration_date) OVERRIDE;
102 virtual void OnGetTokenFailure(const GoogleServiceAuthError& error) OVERRIDE; 104 virtual void OnGetTokenFailure(const GoogleServiceAuthError& error) OVERRIDE;
103 105
104 private: 106 private:
105 Fetcher(OAuth2TokenService* oauth2_token_service, 107 Fetcher(OAuth2TokenService* oauth2_token_service,
106 net::URLRequestContextGetter* getter, 108 net::URLRequestContextGetter* getter,
107 const std::string& chrome_client_id, 109 const std::string& chrome_client_id,
108 const std::string& chrome_client_secret, 110 const std::string& chrome_client_secret,
111 const std::string& account_id,
109 const std::string& refresh_token, 112 const std::string& refresh_token,
110 const OAuth2TokenService::ScopeSet& scopes, 113 const OAuth2TokenService::ScopeSet& scopes,
111 base::WeakPtr<RequestImpl> waiting_request); 114 base::WeakPtr<RequestImpl> waiting_request);
112 void Start(); 115 void Start();
113 void InformWaitingRequests(); 116 void InformWaitingRequests();
114 void InformWaitingRequestsAndDelete(); 117 void InformWaitingRequestsAndDelete();
115 static bool ShouldRetry(const GoogleServiceAuthError& error); 118 static bool ShouldRetry(const GoogleServiceAuthError& error);
116 int64 ComputeExponentialBackOffMilliseconds(int retry_num); 119 int64 ComputeExponentialBackOffMilliseconds(int retry_num);
117 120
118 // |oauth2_token_service_| remains valid for the life of this Fetcher, since 121 // |oauth2_token_service_| remains valid for the life of this Fetcher, since
119 // this Fetcher is destructed in the dtor of the OAuth2TokenService or is 122 // this Fetcher is destructed in the dtor of the OAuth2TokenService or is
120 // scheduled for deletion at the end of OnGetTokenFailure/OnGetTokenSuccess 123 // scheduled for deletion at the end of OnGetTokenFailure/OnGetTokenSuccess
121 // (whichever comes first). 124 // (whichever comes first).
122 OAuth2TokenService* const oauth2_token_service_; 125 OAuth2TokenService* const oauth2_token_service_;
123 scoped_refptr<net::URLRequestContextGetter> getter_; 126 scoped_refptr<net::URLRequestContextGetter> getter_;
127 const std::string account_id_;
124 const std::string refresh_token_; 128 const std::string refresh_token_;
125 const OAuth2TokenService::ScopeSet scopes_; 129 const OAuth2TokenService::ScopeSet scopes_;
126 std::vector<base::WeakPtr<RequestImpl> > waiting_requests_; 130 std::vector<base::WeakPtr<RequestImpl> > waiting_requests_;
127 131
128 int retry_number_; 132 int retry_number_;
129 base::OneShotTimer<OAuth2TokenService::Fetcher> retry_timer_; 133 base::OneShotTimer<OAuth2TokenService::Fetcher> retry_timer_;
130 scoped_ptr<OAuth2AccessTokenFetcher> fetcher_; 134 scoped_ptr<OAuth2AccessTokenFetcher> fetcher_;
131 135
132 // Variables that store fetch results. 136 // Variables that store fetch results.
133 // Initialized to be GoogleServiceAuthError::SERVICE_UNAVAILABLE to handle 137 // Initialized to be GoogleServiceAuthError::SERVICE_UNAVAILABLE to handle
134 // destruction. 138 // destruction.
135 GoogleServiceAuthError error_; 139 GoogleServiceAuthError error_;
136 std::string access_token_; 140 std::string access_token_;
137 base::Time expiration_date_; 141 base::Time expiration_date_;
138 // OAuth2 client id and secret. 142 // OAuth2 client id and secret.
139 std::string chrome_client_id_; 143 std::string chrome_client_id_;
140 std::string chrome_client_secret_; 144 std::string chrome_client_secret_;
141 145
142 DISALLOW_COPY_AND_ASSIGN(Fetcher); 146 DISALLOW_COPY_AND_ASSIGN(Fetcher);
143 }; 147 };
144 148
145 // static 149 // static
146 OAuth2TokenService::Fetcher* OAuth2TokenService::Fetcher::CreateAndStart( 150 OAuth2TokenService::Fetcher* OAuth2TokenService::Fetcher::CreateAndStart(
147 OAuth2TokenService* oauth2_token_service, 151 OAuth2TokenService* oauth2_token_service,
148 net::URLRequestContextGetter* getter, 152 net::URLRequestContextGetter* getter,
149 const std::string& chrome_client_id, 153 const std::string& chrome_client_id,
150 const std::string& chrome_client_secret, 154 const std::string& chrome_client_secret,
155 const std::string& account_id,
151 const std::string& refresh_token, 156 const std::string& refresh_token,
152 const OAuth2TokenService::ScopeSet& scopes, 157 const OAuth2TokenService::ScopeSet& scopes,
153 base::WeakPtr<RequestImpl> waiting_request) { 158 base::WeakPtr<RequestImpl> waiting_request) {
154 OAuth2TokenService::Fetcher* fetcher = new Fetcher( 159 OAuth2TokenService::Fetcher* fetcher = new Fetcher(
155 oauth2_token_service, 160 oauth2_token_service,
156 getter, 161 getter,
157 chrome_client_id, 162 chrome_client_id,
158 chrome_client_secret, 163 chrome_client_secret,
164 account_id,
159 refresh_token, 165 refresh_token,
160 scopes, 166 scopes,
161 waiting_request); 167 waiting_request);
162 fetcher->Start(); 168 fetcher->Start();
163 return fetcher; 169 return fetcher;
164 } 170 }
165 171
166 OAuth2TokenService::Fetcher::Fetcher( 172 OAuth2TokenService::Fetcher::Fetcher(
167 OAuth2TokenService* oauth2_token_service, 173 OAuth2TokenService* oauth2_token_service,
168 net::URLRequestContextGetter* getter, 174 net::URLRequestContextGetter* getter,
169 const std::string& chrome_client_id, 175 const std::string& chrome_client_id,
170 const std::string& chrome_client_secret, 176 const std::string& chrome_client_secret,
177 const std::string& account_id,
171 const std::string& refresh_token, 178 const std::string& refresh_token,
172 const OAuth2TokenService::ScopeSet& scopes, 179 const OAuth2TokenService::ScopeSet& scopes,
173 base::WeakPtr<RequestImpl> waiting_request) 180 base::WeakPtr<RequestImpl> waiting_request)
174 : oauth2_token_service_(oauth2_token_service), 181 : oauth2_token_service_(oauth2_token_service),
175 getter_(getter), 182 getter_(getter),
183 account_id_(account_id),
176 refresh_token_(refresh_token), 184 refresh_token_(refresh_token),
177 scopes_(scopes), 185 scopes_(scopes),
178 retry_number_(0), 186 retry_number_(0),
179 error_(GoogleServiceAuthError::SERVICE_UNAVAILABLE), 187 error_(GoogleServiceAuthError::SERVICE_UNAVAILABLE),
180 chrome_client_id_(chrome_client_id), 188 chrome_client_id_(chrome_client_id),
181 chrome_client_secret_(chrome_client_secret) { 189 chrome_client_secret_(chrome_client_secret) {
182 DCHECK(oauth2_token_service_); 190 DCHECK(oauth2_token_service_);
183 DCHECK(getter_.get()); 191 DCHECK(getter_.get());
184 DCHECK(refresh_token_.length()); 192 DCHECK(refresh_token_.length());
185 waiting_requests_.push_back(waiting_request); 193 waiting_requests_.push_back(waiting_request);
(...skipping 106 matching lines...) Expand 10 before | Expand all | Expand 10 after
292 300
293 const OAuth2TokenService::ScopeSet& OAuth2TokenService::Fetcher::GetScopeSet() 301 const OAuth2TokenService::ScopeSet& OAuth2TokenService::Fetcher::GetScopeSet()
294 const { 302 const {
295 return scopes_; 303 return scopes_;
296 } 304 }
297 305
298 const std::string& OAuth2TokenService::Fetcher::GetRefreshToken() const { 306 const std::string& OAuth2TokenService::Fetcher::GetRefreshToken() const {
299 return refresh_token_; 307 return refresh_token_;
300 } 308 }
301 309
310 const std::string& OAuth2TokenService::Fetcher::GetAccountId() const {
311 return account_id_;
312 }
313
302 OAuth2TokenService::Request::Request() { 314 OAuth2TokenService::Request::Request() {
303 } 315 }
304 316
305 OAuth2TokenService::Request::~Request() { 317 OAuth2TokenService::Request::~Request() {
306 } 318 }
307 319
308 OAuth2TokenService::Consumer::Consumer() { 320 OAuth2TokenService::Consumer::Consumer() {
309 } 321 }
310 322
311 OAuth2TokenService::Consumer::~Consumer() { 323 OAuth2TokenService::Consumer::~Consumer() {
312 } 324 }
313 325
314 OAuth2TokenService::OAuth2TokenService() { 326 OAuth2TokenService::OAuth2TokenService() {
315 } 327 }
316 328
317 OAuth2TokenService::~OAuth2TokenService() { 329 OAuth2TokenService::~OAuth2TokenService() {
318 // Release all the pending fetchers. 330 // Release all the pending fetchers.
319 STLDeleteContainerPairSecondPointers( 331 STLDeleteContainerPairSecondPointers(
320 pending_fetchers_.begin(), pending_fetchers_.end()); 332 pending_fetchers_.begin(), pending_fetchers_.end());
321 } 333 }
322 334
323 void OAuth2TokenService::AddObserver(Observer* observer) { 335 void OAuth2TokenService::AddObserver(Observer* observer) {
324 observer_list_.AddObserver(observer); 336 observer_list_.AddObserver(observer);
325 } 337 }
326 338
327 void OAuth2TokenService::RemoveObserver(Observer* observer) { 339 void OAuth2TokenService::RemoveObserver(Observer* observer) {
328 observer_list_.RemoveObserver(observer); 340 observer_list_.RemoveObserver(observer);
329 } 341 }
330 342
331 bool OAuth2TokenService::RefreshTokenIsAvailable() { 343 bool OAuth2TokenService::RefreshTokenIsAvailable(
332 return !GetRefreshToken().empty(); 344 const std::string& account_id) {
345 DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI));
346 return !GetRefreshToken(account_id).empty();
333 } 347 }
334 348
335 scoped_ptr<OAuth2TokenService::Request> OAuth2TokenService::StartRequest( 349 scoped_ptr<OAuth2TokenService::Request> OAuth2TokenService::StartRequest(
350 const std::string& account_id,
336 const OAuth2TokenService::ScopeSet& scopes, 351 const OAuth2TokenService::ScopeSet& scopes,
337 OAuth2TokenService::Consumer* consumer) { 352 OAuth2TokenService::Consumer* consumer) {
338 return StartRequestForClientWithContext( 353 return StartRequestForClientWithContext(
354 account_id,
339 GetRequestContext(), 355 GetRequestContext(),
340 GaiaUrls::GetInstance()->oauth2_chrome_client_id(), 356 GaiaUrls::GetInstance()->oauth2_chrome_client_id(),
341 GaiaUrls::GetInstance()->oauth2_chrome_client_secret(), 357 GaiaUrls::GetInstance()->oauth2_chrome_client_secret(),
342 scopes, 358 scopes,
343 consumer); 359 consumer);
344 } 360 }
345 361
346 scoped_ptr<OAuth2TokenService::Request> 362 scoped_ptr<OAuth2TokenService::Request>
347 OAuth2TokenService::StartRequestForClient( 363 OAuth2TokenService::StartRequestForClient(
364 const std::string& account_id,
348 const std::string& client_id, 365 const std::string& client_id,
349 const std::string& client_secret, 366 const std::string& client_secret,
350 const OAuth2TokenService::ScopeSet& scopes, 367 const OAuth2TokenService::ScopeSet& scopes,
351 OAuth2TokenService::Consumer* consumer) { 368 OAuth2TokenService::Consumer* consumer) {
352 return StartRequestForClientWithContext( 369 return StartRequestForClientWithContext(
370 account_id,
353 GetRequestContext(), 371 GetRequestContext(),
354 client_id, 372 client_id,
355 client_secret, 373 client_secret,
356 scopes, 374 scopes,
357 consumer); 375 consumer);
358 } 376 }
359 377
360 scoped_ptr<OAuth2TokenService::Request> 378 scoped_ptr<OAuth2TokenService::Request>
361 OAuth2TokenService::StartRequestWithContext( 379 OAuth2TokenService::StartRequestWithContext(
380 const std::string& account_id,
362 net::URLRequestContextGetter* getter, 381 net::URLRequestContextGetter* getter,
363 const ScopeSet& scopes, 382 const ScopeSet& scopes,
364 Consumer* consumer) { 383 Consumer* consumer) {
365 return StartRequestForClientWithContext( 384 return StartRequestForClientWithContext(
385 account_id,
366 getter, 386 getter,
367 GaiaUrls::GetInstance()->oauth2_chrome_client_id(), 387 GaiaUrls::GetInstance()->oauth2_chrome_client_id(),
368 GaiaUrls::GetInstance()->oauth2_chrome_client_secret(), 388 GaiaUrls::GetInstance()->oauth2_chrome_client_secret(),
369 scopes, 389 scopes,
370 consumer); 390 consumer);
371 } 391 }
372 392
373 scoped_ptr<OAuth2TokenService::Request> 393 scoped_ptr<OAuth2TokenService::Request>
374 OAuth2TokenService::StartRequestForClientWithContext( 394 OAuth2TokenService::StartRequestForClientWithContext(
395 const std::string& account_id,
375 net::URLRequestContextGetter* getter, 396 net::URLRequestContextGetter* getter,
376 const std::string& client_id, 397 const std::string& client_id,
377 const std::string& client_secret, 398 const std::string& client_secret,
378 const ScopeSet& scopes, 399 const ScopeSet& scopes,
379 Consumer* consumer) { 400 Consumer* consumer) {
380 DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI)); 401 DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI));
381 402
382 scoped_ptr<RequestImpl> request(new RequestImpl(consumer)); 403 scoped_ptr<RequestImpl> request(new RequestImpl(consumer));
383 404
384 if (!RefreshTokenIsAvailable()) { 405 if (!RefreshTokenIsAvailable(account_id)) {
385 base::MessageLoop::current()->PostTask(FROM_HERE, base::Bind( 406 base::MessageLoop::current()->PostTask(FROM_HERE, base::Bind(
386 &RequestImpl::InformConsumer, 407 &RequestImpl::InformConsumer,
387 request->AsWeakPtr(), 408 request->AsWeakPtr(),
388 GoogleServiceAuthError(GoogleServiceAuthError::USER_NOT_SIGNED_UP), 409 GoogleServiceAuthError(GoogleServiceAuthError::USER_NOT_SIGNED_UP),
389 std::string(), 410 std::string(),
390 base::Time())); 411 base::Time()));
391 return request.PassAs<Request>(); 412 return request.PassAs<Request>();
392 } 413 }
393 414
394 if (HasCacheEntry(scopes)) { 415 if (HasCacheEntry(scopes)) {
395 StartCacheLookupRequest(request.get(), scopes, consumer); 416 StartCacheLookupRequest(request.get(), scopes, consumer);
396 } else { 417 } else {
397 FetchOAuth2Token(request.get(), 418 FetchOAuth2Token(request.get(),
419 account_id,
398 getter, 420 getter,
399 client_id, 421 client_id,
400 client_secret, 422 client_secret,
401 scopes); 423 scopes);
402 } 424 }
403 return request.PassAs<Request>(); 425 return request.PassAs<Request>();
404 } 426 }
405 427
406 void OAuth2TokenService::FetchOAuth2Token(RequestImpl* request, 428 void OAuth2TokenService::FetchOAuth2Token(RequestImpl* request,
429 const std::string& account_id,
407 net::URLRequestContextGetter* getter, 430 net::URLRequestContextGetter* getter,
408 const std::string& client_id, 431 const std::string& client_id,
409 const std::string& client_secret, 432 const std::string& client_secret,
410 const ScopeSet& scopes) { 433 const ScopeSet& scopes) {
411 std::string refresh_token = GetRefreshToken(); 434 std::string refresh_token = GetRefreshToken(account_id);
412 435
413 // If there is already a pending fetcher for |scopes| and |refresh_token|, 436 // If there is already a pending fetcher for |scopes| and |refresh_token|,
414 // simply register this |request| for those results rather than starting 437 // simply register this |request| for those results rather than starting
415 // a new fetcher. 438 // a new fetcher.
416 FetchParameters fetch_parameters = std::make_pair(refresh_token, scopes); 439 FetchParameters fetch_parameters = std::make_pair(refresh_token, scopes);
417 std::map<FetchParameters, Fetcher*>::iterator iter = 440 std::map<FetchParameters, Fetcher*>::iterator iter =
418 pending_fetchers_.find(fetch_parameters); 441 pending_fetchers_.find(fetch_parameters);
419 if (iter != pending_fetchers_.end()) { 442 if (iter != pending_fetchers_.end()) {
420 iter->second->AddWaitingRequest(request->AsWeakPtr()); 443 iter->second->AddWaitingRequest(request->AsWeakPtr());
421 return; 444 return;
422 } 445 }
423 446
424 pending_fetchers_[fetch_parameters] = 447 pending_fetchers_[fetch_parameters] =
425 Fetcher::CreateAndStart(this, 448 Fetcher::CreateAndStart(this,
426 getter, 449 getter,
427 client_id, 450 client_id,
428 client_secret, 451 client_secret,
452 account_id,
429 refresh_token, 453 refresh_token,
430 scopes, 454 scopes,
431 request->AsWeakPtr()); 455 request->AsWeakPtr());
432 } 456 }
433 457
434 void OAuth2TokenService::StartCacheLookupRequest( 458 void OAuth2TokenService::StartCacheLookupRequest(
435 RequestImpl* request, 459 RequestImpl* request,
436 const OAuth2TokenService::ScopeSet& scopes, 460 const OAuth2TokenService::ScopeSet& scopes,
437 OAuth2TokenService::Consumer* consumer) { 461 OAuth2TokenService::Consumer* consumer) {
438 CHECK(HasCacheEntry(scopes)); 462 CHECK(HasCacheEntry(scopes));
(...skipping 10 matching lines...) Expand all
449 const std::string& invalid_token) { 473 const std::string& invalid_token) {
450 DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI)); 474 DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI));
451 RemoveCacheEntry(scopes, invalid_token); 475 RemoveCacheEntry(scopes, invalid_token);
452 } 476 }
453 477
454 void OAuth2TokenService::OnFetchComplete(Fetcher* fetcher) { 478 void OAuth2TokenService::OnFetchComplete(Fetcher* fetcher) {
455 DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI)); 479 DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI));
456 480
457 // Update the auth error state so auth errors are appropriately communicated 481 // Update the auth error state so auth errors are appropriately communicated
458 // to the user. 482 // to the user.
459 UpdateAuthError(fetcher->error()); 483 UpdateAuthError(fetcher->GetAccountId(), fetcher->error());
460 484
461 // Note |fetcher| is recorded in |pending_fetcher_| mapped to its refresh 485 // Note |fetcher| is recorded in |pending_fetcher_| mapped to its refresh
462 // token and scope set. This is guaranteed as follows; here a Fetcher is said 486 // token and scope set. This is guaranteed as follows; here a Fetcher is said
463 // to be uncompleted if it has not finished calling back 487 // to be uncompleted if it has not finished calling back
464 // OAuth2TokenService::OnFetchComplete(). 488 // OAuth2TokenService::OnFetchComplete().
465 // 489 //
466 // (1) All the live Fetchers are created by this service. 490 // (1) All the live Fetchers are created by this service.
467 // This is because (1) all the live Fetchers are created by a live 491 // This is because (1) all the live Fetchers are created by a live
468 // service, as all the fetchers created by a service are destructed in the 492 // service, as all the fetchers created by a service are destructed in the
469 // service's dtor. 493 // service's dtor.
(...skipping 17 matching lines...) Expand all
487 std::map<FetchParameters, Fetcher*>::iterator iter = 511 std::map<FetchParameters, Fetcher*>::iterator iter =
488 pending_fetchers_.find(std::make_pair( 512 pending_fetchers_.find(std::make_pair(
489 fetcher->GetRefreshToken(), fetcher->GetScopeSet())); 513 fetcher->GetRefreshToken(), fetcher->GetScopeSet()));
490 DCHECK(iter != pending_fetchers_.end()); 514 DCHECK(iter != pending_fetchers_.end());
491 DCHECK_EQ(fetcher, iter->second); 515 DCHECK_EQ(fetcher, iter->second);
492 pending_fetchers_.erase(iter); 516 pending_fetchers_.erase(iter);
493 } 517 }
494 518
495 bool OAuth2TokenService::HasCacheEntry( 519 bool OAuth2TokenService::HasCacheEntry(
496 const OAuth2TokenService::ScopeSet& scopes) { 520 const OAuth2TokenService::ScopeSet& scopes) {
521 // TODO(fgorski): Update keying of the cache to include account_id.
497 const CacheEntry* cache_entry = GetCacheEntry(scopes); 522 const CacheEntry* cache_entry = GetCacheEntry(scopes);
498 return cache_entry && cache_entry->access_token.length(); 523 return cache_entry && cache_entry->access_token.length();
499 } 524 }
500 525
501 const OAuth2TokenService::CacheEntry* OAuth2TokenService::GetCacheEntry( 526 const OAuth2TokenService::CacheEntry* OAuth2TokenService::GetCacheEntry(
502 const OAuth2TokenService::ScopeSet& scopes) { 527 const OAuth2TokenService::ScopeSet& scopes) {
528 // TODO(fgorski): Update keying of the cache to include account_id.
503 DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI)); 529 DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI));
504 TokenCache::iterator token_iterator = token_cache_.find(scopes); 530 TokenCache::iterator token_iterator = token_cache_.find(scopes);
505 if (token_iterator == token_cache_.end()) 531 if (token_iterator == token_cache_.end())
506 return NULL; 532 return NULL;
507 if (token_iterator->second.expiration_date <= base::Time::Now()) { 533 if (token_iterator->second.expiration_date <= base::Time::Now()) {
508 token_cache_.erase(token_iterator); 534 token_cache_.erase(token_iterator);
509 return NULL; 535 return NULL;
510 } 536 }
511 return &token_iterator->second; 537 return &token_iterator->second;
512 } 538 }
513 539
514 bool OAuth2TokenService::RemoveCacheEntry( 540 bool OAuth2TokenService::RemoveCacheEntry(
515 const OAuth2TokenService::ScopeSet& scopes, 541 const OAuth2TokenService::ScopeSet& scopes,
516 const std::string& token_to_remove) { 542 const std::string& token_to_remove) {
543 // TODO(fgorski): Update keying of the cache to include account_id.
517 DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI)); 544 DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI));
518 TokenCache::iterator token_iterator = token_cache_.find(scopes); 545 TokenCache::iterator token_iterator = token_cache_.find(scopes);
519 if (token_iterator != token_cache_.end() && 546 if (token_iterator != token_cache_.end() &&
520 token_iterator->second.access_token == token_to_remove) { 547 token_iterator->second.access_token == token_to_remove) {
521 token_cache_.erase(token_iterator); 548 token_cache_.erase(token_iterator);
522 return true; 549 return true;
523 } 550 }
524 return false; 551 return false;
525 } 552 }
526 553
527 void OAuth2TokenService::RegisterCacheEntry( 554 void OAuth2TokenService::RegisterCacheEntry(
528 const std::string& refresh_token, 555 const std::string& refresh_token,
529 const OAuth2TokenService::ScopeSet& scopes, 556 const OAuth2TokenService::ScopeSet& scopes,
530 const std::string& access_token, 557 const std::string& access_token,
531 const base::Time& expiration_date) { 558 const base::Time& expiration_date) {
559 // TODO(fgorski): Update keying of the cache to include account_id.
532 DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI)); 560 DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI));
533 561
534 CacheEntry& token = token_cache_[scopes]; 562 CacheEntry& token = token_cache_[scopes];
535 token.access_token = access_token; 563 token.access_token = access_token;
536 token.expiration_date = expiration_date; 564 token.expiration_date = expiration_date;
537 } 565 }
538 566
539 void OAuth2TokenService::UpdateAuthError(const GoogleServiceAuthError& error) { 567 void OAuth2TokenService::UpdateAuthError(
568 const std::string& account_id,
569 const GoogleServiceAuthError& error) {
540 // Default implementation does nothing. 570 // Default implementation does nothing.
541 } 571 }
542 572
543 void OAuth2TokenService::ClearCache() { 573 void OAuth2TokenService::ClearCache() {
544 DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI)); 574 DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI));
545 token_cache_.clear(); 575 token_cache_.clear();
546 } 576 }
547 577
548 void OAuth2TokenService::CancelAllRequests() { 578 void OAuth2TokenService::CancelAllRequests() {
549 std::vector<Fetcher*> fetchers_to_cancel; 579 std::vector<Fetcher*> fetchers_to_cancel;
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after
588 void OAuth2TokenService::FireRefreshTokenRevoked( 618 void OAuth2TokenService::FireRefreshTokenRevoked(
589 const std::string& account_id) { 619 const std::string& account_id) {
590 FOR_EACH_OBSERVER(Observer, observer_list_, 620 FOR_EACH_OBSERVER(Observer, observer_list_,
591 OnRefreshTokenRevoked(account_id)); 621 OnRefreshTokenRevoked(account_id));
592 } 622 }
593 623
594 void OAuth2TokenService::FireRefreshTokensLoaded() { 624 void OAuth2TokenService::FireRefreshTokensLoaded() {
595 FOR_EACH_OBSERVER(Observer, observer_list_, OnRefreshTokensLoaded()); 625 FOR_EACH_OBSERVER(Observer, observer_list_, OnRefreshTokensLoaded());
596 } 626 }
597 627
598 void OAuth2TokenService::FireRefreshTokensCleared() {
599 FOR_EACH_OBSERVER(Observer, observer_list_, OnRefreshTokensCleared());
600 }
601
602 int OAuth2TokenService::cache_size_for_testing() const { 628 int OAuth2TokenService::cache_size_for_testing() const {
603 return token_cache_.size(); 629 return token_cache_.size();
604 } 630 }
605 631
606 void OAuth2TokenService::set_max_authorization_token_fetch_retries_for_testing( 632 void OAuth2TokenService::set_max_authorization_token_fetch_retries_for_testing(
607 int max_retries) { 633 int max_retries) {
608 DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI)); 634 DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI));
609 max_fetch_retry_num_ = max_retries; 635 max_fetch_retry_num_ = max_retries;
610 } 636 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698