// Copyright 2023 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_CRYPTOHOME_BASED_ENGINE_H_
#define CHROMEOS_ASH_COMPONENTS_OSAUTH_IMPL_ENGINES_CRYPTOHOME_BASED_ENGINE_H_
#include <optional>
#include "base/memory/weak_ptr.h"
#include "chromeos/ash/components/cryptohome/auth_factor.h"
#include "chromeos/ash/components/login/auth/public/authentication_error.h"
#include "chromeos/ash/components/osauth/public/auth_factor_engine.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"
namespace ash {
// This class is a common base for Cryptohome-based factors.
class CryptohomeBasedEngine : public AuthFactorEngine,
public CryptohomeCore::Client {
public:
CryptohomeBasedEngine(CryptohomeCore& core, AshAuthFactor factor);
~CryptohomeBasedEngine() override;
AshAuthFactor GetFactor() const override;
void InitializeCommon(CommonInitCallback callback) override;
void ShutdownCommon(ShutdownCallback callback) override;
void StartAuthFlow(const AccountId& account,
AuthPurpose purpose,
FactorEngineObserver* observer) override;
AuthProofToken StoreAuthenticationContext() override;
void CleanUp(CleanupCallback callback) override;
void UpdateObserver(FactorEngineObserver* observer) override;
void StopAuthFlow(ShutdownCallback callback) override;
void SetUsageAllowed(UsageAllowed usage) override;
// CryptohomeCore::Client
void OnCryptohomeAuthSessionStarted() override;
void OnAuthSessionStartFailure() override;
void OnCryptohomeAuthSessionFinished() override;
protected:
// Subclasses should provide a method that looks up particular
// cryptohome key reference for the
virtual std::optional<cryptohome::AuthFactorRef> LookUpFactor(
UserContext& context) = 0;
FactorEngineObserver* get_observer() const { return observer_; }
CryptohomeCore* get_core() const { return core_; }
std::optional<cryptohome::AuthFactorRef> get_ref() const { return key_ref_; }
UsageAllowed get_usage_allowed() const { return usage_allowed_; }
private:
void OnCryptohomeReady(CommonInitCallback callback, bool service_available);
void OnSessionStarted();
void OnAuthAttempt(std::unique_ptr<UserContext>,
std::optional<AuthenticationError>);
raw_ptr<FactorEngineObserver> observer_;
raw_ptr<CryptohomeCore> core_;
UsageAllowed usage_allowed_ = UsageAllowed::kDisabled;
ShutdownCallback shutdown_callback_;
std::optional<cryptohome::AuthFactorRef> key_ref_;
AshAuthFactor factor_;
base::WeakPtrFactory<CryptohomeBasedEngine> weak_factory_{this};
};
} // namespace ash
#endif // CHROMEOS_ASH_COMPONENTS_OSAUTH_IMPL_ENGINES_CRYPTOHOME_BASED_ENGINE_H_