Author: markt
Date: Tue Feb 14 11:01:35 2017
New Revision: 1782947

URL: http://svn.apache.org/viewvc?rev=1782947&view=rev
Log:
Fix https://bz.apache.org/bugzilla/show_bug.cgi?id=60697
Correct OPTIONS response for custom servlets so TRACE is not included when it 
is disabled

Modified:
    tomcat/trunk/java/javax/servlet/http/HttpServlet.java
    tomcat/trunk/test/org/apache/catalina/connector/TestConnector.java
    tomcat/trunk/webapps/docs/changelog.xml

Modified: tomcat/trunk/java/javax/servlet/http/HttpServlet.java
URL: 
http://svn.apache.org/viewvc/tomcat/trunk/java/javax/servlet/http/HttpServlet.java?rev=1782947&r1=1782946&r2=1782947&view=diff
==============================================================================
--- tomcat/trunk/java/javax/servlet/http/HttpServlet.java (original)
+++ tomcat/trunk/java/javax/servlet/http/HttpServlet.java Tue Feb 14 11:01:35 
2017
@@ -20,6 +20,7 @@ import java.io.IOException;
 import java.io.OutputStreamWriter;
 import java.io.PrintWriter;
 import java.io.UnsupportedEncodingException;
+import java.lang.reflect.InvocationTargetException;
 import java.lang.reflect.Method;
 import java.text.MessageFormat;
 import java.util.Enumeration;
@@ -489,6 +490,18 @@ public abstract class HttpServlet extend
         boolean ALLOW_TRACE = true;
         boolean ALLOW_OPTIONS = true;
 
+        // Tomcat specific hack to see if TRACE is allowed
+        Class<?> clazz = null;
+        try {
+            clazz = 
Class.forName("org.apache.catalina.connector.RequestFacade");
+            Method getAllowTrace = clazz.getMethod("getAllowTrace", 
(Class<?>[]) null);
+            ALLOW_TRACE = ((Boolean) getAllowTrace.invoke(req, (Object[]) 
null)).booleanValue();
+        } catch (ClassNotFoundException | NoSuchMethodException | 
SecurityException |
+                IllegalAccessException | IllegalArgumentException | 
InvocationTargetException e) {
+            // Ignore. Not running on Tomcat. TRACE is always allowed.
+        }
+        // End of Tomcat specific hack
+
         for (int i=0; i<methods.length; i++) {
             Method m = methods[i];
 

Modified: tomcat/trunk/test/org/apache/catalina/connector/TestConnector.java
URL: 
http://svn.apache.org/viewvc/tomcat/trunk/test/org/apache/catalina/connector/TestConnector.java?rev=1782947&r1=1782946&r2=1782947&view=diff
==============================================================================
--- tomcat/trunk/test/org/apache/catalina/connector/TestConnector.java 
(original)
+++ tomcat/trunk/test/org/apache/catalina/connector/TestConnector.java Tue Feb 
14 11:01:35 2017
@@ -16,16 +16,25 @@
  */
 package org.apache.catalina.connector;
 
+import java.io.File;
 import java.net.SocketTimeoutException;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import javax.servlet.Servlet;
 
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertTrue;
 
+import org.junit.Assert;
 import org.junit.Test;
 
 import org.apache.catalina.Context;
 import org.apache.catalina.LifecycleException;
 import org.apache.catalina.Wrapper;
+import org.apache.catalina.servlets.DefaultServlet;
+import org.apache.catalina.servlets.WebdavServlet;
 import org.apache.catalina.startup.TesterServlet;
 import org.apache.catalina.startup.Tomcat;
 import org.apache.catalina.startup.TomcatBaseTest;
@@ -139,4 +148,76 @@ public class TestConnector extends Tomca
 
         c2.start();
     }
+
+
+    @Test
+    public void testTraceAllowedDefault() throws Exception {
+        doTestTrace(new DefaultServlet(), true);
+    }
+
+
+    @Test
+    public void testTraceNotAllowedDefault() throws Exception {
+        doTestTrace(new DefaultServlet(), false);
+    }
+
+
+    @Test
+    public void testTraceAllowedWebDav() throws Exception {
+        doTestTrace(new WebdavServlet(), true);
+    }
+
+
+    @Test
+    public void testTraceNotAllowedWebDav() throws Exception {
+        doTestTrace(new WebdavServlet(), false);
+    }
+
+
+    @Test
+    public void testTraceAllowedCustom() throws Exception {
+        doTestTrace(new TesterServlet(), true);
+    }
+
+
+    @Test
+    public void testTraceNotAllowedCustom() throws Exception {
+        doTestTrace(new TesterServlet(), false);
+    }
+
+
+    private void doTestTrace(Servlet servlet, boolean allowTrace) throws 
Exception {
+        Tomcat tomcat = getTomcatInstance();
+
+        File appDir = new File("test/webapp");
+        Context root = tomcat.addContext("", appDir.getAbsolutePath());
+        Tomcat.addServlet(root, "default", servlet);
+        root.addServletMappingDecoded("/", "default");
+
+        Connector connector = tomcat.getConnector();
+        connector.setAllowTrace(allowTrace);
+
+        tomcat.start();
+
+        ByteChunk bc = new ByteChunk();
+        Map<String,List<String>> respHeaders = new HashMap<>();
+        int rc = methodUrl("http://localhost:"; + getPort() + "/index.html",
+                bc, 30000, null, respHeaders, "OPTIONS");
+
+        assertEquals(200, rc);
+
+        boolean foundTrace = false;
+        for (String header : respHeaders.get("Allow")) {
+            if (header.contains("TRACE")) {
+                foundTrace = true;
+                break;
+            }
+        }
+
+        if (allowTrace) {
+            Assert.assertTrue(foundTrace);
+        } else {
+            Assert.assertFalse(foundTrace);
+        }
+    }
 }

Modified: tomcat/trunk/webapps/docs/changelog.xml
URL: 
http://svn.apache.org/viewvc/tomcat/trunk/webapps/docs/changelog.xml?rev=1782947&r1=1782946&r2=1782947&view=diff
==============================================================================
--- tomcat/trunk/webapps/docs/changelog.xml (original)
+++ tomcat/trunk/webapps/docs/changelog.xml Tue Feb 14 11:01:35 2017
@@ -84,6 +84,11 @@
         <code>AuthConfigFactory</code> is available. (markt)
       </fix>
       <fix>
+        <bug>60697</bug>: When HTTP TRACE requests are disabled on the
+        Connector, ensure that the HTTP OPTIONS response from custom servlets
+        does not include TRACE in the returned Allow header. (markt)
+      </fix>
+      <fix>
         <bug>60720</bug>: Replace "WWW-Authenticate" literal with static final
         AUTH_HEADER_NAME in SpnegoAuthenticator. Patch provided by Michael
         Osipov. (violetagg)



---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to