@@ -381,7 +381,7 @@ func (pol *ACLPolicy) CompileSSHPolicy(
381
381
}
382
382
383
383
for _ , userStr := range usersFromGroup {
384
- user , err := findUserFromTokenOrErr (users , userStr )
384
+ user , err := findUserFromToken (users , userStr )
385
385
if err != nil {
386
386
log .Trace ().Err (err ).Msg ("user not found" )
387
387
continue
@@ -400,7 +400,7 @@ func (pol *ACLPolicy) CompileSSHPolicy(
400
400
// corresponds with the User info in the netmap.
401
401
// TODO(kradalby): This is a bit of a hack, and it should go
402
402
// away with the new policy where users can be reliably determined.
403
- if user , err := findUserFromTokenOrErr (users , srcToken ); err == nil {
403
+ if user , err := findUserFromToken (users , srcToken ); err == nil {
404
404
principals = append (principals , & tailcfg.SSHPrincipal {
405
405
UserLogin : user .Username (),
406
406
})
@@ -1001,7 +1001,7 @@ func (pol *ACLPolicy) TagsOfNode(
1001
1001
}
1002
1002
var found bool
1003
1003
for _ , owner := range owners {
1004
- user , err := findUserFromTokenOrErr (users , owner )
1004
+ user , err := findUserFromToken (users , owner )
1005
1005
if err != nil {
1006
1006
log .Trace ().Caller ().Err (err ).Msg ("could not determine user to filter tags by" )
1007
1007
}
@@ -1038,7 +1038,7 @@ func (pol *ACLPolicy) TagsOfNode(
1038
1038
func filterNodesByUser (nodes types.Nodes , users []types.User , userToken string ) types.Nodes {
1039
1039
var out types.Nodes
1040
1040
1041
- user , err := findUserFromTokenOrErr (users , userToken )
1041
+ user , err := findUserFromToken (users , userToken )
1042
1042
if err != nil {
1043
1043
log .Trace ().Caller ().Err (err ).Msg ("could not determine user to filter nodes by" )
1044
1044
return out
@@ -1058,24 +1058,19 @@ var (
1058
1058
ErrorMultipleUserMatching = errors .New ("multiple users matching" )
1059
1059
)
1060
1060
1061
- func findUserFromTokenOrErr (
1062
- users []types. User ,
1063
- token string ,
1064
- ) (types.User , error ) {
1061
+ // findUserFromToken finds and returns a user based on the given token, prioritizing matches by ProviderIdentifier, followed by email or name.
1062
+ // If no matching user is found, it returns an error of type ErrorNoUserMatching.
1063
+ // If multiple users match the token, it returns an error indicating multiple matches.
1064
+ func findUserFromToken ( users []types. User , token string ) (types.User , error ) {
1065
1065
var potentialUsers []types.User
1066
+
1066
1067
for _ , user := range users {
1067
1068
if user .ProviderIdentifier .Valid && user .ProviderIdentifier .String == token {
1068
- // If a user is matching with a known unique field,
1069
- // disgard all other users and only keep the current
1070
- // user.
1071
- potentialUsers = []types.User {user }
1072
-
1073
- break
1069
+ // Prioritize ProviderIdentifier match and exit early
1070
+ return user , nil
1074
1071
}
1075
- if user .Email == token {
1076
- potentialUsers = append (potentialUsers , user )
1077
- }
1078
- if user .Name == token {
1072
+
1073
+ if user .Email == token || user .Name == token {
1079
1074
potentialUsers = append (potentialUsers , user )
1080
1075
}
1081
1076
}
0 commit comments