in workhorse/internal/transport/transport.go [147:225]
func validateIPAddress(allowLocalhost bool, allowedEndpoints []string) func(network, address string, c syscall.RawConn) error {
return func(_, address string, _ syscall.RawConn) error {
host, _, _ := net.SplitHostPort(address)
ipAddress := net.ParseIP(host)
for _, allowedEndpoint := range allowedEndpoints {
var hostname string
switch {
case strings.Contains(allowedEndpoint, "://"):
// It's already a URL
uri := helper.URLMustParse(allowedEndpoint)
hostname = uri.Hostname()
case strings.Contains(allowedEndpoint, ":"):
// It's a host:port format
hostPart, _, err := net.SplitHostPort(allowedEndpoint)
if err != nil {
return fmt.Errorf("invalid host:port format: %v", err)
}
hostname = hostPart
default:
// It's a hostname
hostname = allowedEndpoint
}
// Check if it's an IP address itself
if ip := net.ParseIP(hostname); ip != nil {
if ip.Equal(ipAddress) {
return nil
}
continue // Skip DNS lookup for IP addresses
}
// Perform DNS lookup
ips, err := lookupIPFunc(hostname)
if err != nil {
return fmt.Errorf("error resolving IP address for %s: %v", hostname, err)
}
for _, ip := range ips {
if ip.Equal(ipAddress) {
return nil
}
}
}
if ipAddress.Equal(net.IPv4bcast) {
return &AllowedIPError{IP: ipAddress, Message: "limited broadcast IPs are not allowed"}
}
for _, network := range privateNetworks {
if network.Contains(ipAddress) {
return &AllowedIPError{IP: ipAddress, Message: "private IPs are not allowed"}
}
}
if !allowLocalhost {
for _, network := range loopbackNetworks {
if network.Contains(ipAddress) {
return &AllowedIPError{IP: ipAddress, Message: "loopback IPs are not allowed"}
}
}
for _, network := range unspecifiedNetworks {
if network.Contains(ipAddress) {
return &AllowedIPError{IP: ipAddress, Message: "unspecified IPs are not allowed"}
}
}
}
if ipAddress.IsLinkLocalMulticast() || ipAddress.IsLinkLocalUnicast() {
return &AllowedIPError{IP: ipAddress, Message: "link-local unicast and multicast IPs are not allowed"}
}
return nil
}
}