mirror of
https://github.com/Control-D-Inc/ctrld.git
synced 2026-07-04 01:07:49 +02:00
internal/clientinfo: ignoring localhost entry for hostsfile mapping
Otherwise, actual hostname will be overriden with "localhost", which is rather confusing/bad for UX.
This commit is contained in:
committed by
Cuong Manh Le
parent
77c1113ff7
commit
9d2ea15346
@@ -10,6 +10,12 @@ import (
|
|||||||
"github.com/Control-D-Inc/ctrld"
|
"github.com/Control-D-Inc/ctrld"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
const (
|
||||||
|
ipv4LocalhostName = "localhost"
|
||||||
|
ipv6LocalhostName = "ip6-localhost"
|
||||||
|
ipv6LoopbackName = "ip6-loopback"
|
||||||
|
)
|
||||||
|
|
||||||
// hostsFile provides client discovery functionality using system hosts file.
|
// hostsFile provides client discovery functionality using system hosts file.
|
||||||
type hostsFile struct {
|
type hostsFile struct {
|
||||||
watcher *fsnotify.Watcher
|
watcher *fsnotify.Watcher
|
||||||
@@ -80,7 +86,15 @@ func (hf *hostsFile) LookupHostnameByIP(ip string) string {
|
|||||||
hf.mu.Lock()
|
hf.mu.Lock()
|
||||||
defer hf.mu.Unlock()
|
defer hf.mu.Unlock()
|
||||||
if names := hf.m[ip]; len(names) > 0 {
|
if names := hf.m[ip]; len(names) > 0 {
|
||||||
return normalizeHostname(names[0])
|
isLoopback := ip == "127.0.0.1" || ip == "::1"
|
||||||
|
for _, hostname := range names {
|
||||||
|
name := normalizeHostname(hostname)
|
||||||
|
// Ignoring ipv4/ipv6 loopback entry.
|
||||||
|
if isLoopback && isLocalhostName(name) {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
return name
|
||||||
|
}
|
||||||
}
|
}
|
||||||
return ""
|
return ""
|
||||||
}
|
}
|
||||||
@@ -94,3 +108,13 @@ func (hf *hostsFile) LookupHostnameByMac(mac string) string {
|
|||||||
func (hf *hostsFile) String() string {
|
func (hf *hostsFile) String() string {
|
||||||
return "hosts"
|
return "hosts"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// isLocalhostName reports whether the given hostname represents localhost.
|
||||||
|
func isLocalhostName(hostname string) bool {
|
||||||
|
switch hostname {
|
||||||
|
case ipv4LocalhostName, ipv6LocalhostName, ipv6LoopbackName:
|
||||||
|
return true
|
||||||
|
default:
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|||||||
@@ -0,0 +1,33 @@
|
|||||||
|
package clientinfo
|
||||||
|
|
||||||
|
import (
|
||||||
|
"testing"
|
||||||
|
)
|
||||||
|
|
||||||
|
func Test_hostsFile_LookupHostnameByIP(t *testing.T) {
|
||||||
|
tests := []struct {
|
||||||
|
name string
|
||||||
|
ip string
|
||||||
|
hostnames []string
|
||||||
|
expectedHostname string
|
||||||
|
}{
|
||||||
|
{"ipv4 loopback", "127.0.0.1", []string{ipv4LocalhostName}, ""},
|
||||||
|
{"ipv6 loopback", "::1", []string{ipv6LocalhostName, ipv6LoopbackName}, ""},
|
||||||
|
{"non-localhost", "::1", []string{"foo"}, "foo"},
|
||||||
|
{"multiple hostnames", "::1", []string{ipv4LocalhostName, "foo"}, "foo"},
|
||||||
|
}
|
||||||
|
|
||||||
|
for _, tc := range tests {
|
||||||
|
tc := tc
|
||||||
|
t.Run(tc.name, func(t *testing.T) {
|
||||||
|
t.Parallel()
|
||||||
|
hf := &hostsFile{m: make(map[string][]string)}
|
||||||
|
hf.mu.Lock()
|
||||||
|
hf.m[tc.ip] = tc.hostnames
|
||||||
|
hf.mu.Unlock()
|
||||||
|
if got := hf.LookupHostnameByIP(tc.ip); got != tc.expectedHostname {
|
||||||
|
t.Errorf("unpexpected result, want: %q, got: %q", tc.expectedHostname, got)
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user