This is an automated email from the ASF dual-hosted git repository. markt pushed a commit to branch main in repository https://gitbox.apache.org/repos/asf/tomcat.git
commit 9a6bc65e50df5b8d138b5373e48575d043981c24 Author: Mark Thomas <ma...@apache.org> AuthorDate: Wed May 24 14:16:13 2023 +0100 Refactor WebDAV servlet escaping for XML. Add test case. --- .../apache/catalina/servlets/WebdavServlet.java | 22 ---------- java/org/apache/catalina/util/XMLWriter.java | 4 +- .../catalina/servlets/TestWebdavServlet.java | 48 ++++++++++++++++++++++ 3 files changed, 51 insertions(+), 23 deletions(-) diff --git a/java/org/apache/catalina/servlets/WebdavServlet.java b/java/org/apache/catalina/servlets/WebdavServlet.java index 096ed5a84f..38448532aa 100644 --- a/java/org/apache/catalina/servlets/WebdavServlet.java +++ b/java/org/apache/catalina/servlets/WebdavServlet.java @@ -52,7 +52,6 @@ import jakarta.servlet.http.HttpServletResponse; import org.apache.catalina.WebResource; import org.apache.catalina.connector.RequestFacade; import org.apache.catalina.util.DOMWriter; -import org.apache.catalina.util.URLEncoder; import org.apache.catalina.util.XMLWriter; import org.apache.tomcat.util.buf.HexUtils; import org.apache.tomcat.util.http.ConcurrentDateFormat; @@ -140,15 +139,6 @@ public class WebdavServlet extends DefaultServlet { // -------------------------------------------------------------- Constants - private static final URLEncoder URL_ENCODER_XML; - static { - URL_ENCODER_XML = (URLEncoder) URLEncoder.DEFAULT.clone(); - // Remove '&' from the safe character set since while it it permitted - // in a URI path, it is not permitted in XML and encoding it is a simple - // way to address this. - URL_ENCODER_XML.removeSafeCharacter('&'); - } - private static final String METHOD_PROPFIND = "PROPFIND"; private static final String METHOD_PROPPATCH = "PROPPATCH"; private static final String METHOD_MKCOL = "MKCOL"; @@ -390,18 +380,6 @@ public class WebdavServlet extends DefaultServlet { } - /** - * URL rewriter. - * - * @param path Path which has to be rewritten - * @return the rewritten path - */ - @Override - protected String rewriteUrl(String path) { - return URL_ENCODER_XML.encode(path, StandardCharsets.UTF_8); - } - - /** * Override the DefaultServlet implementation and only use the PathInfo. If * the ServletPath is non-null, it will be because the WebDAV servlet has diff --git a/java/org/apache/catalina/util/XMLWriter.java b/java/org/apache/catalina/util/XMLWriter.java index 019c4b98cd..8290b73943 100644 --- a/java/org/apache/catalina/util/XMLWriter.java +++ b/java/org/apache/catalina/util/XMLWriter.java @@ -19,6 +19,8 @@ package org.apache.catalina.util; import java.io.IOException; import java.io.Writer; +import org.apache.tomcat.util.security.Escape; + /** * XMLWriter helper class. */ @@ -199,7 +201,7 @@ public class XMLWriter { * @param text Text to append */ public void writeText(String text) { - buffer.append(text); + buffer.append(Escape.xml(text)); } diff --git a/test/org/apache/catalina/servlets/TestWebdavServlet.java b/test/org/apache/catalina/servlets/TestWebdavServlet.java index fdf61a0e11..0ce1683917 100644 --- a/test/org/apache/catalina/servlets/TestWebdavServlet.java +++ b/test/org/apache/catalina/servlets/TestWebdavServlet.java @@ -18,18 +18,25 @@ package org.apache.catalina.servlets; import java.io.File; import java.io.IOException; +import java.io.StringReader; import java.util.List; import java.util.Map; +import javax.xml.parsers.SAXParserFactory; + import jakarta.servlet.http.HttpServletResponse; import org.junit.Assert; import org.junit.Test; +import org.apache.catalina.Context; +import org.apache.catalina.Wrapper; +import org.apache.catalina.startup.SimpleHttpClient; import org.apache.catalina.startup.Tomcat; import org.apache.catalina.startup.TomcatBaseTest; import org.apache.tomcat.util.buf.ByteChunk; import org.apache.tomcat.websocket.server.WsContextListener; +import org.xml.sax.InputSource; public class TestWebdavServlet extends TomcatBaseTest { @@ -149,4 +156,45 @@ public class TestWebdavServlet extends TomcatBaseTest { return TomcatBaseTest.getUrl(path, out, resHead); } + /* + * Bug 66609 + */ + @Test + public void testDirectoryListing() throws Exception { + Tomcat tomcat = getTomcatInstance(); + + File appDir = new File("test/webapp"); + Context ctxt = tomcat.addContext("", appDir.getAbsolutePath()); + + Wrapper defaultServlet = Tomcat.addServlet(ctxt, "webdav", new WebdavServlet()); + defaultServlet.addInitParameter("listings", "true"); + + ctxt.addServletMappingDecoded("/*", "webdav"); + ctxt.addMimeMapping("html", "text/html"); + + tomcat.start(); + + Client client = new Client(); + client.setPort(getPort()); + client.setRequest(new String[] { "PROPFIND /bug66609/ HTTP/1.1" + SimpleHttpClient.CRLF + + "Host: localhost:" + getPort() + SimpleHttpClient.CRLF + + SimpleHttpClient.CRLF}); + client.connect(); + client.sendRequest(); + + client.setUseContentLength(true); + client.readResponse(true); + + // This will throw an exception if the XML is not valid + SAXParserFactory.newInstance().newSAXParser().getXMLReader().parse(new InputSource(new StringReader(client.getResponseBody()))); + } + + + private static final class Client extends SimpleHttpClient { + + @Override + public boolean isResponseBodyOK() { + return true; + } + } } --------------------------------------------------------------------- To unsubscribe, e-mail: dev-unsubscr...@tomcat.apache.org For additional commands, e-mail: dev-h...@tomcat.apache.org