cmd/tailscale: make up respect explicitly empty --operator= value

Fixes #3808

Signed-off-by: soypete <miriah@tailscale.com>
pull/4953/head
soypete 2 years ago committed by Miriah Peterson
parent c434e47f2d
commit 412c4c55e2

@ -493,14 +493,16 @@ func TestCheckForAccidentalSettingReverts(t *testing.T) {
if err != nil { if err != nil {
t.Fatal(err) t.Fatal(err)
} }
applyImplicitPrefs(newPrefs, tt.curPrefs, tt.curUser) upEnv := upCheckEnv{
var got string
if err := checkForAccidentalSettingReverts(newPrefs, tt.curPrefs, upCheckEnv{
goos: goos, goos: goos,
flagSet: flagSet, flagSet: flagSet,
curExitNodeIP: tt.curExitNodeIP, curExitNodeIP: tt.curExitNodeIP,
distro: tt.distro, distro: tt.distro,
}); err != nil { user: tt.curUser,
}
applyImplicitPrefs(newPrefs, tt.curPrefs, upEnv)
var got string
if err := checkForAccidentalSettingReverts(newPrefs, tt.curPrefs, upEnv); err != nil {
got = err.Error() got = err.Error()
} }
if strings.TrimSpace(got) != tt.want { if strings.TrimSpace(got) != tt.want {
@ -784,6 +786,10 @@ func TestUpdatePrefs(t *testing.T) {
curPrefs *ipn.Prefs curPrefs *ipn.Prefs
env upCheckEnv // empty goos means "linux" env upCheckEnv // empty goos means "linux"
// checkUpdatePrefsMutations, if non-nil, is run with the new prefs after
// updatePrefs might've mutated them (from applyImplicitPrefs).
checkUpdatePrefsMutations func(t *testing.T, newPrefs *ipn.Prefs)
wantSimpleUp bool wantSimpleUp bool
wantJustEditMP *ipn.MaskedPrefs wantJustEditMP *ipn.MaskedPrefs
wantErrSubtr string wantErrSubtr string
@ -885,6 +891,28 @@ func TestUpdatePrefs(t *testing.T) {
}, },
env: upCheckEnv{backendState: "Running"}, env: upCheckEnv{backendState: "Running"},
}, },
{
// Issue 3808: explicitly empty --operator= should clear value.
name: "explicit_empty_operator",
flags: []string{"--operator="},
curPrefs: &ipn.Prefs{
ControlURL: "https://login.tailscale.com",
CorpDNS: true,
AllowSingleHosts: true,
NetfilterMode: preftype.NetfilterOn,
OperatorUser: "somebody",
},
env: upCheckEnv{user: "somebody", backendState: "Running"},
wantJustEditMP: &ipn.MaskedPrefs{
OperatorUserSet: true,
WantRunningSet: true,
},
checkUpdatePrefsMutations: func(t *testing.T, prefs *ipn.Prefs) {
if prefs.OperatorUser != "" {
t.Errorf("operator sent to backend should be empty; got %q", prefs.OperatorUser)
}
},
},
} }
for _, tt := range tests { for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) { t.Run(tt.name, func(t *testing.T) {
@ -909,6 +937,9 @@ func TestUpdatePrefs(t *testing.T) {
} }
t.Fatal(err) t.Fatal(err)
} }
if tt.checkUpdatePrefsMutations != nil {
tt.checkUpdatePrefsMutations(t, newPrefs)
}
if simpleUp != tt.wantSimpleUp { if simpleUp != tt.wantSimpleUp {
t.Fatalf("simpleUp=%v, want %v", simpleUp, tt.wantSimpleUp) t.Fatalf("simpleUp=%v, want %v", simpleUp, tt.wantSimpleUp)
} }

@ -362,7 +362,7 @@ func prefsFromUpArgs(upArgs upArgsT, warnf logger.Logf, st *ipnstate.Status, goo
// without changing any settings. // without changing any settings.
func updatePrefs(prefs, curPrefs *ipn.Prefs, env upCheckEnv) (simpleUp bool, justEditMP *ipn.MaskedPrefs, err error) { func updatePrefs(prefs, curPrefs *ipn.Prefs, env upCheckEnv) (simpleUp bool, justEditMP *ipn.MaskedPrefs, err error) {
if !env.upArgs.reset { if !env.upArgs.reset {
applyImplicitPrefs(prefs, curPrefs, env.user) applyImplicitPrefs(prefs, curPrefs, env)
if err := checkForAccidentalSettingReverts(prefs, curPrefs, env); err != nil { if err := checkForAccidentalSettingReverts(prefs, curPrefs, env); err != nil {
return false, nil, err return false, nil, err
@ -881,13 +881,20 @@ func checkForAccidentalSettingReverts(newPrefs, curPrefs *ipn.Prefs, env upCheck
return errors.New(sb.String()) return errors.New(sb.String())
} }
// applyImplicitPrefs mutates prefs to add implicit preferences. Currently // applyImplicitPrefs mutates prefs to add implicit preferences for the user operator.
// this is just the operator user, which only needs to be set if it doesn't // If the operator flag is passed no action is taken, otherwise this only needs to be set if it doesn't
// match the current user. // match the current user.
// //
// curUser is os.Getenv("USER"). It's pulled out for testability. // curUser is os.Getenv("USER"). It's pulled out for testability.
func applyImplicitPrefs(prefs, oldPrefs *ipn.Prefs, curUser string) { func applyImplicitPrefs(prefs, oldPrefs *ipn.Prefs, env upCheckEnv) {
if prefs.OperatorUser == "" && oldPrefs.OperatorUser == curUser { explicitOperator := false
env.flagSet.Visit(func(f *flag.Flag) {
if f.Name == "operator" {
explicitOperator = true
}
})
if prefs.OperatorUser == "" && oldPrefs.OperatorUser == env.user && !explicitOperator {
prefs.OperatorUser = oldPrefs.OperatorUser prefs.OperatorUser = oldPrefs.OperatorUser
} }
} }

Loading…
Cancel
Save