mirror of
				https://github.com/superseriousbusiness/gotosocial.git
				synced 2025-11-02 20:02:25 -06:00 
			
		
		
		
	* start fixing up tests * fix up tests + automate with drone * fiddle with linting * messing about with drone.yml * some more fiddling * hmmm * add cache * add vendor directory * verbose * ci updates * update some little things * update sig
		
			
				
	
	
		
			94 lines
		
	
	
	
		
			2.3 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			94 lines
		
	
	
	
		
			2.3 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
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)
 | 
						|
}
 |