using System.Collections.Immutable; using Phantom.Controller.Database.Entities; namespace Phantom.Controller.Services.Users; internal static class UserPasswords { private const int MinimumLength = 16; public static ImmutableArray<PasswordRequirementViolation> CheckRequirements(string password) { var violations = ImmutableArray.CreateBuilder<PasswordRequirementViolation>(); if (password.Length < MinimumLength) { violations.Add(new PasswordRequirementViolation.TooShort(MinimumLength)); } if (!password.Any(char.IsLower)) { violations.Add(new PasswordRequirementViolation.LowercaseLetterRequired()); } if (!password.Any(char.IsUpper)) { violations.Add(new PasswordRequirementViolation.UppercaseLetterRequired()); } if (!password.Any(char.IsDigit)) { violations.Add(new PasswordRequirementViolation.DigitRequired()); } return violations.ToImmutable(); } public static void Set(UserEntity user, string password) { user.PasswordHash = BCrypt.Net.BCrypt.HashPassword(password); } public static bool Verify(UserEntity user, string password) { return BCrypt.Net.BCrypt.Verify(password, user.PasswordHash); } }