Index: components/proximity_auth/cryptauth/cryptauth_enrollment_manager.cc |
diff --git a/components/proximity_auth/cryptauth/cryptauth_enrollment_manager.cc b/components/proximity_auth/cryptauth/cryptauth_enrollment_manager.cc |
deleted file mode 100644 |
index ca65b47d3916ffaf384683b3635a54dad9762fb1..0000000000000000000000000000000000000000 |
--- a/components/proximity_auth/cryptauth/cryptauth_enrollment_manager.cc |
+++ /dev/null |
@@ -1,304 +0,0 @@ |
-// Copyright 2015 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 "components/proximity_auth/cryptauth/cryptauth_enrollment_manager.h" |
- |
-#include <utility> |
- |
-#include "base/base64url.h" |
-#include "base/memory/ptr_util.h" |
-#include "base/time/clock.h" |
-#include "base/time/time.h" |
-#include "components/prefs/pref_registry_simple.h" |
-#include "components/prefs/pref_service.h" |
-#include "components/proximity_auth/cryptauth/cryptauth_enroller.h" |
-#include "components/proximity_auth/cryptauth/pref_names.h" |
-#include "components/proximity_auth/cryptauth/secure_message_delegate.h" |
-#include "components/proximity_auth/cryptauth/sync_scheduler_impl.h" |
-#include "components/proximity_auth/logging/logging.h" |
- |
-namespace proximity_auth { |
- |
-namespace { |
- |
-// The number of days that an enrollment is valid. Note that we try to refresh |
-// the enrollment well before this time elapses. |
-const int kValidEnrollmentPeriodDays = 45; |
- |
-// The normal period between successful enrollments in days. |
-const int kEnrollmentRefreshPeriodDays = 30; |
- |
-// A more aggressive period between enrollments to recover when the last |
-// enrollment fails, in minutes. This is a base time that increases for each |
-// subsequent failure. |
-const int kEnrollmentBaseRecoveryPeriodMinutes = 10; |
- |
-// The bound on the amount to jitter the period between enrollments. |
-const double kEnrollmentMaxJitterRatio = 0.2; |
- |
-// The value of the device_software_package field in the device info uploaded |
-// during enrollment. This value must be the same as the app id used for GCM |
-// registration. |
-const char kDeviceSoftwarePackage[] = "com.google.chrome.cryptauth"; |
- |
-} // namespace |
- |
-CryptAuthEnrollmentManager::CryptAuthEnrollmentManager( |
- std::unique_ptr<base::Clock> clock, |
- std::unique_ptr<CryptAuthEnrollerFactory> enroller_factory, |
- std::unique_ptr<SecureMessageDelegate> secure_message_delegate, |
- const cryptauth::GcmDeviceInfo& device_info, |
- CryptAuthGCMManager* gcm_manager, |
- PrefService* pref_service) |
- : clock_(std::move(clock)), |
- enroller_factory_(std::move(enroller_factory)), |
- secure_message_delegate_(std::move(secure_message_delegate)), |
- device_info_(device_info), |
- gcm_manager_(gcm_manager), |
- pref_service_(pref_service), |
- weak_ptr_factory_(this) {} |
- |
-CryptAuthEnrollmentManager::~CryptAuthEnrollmentManager() { |
- gcm_manager_->RemoveObserver(this); |
-} |
- |
-// static |
-void CryptAuthEnrollmentManager::RegisterPrefs(PrefRegistrySimple* registry) { |
- registry->RegisterBooleanPref( |
- prefs::kCryptAuthEnrollmentIsRecoveringFromFailure, false); |
- registry->RegisterDoublePref( |
- prefs::kCryptAuthEnrollmentLastEnrollmentTimeSeconds, 0.0); |
- registry->RegisterIntegerPref(prefs::kCryptAuthEnrollmentReason, |
- cryptauth::INVOCATION_REASON_UNKNOWN); |
- registry->RegisterStringPref(prefs::kCryptAuthEnrollmentUserPublicKey, |
- std::string()); |
- registry->RegisterStringPref(prefs::kCryptAuthEnrollmentUserPrivateKey, |
- std::string()); |
-} |
- |
-void CryptAuthEnrollmentManager::Start() { |
- gcm_manager_->AddObserver(this); |
- |
- bool is_recovering_from_failure = |
- pref_service_->GetBoolean( |
- prefs::kCryptAuthEnrollmentIsRecoveringFromFailure) || |
- !IsEnrollmentValid(); |
- |
- base::Time last_successful_enrollment = GetLastEnrollmentTime(); |
- base::TimeDelta elapsed_time_since_last_sync = |
- clock_->Now() - last_successful_enrollment; |
- |
- scheduler_ = CreateSyncScheduler(); |
- scheduler_->Start(elapsed_time_since_last_sync, |
- is_recovering_from_failure |
- ? SyncScheduler::Strategy::AGGRESSIVE_RECOVERY |
- : SyncScheduler::Strategy::PERIODIC_REFRESH); |
-} |
- |
-void CryptAuthEnrollmentManager::AddObserver(Observer* observer) { |
- observers_.AddObserver(observer); |
-} |
- |
-void CryptAuthEnrollmentManager::RemoveObserver(Observer* observer) { |
- observers_.RemoveObserver(observer); |
-} |
- |
-void CryptAuthEnrollmentManager::ForceEnrollmentNow( |
- cryptauth::InvocationReason invocation_reason) { |
- // We store the invocation reason in a preference so that it can persist |
- // across browser restarts. If the sync fails, the next retry should still use |
- // this original reason instead of INVOCATION_REASON_FAILURE_RECOVERY. |
- pref_service_->SetInteger(prefs::kCryptAuthEnrollmentReason, |
- invocation_reason); |
- scheduler_->ForceSync(); |
-} |
- |
-bool CryptAuthEnrollmentManager::IsEnrollmentValid() const { |
- base::Time last_enrollment_time = GetLastEnrollmentTime(); |
- return !last_enrollment_time.is_null() && |
- (clock_->Now() - last_enrollment_time) < |
- base::TimeDelta::FromDays(kValidEnrollmentPeriodDays); |
-} |
- |
-base::Time CryptAuthEnrollmentManager::GetLastEnrollmentTime() const { |
- return base::Time::FromDoubleT(pref_service_->GetDouble( |
- prefs::kCryptAuthEnrollmentLastEnrollmentTimeSeconds)); |
-} |
- |
-base::TimeDelta CryptAuthEnrollmentManager::GetTimeToNextAttempt() const { |
- return scheduler_->GetTimeToNextSync(); |
-} |
- |
-bool CryptAuthEnrollmentManager::IsEnrollmentInProgress() const { |
- return scheduler_->GetSyncState() == |
- SyncScheduler::SyncState::SYNC_IN_PROGRESS; |
-} |
- |
-bool CryptAuthEnrollmentManager::IsRecoveringFromFailure() const { |
- return scheduler_->GetStrategy() == |
- SyncScheduler::Strategy::AGGRESSIVE_RECOVERY; |
-} |
- |
-void CryptAuthEnrollmentManager::OnEnrollmentFinished(bool success) { |
- if (success) { |
- pref_service_->SetDouble( |
- prefs::kCryptAuthEnrollmentLastEnrollmentTimeSeconds, |
- clock_->Now().ToDoubleT()); |
- pref_service_->SetInteger(prefs::kCryptAuthEnrollmentReason, |
- cryptauth::INVOCATION_REASON_UNKNOWN); |
- } |
- |
- pref_service_->SetBoolean(prefs::kCryptAuthEnrollmentIsRecoveringFromFailure, |
- !success); |
- |
- sync_request_->OnDidComplete(success); |
- cryptauth_enroller_.reset(); |
- sync_request_.reset(); |
- for (auto& observer : observers_) |
- observer.OnEnrollmentFinished(success); |
-} |
- |
-std::unique_ptr<SyncScheduler> |
-CryptAuthEnrollmentManager::CreateSyncScheduler() { |
- return base::MakeUnique<SyncSchedulerImpl>( |
- this, base::TimeDelta::FromDays(kEnrollmentRefreshPeriodDays), |
- base::TimeDelta::FromMinutes(kEnrollmentBaseRecoveryPeriodMinutes), |
- kEnrollmentMaxJitterRatio, "CryptAuth Enrollment"); |
-} |
- |
-std::string CryptAuthEnrollmentManager::GetUserPublicKey() { |
- std::string public_key; |
- if (!base::Base64UrlDecode( |
- pref_service_->GetString(prefs::kCryptAuthEnrollmentUserPublicKey), |
- base::Base64UrlDecodePolicy::REQUIRE_PADDING, &public_key)) { |
- PA_LOG(ERROR) << "Invalid public key stored in user prefs."; |
- return std::string(); |
- } |
- return public_key; |
-} |
- |
-std::string CryptAuthEnrollmentManager::GetUserPrivateKey() { |
- std::string private_key; |
- if (!base::Base64UrlDecode( |
- pref_service_->GetString(prefs::kCryptAuthEnrollmentUserPrivateKey), |
- base::Base64UrlDecodePolicy::REQUIRE_PADDING, &private_key)) { |
- PA_LOG(ERROR) << "Invalid private key stored in user prefs."; |
- return std::string(); |
- } |
- return private_key; |
-} |
- |
-void CryptAuthEnrollmentManager::OnGCMRegistrationResult(bool success) { |
- if (!sync_request_) |
- return; |
- |
- PA_LOG(INFO) << "GCM registration for CryptAuth Enrollment completed: " |
- << success; |
- if (success) |
- DoCryptAuthEnrollment(); |
- else |
- OnEnrollmentFinished(false); |
-} |
- |
-void CryptAuthEnrollmentManager::OnKeyPairGenerated( |
- const std::string& public_key, |
- const std::string& private_key) { |
- if (!public_key.empty() && !private_key.empty()) { |
- PA_LOG(INFO) << "Key pair generated for CryptAuth enrollment"; |
- // Store the keypair in Base64 format because pref values require readable |
- // string values. |
- std::string public_key_b64, private_key_b64; |
- base::Base64UrlEncode(public_key, |
- base::Base64UrlEncodePolicy::INCLUDE_PADDING, |
- &public_key_b64); |
- base::Base64UrlEncode(private_key, |
- base::Base64UrlEncodePolicy::INCLUDE_PADDING, |
- &private_key_b64); |
- pref_service_->SetString(prefs::kCryptAuthEnrollmentUserPublicKey, |
- public_key_b64); |
- pref_service_->SetString(prefs::kCryptAuthEnrollmentUserPrivateKey, |
- private_key_b64); |
- DoCryptAuthEnrollment(); |
- } else { |
- OnEnrollmentFinished(false); |
- } |
-} |
- |
-void CryptAuthEnrollmentManager::OnReenrollMessage() { |
- ForceEnrollmentNow(cryptauth::INVOCATION_REASON_SERVER_INITIATED); |
-} |
- |
-void CryptAuthEnrollmentManager::OnSyncRequested( |
- std::unique_ptr<SyncScheduler::SyncRequest> sync_request) { |
- for (auto& observer : observers_) |
- observer.OnEnrollmentStarted(); |
- |
- sync_request_ = std::move(sync_request); |
- if (gcm_manager_->GetRegistrationId().empty() || |
- pref_service_->GetInteger(prefs::kCryptAuthEnrollmentReason) == |
- cryptauth::INVOCATION_REASON_MANUAL) { |
- gcm_manager_->RegisterWithGCM(); |
- } else { |
- DoCryptAuthEnrollment(); |
- } |
-} |
- |
-void CryptAuthEnrollmentManager::DoCryptAuthEnrollment() { |
- if (GetUserPublicKey().empty() || GetUserPrivateKey().empty()) { |
- secure_message_delegate_->GenerateKeyPair( |
- base::Bind(&CryptAuthEnrollmentManager::OnKeyPairGenerated, |
- weak_ptr_factory_.GetWeakPtr())); |
- } else { |
- DoCryptAuthEnrollmentWithKeys(); |
- } |
-} |
- |
-void CryptAuthEnrollmentManager::DoCryptAuthEnrollmentWithKeys() { |
- DCHECK(sync_request_); |
- cryptauth::InvocationReason invocation_reason = |
- cryptauth::INVOCATION_REASON_UNKNOWN; |
- |
- int reason_stored_in_prefs = |
- pref_service_->GetInteger(prefs::kCryptAuthEnrollmentReason); |
- |
- if (cryptauth::InvocationReason_IsValid(reason_stored_in_prefs) && |
- reason_stored_in_prefs != cryptauth::INVOCATION_REASON_UNKNOWN) { |
- invocation_reason = |
- static_cast<cryptauth::InvocationReason>(reason_stored_in_prefs); |
- } else if (GetLastEnrollmentTime().is_null()) { |
- invocation_reason = cryptauth::INVOCATION_REASON_INITIALIZATION; |
- } else if (!IsEnrollmentValid()) { |
- invocation_reason = cryptauth::INVOCATION_REASON_EXPIRATION; |
- } else if (scheduler_->GetStrategy() == |
- SyncScheduler::Strategy::PERIODIC_REFRESH) { |
- invocation_reason = cryptauth::INVOCATION_REASON_PERIODIC; |
- } else if (scheduler_->GetStrategy() == |
- SyncScheduler::Strategy::AGGRESSIVE_RECOVERY) { |
- invocation_reason = cryptauth::INVOCATION_REASON_FAILURE_RECOVERY; |
- } |
- |
- // Fill in the current GCM registration id before enrolling, and explicitly |
- // make sure that the software package is the same as the GCM app id. |
- cryptauth::GcmDeviceInfo device_info(device_info_); |
- device_info.set_gcm_registration_id(gcm_manager_->GetRegistrationId()); |
- device_info.set_device_software_package(kDeviceSoftwarePackage); |
- |
- std::string public_key_b64; |
- base::Base64UrlEncode(GetUserPublicKey(), |
- base::Base64UrlEncodePolicy::INCLUDE_PADDING, |
- &public_key_b64); |
- PA_LOG(INFO) << "Making enrollment:\n" |
- << " public_key: " << public_key_b64 << "\n" |
- << " invocation_reason: " << invocation_reason << "\n" |
- << " gcm_registration_id: " |
- << device_info.gcm_registration_id(); |
- |
- cryptauth_enroller_ = enroller_factory_->CreateInstance(); |
- cryptauth_enroller_->Enroll( |
- GetUserPublicKey(), GetUserPrivateKey(), device_info, invocation_reason, |
- base::Bind(&CryptAuthEnrollmentManager::OnEnrollmentFinished, |
- weak_ptr_factory_.GetWeakPtr())); |
-} |
- |
-} // namespace proximity_auth |