@@ -69,13 +69,14 @@ var privateUseDomains = []string{
69
69
// MDNS
70
70
".local" ,
71
71
72
- // RFC 6761: Users may assume that IPv4 and IPv6 address queries for localhost names will
73
- // always resolve to the respective IP loopback address
74
- ".localhost" ,
75
72
// RFC 6761: No central authority for .test names
76
73
".test" ,
77
74
}
78
75
76
+ // RFC 6761: Users may assume that IPv4 and IPv6 address queries for localhost names will
77
+ // always resolve to the respective IP loopback address
78
+ const localHostDomain = ".localhost"
79
+
79
80
func init () {
80
81
Private4 = parseCIDR (privateCIDR4 )
81
82
Private6 = parseCIDR (privateCIDR6 )
@@ -112,14 +113,18 @@ func IsPublicAddr(a ma.Multiaddr) bool {
112
113
case ma .P_DNS , ma .P_DNS4 , ma .P_DNS6 , ma .P_DNSADDR :
113
114
dnsAddr := c .Value ()
114
115
isPublic = true
116
+ if isSubdomain (dnsAddr , localHostDomain ) {
117
+ isPublic = false
118
+ return false
119
+ }
115
120
for _ , ud := range unResolvableDomains {
116
- if strings . HasSuffix (dnsAddr , ud ) {
121
+ if isSubdomain (dnsAddr , ud ) {
117
122
isPublic = false
118
123
return false
119
124
}
120
125
}
121
126
for _ , pd := range privateUseDomains {
122
- if strings . HasSuffix (dnsAddr , pd ) {
127
+ if isSubdomain (dnsAddr , pd ) {
123
128
isPublic = false
124
129
break
125
130
}
@@ -130,6 +135,13 @@ func IsPublicAddr(a ma.Multiaddr) bool {
130
135
return isPublic
131
136
}
132
137
138
+ // isSubdomain checks if child is sub domain of parent. It also returns true if child and parent are
139
+ // the same domain.
140
+ // Parent must have a "." prefix.
141
+ func isSubdomain (child , parent string ) bool {
142
+ return strings .HasSuffix (child , parent ) || child == parent [1 :]
143
+ }
144
+
133
145
// IsPrivateAddr returns true if the IP part of the mutiaddr is in a private network
134
146
func IsPrivateAddr (a ma.Multiaddr ) bool {
135
147
isPrivate := false
@@ -141,6 +153,13 @@ func IsPrivateAddr(a ma.Multiaddr) bool {
141
153
isPrivate = inAddrRange (net .IP (c .RawValue ()), Private4 )
142
154
case ma .P_IP6 :
143
155
isPrivate = inAddrRange (net .IP (c .RawValue ()), Private6 )
156
+ case ma .P_DNS , ma .P_DNS4 , ma .P_DNS6 , ma .P_DNSADDR :
157
+ dnsAddr := c .Value ()
158
+ if isSubdomain (dnsAddr , localHostDomain ) {
159
+ isPrivate = true
160
+ }
161
+ // We don't check for privateUseDomains because private use domains can
162
+ // resolve to public IP addresses
144
163
}
145
164
return false
146
165
})
0 commit comments