- add sources.
[platform/framework/web/crosswalk.git] / src / chrome / browser / net / gaia / gaia_oauth_fetcher.h
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.
4
5 #ifndef CHROME_BROWSER_NET_GAIA_GAIA_OAUTH_FETCHER_H_
6 #define CHROME_BROWSER_NET_GAIA_GAIA_OAUTH_FETCHER_H_
7
8 #include <string>
9 #include <vector>
10
11 #include "base/memory/scoped_ptr.h"
12 #include "google_apis/gaia/google_service_auth_error.h"
13 #include "net/url_request/url_fetcher_delegate.h"
14 #include "url/gurl.h"
15
16 class GaiaOAuthConsumer;
17
18 namespace net {
19 class URLFetcher;
20 class URLRequestContextGetter;
21 class URLRequestStatus;
22 typedef std::vector<std::string> ResponseCookies;
23 }
24
25 // Authenticate a user using Gaia's OAuth1 and OAuth2 support.
26 //
27 // Users of this class typically desire an OAuth2 Access token scoped for a
28 // specific service.  This will typically start with either an interactive
29 // login, using StartOAuthLogin, or with a long-lived OAuth1 all-scope
30 // token obtained through a previous login or other means, using
31 // StartOAuthGetAccessToken.  In fact, one can start with any of these
32 // routines:
33 //   StartOAuthLogin()
34 //   StartGetOAuthTokenRequest()
35 //   StartOAuthGetAccessToken()
36 //   StartOAuthWrapBridge()
37 //   StartUserInfo()
38 // with the expectation that each of these calls the next Start* routine in
39 // the sequence, except for StartUserInfo as it's the last one.
40 //
41 // This class can handle one request at a time, and all calls through an
42 // instance should be serialized.
43 class GaiaOAuthFetcher : public net::URLFetcherDelegate {
44  public:
45   // Defines steps of OAuth process performed by this class.
46   typedef enum {
47     OAUTH1_LOGIN,
48     OAUTH1_REQUEST_TOKEN,
49     OAUTH1_ALL_ACCESS_TOKEN,
50     OAUTH2_SERVICE_ACCESS_TOKEN,
51     USER_INFO,
52     OAUTH2_REVOKE_TOKEN,
53   } RequestType;
54
55   GaiaOAuthFetcher(GaiaOAuthConsumer* consumer,
56                    net::URLRequestContextGetter* getter,
57                    const std::string& service_scope);
58
59   virtual ~GaiaOAuthFetcher();
60
61   // Sets the mask of which OAuth fetch steps should be automatically kicked
62   // of upon successful completition of the previous steps. By default,
63   // this class will chain all steps in OAuth proccess.
64   void SetAutoFetchLimit(RequestType limit) { auto_fetch_limit_ = limit; }
65
66   // Non-UI version of the method above. Initiates Gaia OAuth request token
67   // retrieval.
68   void StartGetOAuthTokenRequest();
69
70   // Performs account login based on OAuth1 access token and its secret.
71   void StartOAuthLogin(const char* source,
72                        const char* service,
73                        const std::string& oauth1_access_token,
74                        const std::string& oauth1_access_token_secret);
75
76   // Obtains an OAuth1 access token and secret
77   //
78   // oauth1_request_token is from GetOAuthToken's result.
79   virtual void StartOAuthGetAccessToken(
80       const std::string& oauth1_request_token);
81
82   // Obtains an OAuth2 access token using Gaia's OAuth1-to-OAuth2 bridge.
83   //
84   // oauth1_access_token and oauth1_access_token_secret are from
85   // OAuthGetAccessToken's result.
86   //
87   // wrap_token_duration is typically one hour,
88   // which is also the max -- you can only decrease it.
89   //
90   // service_scope will be used as a service name.  For example, Chromium Sync
91   // uses https://www.googleapis.com/auth/chromesync for its OAuth2 service
92   // scope here as well as for its service name in TokenService.
93   virtual void StartOAuthWrapBridge(
94       const std::string& oauth1_access_token,
95       const std::string& oauth1_access_token_secret,
96       const std::string& wrap_token_duration,
97       const std::string& service_scope);
98
99   // Obtains user information related to an OAuth2 access token
100   //
101   // oauth2_access_token is from OAuthWrapBridge's result.
102   virtual void StartUserInfo(const std::string& oauth2_access_token);
103
104   // Starts a request for revoking the given OAuth access token (as requested by
105   // StartOAuthGetAccessToken).
106   virtual void StartOAuthRevokeAccessToken(const std::string& token,
107                                            const std::string& secret);
108
109   // Starts a request for revoking the given OAuth Bearer token (as requested by
110   // StartOAuthWrapBridge).
111   virtual void StartOAuthRevokeWrapToken(const std::string& token);
112
113   // Implementation of net::URLFetcherDelegate
114   virtual void OnURLFetchComplete(const net::URLFetcher* source) OVERRIDE;
115
116   // StartGetOAuthToken (or other Start* routine) been called, but results
117   // are not back yet.
118   virtual bool HasPendingFetch() const;
119
120   // Stop any URL fetches in progress.
121   virtual void CancelRequest();
122
123  protected:
124   // Stores the type of the current request in flight.
125   RequestType request_type_;
126
127  private:
128   // Process the results of a GetOAuthToken fetch for non-UI driven path.
129   virtual void OnGetOAuthTokenUrlFetched(const net::ResponseCookies& cookies,
130                                          const net::URLRequestStatus& status,
131                                          int response_code);
132
133   // Process the results of a OAuthLogin fetch.
134   virtual void OnOAuthLoginFetched(const std::string& data,
135                                    const net::URLRequestStatus& status,
136                                    int response_code);
137
138   // Process the results of a OAuthGetAccessToken fetch.
139   virtual void OnOAuthGetAccessTokenFetched(const std::string& data,
140                                             const net::URLRequestStatus& status,
141                                             int response_code);
142
143   // Process the results of a OAuthWrapBridge fetch.
144   virtual void OnOAuthWrapBridgeFetched(const std::string& data,
145                                         const net::URLRequestStatus& status,
146                                         int response_code);
147
148   // Process the results of a token revocation fetch.
149   virtual void OnOAuthRevokeTokenFetched(const std::string& data,
150                                          const net::URLRequestStatus& status,
151                                          int response_code);
152
153   // Process the results of a userinfo fetch.
154   virtual void OnUserInfoFetched(const std::string& data,
155                                  const net::URLRequestStatus& status,
156                                  int response_code);
157
158   // Tokenize the results of a OAuthLogin fetch.
159   static void ParseOAuthLoginResponse(const std::string& data,
160                                       std::string* sid,
161                                       std::string* lsid,
162                                       std::string* auth);
163
164   // Tokenize the results of a OAuthGetAccessToken fetch.
165   static void ParseOAuthGetAccessTokenResponse(const std::string& data,
166                                                std::string* token,
167                                                std::string* secret);
168
169   // Tokenize the results of a OAuthWrapBridge fetch.
170   static void ParseOAuthWrapBridgeResponse(const std::string& data,
171                                            std::string* token,
172                                            std::string* expires_in);
173
174   // Tokenize the results of a userinfo fetch.
175   static void ParseUserInfoResponse(const std::string& data,
176                                     std::string* email);
177
178   // From a URLFetcher result, generate an appropriate error.
179   static GoogleServiceAuthError GenerateAuthError(
180       const std::string& data,
181       const net::URLRequestStatus& status,
182       int response_code);
183
184   // Given parameters, create a OAuth v1 request URL.
185   static GURL MakeGetOAuthTokenUrl(const std::string& oauth1_login_scope,
186                                    const std::string& product_name);
187
188   // Given parameters, create a OAuthGetAccessToken request body.
189   static std::string MakeOAuthGetAccessTokenBody(
190       const std::string& oauth1_request_token);
191
192   // Given parameters, create a OAuthLogin request body.
193   static std::string MakeOAuthLoginBody(
194       const char* source,
195       const char* service,
196       const std::string& oauth1_access_token,
197       const std::string& oauth1_access_token_secret);
198
199   // Given parameters, create a OAuthWrapBridge request body.
200   static std::string MakeOAuthWrapBridgeBody(
201       const std::string& oauth1_access_token,
202       const std::string& oauth1_access_token_secret,
203       const std::string& wrap_token_duration,
204       const std::string& oauth2_service_scope);
205
206   // Create a fetcher useable for making any Gaia OAuth request.
207   static net::URLFetcher* CreateGaiaFetcher(
208       net::URLRequestContextGetter* getter,
209       const GURL& gaia_gurl_,
210       const std::string& body,
211       const std::string& headers,
212       bool send_cookies,
213       net::URLFetcherDelegate* delegate);
214
215   bool ShouldAutoFetch(RequestType fetch_step);
216
217   // These fields are common to GaiaOAuthFetcher, same every request
218   GaiaOAuthConsumer* const consumer_;
219   net::URLRequestContextGetter* const getter_;
220
221   // While a fetch is going on:
222   scoped_ptr<net::URLFetcher> fetcher_;
223   std::string request_body_;
224   std::string request_headers_;
225   std::string service_scope_;
226   bool fetch_pending_;
227   RequestType auto_fetch_limit_;
228
229   DISALLOW_COPY_AND_ASSIGN(GaiaOAuthFetcher);
230 };
231
232 #endif  // CHROME_BROWSER_NET_GAIA_GAIA_OAUTH_FETCHER_H_