@ -51,6 +51,7 @@ func (pm *profileManager) SetCurrentUser(uid string) error {
if pm . currentUserID == uid {
if pm . currentUserID == uid {
return nil
return nil
}
}
pm . currentUserID = uid
cpk := ipn . CurrentProfileKey ( uid )
cpk := ipn . CurrentProfileKey ( uid )
if b , err := pm . store . ReadState ( cpk ) ; err == nil {
if b , err := pm . store . ReadState ( cpk ) ; err == nil {
pk := ipn . StateKey ( string ( b ) )
pk := ipn . StateKey ( string ( b ) )
@ -66,34 +67,36 @@ func (pm *profileManager) SetCurrentUser(uid string) error {
} else {
} else {
return err
return err
}
}
pm . currentUserID = uid
return nil
return nil
}
}
func ( pm * profileManager ) findProfilesByNodeID ( nodeID tailcfg . StableNodeID ) [ ] * ipn . LoginProfile {
// matchingProfiles returns all profiles that match the given predicate and
if nodeID . IsZero ( ) {
// belong to the currentUserID.
return nil
func ( pm * profileManager ) matchingProfiles ( f func ( * ipn . LoginProfile ) bool ) ( out [ ] * ipn . LoginProfile ) {
}
var out [ ] * ipn . LoginProfile
for _ , p := range pm . knownProfiles {
for _ , p := range pm . knownProfiles {
if p . NodeID == nodeID {
if p . LocalUserID == pm . currentUserID && f ( p ) {
out = append ( out , p )
out = append ( out , p )
}
}
}
}
return out
return out
}
}
func ( pm * profileManager ) findProfilesByNodeID ( nodeID tailcfg . StableNodeID ) [ ] * ipn . LoginProfile {
if nodeID . IsZero ( ) {
return nil
}
return pm . matchingProfiles ( func ( p * ipn . LoginProfile ) bool {
return p . NodeID == nodeID
} )
}
func ( pm * profileManager ) findProfilesByUserID ( userID tailcfg . UserID ) [ ] * ipn . LoginProfile {
func ( pm * profileManager ) findProfilesByUserID ( userID tailcfg . UserID ) [ ] * ipn . LoginProfile {
if userID . IsZero ( ) {
if userID . IsZero ( ) {
return nil
return nil
}
}
var out [ ] * ipn . LoginProfile
return pm . matchingProfiles ( func ( p * ipn . LoginProfile ) bool {
for _ , p := range pm . knownProfiles {
return p . UserProfile . ID == userID
if p . UserProfile . ID == userID {
} )
out = append ( out , p )
}
}
return out
}
}
// ProfileIDForName returns the profile ID for the profile with the
// ProfileIDForName returns the profile ID for the profile with the
@ -107,21 +110,29 @@ func (pm *profileManager) ProfileIDForName(name string) ipn.ProfileID {
}
}
func ( pm * profileManager ) findProfileByName ( name string ) * ipn . LoginProfile {
func ( pm * profileManager ) findProfileByName ( name string ) * ipn . LoginProfile {
for _ , p := range pm . knownProfiles {
out := pm . matchingProfiles ( func ( p * ipn . LoginProfile ) bool {
if p . Name == name {
return p . Name == name
return p
} )
}
if len ( out ) == 0 {
return nil
}
}
return nil
if len ( out ) > 1 {
pm . logf ( "[unxpected] multiple profiles with the same name" )
}
return out [ 0 ]
}
}
func ( pm * profileManager ) findProfileByKey ( key ipn . StateKey ) * ipn . LoginProfile {
func ( pm * profileManager ) findProfileByKey ( key ipn . StateKey ) * ipn . LoginProfile {
for _ , p := range pm . knownProfiles {
out := pm . matchingProfiles ( func ( p * ipn . LoginProfile ) bool {
if p . Key == key {
return p . Key == key
return p
} )
}
if len ( out ) == 0 {
return nil
}
}
return nil
if len ( out ) > 1 {
pm . logf ( "[unxpected] multiple profiles with the same key" )
}
return out [ 0 ]
}
}
func ( pm * profileManager ) setUnattendedModeAsConfigured ( ) error {
func ( pm * profileManager ) setUnattendedModeAsConfigured ( ) error {
@ -244,16 +255,15 @@ func (pm *profileManager) writePrefsToStore(key ipn.StateKey, prefs ipn.PrefsVie
// Profiles returns the list of known profiles.
// Profiles returns the list of known profiles.
func ( pm * profileManager ) Profiles ( ) [ ] ipn . LoginProfile {
func ( pm * profileManager ) Profiles ( ) [ ] ipn . LoginProfile {
var profiles [ ] ipn . LoginProfile
profiles := pm . matchingProfiles ( func ( * ipn . LoginProfile ) bool { return true } )
for _ , p := range pm . knownProfiles {
slices . SortFunc ( profiles , func ( a , b * ipn . LoginProfile ) bool {
if p . LocalUserID == pm . currentUserID {
profiles = append ( profiles , * p )
}
}
slices . SortFunc ( profiles , func ( a , b ipn . LoginProfile ) bool {
return a . Name < b . Name
return a . Name < b . Name
} )
} )
return profiles
out := make ( [ ] ipn . LoginProfile , 0 , len ( profiles ) )
for _ , p := range profiles {
out = append ( out , * p )
}
return out
}
}
// SwitchProfile switches to the profile with the given id.
// SwitchProfile switches to the profile with the given id.
@ -431,6 +441,7 @@ func readKnownProfiles(store ipn.StateStore) (map[ipn.ProfileID]*ipn.LoginProfil
}
}
func newProfileManagerWithGOOS ( store ipn . StateStore , logf logger . Logf , stateKey ipn . StateKey , goos string ) ( * profileManager , error ) {
func newProfileManagerWithGOOS ( store ipn . StateStore , logf logger . Logf , stateKey ipn . StateKey , goos string ) ( * profileManager , error ) {
logf = logger . WithPrefix ( logf , "pm: " )
if stateKey == "" {
if stateKey == "" {
var err error
var err error
stateKey , err = readAutoStartKey ( store , goos )
stateKey , err = readAutoStartKey ( store , goos )