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")); + } +}