1
0
mirror of https://github.com/hrfee/jfa-go.git synced 2024-06-02 15:47:45 +02:00
jfa-go/pwval.go
Harvey Tindall e5ebcef684 Partial check for invite page, 404 handling
The invite route no longer calls checkInvite, instead just chekcing the
invite exists. This speeds up page loading. the 404 and invalidCode
pages are now loaded when necessary.
2020-07-31 13:03:36 +01:00

69 lines
1.5 KiB
Go

package main
import (
"fmt"
"strings"
"unicode"
)
type Validator struct {
minLength, upper, lower, number, special int
criteria ValidatorConf
specialChars []rune
}
type ValidatorConf map[string]int
func (vd *Validator) init(criteria ValidatorConf) {
vd.specialChars = []rune{'[', '@', '_', '!', '#', '$', '%', '^', '&', '*', '(', ')', '<', '>', '?', '/', '\\', '|', '}', '{', '~', ':', ']'}
vd.criteria = criteria
}
func (vd *Validator) validate(password string) map[string]bool {
count := map[string]int{}
for key, _ := range vd.criteria {
count[key] = 0
}
for _, c := range password {
count["characters"] += 1
if unicode.IsUpper(c) {
count["uppercase characters"] += 1
} else if unicode.IsLower(c) {
count["lowercase characters"] += 1
} else if unicode.IsNumber(c) {
count["numbers"] += 1
} else {
for _, s := range vd.specialChars {
if c == s {
count["special characters"] += 1
}
}
}
}
results := map[string]bool{}
for criterion, num := range count {
if num < vd.criteria[criterion] {
results[criterion] = false
} else {
results[criterion] = true
}
}
return results
}
func (vd *Validator) getCriteria() map[string]string {
lines := map[string]string{}
for criterion, min := range vd.criteria {
if min > 0 {
text := fmt.Sprintf("Must have at least %d ", min)
if min == 1 {
text += strings.TrimSuffix(criterion, "s")
} else {
text += criterion
}
lines[criterion] = text
}
}
return lines
}