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

Unified Diff: chrome/browser/signin/oauth2_token_service.cc

Issue 12880014: Get OAuth2TokenService working on Android. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: add token invalidation. Created 7 years, 9 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 side-by-side diff with in-line comments
Download patch
Index: chrome/browser/signin/oauth2_token_service.cc
diff --git a/chrome/browser/signin/oauth2_token_service.cc b/chrome/browser/signin/oauth2_token_service.cc
index a0392973e75af8b59e79b4aa44f5846f764cb029..dc1003401b8c792623f4b3ff7ce7bdbac2dad95d 100644
--- a/chrome/browser/signin/oauth2_token_service.cc
+++ b/chrome/browser/signin/oauth2_token_service.cc
@@ -29,6 +29,10 @@
#include "google_apis/gaia/oauth2_access_token_consumer.h"
#include "google_apis/gaia/oauth2_access_token_fetcher.h"
+#if defined(OS_ANDROID)
+#include "chrome/browser/sync/profile_sync_service_android.h"
+#endif
+
namespace {
// Maximum number of retries in fetching an OAuth2 access token.
@@ -374,10 +378,19 @@ void OAuth2TokenService::InformConsumer(
scoped_ptr<OAuth2TokenService::Request> OAuth2TokenService::StartRequest(
const OAuth2TokenService::ScopeSet& scopes,
OAuth2TokenService::Consumer* consumer) {
+ return InvalidateTokenAndStartRequest(scopes, consumer, std::string());
+}
+
+scoped_ptr<OAuth2TokenService::Request>
+OAuth2TokenService::InvalidateTokenAndStartRequest(
+ const OAuth2TokenService::ScopeSet& scopes,
+ OAuth2TokenService::Consumer* consumer,
+ const std::string& invalid_token) {
DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI));
scoped_ptr<RequestImpl> request(new RequestImpl(consumer));
+#if !defined(OS_ANDROID)
TokenService* token_service = TokenServiceFactory::GetForProfile(profile_);
if (!token_service || !token_service->HasOAuthLoginToken()) {
MessageLoop::current()->PostTask(FROM_HERE, base::Bind(
@@ -388,6 +401,10 @@ scoped_ptr<OAuth2TokenService::Request> OAuth2TokenService::StartRequest(
base::Time()));
return request.PassAs<Request>();
}
+#endif
+
+ if (!invalid_token.empty())
+ RemoveCacheEntry(scopes, invalid_token);
const CacheEntry* cache_entry = GetCacheEntry(scopes);
if (cache_entry && cache_entry->access_token.length()) {
@@ -400,6 +417,18 @@ scoped_ptr<OAuth2TokenService::Request> OAuth2TokenService::StartRequest(
return request.PassAs<Request>();
}
+#if defined(OS_ANDROID)
+ DCHECK_EQ(scopes.size(), 1U);
+ std::vector<std::string> scope_list(scopes.begin(), scopes.end());
+ ProfileSyncServiceAndroid* sync_service =
+ ProfileSyncServiceAndroid::GetProfileSyncServiceAndroid();
+ sync_service->FetchOAuth2Token(
+ scope_list.front(),
+ invalid_token,
+ base::Bind(&OAuth2TokenService::InformConsumer,
+ request->AsWeakPtr()));
+ return request.PassAs<Request>();
+#else
std::string refresh_token = token_service->GetOAuth2LoginRefreshToken();
if (!refresh_token.length()) {
MessageLoop::current()->PostTask(FROM_HERE, base::Bind(
@@ -425,6 +454,7 @@ scoped_ptr<OAuth2TokenService::Request> OAuth2TokenService::StartRequest(
pending_fetchers_[fetch_parameters] = Fetcher::CreateAndStart(
profile_, getter_, refresh_token, scopes, request->AsWeakPtr());
return request.PassAs<Request>();
+#endif // defined(OS_ANDROID)
}
void OAuth2TokenService::OnFetchComplete(Fetcher* fetcher) {
@@ -482,6 +512,19 @@ const OAuth2TokenService::CacheEntry* OAuth2TokenService::GetCacheEntry(
return &token_iterator->second;
}
+bool OAuth2TokenService::RemoveCacheEntry(
+ const OAuth2TokenService::ScopeSet& scopes,
+ const std::string& token_to_remove) {
+ DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI));
+ TokenCache::iterator token_iterator = token_cache_.find(scopes);
+ if (token_iterator == token_cache_.end() &&
+ token_iterator->second.access_token == token_to_remove) {
+ token_cache_.erase(token_iterator);
+ return true;
+ }
+ return false;
+}
+
void OAuth2TokenService::RegisterCacheEntry(
const std::string& refresh_token,
const OAuth2TokenService::ScopeSet& scopes,
@@ -489,6 +532,7 @@ void OAuth2TokenService::RegisterCacheEntry(
const base::Time& expiration_date) {
DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI));
+#if !defined(OS_ANDROID)
// Only register OAuth2 access tokens for the refresh token held by
// TokenService.
TokenService* token_service = TokenServiceFactory::GetForProfile(profile_);
@@ -499,6 +543,7 @@ void OAuth2TokenService::RegisterCacheEntry(
"Received a token with a refresh token not maintained by TokenService.";
return;
}
+#endif
CacheEntry& token = token_cache_[scopes];
token.access_token = access_token;

Powered by Google App Engine
This is Rietveld 408576698