diff options
author | Arne Juul <arnej@yahooinc.com> | 2022-08-29 10:20:18 +0000 |
---|---|---|
committer | Arne Juul <arnej@yahooinc.com> | 2022-08-29 10:20:18 +0000 |
commit | a4ec2ec80e0d3dfaef66a582ea6e47a071de2378 (patch) | |
tree | 8c623dbd8586eed0cdc397fba9c829144223f939 /client | |
parent | 561b8daf9761088039b1b66a3bb897c1dd3fd7ef (diff) |
stricter validation
Diffstat (limited to 'client')
-rw-r--r-- | client/go/vespa/detect_hostname.go | 79 |
1 files changed, 48 insertions, 31 deletions
diff --git a/client/go/vespa/detect_hostname.go b/client/go/vespa/detect_hostname.go index 33e5ca21a8a..80f5df2c866 100644 --- a/client/go/vespa/detect_hostname.go +++ b/client/go/vespa/detect_hostname.go @@ -59,23 +59,37 @@ func FindOurHostname() (string, error) { return name, err } -func findOurHostnameFrom(name string) (string, error) { - ifAddrs, _ := net.InterfaceAddrs() - var checkIsMine = func(addr string) bool { - if len(ifAddrs) == 0 { +func validateHostname(name string) bool { + myIpAddresses := make(map[string]bool) + interfaceAddrs, _ := net.InterfaceAddrs() + for _, ifAddr := range interfaceAddrs { + // note: ifAddr.String() is typically "127.0.0.1/8" + if ipnet, ok := ifAddr.(*net.IPNet); ok { + myIpAddresses[ipnet.IP.String()] = true + } + } + ipAddrs, _ := net.LookupIP(name) + someGood := false + for _, addr := range ipAddrs { + if len(myIpAddresses) == 0 { // no validation possible, assume OK return true } - for _, ifAddr := range ifAddrs { - // note: ifAddr.String() is typically "127.0.0.1/8" - if ipnet, ok := ifAddr.(*net.IPNet); ok { - if ipnet.IP.String() == addr { - return true - } - } + if myIpAddresses[addr.String()] { + someGood = true + } else { + return false } - return false } + return someGood +} + +func findOurHostnameFrom(name string) (string, error) { + if strings.Contains(name, ".") && validateHostname(name) { + // it's all good + return name, nil + } + possibles := make([]string, 0, 5) if name != "" { ipAddrs, _ := net.LookupIP(name) for _, addr := range ipAddrs { @@ -83,36 +97,39 @@ func findOurHostnameFrom(name string) (string, error) { case addr.IsLoopback(): // skip case addr.To4() != nil || addr.To16() != nil: - if checkIsMine(addr.String()) { - reverseNames, _ := net.LookupAddr(addr.String()) - for _, reverse := range reverseNames { - if strings.HasPrefix(reverse, name) { - return reverse, nil - } - } - if len(reverseNames) > 0 { - reverse := reverseNames[0] - return reverse, nil - } - } + reverseNames, _ := net.LookupAddr(addr.String()) + possibles = append(possibles, reverseNames...) } } } - for _, ifAddr := range ifAddrs { + interfaceAddrs, _ := net.InterfaceAddrs() + for _, ifAddr := range interfaceAddrs { if ipnet, ok := ifAddr.(*net.IPNet); ok { ip := ipnet.IP if ip == nil || ip.IsLoopback() { continue } reverseNames, _ := net.LookupAddr(ip.String()) - if len(reverseNames) > 0 { - reverse := reverseNames[0] - return reverse, nil - } + possibles = append(possibles, reverseNames...) } } - if name != "" { - return name, fmt.Errorf("unvalidated hostname '%s'", name) + // look for valid possible starting with the given name + for _, poss := range possibles { + if strings.HasPrefix(poss, name+".") && validateHostname(poss) { + return poss, nil + } + } + // look for valid possible + for _, poss := range possibles { + if strings.Contains(poss, ".") && validateHostname(poss) { + return poss, nil + } + } + // look for any valid possible + for _, poss := range possibles { + if validateHostname(poss) { + return poss, nil + } } return "localhost", fmt.Errorf("fallback to localhost, os.Hostname '%s'", name) } |