Initial QSfera import
This commit is contained in:
+61
@@ -0,0 +1,61 @@
|
||||
package matching
|
||||
|
||||
import (
|
||||
"strings"
|
||||
|
||||
"github.com/trustelem/zxcvbn/match"
|
||||
)
|
||||
|
||||
type dictionaryMatch struct {
|
||||
rankedDictionaries map[string]rankedDictionnary
|
||||
}
|
||||
|
||||
func (dm dictionaryMatch) Matches(password string) []*match.Match {
|
||||
var results []*match.Match
|
||||
|
||||
for dictionaryName, rankedDict := range dm.rankedDictionaries {
|
||||
for i := range password {
|
||||
for delta := range password[i:] {
|
||||
j := i + delta
|
||||
word := strings.ToLower(password[i : j+1])
|
||||
if val, ok := rankedDict[word]; ok {
|
||||
matchDic := &match.Match{
|
||||
Pattern: "dictionary",
|
||||
I: i,
|
||||
J: j,
|
||||
Token: password[i : j+1],
|
||||
MatchedWord: word,
|
||||
Rank: val,
|
||||
DictionaryName: dictionaryName,
|
||||
}
|
||||
|
||||
results = append(results, matchDic)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
match.Sort(results)
|
||||
return results
|
||||
}
|
||||
|
||||
func (dm dictionaryMatch) withDict(name string, d rankedDictionnary) dictionaryMatch {
|
||||
rd2 := make(map[string]rankedDictionnary, len(dm.rankedDictionaries)+1)
|
||||
for k, v := range dm.rankedDictionaries {
|
||||
rd2[k] = v
|
||||
}
|
||||
rd2[name] = d
|
||||
return dictionaryMatch{rankedDictionaries: rd2}
|
||||
}
|
||||
|
||||
type rankedDictionnary map[string]int
|
||||
|
||||
func buildRankedDict(unrankedList []string) rankedDictionnary {
|
||||
result := make(rankedDictionnary)
|
||||
|
||||
for i, v := range unrankedList {
|
||||
result[strings.ToLower(v)] = i + 1
|
||||
}
|
||||
|
||||
return result
|
||||
}
|
||||
Reference in New Issue
Block a user