2022-09-27 17:59:05 +08:00
|
|
|
|
package checker
|
|
|
|
|
|
|
|
|
|
import (
|
|
|
|
|
"fmt"
|
|
|
|
|
"regexp"
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
const (
|
|
|
|
|
levelD = iota
|
|
|
|
|
LevelC
|
|
|
|
|
LevelB
|
|
|
|
|
LevelA
|
|
|
|
|
LevelS
|
|
|
|
|
)
|
|
|
|
|
|
2022-10-22 18:40:12 +08:00
|
|
|
|
// CheckPassword
|
|
|
|
|
// minLength: Specifies the minimum length of a password
|
|
|
|
|
// maxLength:Specifies the maximum length of a password
|
|
|
|
|
// minLevel:Specifies the minimum strength level required for passwords
|
|
|
|
|
// pwd:Text passwords
|
|
|
|
|
func CheckPassword(minLength, maxLength, minLevel int, pwd string) error {
|
2022-10-21 12:00:50 +08:00
|
|
|
|
// First check whether the password length is within the range
|
2022-09-27 17:59:05 +08:00
|
|
|
|
if len(pwd) < minLength {
|
|
|
|
|
return fmt.Errorf("BAD PASSWORD: The password is shorter than %d characters", minLength)
|
|
|
|
|
}
|
|
|
|
|
if len(pwd) > maxLength {
|
|
|
|
|
return fmt.Errorf("BAD PASSWORD: The password is logner than %d characters", maxLength)
|
|
|
|
|
}
|
|
|
|
|
|
2022-10-21 12:00:50 +08:00
|
|
|
|
// The password strength level is initialized to D.
|
|
|
|
|
// The regular is used to verify the password strength.
|
|
|
|
|
// If the matching is successful, the password strength increases by 1
|
2022-11-01 15:25:44 +08:00
|
|
|
|
level := levelD
|
2022-09-27 17:59:05 +08:00
|
|
|
|
patternList := []string{`[0-9]+`, `[a-z]+`, `[A-Z]+`, `[~!@#$%^&*?_-]+`}
|
|
|
|
|
for _, pattern := range patternList {
|
|
|
|
|
match, _ := regexp.MatchString(pattern, pwd)
|
|
|
|
|
if match {
|
|
|
|
|
level++
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2022-10-21 12:00:50 +08:00
|
|
|
|
// If the final password strength falls below the required minimum strength, return with an error
|
2022-09-27 17:59:05 +08:00
|
|
|
|
if level < minLevel {
|
2022-11-01 15:25:44 +08:00
|
|
|
|
return fmt.Errorf("the password does not satisfy the current policy requirements")
|
2022-09-27 17:59:05 +08:00
|
|
|
|
}
|
|
|
|
|
return nil
|
|
|
|
|
}
|