Index: chrome/browser/signin/oauth2_token_service.h |
diff --git a/chrome/browser/signin/oauth2_token_service.h b/chrome/browser/signin/oauth2_token_service.h |
index 71ddcb27944c21cc1ce3fbdd59517131e8e6149f..9260f4179fae0ee9cdcb7d250ff90b577a074417 100644 |
--- a/chrome/browser/signin/oauth2_token_service.h |
+++ b/chrome/browser/signin/oauth2_token_service.h |
@@ -9,23 +9,27 @@ |
#include <set> |
#include <string> |
+#include "base/basictypes.h" |
#include "base/memory/ref_counted.h" |
#include "base/memory/scoped_ptr.h" |
#include "base/memory/weak_ptr.h" |
#include "base/time.h" |
-#include "chrome/browser/profiles/profile_keyed_service.h" |
-#include "chrome/browser/signin/signin_global_error.h" |
-#include "content/public/browser/notification_observer.h" |
-#include "content/public/browser/notification_registrar.h" |
-#include "net/url_request/url_request_context_getter.h" |
+ |
+namespace base { |
+class Time; |
+} |
+ |
+namespace net { |
+class URLRequestContextGetter; |
+} |
class GoogleServiceAuthError; |
-class OAuth2AccessTokenConsumer; |
-class Profile; |
-// OAuth2TokenService is a ProfileKeyedService that retrieves OAuth2 access |
-// tokens for a given set of scopes using the OAuth2 refresh token maintained by |
-// TokenService. All calls are expected from the UI thread. |
+// Abstract base class for a service that fetches and caches OAuth2 access |
+// tokens. Concrete subclasses should implement GetRefreshToken to return |
+// the appropriate refresh token. |
+// |
+// All calls are expected from the UI thread. |
// |
// To use this service, call StartRequest() with a given set of scopes and a |
// consumer of the request results. The consumer is required to outlive the |
@@ -43,12 +47,7 @@ class Profile; |
// |
// The caller of StartRequest() owns the returned request and is responsible to |
// delete the request even once the callback has been invoked. |
-// |
-// Note the request should be started from the UI thread. To start a request |
-// from other thread, please use OAuth2TokenServiceRequest. |
-class OAuth2TokenService : public content::NotificationObserver, |
- public SigninGlobalError::AuthStatusProvider, |
- public ProfileKeyedService { |
+class OAuth2TokenService { |
public: |
// Class representing a request that fetches an OAuth2 access token. |
class Request { |
@@ -76,58 +75,90 @@ class OAuth2TokenService : public content::NotificationObserver, |
// A set of scopes in OAuth2 authentication. |
typedef std::set<std::string> ScopeSet; |
- OAuth2TokenService(); |
+ explicit OAuth2TokenService(net::URLRequestContextGetter* getter); |
virtual ~OAuth2TokenService(); |
- // Initializes this token service with the profile. |
- void Initialize(Profile* profile); |
- |
- // ProfileKeyedService implementation. |
- virtual void Shutdown() OVERRIDE; |
- |
- // Starts a request for an OAuth2 access token using the OAuth2 refresh token |
- // maintained by TokenService. The caller owns the returned Request. |scopes| |
- // is the set of scopes to get an access token for, |consumer| is the object |
- // that will be called back with results if the returned request is not |
- // deleted. |
- // Note the refresh token has been collected from TokenService when this |
- // method returns, and the request can continue even if TokenService clears |
- // its tokens after this method returns. This means that outstanding |
- // StartRequest actions will still complete even if the user signs out in the |
- // meantime. |
- virtual scoped_ptr<Request> StartRequest( |
- const ScopeSet& scopes, |
- OAuth2TokenService::Consumer* consumer); |
+ // Checks in the cache for a valid access token, and if not found starts |
+ // a request for an OAuth2 access token using the OAuth2 refresh token |
+ // maintained by this instance. The caller owns the returned Request. |
+ // |scopes| is the set of scopes to get an access token for, |consumer| is |
+ // the object that will be called back with results if the returned request |
+ // is not deleted. |
+ virtual scoped_ptr<Request> StartRequest(const ScopeSet& scopes, |
+ Consumer* consumer); |
+ |
+ // Returns true if a refresh token exists. If false, calls to |
+ // |StartRequest| will result in a Consumer::OnGetTokenFailure callback. |
+ bool RefreshTokenIsAvailable(); |
// Mark an OAuth2 access token as invalid. This should be done if the token |
// was received from this class, but was not accepted by the server (e.g., |
// the server returned 401 Unauthorized). The token will be removed from the |
// cache for the given scopes. |
- void InvalidateToken(const ScopeSet& scopes, |
- const std::string& invalid_token); |
- |
- // content::NotificationObserver |
- virtual void Observe(int type, |
- const content::NotificationSource& source, |
- const content::NotificationDetails& details) OVERRIDE; |
+ virtual void InvalidateToken(const ScopeSet& scopes, |
+ const std::string& invalid_token); |
+ |
+ // Return the current number of entries in the cache. |
+ int cache_size_for_testing() const; |
+ |
+ protected: |
+ // Subclasses should return the refresh token maintained. |
+ // If no token is available, return an empty string. |
+ virtual std::string GetRefreshToken() = 0; |
+ |
+ // Subclasses can override if they want to report errors to the user. |
+ virtual void UpdateAuthError(const GoogleServiceAuthError& error); |
+ |
+ // Add a new entry to the cache. |
+ // Subclasses can override if there are implementation-specific reasons |
+ // that an access token should ever not be cached. |
+ virtual void RegisterCacheEntry(const std::string& refresh_token, |
+ const ScopeSet& scopes, |
+ const std::string& access_token, |
+ const base::Time& expiration_date); |
+ |
+ // Returns true if GetCacheEntry would return a valid cache entry for the |
+ // given scopes. |
+ bool HasCacheEntry(const ScopeSet& scopes); |
+ |
+ // Posts a task to fire the Consumer callback with the cached token. Must |
+ // only be called if HasCacheEntry() returns true. |
+ scoped_ptr<Request> StartCacheLookupRequest(const ScopeSet& scopes, |
+ Consumer* consumer); |
+ |
+ // Clears the internal token cache. |
+ void ClearCache(); |
+ |
+ // Implements a cancelable |OAuth2TokenService::Request|, which should be |
+ // operated on the UI thread. |
+ class RequestImpl : public base::SupportsWeakPtr<RequestImpl>, |
+ public Request { |
+ public: |
+ // |consumer| is required to outlive this. |
+ explicit RequestImpl(Consumer* consumer); |
+ virtual ~RequestImpl(); |
+ |
+ // Informs |consumer_| that this request is completed. |
+ void InformConsumer(const GoogleServiceAuthError& error, |
+ const std::string& access_token, |
+ const base::Time& expiration_date); |
+ |
+ private: |
+ // |consumer_| to call back when this request completes. |
+ Consumer* const consumer_; |
+ }; |
- // SigninGlobalError::AuthStatusProvider implementation. |
- virtual GoogleServiceAuthError GetAuthStatus() const OVERRIDE; |
+ // Informs the consumer of |request| fetch results. |
+ static void InformConsumer(base::WeakPtr<RequestImpl> request, |
+ const GoogleServiceAuthError& error, |
+ const std::string& access_token, |
+ const base::Time& expiration_date); |
private: |
// Class that fetches an OAuth2 access token for a given set of scopes and |
// OAuth2 refresh token. |
class Fetcher; |
friend class Fetcher; |
- // Implementation of Request. |
- class RequestImpl; |
- |
- // Informs the consumer of |request| fetch results. |
- static void InformConsumer( |
- base::WeakPtr<OAuth2TokenService::RequestImpl> request, |
- const GoogleServiceAuthError& error, |
- const std::string& access_token, |
- const base::Time& expiration_date); |
// Struct that contains the information of an OAuth2 access token. |
struct CacheEntry { |
@@ -141,12 +172,6 @@ class OAuth2TokenService : public content::NotificationObserver, |
// returned entry is done. |
const CacheEntry* GetCacheEntry(const ScopeSet& scopes); |
- // Registers a new access token in the cache if |refresh_token| is the one |
- // currently held by TokenService. |
- void RegisterCacheEntry(const std::string& refresh_token, |
- const ScopeSet& scopes, |
- const std::string& access_token, |
- const base::Time& expiration_date); |
// Removes an access token for the given set of scopes from the cache. |
// Returns true if the entry was removed, otherwise false. |
@@ -157,18 +182,8 @@ class OAuth2TokenService : public content::NotificationObserver, |
// Called when |fetcher| finishes fetching. |
void OnFetchComplete(Fetcher* fetcher); |
- // Updates the internal cache of the result from the most-recently-completed |
- // auth request (used for reporting errors to the user). |
- void UpdateAuthError(const GoogleServiceAuthError& error); |
- |
- // The profile with which this instance was initialized, or NULL. |
- Profile* profile_; |
- |
- // The auth status from the most-recently-completed request. |
- GoogleServiceAuthError last_auth_error_; |
- |
// Getter to use for fetchers. |
- scoped_refptr<net::URLRequestContextGetter> getter_; |
+ scoped_refptr<net::URLRequestContextGetter> request_context_getter_; |
// The cache of currently valid tokens. |
typedef std::map<ScopeSet, CacheEntry> TokenCache; |
@@ -181,9 +196,6 @@ class OAuth2TokenService : public content::NotificationObserver, |
// token using these parameters. |
std::map<FetchParameters, Fetcher*> pending_fetchers_; |
- // Registrar for notifications from the TokenService. |
- content::NotificationRegistrar registrar_; |
- |
DISALLOW_COPY_AND_ASSIGN(OAuth2TokenService); |
}; |