From e6366c183c596831a6420ba76c6c7cf77e28ffa6 Mon Sep 17 00:00:00 2001 From: Steven Bal Date: Tue, 16 Apr 2024 10:23:32 +0200 Subject: [PATCH 1/2] :white_check_mark: [#32] Add test for is_local_url --- testapp/settings.py | 2 +- tests/test_loaders.py | 7 +++++++ 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/testapp/settings.py b/testapp/settings.py index c7858bf..663b8f2 100644 --- a/testapp/settings.py +++ b/testapp/settings.py @@ -52,6 +52,6 @@ def get_db(): ROOT_URLCONF = "testapp.urls" -ALLOWED_HOSTS = ["testserver.com"] +ALLOWED_HOSTS = ["testserver.com", "testserver.local"] USE_TZ = False diff --git a/tests/test_loaders.py b/tests/test_loaders.py index 155b877..43bc872 100644 --- a/tests/test_loaders.py +++ b/tests/test_loaders.py @@ -29,3 +29,10 @@ def test_failed_not_json(): with pytest.raises(FetchJsonError): default_loader.load("https://example.com", ZaakType) + + +def test_is_local_url(): + assert default_loader.is_local_url("https://testserver.com/some-resource") + assert default_loader.is_local_url("https://testserver.local:443/some-resource") + assert default_loader.is_local_url("https://TESTSERVER.LOCAL:443/some-resource") + assert not default_loader.is_local_url("https://example.com/some-resource") From a670c4110b25669190e4599bc54617bb712e5287 Mon Sep 17 00:00:00 2001 From: Steven Bal Date: Tue, 16 Apr 2024 10:28:20 +0200 Subject: [PATCH 2/2] :bug: [#32] Remove port number before using validate_host --- django_loose_fk/loaders.py | 10 +++++++--- django_loose_fk/utils.py | 4 ++++ 2 files changed, 11 insertions(+), 3 deletions(-) diff --git a/django_loose_fk/loaders.py b/django_loose_fk/loaders.py index 9d50874..abee694 100644 --- a/django_loose_fk/loaders.py +++ b/django_loose_fk/loaders.py @@ -11,7 +11,7 @@ from django.utils.functional import LazyObject, empty from django.utils.module_loading import import_string -from .utils import get_resource_for_path +from .utils import get_resource_for_path, strip_port_number_and_lowercase from .virtual_models import get_model_instance SETTING = "DEFAULT_LOOSE_FK_LOADER" @@ -55,12 +55,16 @@ def is_local_url(self, url: str) -> bool: "break django-loose-fk's behaviour. You should use an explicit list.", RuntimeWarning, ) - return validate_host(parsed.netloc, allowed_hosts) + return validate_host( + strip_port_number_and_lowercase(parsed.netloc), allowed_hosts + ) if local_base_urls: return any(url.startswith(base_url) for base_url in local_base_urls) - return validate_host(parsed.netloc, allowed_hosts) + return validate_host( + strip_port_number_and_lowercase(parsed.netloc), allowed_hosts + ) def load_local_object(self, url: str, model: ModelBase) -> models.Model: parsed = urlparse(url) diff --git a/django_loose_fk/utils.py b/django_loose_fk/utils.py index 7131cc8..449d482 100644 --- a/django_loose_fk/utils.py +++ b/django_loose_fk/utils.py @@ -70,3 +70,7 @@ def get_subclasses(cls): for subclass in cls.__subclasses__(): yield from get_subclasses(subclass) yield subclass + + +def strip_port_number_and_lowercase(netloc: str) -> str: + return netloc.split(":")[0].lower()