From d366dc3b0c6c9e2f7b65f3f7d2446b5bb7afbdfa Mon Sep 17 00:00:00 2001 From: Leendert de Borst Date: Sat, 5 Oct 2024 19:16:20 +0200 Subject: [PATCH 1/2] Fix note regex bug (#275) --- .../Main/Components/Credentials/FormattedNote.razor | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/src/AliasVault.Client/Main/Components/Credentials/FormattedNote.razor b/src/AliasVault.Client/Main/Components/Credentials/FormattedNote.razor index 95ca9da68..3cff88e2b 100644 --- a/src/AliasVault.Client/Main/Components/Credentials/FormattedNote.razor +++ b/src/AliasVault.Client/Main/Components/Credentials/FormattedNote.razor @@ -6,12 +6,15 @@ @code { + /// + /// The notes to display. + /// [Parameter] public string Notes { get; set; } = ""; private static string ConvertUrlsToLinks(string text) { string urlPattern = @"(https?:\/\/(?:www\.|(?!www))[a-zA-Z0-9][a-zA-Z0-9-]+[a-zA-Z0-9]\.[^\s]{2,}|www\.[a-zA-Z0-9][a-zA-Z0-9-]+[a-zA-Z0-9]\.[^\s]{2,}|https?:\/\/(?:www\.|(?!www))[a-zA-Z0-9]+\.[^\s]{2,}|www\.[a-zA-Z0-9]+\.[^\s]{2,})"; - return Regex.Replace(text, urlPattern, match => $"{match.Value}", RegexOptions.NonBacktracking); + return Regex.Replace(text, urlPattern, match => $"{match.Value}", RegexOptions.None, TimeSpan.FromMilliseconds(100)); } -} \ No newline at end of file +} From 043538054ebc6bdb16106e9784e0d683b2ccc7e8 Mon Sep 17 00:00:00 2001 From: Leendert de Borst Date: Sat, 5 Oct 2024 19:45:46 +0200 Subject: [PATCH 2/2] Make 2FA input field a number (#275) --- src/AliasVault.Api/Controllers/AuthController.cs | 2 +- src/AliasVault.Client/Auth/Pages/Login.razor | 6 ++---- .../AliasVault.Shared/Models/WebApi/Auth/LoginModel2Fa.cs | 7 ++++--- .../Models/WebApi/Auth/ValidateLoginRequest2Fa.cs | 4 ++-- 4 files changed, 9 insertions(+), 10 deletions(-) diff --git a/src/AliasVault.Api/Controllers/AuthController.cs b/src/AliasVault.Api/Controllers/AuthController.cs index 53d8591f9..c7c2d1767 100644 --- a/src/AliasVault.Api/Controllers/AuthController.cs +++ b/src/AliasVault.Api/Controllers/AuthController.cs @@ -168,7 +168,7 @@ public class AuthController(IDbContextFactory dbContextFac } // Verify 2-factor code. - var verifyResult = await userManager.VerifyTwoFactorTokenAsync(user, userManager.Options.Tokens.AuthenticatorTokenProvider, model.Code2Fa); + var verifyResult = await userManager.VerifyTwoFactorTokenAsync(user, userManager.Options.Tokens.AuthenticatorTokenProvider, model.Code2Fa.ToString()); if (!verifyResult) { // Increment failed login attempts in order to lock out the account when the limit is reached. diff --git a/src/AliasVault.Client/Auth/Pages/Login.razor b/src/AliasVault.Client/Auth/Pages/Login.razor index 8c1031819..8d80bb115 100644 --- a/src/AliasVault.Client/Auth/Pages/Login.razor +++ b/src/AliasVault.Client/Auth/Pages/Login.razor @@ -21,10 +21,9 @@
-
- +
@@ -58,7 +57,6 @@ else if (ShowLoginWithRecoveryCodeStep)
-
@@ -328,7 +326,7 @@ else var username = LoginModel.Username.ToLowerInvariant().Trim(); // Validate 2-factor auth code auth and login - var result = await Http.PostAsJsonAsync("api/v1/Auth/validate-2fa", new ValidateLoginRequest2Fa(username, LoginModel.RememberMe, ClientEphemeral.Public, ClientSession.Proof, LoginModel2Fa.TwoFactorCode)); + var result = await Http.PostAsJsonAsync("api/v1/Auth/validate-2fa", new ValidateLoginRequest2Fa(username, LoginModel.RememberMe, ClientEphemeral.Public, ClientSession.Proof, LoginModel2Fa.TwoFactorCode ?? 0)); var responseContent = await result.Content.ReadAsStringAsync(); if (!result.IsSuccessStatusCode) diff --git a/src/Shared/AliasVault.Shared/Models/WebApi/Auth/LoginModel2Fa.cs b/src/Shared/AliasVault.Shared/Models/WebApi/Auth/LoginModel2Fa.cs index 512c0f408..e5fa6ab00 100644 --- a/src/Shared/AliasVault.Shared/Models/WebApi/Auth/LoginModel2Fa.cs +++ b/src/Shared/AliasVault.Shared/Models/WebApi/Auth/LoginModel2Fa.cs @@ -10,15 +10,16 @@ namespace AliasVault.Shared.Models.WebApi.Auth; using System.ComponentModel.DataAnnotations; /// -/// Login model for two factor authentication step using an authenticator code. +/// Login model for 2-factor authentication step using an authenticator code. /// public class LoginModel2Fa { /// - /// Gets or sets the two factor code. + /// Gets or sets the 2-factor code. /// [Required] - public string TwoFactorCode { get; set; } = null!; + [Display(Name = "Authenticator Code")] + public int? TwoFactorCode { get; set; } /// /// Gets or sets a value indicating whether the current machine should not be asked for 2FA the next time. diff --git a/src/Shared/AliasVault.Shared/Models/WebApi/Auth/ValidateLoginRequest2Fa.cs b/src/Shared/AliasVault.Shared/Models/WebApi/Auth/ValidateLoginRequest2Fa.cs index eb59c1409..9c4af5452 100644 --- a/src/Shared/AliasVault.Shared/Models/WebApi/Auth/ValidateLoginRequest2Fa.cs +++ b/src/Shared/AliasVault.Shared/Models/WebApi/Auth/ValidateLoginRequest2Fa.cs @@ -20,7 +20,7 @@ namespace AliasVault.Shared.Models.WebApi.Auth /// Client public ephemeral. /// Client session proof. /// 2-factor authentication code. - public ValidateLoginRequest2Fa(string username, bool rememberMe, string clientPublicEphemeral, string clientSessionProof, string code2Fa) + public ValidateLoginRequest2Fa(string username, bool rememberMe, string clientPublicEphemeral, string clientSessionProof, int code2Fa) : base(username, rememberMe, clientPublicEphemeral, clientSessionProof) { Code2Fa = code2Fa; @@ -29,6 +29,6 @@ namespace AliasVault.Shared.Models.WebApi.Auth /// /// Gets the 2-factor authentication code. /// - public string Code2Fa { get; } + public int Code2Fa { get; } } }