local.go (1034B)
1 package config 2 3 import ( 4 "fmt" 5 "net" 6 "net/url" 7 ) 8 9 var lookupHostFn = net.LookupHost 10 11 func isLoopbackHost(host string) (bool, error) { 12 ip := net.ParseIP(host) 13 if ip != nil { 14 return ip.IsLoopback(), nil 15 } 16 17 // Host is not an ip, perform lookup 18 addrs, err := lookupHostFn(host) 19 if err != nil { 20 return false, err 21 } 22 if len(addrs) == 0 { 23 return false, fmt.Errorf("no addrs found for host, %s", host) 24 } 25 26 for _, addr := range addrs { 27 if !net.ParseIP(addr).IsLoopback() { 28 return false, nil 29 } 30 } 31 32 return true, nil 33 } 34 35 func validateLocalURL(v string) error { 36 u, err := url.Parse(v) 37 if err != nil { 38 return err 39 } 40 41 host := u.Hostname() 42 if len(host) == 0 { 43 return fmt.Errorf("unable to parse host from local HTTP cred provider URL") 44 } else if isLoopback, err := isLoopbackHost(host); err != nil { 45 return fmt.Errorf("failed to resolve host %q, %v", host, err) 46 } else if !isLoopback { 47 return fmt.Errorf("invalid endpoint host, %q, only host resolving to loopback addresses are allowed", host) 48 } 49 50 return nil 51 }