ipn/ipnlocal: add support for multiple user profiles
Signed-off-by: Maisem Ali <maisem@tailscale.com>
This commit is contained in:
+29
-3
@@ -19,14 +19,21 @@ const (
|
||||
// in its key.NodePrivate.MarshalText representation.
|
||||
MachineKeyStateKey = StateKey("_machinekey")
|
||||
|
||||
// GlobalDaemonStateKey is the ipn.StateKey that tailscaled
|
||||
// LegacyGlobalDaemonStateKey is the ipn.StateKey that tailscaled
|
||||
// loads on startup.
|
||||
//
|
||||
// We have to support multiple state keys for other OSes (Windows in
|
||||
// particular), but right now Unix daemons run with a single
|
||||
// node-global state. To keep open the option of having per-user state
|
||||
// later, the global state key doesn't look like a username.
|
||||
GlobalDaemonStateKey = StateKey("_daemon")
|
||||
//
|
||||
// As of 2022-10-21, it has been superseded by profiles and is no longer
|
||||
// written to disk. It is only read at startup when there are no profiles,
|
||||
// to migrate the state to the "default" profile.
|
||||
// The existing state is left on disk in case the user downgrades to an
|
||||
// older version of Tailscale that doesn't support profiles. We can
|
||||
// remove this in a future release.
|
||||
LegacyGlobalDaemonStateKey = StateKey("_daemon")
|
||||
|
||||
// ServerModeStartKey's value, if non-empty, is the value of a
|
||||
// StateKey containing the prefs to start with which to start the
|
||||
@@ -40,8 +47,27 @@ const (
|
||||
// NLKeyStateKey is the key under which we store the node's
|
||||
// network-lock node key, in its key.NLPrivate.MarshalText representation.
|
||||
NLKeyStateKey = StateKey("_nl-node-key")
|
||||
|
||||
// KnownProfilesStateKey is the key under which we store the list of
|
||||
// known profiles. The value is a JSON-encoded []LoginProfile.
|
||||
KnownProfilesStateKey = StateKey("_profiles")
|
||||
|
||||
// CurrentProfileStateKey is the key under which we store the current
|
||||
// profile.
|
||||
CurrentProfileStateKey = StateKey("_current-profile")
|
||||
)
|
||||
|
||||
// CurrentProfileID returns the StateKey that stores the
|
||||
// current profile ID. The value is a JSON-encoded LoginProfile.
|
||||
// If the userID is empty, the key returned is CurrentProfileStateKey,
|
||||
// otherwise it is "_current/"+userID.
|
||||
func CurrentProfileKey(userID string) StateKey {
|
||||
if userID == "" {
|
||||
return CurrentProfileStateKey
|
||||
}
|
||||
return StateKey("_current/" + userID)
|
||||
}
|
||||
|
||||
// StateStore persists state, and produces it back on request.
|
||||
type StateStore interface {
|
||||
// ReadState returns the bytes associated with ID. Returns (nil,
|
||||
@@ -67,7 +93,7 @@ func PutStoreInt(store StateStore, id StateKey, val int64) error {
|
||||
|
||||
// ServeConfigKey returns a StateKey that stores the
|
||||
// JSON-encoded ServeConfig for a config profile.
|
||||
func ServeConfigKey(profileID string) StateKey {
|
||||
func ServeConfigKey(profileID ProfileID) StateKey {
|
||||
return StateKey("_serve/" + profileID)
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user