| Index: components/proximity_auth/proximity_auth_system.cc
|
| diff --git a/components/proximity_auth/proximity_auth_system.cc b/components/proximity_auth/proximity_auth_system.cc
|
| index 3386f14e5123ae06d6bf70001cf14e969924316d..d5299691d9d2ea5959f7695a0f61bcfa984e5824 100644
|
| --- a/components/proximity_auth/proximity_auth_system.cc
|
| +++ b/components/proximity_auth/proximity_auth_system.cc
|
| @@ -5,19 +5,32 @@
|
| #include "components/proximity_auth/proximity_auth_system.h"
|
|
|
| #include "base/threading/thread_task_runner_handle.h"
|
| +#include "base/time/default_clock.h"
|
| #include "components/proximity_auth/logging/logging.h"
|
| #include "components/proximity_auth/proximity_auth_client.h"
|
| +#include "components/proximity_auth/proximity_auth_pref_manager.h"
|
| #include "components/proximity_auth/remote_device_life_cycle_impl.h"
|
| #include "components/proximity_auth/unlock_manager_impl.h"
|
|
|
| namespace proximity_auth {
|
|
|
| +namespace {
|
| +
|
| +// The maximum number of hours permitted before the user is forced is use their
|
| +// password to authenticate.
|
| +const int64_t kPasswordReauthPeriodHours = 20;
|
| +
|
| +} // namespace
|
| +
|
| ProximityAuthSystem::ProximityAuthSystem(
|
| ScreenlockType screenlock_type,
|
| ProximityAuthClient* proximity_auth_client)
|
| : proximity_auth_client_(proximity_auth_client),
|
| unlock_manager_(
|
| new UnlockManagerImpl(screenlock_type, proximity_auth_client)),
|
| + clock_(new base::DefaultClock()),
|
| + pref_manager_(new ProximityAuthPrefManager(
|
| + proximity_auth_client->GetPrefService())),
|
| suspended_(false),
|
| started_(false),
|
| weak_ptr_factory_(this) {}
|
| @@ -25,9 +38,13 @@ ProximityAuthSystem::ProximityAuthSystem(
|
| ProximityAuthSystem::ProximityAuthSystem(
|
| ScreenlockType screenlock_type,
|
| ProximityAuthClient* proximity_auth_client,
|
| - std::unique_ptr<UnlockManager> unlock_manager)
|
| + std::unique_ptr<UnlockManager> unlock_manager,
|
| + std::unique_ptr<base::Clock> clock,
|
| + std::unique_ptr<ProximityAuthPrefManager> pref_manager)
|
| : proximity_auth_client_(proximity_auth_client),
|
| unlock_manager_(std::move(unlock_manager)),
|
| + clock_(std::move(clock)),
|
| + pref_manager_(std::move(pref_manager)),
|
| suspended_(false),
|
| started_(false),
|
| weak_ptr_factory_(this) {}
|
| @@ -148,6 +165,13 @@ void ProximityAuthSystem::OnFocusedUserChanged(const AccountId& account_id) {
|
| return;
|
| }
|
|
|
| + if (ShouldForcePassword()) {
|
| + PA_LOG(INFO) << "Forcing password reauth.";
|
| + proximity_auth_client_->UpdateScreenlockState(
|
| + ScreenlockState::PASSWORD_REAUTH);
|
| + return;
|
| + }
|
| +
|
| // TODO(tengs): We currently assume each user has only one RemoteDevice, so we
|
| // can simply take the first item in the list.
|
| cryptauth::RemoteDevice remote_device = remote_devices_map_[account_id][0];
|
| @@ -161,4 +185,20 @@ void ProximityAuthSystem::OnFocusedUserChanged(const AccountId& account_id) {
|
| }
|
| }
|
|
|
| +bool ProximityAuthSystem::ShouldForcePassword() {
|
| + // TODO(tengs): Put this force password reauth logic behind an enterprise
|
| + // policy. See crbug.com/724717.
|
| + int64_t now_ms = clock_->Now().ToJavaTime();
|
| + int64_t last_password_ms = pref_manager_->GetLastPasswordEntryTimestampMs();
|
| +
|
| + if (now_ms < last_password_ms) {
|
| + PA_LOG(ERROR) << "Invalid last password timestamp: now=" << now_ms
|
| + << ", last_password=" << last_password_ms;
|
| + return true;
|
| + }
|
| +
|
| + return base::TimeDelta::FromMilliseconds(now_ms - last_password_ms) >
|
| + base::TimeDelta::FromHours(kPasswordReauthPeriodHours);
|
| +}
|
| +
|
| } // proximity_auth
|
|
|