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

Side by Side Diff: google_apis/gaia/oauth2_token_service.h

Issue 1143323005: Refactor AO2TS to make it easier to componentize. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Refactor AO2TS to make it easier to componentize. Created 5 years, 7 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 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
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
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
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_
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698