From aefc8de49a77c92e7704ba57fba3e3a01af5fe21 Mon Sep 17 00:00:00 2001 From: krassowski <5832902+krassowski@users.noreply.github.com> Date: Wed, 10 Apr 2024 11:03:33 +0100 Subject: [PATCH] Add @allow_unauthenticated decorators --- jupyterhub/singleuser/_decorator.py | 14 ++++++++++++++ jupyterhub/singleuser/extension.py | 6 ++++++ jupyterhub/singleuser/mixins.py | 6 ++++++ 3 files changed, 26 insertions(+) create mode 100644 jupyterhub/singleuser/_decorator.py diff --git a/jupyterhub/singleuser/_decorator.py b/jupyterhub/singleuser/_decorator.py new file mode 100644 index 00000000..71f8c89f --- /dev/null +++ b/jupyterhub/singleuser/_decorator.py @@ -0,0 +1,14 @@ +from typing import Any, Callable, TypeVar + +try: + from jupyter_server.auth.decorator import allow_unauthenticated +except ImportError: + FuncT = TypeVar("FuncT", bound=Callable[..., Any]) + + # if using an older jupyter-server version this can be a no-op, + # as these do not support marking endpoints anyways + def allow_unauthenticated(method: FuncT) -> FuncT: + return method + + +__all__ = ["allow_unauthenticated"] diff --git a/jupyterhub/singleuser/extension.py b/jupyterhub/singleuser/extension.py index dc9e5f36..e34e05fc 100644 --- a/jupyterhub/singleuser/extension.py +++ b/jupyterhub/singleuser/extension.py @@ -51,6 +51,7 @@ from jupyterhub.utils import ( url_path_join, ) +from ._decorator import allow_unauthenticated from ._disable_user_config import _disable_user_config SINGLEUSER_TEMPLATES_DIR = str(Path(__file__).parent.resolve().joinpath("templates")) @@ -68,6 +69,7 @@ def _exclude_home(path_list): class JupyterHubLogoutHandler(LogoutHandler): + @allow_unauthenticated def get(self): hub_auth = self.identity_provider.hub_auth # clear token stored in single-user cookie (set by hub_auth) @@ -95,6 +97,10 @@ class JupyterHubOAuthCallbackHandler(HubOAuthCallbackHandler): def initialize(self, hub_auth): self.hub_auth = hub_auth + @allow_unauthenticated + async def get(self): + return await super().get() + class JupyterHubIdentityProvider(IdentityProvider): """Identity Provider for JupyterHub OAuth diff --git a/jupyterhub/singleuser/mixins.py b/jupyterhub/singleuser/mixins.py index c08fda9d..8496a6e0 100755 --- a/jupyterhub/singleuser/mixins.py +++ b/jupyterhub/singleuser/mixins.py @@ -52,6 +52,7 @@ from ..utils import ( make_ssl_context, url_path_join, ) +from ._decorator import allow_unauthenticated from ._disable_user_config import _disable_user_config, _exclude_home # Authenticate requests with the Hub @@ -132,6 +133,7 @@ class JupyterHubLoginHandlerMixin: class JupyterHubLogoutHandlerMixin: + @allow_unauthenticated def get(self): self.settings['hub_auth'].clear_cookie(self) self.redirect( @@ -147,6 +149,10 @@ class OAuthCallbackHandlerMixin(HubOAuthCallbackHandler): def hub_auth(self): return self.settings['hub_auth'] + @allow_unauthenticated + async def get(self): + return await super().get() + # register new hub related command-line aliases aliases = {