fake_profile_oauth2_token_service.cc revision e5d81f57cb97b3b6b7fccc9c5610d21eb81db09d
15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright 2013 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/signin/fake_profile_oauth2_token_service.h" 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/message_loop/message_loop.h" 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "components/signin/core/browser/signin_account_id_helper.h" 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)FakeProfileOAuth2TokenService::PendingRequest::PendingRequest() { 11f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)} 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)FakeProfileOAuth2TokenService::PendingRequest::~PendingRequest() { 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)FakeProfileOAuth2TokenService::FakeProfileOAuth2TokenService() 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : auto_post_fetch_response_on_message_loop_(false) { 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SigninAccountIdHelper::SetDisableForTest(true); 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)FakeProfileOAuth2TokenService::~FakeProfileOAuth2TokenService() { 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SigninAccountIdHelper::SetDisableForTest(false); 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool FakeProfileOAuth2TokenService::RefreshTokenIsAvailable( 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& account_id) const { 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return !GetRefreshToken(account_id).empty(); 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void FakeProfileOAuth2TokenService::LoadCredentials( 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& primary_account_id) { 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Empty implementation as FakeProfileOAuth2TokenService does not have any 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // credentials to load. 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)std::vector<std::string> FakeProfileOAuth2TokenService::GetAccounts() { 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::vector<std::string> account_ids; 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (std::map<std::string, std::string>::const_iterator iter = 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) refresh_tokens_.begin(); iter != refresh_tokens_.end(); ++iter) { 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) account_ids.push_back(iter->first); 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return account_ids; 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void FakeProfileOAuth2TokenService::UpdateCredentials( 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& account_id, 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& refresh_token) { 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IssueRefreshTokenForUser(account_id, refresh_token); 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void FakeProfileOAuth2TokenService::IssueRefreshToken( 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& token) { 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IssueRefreshTokenForUser("account_id", token); 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void FakeProfileOAuth2TokenService::IssueRefreshTokenForUser( 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& account_id, 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& token) { 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (token.empty()) { 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) refresh_tokens_.erase(account_id); 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FireRefreshTokenRevoked(account_id); 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) refresh_tokens_[account_id] = token; 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FireRefreshTokenAvailable(account_id); 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // TODO(atwilson): Maybe we should also call FireRefreshTokensLoaded() here? 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void FakeProfileOAuth2TokenService::IssueAllTokensForAccount( 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& account_id, 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& access_token, 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const base::Time& expiration) { 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CompleteRequests(account_id, 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) true, 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ScopeSet(), 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GoogleServiceAuthError::AuthErrorNone(), 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) access_token, 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expiration); 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void FakeProfileOAuth2TokenService::IssueTokenForScope( 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const ScopeSet& scope, 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& access_token, 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const base::Time& expiration) { 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CompleteRequests("", 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) false, 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scope, 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GoogleServiceAuthError::AuthErrorNone(), 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) access_token, 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expiration); 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void FakeProfileOAuth2TokenService::IssueErrorForScope( 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const ScopeSet& scope, 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GoogleServiceAuthError& error) { 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CompleteRequests("", false, scope, error, std::string(), base::Time()); 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void FakeProfileOAuth2TokenService::IssueErrorForAllPendingRequests( 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GoogleServiceAuthError& error) { 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CompleteRequests("", true, ScopeSet(), error, std::string(), base::Time()); 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void FakeProfileOAuth2TokenService::IssueTokenForAllPendingRequests( 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& access_token, 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const base::Time& expiration) { 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CompleteRequests("", 1082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) true, 1092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ScopeSet(), 1102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GoogleServiceAuthError::AuthErrorNone(), 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) access_token, 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expiration); 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void FakeProfileOAuth2TokenService::CompleteRequests( 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& account_id, 1172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool all_scopes, 1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const ScopeSet& scope, 1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GoogleServiceAuthError& error, 1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& access_token, 1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const base::Time& expiration) { 1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::vector<FakeProfileOAuth2TokenService::PendingRequest> requests = 1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetPendingRequests(); 1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Walk the requests and notify the callbacks. 1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (std::vector<PendingRequest>::iterator it = pending_requests_.begin(); 1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) it != pending_requests_.end(); ++it) { 1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!it->request) 1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) continue; 1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool scope_matches = all_scopes || it->scopes == scope; 1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool account_matches = account_id.empty() || account_id == it->account_id; 1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (account_matches && scope_matches) 1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) it->request->InformConsumer(error, access_token, expiration); 1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)std::string FakeProfileOAuth2TokenService::GetRefreshToken( 1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& account_id) const { 1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::map<std::string, std::string>::const_iterator it = 1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) refresh_tokens_.find(account_id); 1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (it != refresh_tokens_.end()) 1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return it->second; 144a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) return std::string(); 145a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)} 1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)net::URLRequestContextGetter* 1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)FakeProfileOAuth2TokenService::GetRequestContext() { 1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return NULL; 1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)std::vector<FakeProfileOAuth2TokenService::PendingRequest> 1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)FakeProfileOAuth2TokenService::GetPendingRequests() { 1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::vector<PendingRequest> valid_requests; 1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (std::vector<PendingRequest>::iterator it = pending_requests_.begin(); 1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) it != pending_requests_.end(); ++it) { 1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (it->request) 1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) valid_requests.push_back(*it); 1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return valid_requests; 1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void FakeProfileOAuth2TokenService::FetchOAuth2Token( 1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RequestImpl* request, 1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& account_id, 1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) net::URLRequestContextGetter* getter, 1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& client_id, 1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& client_secret, 1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const ScopeSet& scopes) { 1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PendingRequest pending_request; 1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pending_request.account_id = account_id; 1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pending_request.client_id = client_id; 1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pending_request.client_secret = client_secret; 1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pending_request.scopes = scopes; 1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pending_request.request = request->AsWeakPtr(); 1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pending_requests_.push_back(pending_request); 1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (auto_post_fetch_response_on_message_loop_) { 1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::MessageLoop::current()->PostTask(FROM_HERE, base::Bind( 1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &FakeProfileOAuth2TokenService::IssueAllTokensForAccount, 1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Unretained(this), 1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) account_id, 1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "access_token", 1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Time::Max())); 1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)OAuth2AccessTokenFetcher* 1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)FakeProfileOAuth2TokenService::CreateAccessTokenFetcher( 1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& account_id, 1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) net::URLRequestContextGetter* getter, 1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OAuth2AccessTokenConsumer* consumer) { 1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NOTREACHED(); 1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return NULL; 1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void FakeProfileOAuth2TokenService::InvalidateOAuth2Token( 1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& account_id, 1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& client_id, 2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const ScopeSet& scopes, 2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& access_token) { 2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Do nothing, as we don't have a cache from which to remove the token. 2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)