Skip to content

Commit ca9f052

Browse files
feat(ci): bump to upstream 1.76.0 (#13)
https://tailscale.com/changelog#2024-10-10
2 parents 6379a8d + 582dc91 commit ca9f052

File tree

209 files changed

+11398
-5104
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

209 files changed

+11398
-5104
lines changed

VERSION.txt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
1.74.1
1+
1.76.0

api.md

Lines changed: 0 additions & 102 deletions
Original file line numberDiff line numberDiff line change
@@ -1,104 +1,2 @@
11
> [!IMPORTANT]
22
> The Tailscale API documentation has moved to https://tailscale.com/api
3-
4-
# Tailscale API
5-
6-
The Tailscale API documentation is located in **[tailscale/publicapi](./publicapi/readme.md#tailscale-api)**.
7-
8-
# APIs
9-
10-
**[Overview](./publicapi/readme.md)**
11-
12-
**[Device](./publicapi/device.md#device)**
13-
14-
<a href="device-delete"></a>
15-
<a href="expire-device-key"></a>
16-
<a href="device-routes-get">
17-
<a href="device-routes-post"></a>
18-
<a href="#device-authorized-post"></a>
19-
<a href="device-tags-post"></a>
20-
<a href="device-key-post"></a>
21-
<a href="tailnet-acl-get"></a>
22-
23-
- Get a device: [`GET /api/v2/device/{deviceid}`](./publicapi/device.md#get-device)
24-
- Delete a device: [`DELETE /api/v2/device/{deviceID}`](./publicapi/device.md#delete-device)
25-
- Expire device key: [`POST /api/v2/device/{deviceID}/expire`](./publicapi/device.md#expire-device-key)
26-
- [**Routes**](./publicapi/device.md#routes)
27-
- Get device routes: [`GET /api/v2/device/{deviceID}/routes`](./publicapi/device.md#get-device-routes)
28-
- Set device routes: [`POST /api/v2/device/{deviceID}/routes`](./publicapi/device.md#set-device-routes)
29-
- [**Authorize**](./publicapi/device.md#authorize)
30-
- Authorize a device: [`POST /api/v2/device/{deviceID}/authorized`](./publicapi/device.md#authorize-device)
31-
- [**Tags**](./publicapi/device.md#tags)
32-
- Update tags: [`POST /api/v2/device/{deviceID}/tags`](./publicapi/device.md#update-device-tags)
33-
- [**Keys**](./publicapi/device.md#keys)
34-
- Update device key: [`POST /api/v2/device/{deviceID}/key`](./publicapi/device.md#update-device-key)
35-
- [**IP Addresses**](./publicapi/device.md#ip-addresses)
36-
- Set device IPv4 address: [`POST /api/v2/device/{deviceID}/ip`](./publicapi/device.md#set-device-ipv4-address)
37-
- [**Device posture attributes**](./publicapi/device.md#device-posture-attributes)
38-
- Get device posture attributes: [`GET /api/v2/device/{deviceID}/attributes`](./publicapi/device.md#get-device-posture-attributes)
39-
- Set custom device posture attributes: [`POST /api/v2/device/{deviceID}/attributes/{attributeKey}`](./publicapi/device.md#set-device-posture-attributes)
40-
- Delete custom device posture attributes: [`DELETE /api/v2/device/{deviceID}/attributes/{attributeKey}`](./publicapi/device.md#delete-custom-device-posture-attributes)
41-
- [**Device invites**](./publicapi/device.md#invites-to-a-device)
42-
- List device invites: [`GET /api/v2/device/{deviceID}/device-invites`](./publicapi/device.md#list-device-invites)
43-
- Create device invites: [`POST /api/v2/device/{deviceID}/device-invites`](./publicapi/device.md#create-device-invites)
44-
45-
**[Tailnet](./publicapi/tailnet.md#tailnet)**
46-
47-
<a href="tailnet-acl-post"></a>
48-
<a href="tailnet-acl-preview-post"></a>
49-
<a href="tailnet-acl-validate-post"></a>
50-
<a href="tailnet-devices"></a>
51-
<a href="tailnet-keys-get"></a>
52-
<a href="tailnet-keys-post"></a>
53-
<a href="tailnet-keys-key-get"></a>
54-
<a href="tailnet-keys-key-delete"></a>
55-
<a href="tailnet-dns"></a>
56-
<a href="tailnet-dns-nameservers-get"></a>
57-
<a href="tailnet-dns-nameservers-post"></a>
58-
<a href="tailnet-dns-preferences-get"></a>
59-
<a href="tailnet-dns-preferences-post"></a>
60-
<a href="tailnet-dns-searchpaths-get"></a>
61-
<a href="tailnet-dns-searchpaths-post"></a>
62-
63-
- [**Policy File**](./publicapi/tailnet.md#policy-file)
64-
- Get policy file: [`GET /api/v2/tailnet/{tailnet}/acl`](./publicapi/tailnet.md#get-policy-file)
65-
- Update policy file: [`POST /api/v2/tailnet/{tailnet}/acl`](./publicapi/tailnet.md#update-policy-file)
66-
- Preview rule matches: [`POST /api/v2/tailnet/{tailnet}/acl/preview`](./publicapi/tailnet.md#preview-policy-file-rule-matches)
67-
- Validate and test policy file: [`POST /api/v2/tailnet/{tailnet}/acl/validate`](./publicapi/tailnet.md#validate-and-test-policy-file)
68-
- [**Devices**](./publicapi/tailnet.md#devices)
69-
- List tailnet devices: [`GET /api/v2/tailnet/{tailnet}/devices`](./publicapi/tailnet.md#list-tailnet-devices)
70-
- [**Keys**](./publicapi/tailnet.md#tailnet-keys)
71-
- List tailnet keys: [`GET /api/v2/tailnet/{tailnet}/keys`](./publicapi/tailnet.md#list-tailnet-keys)
72-
- Create an auth key: [`POST /api/v2/tailnet/{tailnet}/keys`](./publicapi/tailnet.md#create-auth-key)
73-
- Get a key: [`GET /api/v2/tailnet/{tailnet}/keys/{keyid}`](./publicapi/tailnet.md#get-key)
74-
- Delete a key: [`DELETE /api/v2/tailnet/{tailnet}/keys/{keyid}`](./publicapi/tailnet.md#delete-key)
75-
- [**DNS**](./publicapi/tailnet.md#dns)
76-
- [**Nameservers**](./publicapi/tailnet.md#nameservers)
77-
- Get nameservers: [`GET /api/v2/tailnet/{tailnet}/dns/nameservers`](./publicapi/tailnet.md#get-nameservers)
78-
- Set nameservers: [`POST /api/v2/tailnet/{tailnet}/dns/nameservers`](./publicapi/tailnet.md#set-nameservers)
79-
- [**Preferences**](./publicapi/tailnet.md#preferences)
80-
- Get DNS preferences: [`GET /api/v2/tailnet/{tailnet}/dns/preferences`](./publicapi/tailnet.md#get-dns-preferences)
81-
- Set DNS preferences: [`POST /api/v2/tailnet/{tailnet}/dns/preferences`](./publicapi/tailnet.md#set-dns-preferences)
82-
- [**Search Paths**](./publicapi/tailnet.md#search-paths)
83-
- Get search paths: [`GET /api/v2/tailnet/{tailnet}/dns/searchpaths`](./publicapi/tailnet.md#get-search-paths)
84-
- Set search paths: [`POST /api/v2/tailnet/{tailnet}/dns/searchpaths`](./publicapi/tailnet.md#set-search-paths)
85-
- [**Split DNS**](./publicapi/tailnet.md#split-dns)
86-
- Get split DNS: [`GET /api/v2/tailnet/{tailnet}/dns/split-dns`](./publicapi/tailnet.md#get-split-dns)
87-
- Update split DNS: [`PATCH /api/v2/tailnet/{tailnet}/dns/split-dns`](./publicapi/tailnet.md#update-split-dns)
88-
- Set split DNS: [`PUT /api/v2/tailnet/{tailnet}/dns/split-dns`](./publicapi/tailnet.md#set-split-dns)
89-
- [**User invites**](./publicapi/tailnet.md#tailnet-user-invites)
90-
- List user invites: [`GET /api/v2/tailnet/{tailnet}/user-invites`](./publicapi/tailnet.md#list-user-invites)
91-
- Create user invites: [`POST /api/v2/tailnet/{tailnet}/user-invites`](./publicapi/tailnet.md#create-user-invites)
92-
93-
**[User invites](./publicapi/userinvites.md#user-invites)**
94-
95-
- Get user invite: [`GET /api/v2/user-invites/{userInviteId}`](./publicapi/userinvites.md#get-user-invite)
96-
- Delete user invite: [`DELETE /api/v2/user-invites/{userInviteId}`](./publicapi/userinvites.md#delete-user-invite)
97-
- Resend user invite (by email): [`POST /api/v2/user-invites/{userInviteId}/resend`](#resend-user-invite)
98-
99-
**[Device invites](./publicapi/deviceinvites.md#device-invites)**
100-
101-
- Get device invite: [`GET /api/v2/device-invites/{deviceInviteId}`](./publicapi/deviceinvites.md#get-device-invite)
102-
- Delete device invite: [`DELETE /api/v2/device-invites/{deviceInviteId}`](./publicapi/deviceinvites.md#delete-device-invite)
103-
- Resend device invite (by email): [`POST /api/v2/device-invites/{deviceInviteId}/resend`](./publicapi/deviceinvites.md#resend-device-invite)
104-
- Accept device invite [`POST /api/v2/device-invites/-/accept`](#accept-device-invite)

assert_ts_toolchain_match.go

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
// Copyright (c) Tailscale Inc & AUTHORS
2+
// SPDX-License-Identifier: BSD-3-Clause
3+
4+
//go:build tailscale_go
5+
6+
package tailscaleroot
7+
8+
import (
9+
"fmt"
10+
"os"
11+
"strings"
12+
)
13+
14+
func init() {
15+
tsRev, ok := tailscaleToolchainRev()
16+
if !ok {
17+
panic("binary built with tailscale_go build tag but failed to read build info or find tailscale.toolchain.rev in build info")
18+
}
19+
want := strings.TrimSpace(GoToolchainRev)
20+
if tsRev != want {
21+
if os.Getenv("TS_PERMIT_TOOLCHAIN_MISMATCH") == "1" {
22+
fmt.Fprintf(os.Stderr, "tailscale.toolchain.rev = %q, want %q; but ignoring due to TS_PERMIT_TOOLCHAIN_MISMATCH=1\n", tsRev, want)
23+
return
24+
}
25+
panic(fmt.Sprintf("binary built with tailscale_go build tag but Go toolchain %q doesn't match github.com/tailscale/tailscale expected value %q; override this failure with TS_PERMIT_TOOLCHAIN_MISMATCH=1", tsRev, want))
26+
}
27+
}

client/tailscale/apitype/apitype.go

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,10 @@
44
// Package apitype contains types for the Tailscale LocalAPI and control plane API.
55
package apitype
66

7-
import "tailscale.com/tailcfg"
7+
import (
8+
"tailscale.com/tailcfg"
9+
"tailscale.com/types/dnstype"
10+
)
811

912
// LocalAPIHost is the Host header value used by the LocalAPI.
1013
const LocalAPIHost = "local-tailscaled.sock"
@@ -65,3 +68,11 @@ type DNSOSConfig struct {
6568
SearchDomains []string
6669
MatchDomains []string
6770
}
71+
72+
// DNSQueryResponse is the response to a DNS query request sent via LocalAPI.
73+
type DNSQueryResponse struct {
74+
// Bytes is the raw DNS response bytes.
75+
Bytes []byte
76+
// Resolvers is the list of resolvers that the forwarder deemed able to resolve the query.
77+
Resolvers []*dnstype.Resolver
78+
}

client/tailscale/localclient.go

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@ import (
3737
"tailscale.com/safesocket"
3838
"tailscale.com/tailcfg"
3939
"tailscale.com/tka"
40+
"tailscale.com/types/dnstype"
4041
"tailscale.com/types/key"
4142
"tailscale.com/types/tkatype"
4243
)
@@ -813,6 +814,8 @@ func (lc *LocalClient) EditPrefs(ctx context.Context, mp *ipn.MaskedPrefs) (*ipn
813814
return decodeJSON[*ipn.Prefs](body)
814815
}
815816

817+
// GetDNSOSConfig returns the system DNS configuration for the current device.
818+
// That is, it returns the DNS configuration that the system would use if Tailscale weren't being used.
816819
func (lc *LocalClient) GetDNSOSConfig(ctx context.Context) (*apitype.DNSOSConfig, error) {
817820
body, err := lc.get200(ctx, "/localapi/v0/dns-osconfig")
818821
if err != nil {
@@ -825,6 +828,21 @@ func (lc *LocalClient) GetDNSOSConfig(ctx context.Context) (*apitype.DNSOSConfig
825828
return &osCfg, nil
826829
}
827830

831+
// QueryDNS executes a DNS query for a name (`google.com.`) and query type (`CNAME`).
832+
// It returns the raw DNS response bytes and the resolvers that were used to answer the query
833+
// (often just one, but can be more if we raced multiple resolvers).
834+
func (lc *LocalClient) QueryDNS(ctx context.Context, name string, queryType string) (bytes []byte, resolvers []*dnstype.Resolver, err error) {
835+
body, err := lc.get200(ctx, fmt.Sprintf("/localapi/v0/dns-query?name=%s&type=%s", url.QueryEscape(name), queryType))
836+
if err != nil {
837+
return nil, nil, err
838+
}
839+
var res apitype.DNSQueryResponse
840+
if err := json.Unmarshal(body, &res); err != nil {
841+
return nil, nil, fmt.Errorf("invalid query response: %w", err)
842+
}
843+
return res.Bytes, res.Resolvers, nil
844+
}
845+
828846
// StartLoginInteractive starts an interactive login.
829847
func (lc *LocalClient) StartLoginInteractive(ctx context.Context) error {
830848
_, err := lc.send(ctx, "POST", "/localapi/v0/login-interactive", http.StatusNoContent, nil)

client/web/web.go

Lines changed: 5 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,6 @@ import (
1717
"os"
1818
"path"
1919
"path/filepath"
20-
"slices"
2120
"strings"
2221
"sync"
2322
"time"
@@ -35,6 +34,7 @@ import (
3534
"tailscale.com/net/tsaddr"
3635
"tailscale.com/tailcfg"
3736
"tailscale.com/types/logger"
37+
"tailscale.com/types/views"
3838
"tailscale.com/util/httpm"
3939
"tailscale.com/version"
4040
"tailscale.com/version/distro"
@@ -113,11 +113,6 @@ const (
113113
ManageServerMode ServerMode = "manage"
114114
)
115115

116-
var (
117-
exitNodeRouteV4 = netip.MustParsePrefix("0.0.0.0/0")
118-
exitNodeRouteV6 = netip.MustParsePrefix("::/0")
119-
)
120-
121116
// ServerOpts contains options for constructing a new Server.
122117
type ServerOpts struct {
123118
// Mode specifies the mode of web client being constructed.
@@ -927,10 +922,10 @@ func (s *Server) serveGetNodeData(w http.ResponseWriter, r *http.Request) {
927922
return p == route
928923
})
929924
}
930-
data.AdvertisingExitNodeApproved = routeApproved(exitNodeRouteV4) || routeApproved(exitNodeRouteV6)
925+
data.AdvertisingExitNodeApproved = routeApproved(tsaddr.AllIPv4()) || routeApproved(tsaddr.AllIPv6())
931926

932927
for _, r := range prefs.AdvertiseRoutes {
933-
if r == exitNodeRouteV4 || r == exitNodeRouteV6 {
928+
if tsaddr.IsExitRoute(r) {
934929
data.AdvertisingExitNode = true
935930
} else {
936931
data.AdvertisedRoutes = append(data.AdvertisedRoutes, subnetRoute{
@@ -1071,7 +1066,7 @@ func (s *Server) servePostRoutes(ctx context.Context, data postRoutesRequest) er
10711066
var currNonExitRoutes []string
10721067
var currAdvertisingExitNode bool
10731068
for _, r := range prefs.AdvertiseRoutes {
1074-
if r == exitNodeRouteV4 || r == exitNodeRouteV6 {
1069+
if tsaddr.IsExitRoute(r) {
10751070
currAdvertisingExitNode = true
10761071
continue
10771072
}
@@ -1092,12 +1087,7 @@ func (s *Server) servePostRoutes(ctx context.Context, data postRoutesRequest) er
10921087
return err
10931088
}
10941089

1095-
hasExitNodeRoute := func(all []netip.Prefix) bool {
1096-
return slices.Contains(all, exitNodeRouteV4) ||
1097-
slices.Contains(all, exitNodeRouteV6)
1098-
}
1099-
1100-
if !data.UseExitNode.IsZero() && hasExitNodeRoute(routes) {
1090+
if !data.UseExitNode.IsZero() && tsaddr.ContainsExitRoutes(views.SliceOf(routes)) {
11011091
return errors.New("cannot use and advertise exit node at same time")
11021092
}
11031093

0 commit comments

Comments
 (0)