mirror of
				https://github.com/tailscale/tailscale.git
				synced 2025-10-31 00:01:40 +01:00 
			
		
		
		
	This commit truncates any additional information (mainly hostnames) that's passed to controlD via DOH URL in DoHIPsOfBase. This change is to make sure only resolverID is passed to controlDv6Gen but not the additional information. Updates: #7946 Signed-off-by: KevinLiang10 <37811973+KevinLiang10@users.noreply.github.com>
		
			
				
	
	
		
			154 lines
		
	
	
		
			3.4 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			154 lines
		
	
	
		
			3.4 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
| // Copyright (c) Tailscale Inc & AUTHORS
 | |
| // SPDX-License-Identifier: BSD-3-Clause
 | |
| 
 | |
| package publicdns
 | |
| 
 | |
| import (
 | |
| 	"net/netip"
 | |
| 	"reflect"
 | |
| 	"testing"
 | |
| )
 | |
| 
 | |
| func TestInit(t *testing.T) {
 | |
| 	for _, baseKey := range KnownDoHPrefixes() {
 | |
| 		baseSet := DoHIPsOfBase(baseKey)
 | |
| 		for _, addr := range baseSet {
 | |
| 			back, only, ok := DoHEndpointFromIP(addr)
 | |
| 			if !ok {
 | |
| 				t.Errorf("DoHEndpointFromIP(%v) not mapped back to %v", addr, baseKey)
 | |
| 				continue
 | |
| 			}
 | |
| 			if only {
 | |
| 				t.Errorf("unexpected DoH only bit set for %v", addr)
 | |
| 			}
 | |
| 			if back != baseKey {
 | |
| 				t.Errorf("Expected %v to map to %s, got %s", addr, baseKey, back)
 | |
| 			}
 | |
| 		}
 | |
| 	}
 | |
| }
 | |
| 
 | |
| func TestDoHV6(t *testing.T) {
 | |
| 	tests := []struct {
 | |
| 		in      string
 | |
| 		firstIP netip.Addr
 | |
| 		want    bool
 | |
| 	}{
 | |
| 		{"https://cloudflare-dns.com/dns-query", netip.MustParseAddr("2606:4700:4700::1111"), true},
 | |
| 		{"https://dns.google/dns-query", netip.MustParseAddr("2001:4860:4860::8888"), true},
 | |
| 		{"bogus", netip.Addr{}, false},
 | |
| 	}
 | |
| 	for _, test := range tests {
 | |
| 		t.Run(test.in, func(t *testing.T) {
 | |
| 			ip, ok := DoHV6(test.in)
 | |
| 			if ok != test.want || ip != test.firstIP {
 | |
| 				t.Errorf("DohV6 got (%v: IPv6 %v) for %v, want (%v: IPv6 %v)", ip, ok, test.in, test.firstIP, test.want)
 | |
| 			}
 | |
| 		})
 | |
| 	}
 | |
| }
 | |
| 
 | |
| func TestDoHIPsOfBase(t *testing.T) {
 | |
| 	ips := func(s ...string) (ret []netip.Addr) {
 | |
| 		for _, ip := range s {
 | |
| 			ret = append(ret, netip.MustParseAddr(ip))
 | |
| 		}
 | |
| 		return
 | |
| 	}
 | |
| 	tests := []struct {
 | |
| 		base string
 | |
| 		want []netip.Addr
 | |
| 	}{
 | |
| 		{
 | |
| 			base: "https://cloudflare-dns.com/dns-query",
 | |
| 			want: ips("1.1.1.1", "1.0.0.1", "2606:4700:4700::1111", "2606:4700:4700::1001"),
 | |
| 		},
 | |
| 		{
 | |
| 			base: "https://dns.nextdns.io/",
 | |
| 			want: ips(),
 | |
| 		},
 | |
| 		{
 | |
| 			base: "https://dns.nextdns.io/ff",
 | |
| 			want: ips(
 | |
| 				"45.90.28.0",
 | |
| 				"45.90.30.0",
 | |
| 				"2a07:a8c0::ff",
 | |
| 				"2a07:a8c1::ff",
 | |
| 			),
 | |
| 		},
 | |
| 		{
 | |
| 			base: "https://dns.nextdns.io/c3a884",
 | |
| 			want: ips(
 | |
| 				"45.90.28.0",
 | |
| 				"45.90.30.0",
 | |
| 				"2a07:a8c0::c3:a884",
 | |
| 				"2a07:a8c1::c3:a884",
 | |
| 			),
 | |
| 		},
 | |
| 		{
 | |
| 			base: "https://dns.nextdns.io/112233445566778899aabbcc",
 | |
| 			want: ips(
 | |
| 				"45.90.28.0",
 | |
| 				"45.90.30.0",
 | |
| 				"2a07:a8c0:1122:3344:5566:7788:99aa:bbcc",
 | |
| 				"2a07:a8c1:1122:3344:5566:7788:99aa:bbcc",
 | |
| 			),
 | |
| 		},
 | |
| 		{
 | |
| 			base: "https://dns.nextdns.io/112233445566778899aabbccdd",
 | |
| 			want: ips(), // nothing; profile length is over 12 bytes
 | |
| 		},
 | |
| 		{
 | |
| 			base: "https://dns.nextdns.io/c3a884/with/more/stuff",
 | |
| 			want: ips(
 | |
| 				"45.90.28.0",
 | |
| 				"45.90.30.0",
 | |
| 				"2a07:a8c0::c3:a884",
 | |
| 				"2a07:a8c1::c3:a884",
 | |
| 			),
 | |
| 		},
 | |
| 		{
 | |
| 			base: "https://dns.nextdns.io/c3a884?with=query¶ms",
 | |
| 			want: ips(
 | |
| 				"45.90.28.0",
 | |
| 				"45.90.30.0",
 | |
| 				"2a07:a8c0::c3:a884",
 | |
| 				"2a07:a8c1::c3:a884",
 | |
| 			),
 | |
| 		},
 | |
| 		{
 | |
| 			base: "https://dns.controld.com/hyq3ipr2ct",
 | |
| 			want: ips(
 | |
| 				"76.76.2.22",
 | |
| 				"76.76.10.22",
 | |
| 				"2606:1a40:0:6:7b5b:5949:35ad:0",
 | |
| 				"2606:1a40:1:6:7b5b:5949:35ad:0",
 | |
| 			),
 | |
| 		},
 | |
| 		{
 | |
| 			base: "https://dns.controld.com/112233445566778899aabbcc",
 | |
| 			want: ips(
 | |
| 				"76.76.2.22",
 | |
| 				"76.76.10.22",
 | |
| 				"2606:1a40:0:ffff:ffff:ffff:ffff:0",
 | |
| 				"2606:1a40:1:ffff:ffff:ffff:ffff:0",
 | |
| 			),
 | |
| 		},
 | |
| 		{
 | |
| 			base: "https://dns.controld.com/hyq3ipr2ct/test-host-name",
 | |
| 			want: ips(
 | |
| 				"76.76.2.22",
 | |
| 				"76.76.10.22",
 | |
| 				"2606:1a40:0:6:7b5b:5949:35ad:0",
 | |
| 				"2606:1a40:1:6:7b5b:5949:35ad:0",
 | |
| 			),
 | |
| 		},
 | |
| 	}
 | |
| 	for _, tt := range tests {
 | |
| 		got := DoHIPsOfBase(tt.base)
 | |
| 		if !reflect.DeepEqual(got, tt.want) {
 | |
| 			t.Errorf("DoHIPsOfBase(%q) = %v; want %v", tt.base, got, tt.want)
 | |
| 		}
 | |
| 	}
 | |
| }
 |