Files
Курнат Андрей 2315f25754 Initial QSfera import
2026-06-07 10:20:04 +03:00

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"],
}
}