diff --git a/src/ants_hub/api/views/ants.py b/src/ants_hub/api/views/ants.py index c16fd78..9a0ee18 100644 --- a/src/ants_hub/api/views/ants.py +++ b/src/ants_hub/api/views/ants.py @@ -44,7 +44,7 @@ def authenticate(func): def wrapper(request, *args, **kwargs): global AUTH_TOKEN, AUTH_TOKEN_TIME # pylint: disable=global-statement - if not request.user.is_authenticated: + if not hasattr(request, 'user') or not request.user.is_authenticated: header = request.headers.get('X-Hub-Rdv-Auth-Token', '') if not header: logger.warning('authentication failed, missing header X-HUB-RDV-AUTH-TOKEN') diff --git a/src/ants_hub/settings.py b/src/ants_hub/settings.py index 8d0baff..1b9399b 100644 --- a/src/ants_hub/settings.py +++ b/src/ants_hub/settings.py @@ -20,6 +20,15 @@ INSTALLED_APPS = [ ] MIDDLEWARE = [ +] + +SILENCED_SYSTEM_CHECKS = [ + 'admin.E408', + 'admin.E409', + 'admin.E410', +] + +ADMIN_MIDDLEWARE = [ 'django.middleware.security.SecurityMiddleware', 'django.contrib.sessions.middleware.SessionMiddleware', 'django.middleware.common.CommonMiddleware', diff --git a/src/ants_hub/urls.py b/src/ants_hub/urls.py index efffea3..80630d8 100644 --- a/src/ants_hub/urls.py +++ b/src/ants_hub/urls.py @@ -6,7 +6,7 @@ from django.conf import settings from django.urls import include, path, register_converter from django.utils.timezone import is_aware -from . import admin, views +from . import admin, urls_utils, views class IsoDatetimeConverter: @@ -28,7 +28,7 @@ register_converter(IsoDatetimeConverter, 'isodatetime') urlpatterns = [ path('', views.homepage), - path('admin/', admin.site.urls), + path('admin/', urls_utils.decorate_admin(admin.site.urls)), path('api/', include('ants_hub.api.urls')), path( 'rdv/-' diff --git a/src/ants_hub/urls_utils.py b/src/ants_hub/urls_utils.py new file mode 100644 index 0000000..7f127cf --- /dev/null +++ b/src/ants_hub/urls_utils.py @@ -0,0 +1,53 @@ +# ANTS-Hub - Copyright (C) Entr'ouvert + + +import importlib + +from django.conf import settings +from django.urls.resolvers import URLPattern, URLResolver +from django.utils.decorators import decorator_from_middleware + + +class DecoratedURLPattern(URLPattern): + def resolve(self, *args, **kwargs): + result = super().resolve(*args, **kwargs) + if result: + result.func = self._decorate_with(result.func) + return result + + +class DecoratedURLResolver(URLResolver): + def resolve(self, *args, **kwargs): + result = super().resolve(*args, **kwargs) + if result: + result.func = self._decorate_with(result.func) + return result + + +def decorated_includes(func, includes, *args, **kwargs): + urlconf_module, app_name, namespace = includes + + for item in urlconf_module: + if isinstance(item, URLResolver): + item.__class__ = DecoratedURLResolver + else: + item.__class__ = DecoratedURLPattern + item._decorate_with = func + + return urlconf_module, app_name, namespace + + +def decorate_admin(includes): + decorators = [] + for middleware_path in reversed(settings.ADMIN_MIDDLEWARE): + module_name, class_name = middleware_path.rsplit('.', 1) + module = importlib.import_module(module_name) + middleware_class = getattr(module, class_name) + decorators.append(decorator_from_middleware(middleware_class)) + + def decorator(func): + for deco in decorators: + func = deco(func) + return func + + return decorated_includes(decorator, includes) diff --git a/tests/settings.py b/tests/settings.py index c70b540..0ebbae8 100644 --- a/tests/settings.py +++ b/tests/settings.py @@ -1,3 +1,4 @@ # ANTS-Hub - Copyright (C) Entr'ouvert SECRET_KEY = 'abcd' +MIDDLEWARE += ADMIN_MIDDLEWARE # pylint: disable=undefined-variable