78 lines
1.7 KiB
Go
78 lines
1.7 KiB
Go
package matching
|
|
|
|
import (
|
|
"github.com/trustelem/zxcvbn/adjacency"
|
|
"github.com/trustelem/zxcvbn/frequency"
|
|
"github.com/trustelem/zxcvbn/match"
|
|
"regexp"
|
|
)
|
|
|
|
func Omnimatch(password string, userInputs []string) (matches []*match.Match) {
|
|
dictMatcher := defaultRankedDictionnaries.withDict("user_inputs", buildRankedDict(userInputs))
|
|
|
|
matchers := []match.Matcher{
|
|
dictMatcher,
|
|
reverseDictionnaryMatch{dm: dictMatcher},
|
|
l33tMatch{dm: dictMatcher, table: l33tTable},
|
|
spatialMatch{graphs: defaultGraphs},
|
|
repeatMatch{},
|
|
sequenceMatch{},
|
|
regexpMatch{regexes: defaultRegexpMatch},
|
|
dateMatch{},
|
|
}
|
|
|
|
for _, m := range matchers {
|
|
matches = append(matches, m.Matches(password)...)
|
|
}
|
|
match.Sort(matches)
|
|
return matches
|
|
}
|
|
|
|
var (
|
|
defaultRankedDictionnaries = loadDefaultDictionnaries()
|
|
defaultGraphs = loadDefaultAdjacencyGraphs()
|
|
defaultRegexpMatch = []struct {
|
|
Name string
|
|
Regexp *regexp.Regexp
|
|
}{
|
|
{
|
|
Name: "recent_year",
|
|
Regexp: regexp.MustCompile(`19\d\d|200\d|201\d`),
|
|
},
|
|
}
|
|
l33tTable = map[string][]string{
|
|
"a": {"4", "@"},
|
|
"b": {"8"},
|
|
"c": {"(", "{", "[", "<"},
|
|
"e": {"3"},
|
|
"g": {"6", "9"},
|
|
"i": {"1", "!", "|"},
|
|
"l": {"1", "|", "7"},
|
|
"o": {"0"},
|
|
"s": {"$", "5"},
|
|
"t": {"+", "7"},
|
|
"x": {"%"},
|
|
"z": {"2"},
|
|
}
|
|
)
|
|
|
|
func loadDefaultDictionnaries() dictionaryMatch {
|
|
rd := make(map[string]rankedDictionnary)
|
|
for n, list := range frequency.FrequencyLists {
|
|
rd[n] = buildRankedDict(list)
|
|
}
|
|
return dictionaryMatch{
|
|
rankedDictionaries: rd,
|
|
}
|
|
}
|
|
|
|
func loadDefaultAdjacencyGraphs() []*adjacency.Graph {
|
|
return []*adjacency.Graph{
|
|
adjacency.Graphs["qwerty"],
|
|
adjacency.Graphs["dvorak"],
|
|
adjacency.Graphs["keypad"],
|
|
adjacency.Graphs["mac_keypad"],
|
|
}
|
|
|
|
}
|