mirror of
				https://github.com/juanfont/headscale.git
				synced 2025-11-04 01:51:04 +01:00 
			
		
		
		
	Port dns to net/netip
This commit is contained in:
		
							parent
							
								
									efb12f208c
								
							
						
					
					
						commit
						71410cb6da
					
				
							
								
								
									
										21
									
								
								dns.go
									
									
									
									
									
								
							
							
						
						
									
										21
									
								
								dns.go
									
									
									
									
									
								
							@ -2,10 +2,11 @@ package headscale
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
import (
 | 
					import (
 | 
				
			||||||
	"fmt"
 | 
						"fmt"
 | 
				
			||||||
 | 
						"net/netip"
 | 
				
			||||||
	"strings"
 | 
						"strings"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	mapset "github.com/deckarep/golang-set/v2"
 | 
						mapset "github.com/deckarep/golang-set/v2"
 | 
				
			||||||
	"inet.af/netaddr"
 | 
						"go4.org/netipx"
 | 
				
			||||||
	"tailscale.com/tailcfg"
 | 
						"tailscale.com/tailcfg"
 | 
				
			||||||
	"tailscale.com/util/dnsname"
 | 
						"tailscale.com/util/dnsname"
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
@ -39,11 +40,11 @@ const (
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
// From the netmask we can find out the wildcard bits (the bits that are not set in the netmask).
 | 
					// From the netmask we can find out the wildcard bits (the bits that are not set in the netmask).
 | 
				
			||||||
// This allows us to then calculate the subnets included in the subsequent class block and generate the entries.
 | 
					// This allows us to then calculate the subnets included in the subsequent class block and generate the entries.
 | 
				
			||||||
func generateMagicDNSRootDomains(ipPrefixes []netaddr.IPPrefix) []dnsname.FQDN {
 | 
					func generateMagicDNSRootDomains(ipPrefixes []netip.Prefix) []dnsname.FQDN {
 | 
				
			||||||
	fqdns := make([]dnsname.FQDN, 0, len(ipPrefixes))
 | 
						fqdns := make([]dnsname.FQDN, 0, len(ipPrefixes))
 | 
				
			||||||
	for _, ipPrefix := range ipPrefixes {
 | 
						for _, ipPrefix := range ipPrefixes {
 | 
				
			||||||
		var generateDNSRoot func(netaddr.IPPrefix) []dnsname.FQDN
 | 
							var generateDNSRoot func(netip.Prefix) []dnsname.FQDN
 | 
				
			||||||
		switch ipPrefix.IP().BitLen() {
 | 
							switch ipPrefix.Addr().BitLen() {
 | 
				
			||||||
		case ipv4AddressLength:
 | 
							case ipv4AddressLength:
 | 
				
			||||||
			generateDNSRoot = generateIPv4DNSRootDomain
 | 
								generateDNSRoot = generateIPv4DNSRootDomain
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -54,7 +55,7 @@ func generateMagicDNSRootDomains(ipPrefixes []netaddr.IPPrefix) []dnsname.FQDN {
 | 
				
			|||||||
			panic(
 | 
								panic(
 | 
				
			||||||
				fmt.Sprintf(
 | 
									fmt.Sprintf(
 | 
				
			||||||
					"unsupported IP version with address length %d",
 | 
										"unsupported IP version with address length %d",
 | 
				
			||||||
					ipPrefix.IP().BitLen(),
 | 
										ipPrefix.Addr().BitLen(),
 | 
				
			||||||
				),
 | 
									),
 | 
				
			||||||
			)
 | 
								)
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
@ -65,9 +66,9 @@ func generateMagicDNSRootDomains(ipPrefixes []netaddr.IPPrefix) []dnsname.FQDN {
 | 
				
			|||||||
	return fqdns
 | 
						return fqdns
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func generateIPv4DNSRootDomain(ipPrefix netaddr.IPPrefix) []dnsname.FQDN {
 | 
					func generateIPv4DNSRootDomain(ipPrefix netip.Prefix) []dnsname.FQDN {
 | 
				
			||||||
	// Conversion to the std lib net.IPnet, a bit easier to operate
 | 
						// Conversion to the std lib net.IPnet, a bit easier to operate
 | 
				
			||||||
	netRange := ipPrefix.IPNet()
 | 
						netRange := netipx.PrefixIPNet(ipPrefix)
 | 
				
			||||||
	maskBits, _ := netRange.Mask.Size()
 | 
						maskBits, _ := netRange.Mask.Size()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// lastOctet is the last IP byte covered by the mask
 | 
						// lastOctet is the last IP byte covered by the mask
 | 
				
			||||||
@ -101,11 +102,11 @@ func generateIPv4DNSRootDomain(ipPrefix netaddr.IPPrefix) []dnsname.FQDN {
 | 
				
			|||||||
	return fqdns
 | 
						return fqdns
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func generateIPv6DNSRootDomain(ipPrefix netaddr.IPPrefix) []dnsname.FQDN {
 | 
					func generateIPv6DNSRootDomain(ipPrefix netip.Prefix) []dnsname.FQDN {
 | 
				
			||||||
	const nibbleLen = 4
 | 
						const nibbleLen = 4
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	maskBits, _ := ipPrefix.IPNet().Mask.Size()
 | 
						maskBits, _ := netipx.PrefixIPNet(ipPrefix).Mask.Size()
 | 
				
			||||||
	expanded := ipPrefix.IP().StringExpanded()
 | 
						expanded := ipPrefix.Addr().StringExpanded()
 | 
				
			||||||
	nibbleStr := strings.Map(func(r rune) rune {
 | 
						nibbleStr := strings.Map(func(r rune) rune {
 | 
				
			||||||
		if r == ':' {
 | 
							if r == ':' {
 | 
				
			||||||
			return -1
 | 
								return -1
 | 
				
			||||||
 | 
				
			|||||||
							
								
								
									
										34
									
								
								dns_test.go
									
									
									
									
									
								
							
							
						
						
									
										34
									
								
								dns_test.go
									
									
									
									
									
								
							@ -2,16 +2,16 @@ package headscale
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
import (
 | 
					import (
 | 
				
			||||||
	"fmt"
 | 
						"fmt"
 | 
				
			||||||
 | 
						"net/netip"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	"gopkg.in/check.v1"
 | 
						"gopkg.in/check.v1"
 | 
				
			||||||
	"inet.af/netaddr"
 | 
					 | 
				
			||||||
	"tailscale.com/tailcfg"
 | 
						"tailscale.com/tailcfg"
 | 
				
			||||||
	"tailscale.com/types/dnstype"
 | 
						"tailscale.com/types/dnstype"
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func (s *Suite) TestMagicDNSRootDomains100(c *check.C) {
 | 
					func (s *Suite) TestMagicDNSRootDomains100(c *check.C) {
 | 
				
			||||||
	prefixes := []netaddr.IPPrefix{
 | 
						prefixes := []netip.Prefix{
 | 
				
			||||||
		netaddr.MustParseIPPrefix("100.64.0.0/10"),
 | 
							netip.MustParsePrefix("100.64.0.0/10"),
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	domains := generateMagicDNSRootDomains(prefixes)
 | 
						domains := generateMagicDNSRootDomains(prefixes)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -47,8 +47,8 @@ func (s *Suite) TestMagicDNSRootDomains100(c *check.C) {
 | 
				
			|||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func (s *Suite) TestMagicDNSRootDomains172(c *check.C) {
 | 
					func (s *Suite) TestMagicDNSRootDomains172(c *check.C) {
 | 
				
			||||||
	prefixes := []netaddr.IPPrefix{
 | 
						prefixes := []netip.Prefix{
 | 
				
			||||||
		netaddr.MustParseIPPrefix("172.16.0.0/16"),
 | 
							netip.MustParsePrefix("172.16.0.0/16"),
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	domains := generateMagicDNSRootDomains(prefixes)
 | 
						domains := generateMagicDNSRootDomains(prefixes)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -75,8 +75,8 @@ func (s *Suite) TestMagicDNSRootDomains172(c *check.C) {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
// Happens when netmask is a multiple of 4 bits (sounds likely).
 | 
					// Happens when netmask is a multiple of 4 bits (sounds likely).
 | 
				
			||||||
func (s *Suite) TestMagicDNSRootDomainsIPv6Single(c *check.C) {
 | 
					func (s *Suite) TestMagicDNSRootDomainsIPv6Single(c *check.C) {
 | 
				
			||||||
	prefixes := []netaddr.IPPrefix{
 | 
						prefixes := []netip.Prefix{
 | 
				
			||||||
		netaddr.MustParseIPPrefix("fd7a:115c:a1e0::/48"),
 | 
							netip.MustParsePrefix("fd7a:115c:a1e0::/48"),
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	domains := generateMagicDNSRootDomains(prefixes)
 | 
						domains := generateMagicDNSRootDomains(prefixes)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -89,8 +89,8 @@ func (s *Suite) TestMagicDNSRootDomainsIPv6Single(c *check.C) {
 | 
				
			|||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func (s *Suite) TestMagicDNSRootDomainsIPv6SingleMultiple(c *check.C) {
 | 
					func (s *Suite) TestMagicDNSRootDomainsIPv6SingleMultiple(c *check.C) {
 | 
				
			||||||
	prefixes := []netaddr.IPPrefix{
 | 
						prefixes := []netip.Prefix{
 | 
				
			||||||
		netaddr.MustParseIPPrefix("fd7a:115c:a1e0::/50"),
 | 
							netip.MustParsePrefix("fd7a:115c:a1e0::/50"),
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	domains := generateMagicDNSRootDomains(prefixes)
 | 
						domains := generateMagicDNSRootDomains(prefixes)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -165,7 +165,7 @@ func (s *Suite) TestDNSConfigMapResponseWithMagicDNS(c *check.C) {
 | 
				
			|||||||
		NamespaceID:    namespaceShared1.ID,
 | 
							NamespaceID:    namespaceShared1.ID,
 | 
				
			||||||
		Namespace:      *namespaceShared1,
 | 
							Namespace:      *namespaceShared1,
 | 
				
			||||||
		RegisterMethod: RegisterMethodAuthKey,
 | 
							RegisterMethod: RegisterMethodAuthKey,
 | 
				
			||||||
		IPAddresses:    []netaddr.IP{netaddr.MustParseIP("100.64.0.1")},
 | 
							IPAddresses:    []netip.Addr{netip.MustParseAddr("100.64.0.1")},
 | 
				
			||||||
		AuthKeyID:      uint(preAuthKeyInShared1.ID),
 | 
							AuthKeyID:      uint(preAuthKeyInShared1.ID),
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	app.db.Save(machineInShared1)
 | 
						app.db.Save(machineInShared1)
 | 
				
			||||||
@ -182,7 +182,7 @@ func (s *Suite) TestDNSConfigMapResponseWithMagicDNS(c *check.C) {
 | 
				
			|||||||
		NamespaceID:    namespaceShared2.ID,
 | 
							NamespaceID:    namespaceShared2.ID,
 | 
				
			||||||
		Namespace:      *namespaceShared2,
 | 
							Namespace:      *namespaceShared2,
 | 
				
			||||||
		RegisterMethod: RegisterMethodAuthKey,
 | 
							RegisterMethod: RegisterMethodAuthKey,
 | 
				
			||||||
		IPAddresses:    []netaddr.IP{netaddr.MustParseIP("100.64.0.2")},
 | 
							IPAddresses:    []netip.Addr{netip.MustParseAddr("100.64.0.2")},
 | 
				
			||||||
		AuthKeyID:      uint(preAuthKeyInShared2.ID),
 | 
							AuthKeyID:      uint(preAuthKeyInShared2.ID),
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	app.db.Save(machineInShared2)
 | 
						app.db.Save(machineInShared2)
 | 
				
			||||||
@ -199,7 +199,7 @@ func (s *Suite) TestDNSConfigMapResponseWithMagicDNS(c *check.C) {
 | 
				
			|||||||
		NamespaceID:    namespaceShared3.ID,
 | 
							NamespaceID:    namespaceShared3.ID,
 | 
				
			||||||
		Namespace:      *namespaceShared3,
 | 
							Namespace:      *namespaceShared3,
 | 
				
			||||||
		RegisterMethod: RegisterMethodAuthKey,
 | 
							RegisterMethod: RegisterMethodAuthKey,
 | 
				
			||||||
		IPAddresses:    []netaddr.IP{netaddr.MustParseIP("100.64.0.3")},
 | 
							IPAddresses:    []netip.Addr{netip.MustParseAddr("100.64.0.3")},
 | 
				
			||||||
		AuthKeyID:      uint(preAuthKeyInShared3.ID),
 | 
							AuthKeyID:      uint(preAuthKeyInShared3.ID),
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	app.db.Save(machineInShared3)
 | 
						app.db.Save(machineInShared3)
 | 
				
			||||||
@ -216,7 +216,7 @@ func (s *Suite) TestDNSConfigMapResponseWithMagicDNS(c *check.C) {
 | 
				
			|||||||
		NamespaceID:    namespaceShared1.ID,
 | 
							NamespaceID:    namespaceShared1.ID,
 | 
				
			||||||
		Namespace:      *namespaceShared1,
 | 
							Namespace:      *namespaceShared1,
 | 
				
			||||||
		RegisterMethod: RegisterMethodAuthKey,
 | 
							RegisterMethod: RegisterMethodAuthKey,
 | 
				
			||||||
		IPAddresses:    []netaddr.IP{netaddr.MustParseIP("100.64.0.4")},
 | 
							IPAddresses:    []netip.Addr{netip.MustParseAddr("100.64.0.4")},
 | 
				
			||||||
		AuthKeyID:      uint(PreAuthKey2InShared1.ID),
 | 
							AuthKeyID:      uint(PreAuthKey2InShared1.ID),
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	app.db.Save(machine2InShared1)
 | 
						app.db.Save(machine2InShared1)
 | 
				
			||||||
@ -308,7 +308,7 @@ func (s *Suite) TestDNSConfigMapResponseWithoutMagicDNS(c *check.C) {
 | 
				
			|||||||
		NamespaceID:    namespaceShared1.ID,
 | 
							NamespaceID:    namespaceShared1.ID,
 | 
				
			||||||
		Namespace:      *namespaceShared1,
 | 
							Namespace:      *namespaceShared1,
 | 
				
			||||||
		RegisterMethod: RegisterMethodAuthKey,
 | 
							RegisterMethod: RegisterMethodAuthKey,
 | 
				
			||||||
		IPAddresses:    []netaddr.IP{netaddr.MustParseIP("100.64.0.1")},
 | 
							IPAddresses:    []netip.Addr{netip.MustParseAddr("100.64.0.1")},
 | 
				
			||||||
		AuthKeyID:      uint(preAuthKeyInShared1.ID),
 | 
							AuthKeyID:      uint(preAuthKeyInShared1.ID),
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	app.db.Save(machineInShared1)
 | 
						app.db.Save(machineInShared1)
 | 
				
			||||||
@ -325,7 +325,7 @@ func (s *Suite) TestDNSConfigMapResponseWithoutMagicDNS(c *check.C) {
 | 
				
			|||||||
		NamespaceID:    namespaceShared2.ID,
 | 
							NamespaceID:    namespaceShared2.ID,
 | 
				
			||||||
		Namespace:      *namespaceShared2,
 | 
							Namespace:      *namespaceShared2,
 | 
				
			||||||
		RegisterMethod: RegisterMethodAuthKey,
 | 
							RegisterMethod: RegisterMethodAuthKey,
 | 
				
			||||||
		IPAddresses:    []netaddr.IP{netaddr.MustParseIP("100.64.0.2")},
 | 
							IPAddresses:    []netip.Addr{netip.MustParseAddr("100.64.0.2")},
 | 
				
			||||||
		AuthKeyID:      uint(preAuthKeyInShared2.ID),
 | 
							AuthKeyID:      uint(preAuthKeyInShared2.ID),
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	app.db.Save(machineInShared2)
 | 
						app.db.Save(machineInShared2)
 | 
				
			||||||
@ -342,7 +342,7 @@ func (s *Suite) TestDNSConfigMapResponseWithoutMagicDNS(c *check.C) {
 | 
				
			|||||||
		NamespaceID:    namespaceShared3.ID,
 | 
							NamespaceID:    namespaceShared3.ID,
 | 
				
			||||||
		Namespace:      *namespaceShared3,
 | 
							Namespace:      *namespaceShared3,
 | 
				
			||||||
		RegisterMethod: RegisterMethodAuthKey,
 | 
							RegisterMethod: RegisterMethodAuthKey,
 | 
				
			||||||
		IPAddresses:    []netaddr.IP{netaddr.MustParseIP("100.64.0.3")},
 | 
							IPAddresses:    []netip.Addr{netip.MustParseAddr("100.64.0.3")},
 | 
				
			||||||
		AuthKeyID:      uint(preAuthKeyInShared3.ID),
 | 
							AuthKeyID:      uint(preAuthKeyInShared3.ID),
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	app.db.Save(machineInShared3)
 | 
						app.db.Save(machineInShared3)
 | 
				
			||||||
@ -359,7 +359,7 @@ func (s *Suite) TestDNSConfigMapResponseWithoutMagicDNS(c *check.C) {
 | 
				
			|||||||
		NamespaceID:    namespaceShared1.ID,
 | 
							NamespaceID:    namespaceShared1.ID,
 | 
				
			||||||
		Namespace:      *namespaceShared1,
 | 
							Namespace:      *namespaceShared1,
 | 
				
			||||||
		RegisterMethod: RegisterMethodAuthKey,
 | 
							RegisterMethod: RegisterMethodAuthKey,
 | 
				
			||||||
		IPAddresses:    []netaddr.IP{netaddr.MustParseIP("100.64.0.4")},
 | 
							IPAddresses:    []netip.Addr{netip.MustParseAddr("100.64.0.4")},
 | 
				
			||||||
		AuthKeyID:      uint(preAuthKey2InShared1.ID),
 | 
							AuthKeyID:      uint(preAuthKey2InShared1.ID),
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	app.db.Save(machine2InShared1)
 | 
						app.db.Save(machine2InShared1)
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user