15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/service/cloud_print/cloud_print_auth.h"
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/bind.h"
80f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)#include "base/metrics/histogram.h"
9868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/string_util.h"
102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/common/cloud_print/cloud_print_constants.h"
112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/common/cloud_print/cloud_print_helpers.h"
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/service/cloud_print/cloud_print_token_store.h"
13116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "chrome/service/net/service_url_request_context_getter.h"
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/service/service_process.h"
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "google_apis/gaia/gaia_urls.h"
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace cloud_print {
182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
190f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)namespace {
200f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)
210f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)enum CloudPrintAuthEvent {
220f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  AUTH_EVENT_ROBO_CREATE,
230f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  AUTH_EVENT_ROBO_SUCCEEDED,
240f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  AUTH_EVENT_ROBO_FAILED,
250f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  AUTH_EVENT_ROBO_JSON_ERROR,
260f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  AUTH_EVENT_ROBO_AUTH_ERROR,
270f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  AUTH_EVENT_AUTH_WITH_TOKEN,
280f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  AUTH_EVENT_AUTH_WITH_CODE,
290f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  AUTH_EVENT_TOKEN_RESPONSE,
300f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  AUTH_EVENT_REFRESH_REQUEST,
310f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  AUTH_EVENT_REFRESH_RESPONSE,
320f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  AUTH_EVENT_AUTH_ERROR,
330f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  AUTH_EVENT_NET_ERROR,
340f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  AUTH_EVENT_MAX
350f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)};
360f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)
370f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)}  // namespace
380f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)CloudPrintAuth::CloudPrintAuth(
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Client* client,
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const GURL& cloud_print_server_url,
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const gaia::OAuthClientInfo& oauth_client_info,
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const std::string& proxy_id)
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      : client_(client),
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        oauth_client_info_(oauth_client_info),
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        cloud_print_server_url_(cloud_print_server_url),
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        proxy_id_(proxy_id) {
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(client);
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void CloudPrintAuth::AuthenticateWithToken(
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const std::string& cloud_print_token) {
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  VLOG(1) << "CP_AUTH: Authenticating with token";
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
550f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  UMA_HISTOGRAM_ENUMERATION("CloudPrint.AuthEvent", AUTH_EVENT_ROBO_CREATE,
560f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)                            AUTH_EVENT_MAX);
570f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  client_login_token_ = cloud_print_token;
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // We need to get the credentials of the robot here.
612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  GURL get_authcode_url = GetUrlForGetAuthCode(cloud_print_server_url_,
622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                               oauth_client_info_.client_id,
632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                               proxy_id_);
642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  request_ = CloudPrintURLFetcher::Create();
650f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  request_->StartGetRequest(CloudPrintURLFetcher::REQUEST_AUTH_CODE,
660f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)                            get_authcode_url, this,
670f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)                            kCloudPrintAuthMaxRetryCount, std::string());
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void CloudPrintAuth::AuthenticateWithRobotToken(
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const std::string& robot_oauth_refresh_token,
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const std::string& robot_email) {
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  VLOG(1) << "CP_AUTH: Authenticating with robot token";
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
750f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  UMA_HISTOGRAM_ENUMERATION("CloudPrint.AuthEvent", AUTH_EVENT_AUTH_WITH_TOKEN,
760f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)                            AUTH_EVENT_MAX);
770f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  robot_email_ = robot_email;
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  refresh_token_ = robot_oauth_refresh_token;
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RefreshAccessToken();
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void CloudPrintAuth::AuthenticateWithRobotAuthCode(
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const std::string& robot_oauth_auth_code,
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const std::string& robot_email) {
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  VLOG(1) << "CP_AUTH: Authenticating with robot auth code";
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
880f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  UMA_HISTOGRAM_ENUMERATION("CloudPrint.AuthEvent", AUTH_EVENT_AUTH_WITH_CODE,
890f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)                            AUTH_EVENT_MAX);
900f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  robot_email_ = robot_email;
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Now that we have an auth code we need to get the refresh and access tokens.
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  oauth_client_.reset(new gaia::GaiaOAuthClient(
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      g_service_process->GetServiceURLRequestContextGetter()));
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  oauth_client_->GetTokensFromAuthCode(oauth_client_info_,
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                       robot_oauth_auth_code,
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                       kCloudPrintAuthMaxRetryCount,
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                       this);
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void CloudPrintAuth::RefreshAccessToken() {
1020f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  UMA_HISTOGRAM_ENUMERATION("CloudPrint.AuthEvent", AUTH_EVENT_REFRESH_REQUEST,
1030f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)                            AUTH_EVENT_MAX);
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  oauth_client_.reset(new gaia::GaiaOAuthClient(
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      g_service_process->GetServiceURLRequestContextGetter()));
106eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  std::vector<std::string> empty_scope_list;  // (Use scope from refresh token.)
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  oauth_client_->RefreshToken(oauth_client_info_,
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                              refresh_token_,
109eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                              empty_scope_list,
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                              kCloudPrintAuthMaxRetryCount,
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                              this);
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void CloudPrintAuth::OnGetTokensResponse(const std::string& refresh_token,
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                         const std::string& access_token,
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                         int expires_in_seconds) {
1170f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  UMA_HISTOGRAM_ENUMERATION("CloudPrint.AuthEvent", AUTH_EVENT_TOKEN_RESPONSE,
1180f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)                            AUTH_EVENT_MAX);
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  refresh_token_ = refresh_token;
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // After saving the refresh token, this is just like having just refreshed
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // the access token. Just call OnRefreshTokenResponse.
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  OnRefreshTokenResponse(access_token, expires_in_seconds);
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void CloudPrintAuth::OnRefreshTokenResponse(const std::string& access_token,
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                            int expires_in_seconds) {
1270f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  UMA_HISTOGRAM_ENUMERATION("CloudPrint.AuthEvent", AUTH_EVENT_REFRESH_RESPONSE,
1280f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)                            AUTH_EVENT_MAX);
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  client_->OnAuthenticationComplete(access_token, refresh_token_,
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                    robot_email_, user_email_);
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Schedule a task to refresh the access token again when it is about to
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // expire.
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(expires_in_seconds > kTokenRefreshGracePeriodSecs);
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::TimeDelta refresh_delay = base::TimeDelta::FromSeconds(
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      expires_in_seconds - kTokenRefreshGracePeriodSecs);
137a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  base::MessageLoop::current()->PostDelayedTask(
138a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)      FROM_HERE,
139a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)      base::Bind(&CloudPrintAuth::RefreshAccessToken, this),
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      refresh_delay);
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void CloudPrintAuth::OnOAuthError() {
1440f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  UMA_HISTOGRAM_ENUMERATION("CloudPrint.AuthEvent", AUTH_EVENT_AUTH_ERROR,
1450f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)                            AUTH_EVENT_MAX);
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Notify client about authentication error.
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  client_->OnInvalidCredentials();
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void CloudPrintAuth::OnNetworkError(int response_code) {
1510f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  UMA_HISTOGRAM_ENUMERATION("CloudPrint.AuthEvent", AUTH_EVENT_NET_ERROR,
1520f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)                            AUTH_EVENT_MAX);
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Since we specify infinite retries on network errors, this should never
1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // be called.
1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  NOTREACHED() <<
1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "OnNetworkError invoked when not expected, response code is " <<
1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      response_code;
1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)CloudPrintURLFetcher::ResponseAction CloudPrintAuth::HandleJSONData(
1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const net::URLFetcher* source,
1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const GURL& url,
1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    base::DictionaryValue* json_data,
1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    bool succeeded) {
1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!succeeded) {
1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    VLOG(1) << "CP_AUTH: Creating robot account failed";
1670f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)    UMA_HISTOGRAM_ENUMERATION("CloudPrint.AuthEvent",
1680f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)                              AUTH_EVENT_ROBO_FAILED,
1690f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)                              AUTH_EVENT_MAX);
1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    client_->OnInvalidCredentials();
1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return CloudPrintURLFetcher::STOP_PROCESSING;
1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string auth_code;
1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!json_data->GetString(kOAuthCodeValue, &auth_code)) {
1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    VLOG(1) << "CP_AUTH: Creating robot account returned invalid json response";
1770f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)    UMA_HISTOGRAM_ENUMERATION("CloudPrint.AuthEvent",
1780f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)                              AUTH_EVENT_ROBO_JSON_ERROR,
1790f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)                              AUTH_EVENT_MAX);
1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    client_->OnInvalidCredentials();
1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return CloudPrintURLFetcher::STOP_PROCESSING;
1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1840f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  UMA_HISTOGRAM_ENUMERATION("CloudPrint.AuthEvent",
1850f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)                              AUTH_EVENT_ROBO_SUCCEEDED,
1860f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)                              AUTH_EVENT_MAX);
1870f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)
1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  json_data->GetString(kXMPPJidValue, &robot_email_);
1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Now that we have an auth code we need to get the refresh and access tokens.
1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  oauth_client_.reset(new gaia::GaiaOAuthClient(
1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      g_service_process->GetServiceURLRequestContextGetter()));
1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  oauth_client_->GetTokensFromAuthCode(oauth_client_info_,
1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                       auth_code,
1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                       kCloudPrintAPIMaxRetryCount,
1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                       this);
1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return CloudPrintURLFetcher::STOP_PROCESSING;
1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)CloudPrintURLFetcher::ResponseAction CloudPrintAuth::OnRequestAuthError() {
2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  VLOG(1) << "CP_AUTH: Creating robot account authentication error";
2020f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)
2030f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  UMA_HISTOGRAM_ENUMERATION("CloudPrint.AuthEvent",
2040f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)                            AUTH_EVENT_ROBO_AUTH_ERROR,
2050f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)                            AUTH_EVENT_MAX);
2060f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)
2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Notify client about authentication error.
2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  client_->OnInvalidCredentials();
2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return CloudPrintURLFetcher::STOP_PROCESSING;
2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)std::string CloudPrintAuth::GetAuthHeader() {
2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(!client_login_token_.empty());
2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string header;
2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  header = "Authorization: GoogleLogin auth=";
2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  header += client_login_token_;
2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return header;
2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)CloudPrintAuth::~CloudPrintAuth() {}
2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}  // namespace cloud_print
223