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