| // 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 CHROME_BROWSER_UI_ASH_AUTH_CRYPTOHOME_PIN_ENGINE_H_ |
| #define CHROME_BROWSER_UI_ASH_AUTH_CRYPTOHOME_PIN_ENGINE_H_ |
| |
| #include <memory> |
| #include <string> |
| |
| #include "base/functional/callback_forward.h" |
| #include "base/memory/weak_ptr.h" |
| #include "chromeos/ash/components/cryptohome/common_types.h" |
| #include "chromeos/ash/components/login/auth/auth_factor_editor.h" |
| #include "chromeos/ash/components/login/auth/auth_performer.h" |
| #include "third_party/abseil-cpp/absl/types/optional.h" |
| |
| namespace ash { |
| |
| class UserContext; |
| |
| // Handles Pin related authentication operations and is the source of truth |
| // for the availability of Pin authentication. |
| class CryptohomePinEngine { |
| public: |
| enum class Purpose { kAny, kUnlock, kWebAuthn }; |
| |
| explicit CryptohomePinEngine(ash::AuthPerformer* auth_performer); |
| CryptohomePinEngine(const CryptohomePinEngine&) = delete; |
| CryptohomePinEngine& operator=(const CryptohomePinEngine&) = delete; |
| virtual ~CryptohomePinEngine(); |
| |
| using IsPinAuthAvailableCallback = |
| base::OnceCallback<void(bool, std::unique_ptr<UserContext>)>; |
| |
| // Checks if pin setup should be skipped due to policy. |
| bool ShouldSkipSetupBecauseOfPolicy(const AccountId& account_id) const; |
| |
| // Checks if pin is disabled by policy for the given `account_id` and |
| // `purpose`. |
| absl::optional<bool> IsCryptohomePinDisabledByPolicy( |
| const AccountId& account_id, |
| CryptohomePinEngine::Purpose purpose) const; |
| |
| // Checks the availability of Pin authentication, based on things like |
| // policy configuration and whether or not the auth factor is set up. |
| void IsPinAuthAvailable(Purpose purpose, |
| std::unique_ptr<UserContext> user_context, |
| IsPinAuthAvailableCallback callback); |
| |
| // The `user_context` parameter must have an associated `authsession_id`, |
| // acquired from a call to `AuthPerformer::StartAuthSession`. |
| void Authenticate(const cryptohome::RawPin& pin, |
| std::unique_ptr<UserContext> user_context, |
| AuthOperationCallback callback); |
| |
| private: |
| // Checks for Pin factor availability and lockout status |
| void CheckCryptohomePinFactor(std::unique_ptr<UserContext> user_context, |
| IsPinAuthAvailableCallback callback); |
| |
| void OnGetAuthFactorsConfiguration(IsPinAuthAvailableCallback callback, |
| std::unique_ptr<UserContext> user_context, |
| absl::optional<AuthenticationError> error); |
| |
| // Non owning pointer |
| const base::raw_ptr<ash::AuthPerformer> auth_performer_; |
| |
| ash::AuthFactorEditor auth_factor_editor_; |
| |
| base::WeakPtrFactory<CryptohomePinEngine> weak_factory_{this}; |
| }; |
| |
| } // namespace ash |
| |
| #endif // CHROME_BROWSER_UI_ASH_AUTH_CRYPTOHOME_PIN_ENGINE_H_ |