mirror of
				https://github.com/superseriousbusiness/gotosocial.git
				synced 2025-10-31 14:42:26 -05: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)
 | |
| }
 |