Skip to content

Commit f966774

Browse files
fix: check admin roles for approval/revoke access
1 parent 18c7a84 commit f966774

File tree

3 files changed

+273
-29
lines changed

3 files changed

+273
-29
lines changed

routers/admin.py

Lines changed: 72 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -111,15 +111,12 @@ def _resolve_group(service_id: str) -> GroupEnum | None:
111111
return None
112112

113113

114-
def _get_or_create_db_user(user_id: str,
115-
client: Auth0Client,
116-
db_session: Session) -> BiocommonsUser:
114+
def _get_admin_db_user(*, user_id: str, db_session: Session) -> BiocommonsUser:
117115
db_user = db_session.get(BiocommonsUser, user_id)
118116
if db_user is None:
119-
db_user = BiocommonsUser.get_or_create(
120-
auth0_id=user_id,
121-
db_session=db_session,
122-
auth0_client=client,
117+
raise HTTPException(
118+
status_code=404,
119+
detail=f"Admin user '{user_id}' is not registered in the portal database.",
123120
)
124121
return db_user
125122

@@ -161,6 +158,50 @@ def _membership_response() -> dict[str, object]:
161158
return {"status": "ok", "updated": True}
162159

163160

161+
def _assert_platform_admin_permissions(
162+
*, admin_user: SessionUser, platform: PlatformEnum, db_session: Session
163+
) -> None:
164+
platform_record = db_session.get(Platform, platform)
165+
if platform_record is None:
166+
raise HTTPException(
167+
status_code=404,
168+
detail=f"Platform '{platform.value}' is not configured",
169+
)
170+
171+
allowed_roles = {role.name for role in platform_record.admin_roles}
172+
if not allowed_roles:
173+
logger.warning(
174+
"Platform %s has no admin roles configured", platform_record.id.value
175+
)
176+
177+
user_roles = set(admin_user.access_token.biocommons_roles or [])
178+
if user_roles.isdisjoint(allowed_roles):
179+
raise HTTPException(
180+
status_code=403,
181+
detail="You do not have permission to manage this platform.",
182+
)
183+
184+
185+
def _assert_group_admin_permissions(
186+
*, admin_user: SessionUser, group_id: str, db_session: Session
187+
) -> None:
188+
group_record = db_session.get(BiocommonsGroup, group_id)
189+
if group_record is None:
190+
raise HTTPException(
191+
status_code=404,
192+
detail=f"Group '{group_id}' is not configured",
193+
)
194+
195+
if not group_record.admin_roles:
196+
logger.warning("Group %s has no admin roles configured", group_id)
197+
198+
if not group_record.user_is_admin(admin_user):
199+
raise HTTPException(
200+
status_code=403,
201+
detail="You do not have permission to manage this group.",
202+
)
203+
204+
164205
def _approve_platform_membership(
165206
*,
166207
user_id: str,
@@ -473,9 +514,13 @@ def approve_platform_membership(user_id: Annotated[str, UserIdParam],
473514
approving_user: Annotated[SessionUser, Depends(get_current_user)],
474515
db_session: Annotated[Session, Depends(get_db_session)]):
475516
platform = _parse_platform_or_404(platform_id)
476-
admin_record = _get_or_create_db_user(
517+
_assert_platform_admin_permissions(
518+
admin_user=approving_user,
519+
platform=platform,
520+
db_session=db_session,
521+
)
522+
admin_record = _get_admin_db_user(
477523
user_id=approving_user.access_token.sub,
478-
client=client,
479524
db_session=db_session,
480525
)
481526
_approve_platform_membership(
@@ -495,9 +540,13 @@ def revoke_platform_membership(user_id: Annotated[str, UserIdParam],
495540
revoking_user: Annotated[SessionUser, Depends(get_current_user)],
496541
db_session: Annotated[Session, Depends(get_db_session)]):
497542
platform = _parse_platform_or_404(platform_id)
498-
admin_record = _get_or_create_db_user(
543+
_assert_platform_admin_permissions(
544+
admin_user=revoking_user,
545+
platform=platform,
546+
db_session=db_session,
547+
)
548+
admin_record = _get_admin_db_user(
499549
user_id=revoking_user.access_token.sub,
500-
client=client,
501550
db_session=db_session,
502551
)
503552
_revoke_platform_membership(
@@ -517,9 +566,13 @@ def approve_group_membership(user_id: Annotated[str, UserIdParam],
517566
approving_user: Annotated[SessionUser, Depends(get_current_user)],
518567
db_session: Annotated[Session, Depends(get_db_session)]):
519568
group = _parse_group_or_404(group_id)
520-
admin_record = _get_or_create_db_user(
569+
_assert_group_admin_permissions(
570+
admin_user=approving_user,
571+
group_id=group.value,
572+
db_session=db_session,
573+
)
574+
admin_record = _get_admin_db_user(
521575
user_id=approving_user.access_token.sub,
522-
client=client,
523576
db_session=db_session,
524577
)
525578
_approve_group_membership(
@@ -540,9 +593,13 @@ def revoke_group_membership(user_id: Annotated[str, UserIdParam],
540593
revoking_user: Annotated[SessionUser, Depends(get_current_user)],
541594
db_session: Annotated[Session, Depends(get_db_session)]):
542595
group = _parse_group_or_404(group_id)
543-
admin_record = _get_or_create_db_user(
596+
_assert_group_admin_permissions(
597+
admin_user=revoking_user,
598+
group_id=group.value,
599+
db_session=db_session,
600+
)
601+
admin_record = _get_admin_db_user(
544602
user_id=revoking_user.access_token.sub,
545-
client=client,
546603
db_session=db_session,
547604
)
548605
_revoke_group_membership(

tests/conftest.py

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -192,7 +192,13 @@ def override_user():
192192

193193
@pytest.fixture
194194
def admin_user():
195-
token = AccessTokenPayloadFactory.build(biocommons_roles=["Admin"])
195+
token = AccessTokenPayloadFactory.build(
196+
biocommons_roles=[
197+
"Admin",
198+
"biocommons/role/galaxy/admin",
199+
"biocommons/role/tsi/admin",
200+
]
201+
)
196202
return SessionUserFactory.build(access_token=token)
197203

198204

0 commit comments

Comments
 (0)