util/syspolicy: add auto exit node related keys (#11996)

Updates tailscale/corp#19681

Signed-off-by: Claire Wang <claire@tailscale.com>
This commit is contained in:
Claire Wang 2024-05-06 12:14:10 -04:00 committed by GitHub
parent 1a963342c7
commit 41f2195899
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
2 changed files with 65 additions and 0 deletions

View File

@ -58,6 +58,9 @@
// installations and uses the Sparkle naming convention, even though it does // installations and uses the Sparkle naming convention, even though it does
// not actually control updates, merely the UI for that setting. // not actually control updates, merely the UI for that setting.
AutoUpdateVisibility Key = "ApplyUpdates" AutoUpdateVisibility Key = "ApplyUpdates"
// SuggestedExitNodeVisibility controls the visibility of suggested exit nodes in the client GUI.
// When this system policy is set to 'hide', an exit node suggestion won't be presented to the user as part of the exit nodes picker.
SuggestedExitNodeVisibility Key = "SuggestedExitNode"
// Keys with a string value formatted for use with time.ParseDuration(). // Keys with a string value formatted for use with time.ParseDuration().
KeyExpirationNoticeTime Key = "KeyExpirationNotice" // default 24 hours KeyExpirationNoticeTime Key = "KeyExpirationNotice" // default 24 hours
@ -84,4 +87,8 @@
// ManagedByURL is a valid URL pointing to a support help desk for Tailscale within the // ManagedByURL is a valid URL pointing to a support help desk for Tailscale within the
// organization. A button in the client UI provides easy access to this URL. // organization. A button in the client UI provides easy access to this URL.
ManagedByURL Key = "ManagedByURL" ManagedByURL Key = "ManagedByURL"
// Keys with a string array value.
// AllowedSuggestedExitNodes's string array value is a list of exit node IDs that restricts which exit nodes are considered when generating suggestions for exit nodes.
AllowedSuggestedExitNodes Key = "AllowedSuggestedExitNodes"
) )

View File

@ -5,6 +5,7 @@
import ( import (
"errors" "errors"
"slices"
"testing" "testing"
"time" "time"
) )
@ -408,6 +409,63 @@ func TestGetDuration(t *testing.T) {
} }
} }
func TestGetStringArray(t *testing.T) {
tests := []struct {
name string
key Key
handlerValue []string
handlerError error
defaultValue []string
wantValue []string
wantError error
}{
{
name: "read existing value",
key: AllowedSuggestedExitNodes,
handlerValue: []string{"foo", "bar"},
wantValue: []string{"foo", "bar"},
},
{
name: "read non-existing value",
key: AllowedSuggestedExitNodes,
handlerError: ErrNoSuchKey,
wantError: nil,
},
{
name: "read non-existing value, non nil default",
key: AllowedSuggestedExitNodes,
handlerError: ErrNoSuchKey,
defaultValue: []string{"foo", "bar"},
wantValue: []string{"foo", "bar"},
wantError: nil,
},
{
name: "reading value returns other error",
key: AllowedSuggestedExitNodes,
handlerError: someOtherError,
wantError: someOtherError,
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
SetHandlerForTest(t, &testHandler{
t: t,
key: tt.key,
sArr: tt.handlerValue,
err: tt.handlerError,
})
value, err := GetStringArray(tt.key, tt.defaultValue)
if err != tt.wantError {
t.Errorf("err=%q, want %q", err, tt.wantError)
}
if !slices.Equal(tt.wantValue, value) {
t.Errorf("value=%v, want %v", value, tt.wantValue)
}
})
}
}
func TestSelectControlURL(t *testing.T) { func TestSelectControlURL(t *testing.T) {
tests := []struct { tests := []struct {
reg, disk, want string reg, disk, want string