From bf0c085739beb42fb0a5c855215b18873cace3f9 Mon Sep 17 00:00:00 2001 From: lilly Date: Thu, 14 May 2026 16:41:16 +0200 Subject: [PATCH] api: properly compute authorization based on ccchh role --- api/src/dooris_api/__init__.py | 2 +- api/src/dooris_api/app.py | 7 ++++--- api/src/dooris_api/models.py | 9 +++++---- 3 files changed, 10 insertions(+), 8 deletions(-) diff --git a/api/src/dooris_api/__init__.py b/api/src/dooris_api/__init__.py index 57ed503..f587774 100644 --- a/api/src/dooris_api/__init__.py +++ b/api/src/dooris_api/__init__.py @@ -19,7 +19,7 @@ def main(): ) argp.add_argument( "--openid-scope", - default=os.environ.get("DOORIS_OPENID_SCOPE", "openid profile"), + default=os.environ.get("DOORIS_OPENID_SCOPE", "openid profile ccchh-roles"), help="The Keycloak OpenID isser to use for authentication", ) argp.add_argument( diff --git a/api/src/dooris_api/app.py b/api/src/dooris_api/app.py index 5b1eb65..9f8bedc 100644 --- a/api/src/dooris_api/app.py +++ b/api/src/dooris_api/app.py @@ -71,6 +71,7 @@ async def get_user_info( current_user.id_token.exp, UTC ), username=current_user.id_token.preferred_username, + ccchh_roles=current_user.ccchh_roles, ) @@ -117,7 +118,7 @@ async def login_init( response_class=RedirectResponse, status_code=302, ) -async def login_callback(req: Request, resp: Response, oidc_client: deps.OpenidClient): +async def login_callback(req: Request, resp: Response, oidc_client: deps.OpenidClient) -> str: # check that the user is currently in an authenticating state # these cookies are set by the login_init() view if ( @@ -167,7 +168,7 @@ async def login_callback(req: Request, resp: Response, oidc_client: deps.OpenidC ) async def logout( resp: Response, oidc_client: deps.OpenidClient, current_user: deps.CurrentUser -): +) -> str: deps.clear_auth_state(resp) return oidc_client.initiate_logout( RpInitiatedLogoutRequest( @@ -253,7 +254,7 @@ async def operate_lock( ) -> None: if not current_user.may_operate_locks: raise exceptions.HttpProblemException.forbidden_to_operate(req.url) - # TODO: Validate that the user is authorized + # find appropriate lock from ccujack for i_lock, lock_channels in ccujack.locks: if i_lock.identifier == lock_id: diff --git a/api/src/dooris_api/models.py b/api/src/dooris_api/models.py index eac83dd..d1574c4 100644 --- a/api/src/dooris_api/models.py +++ b/api/src/dooris_api/models.py @@ -33,17 +33,18 @@ class CurrentUser(BaseModel): @property def ccchh_roles(self) -> List[str]: - return [] + return getattr(self.id_token, "ccchh-roles", []) @property def may_operate_locks(self) -> bool: - return True + return "intern@" in self.ccchh_roles class UserStatus(BaseModel): is_authorized: bool - guaranteed_session_until: Optional[datetime] - username: Optional[str] + guaranteed_session_until: datetime + username: str + ccchh_roles: List[str] class LockStatus(BaseModel):