Updating trunk VERSION from 2139.0 to 2140.0
[chromium-blink-merge.git] / google_apis / gaia / oauth2_mint_token_flow.h
blob6c53c94564821463cc112df36c42eb142e86ec07
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
5 #ifndef GOOGLE_APIS_GAIA_OAUTH2_MINT_TOKEN_FLOW_H_
6 #define GOOGLE_APIS_GAIA_OAUTH2_MINT_TOKEN_FLOW_H_
8 #include <string>
9 #include <vector>
11 #include "base/gtest_prod_util.h"
12 #include "base/memory/weak_ptr.h"
13 #include "base/strings/string16.h"
14 #include "google_apis/gaia/oauth2_api_call_flow.h"
15 #include "url/gurl.h"
17 class GoogleServiceAuthError;
18 class OAuth2MintTokenFlowTest;
20 namespace base {
21 class DictionaryValue;
24 namespace content {
25 class URLFetcher;
28 namespace net {
29 class URLRequestContextGetter;
32 // IssueAdvice: messages to show to the user to get a user's approval.
33 // The structure is as follows:
34 // * Description 1
35 // - Detail 1.1
36 // - Details 1.2
37 // * Description 2
38 // - Detail 2.1
39 // - Detail 2.2
40 // - Detail 2.3
41 // * Description 3
42 // - Detail 3.1
43 struct IssueAdviceInfoEntry {
44 public:
45 IssueAdviceInfoEntry();
46 ~IssueAdviceInfoEntry();
48 base::string16 description;
49 std::vector<base::string16> details;
51 bool operator==(const IssueAdviceInfoEntry& rhs) const;
54 typedef std::vector<IssueAdviceInfoEntry> IssueAdviceInfo;
56 // This class implements the OAuth2 flow to Google to mint an OAuth2
57 // token for the given client and the given set of scopes from the
58 // OAuthLogin scoped "master" OAuth2 token for the user logged in to
59 // Chrome.
60 class OAuth2MintTokenFlow : public OAuth2ApiCallFlow {
61 public:
62 // There are four differnt modes when minting a token to grant
63 // access to third-party app for a user.
64 enum Mode {
65 // Get the messages to display to the user without minting a token.
66 MODE_ISSUE_ADVICE,
67 // Record a grant but do not get a token back.
68 MODE_RECORD_GRANT,
69 // Mint a token for an existing grant.
70 MODE_MINT_TOKEN_NO_FORCE,
71 // Mint a token forcefully even if there is no existing grant.
72 MODE_MINT_TOKEN_FORCE,
75 // Parameters needed to mint a token.
76 struct Parameters {
77 public:
78 Parameters();
79 Parameters(const std::string& at,
80 const std::string& eid,
81 const std::string& cid,
82 const std::vector<std::string>& scopes_arg,
83 Mode mode_arg);
84 ~Parameters();
86 std::string access_token;
87 std::string extension_id;
88 std::string client_id;
89 std::vector<std::string> scopes;
90 Mode mode;
93 class Delegate {
94 public:
95 virtual void OnMintTokenSuccess(const std::string& access_token,
96 int time_to_live) {}
97 virtual void OnIssueAdviceSuccess(const IssueAdviceInfo& issue_advice) {}
98 virtual void OnMintTokenFailure(const GoogleServiceAuthError& error) {}
100 protected:
101 virtual ~Delegate() {}
104 OAuth2MintTokenFlow(net::URLRequestContextGetter* context,
105 Delegate* delegate,
106 const Parameters& parameters);
107 virtual ~OAuth2MintTokenFlow();
109 protected:
110 // Implementation of template methods in OAuth2ApiCallFlow.
111 virtual GURL CreateApiCallUrl() OVERRIDE;
112 virtual std::string CreateApiCallBody() OVERRIDE;
114 virtual void ProcessApiCallSuccess(
115 const net::URLFetcher* source) OVERRIDE;
116 virtual void ProcessApiCallFailure(
117 const net::URLFetcher* source) OVERRIDE;
118 virtual void ProcessNewAccessToken(const std::string& access_token) OVERRIDE;
119 virtual void ProcessMintAccessTokenFailure(
120 const GoogleServiceAuthError& error) OVERRIDE;
122 private:
123 friend class OAuth2MintTokenFlowTest;
124 FRIEND_TEST_ALL_PREFIXES(OAuth2MintTokenFlowTest, CreateApiCallBody);
125 FRIEND_TEST_ALL_PREFIXES(OAuth2MintTokenFlowTest, ParseIssueAdviceResponse);
126 FRIEND_TEST_ALL_PREFIXES(OAuth2MintTokenFlowTest, ParseMintTokenResponse);
127 FRIEND_TEST_ALL_PREFIXES(OAuth2MintTokenFlowTest, ProcessApiCallSuccess);
128 FRIEND_TEST_ALL_PREFIXES(OAuth2MintTokenFlowTest, ProcessApiCallFailure);
129 FRIEND_TEST_ALL_PREFIXES(OAuth2MintTokenFlowTest,
130 ProcessMintAccessTokenFailure);
132 void ReportSuccess(const std::string& access_token, int time_to_live);
133 void ReportIssueAdviceSuccess(const IssueAdviceInfo& issue_advice);
134 void ReportFailure(const GoogleServiceAuthError& error);
136 static bool ParseIssueAdviceResponse(
137 const base::DictionaryValue* dict, IssueAdviceInfo* issue_advice);
138 static bool ParseMintTokenResponse(
139 const base::DictionaryValue* dict, std::string* access_token,
140 int* time_to_live);
142 Delegate* delegate_;
143 Parameters parameters_;
144 base::WeakPtrFactory<OAuth2MintTokenFlow> weak_factory_;
146 DISALLOW_COPY_AND_ASSIGN(OAuth2MintTokenFlow);
149 #endif // GOOGLE_APIS_GAIA_OAUTH2_MINT_TOKEN_FLOW_H_