diff --git a/go.mod b/go.mod index 6f3bae230..6bb98898c 100644 --- a/go.mod +++ b/go.mod @@ -18,7 +18,7 @@ require ( github.com/go-chi/chi/v5 v5.3.0 github.com/go-chi/metrics v0.1.1 github.com/go-gormigrate/gormigrate/v2 v2.1.6 - github.com/go-json-experiment/json v0.0.0-20260601182631-00ed12fed2a6 + github.com/go-json-experiment/json v0.0.0-20260623181947-01eb4420fa68 github.com/google/go-cmp v0.7.0 github.com/hashicorp/golang-lru/v2 v2.0.7 github.com/jagottsicher/termcolor v1.0.2 @@ -44,7 +44,7 @@ require ( go4.org/netipx v0.0.0-20231129151722-fdeea329fbba golang.org/x/crypto v0.54.0 golang.org/x/exp v0.0.0-20260603202125-055de637280b - golang.org/x/net v0.56.0 + golang.org/x/net v0.57.1-0.20260729233039-99c3b0a8f463 golang.org/x/oauth2 v0.36.0 golang.org/x/sync v0.22.0 gopkg.in/yaml.v3 v3.0.1 @@ -70,7 +70,7 @@ require ( // go get modernc.org/libc@v1.55.3 modernc.org/sqlite@v1.33.1 modernc.org/sqlite v1.52.0 pgregory.net/rapid v1.3.0 - tailscale.com v1.103.0-pre + tailscale.com v1.103.0-pre.0.20260819232550-0e84b4a3a0a0 tailscale.com/client/tailscale/v2 v2.9.0 zombiezen.com/go/postgrestest v1.0.1 ) @@ -207,7 +207,7 @@ require ( github.com/tailscale/peercred v0.0.0-20250107143737-35a0c7bd7edc // indirect github.com/tailscale/setec v0.0.0-20260310221408-dcd97e42f251 // indirect github.com/tailscale/web-client-prebuilt v0.0.0-20251127225136-f19339b67368 // indirect - github.com/tailscale/wireguard-go v0.0.0-20260715223240-2e01ba5b00f0 // indirect + github.com/tailscale/wireguard-go v0.0.0-20260813211458-aa425f19bcbf // indirect github.com/toqueteos/webbrowser v1.2.0 // indirect github.com/x448/float16 v0.8.4 // indirect github.com/xeipuuv/gojsonpointer v0.0.0-20190905194746-02993c407bfb // indirect @@ -245,7 +245,7 @@ require ( // go.mod file for the gvisor.dev/gvisor version: // https://github.com/tailscale/tailscale/blob/main/go.mod gvisor.dev/gvisor v0.0.0-20260224225140-573d5e7127a8 // indirect - k8s.io/client-go v0.34.0 // indirect + k8s.io/client-go v0.35.3 // indirect // NOTE: keep in lockstep with modernc.org/sqlite; see the // upgrade note in the direct require block above. diff --git a/go.sum b/go.sum index 04eec22a5..ed54afc81 100644 --- a/go.sum +++ b/go.sum @@ -18,8 +18,8 @@ fyne.io/systray v1.11.1-0.20250812065214-4856ac3adc3c h1:km4PIleGtbbF1oxmFQuO93C fyne.io/systray v1.11.1-0.20250812065214-4856ac3adc3c/go.mod h1:RVwqP9nYMo7h5zViCBHri2FgjXF7H2cub7MAq4NSoLs= github.com/Azure/go-ansiterm v0.0.0-20250102033503-faa5f7b0171c h1:udKWzYgxTojEKWjV8V+WSxDXJ4NFATAsZjh8iIbsQIg= github.com/Azure/go-ansiterm v0.0.0-20250102033503-faa5f7b0171c/go.mod h1:xomTg63KZ2rFqZQzSB4Vz2SUXa1BpHTVz9L5PTmPC4E= -github.com/BurntSushi/toml v1.5.0 h1:W5quZX/G/csjUnuI8SUYlsHs9M38FC7znL0lIO+DvMg= -github.com/BurntSushi/toml v1.5.0/go.mod h1:ukJfTF/6rtPPRCnwkur4qwRxa8vTRFBF0uk2lLoLwho= +github.com/BurntSushi/toml v1.6.0 h1:dRaEfpa2VI55EwlIW72hMRHdWouJeRF7TPYhI+AUQjk= +github.com/BurntSushi/toml v1.6.0/go.mod h1:ukJfTF/6rtPPRCnwkur4qwRxa8vTRFBF0uk2lLoLwho= github.com/Kodeworks/golang-image-ico v0.0.0-20141118225523-73f0f4cfade9 h1:1ltqoej5GtaWF8jaiA49HwsZD459jqm9YFz9ZtMFpQA= github.com/Kodeworks/golang-image-ico v0.0.0-20141118225523-73f0f4cfade9/go.mod h1:7uhhqiBaR4CpN0k9rMjOtjpcfGd6DG2m04zQxKnWQ0I= github.com/MarvinJWendt/testza v0.5.2 h1:53KDo64C1z/h/d/stCYCPY69bt/OSwjq5KpFNwi+zB4= @@ -45,8 +45,8 @@ github.com/atotto/clipboard v0.1.4 h1:EH0zSVneZPSuFR11BlR9YppQTVDbh5+16AmcJi4g1z github.com/atotto/clipboard v0.1.4/go.mod h1:ZY9tmq7sm5xIbd9bOK4onWV4S6X0u6GY7Vn0Yu86PYI= github.com/aws/aws-sdk-go-v2 v1.42.1 h1:9eOTgu1z/dVtYpNZ3/8/XbbaX0x/BqE3HUzAzs6K0ek= github.com/aws/aws-sdk-go-v2 v1.42.1/go.mod h1:5pKeft2eJj+gElQ38Jqg4ibCqh+/AK33/0X3hip7IjM= -github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.7.4 h1:489krEF9xIGkOaaX3CE/Be2uWjiXrkCH6gUX+bZA/BU= -github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.7.4/go.mod h1:IOAPF6oT9KCsceNTvvYMNHy0+kMF8akOjeDvPENWxp4= +github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.7.8 h1:eBMB84YGghSocM7PsjmmPffTa+1FBUeNvGvFou6V/4o= +github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.7.8/go.mod h1:lyw7GFp3qENLh7kwzf7iMzAxDn+NzjXEAGjKS2UOKqI= github.com/aws/aws-sdk-go-v2/config v1.32.17 h1:FpL4/758/diKwqbytU0prpuiu60fgXKUWCpDJtApclU= github.com/aws/aws-sdk-go-v2/config v1.32.17/go.mod h1:OXqUMzgXytfoF9JaKkhrOYsyh72t9G+MJH8mMRaexOE= github.com/aws/aws-sdk-go-v2/credentials v1.19.16 h1:r3RJBuU7X9ibt8RHbMjWE6y60QbKBiII6wSrXnapxSU= @@ -61,14 +61,14 @@ github.com/aws/aws-sdk-go-v2/internal/v4a v1.4.24 h1:OQqn11BtaYv1WLUowvcA30MpzIu github.com/aws/aws-sdk-go-v2/internal/v4a v1.4.24/go.mod h1:X5ZJyfwVrWA96GzPmUCWFQaEARPR7gCrpq2E92PJwAE= github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.13.13 h1:mbRIur/BiHK6SKPjoBIXSE/hJ6g6JGRLuxQy1jGjlN4= github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.13.13/go.mod h1:ITg9em2KbJx1s0y4aqRX5OYWG6HBZ5TVR//OdpEZ2CQ= -github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.9.7 h1:DIBqIrJ7hv+e4CmIk2z3pyKT+3B6qVMgRsawHiR3qso= -github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.9.7/go.mod h1:vLm00xmBke75UmpNvOcZQ/Q30ZFjbczeLFqGx5urmGo= +github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.9.13 h1:JRaIgADQS/U6uXDqlPiefP32yXTda7Kqfx+LgspooZM= +github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.9.13/go.mod h1:CEuVn5WqOMilYl+tbccq8+N2ieCy0gVn3OtRb0vBNNM= github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.13.30 h1:/Z5jmNrKsSD7EmDjzAPsm/3L9IuOkzaynklJZ1qX7S4= github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.13.30/go.mod h1:lEzEZnOosE7zi8Z6royW1cFJTD9fpab4Ul1SBrllewk= -github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.19.16 h1:NSbvS17MlI2lurYgXnCOLvCFX38sBW4eiVER7+kkgsU= -github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.19.16/go.mod h1:SwT8Tmqd4sA6G1qaGdzWCJN99bUmPGHfRwwq3G5Qb+A= -github.com/aws/aws-sdk-go-v2/service/s3 v1.93.2 h1:U3ygWUhCpiSPYSHOrRhb3gOl9T5Y3kB8k5Vjs//57bE= -github.com/aws/aws-sdk-go-v2/service/s3 v1.93.2/go.mod h1:79S2BdqCJpScXZA2y+cpZuocWsjGjJINyXnOsf5DTz8= +github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.19.21 h1:ZlvrNcHSFFWURB8avufQq9gFsheUgjVD9536obIknfM= +github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.19.21/go.mod h1:cv3TNhVrssKR0O/xxLJVRfd2oazSnZnkUeTf6ctUwfQ= +github.com/aws/aws-sdk-go-v2/service/s3 v1.97.3 h1:HwxWTbTrIHm5qY+CAEur0s/figc3qwvLWsNkF4RPToo= +github.com/aws/aws-sdk-go-v2/service/s3 v1.97.3/go.mod h1:uoA43SdFwacedBfSgfFSjjCvYe8aYBS7EnU5GZ/YKMM= github.com/aws/aws-sdk-go-v2/service/signin v1.0.11 h1:TdJ+HdzOBhU8+iVAOGUTU63VXopcumCOF1paFulHWZc= github.com/aws/aws-sdk-go-v2/service/signin v1.0.11/go.mod h1:R82ZRExE/nheo0N+T8zHPcLRTcH8MGsnR3BiVGX0TwI= github.com/aws/aws-sdk-go-v2/service/ssm v1.45.0 h1:IOdss+igJDFdic9w3WKwxGCmHqUxydvIhJOm9LJ32Dk= @@ -105,8 +105,8 @@ github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5P github.com/chzyer/readline v1.5.1/go.mod h1:Eh+b79XXUwfKfcPLepksvw2tcLE/Ct21YObkaSkeBlk= github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= github.com/chzyer/test v1.0.0/go.mod h1:2JlltgoNkt4TW/z9V/IzDdFaMTM2JPIi26O1pF38GC8= -github.com/cilium/ebpf v0.17.3 h1:FnP4r16PWYSE4ux6zN+//jMcW4nMVRvuTLVTvCjyyjg= -github.com/cilium/ebpf v0.17.3/go.mod h1:G5EDHij8yiLzaqn0WjyfJHvRa+3aDlReIaLVRMvOyJk= +github.com/cilium/ebpf v0.22.0 h1:v2ktp0roffpMOj2MMf3idtCQZOsAoC4BJbAJN+ke2bY= +github.com/cilium/ebpf v0.22.0/go.mod h1:CDzZbe2hC5JjlDC+CY3KFCzlYwN4gbxppYM+Z10bQt4= github.com/clipperhouse/uax29/v2 v2.7.0 h1:+gs4oBZ2gPfVrKPthwbMzWZDaAFPGYK72F0NJv2v7Vk= github.com/clipperhouse/uax29/v2 v2.7.0/go.mod h1:EFJ2TJMRUaplDxHKj1qAEhCtQPW2tJSwu5BF98AuoVM= github.com/coder/websocket v1.8.14 h1:9L0p0iKiNOibykf283eHkKUHHrpG7f65OE3BhhO7v9g= @@ -199,8 +199,8 @@ github.com/go-jose/go-jose/v3 v3.0.5 h1:BLLJWbC4nMZOfuPVxoZIxeYsn6Nl2r1fITaJ78UQ github.com/go-jose/go-jose/v3 v3.0.5/go.mod h1:5b+7YgP7ZICgJDBdfjZaIt+H/9L9T/YQrVfLAMboGkQ= github.com/go-jose/go-jose/v4 v4.1.4 h1:moDMcTHmvE6Groj34emNPLs/qtYXRVcd6S7NHbHz3kA= github.com/go-jose/go-jose/v4 v4.1.4/go.mod h1:x4oUasVrzR7071A4TnHLGSPpNOm2a21K9Kf04k1rs08= -github.com/go-json-experiment/json v0.0.0-20260601182631-00ed12fed2a6 h1:nxP4pPoyqOAgX8lYDFCfl3DyKeXErCvSvhcyzwGV9CE= -github.com/go-json-experiment/json v0.0.0-20260601182631-00ed12fed2a6/go.mod h1:tphK2c80bpPhMOI4v6bIc2xWywPfbqi1Z06+RcrMkDg= +github.com/go-json-experiment/json v0.0.0-20260623181947-01eb4420fa68 h1:KZaTBSyshWX3MP5jukJcNSuXDQTO+rNpt0J564dX/eg= +github.com/go-json-experiment/json v0.0.0-20260623181947-01eb4420fa68/go.mod h1:tphK2c80bpPhMOI4v6bIc2xWywPfbqi1Z06+RcrMkDg= github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= github.com/go-logr/logr v1.4.3 h1:CjnDlHq8ikf6E492q6eKboGOC0T8CDaOvkHCIg8idEI= github.com/go-logr/logr v1.4.3/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= @@ -484,8 +484,8 @@ github.com/tailscale/web-client-prebuilt v0.0.0-20251127225136-f19339b67368 h1:0 github.com/tailscale/web-client-prebuilt v0.0.0-20251127225136-f19339b67368/go.mod h1:agQPE6y6ldqCOui2gkIh7ZMztTkIQKH049tv8siLuNQ= github.com/tailscale/wf v0.0.0-20240214030419-6fbb0a674ee6 h1:l10Gi6w9jxvinoiq15g8OToDdASBni4CyJOdHY1Hr8M= github.com/tailscale/wf v0.0.0-20240214030419-6fbb0a674ee6/go.mod h1:ZXRML051h7o4OcI0d3AaILDIad/Xw0IkXaHM17dic1Y= -github.com/tailscale/wireguard-go v0.0.0-20260715223240-2e01ba5b00f0 h1:CnIEL2n7Xql6Ux1k+Vu5S5ubDHCT/kxFgkKCY8FjefU= -github.com/tailscale/wireguard-go v0.0.0-20260715223240-2e01ba5b00f0/go.mod h1:6SerzcvHWQchKO2BfNdmquA77CHSECZuFl+D9fp4RnI= +github.com/tailscale/wireguard-go v0.0.0-20260813211458-aa425f19bcbf h1:TQTeMPbY+rI4jMtp2p1kPTzBlv8yloP4fy6nb5l+D38= +github.com/tailscale/wireguard-go v0.0.0-20260813211458-aa425f19bcbf/go.mod h1:6SerzcvHWQchKO2BfNdmquA77CHSECZuFl+D9fp4RnI= github.com/tailscale/xnet v0.0.0-20240729143630-8497ac4dab2e h1:zOGKqN5D5hHhiYUp091JqK7DPCqSARyUfduhGUY8Bek= github.com/tailscale/xnet v0.0.0-20240729143630-8497ac4dab2e/go.mod h1:orPd6JZXXRyuDusYilywte7k094d7dycXXU5YnWsrwg= github.com/tc-hib/winres v0.2.1 h1:YDE0FiP0VmtRaDn7+aaChp1KiF4owBiJa5l964l5ujA= @@ -566,8 +566,8 @@ golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg= -golang.org/x/net v0.56.0 h1:Rw8j/hFzGvJUZwNBXnAtf5sVDVt+65SK2C7IxCxZt5o= -golang.org/x/net v0.56.0/go.mod h1:D3Ku6r+V6JROoZK144D2XfMHFcMq/0zSfLelVTCFKec= +golang.org/x/net v0.57.1-0.20260729233039-99c3b0a8f463 h1:56+vNxUDjzdwAJjglL/DMnp31nd8UeytlPRLbZfz55Q= +golang.org/x/net v0.57.1-0.20260729233039-99c3b0a8f463/go.mod h1:KpXc8iv+r3XplLAG/f7Jsf9RPszJzdR0f58q9vGOuEU= golang.org/x/oauth2 v0.36.0 h1:peZ/1z27fi9hUOFCAZaHyrpWG5lwe0RJEEEeH0ThlIs= golang.org/x/oauth2 v0.36.0/go.mod h1:YDBUJMTkDnJS+A4BP4eZBjCqtokkg1hODuPjwiGPO7Q= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= @@ -646,12 +646,12 @@ gotest.tools/v3 v3.5.2 h1:7koQfIKdy+I8UTetycgUqXWSDwpgv193Ka+qRsmBY8Q= gotest.tools/v3 v3.5.2/go.mod h1:LtdLGcnqToBH83WByAAi/wiwSFCArdFIUV/xxN4pcjA= gvisor.dev/gvisor v0.0.0-20260224225140-573d5e7127a8 h1:Zy8IV/+FMLxy6j6p87vk/vQGKcdnbprwjTxc8UiUtsA= gvisor.dev/gvisor v0.0.0-20260224225140-573d5e7127a8/go.mod h1:QkHjoMIBaYtpVufgwv3keYAbln78mBoCuShZrPrer1Q= -honnef.co/go/tools v0.7.0 h1:w6WUp1VbkqPEgLz4rkBzH/CSU6HkoqNLp6GstyTx3lU= -honnef.co/go/tools v0.7.0/go.mod h1:pm29oPxeP3P82ISxZDgIYeOaf9ta6Pi0EWvCFoLG2vc= +honnef.co/go/tools v0.8.0-rc.1 h1:wqMm2kjcEXMOr+6yau+pdKqJKe6l2N1aKPkpini+Kzk= +honnef.co/go/tools v0.8.0-rc.1/go.mod h1:XA+OnlRA9EDh/ukGvXMNSZNKGwFQJ+5dER0ioUkOxks= howett.net/plist v1.0.0 h1:7CrbWYbPPO/PyNy38b2EB/+gYbjCe2DXBxgtOOZbSQM= howett.net/plist v1.0.0/go.mod h1:lqaXoTrLY4hg8tnEzNru53gicrbv7rrk+2xJA/7hw9g= -k8s.io/client-go v0.34.0 h1:YoWv5r7bsBfb0Hs2jh8SOvFbKzzxyNo0nSb0zC19KZo= -k8s.io/client-go v0.34.0/go.mod h1:ozgMnEKXkRjeMvBZdV1AijMHLTh3pbACPvK7zFR+QQY= +k8s.io/client-go v0.35.3 h1:s1lZbpN4uI6IxeTM2cpdtrwHcSOBML1ODNTCCfsP1pg= +k8s.io/client-go v0.35.3/go.mod h1:RzoXkc0mzpWIDvBrRnD+VlfXP+lRzqQjCmKtiwZ8Q9c= modernc.org/cc/v4 v4.28.2 h1:3tQ0lf2ADtoby2EtSP+J7IE2SHwEJdP8ioR59wx7XpY= modernc.org/cc/v4 v4.28.2/go.mod h1:OnovgIhbbMXMu1aISnJ0wvVD1KnW+cAUJkIrAWh+kVI= modernc.org/ccgo/v4 v4.34.0 h1:yRLPFZieg532OT4rp4JFNIVcquwalMX26G95WQDqwCQ= @@ -686,8 +686,8 @@ sigs.k8s.io/yaml v1.6.0 h1:G8fkbMSAFqgEFgh4b1wmtzDnioxFCUgTZhlbj5P9QYs= sigs.k8s.io/yaml v1.6.0/go.mod h1:796bPqUfzR/0jLAl6XjHl3Ck7MiyVv8dbTdyT3/pMf4= software.sslmate.com/src/go-pkcs12 v0.4.0 h1:H2g08FrTvSFKUj+D309j1DPfk5APnIdAQAB8aEykJ5k= software.sslmate.com/src/go-pkcs12 v0.4.0/go.mod h1:Qiz0EyvDRJjjxGyUQa2cCNZn/wMyzrRJ/qcDXOQazLI= -tailscale.com v1.103.0-pre h1:1Ntl/O0Gu5ZUXK9uhfv4RPBdqJEt17rsLPqfp8qPGUk= -tailscale.com v1.103.0-pre/go.mod h1:NdndXfkSklVPbRUZMAzzRuDNaR5B+YWGbAyE1HpSQZg= +tailscale.com v1.103.0-pre.0.20260819232550-0e84b4a3a0a0 h1:nIHx5ElZ6YmM4ExbfLygId3BmQwbV7PuI00nuSuDYSY= +tailscale.com v1.103.0-pre.0.20260819232550-0e84b4a3a0a0/go.mod h1:dTIBg+L0r0+A3BGQpR6I1WF87NMLZDS8L05BqNvSnN0= tailscale.com/client/tailscale/v2 v2.9.0 h1:zBZIIeIYXL42qvvile7d29O2DKSr3AfNc2gzd1JCf2o= tailscale.com/client/tailscale/v2 v2.9.0/go.mod h1:FGjvGT3ThHelqo0gfdK3IN3k1dwNbRzYbQh2XO3C47U= zombiezen.com/go/postgrestest v1.0.1 h1:aXoADQAJmZDU3+xilYVut0pHhgc0sF8ZspPW9gFNwP4= diff --git a/hscontrol/derp/derp.go b/hscontrol/derp/derp.go index beeb66ada..c7c2c5ad5 100644 --- a/hscontrol/derp/derp.go +++ b/hscontrol/derp/derp.go @@ -74,7 +74,7 @@ func loadDERPMapFromURL(addr url.URL) (*tailcfg.DERPMap, error) { func mergeDERPMaps(derpMaps []*tailcfg.DERPMap) *tailcfg.DERPMap { result := tailcfg.DERPMap{ OmitDefaultRegions: false, - Regions: map[int]*tailcfg.DERPRegion{}, + Regions: map[tailcfg.DERPRegionID]*tailcfg.DERPRegion{}, } for _, derpMap := range derpMaps { @@ -129,7 +129,7 @@ func shuffleDERPMap(dm *tailcfg.DERPMap) { // Collect region IDs and sort them to ensure deterministic iteration order. // Map iteration order is non-deterministic in Go, which would cause the // shuffle to be non-deterministic even with a fixed seed. - ids := make([]int, 0, len(dm.Regions)) + ids := make([]tailcfg.DERPRegionID, 0, len(dm.Regions)) for id := range dm.Regions { ids = append(ids, id) } diff --git a/hscontrol/derp/derp_merge_test.go b/hscontrol/derp/derp_merge_test.go index e1ac41200..330bcf59b 100644 --- a/hscontrol/derp/derp_merge_test.go +++ b/hscontrol/derp/derp_merge_test.go @@ -12,7 +12,7 @@ import ( // cannot mutate a shared or previously served map. func TestMergeDERPMapsClonesRegions(t *testing.T) { src := &tailcfg.DERPMap{ - Regions: map[int]*tailcfg.DERPRegion{ + Regions: map[tailcfg.DERPRegionID]*tailcfg.DERPRegion{ 1: {RegionID: 1, Nodes: []*tailcfg.DERPNode{{Name: "a"}, {Name: "b"}}}, }, } diff --git a/hscontrol/derp/derp_test.go b/hscontrol/derp/derp_test.go index 445c10447..fb0423b2f 100644 --- a/hscontrol/derp/derp_test.go +++ b/hscontrol/derp/derp_test.go @@ -19,7 +19,7 @@ func TestShuffleDERPMapDeterministic(t *testing.T) { name: "single region with 4 nodes", baseDomain: "test1.example.com", derpMap: &tailcfg.DERPMap{ - Regions: map[int]*tailcfg.DERPRegion{ + Regions: map[tailcfg.DERPRegionID]*tailcfg.DERPRegion{ 1: { RegionID: 1, RegionCode: "nyc", @@ -34,7 +34,7 @@ func TestShuffleDERPMapDeterministic(t *testing.T) { }, }, expected: &tailcfg.DERPMap{ - Regions: map[int]*tailcfg.DERPRegion{ + Regions: map[tailcfg.DERPRegionID]*tailcfg.DERPRegion{ 1: { RegionID: 1, RegionCode: "nyc", @@ -53,7 +53,7 @@ func TestShuffleDERPMapDeterministic(t *testing.T) { name: "multiple regions with nodes", baseDomain: "test2.example.com", derpMap: &tailcfg.DERPMap{ - Regions: map[int]*tailcfg.DERPRegion{ + Regions: map[tailcfg.DERPRegionID]*tailcfg.DERPRegion{ 10: { RegionID: 10, RegionCode: "sea", @@ -77,7 +77,7 @@ func TestShuffleDERPMapDeterministic(t *testing.T) { }, }, expected: &tailcfg.DERPMap{ - Regions: map[int]*tailcfg.DERPRegion{ + Regions: map[tailcfg.DERPRegionID]*tailcfg.DERPRegion{ 10: { RegionID: 10, RegionCode: "sea", @@ -105,7 +105,7 @@ func TestShuffleDERPMapDeterministic(t *testing.T) { name: "large region with many nodes", baseDomain: "test3.example.com", derpMap: &tailcfg.DERPMap{ - Regions: map[int]*tailcfg.DERPRegion{ + Regions: map[tailcfg.DERPRegionID]*tailcfg.DERPRegion{ 4: { RegionID: 4, RegionCode: "fra", @@ -120,7 +120,7 @@ func TestShuffleDERPMapDeterministic(t *testing.T) { }, }, expected: &tailcfg.DERPMap{ - Regions: map[int]*tailcfg.DERPRegion{ + Regions: map[tailcfg.DERPRegionID]*tailcfg.DERPRegion{ 4: { RegionID: 4, RegionCode: "fra", @@ -139,7 +139,7 @@ func TestShuffleDERPMapDeterministic(t *testing.T) { name: "same region different base domain", baseDomain: "different.example.com", derpMap: &tailcfg.DERPMap{ - Regions: map[int]*tailcfg.DERPRegion{ + Regions: map[tailcfg.DERPRegionID]*tailcfg.DERPRegion{ 4: { RegionID: 4, RegionCode: "fra", @@ -154,7 +154,7 @@ func TestShuffleDERPMapDeterministic(t *testing.T) { }, }, expected: &tailcfg.DERPMap{ - Regions: map[int]*tailcfg.DERPRegion{ + Regions: map[tailcfg.DERPRegionID]*tailcfg.DERPRegion{ 4: { RegionID: 4, RegionCode: "fra", @@ -173,7 +173,7 @@ func TestShuffleDERPMapDeterministic(t *testing.T) { name: "same dataset with another base domain", baseDomain: "another.example.com", derpMap: &tailcfg.DERPMap{ - Regions: map[int]*tailcfg.DERPRegion{ + Regions: map[tailcfg.DERPRegionID]*tailcfg.DERPRegion{ 4: { RegionID: 4, RegionCode: "fra", @@ -188,7 +188,7 @@ func TestShuffleDERPMapDeterministic(t *testing.T) { }, }, expected: &tailcfg.DERPMap{ - Regions: map[int]*tailcfg.DERPRegion{ + Regions: map[tailcfg.DERPRegionID]*tailcfg.DERPRegion{ 4: { RegionID: 4, RegionCode: "fra", @@ -207,7 +207,7 @@ func TestShuffleDERPMapDeterministic(t *testing.T) { name: "same dataset with yet another base domain", baseDomain: "yetanother.example.com", derpMap: &tailcfg.DERPMap{ - Regions: map[int]*tailcfg.DERPRegion{ + Regions: map[tailcfg.DERPRegionID]*tailcfg.DERPRegion{ 4: { RegionID: 4, RegionCode: "fra", @@ -222,7 +222,7 @@ func TestShuffleDERPMapDeterministic(t *testing.T) { }, }, expected: &tailcfg.DERPMap{ - Regions: map[int]*tailcfg.DERPRegion{ + Regions: map[tailcfg.DERPRegionID]*tailcfg.DERPRegion{ 4: { RegionID: 4, RegionCode: "fra", @@ -269,13 +269,13 @@ func TestShuffleDERPMapEdgeCases(t *testing.T) { { name: "empty derp map", derpMap: &tailcfg.DERPMap{ - Regions: map[int]*tailcfg.DERPRegion{}, + Regions: map[tailcfg.DERPRegionID]*tailcfg.DERPRegion{}, }, }, { name: "region with no nodes", derpMap: &tailcfg.DERPMap{ - Regions: map[int]*tailcfg.DERPRegion{ + Regions: map[tailcfg.DERPRegionID]*tailcfg.DERPRegion{ 1: { RegionID: 1, RegionCode: "empty", @@ -288,7 +288,7 @@ func TestShuffleDERPMapEdgeCases(t *testing.T) { { name: "region with single node", derpMap: &tailcfg.DERPMap{ - Regions: map[int]*tailcfg.DERPRegion{ + Regions: map[tailcfg.DERPRegionID]*tailcfg.DERPRegion{ 1: { RegionID: 1, RegionCode: "single", @@ -314,7 +314,7 @@ func TestShuffleDERPMapWithoutBaseDomain(t *testing.T) { resetDerpRandomForTesting() derpMap := &tailcfg.DERPMap{ - Regions: map[int]*tailcfg.DERPRegion{ + Regions: map[tailcfg.DERPRegionID]*tailcfg.DERPRegion{ 1: { RegionID: 1, RegionCode: "test", diff --git a/hscontrol/derp/server/derp_server.go b/hscontrol/derp/server/derp_server.go index b4129d060..f75a085e3 100644 --- a/hscontrol/derp/server/derp_server.go +++ b/hscontrol/derp/server/derp_server.go @@ -114,7 +114,7 @@ func (d *DERPServer) GenerateRegion() (tailcfg.DERPRegion, error) { RegionName: d.cfg.ServerRegionName, Nodes: []*tailcfg.DERPNode{ { - Name: strconv.Itoa(d.cfg.ServerRegionID), + Name: d.cfg.ServerRegionID.String(), RegionID: d.cfg.ServerRegionID, HostName: host, DERPPort: port, diff --git a/hscontrol/mapper/batcher_test.go b/hscontrol/mapper/batcher_test.go index 2e36d5aa0..5350b064a 100644 --- a/hscontrol/mapper/batcher_test.go +++ b/hscontrol/mapper/batcher_test.go @@ -188,7 +188,7 @@ func setupBatcherWithTestData( DERP: types.DERPConfig{ ServerEnabled: false, DERPMap: &tailcfg.DERPMap{ - Regions: map[int]*tailcfg.DERPRegion{ + Regions: map[tailcfg.DERPRegionID]*tailcfg.DERPRegion{ 999: { RegionID: 999, }, @@ -348,7 +348,7 @@ func assertDERPMapResponse(t *testing.T, resp *tailcfg.MapResponse) { assert.NotNil(t, resp.DERPMap, "DERPMap should not be nil in response") assert.Len(t, resp.DERPMap.Regions, 1, "Expected exactly one DERP region in response") - assert.Equal(t, 999, resp.DERPMap.Regions[999].RegionID, "Expected DERP region ID to be 999") + assert.Equal(t, tailcfg.DERPRegionID(999), resp.DERPMap.Regions[999].RegionID, "Expected DERP region ID to be 999") } func assertOnlineMapResponse(t *testing.T, resp *tailcfg.MapResponse, expected bool) { diff --git a/hscontrol/mapper/initialmap_storm_test.go b/hscontrol/mapper/initialmap_storm_test.go index 877a8d97b..698ee1da3 100644 --- a/hscontrol/mapper/initialmap_storm_test.go +++ b/hscontrol/mapper/initialmap_storm_test.go @@ -49,7 +49,7 @@ func setupStormBatcher(tb testing.TB, nodeCount, workers int, policy string) (*T DERP: types.DERPConfig{ ServerEnabled: false, DERPMap: &tailcfg.DERPMap{ - Regions: map[int]*tailcfg.DERPRegion{999: {RegionID: 999}}, + Regions: map[tailcfg.DERPRegionID]*tailcfg.DERPRegion{999: {RegionID: 999}}, }, }, Tuning: types.Tuning{ diff --git a/hscontrol/mapper/mapper_test.go b/hscontrol/mapper/mapper_test.go index 9b19c9498..fbc9a1425 100644 --- a/hscontrol/mapper/mapper_test.go +++ b/hscontrol/mapper/mapper_test.go @@ -223,7 +223,7 @@ func TestBuildFromChangeFiltersPeerPatchesByVisibility(t *testing.T) { Policy: types.PolicyConfig{Mode: types.PolicyModeDB}, DERP: types.DERPConfig{ DERPMap: &tailcfg.DERPMap{ - Regions: map[int]*tailcfg.DERPRegion{999: {RegionID: 999}}, + Regions: map[tailcfg.DERPRegionID]*tailcfg.DERPRegion{999: {RegionID: 999}}, }, }, Tuning: types.Tuning{ @@ -309,7 +309,7 @@ func TestBuildFromChangeFiltersUserProfilesByVisibility(t *testing.T) { Policy: types.PolicyConfig{Mode: types.PolicyModeDB}, DERP: types.DERPConfig{ DERPMap: &tailcfg.DERPMap{ - Regions: map[int]*tailcfg.DERPRegion{999: {RegionID: 999}}, + Regions: map[tailcfg.DERPRegionID]*tailcfg.DERPRegion{999: {RegionID: 999}}, }, }, Tuning: types.Tuning{ @@ -381,7 +381,7 @@ func TestBuildFromChangeVisibilityMatchesFullMap(t *testing.T) { Policy: types.PolicyConfig{Mode: types.PolicyModeDB}, DERP: types.DERPConfig{ DERPMap: &tailcfg.DERPMap{ - Regions: map[int]*tailcfg.DERPRegion{999: {RegionID: 999}}, + Regions: map[tailcfg.DERPRegionID]*tailcfg.DERPRegion{999: {RegionID: 999}}, }, }, Tuning: types.Tuning{ @@ -574,7 +574,7 @@ func TestFullMapResponseSurvivesPeerWithInvalidName(t *testing.T) { Policy: types.PolicyConfig{Mode: types.PolicyModeDB}, DERP: types.DERPConfig{ DERPMap: &tailcfg.DERPMap{ - Regions: map[int]*tailcfg.DERPRegion{999: {RegionID: 999}}, + Regions: map[tailcfg.DERPRegionID]*tailcfg.DERPRegion{999: {RegionID: 999}}, }, }, Tuning: types.Tuning{ diff --git a/hscontrol/servertest/server.go b/hscontrol/servertest/server.go index 9601694cc..c80314fdb 100644 --- a/hscontrol/servertest/server.go +++ b/hscontrol/servertest/server.go @@ -154,7 +154,7 @@ func NewServer(tb testing.TB, opts ...ServerOption) *TestServer { // Set a minimal DERP map so MapResponse generation works. app.GetState().SetDERPMap(&tailcfg.DERPMap{ - Regions: map[int]*tailcfg.DERPRegion{ + Regions: map[tailcfg.DERPRegionID]*tailcfg.DERPRegion{ 900: { RegionID: 900, RegionCode: "test", diff --git a/hscontrol/state/debug.go b/hscontrol/state/debug.go index 91a9c4493..2d26e2d11 100644 --- a/hscontrol/state/debug.go +++ b/hscontrol/state/debug.go @@ -35,16 +35,16 @@ type DebugOverviewInfo struct { // DebugDERPInfo represents DERP map information in a structured format. type DebugDERPInfo struct { - Configured bool `json:"configured"` - TotalRegions int `json:"total_regions"` - Regions map[int]*DebugDERPRegion `json:"regions,omitempty"` + Configured bool `json:"configured"` + TotalRegions int `json:"total_regions"` + Regions map[tailcfg.DERPRegionID]*DebugDERPRegion `json:"regions,omitempty"` } // DebugDERPRegion represents a single DERP region. type DebugDERPRegion struct { - RegionID int `json:"region_id"` - RegionName string `json:"region_name"` - Nodes []*DebugDERPNode `json:"nodes"` + RegionID tailcfg.DERPRegionID `json:"region_id"` + RegionName string `json:"region_name"` + Nodes []*DebugDERPNode `json:"nodes"` } // DebugDERPNode represents a single DERP node. @@ -346,7 +346,7 @@ func (s *State) DebugDERPJSON() DebugDERPInfo { info := DebugDERPInfo{ Configured: derpMap != nil, - Regions: make(map[int]*DebugDERPRegion), + Regions: make(map[tailcfg.DERPRegionID]*DebugDERPRegion), } if derpMap == nil { diff --git a/hscontrol/state/maprequest.go b/hscontrol/state/maprequest.go index e8571e0ac..b8f91be13 100644 --- a/hscontrol/state/maprequest.go +++ b/hscontrol/state/maprequest.go @@ -27,7 +27,7 @@ func netInfoFromMapRequest( log.Debug(). Caller(). Uint64("node.id", nodeID.Uint64()). - Int("preferredDERP", currentHostinfo.NetInfo.PreferredDERP). + Int64("preferredDERP", currentHostinfo.NetInfo.PreferredDERP.Int64()). Msg("using NetInfo from previous Hostinfo in MapRequest") return currentHostinfo.NetInfo diff --git a/hscontrol/state/maprequest_test.go b/hscontrol/state/maprequest_test.go index ef3217016..d835afbca 100644 --- a/hscontrol/state/maprequest_test.go +++ b/hscontrol/state/maprequest_test.go @@ -104,7 +104,7 @@ func TestNetInfoPreservationInRegistrationFlow(t *testing.T) { // CORRECT: Using the existing node's hostinfo (has NetInfo) correctResult := netInfoFromMapRequest(nodeID, existingNodeHostinfo, newRegistrationHostinfo) assert.NotNil(t, correctResult, "Fix: Should preserve NetInfo when using correct hostinfo reference") - assert.Equal(t, 5, correctResult.PreferredDERP, "Should preserve the DERP region from existing node") + assert.Equal(t, tailcfg.DERPRegionID(5), correctResult.PreferredDERP, "Should preserve the DERP region from existing node") }) t.Run("new_node_creation_for_different_user_should_preserve_netinfo", func(t *testing.T) { @@ -130,6 +130,6 @@ func TestNetInfoPreservationInRegistrationFlow(t *testing.T) { // When creating a new node for user2, we should preserve NetInfo from user1's node result := netInfoFromMapRequest(types.NodeID(2), existingNodeUser1Hostinfo, newNodeUser2Hostinfo) assert.NotNil(t, result, "New node for user2 should preserve NetInfo from user1's node") - assert.Equal(t, 7, result.PreferredDERP, "Should preserve DERP region from existing node") + assert.Equal(t, tailcfg.DERPRegionID(7), result.PreferredDERP, "Should preserve DERP region from existing node") }) } diff --git a/hscontrol/types/config.go b/hscontrol/types/config.go index 4f0b4ecfa..f1b0298ff 100644 --- a/hscontrol/types/config.go +++ b/hscontrol/types/config.go @@ -244,7 +244,7 @@ type OIDCConfig struct { type DERPConfig struct { ServerEnabled bool AutomaticallyAddEmbeddedDerpRegion bool - ServerRegionID int + ServerRegionID tailcfg.DERPRegionID ServerRegionCode string ServerRegionName string ServerPrivateKeyPath string @@ -731,7 +731,7 @@ func tlsConfig() TLSConfig { func derpConfig() DERPConfig { serverEnabled := viper.GetBool("derp.server.enabled") - serverRegionID := viper.GetInt("derp.server.region_id") + serverRegionID := viper.GetInt64("derp.server.region_id") serverRegionCode := viper.GetString("derp.server.region_code") serverRegionName := viper.GetString("derp.server.region_name") serverVerifyClients := viper.GetBool("derp.server.verify_clients") @@ -780,7 +780,7 @@ func derpConfig() DERPConfig { return DERPConfig{ ServerEnabled: serverEnabled, - ServerRegionID: serverRegionID, + ServerRegionID: tailcfg.DERPRegionID(serverRegionID), ServerRegionCode: serverRegionCode, ServerRegionName: serverRegionName, ServerVerifyClients: serverVerifyClients, diff --git a/hscontrol/types/node.go b/hscontrol/types/node.go index ef9467373..da4173547 100644 --- a/hscontrol/types/node.go +++ b/hscontrol/types/node.go @@ -1159,7 +1159,7 @@ func (nv NodeView) TailNode( return nil, err } - var derp int + var derp tailcfg.DERPRegionID if nv.Hostinfo().Valid() && nv.Hostinfo().NetInfo().Valid() { derp = nv.Hostinfo().NetInfo().PreferredDERP() } diff --git a/hscontrol/util/zlog/hostinfo.go b/hscontrol/util/zlog/hostinfo.go index c8d74db4f..9342b65a7 100644 --- a/hscontrol/util/zlog/hostinfo.go +++ b/hscontrol/util/zlog/hostinfo.go @@ -48,7 +48,7 @@ func (s SafeHostinfo) MarshalZerologObject(e *zerolog.Event) { } if s.hi.NetInfo != nil && s.hi.NetInfo.PreferredDERP != 0 { - e.Int(zf.DERP, s.hi.NetInfo.PreferredDERP) + e.Int64(zf.DERP, s.hi.NetInfo.PreferredDERP.Int64()) } // SECURITY: The following fields are intentionally NOT logged: diff --git a/integration/derp_verify_endpoint_test.go b/integration/derp_verify_endpoint_test.go index c3cc88378..399b3314c 100644 --- a/integration/derp_verify_endpoint_test.go +++ b/integration/derp_verify_endpoint_test.go @@ -67,7 +67,7 @@ func TestDERPVerifyEndpoint(t *testing.T) { }, } derpMap := tailcfg.DERPMap{ - Regions: map[int]*tailcfg.DERPRegion{ + Regions: map[tailcfg.DERPRegionID]*tailcfg.DERPRegion{ 900: &derpRegion, }, }