diff --git a/apps/server/AliasVault.Client/Auth/Models/LoginFormModel.cs b/apps/server/AliasVault.Client/Auth/Models/LoginFormModel.cs new file mode 100644 index 000000000..f2b868e96 --- /dev/null +++ b/apps/server/AliasVault.Client/Auth/Models/LoginFormModel.cs @@ -0,0 +1,44 @@ +//----------------------------------------------------------------------- +// +// Copyright (c) lanedirt. All rights reserved. +// Licensed under the AGPLv3 license. See LICENSE.md file in the project root for full license information. +// +//----------------------------------------------------------------------- + +namespace AliasVault.Client.Auth.Models; + +using System.ComponentModel.DataAnnotations; +using AliasVault.Client.Resources; +using AliasVault.Shared.Models.WebApi.Auth; + +/// +/// Login form model with localized validation. +/// +public class LoginFormModel : LoginModel +{ + /// + /// Gets or sets the username. + /// + [Required(ErrorMessageResourceType = typeof(ValidationMessages), ErrorMessageResourceName = nameof(ValidationMessages.UsernameRequired))] + public new string Username { get; set; } = null!; + + /// + /// Gets or sets the password. + /// + [Required(ErrorMessageResourceType = typeof(ValidationMessages), ErrorMessageResourceName = nameof(ValidationMessages.PasswordRequired))] + public new string Password { get; set; } = null!; + + /// + /// Converts the form model to the base model. + /// + /// The base LoginModel. + public LoginModel ToBaseModel() + { + return new LoginModel + { + Username = Username, + Password = Password, + RememberMe = RememberMe, + }; + } +} diff --git a/apps/server/AliasVault.Client/Auth/Models/RegisterFormModel.cs b/apps/server/AliasVault.Client/Auth/Models/RegisterFormModel.cs index 42bccb869..49cd025ee 100644 --- a/apps/server/AliasVault.Client/Auth/Models/RegisterFormModel.cs +++ b/apps/server/AliasVault.Client/Auth/Models/RegisterFormModel.cs @@ -20,20 +20,20 @@ public class RegisterFormModel : RegisterModel /// /// Gets or sets the username. /// - [Required] + [Required(ErrorMessageResourceType = typeof(ValidationMessages), ErrorMessageResourceName = nameof(ValidationMessages.UsernameRequired))] public new string Username { get; set; } = null!; /// /// Gets or sets the password. /// - [Required] + [Required(ErrorMessageResourceType = typeof(ValidationMessages), ErrorMessageResourceName = nameof(ValidationMessages.PasswordRequired))] [MinLength(8, ErrorMessageResourceType = typeof(ValidationMessages), ErrorMessageResourceName = nameof(ValidationMessages.PasswordMinLengthGeneric))] public new string Password { get; set; } = null!; /// /// Gets or sets the password confirmation. /// - [Required] + [Required(ErrorMessageResourceType = typeof(ValidationMessages), ErrorMessageResourceName = nameof(ValidationMessages.PasswordRequired))] [Compare("Password", ErrorMessageResourceType = typeof(ValidationMessages), ErrorMessageResourceName = nameof(ValidationMessages.PasswordsDoNotMatchGeneric))] public new string PasswordConfirm { get; set; } = null!; diff --git a/apps/server/AliasVault.Client/Auth/Pages/Login.razor b/apps/server/AliasVault.Client/Auth/Pages/Login.razor index 4639d58cd..8f54fa8bc 100644 --- a/apps/server/AliasVault.Client/Auth/Pages/Login.razor +++ b/apps/server/AliasVault.Client/Auth/Pages/Login.razor @@ -6,6 +6,7 @@ @using System.Text.Json @using AliasVault.Shared.Models.WebApi.Auth @using AliasVault.Client.Auth.Components +@using AliasVault.Client.Auth.Models @using AliasVault.Client.Utilities @using AliasVault.Cryptography.Client @using SecureRemotePassword @@ -118,7 +119,7 @@ else } @code { - private readonly LoginModel _loginModel = new(); + private readonly LoginFormModel _loginModel = new(); private readonly LoginModel2Fa _loginModel2Fa = new(); private readonly LoginModelRecoveryCode _loginModelRecoveryCode = new(); private FullScreenLoadingIndicator _loadingIndicator = new(); diff --git a/apps/server/AliasVault.Client/Main/Models/CredentialEdit.cs b/apps/server/AliasVault.Client/Main/Models/CredentialEdit.cs index 6ca0d5434..923e9c081 100644 --- a/apps/server/AliasVault.Client/Main/Models/CredentialEdit.cs +++ b/apps/server/AliasVault.Client/Main/Models/CredentialEdit.cs @@ -15,6 +15,7 @@ using System.Text.Json; using System.Text.Json.Serialization; using AliasClientDb; using AliasVault.Client.Main.Models.FormValidation; +using AliasVault.Client.Resources; /// /// Credential edit model. @@ -39,7 +40,7 @@ public sealed class CredentialEdit /// /// Gets or sets the name of the service. /// - [Required] + [Required(ErrorMessageResourceType = typeof(ValidationMessages), ErrorMessageResourceName = nameof(ValidationMessages.ServiceNameRequired))] [Display(Name = "Service Name")] public string ServiceName { get; set; } = string.Empty; diff --git a/apps/server/AliasVault.Client/Main/Models/Validation/PasswordChangeFormModel.cs b/apps/server/AliasVault.Client/Main/Models/Validation/PasswordChangeFormModel.cs index 6d85f1b31..765407abd 100644 --- a/apps/server/AliasVault.Client/Main/Models/Validation/PasswordChangeFormModel.cs +++ b/apps/server/AliasVault.Client/Main/Models/Validation/PasswordChangeFormModel.cs @@ -19,20 +19,20 @@ public class PasswordChangeFormModel : PasswordChangeModel /// /// Gets or sets the current password. /// - [Required] + [Required(ErrorMessageResourceType = typeof(ValidationMessages), ErrorMessageResourceName = nameof(ValidationMessages.PasswordRequired))] public new string CurrentPassword { get; set; } = null!; /// /// Gets or sets the new password. /// - [Required] + [Required(ErrorMessageResourceType = typeof(ValidationMessages), ErrorMessageResourceName = nameof(ValidationMessages.PasswordRequired))] [MinLength(10, ErrorMessageResourceType = typeof(ValidationMessages), ErrorMessageResourceName = nameof(ValidationMessages.PasswordMinLength))] public new string NewPassword { get; set; } = null!; /// /// Gets or sets the password confirmation. /// - [Required] + [Required(ErrorMessageResourceType = typeof(ValidationMessages), ErrorMessageResourceName = nameof(ValidationMessages.PasswordRequired))] [Compare("NewPassword", ErrorMessageResourceType = typeof(ValidationMessages), ErrorMessageResourceName = nameof(ValidationMessages.PasswordsDoNotMatch))] public new string NewPasswordConfirm { get; set; } = null!; diff --git a/apps/server/AliasVault.Client/Resources/ValidationMessages.cs b/apps/server/AliasVault.Client/Resources/ValidationMessages.cs index e21bdcc55..9fc16c86f 100644 --- a/apps/server/AliasVault.Client/Resources/ValidationMessages.cs +++ b/apps/server/AliasVault.Client/Resources/ValidationMessages.cs @@ -60,6 +60,16 @@ public static class ValidationMessages /// public static string MustAcceptTerms => GetResourceValue("MustAcceptTerms"); + /// + /// Gets the error message when service name is required. + /// + public static string ServiceNameRequired => GetResourceValue("ServiceNameRequired"); + + /// + /// Gets the generic error message when a field is required. + /// + public static string FieldRequired => GetResourceValue("FieldRequired"); + /// /// Gets the resource value for the specified key. /// diff --git a/apps/server/AliasVault.Client/Resources/ValidationMessages.en.resx b/apps/server/AliasVault.Client/Resources/ValidationMessages.en.resx index b6309c8f3..d813bd1e6 100644 --- a/apps/server/AliasVault.Client/Resources/ValidationMessages.en.resx +++ b/apps/server/AliasVault.Client/Resources/ValidationMessages.en.resx @@ -90,6 +90,14 @@ Secret key is required Error message when secret key is required + + Service name is required + Error message when service name is required + + + This field is required + Generic error message when a field is required +