package main import ( "strings" "unicode" ) func isIPv4(addr string) bool { for _, v := range addr { if v != '.' && !unicode.IsDigit(v) { return false } } return true } func domainMask(addr string) string { // no dots - TLD or IPv6 if !strings.Contains(addr, ".") { if i := strings.LastIndex(addr, ":"); i >= 0 { // IPv6, ban last 64k addresses return addr[:i+1] + "*" } } if isIPv4(addr) { // IPv4, change last digit to * if i := strings.LastIndex(addr, "."); i >= 0 { return addr[:i+1] + "*" } } // more then one dot, skip the first if i := strings.Index(addr, "."); i >= 0 { if strings.Index(addr[i+1:], ".") >= 0 { return "*" + addr[i:] } } return addr } func isHostFlag(addr string) bool { if addr == "" { return false } switch addr[0] { case '^', '~', '+', '=', '-': return true } return false } func mask(addr string) string { // strip -, ^ or ~ from start if isHostFlag(addr) { addr = addr[1:] } // split user and host s := strings.SplitN(addr, "@", 2) if len(s) != 2 { return "*!*" + addr } user, host := s[0], domainMask(s[1]) return "*!*" + user + "@" + host }