@@ -185,7 +185,7 @@ mod tests {
185185 let policy = default_policy ( ) ;
186186 assert ! (
187187 policy
188- . check( & id, "/openshell.v1.OpenShell/CreateProvider " )
188+ . check( & id, "/openshell.v1.OpenShell/ImportProviderProfiles " )
189189 . is_err( )
190190 ) ;
191191 }
@@ -408,7 +408,7 @@ mod tests {
408408 }
409409
410410 #[ test]
411- fn provider_refresh_methods_require_provider_scopes_and_admin_for_writes ( ) {
411+ fn provider_refresh_methods_require_provider_scopes_and_user_role ( ) {
412412 let policy = scoped_policy ( ) ;
413413 let reader = identity_with_roles_and_scopes ( & [ "openshell-user" ] , & [ "provider:read" ] ) ;
414414 assert ! (
@@ -417,37 +417,28 @@ mod tests {
417417 . is_ok( )
418418 ) ;
419419
420- let writer_without_admin =
421- identity_with_roles_and_scopes ( & [ "openshell-user" ] , & [ "provider:write" ] ) ;
422- let err = policy
423- . check (
424- & writer_without_admin ,
425- "/openshell.v1.OpenShell/ConfigureProviderRefresh " ,
426- )
427- . unwrap_err ( ) ;
428- assert_eq ! ( err . code ( ) , tonic :: Code :: PermissionDenied ) ;
429- assert ! ( err . message ( ) . contains ( "openshell-admin" ) ) ;
420+ // User with provider:write scope and user role can call write methods
421+ // (ownership enforcement happens in the handler, not RBAC).
422+ let user_writer = identity_with_roles_and_scopes ( & [ "openshell-user" ] , & [ "provider:write" ] ) ;
423+ for method in [
424+ "/openshell.v1.OpenShell/ConfigureProviderRefresh" ,
425+ "/openshell.v1.OpenShell/RotateProviderCredential " ,
426+ "/openshell.v1.OpenShell/DeleteProviderRefresh" ,
427+ ] {
428+ assert ! ( policy . check ( & user_writer , method ) . is_ok ( ) , "{method}" ) ;
429+ }
430430
431- let admin_without_scope =
432- identity_with_roles_and_scopes ( & [ "openshell-admin" ] , & [ "provider:read" ] ) ;
431+ // Without the write scope, user is still denied.
432+ let user_without_scope =
433+ identity_with_roles_and_scopes ( & [ "openshell-user" ] , & [ "provider:read" ] ) ;
433434 let err = policy
434435 . check (
435- & admin_without_scope ,
436- "/openshell.v1.OpenShell/RotateProviderCredential " ,
436+ & user_without_scope ,
437+ "/openshell.v1.OpenShell/ConfigureProviderRefresh " ,
437438 )
438439 . unwrap_err ( ) ;
439440 assert_eq ! ( err. code( ) , tonic:: Code :: PermissionDenied ) ;
440441 assert ! ( err. message( ) . contains( "provider:write" ) ) ;
441-
442- let admin_writer =
443- identity_with_roles_and_scopes ( & [ "openshell-admin" ] , & [ "provider:write" ] ) ;
444- for method in [
445- "/openshell.v1.OpenShell/ConfigureProviderRefresh" ,
446- "/openshell.v1.OpenShell/RotateProviderCredential" ,
447- "/openshell.v1.OpenShell/DeleteProviderRefresh" ,
448- ] {
449- assert ! ( policy. check( & admin_writer, method) . is_ok( ) , "{method}" ) ;
450- }
451442 }
452443
453444 #[ test]
@@ -493,10 +484,16 @@ mod tests {
493484 . check( & id, "/openshell.v1.OpenShell/GetProvider" )
494485 . is_ok( )
495486 ) ;
496- // admin methods still denied by role check
487+ // User can now create providers (ownership enforced in handler).
497488 assert ! (
498489 policy
499490 . check( & id, "/openshell.v1.OpenShell/CreateProvider" )
491+ . is_ok( )
492+ ) ;
493+ // Admin methods still denied by role check.
494+ assert ! (
495+ policy
496+ . check( & id, "/openshell.v1.OpenShell/ImportProviderProfiles" )
500497 . is_err( )
501498 ) ;
502499 }
0 commit comments