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