Index: chrome/browser/signin/easy_unlock_toggle_flow.cc |
diff --git a/chrome/browser/signin/easy_unlock_toggle_flow.cc b/chrome/browser/signin/easy_unlock_toggle_flow.cc |
new file mode 100644 |
index 0000000000000000000000000000000000000000..7655b2b8e16418c52262e7631fd088138eb92a7e |
--- /dev/null |
+++ b/chrome/browser/signin/easy_unlock_toggle_flow.cc |
@@ -0,0 +1,213 @@ |
+// Copyright 2014 The Chromium Authors. All rights reserved. |
+// Use of this source code is governed by a BSD-style license that can be |
+// found in the LICENSE file. |
+ |
+#include "chrome/browser/signin/easy_unlock_toggle_flow.h" |
+ |
+#include <vector> |
+ |
+#include "base/logging.h" |
+#include "base/strings/stringprintf.h" |
+#include "chrome/browser/extensions/extension_service.h" |
+#include "chrome/browser/profiles/profile.h" |
+#include "chrome/browser/signin/profile_oauth2_token_service_factory.h" |
+#include "chrome/browser/signin/signin_manager_factory.h" |
+#include "chrome/common/extensions/api/identity/oauth2_manifest_handler.h" |
+#include "chrome/common/extensions/extension_constants.h" |
+#include "components/signin/core/browser/profile_oauth2_token_service.h" |
+#include "components/signin/core/browser/signin_manager.h" |
+#include "extensions/browser/extension_system.h" |
+#include "google_apis/gaia/oauth2_api_call_flow.h" |
+#include "net/url_request/url_fetcher.h" |
+ |
+namespace { |
+ |
+const char kEasyUnlockToggleUrl[] = |
+ "https://www.googleapis.com/cryptauth/v1/deviceSync/toggleeasyunlock"; |
+ |
+std::vector<std::string> GetScopes() { |
+ std::vector<std::string> scopes; |
+ scopes.push_back("https://www.googleapis.com/auth/proximity_auth"); |
+ scopes.push_back("https://www.googleapis.com/auth/cryptauth"); |
+ return scopes; |
+} |
+ |
+std::string GetEasyUnlockAppClientId(Profile * profile) { |
+ extensions::ExtensionSystem* extension_system = |
+ extensions::ExtensionSystem::Get(profile); |
+ ExtensionService* extension_service = extension_system->extension_service(); |
+ const extensions::Extension* easy_unlock_app = |
+ extension_service->GetInstalledExtension( |
+ extension_misc::kEasyUnlockAppId); |
+ if (!easy_unlock_app) |
+ return std::string(); |
+ |
+ const extensions::OAuth2Info& oauth2_info = |
+ extensions::OAuth2Info::GetOAuth2Info(easy_unlock_app); |
+ return oauth2_info.client_id; |
+} |
+ |
+} // namespace |
+ |
+class EasyUnlockToggleFlow::ToggleApiCall : public OAuth2ApiCallFlow { |
+ public: |
+ ToggleApiCall(EasyUnlockToggleFlow* flow, |
+ net::URLRequestContextGetter* context, |
+ const std::string& access_token, |
+ const std::string& phone_public_key, |
+ bool toggle_enable); |
+ virtual ~ToggleApiCall(); |
+ |
+ // OAuth2ApiCallFlow |
+ virtual GURL CreateApiCallUrl() OVERRIDE; |
+ virtual std::string CreateApiCallBody() OVERRIDE; |
+ virtual std::string CreateApiCallBodyContentType() OVERRIDE; |
+ virtual void ProcessApiCallSuccess(const net::URLFetcher* source) OVERRIDE; |
+ virtual void ProcessApiCallFailure(const net::URLFetcher* source) OVERRIDE; |
+ virtual void ProcessNewAccessToken(const std::string& access_token) OVERRIDE; |
+ virtual void ProcessMintAccessTokenFailure( |
+ const GoogleServiceAuthError& error) OVERRIDE; |
+ |
+ private: |
+ EasyUnlockToggleFlow* flow_; |
+ const std::string phone_public_key_; |
+ const bool toggle_enable_; |
+ |
+ DISALLOW_COPY_AND_ASSIGN(ToggleApiCall); |
+}; |
+ |
+EasyUnlockToggleFlow::ToggleApiCall::ToggleApiCall( |
+ EasyUnlockToggleFlow* flow, |
+ net::URLRequestContextGetter* context, |
+ const std::string& access_token, |
+ const std::string& phone_public_key, |
+ bool toggle_enable) |
+ : OAuth2ApiCallFlow(context, |
+ std::string(), |
+ access_token, |
+ GetScopes()), |
+ flow_(flow), |
+ phone_public_key_(phone_public_key), |
+ toggle_enable_(toggle_enable) { |
+} |
+ |
+EasyUnlockToggleFlow::ToggleApiCall::~ToggleApiCall() { |
+} |
+ |
+GURL EasyUnlockToggleFlow::ToggleApiCall::CreateApiCallUrl() { |
+ return GURL(kEasyUnlockToggleUrl); |
+} |
+ |
+std::string EasyUnlockToggleFlow::ToggleApiCall::CreateApiCallBody() { |
+ const char kBodyFormat[] = "{\"enable\":%s,\"publicKey\":\"%s\"}"; |
+ return base::StringPrintf( |
+ kBodyFormat, |
+ toggle_enable_ ? "true" : "false", |
+ phone_public_key_.c_str()); |
+} |
+ |
+std::string |
+EasyUnlockToggleFlow::ToggleApiCall::CreateApiCallBodyContentType() { |
+ return "application/json"; |
+} |
+ |
+void EasyUnlockToggleFlow::ToggleApiCall::ProcessApiCallSuccess( |
+ const net::URLFetcher* source) { |
+ flow_->ReportToggleApiCallResult(true); |
+} |
+ |
+void EasyUnlockToggleFlow::ToggleApiCall::ProcessApiCallFailure( |
+ const net::URLFetcher* source) { |
+ flow_->ReportToggleApiCallResult(false); |
+} |
+ |
+void EasyUnlockToggleFlow::ToggleApiCall::ProcessNewAccessToken( |
+ const std::string& access_token) { |
+ NOTREACHED(); |
+} |
+ |
+void EasyUnlockToggleFlow::ToggleApiCall::ProcessMintAccessTokenFailure( |
+ const GoogleServiceAuthError& error) { |
+ NOTREACHED(); |
+} |
+ |
+EasyUnlockToggleFlow::EasyUnlockToggleFlow(Profile* profile, |
+ const std::string& phone_public_key, |
+ bool toggle_enable, |
+ const ToggleFlowCallback& callback) |
+ : OAuth2TokenService::Consumer("easy_unlock_toggle"), |
+ profile_(profile), |
+ phone_public_key_(phone_public_key), |
+ toggle_enable_(toggle_enable), |
+ callback_(callback) { |
+} |
+ |
+EasyUnlockToggleFlow::~EasyUnlockToggleFlow() { |
+} |
+ |
+void EasyUnlockToggleFlow::Start() { |
+ ProfileOAuth2TokenService* token_service = |
+ ProfileOAuth2TokenServiceFactory::GetForProfile(profile_); |
+ SigninManagerBase* signin_manager = |
+ SigninManagerFactory::GetForProfile(profile_); |
+ token_request_ = |
+ token_service->StartRequest(signin_manager->GetAuthenticatedAccountId(), |
+ OAuth2TokenService::ScopeSet(), |
+ this); |
+} |
+ |
+void EasyUnlockToggleFlow::OnGetTokenSuccess( |
+ const OAuth2TokenService::Request* request, |
+ const std::string& access_token, |
+ const base::Time& expiration_time) { |
+ DCHECK_EQ(token_request_.get(), request); |
+ token_request_.reset(); |
+ |
+ mint_token_flow_.reset( |
+ new OAuth2MintTokenFlow(profile_->GetRequestContext(), |
+ this, |
+ OAuth2MintTokenFlow::Parameters( |
+ access_token, |
+ extension_misc::kEasyUnlockAppId, |
+ GetEasyUnlockAppClientId(profile_), |
+ GetScopes(), |
+ OAuth2MintTokenFlow::MODE_MINT_TOKEN_FORCE))); |
+ mint_token_flow_->Start(); |
+} |
+ |
+void EasyUnlockToggleFlow::OnGetTokenFailure( |
+ const OAuth2TokenService::Request* request, |
+ const GoogleServiceAuthError& error) { |
+ DCHECK_EQ(token_request_.get(), request); |
+ token_request_.reset(); |
+ |
+ LOG(ERROR) << "Easy unlock toggle flow, failed to get access token," |
+ << "error=" << error.state(); |
+ callback_.Run(false); |
+} |
+ |
+void EasyUnlockToggleFlow::OnMintTokenSuccess(const std::string& access_token, |
+ int time_to_live) { |
+ toggle_api_call_.reset(new ToggleApiCall(this, |
+ profile_->GetRequestContext(), |
+ access_token, |
+ phone_public_key_, |
+ toggle_enable_)); |
+ toggle_api_call_->Start(); |
+} |
+ |
+void EasyUnlockToggleFlow::OnMintTokenFailure( |
+ const GoogleServiceAuthError& error) { |
+ LOG(ERROR) << "Easy unlock toggle flow, failed to mint access token," |
+ << "error=" << error.state(); |
+ callback_.Run(false); |
+} |
+ |
+void EasyUnlockToggleFlow::OnIssueAdviceSuccess( |
+ const IssueAdviceInfo& issue_advice) { |
+ NOTREACHED(); |
+} |
+ |
+void EasyUnlockToggleFlow::ReportToggleApiCallResult(bool success) { |
+ callback_.Run(success); |
+} |