#2177 Added conversion of 'Hostname' to 'givenName' in a node with FQDN rules applied (#2198)

This commit is contained in:
hopleus 2024-10-15 19:33:03 +03:00 committed by GitHub
parent 52a3b54ba2
commit cc42fc394a
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
5 changed files with 64 additions and 0 deletions

View file

@ -20,6 +20,7 @@
- Improved compatibilty of built-in DERP server with clients connecting over WebSocket. - Improved compatibilty of built-in DERP server with clients connecting over WebSocket.
- Allow nodes to use SSH agent forwarding [#2145](https://github.com/juanfont/headscale/pull/2145) - Allow nodes to use SSH agent forwarding [#2145](https://github.com/juanfont/headscale/pull/2145)
- Fixed processing of fields in post request in MoveNode rpc [#2179](https://github.com/juanfont/headscale/pull/2179) - Fixed processing of fields in post request in MoveNode rpc [#2179](https://github.com/juanfont/headscale/pull/2179)
- Added conversion of 'Hostname' to 'givenName' in a node with FQDN rules applied [#2198](https://github.com/juanfont/headscale/pull/2198)
## 0.23.0 (2024-09-18) ## 0.23.0 (2024-09-18)

View file

@ -607,6 +607,7 @@ func enableRoutes(tx *gorm.DB,
} }
func generateGivenName(suppliedName string, randomSuffix bool) (string, error) { func generateGivenName(suppliedName string, randomSuffix bool) (string, error) {
suppliedName = util.ConvertWithFQDNRules(suppliedName)
if len(suppliedName) > util.LabelHostnameLength { if len(suppliedName) > util.LabelHostnameLength {
return "", types.ErrHostnameTooLong return "", types.ErrHostnameTooLong
} }

View file

@ -392,6 +392,15 @@ func TestHeadscale_generateGivenName(t *testing.T) {
want: regexp.MustCompile("^testnode$"), want: regexp.MustCompile("^testnode$"),
wantErr: false, wantErr: false,
}, },
{
name: "UPPERCASE node name generation",
args: args{
suppliedName: "TestNode",
randomSuffix: false,
},
want: regexp.MustCompile("^testnode$"),
wantErr: false,
},
{ {
name: "node name with 53 chars", name: "node name with 53 chars",
args: args{ args: args{

View file

@ -50,6 +50,13 @@ func CheckForFQDNRules(name string) error {
return nil return nil
} }
func ConvertWithFQDNRules(name string) string {
name = strings.ToLower(name)
name = invalidCharsInUserRegex.ReplaceAllString(name, "")
return name
}
// generateMagicDNSRootDomains generates a list of DNS entries to be included in `Routes` in `MapResponse`. // generateMagicDNSRootDomains generates a list of DNS entries to be included in `Routes` in `MapResponse`.
// This list of reverse DNS entries instructs the OS on what subnets and domains the Tailscale embedded DNS // This list of reverse DNS entries instructs the OS on what subnets and domains the Tailscale embedded DNS
// server (listening in 100.100.100.100 udp/53) should be used for. // server (listening in 100.100.100.100 udp/53) should be used for.

View file

@ -53,6 +53,52 @@ func TestCheckForFQDNRules(t *testing.T) {
} }
} }
func TestConvertWithFQDNRules(t *testing.T) {
tests := []struct {
name string
hostname string
dnsHostName string
}{
{
name: "User1.test",
hostname: "User1.Test",
dnsHostName: "user1.test",
},
{
name: "User'1$2.test",
hostname: "User'1$2.Test",
dnsHostName: "user12.test",
},
{
name: "User-^_12.local.test",
hostname: "User-^_12.local.Test",
dnsHostName: "user-12.local.test",
},
{
name: "User-MacBook-Pro",
hostname: "User-MacBook-Pro",
dnsHostName: "user-macbook-pro",
},
{
name: "User-Linux-Ubuntu/Fedora",
hostname: "User-Linux-Ubuntu/Fedora",
dnsHostName: "user-linux-ubuntufedora",
},
{
name: "User-[Space]123",
hostname: "User-[ ]123",
dnsHostName: "user-123",
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
fqdnHostName := ConvertWithFQDNRules(tt.hostname)
assert.Equal(t, tt.dnsHostName, fqdnHostName)
})
}
}
func TestMagicDNSRootDomains100(t *testing.T) { func TestMagicDNSRootDomains100(t *testing.T) {
domains := GenerateIPv4DNSRootDomain(netip.MustParsePrefix("100.64.0.0/10")) domains := GenerateIPv4DNSRootDomain(netip.MustParsePrefix("100.64.0.0/10"))