veza/veza-backend-api/internal/validators/password_validator.go
2025-12-03 20:29:37 +01:00

79 lines
1.9 KiB
Go

package validators
import (
"regexp"
)
var (
hasUpper = regexp.MustCompile(`[A-Z]`)
hasLower = regexp.MustCompile(`[a-z]`)
hasNumber = regexp.MustCompile(`[0-9]`)
hasSpecial = regexp.MustCompile(`[!@#$%^&*(),.?":{}|<>]`)
)
// PasswordValidator valide la force d'un mot de passe
type PasswordValidator struct {
MinLength int
}
// NewPasswordValidator crée une nouvelle instance de PasswordValidator
func NewPasswordValidator() *PasswordValidator {
return &PasswordValidator{MinLength: 12}
}
// PasswordStrength représente le résultat de la validation d'un mot de passe
type PasswordStrength struct {
Valid bool
Score int
Details []string
}
// Validate valide la force d'un mot de passe selon les règles définies
func (v *PasswordValidator) Validate(password string) (PasswordStrength, error) {
strength := PasswordStrength{
Valid: true,
Details: []string{},
}
// Length check
if len(password) < v.MinLength {
strength.Valid = false
strength.Details = append(strength.Details,
"Password must be at least 12 characters long")
return strength, nil
}
// Upper case check
if !hasUpper.MatchString(password) {
strength.Valid = false
strength.Details = append(strength.Details, "Must contain uppercase letter")
} else {
strength.Score++
}
// Lower case check
if !hasLower.MatchString(password) {
strength.Valid = false
strength.Details = append(strength.Details, "Must contain lowercase letter")
} else {
strength.Score++
}
// Number check
if !hasNumber.MatchString(password) {
strength.Valid = false
strength.Details = append(strength.Details, "Must contain number")
} else {
strength.Score++
}
// Special character check
if !hasSpecial.MatchString(password) {
strength.Valid = false
strength.Details = append(strength.Details, "Must contain special character")
} else {
strength.Score++
}
return strength, nil
}