48 lines
1.2 KiB
Go
48 lines
1.2 KiB
Go
package utils
|
|
|
|
import (
|
|
"fmt"
|
|
"unicode"
|
|
)
|
|
|
|
// ValidatePasswordStrength validates password strength according to security rules
|
|
// T0197: Validates password with minimum 8 characters, uppercase, lowercase, number, and special character
|
|
func ValidatePasswordStrength(password string) error {
|
|
if len(password) < 8 {
|
|
return fmt.Errorf("password must be at least 8 characters")
|
|
}
|
|
|
|
if len(password) > 128 {
|
|
return fmt.Errorf("password must be less than 128 characters")
|
|
}
|
|
|
|
var hasUpper, hasLower, hasNumber, hasSpecial bool
|
|
|
|
for _, char := range password {
|
|
switch {
|
|
case unicode.IsUpper(char):
|
|
hasUpper = true
|
|
case unicode.IsLower(char):
|
|
hasLower = true
|
|
case unicode.IsNumber(char):
|
|
hasNumber = true
|
|
case unicode.IsPunct(char) || unicode.IsSymbol(char):
|
|
hasSpecial = true
|
|
}
|
|
}
|
|
|
|
if !hasUpper {
|
|
return fmt.Errorf("password must contain at least one uppercase letter")
|
|
}
|
|
if !hasLower {
|
|
return fmt.Errorf("password must contain at least one lowercase letter")
|
|
}
|
|
if !hasNumber {
|
|
return fmt.Errorf("password must contain at least one number")
|
|
}
|
|
if !hasSpecial {
|
|
return fmt.Errorf("password must contain at least one special character")
|
|
}
|
|
|
|
return nil
|
|
}
|