platform: modularize api/gui, add docs-tests-web foundation, and refresh root config
This commit is contained in:
60
selective-vpn-api/app/resolver/common.go
Normal file
60
selective-vpn-api/app/resolver/common.go
Normal file
@@ -0,0 +1,60 @@
|
||||
package resolver
|
||||
|
||||
import (
|
||||
"hash/fnv"
|
||||
"regexp"
|
||||
"strconv"
|
||||
"strings"
|
||||
)
|
||||
|
||||
var reANSI = regexp.MustCompile(`\x1B\[[0-9;]*[A-Za-z]`)
|
||||
|
||||
func UniqueStrings(in []string) []string {
|
||||
seen := map[string]struct{}{}
|
||||
var out []string
|
||||
for _, v := range in {
|
||||
if _, ok := seen[v]; !ok {
|
||||
seen[v] = struct{}{}
|
||||
out = append(out, v)
|
||||
}
|
||||
}
|
||||
return out
|
||||
}
|
||||
|
||||
func PickDNSStartIndex(host string, size int) int {
|
||||
if size <= 1 {
|
||||
return 0
|
||||
}
|
||||
h := fnv.New32a()
|
||||
_, _ = h.Write([]byte(strings.ToLower(strings.TrimSpace(host))))
|
||||
return int(h.Sum32() % uint32(size))
|
||||
}
|
||||
|
||||
func StripANSI(s string) string {
|
||||
return reANSI.ReplaceAllString(s, "")
|
||||
}
|
||||
|
||||
func IsPrivateIPv4(ip string) bool {
|
||||
parts := strings.Split(strings.Split(ip, "/")[0], ".")
|
||||
if len(parts) != 4 {
|
||||
return true
|
||||
}
|
||||
vals := make([]int, 4)
|
||||
for i, p := range parts {
|
||||
n, err := strconv.Atoi(p)
|
||||
if err != nil || n < 0 || n > 255 {
|
||||
return true
|
||||
}
|
||||
vals[i] = n
|
||||
}
|
||||
if vals[0] == 10 || vals[0] == 127 || vals[0] == 0 {
|
||||
return true
|
||||
}
|
||||
if vals[0] == 192 && vals[1] == 168 {
|
||||
return true
|
||||
}
|
||||
if vals[0] == 172 && vals[1] >= 16 && vals[1] <= 31 {
|
||||
return true
|
||||
}
|
||||
return false
|
||||
}
|
||||
Reference in New Issue
Block a user