types: emit SSH environment capability by default

Fixes #3559

(cherry picked from commit 8cf43952af, adapted: nodecap names on 0.29's v1.104 baseline)
This commit is contained in:
arkie authored and Kristoffer Dalby committed 2026-10-30 10:33:17 +01:00
1 parent 93340a6b1b
commit f20366b3dd
2 files changed
+38 -28

No files matched your search

+34 -26
View File
@@ -12,6 +12,7 @@ import (
"github.com/juanfont/headscale/hscontrol/types"
"tailscale.com/net/tsaddr"
"tailscale.com/tailcfg"
"tailscale.com/tailcfg/nodecap"
"tailscale.com/types/key"
)
@@ -74,10 +75,11 @@ func TestTailNode(t *testing.T) {
MachineAuthorized: true,
CapMap: tailcfg.NodeCapMap{
tailcfg.CapabilityAdmin: []tailcfg.RawMessage{},
tailcfg.CapabilitySSH: []tailcfg.RawMessage{},
tailcfg.CapabilityFileSharing: []tailcfg.RawMessage{},
tailcfg.NodeAttrDefaultAutoUpdate: []tailcfg.RawMessage{tailcfg.RawMessage("false")},
nodecap.Admin: []tailcfg.RawMessage{},
nodecap.SSH: []tailcfg.RawMessage{},
nodecap.FileSharing: []tailcfg.RawMessage{},
nodecap.DefaultAutoUpdate: []tailcfg.RawMessage{tailcfg.RawMessage("false")},
nodecap.SSHEnvironmentVariables: []tailcfg.RawMessage{},
},
},
wantErr: false,
@@ -163,10 +165,11 @@ func TestTailNode(t *testing.T) {
MachineAuthorized: true,
CapMap: tailcfg.NodeCapMap{
tailcfg.CapabilityAdmin: []tailcfg.RawMessage{},
tailcfg.CapabilitySSH: []tailcfg.RawMessage{},
tailcfg.CapabilityFileSharing: []tailcfg.RawMessage{},
tailcfg.NodeAttrDefaultAutoUpdate: []tailcfg.RawMessage{tailcfg.RawMessage("false")},
nodecap.Admin: []tailcfg.RawMessage{},
nodecap.SSH: []tailcfg.RawMessage{},
nodecap.FileSharing: []tailcfg.RawMessage{},
nodecap.DefaultAutoUpdate: []tailcfg.RawMessage{tailcfg.RawMessage("false")},
nodecap.SSHEnvironmentVariables: []tailcfg.RawMessage{},
},
},
wantErr: false,
@@ -188,10 +191,11 @@ func TestTailNode(t *testing.T) {
MachineAuthorized: true,
CapMap: tailcfg.NodeCapMap{
tailcfg.CapabilityAdmin: []tailcfg.RawMessage{},
tailcfg.CapabilitySSH: []tailcfg.RawMessage{},
tailcfg.CapabilityFileSharing: []tailcfg.RawMessage{},
tailcfg.NodeAttrDefaultAutoUpdate: []tailcfg.RawMessage{tailcfg.RawMessage("false")},
nodecap.Admin: []tailcfg.RawMessage{},
nodecap.SSH: []tailcfg.RawMessage{},
nodecap.FileSharing: []tailcfg.RawMessage{},
nodecap.DefaultAutoUpdate: []tailcfg.RawMessage{tailcfg.RawMessage("false")},
nodecap.SSHEnvironmentVariables: []tailcfg.RawMessage{},
},
},
wantErr: false,
@@ -274,10 +278,11 @@ func TestTailNodeBaselineGates(t *testing.T) {
AutoUpdate: types.AutoUpdateConfig{Enabled: false},
},
want: tailcfg.NodeCapMap{
tailcfg.CapabilityAdmin: []tailcfg.RawMessage{},
tailcfg.CapabilitySSH: []tailcfg.RawMessage{},
tailcfg.CapabilityFileSharing: []tailcfg.RawMessage{},
tailcfg.NodeAttrDefaultAutoUpdate: autoUpdate(false),
nodecap.Admin: []tailcfg.RawMessage{},
nodecap.SSH: []tailcfg.RawMessage{},
nodecap.FileSharing: []tailcfg.RawMessage{},
nodecap.DefaultAutoUpdate: autoUpdate(false),
nodecap.SSHEnvironmentVariables: []tailcfg.RawMessage{},
},
},
{
@@ -287,9 +292,10 @@ func TestTailNodeBaselineGates(t *testing.T) {
AutoUpdate: types.AutoUpdateConfig{Enabled: false},
},
want: tailcfg.NodeCapMap{
tailcfg.CapabilityAdmin: []tailcfg.RawMessage{},
tailcfg.CapabilitySSH: []tailcfg.RawMessage{},
tailcfg.NodeAttrDefaultAutoUpdate: autoUpdate(false),
nodecap.Admin: []tailcfg.RawMessage{},
nodecap.SSH: []tailcfg.RawMessage{},
nodecap.DefaultAutoUpdate: autoUpdate(false),
nodecap.SSHEnvironmentVariables: []tailcfg.RawMessage{},
},
},
{
@@ -299,10 +305,11 @@ func TestTailNodeBaselineGates(t *testing.T) {
AutoUpdate: types.AutoUpdateConfig{Enabled: true},
},
want: tailcfg.NodeCapMap{
tailcfg.CapabilityAdmin: []tailcfg.RawMessage{},
tailcfg.CapabilitySSH: []tailcfg.RawMessage{},
tailcfg.CapabilityFileSharing: []tailcfg.RawMessage{},
tailcfg.NodeAttrDefaultAutoUpdate: autoUpdate(true),
nodecap.Admin: []tailcfg.RawMessage{},
nodecap.SSH: []tailcfg.RawMessage{},
nodecap.FileSharing: []tailcfg.RawMessage{},
nodecap.DefaultAutoUpdate: autoUpdate(true),
nodecap.SSHEnvironmentVariables: []tailcfg.RawMessage{},
},
},
{
@@ -312,9 +319,10 @@ func TestTailNodeBaselineGates(t *testing.T) {
AutoUpdate: types.AutoUpdateConfig{Enabled: true},
},
want: tailcfg.NodeCapMap{
tailcfg.CapabilityAdmin: []tailcfg.RawMessage{},
tailcfg.CapabilitySSH: []tailcfg.RawMessage{},
tailcfg.NodeAttrDefaultAutoUpdate: autoUpdate(true),
nodecap.Admin: []tailcfg.RawMessage{},
nodecap.SSH: []tailcfg.RawMessage{},
nodecap.DefaultAutoUpdate: autoUpdate(true),
nodecap.SSHEnvironmentVariables: []tailcfg.RawMessage{},
},
},
}
+4 -2
View File
@@ -20,6 +20,7 @@ import (
"google.golang.org/protobuf/types/known/timestamppb"
"tailscale.com/net/tsaddr"
"tailscale.com/tailcfg"
"tailscale.com/tailcfg/nodecap"
"tailscale.com/types/key"
"tailscale.com/types/views"
"tailscale.com/util/dnsname"
@@ -1421,8 +1422,9 @@ func (nv NodeView) TailNode(
// what Tailscale SaaS emits for a default tailnet.
// cfg.Taildrop.Enabled gates CapabilityFileSharing.
capMap := tailcfg.NodeCapMap{
tailcfg.CapabilityAdmin: []tailcfg.RawMessage{},
tailcfg.CapabilitySSH: []tailcfg.RawMessage{},
nodecap.Admin: []tailcfg.RawMessage{},
nodecap.SSH: []tailcfg.RawMessage{},
nodecap.SSHEnvironmentVariables: []tailcfg.RawMessage{},
}
if cfg.Taildrop.Enabled {