using System.Threading.Tasks; using BTCPayServer.Data; using Microsoft.AspNetCore.Identity; using Microsoft.EntityFrameworkCore; namespace BTCPayServer.Fido2; public class Fido2TokenProvider(ApplicationDbContextFactory dbContextFactory) : IUserTwoFactorTokenProvider { public Task GenerateAsync(string purpose, UserManager manager, ApplicationUser user) => Task.FromResult(string.Empty); public Task ValidateAsync(string purpose, string token, UserManager manager, ApplicationUser user) => Task.FromResult(false); public async Task CanGenerateTwoFactorTokenAsync(UserManager manager, ApplicationUser user) { // Only FIDO2 and LNURLAuth credentials can generate two-factor tokens (Passkey is not second factor) await using var context = dbContextFactory.CreateContext(); return await context.Fido2Credentials.AnyAsync(f => f.ApplicationUserId == user.Id && (f.Type == Fido2Credential.CredentialType.FIDO2 || f.Type == Fido2Credential.CredentialType.LNURLAuth)); } }