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