76 lines
1.3 KiB
Go
76 lines
1.3 KiB
Go
|
package passwordvalidator
|
||
|
|
||
|
import "strings"
|
||
|
|
||
|
const (
|
||
|
replaceChars = `!@$&*`
|
||
|
sepChars = `_-., `
|
||
|
otherSpecialChars = `"#%'()+/:;<=>?[\]^{|}~`
|
||
|
lowerChars = `abcdefghijklmnopqrstuvwxyz`
|
||
|
upperChars = `ABCDEFGHIJKLMNOPQRSTUVWXYZ`
|
||
|
digitsChars = `0123456789`
|
||
|
)
|
||
|
|
||
|
func getBase(password string) int {
|
||
|
chars := map[rune]struct{}{}
|
||
|
for _, c := range password {
|
||
|
chars[c] = struct{}{}
|
||
|
}
|
||
|
|
||
|
hasReplace := false
|
||
|
hasSep := false
|
||
|
hasOtherSpecial := false
|
||
|
hasLower := false
|
||
|
hasUpper := false
|
||
|
hasDigits := false
|
||
|
base := 0
|
||
|
|
||
|
for c := range chars {
|
||
|
if strings.ContainsRune(replaceChars, c) {
|
||
|
hasReplace = true
|
||
|
continue
|
||
|
}
|
||
|
if strings.ContainsRune(sepChars, c) {
|
||
|
hasSep = true
|
||
|
continue
|
||
|
}
|
||
|
if strings.ContainsRune(otherSpecialChars, c) {
|
||
|
hasOtherSpecial = true
|
||
|
continue
|
||
|
}
|
||
|
if strings.ContainsRune(lowerChars, c) {
|
||
|
hasLower = true
|
||
|
continue
|
||
|
}
|
||
|
if strings.ContainsRune(upperChars, c) {
|
||
|
hasUpper = true
|
||
|
continue
|
||
|
}
|
||
|
if strings.ContainsRune(digitsChars, c) {
|
||
|
hasDigits = true
|
||
|
continue
|
||
|
}
|
||
|
base++
|
||
|
}
|
||
|
|
||
|
if hasReplace {
|
||
|
base += len(replaceChars)
|
||
|
}
|
||
|
if hasSep {
|
||
|
base += len(sepChars)
|
||
|
}
|
||
|
if hasOtherSpecial {
|
||
|
base += len(otherSpecialChars)
|
||
|
}
|
||
|
if hasLower {
|
||
|
base += len(lowerChars)
|
||
|
}
|
||
|
if hasUpper {
|
||
|
base += len(upperChars)
|
||
|
}
|
||
|
if hasDigits {
|
||
|
base += len(digitsChars)
|
||
|
}
|
||
|
return base
|
||
|
}
|