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> |
(...skipping 11 matching lines...) Expand all Loading... | |
22 #include "google_apis/gaia/oauth2_access_token_fetcher.h" | 22 #include "google_apis/gaia/oauth2_access_token_fetcher.h" |
23 | 23 |
24 namespace net { | 24 namespace net { |
25 class URLRequestContextGetter; | 25 class URLRequestContextGetter; |
26 } | 26 } |
27 | 27 |
28 class GoogleServiceAuthError; | 28 class GoogleServiceAuthError; |
29 | 29 |
30 // Abstract base class for a service that fetches and caches OAuth2 access | 30 // Abstract base class for a service that fetches and caches OAuth2 access |
31 // tokens. Concrete subclasses should implement GetRefreshToken to return | 31 // tokens. Concrete subclasses should implement GetRefreshToken to return |
32 // the appropriate refresh token. | 32 // the appropriate refresh token. Derived services might maintain refresh tokens |
33 // for multiple accounts. | |
33 // | 34 // |
34 // All calls are expected from the UI thread. | 35 // All calls are expected from the UI thread. |
35 // | 36 // |
36 // To use this service, call StartRequest() with a given set of scopes and a | 37 // To use this service, call StartRequest() with a given set of scopes and a |
37 // consumer of the request results. The consumer is required to outlive the | 38 // consumer of the request results. The consumer is required to outlive the |
38 // request. The request can be deleted. The consumer may be called back | 39 // request. The request can be deleted. The consumer may be called back |
39 // asynchronously with the fetch results. | 40 // asynchronously with the fetch results. |
40 // | 41 // |
41 // - If the consumer is not called back before the request is deleted, it will | 42 // - If the consumer is not called back before the request is deleted, it will |
42 // never be called back. | 43 // never be called back. |
(...skipping 26 matching lines...) Expand all Loading... | |
69 // completed. | 70 // completed. |
70 virtual void OnGetTokenSuccess(const Request* request, | 71 virtual void OnGetTokenSuccess(const Request* request, |
71 const std::string& access_token, | 72 const std::string& access_token, |
72 const base::Time& expiration_time) = 0; | 73 const base::Time& expiration_time) = 0; |
73 virtual void OnGetTokenFailure(const Request* request, | 74 virtual void OnGetTokenFailure(const Request* request, |
74 const GoogleServiceAuthError& error) = 0; | 75 const GoogleServiceAuthError& error) = 0; |
75 }; | 76 }; |
76 | 77 |
77 // Classes that want to listen for token availability should implement this | 78 // Classes that want to listen for token availability should implement this |
78 // interface and register with the AddObserver() call. | 79 // interface and register with the AddObserver() call. |
79 // TODO(rogerta): may get rid of |error| argument for OnRefreshTokenRevoked() | |
80 // once we stop supporting ClientLogin. Need to evaluate if its still useful. | |
81 class Observer { | 80 class Observer { |
82 public: | 81 public: |
83 // Called whenever a new login-scoped refresh token is available for | 82 // Called whenever a new login-scoped refresh token is available for |
84 // account |account_id|. Once available, access tokens can be retrieved for | 83 // account |account_id|. Once available, access tokens can be retrieved for |
85 // this account. This is called during initial startup for each token | 84 // this account. This is called during initial startup for each token |
86 // loaded. | 85 // loaded. |
87 virtual void OnRefreshTokenAvailable(const std::string& account_id) {} | 86 virtual void OnRefreshTokenAvailable(const std::string& account_id) {} |
88 // Called whenever the login-scoped refresh token becomes unavailable for | 87 // Called whenever the login-scoped refresh token becomes unavailable for |
89 // account |account_id|. | 88 // account |account_id|. |
90 virtual void OnRefreshTokenRevoked(const std::string& account_id) {} | 89 virtual void OnRefreshTokenRevoked(const std::string& account_id) {} |
91 // Called after all refresh tokens are loaded during OAuth2TokenService | 90 // Called after all refresh tokens are loaded during OAuth2TokenService |
92 // startup. | 91 // startup. |
93 virtual void OnRefreshTokensLoaded() {} | 92 virtual void OnRefreshTokensLoaded() {} |
94 // Called after all refresh tokens are removed from OAuth2TokenService. | |
95 virtual void OnRefreshTokensCleared() {} | |
96 protected: | 93 protected: |
97 virtual ~Observer() {} | 94 virtual ~Observer() {} |
98 }; | 95 }; |
99 | 96 |
100 // A set of scopes in OAuth2 authentication. | 97 // A set of scopes in OAuth2 authentication. |
101 typedef std::set<std::string> ScopeSet; | 98 typedef std::set<std::string> ScopeSet; |
102 | 99 |
103 OAuth2TokenService(); | 100 OAuth2TokenService(); |
104 virtual ~OAuth2TokenService(); | 101 virtual ~OAuth2TokenService(); |
105 | 102 |
106 // Add or remove observers of this token service. | 103 // Add or remove observers of this token service. |
107 void AddObserver(Observer* observer); | 104 void AddObserver(Observer* observer); |
108 void RemoveObserver(Observer* observer); | 105 void RemoveObserver(Observer* observer); |
109 | 106 |
110 // Checks in the cache for a valid access token, and if not found starts | 107 // Checks in the cache for a valid access token for a specified |account_id| |
111 // a request for an OAuth2 access token using the OAuth2 refresh token | 108 // and |scopes|, and if not found starts a request for an OAuth2 access token |
112 // maintained by this instance. The caller owns the returned Request. | 109 // using the OAuth2 refresh token maintained by this instance for that |
110 // |account_id|. The caller owns the returned Request. | |
113 // |scopes| is the set of scopes to get an access token for, |consumer| is | 111 // |scopes| is the set of scopes to get an access token for, |consumer| is |
114 // the object that will be called back with results if the returned request | 112 // the object that will be called back with results if the returned request |
115 // is not deleted. | 113 // is not deleted. |
116 // TODO(atwilson): Make this non-virtual when we change | 114 // TODO(atwilson): Make this non-virtual when we change |
117 // ProfileOAuth2TokenServiceRequestTest to use FakeProfileOAuth2TokenService. | 115 // ProfileOAuth2TokenServiceRequestTest to use FakeProfileOAuth2TokenService. |
118 virtual scoped_ptr<Request> StartRequest(const ScopeSet& scopes, | 116 virtual scoped_ptr<Request> StartRequest(const std::string& account_id, |
117 const ScopeSet& scopes, | |
119 Consumer* consumer); | 118 Consumer* consumer); |
120 | 119 |
121 // This method does the same as |StartRequest| except it uses |client_id| and | 120 // This method does the same as |StartRequest| except it uses |client_id| and |
122 // |client_secret| to identify OAuth client app instead of using | 121 // |client_secret| to identify OAuth client app instead of using |
123 // Chrome's default values. | 122 // Chrome's default values. |
124 scoped_ptr<Request> StartRequestForClient( | 123 scoped_ptr<Request> StartRequestForClient( |
124 const std::string& account_id, | |
125 const std::string& client_id, | 125 const std::string& client_id, |
126 const std::string& client_secret, | 126 const std::string& client_secret, |
127 const ScopeSet& scopes, | 127 const ScopeSet& scopes, |
128 Consumer* consumer); | 128 Consumer* consumer); |
129 | 129 |
130 // This method does the same as |StartRequest| except it uses the request | 130 // This method does the same as |StartRequest| except it uses the request |
131 // context given by |getter| instead of using the one returned by | 131 // context given by |getter| instead of using the one returned by |
132 // |GetRequestContext| implemented by derived classes. | 132 // |GetRequestContext| implemented by derived classes. |
133 scoped_ptr<Request> StartRequestWithContext( | 133 scoped_ptr<Request> StartRequestWithContext( |
134 const std::string& account_id, | |
134 net::URLRequestContextGetter* getter, | 135 net::URLRequestContextGetter* getter, |
135 const ScopeSet& scopes, | 136 const ScopeSet& scopes, |
136 Consumer* consumer); | 137 Consumer* consumer); |
137 | 138 |
138 // Returns true if a refresh token exists. If false, calls to | 139 // Lists account IDs of all accounts with a refresh token maintained by this |
140 // instance. | |
141 virtual std::vector<std::string> GetAccounts(); | |
142 | |
143 // Returns true if a refresh token exists for |account_id|. If false, calls to | |
139 // |StartRequest| will result in a Consumer::OnGetTokenFailure callback. | 144 // |StartRequest| will result in a Consumer::OnGetTokenFailure callback. |
140 virtual bool RefreshTokenIsAvailable(); | 145 virtual bool RefreshTokenIsAvailable(const std::string& account_id); |
141 | 146 |
142 // Mark an OAuth2 access token as invalid. This should be done if the token | 147 // Mark an OAuth2 access token issued for |account_id| and |scopes| as |
143 // was received from this class, but was not accepted by the server (e.g., | 148 // invalid. This should be done if the token was received from this class, |
144 // the server returned 401 Unauthorized). The token will be removed from the | 149 // but was not accepted by the server (e.g., the server returned |
145 // cache for the given scopes. | 150 // 401 Unauthorized). The token will be removed from the cache for the given |
146 virtual void InvalidateToken(const ScopeSet& scopes, | 151 // scopes. |
147 const std::string& invalid_token); | 152 void InvalidateToken(const std::string& account_id, |
153 const ScopeSet& scopes, | |
154 const std::string& invalid_token); | |
155 | |
156 // Like |InvalidateToken| except is uses |client_id| to identity OAuth2 client | |
157 // app that issued the request instead of Chrome's default values. | |
158 void InvalidateTokenForClient(const std::string& account_id, | |
159 const std::string& client_id, | |
160 const ScopeSet& scopes, | |
161 const std::string& invalid_token); | |
Roger Tawa OOO till Jul 10th
2013/09/13 14:53:56
Should rename |invalid_token| to |invalid_access_t
fgorski
2013/09/13 22:06:46
Done.
| |
162 | |
148 | 163 |
149 // Return the current number of entries in the cache. | 164 // Return the current number of entries in the cache. |
150 int cache_size_for_testing() const; | 165 int cache_size_for_testing() const; |
151 void set_max_authorization_token_fetch_retries_for_testing(int max_retries); | 166 void set_max_authorization_token_fetch_retries_for_testing(int max_retries); |
152 // Returns the current number of pending fetchers matching given params. | 167 // Returns the current number of pending fetchers matching given params. |
153 size_t GetNumPendingRequestsForTesting( | 168 size_t GetNumPendingRequestsForTesting( |
154 const std::string& client_id, | 169 const std::string& client_id, |
155 const std::string& refresh_token, | 170 const std::string& refresh_token, |
156 const ScopeSet& scopes) const; | 171 const ScopeSet& scopes) const; |
157 | 172 |
158 protected: | 173 protected: |
159 struct ClientScopeSet { | |
160 ClientScopeSet(const std::string& client_id, | |
161 const ScopeSet& scopes); | |
162 ~ClientScopeSet(); | |
163 bool operator<(const ClientScopeSet& set) const; | |
164 | |
165 std::string client_id; | |
166 ScopeSet scopes; | |
167 }; | |
168 | |
169 // Implements a cancelable |OAuth2TokenService::Request|, which should be | 174 // Implements a cancelable |OAuth2TokenService::Request|, which should be |
170 // operated on the UI thread. | 175 // operated on the UI thread. |
171 // TODO(davidroche): move this out of header file. | 176 // TODO(davidroche): move this out of header file. |
172 class RequestImpl : public base::SupportsWeakPtr<RequestImpl>, | 177 class RequestImpl : public base::SupportsWeakPtr<RequestImpl>, |
173 public base::NonThreadSafe, | 178 public base::NonThreadSafe, |
174 public Request { | 179 public Request { |
175 public: | 180 public: |
176 // |consumer| is required to outlive this. | 181 // |consumer| is required to outlive this. |
177 explicit RequestImpl(Consumer* consumer); | 182 explicit RequestImpl(Consumer* consumer); |
178 virtual ~RequestImpl(); | 183 virtual ~RequestImpl(); |
179 | 184 |
180 // Informs |consumer_| that this request is completed. | 185 // Informs |consumer_| that this request is completed. |
181 void InformConsumer(const GoogleServiceAuthError& error, | 186 void InformConsumer(const GoogleServiceAuthError& error, |
182 const std::string& access_token, | 187 const std::string& access_token, |
183 const base::Time& expiration_date); | 188 const base::Time& expiration_date); |
184 | 189 |
185 private: | 190 private: |
186 // |consumer_| to call back when this request completes. | 191 // |consumer_| to call back when this request completes. |
187 Consumer* const consumer_; | 192 Consumer* const consumer_; |
188 }; | 193 }; |
189 | 194 |
190 // Subclasses should return the refresh token maintained. | 195 // Subclasses should return the maintained refresh token for |account_id|. |
191 // If no token is available, return an empty string. | 196 // If no token is available, return an empty string. |
192 virtual std::string GetRefreshToken() = 0; | 197 virtual std::string GetRefreshToken(const std::string& account_id) = 0; |
193 | 198 |
194 // Subclasses can override if they want to report errors to the user. | 199 // Subclasses can override if they want to report errors to the user. |
195 virtual void UpdateAuthError(const GoogleServiceAuthError& error); | 200 virtual void UpdateAuthError( |
201 const std::string& account_id, | |
202 const GoogleServiceAuthError& error); | |
196 | 203 |
197 // Add a new entry to the cache. | 204 // Add a new entry to the cache. |
198 // Subclasses can override if there are implementation-specific reasons | 205 // Subclasses can override if there are implementation-specific reasons |
199 // that an access token should ever not be cached. | 206 // that an access token should ever not be cached. |
200 virtual void RegisterCacheEntry(const std::string& client_id, | 207 virtual void RegisterCacheEntry(const std::string& client_id, |
201 const std::string& refresh_token, | 208 const std::string& refresh_token, |
202 const ScopeSet& scopes, | 209 const ScopeSet& scopes, |
203 const std::string& access_token, | 210 const std::string& access_token, |
204 const base::Time& expiration_date); | 211 const base::Time& expiration_date); |
205 | 212 |
206 // Returns true if GetCacheEntry would return a valid cache entry for the | |
207 // given scopes. | |
208 bool HasCacheEntry(const ClientScopeSet& client_scopes); | |
209 | |
210 // Posts a task to fire the Consumer callback with the cached token. Must | |
211 // Must only be called if HasCacheEntry() returns true. | |
212 void StartCacheLookupRequest(RequestImpl* request, | |
213 const ClientScopeSet& client_scopes, | |
214 Consumer* consumer); | |
215 | |
216 // Clears the internal token cache. | 213 // Clears the internal token cache. |
217 void ClearCache(); | 214 void ClearCache(); |
218 | 215 |
216 // Clears all of the tokens belonging to |account_id| from the internal token | |
217 // cache. It does not matter what other parameters, like |client_id| were | |
218 // used to request the tokens. | |
219 void ClearCacheForAccount(const std::string& account_id); | |
220 | |
219 // Cancels all requests that are currently in progress. | 221 // Cancels all requests that are currently in progress. |
220 void CancelAllRequests(); | 222 void CancelAllRequests(); |
221 | 223 |
222 // Cancels all requests related to a given refresh token. | 224 // Cancels all requests related to a given refresh token. |
223 void CancelRequestsForToken(const std::string& refresh_token); | 225 void CancelRequestsForToken(const std::string& refresh_token); |
224 | 226 |
225 // Called by subclasses to notify observers. | 227 // Called by subclasses to notify observers. |
226 void FireRefreshTokenAvailable(const std::string& account_id); | 228 void FireRefreshTokenAvailable(const std::string& account_id); |
227 void FireRefreshTokenRevoked(const std::string& account_id); | 229 void FireRefreshTokenRevoked(const std::string& account_id); |
228 void FireRefreshTokensLoaded(); | 230 void FireRefreshTokensLoaded(); |
229 void FireRefreshTokensCleared(); | |
230 | 231 |
231 // Fetches an OAuth token for the specified client/scopes. Virtual so it can | 232 // Fetches an OAuth token for the specified client/scopes. Virtual so it can |
232 // be overridden for tests and for platform-specific behavior on Android. | 233 // be overridden for tests and for platform-specific behavior on Android. |
233 virtual void FetchOAuth2Token(RequestImpl* request, | 234 virtual void FetchOAuth2Token(RequestImpl* request, |
235 const std::string& account_id, | |
234 net::URLRequestContextGetter* getter, | 236 net::URLRequestContextGetter* getter, |
235 const std::string& client_id, | 237 const std::string& client_id, |
236 const std::string& client_secret, | 238 const std::string& client_secret, |
237 const ScopeSet& scopes); | 239 const ScopeSet& scopes); |
240 | |
241 // Invalidates the |invalid_token| issued for |account_id|, |client_id| and | |
242 // |scopes|. Virtual so it can be overriden for tests and for platform- | |
243 // specifc behavior. | |
244 virtual void InvalidateOAuth2Token(const std::string& account_id, | |
245 const std::string& client_id, | |
246 const ScopeSet& scopes, | |
247 const std::string& invalid_token); | |
248 | |
238 private: | 249 private: |
239 class Fetcher; | 250 class Fetcher; |
240 friend class Fetcher; | 251 friend class Fetcher; |
241 | 252 |
242 // The parameters used to fetch an OAuth2 access token. | 253 // The parameters used to fetch an OAuth2 access token. |
243 struct FetchParameters { | 254 struct RequestParameters { |
244 FetchParameters(const std::string& client_id, | 255 RequestParameters(const std::string& client_id, |
245 const std::string& refresh_token, | 256 const std::string& refresh_token, |
246 const ScopeSet& scopes); | 257 const ScopeSet& scopes); |
247 ~FetchParameters(); | 258 ~RequestParameters(); |
248 bool operator<(const FetchParameters& params) const; | 259 bool operator<(const RequestParameters& params) const; |
249 | 260 |
250 // OAuth2 client id. | 261 // OAuth2 client id. |
251 std::string client_id; | 262 std::string client_id; |
252 // Refresh token used for minting access tokens within this request. | 263 // Refresh token used for minting access tokens within this request. |
253 std::string refresh_token; | 264 std::string refresh_token; |
254 // URL scopes for the requested access token. | 265 // URL scopes for the requested access token. |
255 ScopeSet scopes; | 266 ScopeSet scopes; |
256 }; | 267 }; |
257 | 268 |
258 typedef std::map<FetchParameters, Fetcher*> PendingFetcherMap; | 269 typedef std::map<RequestParameters, Fetcher*> PendingFetcherMap; |
259 | 270 |
260 // Derived classes must provide a request context used for fetching access | 271 // Derived classes must provide a request context used for fetching access |
261 // tokens with the |StartRequest| method. | 272 // tokens with the |StartRequest| method. |
262 virtual net::URLRequestContextGetter* GetRequestContext() = 0; | 273 virtual net::URLRequestContextGetter* GetRequestContext() = 0; |
263 | 274 |
264 // Struct that contains the information of an OAuth2 access token. | 275 // Struct that contains the information of an OAuth2 access token. |
265 struct CacheEntry { | 276 struct CacheEntry { |
266 std::string access_token; | 277 std::string access_token; |
267 base::Time expiration_date; | 278 base::Time expiration_date; |
268 }; | 279 }; |
269 | 280 |
270 // This method does the same as |StartRequestWithContext| except it | 281 // This method does the same as |StartRequestWithContext| except it |
271 // uses |client_id| and |client_secret| to identify OAuth | 282 // uses |client_id| and |client_secret| to identify OAuth |
272 // client app instead of using Chrome's default values. | 283 // client app instead of using Chrome's default values. |
273 scoped_ptr<Request> StartRequestForClientWithContext( | 284 scoped_ptr<Request> StartRequestForClientWithContext( |
285 const std::string& account_id, | |
274 net::URLRequestContextGetter* getter, | 286 net::URLRequestContextGetter* getter, |
275 const std::string& client_id, | 287 const std::string& client_id, |
276 const std::string& client_secret, | 288 const std::string& client_secret, |
277 const ScopeSet& scopes, | 289 const ScopeSet& scopes, |
278 Consumer* consumer); | 290 Consumer* consumer); |
279 | 291 |
292 // Returns true if GetCacheEntry would return a valid cache entry for the | |
293 // given scopes. | |
294 bool HasCacheEntry(const RequestParameters& client_scopes); | |
295 | |
296 // Posts a task to fire the Consumer callback with the cached token. Must | |
297 // Must only be called if HasCacheEntry() returns true. | |
298 void StartCacheLookupRequest(RequestImpl* request, | |
299 const RequestParameters& client_scopes, | |
300 Consumer* consumer); | |
301 | |
280 // Returns a currently valid OAuth2 access token for the given set of scopes, | 302 // Returns a currently valid OAuth2 access token for the given set of scopes, |
281 // or NULL if none have been cached. Note the user of this method should | 303 // or NULL if none have been cached. Note the user of this method should |
282 // ensure no entry with the same |client_scopes| is added before the usage of | 304 // ensure no entry with the same |client_scopes| is added before the usage of |
283 // the returned entry is done. | 305 // the returned entry is done. |
284 const CacheEntry* GetCacheEntry(const ClientScopeSet& client_scopes); | 306 const CacheEntry* GetCacheEntry(const RequestParameters& client_scopes); |
285 | |
286 | 307 |
287 // Removes an access token for the given set of scopes from the cache. | 308 // Removes an access token for the given set of scopes from the cache. |
288 // Returns true if the entry was removed, otherwise false. | 309 // Returns true if the entry was removed, otherwise false. |
289 bool RemoveCacheEntry(const ClientScopeSet& client_scopes, | 310 bool RemoveCacheEntry(const RequestParameters& client_scopes, |
290 const std::string& token_to_remove); | 311 const std::string& token_to_remove); |
291 | 312 |
292 | |
293 // Called when |fetcher| finishes fetching. | 313 // Called when |fetcher| finishes fetching. |
294 void OnFetchComplete(Fetcher* fetcher); | 314 void OnFetchComplete(Fetcher* fetcher); |
295 | 315 |
296 // Called when a number of fetchers need to be canceled. | 316 // Called when a number of fetchers need to be canceled. |
297 void CancelFetchers(std::vector<Fetcher*> fetchers_to_cancel); | 317 void CancelFetchers(std::vector<Fetcher*> fetchers_to_cancel); |
298 | 318 |
299 // The cache of currently valid tokens. | 319 // The cache of currently valid tokens. |
300 typedef std::map<ClientScopeSet, CacheEntry> TokenCache; | 320 typedef std::map<RequestParameters, CacheEntry> TokenCache; |
301 TokenCache token_cache_; | 321 TokenCache token_cache_; |
302 | 322 |
303 // A map from fetch parameters to a fetcher that is fetching an OAuth2 access | 323 // A map from fetch parameters to a fetcher that is fetching an OAuth2 access |
304 // token using these parameters. | 324 // token using these parameters. |
305 PendingFetcherMap pending_fetchers_; | 325 PendingFetcherMap pending_fetchers_; |
306 | 326 |
307 // List of observers to notify when token availability changes. | 327 // List of observers to notify when token availability changes. |
308 // Makes sure list is empty on destruction. | 328 // Makes sure list is empty on destruction. |
309 ObserverList<Observer, true> observer_list_; | 329 ObserverList<Observer, true> observer_list_; |
310 | 330 |
311 // Maximum number of retries in fetching an OAuth2 access token. | 331 // Maximum number of retries in fetching an OAuth2 access token. |
312 static int max_fetch_retry_num_; | 332 static int max_fetch_retry_num_; |
313 | 333 |
314 FRIEND_TEST_ALL_PREFIXES(OAuth2TokenServiceTest, ClientScopeSetOrderTest); | 334 FRIEND_TEST_ALL_PREFIXES(OAuth2TokenServiceTest, RequestParametersOrderTest); |
315 FRIEND_TEST_ALL_PREFIXES(OAuth2TokenServiceTest, FetchParametersOrderTest); | |
316 FRIEND_TEST_ALL_PREFIXES(OAuth2TokenServiceTest, | 335 FRIEND_TEST_ALL_PREFIXES(OAuth2TokenServiceTest, |
317 SameScopesRequestedForDifferentClients); | 336 SameScopesRequestedForDifferentClients); |
318 | 337 |
319 DISALLOW_COPY_AND_ASSIGN(OAuth2TokenService); | 338 DISALLOW_COPY_AND_ASSIGN(OAuth2TokenService); |
320 }; | 339 }; |
321 | 340 |
322 #endif // GOOGLE_APIS_GAIA_OAUTH2_TOKEN_SERVICE_H_ | 341 #endif // GOOGLE_APIS_GAIA_OAUTH2_TOKEN_SERVICE_H_ |
OLD | NEW |