/** * Password Validator * T0197: Validates password strength with minimum 8 characters, uppercase, lowercase, number, and special character */ export interface PasswordValidationResult { isValid: boolean; errors: string[]; strength: { length: boolean; upper: boolean; lower: boolean; number: boolean; special: boolean; }; } /** * Validates password strength according to security rules * @param password - The password to validate * @returns Validation result with isValid flag, errors array, and strength checks */ export function validatePasswordStrength( password: string ): PasswordValidationResult { const errors: string[] = []; const strength = { length: false, upper: false, lower: false, number: false, special: false, }; // Length check (minimum 8 characters) if (password.length < 8) { errors.push('password must be at least 8 characters'); } else { strength.length = true; } // Maximum length check if (password.length > 128) { errors.push('password must be less than 128 characters'); } // Upper case check if (!/[A-Z]/.test(password)) { errors.push('password must contain at least one uppercase letter'); } else { strength.upper = true; } // Lower case check if (!/[a-z]/.test(password)) { errors.push('password must contain at least one lowercase letter'); } else { strength.lower = true; } // Number check if (!/[0-9]/.test(password)) { errors.push('password must contain at least one number'); } else { strength.number = true; } // Special character check if (!/[!@#$%^&*(),.?":{}|<>]/.test(password)) { errors.push('password must contain at least one special character'); } else { strength.special = true; } return { isValid: errors.length === 0, errors, strength, }; } /** * Calculates password strength score (0-5) * @param password - The password to score * @returns Score from 0 to 5 */ export function calculatePasswordStrength(password: string): number { const result = validatePasswordStrength(password); let score = 0; if (result.strength.length) score++; if (result.strength.upper) score++; if (result.strength.lower) score++; if (result.strength.number) score++; if (result.strength.special) score++; return score; }