2020-02-05 22:16:58 +00:00
|
|
|
// Copyright (c) 2020 Tailscale Inc & AUTHORS All rights reserved.
|
|
|
|
// Use of this source code is governed by a BSD-style
|
|
|
|
// license that can be found in the LICENSE file.
|
|
|
|
|
|
|
|
package ipn
|
|
|
|
|
|
|
|
import (
|
2021-01-15 16:43:23 +00:00
|
|
|
"context"
|
2020-02-05 22:16:58 +00:00
|
|
|
|
2022-04-26 03:30:41 +00:00
|
|
|
"tailscale.com/envknob"
|
2020-02-05 22:16:58 +00:00
|
|
|
"tailscale.com/version"
|
|
|
|
)
|
|
|
|
|
2021-01-15 16:43:23 +00:00
|
|
|
type readOnlyContextKey struct{}
|
|
|
|
|
|
|
|
// IsReadonlyContext reports whether ctx is a read-only context, as currently used
|
|
|
|
// by Unix non-root users running the "tailscale" CLI command. They can run "status",
|
|
|
|
// but not much else.
|
|
|
|
func IsReadonlyContext(ctx context.Context) bool {
|
|
|
|
return ctx.Value(readOnlyContextKey{}) != nil
|
|
|
|
}
|
|
|
|
|
|
|
|
// ReadonlyContextOf returns ctx wrapped with a context value that
|
|
|
|
// will make IsReadonlyContext reports true.
|
|
|
|
func ReadonlyContextOf(ctx context.Context) context.Context {
|
|
|
|
if IsReadonlyContext(ctx) {
|
|
|
|
return ctx
|
|
|
|
}
|
|
|
|
return context.WithValue(ctx, readOnlyContextKey{}, readOnlyContextKey{})
|
|
|
|
}
|
|
|
|
|
2022-04-26 03:30:41 +00:00
|
|
|
// IPCVersion returns version.Long usually, unless TS_DEBUG_FAKE_IPC_VERSION is
|
|
|
|
// set, in which it contains that value. This is only used for weird development
|
|
|
|
// cases when testing mismatched versions and you want the client to act like it's
|
|
|
|
// compatible with the server.
|
|
|
|
func IPCVersion() string {
|
|
|
|
if v := envknob.String("TS_DEBUG_FAKE_IPC_VERSION"); v != "" {
|
|
|
|
return v
|
|
|
|
}
|
|
|
|
return version.Long
|
|
|
|
}
|