using System.Linq; using Application.Features.Config.Get; using SharedKernel.Results; namespace Application.Helpers; public static class PasswordPolicyValidator { public static Result Validate(string password, Response.AccountConfigDto config) { if (string.IsNullOrWhiteSpace(password)) { return Result.Failure(Error.Problem("Auth.PasswordRequired", "비밀번호는 필수입니다.")); } // 최소 길이 검증 (config 없으면 기본 6자) var minLength = config.PasswordMinLength ?? 6; if (password.Length < minLength) { return Result.Failure(Error.Problem("Auth.PasswordTooShort", $"비밀번호는 {minLength}자 이상이어야 합니다.")); } // 대문자 검증 if (config.PasswordUppercaseLength is > 0) { var uppercaseCount = password.Count(char.IsUpper); if (uppercaseCount < config.PasswordUppercaseLength) { return Result.Failure(Error.Problem("Auth.PasswordUppercase", $"비밀번호에 영문 대문자가 {config.PasswordUppercaseLength}자 이상 포함되어야 합니다.")); } } // 숫자 검증 if (config.PasswordNumbersLength is > 0) { var numberCount = password.Count(char.IsDigit); if (numberCount < config.PasswordNumbersLength) { return Result.Failure(Error.Problem("Auth.PasswordNumbers", $"비밀번호에 숫자가 {config.PasswordNumbersLength}자 이상 포함되어야 합니다.")); } } // 특수문자 검증 if (config.PasswordSpecialcharsLength is > 0) { var specialCount = password.Count(c => !char.IsLetterOrDigit(c)); if (specialCount < config.PasswordSpecialcharsLength) { return Result.Failure(Error.Problem("Auth.PasswordSpecialChars", $"비밀번호에 특수문자가 {config.PasswordSpecialcharsLength}자 이상 포함되어야 합니다.")); } } return Result.Success(); } }