mutable_profile_oauth2_token_service.h revision effb81e5f8246d0db0270817048dc992db66e9fb
1710632d07b13609444626367bebd34c0af3acb6aMikhail Glushenkov// Copyright 2014 The Chromium Authors. All rights reserved.
26091ebd172a16a10f1ea66061a5fa7cbf5139e56Reid Spencer// Use of this source code is governed by a BSD-style license that can be
36091ebd172a16a10f1ea66061a5fa7cbf5139e56Reid Spencer// found in the LICENSE file.
46091ebd172a16a10f1ea66061a5fa7cbf5139e56Reid Spencer
57ed47a13356daed2a34cd2209a31f92552e3bdd8Chris Lattner#ifndef COMPONENTS_SIGNIN_CORE_BROWSER_MUTABLE_PROFILE_OAUTH2_TOKEN_SERVICE_H_
67ed47a13356daed2a34cd2209a31f92552e3bdd8Chris Lattner#define COMPONENTS_SIGNIN_CORE_BROWSER_MUTABLE_PROFILE_OAUTH2_TOKEN_SERVICE_H_
76091ebd172a16a10f1ea66061a5fa7cbf5139e56Reid Spencer
86091ebd172a16a10f1ea66061a5fa7cbf5139e56Reid Spencer#include "base/memory/scoped_vector.h"
927107f6ab4627fa38bcacad6757ed6d52910f880Bill Wendling#include "base/threading/thread_checker.h"
1027107f6ab4627fa38bcacad6757ed6d52910f880Bill Wendling#include "components/signin/core/browser/profile_oauth2_token_service.h"
1127107f6ab4627fa38bcacad6757ed6d52910f880Bill Wendling#include "components/webdata/common/web_data_service_base.h"
1227107f6ab4627fa38bcacad6757ed6d52910f880Bill Wendling#include "components/webdata/common/web_data_service_consumer.h"
1327107f6ab4627fa38bcacad6757ed6d52910f880Bill Wendling
146091ebd172a16a10f1ea66061a5fa7cbf5139e56Reid Spencer// A specialization of ProfileOAuth2TokenService that can can mutate its OAuth2
156091ebd172a16a10f1ea66061a5fa7cbf5139e56Reid Spencer// tokens.
16674be02d525d4e24bc6943ed9274958c580bcfbcJakub Staszak//
17674be02d525d4e24bc6943ed9274958c580bcfbcJakub Staszak// Note: This class is just a placeholder for now. Methods used to mutate
186091ebd172a16a10f1ea66061a5fa7cbf5139e56Reid Spencer// the tokens are currently being migrated from ProfileOAuth2TokenService.
19d509d0b532ec2358b3f341d4a4cd1411cb8b5db2Chris Lattnerclass MutableProfileOAuth2TokenService : public ProfileOAuth2TokenService,
200319888773b36dd61d7d2283cb9a26cac1e5abe8Bill Wendling                                         public WebDataServiceConsumer  {
213467e30edf63b6d8a8d446186674ba9e4b7885a9Bill Wendling public:
2222bd64173981bf1251c4b3bfc684207340534ba3Bill Wendling  // ProfileOAuth2TokenService overrides.
23ea59f896a672c2e1ef9f02277bce60257aa60989Bill Wendling  virtual void Shutdown() OVERRIDE;
2458d74910c6b82e622ecbb57d6644d48fec5a5c0fChris Lattner  virtual std::vector<std::string> GetAccounts() OVERRIDE;
256091ebd172a16a10f1ea66061a5fa7cbf5139e56Reid Spencer
266091ebd172a16a10f1ea66061a5fa7cbf5139e56Reid Spencer  // The below three methods should be called only on the thread on which this
27d426a642a23a234547cbc7061f5bfec157673249Bill Wendling  // object was created.
28702cc91aa1bd41540e8674921ae7ac89a4ff061fBill Wendling  virtual void LoadCredentials(const std::string& primary_account_id) OVERRIDE;
29f6670729aabc1fab85238d2b306a1c1767a807bbBill Wendling  virtual void UpdateCredentials(const std::string& account_id,
30817abdd8b055059e5930a15704b9f52da4236456Bill Wendling                                 const std::string& refresh_token) OVERRIDE;
31817abdd8b055059e5930a15704b9f52da4236456Bill Wendling  virtual void RevokeAllCredentials() OVERRIDE;
326dc3781d44e56f0addf28b06232a50f3f9e6b1afBill Wendling  virtual bool RefreshTokenIsAvailable(const std::string& account_id) const
332c79ecbd704c656178ffa43d5a58ebe3ca188b40Bill Wendling      OVERRIDE;
34ad9a9e15595bc9d5ba1ed752caf8572957f77a3dDuncan Sands
35ad9a9e15595bc9d5ba1ed752caf8572957f77a3dDuncan Sands  // Revokes credentials related to |account_id|.
361d3dcfe4246b4d45fa78a8dfd0a11c7fff842c15Bill Wendling  void RevokeCredentials(const std::string& account_id);
3727107f6ab4627fa38bcacad6757ed6d52910f880Bill Wendling
3827107f6ab4627fa38bcacad6757ed6d52910f880Bill Wendling protected:
391d3dcfe4246b4d45fa78a8dfd0a11c7fff842c15Bill Wendling  class AccountInfo : public SigninErrorController::AuthStatusProvider {
401d3dcfe4246b4d45fa78a8dfd0a11c7fff842c15Bill Wendling   public:
411d3dcfe4246b4d45fa78a8dfd0a11c7fff842c15Bill Wendling    AccountInfo(ProfileOAuth2TokenService* token_service,
42034b94b17006f51722886b0f2283fb6fb19aca1fBill Wendling                const std::string& account_id,
436765834754cbb3cb0f15b4b15e98c5e73fa50066Bill Wendling                const std::string& refresh_token);
441d3dcfe4246b4d45fa78a8dfd0a11c7fff842c15Bill Wendling    virtual ~AccountInfo();
4573dee180c836270644dfa7d90f9c5ba877567999Bill Wendling
46f3d1500ab2c7364d3d0fb73a7e1b8c6339ab48b1Bill Wendling    const std::string& refresh_token() const { return refresh_token_; }
4773dee180c836270644dfa7d90f9c5ba877567999Bill Wendling    void set_refresh_token(const std::string& token) {
4873dee180c836270644dfa7d90f9c5ba877567999Bill Wendling      refresh_token_ = token;
4973dee180c836270644dfa7d90f9c5ba877567999Bill Wendling    }
50f3d1500ab2c7364d3d0fb73a7e1b8c6339ab48b1Bill Wendling
5173dee180c836270644dfa7d90f9c5ba877567999Bill Wendling    void SetLastAuthError(const GoogleServiceAuthError& error);
5211d00420e42ba88c3b48cab997965a7be79315e2Bill Wendling
5311d00420e42ba88c3b48cab997965a7be79315e2Bill Wendling    // SigninErrorController::AuthStatusProvider implementation.
54f3d1500ab2c7364d3d0fb73a7e1b8c6339ab48b1Bill Wendling    virtual std::string GetAccountId() const OVERRIDE;
5511d00420e42ba88c3b48cab997965a7be79315e2Bill Wendling    virtual GoogleServiceAuthError GetAuthStatus() const OVERRIDE;
5611d00420e42ba88c3b48cab997965a7be79315e2Bill Wendling
5711d00420e42ba88c3b48cab997965a7be79315e2Bill Wendling   private:
5811d00420e42ba88c3b48cab997965a7be79315e2Bill Wendling    ProfileOAuth2TokenService* token_service_;
5911d00420e42ba88c3b48cab997965a7be79315e2Bill Wendling    std::string account_id_;
6011d00420e42ba88c3b48cab997965a7be79315e2Bill Wendling    std::string refresh_token_;
61629fb82419d9bfff6ae475363bcce66192dfcc8eBill Wendling    GoogleServiceAuthError last_auth_error_;
625a0eeb5a9d727940b1dbe8dff6e9aa292ada0f6aBill Wendling
63480b1b28ea6fc1bb5c78d99472df624cfd3fce47Bill Wendling    DISALLOW_COPY_AND_ASSIGN(AccountInfo);
64480b1b28ea6fc1bb5c78d99472df624cfd3fce47Bill Wendling  };
65480b1b28ea6fc1bb5c78d99472df624cfd3fce47Bill Wendling
666765834754cbb3cb0f15b4b15e98c5e73fa50066Bill Wendling  // Maps the |account_id| of accounts known to ProfileOAuth2TokenService
67f6670729aabc1fab85238d2b306a1c1767a807bbBill Wendling  // to information about the account.
68480b1b28ea6fc1bb5c78d99472df624cfd3fce47Bill Wendling  typedef std::map<std::string, linked_ptr<AccountInfo> > AccountInfoMap;
69480b1b28ea6fc1bb5c78d99472df624cfd3fce47Bill Wendling
70480b1b28ea6fc1bb5c78d99472df624cfd3fce47Bill Wendling  friend class ProfileOAuth2TokenServiceFactory;
71480b1b28ea6fc1bb5c78d99472df624cfd3fce47Bill Wendling
729a419f656e278b96e9dfe739cd63c7bff9a4e1fdQuentin Colombet  MutableProfileOAuth2TokenService();
73480b1b28ea6fc1bb5c78d99472df624cfd3fce47Bill Wendling  virtual ~MutableProfileOAuth2TokenService();
74480b1b28ea6fc1bb5c78d99472df624cfd3fce47Bill Wendling
75480b1b28ea6fc1bb5c78d99472df624cfd3fce47Bill Wendling  // OAuth2TokenService implementation.
76480b1b28ea6fc1bb5c78d99472df624cfd3fce47Bill Wendling  virtual OAuth2AccessTokenFetcher* CreateAccessTokenFetcher(
7767ae13575900e8efd056672987249fd0adbf5e73James Molloy      const std::string& account_id,
78480b1b28ea6fc1bb5c78d99472df624cfd3fce47Bill Wendling      net::URLRequestContextGetter* getter,
79480b1b28ea6fc1bb5c78d99472df624cfd3fce47Bill Wendling      OAuth2AccessTokenConsumer* consumer) OVERRIDE;
80480b1b28ea6fc1bb5c78d99472df624cfd3fce47Bill Wendling  virtual net::URLRequestContextGetter* GetRequestContext() OVERRIDE;
813a106e60366a51b4594ec303ff8dbbc58913227fBill Wendling
82480b1b28ea6fc1bb5c78d99472df624cfd3fce47Bill Wendling  // Updates the internal cache of the result from the most-recently-completed
83480b1b28ea6fc1bb5c78d99472df624cfd3fce47Bill Wendling  // auth request (used for reporting errors to the user).
84480b1b28ea6fc1bb5c78d99472df624cfd3fce47Bill Wendling  virtual void UpdateAuthError(const std::string& account_id,
85480b1b28ea6fc1bb5c78d99472df624cfd3fce47Bill Wendling                               const GoogleServiceAuthError& error) OVERRIDE;
86480b1b28ea6fc1bb5c78d99472df624cfd3fce47Bill Wendling
87480b1b28ea6fc1bb5c78d99472df624cfd3fce47Bill Wendling  virtual std::string GetRefreshToken(const std::string& account_id) const;
88480b1b28ea6fc1bb5c78d99472df624cfd3fce47Bill Wendling
89480b1b28ea6fc1bb5c78d99472df624cfd3fce47Bill Wendling  AccountInfoMap& refresh_tokens() { return refresh_tokens_; }
90480b1b28ea6fc1bb5c78d99472df624cfd3fce47Bill Wendling
916765834754cbb3cb0f15b4b15e98c5e73fa50066Bill Wendling private:
926765834754cbb3cb0f15b4b15e98c5e73fa50066Bill Wendling  class RevokeServerRefreshToken;
93f6670729aabc1fab85238d2b306a1c1767a807bbBill Wendling
94480b1b28ea6fc1bb5c78d99472df624cfd3fce47Bill Wendling  FRIEND_TEST_ALL_PREFIXES(MutableProfileOAuth2TokenServiceTest,
95480b1b28ea6fc1bb5c78d99472df624cfd3fce47Bill Wendling                           TokenServiceUpdateClearsCache);
96114baee1fa017daefad2339c77b45b9ca3d79a41Bill Wendling  FRIEND_TEST_ALL_PREFIXES(MutableProfileOAuth2TokenServiceTest,
97480b1b28ea6fc1bb5c78d99472df624cfd3fce47Bill Wendling                           PersistenceDBUpgrade);
98480b1b28ea6fc1bb5c78d99472df624cfd3fce47Bill Wendling  FRIEND_TEST_ALL_PREFIXES(MutableProfileOAuth2TokenServiceTest,
990319888773b36dd61d7d2283cb9a26cac1e5abe8Bill Wendling                           PersistenceLoadCredentials);
1000319888773b36dd61d7d2283cb9a26cac1e5abe8Bill Wendling
1013a4779a9211281a1d0c27c97037342329035a185NAKAMURA Takumi  // WebDataServiceConsumer implementation:
1023a4779a9211281a1d0c27c97037342329035a185NAKAMURA Takumi  virtual void OnWebDataServiceRequestDone(
1036f78fbbc630d2b86fb752574f5ad74473f57dfb1Chandler Carruth      WebDataServiceBase::Handle handle,
1046f78fbbc630d2b86fb752574f5ad74473f57dfb1Chandler Carruth      const WDTypedResult* result) OVERRIDE;
1056765834754cbb3cb0f15b4b15e98c5e73fa50066Bill Wendling
1066765834754cbb3cb0f15b4b15e98c5e73fa50066Bill Wendling  // Loads credentials into in memory stucture.
10727107f6ab4627fa38bcacad6757ed6d52910f880Bill Wendling  void LoadAllCredentialsIntoMemory(
10827107f6ab4627fa38bcacad6757ed6d52910f880Bill Wendling      const std::map<std::string, std::string>& db_tokens);
109d426a642a23a234547cbc7061f5bfec157673249Bill Wendling
11027107f6ab4627fa38bcacad6757ed6d52910f880Bill Wendling  // Persists credentials for |account_id|. Enables overriding for
1112c79ecbd704c656178ffa43d5a58ebe3ca188b40Bill Wendling  // testing purposes, or other cases, when accessing the DB is not desired.
112c22f4aa886443507f8406d30d118fdeeac6a8c6cBill Wendling  void PersistCredentials(const std::string& account_id,
113c22f4aa886443507f8406d30d118fdeeac6a8c6cBill Wendling                          const std::string& refresh_token);
114c22f4aa886443507f8406d30d118fdeeac6a8c6cBill Wendling
115c22f4aa886443507f8406d30d118fdeeac6a8c6cBill Wendling  // Clears credentials persisted for |account_id|. Enables overriding for
116c08a5ef6581f2c7550e92d31f63cd65ec29c39e0Bill Wendling  // testing purposes, or other cases, when accessing the DB is not desired.
1178c74ecfbddabe89e150abff4fdff0a27108874b9Bill Wendling  void ClearPersistedCredentials(const std::string& account_id);
1188c74ecfbddabe89e150abff4fdff0a27108874b9Bill Wendling
1198c74ecfbddabe89e150abff4fdff0a27108874b9Bill Wendling  // Revokes the refresh token on the server.
1202c79ecbd704c656178ffa43d5a58ebe3ca188b40Bill Wendling  void RevokeCredentialsOnServer(const std::string& refresh_token);
121c08a5ef6581f2c7550e92d31f63cd65ec29c39e0Bill Wendling
122c08a5ef6581f2c7550e92d31f63cd65ec29c39e0Bill Wendling  // Cancels any outstanding fetch for tokens from the web database.
123c08a5ef6581f2c7550e92d31f63cd65ec29c39e0Bill Wendling  void CancelWebTokenFetch();
124c08a5ef6581f2c7550e92d31f63cd65ec29c39e0Bill Wendling
125c08a5ef6581f2c7550e92d31f63cd65ec29c39e0Bill Wendling  // In memory refresh token store mapping account_id to refresh_token.
126c22f4aa886443507f8406d30d118fdeeac6a8c6cBill Wendling  AccountInfoMap refresh_tokens_;
127c22f4aa886443507f8406d30d118fdeeac6a8c6cBill Wendling
128c22f4aa886443507f8406d30d118fdeeac6a8c6cBill Wendling  // Handle to the request reading tokens from database.
129c22f4aa886443507f8406d30d118fdeeac6a8c6cBill Wendling  WebDataServiceBase::Handle web_data_service_request_;
1308c74ecfbddabe89e150abff4fdff0a27108874b9Bill Wendling
1318c74ecfbddabe89e150abff4fdff0a27108874b9Bill Wendling  // The primary account id of this service's profile during the loading of
1328c74ecfbddabe89e150abff4fdff0a27108874b9Bill Wendling  // credentials.  This member is empty otherwise.
1338c74ecfbddabe89e150abff4fdff0a27108874b9Bill Wendling  std::string loading_primary_account_id_;
1348c74ecfbddabe89e150abff4fdff0a27108874b9Bill Wendling
1358c74ecfbddabe89e150abff4fdff0a27108874b9Bill Wendling  ScopedVector<RevokeServerRefreshToken> server_revokes_;
1368c74ecfbddabe89e150abff4fdff0a27108874b9Bill Wendling
1378c74ecfbddabe89e150abff4fdff0a27108874b9Bill Wendling  // Used to verify that certain methods are called only on the thread on which
1388c74ecfbddabe89e150abff4fdff0a27108874b9Bill Wendling  // this instance was created.
1398c74ecfbddabe89e150abff4fdff0a27108874b9Bill Wendling  base::ThreadChecker thread_checker_;
140eddab1550ee10cce3bb26a26e88529cb19451aa3NAKAMURA Takumi
141eddab1550ee10cce3bb26a26e88529cb19451aa3NAKAMURA Takumi  DISALLOW_COPY_AND_ASSIGN(MutableProfileOAuth2TokenService);
142eddab1550ee10cce3bb26a26e88529cb19451aa3NAKAMURA Takumi};
14364754f499058b5dc748ea6d06a084af0ed539ec4Bill Wendling
14464754f499058b5dc748ea6d06a084af0ed539ec4Bill Wendling#endif  // COMPONENTS_SIGNIN_CORE_BROWSER_MUTABLE_PROFILE_OAUTH2_TOKEN_SERVICE_H_
14564754f499058b5dc748ea6d06a084af0ed539ec4Bill Wendling