diff --git a/Endpoint/Controllers/Configuration/SetupController.cs b/Endpoint/Controllers/Configuration/SetupController.cs index 86d7edd..022bf0b 100644 --- a/Endpoint/Controllers/Configuration/SetupController.cs +++ b/Endpoint/Controllers/Configuration/SetupController.cs @@ -23,7 +23,6 @@ using System.IO; using System.Net.Mail; using System.Runtime.InteropServices; using System.Security.Cryptography; -using System.Text.RegularExpressions; namespace Mirea.Api.Endpoint.Controllers.Configuration; @@ -31,7 +30,7 @@ namespace Mirea.Api.Endpoint.Controllers.Configuration; [ApiController] [MaintenanceModeIgnore] [ApiExplorerSettings(IgnoreApi = true)] -public partial class SetupController( +public class SetupController( ISetupToken setupToken, IMaintenanceModeNotConfigureService notConfigureService, IMemoryCache cache, @@ -212,7 +211,7 @@ public partial class SetupController( [BadRequestResponse] public ActionResult CreateAdmin([FromBody] CreateUserRequest user) { - if (user.Password.Length < 8 || !PasswordExistUpperLetter().IsMatch(user.Password) || !PasswordExistSpecialSymbol().IsMatch(user.Password)) + if (PasswordHashService.HasPasswordInPolicySecurity(user.Password)) throw new ControllerArgumentException("The password must be at least 8 characters long and contain at least one uppercase letter and one special character."); if (!MailAddress.TryCreate(user.Email, out _)) diff --git a/Security/Services/PasswordHashService.cs b/Security/Services/PasswordHashService.cs index 8673222..df16f75 100644 --- a/Security/Services/PasswordHashService.cs +++ b/Security/Services/PasswordHashService.cs @@ -1,10 +1,11 @@ using Konscious.Security.Cryptography; using System; using System.Text; +using System.Text.RegularExpressions; namespace Mirea.Api.Security.Services; -public class PasswordHashService +public partial class PasswordHashService { public int SaltSize { private get; init; } public int HashSize { private get; init; } @@ -53,4 +54,15 @@ public class PasswordHashService public bool VerifyPassword(string password, string saltBase64, string hashBase64) => VerifyPassword(password, Convert.FromBase64String(saltBase64), Convert.FromBase64String(hashBase64)); + + public static bool HasPasswordInPolicySecurity(string password) => + password.Length >= 8 && + PasswordExistSpecialSymbol().IsMatch(password) && + PasswordExistUpperLetter().IsMatch(password); + + [GeneratedRegex("[A-Z]+")] + private static partial Regex PasswordExistUpperLetter(); + + [GeneratedRegex("[!@#$%^&*]+")] + private static partial Regex PasswordExistSpecialSymbol(); } \ No newline at end of file