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