| Index: chrome/common/net/gaia/oauth2_mint_token_flow.h
|
| ===================================================================
|
| --- chrome/common/net/gaia/oauth2_mint_token_flow.h (revision 130985)
|
| +++ chrome/common/net/gaia/oauth2_mint_token_flow.h (working copy)
|
| @@ -6,33 +6,93 @@
|
| #define CHROME_COMMON_NET_GAIA_OAUTH2_MINT_TOKEN_FLOW_H_
|
|
|
| #include <string>
|
| +#include <vector>
|
|
|
| -#include "base/memory/scoped_ptr.h"
|
| -#include "base/memory/weak_ptr.h"
|
| -#include "chrome/common/net/gaia/oauth2_access_token_consumer.h"
|
| -#include "chrome/common/net/gaia/oauth2_access_token_fetcher.h"
|
| -#include "chrome/common/net/gaia/oauth2_mint_token_consumer.h"
|
| -#include "chrome/common/net/gaia/oauth2_mint_token_fetcher.h"
|
| +#include "chrome/common/net/gaia/oauth2_api_call_flow.h"
|
|
|
| class GoogleServiceAuthError;
|
| class OAuth2MintTokenFlowTest;
|
|
|
| +namespace base {
|
| +class DictionaryValue;
|
| +}
|
| +
|
| +namespace content {
|
| +class URLFetcher;
|
| +}
|
| +
|
| namespace net {
|
| class URLRequestContextGetter;
|
| }
|
|
|
| +// IssueAdvice: messages to show to the user to get a user's approval.
|
| +// The structure is as follows:
|
| +// * Descritpion 1
|
| +// - Detail 1.1
|
| +// - Details 1.2
|
| +// * Description 2
|
| +// - Detail 2.1
|
| +// - Detail 2.2
|
| +// - Detail 2.3
|
| +// * Description 3
|
| +// - Detail 3.1
|
| +struct IssueAdviceInfoEntry {
|
| + public:
|
| + IssueAdviceInfoEntry();
|
| + ~IssueAdviceInfoEntry();
|
| +
|
| + std::string description;
|
| + std::vector<std::string> details;
|
| +
|
| + bool operator==(const IssueAdviceInfoEntry& rhs) const;
|
| +};
|
| +
|
| +typedef std::vector<IssueAdviceInfoEntry> IssueAdviceInfo;
|
| +
|
| // This class implements the OAuth2 flow to Google to mint an OAuth2
|
| // token for the given client and the given set of scopes from the
|
| // OAuthLogin scoped "master" OAuth2 token for the user logged in to
|
| // Chrome.
|
| -class OAuth2MintTokenFlow
|
| - : public OAuth2AccessTokenConsumer,
|
| - public OAuth2MintTokenConsumer {
|
| +class OAuth2MintTokenFlow : public OAuth2ApiCallFlow {
|
| public:
|
| + // There are four differnt modes when minting a token to grant
|
| + // access to third-party app for a user.
|
| + enum Mode {
|
| + // Get the messages to display to the user without minting a token.
|
| + MODE_ISSUE_ADVICE,
|
| + // Record a grant but do not get a token back.
|
| + MODE_RECORD_GRANT,
|
| + // Mint a token for an existing grant.
|
| + MODE_MINT_TOKEN_NO_FORCE,
|
| + // Mint a token forcefully even if there is no existing grant.
|
| + MODE_MINT_TOKEN_FORCE,
|
| + };
|
| +
|
| + // Parameters needed to mint a token.
|
| + struct Parameters {
|
| + public:
|
| + Parameters();
|
| + Parameters(const std::string& rt,
|
| + const std::string& eid,
|
| + const std::string& cid,
|
| + const std::vector<std::string>& scopes_arg,
|
| + Mode mode_arg);
|
| + ~Parameters();
|
| +
|
| + std::string login_refresh_token;
|
| + std::string extension_id;
|
| + std::string client_id;
|
| + std::vector<std::string> scopes;
|
| + Mode mode;
|
| + };
|
| +
|
| class Delegate {
|
| public:
|
| - virtual void OnMintTokenSuccess(const std::string& access_token) { }
|
| - virtual void OnMintTokenFailure(const GoogleServiceAuthError& error) { }
|
| + Delegate() {}
|
| + virtual ~Delegate() {}
|
| + virtual void OnMintTokenSuccess(const std::string& access_token) {}
|
| + virtual void OnIssueAdviceSuccess(const IssueAdviceInfo& issue_advice) {}
|
| + virtual void OnMintTokenFailure(const GoogleServiceAuthError& error) {}
|
| };
|
|
|
| // An interceptor for tests.
|
| @@ -47,90 +107,48 @@
|
| static void SetInterceptorForTests(InterceptorForTests* interceptor);
|
|
|
| OAuth2MintTokenFlow(net::URLRequestContextGetter* context,
|
| - Delegate* delegate);
|
| + Delegate* delegate,
|
| + const Parameters& parameters);
|
| virtual ~OAuth2MintTokenFlow();
|
|
|
| - // Start the process to mint a token.
|
| - void Start(const std::string& login_refresh_token,
|
| - const std::string& extension_id,
|
| - const std::string& client_id,
|
| - const std::vector<std::string>& scopes);
|
| + virtual void Start() OVERRIDE;
|
|
|
| - // OAuth2AccessTokenConsumer implementation.
|
| - virtual void OnGetTokenSuccess(const std::string& access_token) OVERRIDE;
|
| - virtual void OnGetTokenFailure(const GoogleServiceAuthError& error) OVERRIDE;
|
| - // OAuth2MintTokenConsumer implementation.
|
| - virtual void OnMintTokenSuccess(const std::string& access_token) OVERRIDE;
|
| - virtual void OnMintTokenFailure(const GoogleServiceAuthError& error) OVERRIDE;
|
| -
|
| - // Getters for various members.
|
| - const std::string& extension_id() const { return extension_id_; }
|
| - const std::string& client_id() const { return client_id_; }
|
| -
|
| protected:
|
| - // Helper to create an instance of access token fetcher.
|
| - // Caller owns the returned instance.
|
| - virtual OAuth2AccessTokenFetcher* CreateAccessTokenFetcher();
|
| + // Implementation of template methods in OAuth2ApiCallFlow.
|
| + virtual GURL CreateApiCallUrl() OVERRIDE;
|
| + virtual std::string CreateApiCallBody() OVERRIDE;
|
|
|
| - // Helper to create an instance of mint token fetcher.
|
| - // Caller owns the returned instance.
|
| - virtual OAuth2MintTokenFetcher* CreateMintTokenFetcher();
|
| + virtual void ProcessApiCallSuccess(
|
| + const content::URLFetcher* source) OVERRIDE;
|
| + virtual void ProcessApiCallFailure(
|
| + const content::URLFetcher* source) OVERRIDE;
|
| + virtual void ProcessNewAccessToken(const std::string& access_token) OVERRIDE;
|
| + virtual void ProcessMintAccessTokenFailure(
|
| + const GoogleServiceAuthError& error) OVERRIDE;
|
|
|
| private:
|
| - // The steps this class performs are:
|
| - // 1. Create a login scoped access token from login scoped refresh token.
|
| - // 2. Use login scoped access token to call the API to mint an access token
|
| - // for the app.
|
| - enum State {
|
| - INITIAL,
|
| - FETCH_LOGIN_ACCESS_TOKEN_STARTED,
|
| - FETCH_LOGIN_ACCESS_TOKEN_DONE,
|
| - MINT_ACCESS_TOKEN_STARTED,
|
| - MINT_ACCESS_TOKEN_DONE,
|
| - ERROR_STATE
|
| - };
|
| -
|
| - enum SetupError {
|
| - NONE,
|
| - AUTH_ERROR,
|
| - INTERNAL_ERROR,
|
| - USER_CANCELLED,
|
| -
|
| - // This is used for histograms, and should always be the last value.
|
| - SETUP_ERROR_BOUNDARY
|
| - };
|
| -
|
| friend class OAuth2MintTokenFlowTest;
|
| + FRIEND_TEST_ALL_PREFIXES(OAuth2MintTokenFlowTest, CreateApiCallBody);
|
| + FRIEND_TEST_ALL_PREFIXES(OAuth2MintTokenFlowTest, ParseIssueAdviceResponse);
|
| + FRIEND_TEST_ALL_PREFIXES(OAuth2MintTokenFlowTest, ParseMintTokenResponse);
|
| + FRIEND_TEST_ALL_PREFIXES(OAuth2MintTokenFlowTest, ProcessApiCallSuccess);
|
| + FRIEND_TEST_ALL_PREFIXES(OAuth2MintTokenFlowTest, ProcessApiCallFailure);
|
| + FRIEND_TEST_ALL_PREFIXES(OAuth2MintTokenFlowTest,
|
| + ProcessMintAccessTokenFailure);
|
|
|
| - // Creates an instance of URLFetcher that does not send or save cookies.
|
| - // The URLFether's method will be GET if body is empty, POST otherwise.
|
| - // Caller owns the returned instance.
|
| - content::URLFetcher* CreateURLFetcher(
|
| - const GURL& url, const std::string& body, const std::string& auth_token);
|
| - void BeginGetLoginAccessToken();
|
| - void EndGetLoginAccessToken(const GoogleServiceAuthError* error);
|
| - void BeginMintAccessToken();
|
| - void EndMintAccessToken(const GoogleServiceAuthError* error);
|
| -
|
| - void ReportSuccess();
|
| + void ReportSuccess(const std::string& access_token);
|
| + void ReportSuccess(const IssueAdviceInfo& issue_advice);
|
| void ReportFailure(const GoogleServiceAuthError& error);
|
|
|
| - static std::string GetErrorString(SetupError error);
|
| + static bool ParseIssueAdviceResponse(
|
| + const base::DictionaryValue* dict, IssueAdviceInfo* issue_advice);
|
| + static bool ParseMintTokenResponse(
|
| + const base::DictionaryValue* dict, std::string* access_token);
|
|
|
| net::URLRequestContextGetter* context_;
|
| Delegate* delegate_;
|
| - State state_;
|
| + Parameters parameters_;
|
|
|
| - std::string login_refresh_token_;
|
| - std::string extension_id_;
|
| - std::string client_id_;
|
| - std::vector<std::string> scopes_;
|
| -
|
| - scoped_ptr<OAuth2AccessTokenFetcher> oauth2_access_token_fetcher_;
|
| - scoped_ptr<OAuth2MintTokenFetcher> oauth2_mint_token_fetcher_;
|
| - std::string login_access_token_;
|
| - std::string app_access_token_;
|
| -
|
| DISALLOW_COPY_AND_ASSIGN(OAuth2MintTokenFlow);
|
| };
|
|
|
|
|