80 lines
1.9 KiB
Go
80 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
|
||
|
|
}
|