local.go

 1package config
 2
 3import (
 4	"fmt"
 5	"net"
 6	"net/url"
 7)
 8
 9var lookupHostFn = net.LookupHost
10
11func 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
35func 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}