Home | History | Annotate | Download | only in setup
      1 // Copyright 2013 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 REMOTING_HOST_SETUP_OAUTH_CLIENT
      6 #define REMOTING_HOST_SETUP_OAUTH_CLIENT
      7 
      8 #include <queue>
      9 #include <string>
     10 
     11 #include "base/callback.h"
     12 #include "base/memory/ref_counted.h"
     13 #include "google_apis/gaia/gaia_oauth_client.h"
     14 #include "net/url_request/url_request_context_getter.h"
     15 
     16 namespace net {
     17 class URLRequestContext;
     18 }
     19 
     20 namespace remoting {
     21 
     22 // A wrapper around GaiaOAuthClient that provides a more convenient interface,
     23 // with queueing of requests and a callback rather than a delegate.
     24 class OAuthClient : public gaia::GaiaOAuthClient::Delegate {
     25  public:
     26   // Called when GetCredentialsFromAuthCode is completed, with the |user_email|
     27   // and |refresh_token| that correspond to the given |auth_code|, or with empty
     28   // strings on error.
     29   typedef base::Callback<void(
     30       const std::string& user_email,
     31       const std::string& refresh_token)> CompletionCallback;
     32 
     33   OAuthClient(
     34       scoped_refptr<net::URLRequestContextGetter> url_request_context_getter);
     35 
     36   virtual ~OAuthClient();
     37 
     38   // Redeems |auth_code| using |oauth_client_info| to obtain |refresh_token| and
     39   // |access_token|, then uses the userinfo endpoint to obtain |user_email|.
     40   // Calls CompletionCallback with |user_email| and |refresh_token| when done,
     41   // or with empty strings on error.
     42   // If a request is received while another one is  being processed, it is
     43   // enqueued and processed after the first one is finished.
     44   void GetCredentialsFromAuthCode(
     45       const gaia::OAuthClientInfo& oauth_client_info,
     46       const std::string& auth_code,
     47       CompletionCallback on_done);
     48 
     49   // gaia::GaiaOAuthClient::Delegate
     50   virtual void OnGetTokensResponse(const std::string& refresh_token,
     51                                  const std::string& access_token,
     52                                  int expires_in_seconds) OVERRIDE;
     53   virtual void OnRefreshTokenResponse(const std::string& access_token,
     54                                       int expires_in_seconds) OVERRIDE;
     55   virtual void OnGetUserEmailResponse(const std::string& user_email) OVERRIDE;
     56 
     57   virtual void OnOAuthError() OVERRIDE;
     58   virtual void OnNetworkError(int response_code) OVERRIDE;
     59 
     60  private:
     61   struct Request {
     62     Request(const gaia::OAuthClientInfo& oauth_client_info,
     63             const std::string& auth_code,
     64             CompletionCallback on_done);
     65     virtual ~Request();
     66     gaia::OAuthClientInfo oauth_client_info;
     67     std::string auth_code;
     68     CompletionCallback on_done;
     69   };
     70 
     71   void SendResponse(const std::string& user_email,
     72                     const std::string& refresh_token);
     73 
     74   std::queue<Request> pending_requests_;
     75   gaia::GaiaOAuthClient gaia_oauth_client_;
     76   std::string refresh_token_;
     77   CompletionCallback on_done_;
     78 
     79   DISALLOW_COPY_AND_ASSIGN(OAuthClient);
     80 };
     81 
     82 }  // namespace remoting
     83 
     84 #endif  // REMOTING_HOST_SETUP_OAUTH_CLIENT
     85