From 23ceb2a5ec524aac9e84c78ebd73fd7d330efedd Mon Sep 17 00:00:00 2001 From: shamoon <4887959+shamoon@users.noreply.github.com> Date: Sun, 3 Mar 2024 08:22:23 -0800 Subject: [PATCH] Fix: refactor base path settings, correct logout redirect (#5976) --- src/paperless/settings.py | 18 ++++++--- src/paperless/tests/test_settings.py | 56 ++++++++++++++++++++++++++++ 2 files changed, 69 insertions(+), 5 deletions(-) diff --git a/src/paperless/settings.py b/src/paperless/settings.py index 20117f19b..1c6113273 100644 --- a/src/paperless/settings.py +++ b/src/paperless/settings.py @@ -351,11 +351,19 @@ if __get_boolean("PAPERLESS_ENABLE_COMPRESSION", "yes"): # pragma: no cover ROOT_URLCONF = "paperless.urls" -FORCE_SCRIPT_NAME = os.getenv("PAPERLESS_FORCE_SCRIPT_NAME") -BASE_URL = (FORCE_SCRIPT_NAME or "") + "/" -LOGIN_URL = BASE_URL + "accounts/login/" -LOGIN_REDIRECT_URL = "/dashboard" -LOGOUT_REDIRECT_URL = os.getenv("PAPERLESS_LOGOUT_REDIRECT_URL") + +def _parse_base_paths() -> tuple[str, str, str, str, str]: + script_name = os.getenv("PAPERLESS_FORCE_SCRIPT_NAME") + base_url = (script_name or "") + "/" + login_url = base_url + "accounts/login/" + login_redirect_url = base_url + "dashboard" + logout_redirect_url = os.getenv("PAPERLESS_LOGOUT_REDIRECT_URL", base_url) + return script_name, base_url, login_url, login_redirect_url, logout_redirect_url + + +FORCE_SCRIPT_NAME, BASE_URL, LOGIN_URL, LOGIN_REDIRECT_URL, LOGOUT_REDIRECT_URL = ( + _parse_base_paths() +) WSGI_APPLICATION = "paperless.wsgi.application" ASGI_APPLICATION = "paperless.asgi.application" diff --git a/src/paperless/tests/test_settings.py b/src/paperless/tests/test_settings.py index 5b6335fd2..e27630ffa 100644 --- a/src/paperless/tests/test_settings.py +++ b/src/paperless/tests/test_settings.py @@ -5,6 +5,7 @@ from unittest import mock from celery.schedules import crontab +from paperless.settings import _parse_base_paths from paperless.settings import _parse_beat_schedule from paperless.settings import _parse_db_settings from paperless.settings import _parse_ignore_dates @@ -374,3 +375,58 @@ class TestPaperlessURLSettings(TestCase): self.assertIn(url, settings.CSRF_TRUSTED_ORIGINS) self.assertIn(url, settings.CORS_ALLOWED_ORIGINS) + + +class TestPathSettings(TestCase): + def test_default_paths(self): + """ + GIVEN: + - PAPERLESS_FORCE_SCRIPT_NAME is not set + WHEN: + - Settings are parsed + THEN: + - Paths are as expected + """ + base_paths = _parse_base_paths() + self.assertEqual(None, base_paths[0]) # FORCE_SCRIPT_NAME + self.assertEqual("/", base_paths[1]) # BASE_URL + self.assertEqual("/accounts/login/", base_paths[2]) # LOGIN_URL + self.assertEqual("/dashboard", base_paths[3]) # LOGIN_REDIRECT_URL + self.assertEqual("/", base_paths[4]) # LOGOUT_REDIRECT_URL + + @mock.patch("os.environ", {"PAPERLESS_FORCE_SCRIPT_NAME": "/paperless"}) + def test_subpath(self): + """ + GIVEN: + - PAPERLESS_FORCE_SCRIPT_NAME is set + WHEN: + - Settings are parsed + THEN: + - The path is returned and present in related settings + """ + base_paths = _parse_base_paths() + self.assertEqual("/paperless", base_paths[0]) # FORCE_SCRIPT_NAME + self.assertEqual("/paperless/", base_paths[1]) # BASE_URL + self.assertEqual("/paperless/accounts/login/", base_paths[2]) # LOGIN_URL + self.assertEqual("/paperless/dashboard", base_paths[3]) # LOGIN_REDIRECT_URL + self.assertEqual("/paperless/", base_paths[4]) # LOGOUT_REDIRECT_URL + + @mock.patch( + "os.environ", + { + "PAPERLESS_FORCE_SCRIPT_NAME": "/paperless", + "PAPERLESS_LOGOUT_REDIRECT_URL": "/foobar/", + }, + ) + def test_subpath_with_explicit_logout_url(self): + """ + GIVEN: + - PAPERLESS_FORCE_SCRIPT_NAME is set and so is PAPERLESS_LOGOUT_REDIRECT_URL + WHEN: + - Settings are parsed + THEN: + - The correct logout redirect URL is returned + """ + base_paths = _parse_base_paths() + self.assertEqual("/paperless/", base_paths[1]) # BASE_URL + self.assertEqual("/foobar/", base_paths[4]) # LOGOUT_REDIRECT_URL