Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright 2013 The Chromium Authors. All rights reserved. | 1 // Copyright 2013 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 #ifndef GOOGLE_APIS_GAIA_OAUTH2_TOKEN_SERVICE_H_ | 5 #ifndef GOOGLE_APIS_GAIA_OAUTH2_TOKEN_SERVICE_H_ |
| 6 #define GOOGLE_APIS_GAIA_OAUTH2_TOKEN_SERVICE_H_ | 6 #define GOOGLE_APIS_GAIA_OAUTH2_TOKEN_SERVICE_H_ |
| 7 | 7 |
| 8 #include <map> | 8 #include <map> |
| 9 #include <set> | 9 #include <set> |
| 10 #include <string> | 10 #include <string> |
| 11 | 11 |
| 12 #include "base/basictypes.h" | 12 #include "base/basictypes.h" |
| 13 #include "base/gtest_prod_util.h" | 13 #include "base/gtest_prod_util.h" |
| 14 #include "base/memory/scoped_ptr.h" | 14 #include "base/memory/scoped_ptr.h" |
| 15 #include "base/memory/weak_ptr.h" | 15 #include "base/memory/weak_ptr.h" |
| 16 #include "base/observer_list.h" | 16 #include "base/observer_list.h" |
| 17 #include "base/threading/non_thread_safe.h" | 17 #include "base/threading/non_thread_safe.h" |
| 18 #include "base/time/time.h" | 18 #include "base/time/time.h" |
| 19 #include "google_apis/gaia/google_service_auth_error.h" | 19 #include "google_apis/gaia/google_service_auth_error.h" |
| 20 #include "google_apis/gaia/oauth2_access_token_consumer.h" | 20 #include "google_apis/gaia/oauth2_access_token_consumer.h" |
| 21 #include "google_apis/gaia/oauth2_access_token_fetcher.h" | 21 #include "google_apis/gaia/oauth2_access_token_fetcher.h" |
| 22 | 22 |
| 23 namespace net { | 23 namespace net { |
| 24 class URLRequestContextGetter; | 24 class URLRequestContextGetter; |
| 25 } | 25 } |
| 26 | 26 |
| 27 class GoogleServiceAuthError; | 27 class GoogleServiceAuthError; |
| 28 class OAuth2AccessTokenFetcher; | 28 class OAuth2AccessTokenFetcher; |
| 29 class OAuth2TokenServiceDelegate; | |
| 29 | 30 |
| 30 // Abstract base class for a service that fetches and caches OAuth2 access | 31 // Abstract base class for a service that fetches and caches OAuth2 access |
| 31 // tokens. Concrete subclasses should implement GetRefreshToken to return | 32 // tokens. Concrete subclasses should implement GetRefreshToken to return |
| 32 // the appropriate refresh token. Derived services might maintain refresh tokens | 33 // the appropriate refresh token. Derived services might maintain refresh tokens |
| 33 // for multiple accounts. | 34 // for multiple accounts. |
| 34 // | 35 // |
| 35 // All calls are expected from the UI thread. | 36 // All calls are expected from the UI thread. |
| 36 // | 37 // |
| 37 // To use this service, call StartRequest() with a given set of scopes and a | 38 // To use this service, call StartRequest() with a given set of scopes and a |
| 38 // consumer of the request results. The consumer is required to outlive the | 39 // consumer of the request results. The consumer is required to outlive the |
| (...skipping 83 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 122 // successful completion. | 123 // successful completion. |
| 123 virtual void OnFetchAccessTokenComplete(const std::string& account_id, | 124 virtual void OnFetchAccessTokenComplete(const std::string& account_id, |
| 124 const std::string& consumer_id, | 125 const std::string& consumer_id, |
| 125 const ScopeSet& scopes, | 126 const ScopeSet& scopes, |
| 126 GoogleServiceAuthError error, | 127 GoogleServiceAuthError error, |
| 127 base::Time expiration_time) = 0; | 128 base::Time expiration_time) = 0; |
| 128 virtual void OnTokenRemoved(const std::string& account_id, | 129 virtual void OnTokenRemoved(const std::string& account_id, |
| 129 const ScopeSet& scopes) = 0; | 130 const ScopeSet& scopes) = 0; |
| 130 }; | 131 }; |
| 131 | 132 |
| 132 OAuth2TokenService(); | 133 OAuth2TokenService(OAuth2TokenServiceDelegate* delegate); |
| 133 virtual ~OAuth2TokenService(); | 134 virtual ~OAuth2TokenService(); |
| 134 | 135 |
| 135 // Add or remove observers of this token service. | 136 // Add or remove observers of this token service. |
| 136 void AddObserver(Observer* observer); | 137 void AddObserver(Observer* observer); |
| 137 void RemoveObserver(Observer* observer); | 138 void RemoveObserver(Observer* observer); |
| 138 | 139 |
| 139 // Add or remove observers of this token service. | 140 // Add or remove observers of this token service. |
| 140 void AddDiagnosticsObserver(DiagnosticsObserver* observer); | 141 void AddDiagnosticsObserver(DiagnosticsObserver* observer); |
| 141 void RemoveDiagnosticsObserver(DiagnosticsObserver* observer); | 142 void RemoveDiagnosticsObserver(DiagnosticsObserver* observer); |
| 142 | 143 |
| (...skipping 22 matching lines...) Expand all Loading... | |
| 165 // context given by |getter| instead of using the one returned by | 166 // context given by |getter| instead of using the one returned by |
| 166 // |GetRequestContext| implemented by derived classes. | 167 // |GetRequestContext| implemented by derived classes. |
| 167 scoped_ptr<Request> StartRequestWithContext( | 168 scoped_ptr<Request> StartRequestWithContext( |
| 168 const std::string& account_id, | 169 const std::string& account_id, |
| 169 net::URLRequestContextGetter* getter, | 170 net::URLRequestContextGetter* getter, |
| 170 const ScopeSet& scopes, | 171 const ScopeSet& scopes, |
| 171 Consumer* consumer); | 172 Consumer* consumer); |
| 172 | 173 |
| 173 // Lists account IDs of all accounts with a refresh token maintained by this | 174 // Lists account IDs of all accounts with a refresh token maintained by this |
| 174 // instance. | 175 // instance. |
| 175 virtual std::vector<std::string> GetAccounts(); | 176 virtual std::vector<std::string> GetAccounts(); // ganggui_temp |
| 176 | 177 |
| 177 // Returns true if a refresh token exists for |account_id|. If false, calls to | 178 // Returns true if a refresh token exists for |account_id|. If false, calls to |
| 178 // |StartRequest| will result in a Consumer::OnGetTokenFailure callback. | 179 // |StartRequest| will result in a Consumer::OnGetTokenFailure callback. |
| 179 virtual bool RefreshTokenIsAvailable(const std::string& account_id) const = 0; | 180 virtual bool RefreshTokenIsAvailable( |
| 181 const std::string& account_id) const; // ganggui_temp | |
|
Roger Tawa OOO till Jul 10th
2015/05/24 21:13:18
The above two methods should not be virtual. Is t
gogerald1
2015/05/25 21:10:58
Done.
gogerald1
2015/05/25 21:10:58
Yes, just make it pass the unit_tests compilation,
| |
| 182 | |
| 183 void RevokeAllCredentials(); | |
| 180 | 184 |
| 181 // Mark an OAuth2 |access_token| issued for |account_id| and |scopes| as | 185 // Mark an OAuth2 |access_token| issued for |account_id| and |scopes| as |
| 182 // invalid. This should be done if the token was received from this class, | 186 // invalid. This should be done if the token was received from this class, |
| 183 // but was not accepted by the server (e.g., the server returned | 187 // but was not accepted by the server (e.g., the server returned |
| 184 // 401 Unauthorized). The token will be removed from the cache for the given | 188 // 401 Unauthorized). The token will be removed from the cache for the given |
| 185 // scopes. | 189 // scopes. |
| 186 void InvalidateToken(const std::string& account_id, | 190 void InvalidateToken(const std::string& account_id, |
| 187 const ScopeSet& scopes, | 191 const ScopeSet& scopes, |
| 188 const std::string& access_token); | 192 const std::string& access_token); |
| 189 | 193 |
| 190 // Like |InvalidateToken| except is uses |client_id| to identity OAuth2 client | 194 // Like |InvalidateToken| except is uses |client_id| to identity OAuth2 client |
| 191 // app that issued the request instead of Chrome's default values. | 195 // app that issued the request instead of Chrome's default values. |
| 192 void InvalidateTokenForClient(const std::string& account_id, | 196 void InvalidateTokenForClient(const std::string& account_id, |
| 193 const std::string& client_id, | 197 const std::string& client_id, |
| 194 const ScopeSet& scopes, | 198 const ScopeSet& scopes, |
| 195 const std::string& access_token); | 199 const std::string& access_token); |
| 196 | 200 |
| 197 | 201 |
| 198 // Return the current number of entries in the cache. | 202 // Return the current number of entries in the cache. |
| 199 int cache_size_for_testing() const; | 203 int cache_size_for_testing() const; |
| 200 void set_max_authorization_token_fetch_retries_for_testing(int max_retries); | 204 void set_max_authorization_token_fetch_retries_for_testing(int max_retries); |
| 201 // Returns the current number of pending fetchers matching given params. | 205 // Returns the current number of pending fetchers matching given params. |
| 202 size_t GetNumPendingRequestsForTesting( | 206 size_t GetNumPendingRequestsForTesting( |
| 203 const std::string& client_id, | 207 const std::string& client_id, |
| 204 const std::string& account_id, | 208 const std::string& account_id, |
| 205 const ScopeSet& scopes) const; | 209 const ScopeSet& scopes) const; |
| 206 | 210 |
| 211 OAuth2TokenServiceDelegate* GetDelegate(); | |
| 212 | |
| 213 // Invalidates the |access_token| issued for |account_id|, |client_id| and | |
| 214 // |scopes|. Virtual so it can be overriden for tests and for platform- | |
| 215 // specifc behavior. | |
| 216 virtual void InvalidateOAuth2Token(const std::string& account_id, | |
| 217 const std::string& client_id, | |
| 218 const ScopeSet& scopes, | |
| 219 const std::string& access_token); | |
|
Roger Tawa OOO till Jul 10th
2015/05/24 21:13:18
I think this should be made private, otherwise the
gogerald1
2015/05/25 21:10:57
Yes, I will move it into protect group, it was mov
| |
| 220 | |
| 207 protected: | 221 protected: |
| 208 // Implements a cancelable |OAuth2TokenService::Request|, which should be | 222 // Implements a cancelable |OAuth2TokenService::Request|, which should be |
| 209 // operated on the UI thread. | 223 // operated on the UI thread. |
| 210 // TODO(davidroche): move this out of header file. | 224 // TODO(davidroche): move this out of header file. |
| 211 class RequestImpl : public base::SupportsWeakPtr<RequestImpl>, | 225 class RequestImpl : public base::SupportsWeakPtr<RequestImpl>, |
| 212 public base::NonThreadSafe, | 226 public base::NonThreadSafe, |
| 213 public Request { | 227 public Request { |
| 214 public: | 228 public: |
| 215 // |consumer| is required to outlive this. | 229 // |consumer| is required to outlive this. |
| 216 RequestImpl(const std::string& account_id, Consumer* consumer); | 230 RequestImpl(const std::string& account_id, Consumer* consumer); |
| 217 ~RequestImpl() override; | 231 ~RequestImpl() override; |
| 218 | 232 |
| 219 // Overridden from Request: | 233 // Overridden from Request: |
| 220 std::string GetAccountId() const override; | 234 std::string GetAccountId() const override; |
| 221 | 235 |
| 222 std::string GetConsumerId() const; | 236 std::string GetConsumerId() const; |
| 223 | 237 |
| 224 // Informs |consumer_| that this request is completed. | 238 // Informs |consumer_| that this request is completed. |
| 225 void InformConsumer(const GoogleServiceAuthError& error, | 239 void InformConsumer(const GoogleServiceAuthError& error, |
| 226 const std::string& access_token, | 240 const std::string& access_token, |
| 227 const base::Time& expiration_date); | 241 const base::Time& expiration_date); |
| 228 | 242 |
| 229 private: | 243 private: |
| 230 // |consumer_| to call back when this request completes. | 244 // |consumer_| to call back when this request completes. |
| 231 const std::string account_id_; | 245 const std::string account_id_; |
| 232 Consumer* const consumer_; | 246 Consumer* const consumer_; |
| 233 }; | 247 }; |
| 234 | 248 |
| 235 // Helper class to scope batch changes. | |
| 236 class ScopedBatchChange { | |
| 237 public: | |
| 238 explicit ScopedBatchChange(OAuth2TokenService* token_service); | |
| 239 ~ScopedBatchChange(); | |
| 240 private: | |
| 241 OAuth2TokenService* token_service_; // Weak. | |
| 242 DISALLOW_COPY_AND_ASSIGN(ScopedBatchChange); | |
| 243 }; | |
| 244 | |
| 245 // Subclasses can override if they want to report errors to the user. | 249 // Subclasses can override if they want to report errors to the user. |
| 246 virtual void UpdateAuthError( | 250 void UpdateAuthError(const std::string& account_id, |
| 247 const std::string& account_id, | 251 const GoogleServiceAuthError& error); |
| 248 const GoogleServiceAuthError& error); | |
| 249 | 252 |
| 250 // Add a new entry to the cache. | 253 // Add a new entry to the cache. |
| 251 // Subclasses can override if there are implementation-specific reasons | 254 // Subclasses can override if there are implementation-specific reasons |
| 252 // that an access token should ever not be cached. | 255 // that an access token should ever not be cached. |
| 253 virtual void RegisterCacheEntry(const std::string& client_id, | 256 virtual void RegisterCacheEntry(const std::string& client_id, |
| 254 const std::string& account_id, | 257 const std::string& account_id, |
| 255 const ScopeSet& scopes, | 258 const ScopeSet& scopes, |
| 256 const std::string& access_token, | 259 const std::string& access_token, |
| 257 const base::Time& expiration_date); | 260 const base::Time& expiration_date); |
| 258 | 261 |
| 259 // Clears the internal token cache. | 262 // Clears the internal token cache. |
| 260 void ClearCache(); | 263 void ClearCache(); |
| 261 | 264 |
| 262 // Clears all of the tokens belonging to |account_id| from the internal token | 265 // Clears all of the tokens belonging to |account_id| from the internal token |
| 263 // cache. It does not matter what other parameters, like |client_id| were | 266 // cache. It does not matter what other parameters, like |client_id| were |
| 264 // used to request the tokens. | 267 // used to request the tokens. |
| 265 void ClearCacheForAccount(const std::string& account_id); | 268 void ClearCacheForAccount(const std::string& account_id); |
| 266 | 269 |
| 267 // Cancels all requests that are currently in progress. | 270 // Cancels all requests that are currently in progress. |
| 268 void CancelAllRequests(); | 271 void CancelAllRequests(); |
| 269 | 272 |
| 270 // Cancels all requests related to a given |account_id|. | 273 // Cancels all requests related to a given |account_id|. |
| 271 void CancelRequestsForAccount(const std::string& account_id); | 274 void CancelRequestsForAccount(const std::string& account_id); |
| 272 | 275 |
| 273 // Called by subclasses to notify observers. | |
| 274 virtual void FireRefreshTokenAvailable(const std::string& account_id); | |
| 275 virtual void FireRefreshTokenRevoked(const std::string& account_id); | |
| 276 virtual void FireRefreshTokensLoaded(); | |
| 277 | |
| 278 virtual void StartBatchChanges(); | |
| 279 virtual void EndBatchChanges(); | |
| 280 | |
| 281 // Fetches an OAuth token for the specified client/scopes. Virtual so it can | 276 // Fetches an OAuth token for the specified client/scopes. Virtual so it can |
| 282 // be overridden for tests and for platform-specific behavior on Android. | 277 // be overridden for tests and for platform-specific behavior on Android. |
| 283 virtual void FetchOAuth2Token(RequestImpl* request, | 278 virtual void FetchOAuth2Token(RequestImpl* request, |
| 284 const std::string& account_id, | 279 const std::string& account_id, |
| 285 net::URLRequestContextGetter* getter, | 280 net::URLRequestContextGetter* getter, |
| 286 const std::string& client_id, | 281 const std::string& client_id, |
| 287 const std::string& client_secret, | 282 const std::string& client_secret, |
| 288 const ScopeSet& scopes); | 283 const ScopeSet& scopes); |
|
Roger Tawa OOO till Jul 10th
2015/05/24 21:13:18
This should not be virtual.
gogerald1
2015/05/25 21:10:58
I just find the fake token services override this
| |
| 289 | 284 |
| 290 // Creates an access token fetcher for the given account id. | 285 // Creates an access token fetcher for the given account id. |
| 291 // | 286 // |
| 292 // Subclasses should override to create an access token fetcher for the given | 287 // Subclasses should override to create an access token fetcher for the given |
| 293 // |account_id|. This method is only called if subclasses use the default | 288 // |account_id|. This method is only called if subclasses use the default |
| 294 // implementation of |FetchOAuth2Token|. | 289 // implementation of |FetchOAuth2Token|. |
| 295 virtual OAuth2AccessTokenFetcher* CreateAccessTokenFetcher( | 290 virtual OAuth2AccessTokenFetcher* CreateAccessTokenFetcher( |
| 296 const std::string& account_id, | 291 const std::string& account_id, |
| 297 net::URLRequestContextGetter* getter, | 292 net::URLRequestContextGetter* getter, |
| 298 OAuth2AccessTokenConsumer* consumer) = 0; | 293 OAuth2AccessTokenConsumer* consumer); // ganggui_temp |
|
Roger Tawa OOO till Jul 10th
2015/05/24 21:13:18
This should not be virtual.
gogerald1
2015/05/25 21:10:58
Done.
| |
| 299 | |
| 300 // Invalidates the |access_token| issued for |account_id|, |client_id| and | |
| 301 // |scopes|. Virtual so it can be overriden for tests and for platform- | |
| 302 // specifc behavior. | |
| 303 virtual void InvalidateOAuth2Token(const std::string& account_id, | |
| 304 const std::string& client_id, | |
| 305 const ScopeSet& scopes, | |
| 306 const std::string& access_token); | |
| 307 | 294 |
| 308 private: | 295 private: |
| 309 class Fetcher; | 296 class Fetcher; |
| 310 friend class Fetcher; | 297 friend class Fetcher; |
| 298 friend class OAuth2TokenServiceDelegate; | |
| 311 | 299 |
| 312 // The parameters used to fetch an OAuth2 access token. | 300 // The parameters used to fetch an OAuth2 access token. |
| 313 struct RequestParameters { | 301 struct RequestParameters { |
| 314 RequestParameters(const std::string& client_id, | 302 RequestParameters(const std::string& client_id, |
| 315 const std::string& account_id, | 303 const std::string& account_id, |
| 316 const ScopeSet& scopes); | 304 const ScopeSet& scopes); |
| 317 ~RequestParameters(); | 305 ~RequestParameters(); |
| 318 bool operator<(const RequestParameters& params) const; | 306 bool operator<(const RequestParameters& params) const; |
| 319 | 307 |
| 320 // OAuth2 client id. | 308 // OAuth2 client id. |
| (...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 372 // Called when |fetcher| finishes fetching. | 360 // Called when |fetcher| finishes fetching. |
| 373 void OnFetchComplete(Fetcher* fetcher); | 361 void OnFetchComplete(Fetcher* fetcher); |
| 374 | 362 |
| 375 // Called when a number of fetchers need to be canceled. | 363 // Called when a number of fetchers need to be canceled. |
| 376 void CancelFetchers(std::vector<Fetcher*> fetchers_to_cancel); | 364 void CancelFetchers(std::vector<Fetcher*> fetchers_to_cancel); |
| 377 | 365 |
| 378 // The cache of currently valid tokens. | 366 // The cache of currently valid tokens. |
| 379 typedef std::map<RequestParameters, CacheEntry> TokenCache; | 367 typedef std::map<RequestParameters, CacheEntry> TokenCache; |
| 380 TokenCache token_cache_; | 368 TokenCache token_cache_; |
| 381 | 369 |
| 370 scoped_ptr<OAuth2TokenServiceDelegate> delegate_; | |
| 371 | |
| 382 // A map from fetch parameters to a fetcher that is fetching an OAuth2 access | 372 // A map from fetch parameters to a fetcher that is fetching an OAuth2 access |
| 383 // token using these parameters. | 373 // token using these parameters. |
| 384 PendingFetcherMap pending_fetchers_; | 374 PendingFetcherMap pending_fetchers_; |
| 385 | 375 |
| 386 // List of observers to notify when refresh token availability changes. | |
| 387 // Makes sure list is empty on destruction. | |
| 388 ObserverList<Observer, true> observer_list_; | |
| 389 | |
| 390 // List of observers to notify when access token status changes. | 376 // List of observers to notify when access token status changes. |
| 391 ObserverList<DiagnosticsObserver, true> diagnostics_observer_list_; | 377 ObserverList<DiagnosticsObserver, true> diagnostics_observer_list_; |
| 392 | 378 |
| 393 // The depth of batch changes. | |
| 394 int batch_change_depth_; | |
| 395 | |
| 396 // Maximum number of retries in fetching an OAuth2 access token. | 379 // Maximum number of retries in fetching an OAuth2 access token. |
| 397 static int max_fetch_retry_num_; | 380 static int max_fetch_retry_num_; |
| 398 | 381 |
| 399 FRIEND_TEST_ALL_PREFIXES(OAuth2TokenServiceTest, RequestParametersOrderTest); | 382 FRIEND_TEST_ALL_PREFIXES(OAuth2TokenServiceTest, RequestParametersOrderTest); |
| 400 FRIEND_TEST_ALL_PREFIXES(OAuth2TokenServiceTest, | 383 FRIEND_TEST_ALL_PREFIXES(OAuth2TokenServiceTest, |
| 401 SameScopesRequestedForDifferentClients); | 384 SameScopesRequestedForDifferentClients); |
| 402 | 385 |
| 403 DISALLOW_COPY_AND_ASSIGN(OAuth2TokenService); | 386 DISALLOW_COPY_AND_ASSIGN(OAuth2TokenService); |
| 404 }; | 387 }; |
| 405 | 388 |
| 406 #endif // GOOGLE_APIS_GAIA_OAUTH2_TOKEN_SERVICE_H_ | 389 #endif // GOOGLE_APIS_GAIA_OAUTH2_TOKEN_SERVICE_H_ |
| OLD | NEW |