summaryrefslogtreecommitdiff
path: root/vendor/github.com/wagslane/go-password-validator/length.go
diff options
context:
space:
mode:
Diffstat (limited to 'vendor/github.com/wagslane/go-password-validator/length.go')
-rw-r--r--vendor/github.com/wagslane/go-password-validator/length.go94
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)
+}