-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathtemplates.go
144 lines (127 loc) · 3.29 KB
/
templates.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
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
package masterpassword
import (
"errors"
"strings"
)
const prefix string = "com.lyndir.masterpassword"
const saltFormat string = prefix + "%d%s"
const seedFormat string = prefix + "%d%s%d"
const (
PasswordTypeMaximumSecurity = iota
PasswordTypeLong
PasswordTypeMedium
PasswordTypeShort
PasswordTypeBasic
PasswordTypePIN
)
// PasswordType is the type of password to generate.
// The available types are PIN, Short, Basic, Medium, Long and Maximum Security.
type PasswordType int
type templateType rune
var templateCharacters = map[templateType]string{
'V': "AEIOU",
'C': "BCDFGHJKLMNPQRSTVWXYZ",
'v': "aeiou",
'c': "bcdfghjklmnpqrstvwxyz",
'A': "AEIOUBCDFGHJKLMNPQRSTVWXYZ",
'a': "AEIOUaeiouBCDFGHJKLMNPQRSTVWXYZbcdfghjklmnpqrstvwxyz",
'n': "0123456789",
'o': "@&%?,=[]_:-+*$#!'^~;()/.",
'X': "AEIOUaeiouBCDFGHJKLMNPQRSTVWXYZbcdfghjklmnpqrstvwxyz0123456789@&%?,=[]_:-+*$#!'^~;()/.",
}
var passwordTypeTemplates = map[PasswordType][]string{
PasswordTypeMaximumSecurity: {
"anoxxxxxxxxxxxxxxxxx",
"axxxxxxxxxxxxxxxxxno",
},
PasswordTypeLong: {
"CvcvnoCvcvCvcv",
"CvcvCvcvnoCvcv",
"CvcvCvcvCvcvno",
"CvccnoCvcvCvcv",
"CvccCvcvnoCvcv",
"CvccCvcvCvcvno",
"CvcvnoCvccCvcv",
"CvcvCvccnoCvcv",
"CvcvCvccCvcvno",
"CvcvnoCvcvCvcc",
"CvcvCvcvnoCvcc",
"CvcvCvcvCvccno",
"CvccnoCvccCvcv",
"CvccCvccnoCvcv",
"CvccCvccCvcvno",
"CvcvnoCvccCvcc",
"CvcvCvccnoCvcc",
"CvcvCvccCvccno",
"CvccnoCvcvCvcc",
"CvccCvcvnoCvcc",
"CvccCvcvCvccno",
},
PasswordTypeMedium: {
"CvcnoCvc",
"CvcCvcno",
},
PasswordTypeShort: {
"Cvcn",
},
PasswordTypeBasic: {
"aaanaaan",
"aannaaan",
"aaannaaa",
},
PasswordTypePIN: {
"nnnn",
},
}
// charOfTemplate returns the resulting character given a template.
func charOfTemplate(value byte, template string) rune {
if 0 == len(template) {
panic(errors.New("Template is empty"))
}
return rune(template[int(value)%len(template)])
}
// charOfClass returns the character for a given class
func charOfClass(value byte, class templateType) rune {
return charOfTemplate(value, templateCharacters[class])
}
// String implements the Value interface for PasswordType and converts the enum value to
// a human readable string value
func (t *PasswordType) String() (s string) {
switch *t {
case PasswordTypeBasic:
s = "basic"
case PasswordTypeShort:
s = "short"
case PasswordTypePIN:
s = "PIN"
case PasswordTypeMedium:
s = "medium"
case PasswordTypeLong:
s = "long"
case PasswordTypeMaximumSecurity:
s = "maximum security"
}
return
}
// Set implements the Value interface for PasswordType and converts from a string value
// to an enum value. Shortcuts are supported, and the check is case insensitive.
// An error is returned when resolving fails.
func (t *PasswordType) Set(value string) (err error) {
switch strings.ToLower(value) {
default:
err = errors.New("Invalid password type")
case "basic", "b":
*t = PasswordTypeBasic
case "short", "s":
*t = PasswordTypeShort
case "pin", "p":
*t = PasswordTypePIN
case "medium", "med", "m":
*t = PasswordTypeMedium
case "long", "l":
*t = PasswordTypeLong
case "maximum", "max", "x":
*t = PasswordTypeMaximumSecurity
}
return
}