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)