diff --git a/src/wms/pom.xml b/src/wms/pom.xml
index 0319aef8c20..fc49a717c7d 100644
--- a/src/wms/pom.xml
+++ b/src/wms/pom.xml
@@ -15,6 +15,7 @@
org.geoserver
gs-wms
+ 2.25.2-georchestra
jar
Web Map Service Module
diff --git a/src/wms/src/main/java/org/geoserver/sld/SLDXmlRequestReader.java b/src/wms/src/main/java/org/geoserver/sld/SLDXmlRequestReader.java
index b07346e643b..c17b7c856aa 100644
--- a/src/wms/src/main/java/org/geoserver/sld/SLDXmlRequestReader.java
+++ b/src/wms/src/main/java/org/geoserver/sld/SLDXmlRequestReader.java
@@ -8,6 +8,7 @@
import java.io.IOException;
import java.io.Reader;
import java.util.Map;
+import org.geoserver.catalog.StyleHandler;
import org.geoserver.catalog.Styles;
import org.geoserver.ows.XmlRequestReader;
import org.geoserver.platform.ServiceException;
@@ -15,6 +16,8 @@
import org.geoserver.wms.WMS;
import org.geoserver.wms.map.ProcessStandaloneSLDVisitor;
import org.geotools.api.style.StyledLayerDescriptor;
+import org.geotools.util.Version;
+import org.xml.sax.EntityResolver;
/**
* Reads
@@ -37,9 +40,15 @@ public Object read(Object request, Reader reader, Map kvp) throws Exception {
}
try {
GetMapRequest getMap = (GetMapRequest) request;
+ String styleFormat = getMap.getStyleFormat();
+ StyleHandler styleParser = Styles.handler(styleFormat);
+
+ Version styleVersion = getMap.styleVersion();
+
+ EntityResolver entityResolver = wms.getCatalog().getResourcePool().getEntityResolver();
+
StyledLayerDescriptor sld =
- Styles.handler(getMap.getStyleFormat())
- .parse(reader, getMap.styleVersion(), null, null);
+ styleParser.parse(reader, styleVersion, null, entityResolver);
// process the sld
sld.accept(new ProcessStandaloneSLDVisitor(wms, getMap));
diff --git a/src/wms/src/test/java/org/geoserver/sld/SLDXmlRequestReaderTest.java b/src/wms/src/test/java/org/geoserver/sld/SLDXmlRequestReaderTest.java
new file mode 100644
index 00000000000..7ade57e5c74
--- /dev/null
+++ b/src/wms/src/test/java/org/geoserver/sld/SLDXmlRequestReaderTest.java
@@ -0,0 +1,72 @@
+/* (c) 2024 Open Source Geospatial Foundation - all rights reserved
+ * This code is licensed under the GPL 2.0 license, available at the root
+ * application directory.
+ */
+package org.geoserver.sld;
+
+import static org.hamcrest.CoreMatchers.containsString;
+import static org.hamcrest.MatcherAssert.assertThat;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
+
+import java.util.List;
+import java.util.Optional;
+import java.util.logging.Level;
+import org.geoserver.ows.XmlRequestReader;
+import org.geoserver.platform.GeoServerExtensions;
+import org.geoserver.wms.WMSTestSupport;
+import org.geotools.util.logging.Logging;
+import org.junit.Test;
+import org.springframework.mock.web.MockHttpServletResponse;
+
+/** Test suite for {@link SLDXmlRequestReader} */
+public class SLDXmlRequestReaderTest extends WMSTestSupport {
+
+ @Test
+ public void testExtensionPoint() {
+ List xmlReaders = GeoServerExtensions.extensions(XmlRequestReader.class);
+ Optional findExtension =
+ xmlReaders.stream()
+ .filter(SLDXmlRequestReader.class::isInstance)
+ .map(SLDXmlRequestReader.class::cast)
+ .findFirst();
+ assertTrue(findExtension.isPresent());
+ }
+
+ @Test
+ public void testGetMapSld() throws Exception {
+ String path =
+ "/wms?service=WMS&version=1.1.0&request=GetMap&width=100&height=100&format=image/png&bbox=-180,-90,180,90";
+ String body =
+ " \n"
+ + " \n"
+ + " wcs:World\n"
+ + " generic\n"
+ + " \n"
+ + " \n";
+ MockHttpServletResponse response = super.postAsServletResponse(path, body);
+ assertEquals(200, response.getStatus());
+ assertEquals("image/png", response.getContentType());
+ }
+
+ @Test
+ public void testGetMapSldXXE() throws Exception {
+ String path =
+ "/wms?service=WMS&version=1.1.0&request=GetMap&width=100&height=100&format=image/png&bbox=-180,-90,180,90";
+ String body =
+ "\n"
+ + "]>\n"
+ + "\n"
+ + "&xxe;\n"
+ + "";
+
+ Logging.getLogger("geoserver.ows").setLevel(Level.OFF);
+ MockHttpServletResponse response = super.postAsServletResponse(path, body);
+ assertEquals(200, response.getStatus());
+ super.assertContentType("application/vnd.ogc.se_xml", response);
+ assertThat(
+ response.getContentAsString(),
+ containsString("Entity resolution disallowed for file"));
+ }
+}