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 |