16e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)// Copyright 2014 The Chromium Authors. All rights reserved.
26e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
36e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)// found in the LICENSE file.
46e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
56e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)#include "chrome/browser/signin/easy_unlock_toggle_flow.h"
66e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
76e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)#include <vector>
86e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
96e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)#include "base/logging.h"
106e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)#include "base/strings/stringprintf.h"
116e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)#include "chrome/browser/extensions/extension_service.h"
126e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)#include "chrome/browser/profiles/profile.h"
136e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)#include "chrome/browser/signin/profile_oauth2_token_service_factory.h"
146e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)#include "chrome/browser/signin/signin_manager_factory.h"
156e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)#include "chrome/common/extensions/api/identity/oauth2_manifest_handler.h"
166e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)#include "chrome/common/extensions/extension_constants.h"
176e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)#include "components/signin/core/browser/profile_oauth2_token_service.h"
186e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)#include "components/signin/core/browser/signin_manager.h"
196e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)#include "extensions/browser/extension_system.h"
206e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)#include "google_apis/gaia/oauth2_api_call_flow.h"
216e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)#include "net/url_request/url_fetcher.h"
226e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
236e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)namespace {
246e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
256e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)const char kEasyUnlockToggleUrl[] =
266e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    "https://www.googleapis.com/cryptauth/v1/deviceSync/toggleeasyunlock";
276e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
286e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)std::vector<std::string> GetScopes() {
296e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  std::vector<std::string> scopes;
306e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  scopes.push_back("https://www.googleapis.com/auth/proximity_auth");
316e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  scopes.push_back("https://www.googleapis.com/auth/cryptauth");
326e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  return scopes;
336e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)}
346e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
356e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)std::string GetEasyUnlockAppClientId(Profile * profile) {
366e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  extensions::ExtensionSystem* extension_system =
376e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      extensions::ExtensionSystem::Get(profile);
386e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  ExtensionService* extension_service = extension_system->extension_service();
396e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  const extensions::Extension* easy_unlock_app =
406e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      extension_service->GetInstalledExtension(
416e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)          extension_misc::kEasyUnlockAppId);
426e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  if (!easy_unlock_app)
436e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    return std::string();
446e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
456e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  const extensions::OAuth2Info& oauth2_info =
466e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      extensions::OAuth2Info::GetOAuth2Info(easy_unlock_app);
476e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  return oauth2_info.client_id;
486e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)}
496e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
506e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)}  // namespace
516e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
526e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)class EasyUnlockToggleFlow::ToggleApiCall : public OAuth2ApiCallFlow {
536e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) public:
546e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  ToggleApiCall(EasyUnlockToggleFlow* flow,
556e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)                net::URLRequestContextGetter* context,
566e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)                const std::string& access_token,
576e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)                const std::string& phone_public_key,
586e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)                bool toggle_enable);
596e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  virtual ~ToggleApiCall();
606e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
616e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  // OAuth2ApiCallFlow
626e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  virtual GURL CreateApiCallUrl() OVERRIDE;
636e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  virtual std::string CreateApiCallBody() OVERRIDE;
646e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  virtual std::string CreateApiCallBodyContentType() OVERRIDE;
656e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  virtual void ProcessApiCallSuccess(const net::URLFetcher* source) OVERRIDE;
666e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  virtual void ProcessApiCallFailure(const net::URLFetcher* source) OVERRIDE;
676e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  virtual void ProcessNewAccessToken(const std::string& access_token) OVERRIDE;
686e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  virtual void ProcessMintAccessTokenFailure(
696e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      const GoogleServiceAuthError& error) OVERRIDE;
706e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
716e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) private:
726e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  EasyUnlockToggleFlow* flow_;
736e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  const std::string phone_public_key_;
746e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  const bool toggle_enable_;
756e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
766e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(ToggleApiCall);
776e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)};
786e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
796e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)EasyUnlockToggleFlow::ToggleApiCall::ToggleApiCall(
806e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    EasyUnlockToggleFlow* flow,
816e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    net::URLRequestContextGetter* context,
826e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    const std::string& access_token,
836e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    const std::string& phone_public_key,
846e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    bool toggle_enable)
856e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    : OAuth2ApiCallFlow(context,
866e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)                        std::string(),
876e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)                        access_token,
886e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)                        GetScopes()),
896e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      flow_(flow),
906e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      phone_public_key_(phone_public_key),
916e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      toggle_enable_(toggle_enable) {
926e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)}
936e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
946e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)EasyUnlockToggleFlow::ToggleApiCall::~ToggleApiCall() {
956e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)}
966e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
976e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)GURL EasyUnlockToggleFlow::ToggleApiCall::CreateApiCallUrl() {
986e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  return GURL(kEasyUnlockToggleUrl);
996e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)}
1006e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
1016e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)std::string EasyUnlockToggleFlow::ToggleApiCall::CreateApiCallBody() {
1026e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  const char kBodyFormat[] = "{\"enable\":%s,\"publicKey\":\"%s\"}";
1036e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  return base::StringPrintf(
1046e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      kBodyFormat,
1056e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      toggle_enable_ ? "true" : "false",
1066e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      phone_public_key_.c_str());
1076e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)}
1086e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
1096e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)std::string
1106e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)EasyUnlockToggleFlow::ToggleApiCall::CreateApiCallBodyContentType() {
1116e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  return "application/json";
1126e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)}
1136e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
1146e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)void EasyUnlockToggleFlow::ToggleApiCall::ProcessApiCallSuccess(
1156e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    const net::URLFetcher* source) {
1166e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  flow_->ReportToggleApiCallResult(true);
1176e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)}
1186e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
1196e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)void EasyUnlockToggleFlow::ToggleApiCall::ProcessApiCallFailure(
1206e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    const net::URLFetcher* source) {
1216e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  flow_->ReportToggleApiCallResult(false);
1226e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)}
1236e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
1246e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)void EasyUnlockToggleFlow::ToggleApiCall::ProcessNewAccessToken(
1256e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    const std::string& access_token) {
1266e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  NOTREACHED();
1276e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)}
1286e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
1296e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)void EasyUnlockToggleFlow::ToggleApiCall::ProcessMintAccessTokenFailure(
1306e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    const GoogleServiceAuthError& error) {
1316e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  NOTREACHED();
1326e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)}
1336e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
1346e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)EasyUnlockToggleFlow::EasyUnlockToggleFlow(Profile* profile,
1356e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)                                           const std::string& phone_public_key,
1366e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)                                           bool toggle_enable,
1376e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)                                           const ToggleFlowCallback& callback)
1386e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    : OAuth2TokenService::Consumer("easy_unlock_toggle"),
1396e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      profile_(profile),
1406e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      phone_public_key_(phone_public_key),
1416e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      toggle_enable_(toggle_enable),
1426e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      callback_(callback) {
1436e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)}
1446e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
1456e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)EasyUnlockToggleFlow::~EasyUnlockToggleFlow() {
1466e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)}
1476e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
1486e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)void EasyUnlockToggleFlow::Start() {
1496e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  ProfileOAuth2TokenService* token_service =
1506e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      ProfileOAuth2TokenServiceFactory::GetForProfile(profile_);
1516e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  SigninManagerBase* signin_manager =
1526e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      SigninManagerFactory::GetForProfile(profile_);
1536e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  token_request_ =
1546e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      token_service->StartRequest(signin_manager->GetAuthenticatedAccountId(),
1556e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)                                  OAuth2TokenService::ScopeSet(),
1566e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)                                  this);
1576e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)}
1586e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
1596e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)void EasyUnlockToggleFlow::OnGetTokenSuccess(
1606e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    const OAuth2TokenService::Request* request,
1616e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    const std::string& access_token,
1626e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    const base::Time& expiration_time) {
1636e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  DCHECK_EQ(token_request_.get(), request);
1646e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  token_request_.reset();
1656e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
1666e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  mint_token_flow_.reset(
1676e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      new OAuth2MintTokenFlow(profile_->GetRequestContext(),
1686e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)                              this,
1696e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)                              OAuth2MintTokenFlow::Parameters(
1706e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)                                  access_token,
1716e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)                                  extension_misc::kEasyUnlockAppId,
1726e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)                                  GetEasyUnlockAppClientId(profile_),
1736e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)                                  GetScopes(),
1746e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)                                  OAuth2MintTokenFlow::MODE_MINT_TOKEN_FORCE)));
1756e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  mint_token_flow_->Start();
1766e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)}
1776e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
1786e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)void EasyUnlockToggleFlow::OnGetTokenFailure(
1796e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    const OAuth2TokenService::Request* request,
1806e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    const GoogleServiceAuthError& error) {
1816e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  DCHECK_EQ(token_request_.get(), request);
1826e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  token_request_.reset();
1836e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
1846e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  LOG(ERROR) << "Easy unlock toggle flow, failed to get access token,"
1856e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)             << "error=" << error.state();
1866e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  callback_.Run(false);
1876e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)}
1886e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
1896e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)void EasyUnlockToggleFlow::OnMintTokenSuccess(const std::string& access_token,
1906e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)                                              int time_to_live) {
1916e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  toggle_api_call_.reset(new ToggleApiCall(this,
1926e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)                                           profile_->GetRequestContext(),
1936e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)                                           access_token,
1946e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)                                           phone_public_key_,
1956e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)                                           toggle_enable_));
1966e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  toggle_api_call_->Start();
1976e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)}
1986e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
1996e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)void EasyUnlockToggleFlow::OnMintTokenFailure(
2006e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    const GoogleServiceAuthError& error) {
2016e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  LOG(ERROR) << "Easy unlock toggle flow, failed to mint access token,"
2026e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)             << "error=" << error.state();
2036e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  callback_.Run(false);
2046e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)}
2056e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
2066e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)void EasyUnlockToggleFlow::OnIssueAdviceSuccess(
2076e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    const IssueAdviceInfo& issue_advice) {
2086e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  NOTREACHED();
2096e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)}
2106e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
2116e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)void EasyUnlockToggleFlow::ReportToggleApiCallResult(bool success) {
2126e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  callback_.Run(success);
2136e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)}
214