test all known unroutable address ranges in IsPublicAddr

This commit is contained in:
vyzo 2018-10-16 18:10:30 +03:00 committed by Steven Allen
parent 2945cfc2e6
commit c2b139aab4

View File

@ -7,7 +7,6 @@ import (
) )
// Private4 and Private6 are well-known private networks // Private4 and Private6 are well-known private networks
// These are exported to allow overriding for testing
var Private4, Private6 []*net.IPNet var Private4, Private6 []*net.IPNet
var privateCIDR4 = []string{ var privateCIDR4 = []string{
// localhost // localhost
@ -29,12 +28,32 @@ var privateCIDR6 = []string{
"fe80::/10", "fe80::/10",
} }
func init() { // Unroutable4 and Unroutable6 are well known unroutable address ranges
Private4 = parsePrivateCIDR(privateCIDR4) var Unroutable4, Unroutable6 []*net.IPNet
Private6 = parsePrivateCIDR(privateCIDR6) var unroutableCIDR4 = []string{
"0.0.0.0/8",
"192.0.0.0/26",
"192.0.2.0/24",
"192.88.99.0/24",
"198.18.0.0/15",
"198.51.100.0/24",
"203.0.113.0/24",
"224.0.0.0/4",
"240.0.0.0/4",
"255.255.255.255/32",
}
var unroutableCIDR6 = []string{
"ff00::/8",
} }
func parsePrivateCIDR(cidrs []string) []*net.IPNet { func init() {
Private4 = parseCIDR(privateCIDR4)
Private6 = parseCIDR(privateCIDR6)
Unroutable4 = parseCIDR(unroutableCIDR4)
Unroutable6 = parseCIDR(unroutableCIDR6)
}
func parseCIDR(cidrs []string) []*net.IPNet {
ipnets := make([]*net.IPNet, len(cidrs)) ipnets := make([]*net.IPNet, len(cidrs))
for i, cidr := range cidrs { for i, cidr := range cidrs {
_, ipnet, err := net.ParseCIDR(cidr) _, ipnet, err := net.ParseCIDR(cidr)
@ -46,22 +65,22 @@ func parsePrivateCIDR(cidrs []string) []*net.IPNet {
return ipnets return ipnets
} }
// IsPublicAddr retruns true if the IP part of the multiaddr is not in a private network // IsPublicAddr retruns true if the IP part of the multiaddr is a publically routable address
func IsPublicAddr(a ma.Multiaddr) bool { func IsPublicAddr(a ma.Multiaddr) bool {
ip, err := a.ValueForProtocol(ma.P_IP4) ip, err := a.ValueForProtocol(ma.P_IP4)
if err == nil { if err == nil {
return !inAddrRange(ip, Private4) return !inAddrRange(ip, Private4) && !inAddrRange(ip, Unroutable4)
} }
ip, err = a.ValueForProtocol(ma.P_IP6) ip, err = a.ValueForProtocol(ma.P_IP6)
if err == nil { if err == nil {
return !inAddrRange(ip, Private6) return !inAddrRange(ip, Private6) && !inAddrRange(ip, Unroutable6)
} }
return false return false
} }
// IsPrivateAddr returns true if the IP part of the mutiadr is in a private network // IsPrivateAddr returns true if the IP part of the mutiaddr is in a private network
func IsPrivateAddr(a ma.Multiaddr) bool { func IsPrivateAddr(a ma.Multiaddr) bool {
ip, err := a.ValueForProtocol(ma.P_IP4) ip, err := a.ValueForProtocol(ma.P_IP4)
if err == nil { if err == nil {