From 49c08fa25b55ead3218df8317e273687aea88370 Mon Sep 17 00:00:00 2001 From: Mattia Giupponi Date: Wed, 25 Feb 2026 16:02:52 +0100 Subject: [PATCH 1/6] [Fixes #13990] Basic auth is not fully propagated into the WMS Service --- geonode/harvesting/harvesters/wms.py | 3 ++- geonode/services/serviceprocessors/wms.py | 6 ++++-- geonode/services/views.py | 7 ++++++- 3 files changed, 12 insertions(+), 4 deletions(-) diff --git a/geonode/harvesting/harvesters/wms.py b/geonode/harvesting/harvesters/wms.py index 8583bbadcbe..6ff634fb6dc 100644 --- a/geonode/harvesting/harvesters/wms.py +++ b/geonode/harvesting/harvesters/wms.py @@ -37,6 +37,7 @@ from geonode.base.models import Link, ResourceBase from geonode.layers.enumerations import GXP_PTYPES from geonode.resource.manager import resource_manager +from geonode.services.serviceprocessors import get_service_handler from geonode.thumbs.exceptions import ThumbnailError from .. import models @@ -151,7 +152,7 @@ def get_extra_config_schema(cls) -> typing.Optional[typing.Dict]: def get_wms_operations(cls, url, version=None) -> typing.Optional[typing.Dict]: operations = {} try: - _url, _parsed_service = WebMapService(url, version=version) + _parsed_service = get_service_handler(url, service_type="WMS") for _op in _parsed_service.operations: _methods = [] for _op_method in getattr(_op, "methods", []) if hasattr(_op, "methods") else _op.get("methods", []): diff --git a/geonode/services/serviceprocessors/wms.py b/geonode/services/serviceprocessors/wms.py index ea1f8be7b25..a5e2fe0b6a0 100644 --- a/geonode/services/serviceprocessors/wms.py +++ b/geonode/services/serviceprocessors/wms.py @@ -46,7 +46,7 @@ from ..enumerations import INDEXED from .. import models from .. import utils -from . import base +from . import base, get_service_handler logger = logging.getLogger(__name__) @@ -288,7 +288,9 @@ def __init__(self, url, geonode_service_id=None, *args, **kwargs): @property def parsed_service(self): cleaned_url, service, version, request = WmsServiceHandler.get_cleaned_url_params(self.ows_endpoint()) - _url, _parsed_service = WebMapService(cleaned_url.geturl(), version=version) + _parsed_service = get_service_handler( + cleaned_url.geturl(), service.type, service.id, username=service.username, password=service.get_password() + ) return _parsed_service def probe(self): diff --git a/geonode/services/views.py b/geonode/services/views.py index 67f054e8a1a..3493f2c15b2 100644 --- a/geonode/services/views.py +++ b/geonode/services/views.py @@ -97,7 +97,9 @@ def _get_service_handler(request, service): multiple Capabilities requests (this is a time saver on servers that feature many layers. """ - service_handler = get_service_handler(service.service_url, service.type, service.id) + service_handler = get_service_handler( + service.service_url, service.type, service.id, username=service.username, password=service.get_password() + ) if not service_handler.geonode_service_id: service_handler.geonode_service_id = service.id # commented out due to jsonserializer error, will be replaced with cache @@ -320,6 +322,9 @@ def remove_service(request, service_id): elif request.method == "POST": service.dataset_set.all().delete() # by deleting the harvester we delete also the service + is_cached = service_cache.get(service.base_url) + if is_cached: + service_cache.delete(service.base_url) service.harvester.delete() messages.add_message(request, messages.INFO, _(f"Service {service.title} has been deleted")) return HttpResponseRedirect(reverse("services")) From 6fd44d8325fe36ca59750b77be7588d11d65d5ad Mon Sep 17 00:00:00 2001 From: mattiagiupponi <51856725+mattiagiupponi@users.noreply.github.com> Date: Wed, 25 Feb 2026 16:11:29 +0100 Subject: [PATCH 2/6] Update geonode/services/serviceprocessors/wms.py Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> --- geonode/services/serviceprocessors/wms.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/geonode/services/serviceprocessors/wms.py b/geonode/services/serviceprocessors/wms.py index a5e2fe0b6a0..d4b7cb03045 100644 --- a/geonode/services/serviceprocessors/wms.py +++ b/geonode/services/serviceprocessors/wms.py @@ -289,7 +289,7 @@ def __init__(self, url, geonode_service_id=None, *args, **kwargs): def parsed_service(self): cleaned_url, service, version, request = WmsServiceHandler.get_cleaned_url_params(self.ows_endpoint()) _parsed_service = get_service_handler( - cleaned_url.geturl(), service.type, service.id, username=service.username, password=service.get_password() + cleaned_url.geturl(), service.type, service.id, username=service.username if service.needs_authentication else None, password=service.get_password() if service.needs_authentication else None ) return _parsed_service From 406848d6a4fae7e466c091e51e5edd4da4d52d08 Mon Sep 17 00:00:00 2001 From: mattiagiupponi <51856725+mattiagiupponi@users.noreply.github.com> Date: Wed, 25 Feb 2026 16:11:42 +0100 Subject: [PATCH 3/6] Update geonode/services/views.py Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> --- geonode/services/views.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/geonode/services/views.py b/geonode/services/views.py index 3493f2c15b2..df8203abc66 100644 --- a/geonode/services/views.py +++ b/geonode/services/views.py @@ -98,7 +98,7 @@ def _get_service_handler(request, service): feature many layers. """ service_handler = get_service_handler( - service.service_url, service.type, service.id, username=service.username, password=service.get_password() + service.service_url, service.type, service.id, username=service.username if service.needs_authentication else None, password=service.get_password() if service.needs_authentication else None ) if not service_handler.geonode_service_id: service_handler.geonode_service_id = service.id From 64a9cbe750ebfcb81d30d1a671e18cdb3bab1ca5 Mon Sep 17 00:00:00 2001 From: mattiagiupponi <51856725+mattiagiupponi@users.noreply.github.com> Date: Wed, 25 Feb 2026 16:11:59 +0100 Subject: [PATCH 4/6] Update geonode/services/views.py Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> --- geonode/services/views.py | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/geonode/services/views.py b/geonode/services/views.py index df8203abc66..af07cc29caf 100644 --- a/geonode/services/views.py +++ b/geonode/services/views.py @@ -322,9 +322,7 @@ def remove_service(request, service_id): elif request.method == "POST": service.dataset_set.all().delete() # by deleting the harvester we delete also the service - is_cached = service_cache.get(service.base_url) - if is_cached: - service_cache.delete(service.base_url) + service_cache.delete(service.base_url) service.harvester.delete() messages.add_message(request, messages.INFO, _(f"Service {service.title} has been deleted")) return HttpResponseRedirect(reverse("services")) From a19a3adf264307c0afffdf5cbc1ea1de2c618c28 Mon Sep 17 00:00:00 2001 From: Mattia Giupponi Date: Wed, 25 Feb 2026 16:15:54 +0100 Subject: [PATCH 5/6] [Fixes #13990] Basic auth is not fully propagated into the WMS Service --- geonode/services/serviceprocessors/wms.py | 6 +++++- geonode/services/views.py | 6 +++++- 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/geonode/services/serviceprocessors/wms.py b/geonode/services/serviceprocessors/wms.py index d4b7cb03045..2564ab2b430 100644 --- a/geonode/services/serviceprocessors/wms.py +++ b/geonode/services/serviceprocessors/wms.py @@ -289,7 +289,11 @@ def __init__(self, url, geonode_service_id=None, *args, **kwargs): def parsed_service(self): cleaned_url, service, version, request = WmsServiceHandler.get_cleaned_url_params(self.ows_endpoint()) _parsed_service = get_service_handler( - cleaned_url.geturl(), service.type, service.id, username=service.username if service.needs_authentication else None, password=service.get_password() if service.needs_authentication else None + cleaned_url.geturl(), + service.type, + service.id, + username=service.username if service.needs_authentication else None, + password=service.get_password() if service.needs_authentication else None, ) return _parsed_service diff --git a/geonode/services/views.py b/geonode/services/views.py index af07cc29caf..915615e274e 100644 --- a/geonode/services/views.py +++ b/geonode/services/views.py @@ -98,7 +98,11 @@ def _get_service_handler(request, service): feature many layers. """ service_handler = get_service_handler( - service.service_url, service.type, service.id, username=service.username if service.needs_authentication else None, password=service.get_password() if service.needs_authentication else None + service.service_url, + service.type, + service.id, + username=service.username if service.needs_authentication else None, + password=service.get_password() if service.needs_authentication else None, ) if not service_handler.geonode_service_id: service_handler.geonode_service_id = service.id From be6757c1612c8f055ba63bdf85dd2f9859f755f5 Mon Sep 17 00:00:00 2001 From: Mattia Giupponi Date: Fri, 27 Feb 2026 10:43:10 +0100 Subject: [PATCH 6/6] [Fixes #13990] Basic auth is not fully propagated into the WMS Service --- geonode/harvesting/harvesters/wms.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/geonode/harvesting/harvesters/wms.py b/geonode/harvesting/harvesters/wms.py index 6ff634fb6dc..8583bbadcbe 100644 --- a/geonode/harvesting/harvesters/wms.py +++ b/geonode/harvesting/harvesters/wms.py @@ -37,7 +37,6 @@ from geonode.base.models import Link, ResourceBase from geonode.layers.enumerations import GXP_PTYPES from geonode.resource.manager import resource_manager -from geonode.services.serviceprocessors import get_service_handler from geonode.thumbs.exceptions import ThumbnailError from .. import models @@ -152,7 +151,7 @@ def get_extra_config_schema(cls) -> typing.Optional[typing.Dict]: def get_wms_operations(cls, url, version=None) -> typing.Optional[typing.Dict]: operations = {} try: - _parsed_service = get_service_handler(url, service_type="WMS") + _url, _parsed_service = WebMapService(url, version=version) for _op in _parsed_service.operations: _methods = [] for _op_method in getattr(_op, "methods", []) if hasattr(_op, "methods") else _op.get("methods", []):