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#include "remoting/host/setup/oauth_client.h" 6 7#include "base/logging.h" 8 9namespace { 10const int kMaxGaiaRetries = 3; 11} // namespace 12 13namespace remoting { 14 15OAuthClient::OAuthClient( 16 scoped_refptr<net::URLRequestContextGetter> url_request_context_getter) 17 : gaia_oauth_client_(url_request_context_getter.get()) { 18} 19 20OAuthClient::~OAuthClient() { 21} 22 23void OAuthClient::GetCredentialsFromAuthCode( 24 const gaia::OAuthClientInfo& oauth_client_info, 25 const std::string& auth_code, 26 CompletionCallback on_done) { 27 28 if (!on_done_.is_null()) { 29 pending_requests_.push(Request(oauth_client_info, auth_code, on_done)); 30 return; 31 } 32 33 on_done_ = on_done; 34 // Map the authorization code to refresh and access tokens. 35 gaia_oauth_client_.GetTokensFromAuthCode(oauth_client_info, auth_code, 36 kMaxGaiaRetries, this); 37} 38 39void OAuthClient::OnGetTokensResponse( 40 const std::string& refresh_token, 41 const std::string& access_token, 42 int expires_in_seconds) { 43 refresh_token_ = refresh_token; 44 // Get the email corresponding to the access token. 45 gaia_oauth_client_.GetUserEmail(access_token, kMaxGaiaRetries, this); 46} 47 48void OAuthClient::OnRefreshTokenResponse( 49 const std::string& access_token, 50 int expires_in_seconds) { 51 // We never request a refresh token, so this call is not expected. 52 NOTREACHED(); 53} 54 55void OAuthClient::SendResponse(const std::string& user_email, 56 const std::string& refresh_token) { 57 CompletionCallback on_done = on_done_; 58 on_done_.Reset(); 59 on_done.Run(user_email, refresh_token); 60 61 // Process the next request in the queue. 62 if (pending_requests_.size()) { 63 Request request = pending_requests_.front(); 64 pending_requests_.pop(); 65 // GetCredentialsFromAuthCode is asynchronous, so it's safe to call it here. 66 GetCredentialsFromAuthCode( 67 request.oauth_client_info, request.auth_code, request.on_done); 68 } 69} 70 71void OAuthClient::OnGetUserEmailResponse(const std::string& user_email) { 72 SendResponse(user_email, refresh_token_); 73} 74 75void OAuthClient::OnOAuthError() { 76 SendResponse("", ""); 77} 78 79void OAuthClient::OnNetworkError(int response_code) { 80 SendResponse("", ""); 81} 82 83OAuthClient::Request::Request( 84 const gaia::OAuthClientInfo& oauth_client_info, 85 const std::string& auth_code, 86 CompletionCallback on_done) { 87 this->oauth_client_info = oauth_client_info; 88 this->auth_code = auth_code; 89 this->on_done = on_done; 90} 91 92OAuthClient::Request::~Request() { 93} 94 95} // namespace remoting 96