@@ -16,7 +16,6 @@ import (
1616 "github.com/gotify/server/v3/mode"
1717 "github.com/gotify/server/v3/model"
1818 "github.com/gotify/server/v3/test/testdb"
19- jmespath "github.com/jmespath-community/go-jmespath/pkg/api"
2019 "github.com/stretchr/testify/assert"
2120 "github.com/stretchr/testify/suite"
2221 "github.com/zitadel/oidc/v3/pkg/client/rp"
@@ -322,7 +321,9 @@ func (s *OIDCSuite) Test_ResolveUser_CustomClaim() {
322321 assert .NotNil (s .T (), user .OIDCID )
323322}
324323
325- func (s * OIDCSuite ) Test_ResolveUser_NoRoleExpression () {
324+ func (s * OIDCSuite ) Test_ResolveUser_NoRBACResolver () {
325+ s .a .GroupsClaim = "roles"
326+
326327 info := & oidc.UserInfo {Subject : "sub-1" , Claims : map [string ]any {"preferred_username" : "test-user" , "roles" : []string {"tester" }}}
327328 user , status , err := s .a .resolveUser (testIssuer , info )
328329
@@ -333,10 +334,23 @@ func (s *OIDCSuite) Test_ResolveUser_NoRoleExpression() {
333334 assert .NotNil (s .T (), user .OIDCID )
334335}
335336
336- func (s * OIDCSuite ) Test_ResolveUser_AdminRoleExpression () {
337- role , err := jmespath .Compile ("contains(roles[*], 'admin') && 'Admin' || 'User'" )
337+ func (s * OIDCSuite ) Test_ResolveUser_NoRBACClaim () {
338+ // canary to proof that this resolver is never actually used
339+ s .a .RBACResolver = NewStaticRBACResolver (model .RoleAdmin )
340+
341+ info := & oidc.UserInfo {Subject : "sub-1" , Claims : map [string ]any {"preferred_username" : "test-user" , "roles" : []string {"tester" }}}
342+ user , status , err := s .a .resolveUser (testIssuer , info )
343+
338344 assert .NoError (s .T (), err )
339- s .a .RoleExpression = role
345+ assert .Equal (s .T (), 0 , status )
346+ assert .Equal (s .T (), "test-user" , user .Name )
347+ assert .Equal (s .T (), false , user .Admin )
348+ assert .NotNil (s .T (), user .OIDCID )
349+ }
350+
351+ func (s * OIDCSuite ) Test_ResolveUser_AdminRBACResolver () {
352+ s .a .GroupsClaim = "roles"
353+ s .a .RBACResolver = NewSimpleAdminRBACResolver ("admin" )
340354
341355 info := & oidc.UserInfo {Subject : "sub-1" , Claims : map [string ]any {"preferred_username" : "admin-user" , "roles" : []string {"admin" }}}
342356 user , status , err := s .a .resolveUser (testIssuer , info )
@@ -348,10 +362,9 @@ func (s *OIDCSuite) Test_ResolveUser_AdminRoleExpression() {
348362 assert .NotNil (s .T (), user .OIDCID )
349363}
350364
351- func (s * OIDCSuite ) Test_ResolveUser_UserRoleExpression () {
352- role , err := jmespath .Compile ("contains(roles[*], 'admin') && 'Admin' || 'User'" )
353- assert .NoError (s .T (), err )
354- s .a .RoleExpression = role
365+ func (s * OIDCSuite ) Test_ResolveUser_UserRBACResolver () {
366+ s .a .GroupsClaim = "roles"
367+ s .a .RBACResolver = NewSimpleAdminRBACResolver ("admin" )
355368
356369 info := & oidc.UserInfo {Subject : "sub-1" , Claims : map [string ]any {"preferred_username" : "test-user" , "roles" : []string {"tester" }}}
357370 user , status , err := s .a .resolveUser (testIssuer , info )
@@ -363,10 +376,9 @@ func (s *OIDCSuite) Test_ResolveUser_UserRoleExpression() {
363376 assert .NotNil (s .T (), user .OIDCID )
364377}
365378
366- func (s * OIDCSuite ) Test_ResolveUser_ForbiddenRoleExpression () {
367- role , err := jmespath .Compile ("contains(roles[*], 'gotify') && 'User' || 'None'" )
368- assert .NoError (s .T (), err )
369- s .a .RoleExpression = role
379+ func (s * OIDCSuite ) Test_ResolveUser_ForbiddenRBACResolver () {
380+ s .a .GroupsClaim = "roles"
381+ s .a .RBACResolver = NewSimpleUserRBACResolver ("users" )
370382
371383 info := & oidc.UserInfo {Subject : "sub-1" , Claims : map [string ]any {"preferred_username" : "test-user" , "roles" : []string {"tester" }}}
372384 _ , status , err := s .a .resolveUser (testIssuer , info )
@@ -375,34 +387,31 @@ func (s *OIDCSuite) Test_ResolveUser_ForbiddenRoleExpression() {
375387 assert .Equal (s .T (), 403 , status )
376388}
377389
378- func (s * OIDCSuite ) Test_ResolveUser_InvalidRoleExpression () {
379- role , err := jmespath .Compile ("contains(roles[*], 'gotify') && 'User' || 'FooBar'" )
380- assert .NoError (s .T (), err )
381- s .a .RoleExpression = role
390+ func (s * OIDCSuite ) Test_ResolveUser_GroupsClaimMissing () {
391+ s .a .GroupsClaim = "roles"
392+ s .a .RBACResolver = NewSimpleUserRBACResolver ("users" )
382393
383- info := & oidc.UserInfo {Subject : "sub-1" , Claims : map [string ]any {"preferred_username" : "test-user" , "roles" : [] string { "tester" } }}
394+ info := & oidc.UserInfo {Subject : "sub-1" , Claims : map [string ]any {"preferred_username" : "test-user" }}
384395 _ , status , err := s .a .resolveUser (testIssuer , info )
385396
386- assert .EqualError (s .T (), err , `role claim mapping error: invalid role "FooBar" ` )
397+ assert .EqualError (s .T (), err , `role claim mapping error: groups claim "roles" is missing ` )
387398 assert .Equal (s .T (), 500 , status )
388399}
389400
390- func (s * OIDCSuite ) Test_ResolveUser_MalformedRoleExpression () {
391- role , err := jmespath .Compile ("contains(roles[*], 'gotify')" )
392- assert .NoError (s .T (), err )
393- s .a .RoleExpression = role
401+ func (s * OIDCSuite ) Test_ResolveUser_MalformedRBACResolver () {
402+ s .a .GroupsClaim = "admin"
403+ s .a .RBACResolver = NewSimpleUserRBACResolver ("users" )
394404
395- info := & oidc.UserInfo {Subject : "sub-1" , Claims : map [string ]any {"preferred_username" : "test-user" , "roles " : [] string { "tester" } }}
405+ info := & oidc.UserInfo {Subject : "sub-1" , Claims : map [string ]any {"preferred_username" : "test-user" , "admin " : true }}
396406 _ , status , err := s .a .resolveUser (testIssuer , info )
397407
398- assert .EqualError (s .T (), err , `role claim mapping error: role claim expression expected string , got bool` )
408+ assert .EqualError (s .T (), err , `role claim mapping error: RBAC resolver expected strings , got bool` )
399409 assert .Equal (s .T (), 500 , status )
400410}
401411
402- func (s * OIDCSuite ) Test_ResolveUser_PromoteRoleExpression () {
403- role , err := jmespath .Compile ("contains(roles[*], 'admin') && 'Admin' || 'User'" )
404- assert .NoError (s .T (), err )
405- s .a .RoleExpression = role
412+ func (s * OIDCSuite ) Test_ResolveUser_PromoteRBACResolver () {
413+ s .a .GroupsClaim = "roles"
414+ s .a .RBACResolver = NewSimpleAdminRBACResolver ("admin" )
406415
407416 oidcID := testIssuer + "#sub-1"
408417 s .db .CreateUser (& model.User {ID : 1 , Name : "alice" , OIDCID : & oidcID })
@@ -419,10 +428,9 @@ func (s *OIDCSuite) Test_ResolveUser_PromoteRoleExpression() {
419428 assert .False (s .T (), s .notified )
420429}
421430
422- func (s * OIDCSuite ) Test_ResolveUser_DemoteRoleExpression () {
423- role , err := jmespath .Compile ("contains(roles[*], 'admin') && 'Admin' || 'User'" )
424- assert .NoError (s .T (), err )
425- s .a .RoleExpression = role
431+ func (s * OIDCSuite ) Test_ResolveUser_DemoteRBACResolver () {
432+ s .a .GroupsClaim = "roles"
433+ s .a .RBACResolver = NewSimpleAdminRBACResolver ("admin" )
426434
427435 oidcID := testIssuer + "#sub-1"
428436 s .db .CreateUser (& model.User {ID : 1 , Name : "alice" , Admin : true , OIDCID : & oidcID })
0 commit comments