diff options
Diffstat (limited to 'vendor/github.com/wagslane/go-password-validator/length.go')
| -rw-r--r-- | vendor/github.com/wagslane/go-password-validator/length.go | 94 |
1 files changed, 94 insertions, 0 deletions
diff --git a/vendor/github.com/wagslane/go-password-validator/length.go b/vendor/github.com/wagslane/go-password-validator/length.go new file mode 100644 index 000000000..ba9014329 --- /dev/null +++ b/vendor/github.com/wagslane/go-password-validator/length.go @@ -0,0 +1,94 @@ +package passwordvalidator + +const ( + seqNums = "0123456789" + seqKeyboard0 = "qwertyuiop" + seqKeyboard1 = "asdfghjkl" + seqKeyboard2 = "zxcvbnm" + seqAlphabet = "abcdefghijklmnopqrstuvwxyz" +) + +func removeMoreThanTwoFromSequence(s, seq string) string { + seqRunes := []rune(seq) + runes := []rune(s) + matches := 0 + for i := 0; i < len(runes); i++ { + for j := 0; j < len(seqRunes); j++ { + if i >= len(runes) { + break + } + r := runes[i] + r2 := seqRunes[j] + if r != r2 { + matches = 0 + continue + } + // found a match, advance the counter + matches++ + if matches > 2 { + runes = deleteRuneAt(runes, i) + } else { + i++ + } + } + } + return string(runes) +} + +func deleteRuneAt(runes []rune, i int) []rune { + if i >= len(runes) || + i < 0 { + return runes + } + copy(runes[i:], runes[i+1:]) + runes[len(runes)-1] = 0 + runes = runes[:len(runes)-1] + return runes +} + +func getReversedString(s string) string { + n := 0 + rune := make([]rune, len(s)) + for _, r := range s { + rune[n] = r + n++ + } + rune = rune[0:n] + // Reverse + for i := 0; i < n/2; i++ { + rune[i], rune[n-1-i] = rune[n-1-i], rune[i] + } + // Convert back to UTF-8. + return string(rune) +} + +func removeMoreThanTwoRepeatingChars(s string) string { + var prevPrev rune + var prev rune + runes := []rune(s) + for i := 0; i < len(runes); i++ { + r := runes[i] + if r == prev && r == prevPrev { + runes = deleteRuneAt(runes, i) + i-- + } + prevPrev = prev + prev = r + } + return string(runes) +} + +func getLength(password string) int { + password = removeMoreThanTwoRepeatingChars(password) + password = removeMoreThanTwoFromSequence(password, seqNums) + password = removeMoreThanTwoFromSequence(password, seqKeyboard0) + password = removeMoreThanTwoFromSequence(password, seqKeyboard1) + password = removeMoreThanTwoFromSequence(password, seqKeyboard2) + password = removeMoreThanTwoFromSequence(password, seqAlphabet) + password = removeMoreThanTwoFromSequence(password, getReversedString(seqNums)) + password = removeMoreThanTwoFromSequence(password, getReversedString(seqKeyboard0)) + password = removeMoreThanTwoFromSequence(password, getReversedString(seqKeyboard1)) + password = removeMoreThanTwoFromSequence(password, getReversedString(seqKeyboard2)) + password = removeMoreThanTwoFromSequence(password, getReversedString(seqAlphabet)) + return len(password) +} |
