local.go 1.0 KB

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