// Copyright 2024 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef CHROMEOS_ASH_COMPONENTS_OSAUTH_IMPL_ENGINES_PREFS_PIN_ENGINE_H_
#define CHROMEOS_ASH_COMPONENTS_OSAUTH_IMPL_ENGINES_PREFS_PIN_ENGINE_H_
#include <memory>
#include <string>
#include "base/memory/raw_ptr.h"
#include "base/memory/weak_ptr.h"
#include "chromeos/ash/components/osauth/public/auth_factor_engine.h"
#include "chromeos/ash/components/osauth/public/auth_factor_engine_factory.h"
#include "chromeos/ash/components/osauth/public/common_types.h"
#include "chromeos/ash/components/osauth/public/cryptohome_core.h"
#include "components/account_id/account_id.h"
#include "components/prefs/pref_service.h"
namespace ash {
class COMPONENT_EXPORT(CHROMEOS_ASH_COMPONENTS_OSAUTH) PrefsPinEngine
: public AuthFactorEngine,
public CryptohomeCore::Client {
public:
static constexpr int kMaximumUnlockAttempts = 5;
PrefsPinEngine(CryptohomeCore& core, PrefService& pref_service);
~PrefsPinEngine() override;
// Attempt to perform an PIN authentication.
void PerformPinAttempt(const std::string& raw_pin);
private:
// Functions to implement AuthFactorEngine.
AshAuthFactor GetFactor() const override;
void InitializeCommon(CommonInitCallback callback) override;
void ShutdownCommon(ShutdownCallback callback) override;
void StartAuthFlow(const AccountId& account,
AuthPurpose purpose,
FactorEngineObserver* observer) override;
void UpdateObserver(FactorEngineObserver* observer) override;
void CleanUp(CleanupCallback callback) override;
void StopAuthFlow(ShutdownCallback callback) override;
AuthProofToken StoreAuthenticationContext() override;
void SetUsageAllowed(UsageAllowed usage) override;
bool IsDisabledByPolicy() override;
bool IsLockedOut() override;
bool IsFactorSpecificRestricted() override;
void OnSuccessfulAuthentiation() override;
// Functions to implement CryptohomeCore::Client.
void OnCryptohomeAuthSessionStarted() override;
void OnAuthSessionStartFailure() override;
void OnAuthFactorUpdate(cryptohome::AuthFactorRef factor) override;
void OnCryptohomeAuthSessionFinished() override;
// Handles cryptohome readiness during init.
void OnCryptohomeReady(CommonInitCallback callback, bool service_available);
raw_ptr<CryptohomeCore> core_;
raw_ptr<PrefService> pref_service_;
raw_ptr<FactorEngineObserver> observer_;
UsageAllowed usage_allowed_ = UsageAllowed::kDisabled;
bool is_supported_ = false;
ShutdownCallback shutdown_callback_;
base::WeakPtrFactory<PrefsPinEngine> weak_factory_{this};
};
class PrefsPinEngineFactory : public AuthFactorEngineFactory {
public:
explicit PrefsPinEngineFactory(PrefService& local_state);
AshAuthFactor GetFactor() override;
std::unique_ptr<AuthFactorEngine> CreateEngine(AuthHubMode mode) override;
private:
raw_ptr<PrefService> local_state_;
};
} // namespace ash
#endif // CHROMEOS_ASH_COMPONENTS_OSAUTH_IMPL_ENGINES_PREFS_PIN_ENGINE_H_