13551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)// Copyright 2013 The Chromium Authors. All rights reserved. 23551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 33551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)// found in the LICENSE file. 43551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 53551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#ifndef REMOTING_HOST_SETUP_OAUTH_CLIENT 63551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#define REMOTING_HOST_SETUP_OAUTH_CLIENT 73551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 83551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#include <queue> 93551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#include <string> 103551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 113551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#include "base/callback.h" 12116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "base/memory/ref_counted.h" 133551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#include "google_apis/gaia/gaia_oauth_client.h" 14116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "net/url_request/url_request_context_getter.h" 15116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 16116680a4aac90f2aa7413d9095a592090648e557Ben Murdochnamespace net { 17116680a4aac90f2aa7413d9095a592090648e557Ben Murdochclass URLRequestContext; 18116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch} 193551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 203551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)namespace remoting { 213551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 223551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)// A wrapper around GaiaOAuthClient that provides a more convenient interface, 233551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)// with queueing of requests and a callback rather than a delegate. 243551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)class OAuthClient : public gaia::GaiaOAuthClient::Delegate { 253551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) public: 263551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) // Called when GetCredentialsFromAuthCode is completed, with the |user_email| 273551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) // and |refresh_token| that correspond to the given |auth_code|, or with empty 283551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) // strings on error. 293551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) typedef base::Callback<void( 303551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) const std::string& user_email, 313551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) const std::string& refresh_token)> CompletionCallback; 323551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 333551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) OAuthClient( 343551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) scoped_refptr<net::URLRequestContextGetter> url_request_context_getter); 353551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 363551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) virtual ~OAuthClient(); 373551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 383551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) // Redeems |auth_code| using |oauth_client_info| to obtain |refresh_token| and 393551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) // |access_token|, then uses the userinfo endpoint to obtain |user_email|. 403551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) // Calls CompletionCallback with |user_email| and |refresh_token| when done, 413551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) // or with empty strings on error. 423551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) // If a request is received while another one is being processed, it is 433551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) // enqueued and processed after the first one is finished. 443551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) void GetCredentialsFromAuthCode( 453551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) const gaia::OAuthClientInfo& oauth_client_info, 463551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) const std::string& auth_code, 473551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) CompletionCallback on_done); 483551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 493551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) // gaia::GaiaOAuthClient::Delegate 503551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) virtual void OnGetTokensResponse(const std::string& refresh_token, 513551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) const std::string& access_token, 523551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) int expires_in_seconds) OVERRIDE; 533551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) virtual void OnRefreshTokenResponse(const std::string& access_token, 543551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) int expires_in_seconds) OVERRIDE; 553551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) virtual void OnGetUserEmailResponse(const std::string& user_email) OVERRIDE; 563551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 573551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) virtual void OnOAuthError() OVERRIDE; 583551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) virtual void OnNetworkError(int response_code) OVERRIDE; 593551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 603551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) private: 613551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) struct Request { 623551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) Request(const gaia::OAuthClientInfo& oauth_client_info, 633551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) const std::string& auth_code, 643551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) CompletionCallback on_done); 653551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) virtual ~Request(); 663551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) gaia::OAuthClientInfo oauth_client_info; 673551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) std::string auth_code; 683551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) CompletionCallback on_done; 693551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) }; 703551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 713551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) void SendResponse(const std::string& user_email, 723551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) const std::string& refresh_token); 733551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 743551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) std::queue<Request> pending_requests_; 753551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) gaia::GaiaOAuthClient gaia_oauth_client_; 763551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) std::string refresh_token_; 773551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) CompletionCallback on_done_; 783551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 793551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(OAuthClient); 803551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)}; 813551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 823551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)} // namespace remoting 833551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 843551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#endif // REMOTING_HOST_SETUP_OAUTH_CLIENT 85