/
password.go
59 lines (46 loc) · 1.69 KB
/
password.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
package misc
import (
"fmt"
"strings"
)
const (
// PasswordMinChar is the minimum number of characters the password should have
PasswordMinChar = 12
// PasswordMaxChar is the maximum number of characters the password should have
PasswordMaxChar = 30
// PasswordMinUniqueChar is the minimum number of unique characters the password should have
PasswordMinUniqueChar = 7
)
var passwordTooltipTemplate = `
<div style=\"text-align: left;\">
Password Rules:<br>
1. At least %v characters<br>
2. At most %v characters<br>
3. At least %v unique characters<br>
4. Differ from username and email<br>
</div>
`
// PasswordTooltip is an explanation snippet of the rules to a valid password
var PasswordTooltip = fmt.Sprintf(passwordTooltipTemplate, PasswordMinChar, PasswordMaxChar, PasswordMinUniqueChar)
// ValidatePassword verify if a password is valid
func ValidatePassword(password, username, email string) error {
if len(password) < PasswordMinChar {
return fmt.Errorf("password should have at least %v characters", PasswordMinChar)
}
if len(password) > PasswordMaxChar {
return fmt.Errorf("password should have at most %v characters", PasswordMaxChar)
}
pass := strings.ToLower(password)
user := strings.ToLower(username)
mail := strings.ToLower(email)
if strings.Contains(pass, user) || strings.Contains(user, pass) {
return fmt.Errorf("password is too similar to your username")
}
if strings.Contains(pass, mail) || strings.Contains(mail, pass) {
return fmt.Errorf("password is too similar to your email")
}
if CountUniqueCharacters(pass) < PasswordMinUniqueChar {
return fmt.Errorf("password should have at least %v unique characters", PasswordMinUniqueChar)
}
return nil
}