Tobias Begalke před 8 roky
revize
129d3b963f
2 změnil soubory, kde provedl 74 přidání a 0 odebrání
  1. 30 0
      ip.go
  2. 44 0
      ip_test.go

+ 30 - 0
ip.go

@@ -0,0 +1,30 @@
+package ip
+
+import "net"
+
+var PRIVATE_NETWORKS = [...]string{"10.0.0.0/8", "172.16.0.0/12", "192.168.0.0/16", "fd00::/8"}
+
+type IP struct {
+	IP               net.IP
+	private_networks []*net.IPNet
+}
+
+func NewIP() *IP {
+	var ipnet *net.IPNet
+	privnets := make([]*net.IPNet, len(PRIVATE_NETWORKS), len(PRIVATE_NETWORKS))
+	for i, n := range PRIVATE_NETWORKS {
+		_, ipnet, _ = net.ParseCIDR(n)
+		privnets[i] = ipnet
+	}
+
+	return &IP{private_networks: privnets}
+}
+
+func (i *IP) IsPrivate(ip net.IP) bool {
+	for _, net := range i.private_networks {
+		if net.Contains(ip) {
+			return true
+		}
+	}
+	return false
+}

+ 44 - 0
ip_test.go

@@ -0,0 +1,44 @@
+package ip
+
+import (
+	"net"
+	"testing"
+)
+
+func TestIPInCidr(t *testing.T) {
+	ip := NewIP()
+
+	HandleIP(t, ip, "123.2.3.5", false)
+
+	HandleIP(t, ip, "10.10.0.0", true)
+	HandleIP(t, ip, "10.10.10.10", true)
+	HandleIP(t, ip, "10.255.255.255", true)
+	HandleIP(t, ip, "11.0.0.0", false)
+	HandleIP(t, ip, "10.10.10.432", false)
+
+	HandleIP(t, ip, "192.167.255.255", false)
+	HandleIP(t, ip, "192.168.0.0", true)
+	HandleIP(t, ip, "192.168.122.1", true)
+	HandleIP(t, ip, "192.168.255.255", true)
+	HandleIP(t, ip, "192.169.0.0", false)
+
+	HandleIP(t, ip, "172.15.255.255", false)
+	HandleIP(t, ip, "172.16.0.0", true)
+	HandleIP(t, ip, "172.16.1.7", true)
+	HandleIP(t, ip, "172.31.255.255", true)
+	HandleIP(t, ip, "172.15.255.255", false)
+
+	HandleIP(t, ip, "fcff:ffff:ffff:ffff:ffff:ffff:ffff:ffff", false)
+	HandleIP(t, ip, "fd00::1", true)
+	HandleIP(t, ip, "fd02::1", true)
+	HandleIP(t, ip, "fdff::1", true)
+	HandleIP(t, ip, "fe00::1", false)
+
+}
+
+func HandleIP(t *testing.T, ip *IP, addr string, assert bool) {
+	res := ip.IsPrivate(net.ParseIP(addr))
+	if res != assert {
+		t.Errorf("Assertion (have: %s, should be %s) failed on IP %s", res, assert, addr)
+	}
+}