summaryrefslogtreecommitdiff
path: root/mask.go
diff options
context:
space:
mode:
Diffstat (limited to 'mask.go')
-rw-r--r--mask.go63
1 files changed, 63 insertions, 0 deletions
diff --git a/mask.go b/mask.go
new file mode 100644
index 0000000..14fb1b3
--- /dev/null
+++ b/mask.go
@@ -0,0 +1,63 @@
+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
+}