Skip to content

Commit 7c187c9

Browse files
committed
fixup! feat: map user admin status from OIDC group claims
1 parent 20629d3 commit 7c187c9

1 file changed

Lines changed: 19 additions & 21 deletions

File tree

api/oidc.go

Lines changed: 19 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -445,15 +445,15 @@ func (a *OIDCAPI) resolveUser(idToken *oidc.IDTokenClaims, info *oidc.UserInfo)
445445
return nil, http.StatusInternalServerError, fmt.Errorf("database error: %w", err)
446446
}
447447

448-
admin, status, err := a.resolvePermission(idToken.Claims, info.Claims)
448+
hasAdminGroup, status, err := a.resolvePermission(idToken.Claims, info.Claims)
449449
if err != nil {
450450
log.Err(err).Str("oidc_id", oidcID).Interface("idTokenClaims", idToken.Claims).Interface("userinfoClaims", info.Claims).Msg("OIDC: resolve permission")
451451
return nil, status, err
452452
}
453453

454454
if user != nil {
455-
if admin != nil && user.Admin != *admin {
456-
user.Admin = *admin
455+
if len(a.GroupsAdmin) > 0 && user.Admin != hasAdminGroup {
456+
user.Admin = hasAdminGroup
457457
if err := a.DB.UpdateUser(user); err != nil {
458458
return nil, http.StatusInternalServerError, fmt.Errorf("database error: %w", err)
459459
}
@@ -476,12 +476,12 @@ func (a *OIDCAPI) resolveUser(idToken *oidc.IDTokenClaims, info *oidc.UserInfo)
476476
return nil, http.StatusInternalServerError, fmt.Errorf("database error: %w", err)
477477
}
478478
if byUsername != nil {
479-
return a.linkExistingUser(byUsername, oidcID, admin)
479+
return a.linkExistingUser(byUsername, oidcID, hasAdminGroup)
480480
}
481-
return a.registerUser(username, oidcID, admin)
481+
return a.registerUser(username, oidcID, hasAdminGroup)
482482
}
483483

484-
func (a *OIDCAPI) linkExistingUser(user *model.User, oidcID string, admin *bool) (*model.User, int, error) {
484+
func (a *OIDCAPI) linkExistingUser(user *model.User, oidcID string, hasAdminGroup bool) (*model.User, int, error) {
485485
if !a.LinkByUsername {
486486
log.Warn().Str("oidc_id", oidcID).Str("username", user.Name).Msgf("OIDC login rejected: a local user with the username already exists and %s is disabled", config.EnvOIDCLinkByUsername)
487487
return nil, http.StatusForbidden, fmt.Errorf("a local user with the username %s already exists and linking by username is disabled", user.Name)
@@ -491,8 +491,8 @@ func (a *OIDCAPI) linkExistingUser(user *model.User, oidcID string, admin *bool)
491491
return nil, http.StatusForbidden, fmt.Errorf("the user %s is already bound to a different OIDC identity", user.Name)
492492
}
493493
user.OIDCID = &oidcID
494-
if admin != nil {
495-
user.Admin = *admin
494+
if len(a.GroupsAdmin) > 0 {
495+
user.Admin = hasAdminGroup
496496
}
497497
if err := a.DB.UpdateUser(user); err != nil {
498498
return nil, http.StatusInternalServerError, fmt.Errorf("failed to bind user to OIDC identity: %w", err)
@@ -501,7 +501,7 @@ func (a *OIDCAPI) linkExistingUser(user *model.User, oidcID string, admin *bool)
501501
return user, 0, nil
502502
}
503503

504-
func (a *OIDCAPI) registerUser(username, oidcID string, admin *bool) (*model.User, int, error) {
504+
func (a *OIDCAPI) registerUser(username, oidcID string, hasAdminGroup bool) (*model.User, int, error) {
505505
if !a.AutoRegister {
506506
return nil, http.StatusForbidden, errors.New("user does not exist and auto-registration is disabled")
507507
}
@@ -511,8 +511,8 @@ func (a *OIDCAPI) registerUser(username, oidcID string, admin *bool) (*model.Use
511511
OIDCID: &oidcID,
512512
}
513513

514-
if admin != nil {
515-
user.Admin = *admin
514+
if len(a.GroupsAdmin) > 0 {
515+
user.Admin = hasAdminGroup
516516
}
517517

518518
if err := a.DB.CreateUser(user); err != nil {
@@ -550,14 +550,14 @@ func (a *OIDCAPI) popPendingSession(key string) (*pendingOIDCSession, bool) {
550550
return nil, false
551551
}
552552

553-
func (a *OIDCAPI) resolvePermission(idTokenClaims, userInfoClaims map[string]any) (*bool, int, error) {
553+
func (a *OIDCAPI) resolvePermission(idTokenClaims, userInfoClaims map[string]any) (bool, int, error) {
554554
if a.GroupsClaim == "" {
555-
return nil, 0, nil
555+
return false, 0, nil
556556
}
557557

558558
groupsRaw, ok := lookupClaim(a.GroupsClaim, idTokenClaims, userInfoClaims)
559559
if !ok {
560-
return nil, http.StatusInternalServerError, fmt.Errorf("groups claim %q is missing", a.GroupsClaim)
560+
return false, http.StatusInternalServerError, fmt.Errorf("groups claim %q is missing", a.GroupsClaim)
561561
}
562562

563563
var groups []string
@@ -568,25 +568,23 @@ func (a *OIDCAPI) resolvePermission(idTokenClaims, userInfoClaims map[string]any
568568
for _, groupRaw := range groupsRaw {
569569
group, ok := groupRaw.(string)
570570
if !ok {
571-
return nil, http.StatusInternalServerError, fmt.Errorf("groups claim %q contains a non-string element: %#v", a.GroupsClaim, groupRaw)
571+
return false, http.StatusInternalServerError, fmt.Errorf("groups claim %q contains a non-string element: %#v", a.GroupsClaim, groupRaw)
572572
}
573573
groups = append(groups, group)
574574
}
575575
case string:
576576
groups = append(groups, groupsRaw)
577577
default:
578-
return nil, http.StatusInternalServerError, fmt.Errorf("groups claim %q is not a string or string array: %#v", a.GroupsClaim, groupsRaw)
578+
return false, http.StatusInternalServerError, fmt.Errorf("groups claim %q is not a string or string array: %#v", a.GroupsClaim, groupsRaw)
579579
}
580580

581581
switch {
582582
case containsAny(a.GroupsAdmin, groups):
583-
t := true
584-
return &t, 0, nil
583+
return true, 0, nil
585584
case len(a.GroupsUser) == 0 || containsAny(a.GroupsUser, groups):
586-
f := false
587-
return &f, 0, nil
585+
return false, 0, nil
588586
default:
589-
return nil, http.StatusForbidden, errors.New("user is not in any allowed group")
587+
return false, http.StatusForbidden, errors.New("user is not in any allowed group")
590588
}
591589
}
592590

0 commit comments

Comments
 (0)