Skip to content

Commit a59beb9

Browse files
authored
Add support for async Authorizers (part 2) (#1374)
1 parent b462387 commit a59beb9

File tree

3 files changed

+17
-6
lines changed

3 files changed

+17
-6
lines changed

jupyter_server/services/api/handlers.py

+5-2
Original file line numberDiff line numberDiff line change
@@ -67,7 +67,7 @@ class IdentityHandler(APIHandler):
6767
"""Get the current user's identity model"""
6868

6969
@web.authenticated
70-
def get(self):
70+
async def get(self):
7171
"""Get the identity model."""
7272
permissions_json: str = self.get_argument("permissions", "")
7373
bad_permissions_msg = f'permissions should be a JSON dict of {{"resource": ["action",]}}, got {permissions_json!r}'
@@ -94,7 +94,10 @@ def get(self):
9494

9595
allowed = permissions[resource] = []
9696
for action in actions:
97-
if self.authorizer.is_authorized(self, user=user, resource=resource, action=action):
97+
authorized = await ensure_async(
98+
self.authorizer.is_authorized(self, user, action, resource)
99+
)
100+
if authorized:
98101
allowed.append(action)
99102

100103
identity: Dict[str, Any] = self.identity_provider.identity_model(user)

jupyter_server/services/events/handlers.py

+7-3
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
from typing import Any, Dict, Optional, cast
1010

1111
import jupyter_events.logger
12+
from jupyter_core.utils import ensure_async
1213
from tornado import web, websocket
1314

1415
from jupyter_server.auth.decorator import authorized
@@ -27,7 +28,7 @@ class SubscribeWebsocket(
2728

2829
auth_resource = AUTH_RESOURCE
2930

30-
def pre_get(self):
31+
async def pre_get(self):
3132
"""Handles authentication/authorization when
3233
attempting to subscribe to events emitted by
3334
Jupyter Server's eventbus.
@@ -39,12 +40,15 @@ def pre_get(self):
3940
raise web.HTTPError(403)
4041

4142
# authorize the user.
42-
if not self.authorizer.is_authorized(self, user, "execute", "events"):
43+
authorized = await ensure_async(
44+
self.authorizer.is_authorized(self, user, "execute", "events")
45+
)
46+
if not authorized:
4347
raise web.HTTPError(403)
4448

4549
async def get(self, *args, **kwargs):
4650
"""Get an event socket."""
47-
self.pre_get()
51+
await ensure_async(self.pre_get())
4852
res = super().get(*args, **kwargs)
4953
if res is not None:
5054
await res

jupyter_server/services/kernels/websocket.py

+5-1
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
# Copyright (c) Jupyter Development Team.
33
# Distributed under the terms of the Modified BSD License.
44

5+
from jupyter_core.utils import ensure_async
56
from tornado import web
67
from tornado.websocket import WebSocketHandler
78

@@ -40,7 +41,10 @@ async def pre_get(self):
4041
raise web.HTTPError(403)
4142

4243
# authorize the user.
43-
if not self.authorizer.is_authorized(self, user, "execute", "kernels"):
44+
authorized = await ensure_async(
45+
self.authorizer.is_authorized(self, user, "execute", "kernels")
46+
)
47+
if not authorized:
4448
raise web.HTTPError(403)
4549

4650
kernel = self.kernel_manager.get_kernel(self.kernel_id)

0 commit comments

Comments
 (0)