@@ -67,36 +67,45 @@ func parseCIDR(cidrs []string) []*net.IPNet {
67
67
68
68
// IsPublicAddr retruns true if the IP part of the multiaddr is a publicly routable address
69
69
func IsPublicAddr (a ma.Multiaddr ) bool {
70
- ip , err := a .ValueForProtocol (ma .P_IP4 )
71
- if err == nil {
72
- return ! inAddrRange (ip , Private4 ) && ! inAddrRange (ip , Unroutable4 )
73
- }
74
-
75
- ip , err = a .ValueForProtocol (ma .P_IP6 )
76
- if err == nil {
77
- return ! inAddrRange (ip , Private6 ) && ! inAddrRange (ip , Unroutable6 )
78
- }
79
-
80
- return false
70
+ isPublic := false
71
+ ma .ForEach (a , func (c ma.Component ) bool {
72
+ switch c .Protocol ().Code {
73
+ case ma .P_IP6ZONE :
74
+ return true
75
+ default :
76
+ return false
77
+ case ma .P_IP4 :
78
+ ip := net .IP (c .RawValue ())
79
+ isPublic = ! inAddrRange (ip , Private4 ) && ! inAddrRange (ip , Unroutable4 )
80
+ case ma .P_IP6 :
81
+ ip := net .IP (c .RawValue ())
82
+ isPublic = ! inAddrRange (ip , Private6 ) && ! inAddrRange (ip , Unroutable6 )
83
+ }
84
+ return false
85
+ })
86
+ return isPublic
81
87
}
82
88
83
89
// IsPrivateAddr returns true if the IP part of the mutiaddr is in a private network
84
90
func IsPrivateAddr (a ma.Multiaddr ) bool {
85
- ip , err := a .ValueForProtocol (ma .P_IP4 )
86
- if err == nil {
87
- return inAddrRange (ip , Private4 )
88
- }
89
-
90
- ip , err = a .ValueForProtocol (ma .P_IP6 )
91
- if err == nil {
92
- return inAddrRange (ip , Private6 )
93
- }
94
-
95
- return false
91
+ isPrivate := false
92
+ ma .ForEach (a , func (c ma.Component ) bool {
93
+ switch c .Protocol ().Code {
94
+ case ma .P_IP6ZONE :
95
+ return true
96
+ default :
97
+ return false
98
+ case ma .P_IP4 :
99
+ isPrivate = inAddrRange (net .IP (c .RawValue ()), Private4 )
100
+ case ma .P_IP6 :
101
+ isPrivate = inAddrRange (net .IP (c .RawValue ()), Private6 )
102
+ }
103
+ return false
104
+ })
105
+ return isPrivate
96
106
}
97
107
98
- func inAddrRange (s string , ipnets []* net.IPNet ) bool {
99
- ip := net .ParseIP (s )
108
+ func inAddrRange (ip net.IP , ipnets []* net.IPNet ) bool {
100
109
for _ , ipnet := range ipnets {
101
110
if ipnet .Contains (ip ) {
102
111
return true
0 commit comments