Author: violetagg
Date: Fri Oct 16 11:16:35 2015
New Revision: 1708957

URL: http://svn.apache.org/viewvc?rev=1708957&view=rev
Log:
Extract common functionality from CsrfPreventionFilter to 
CsrfPreventionFilterBase

Added:
    tomcat/trunk/java/org/apache/catalina/filters/CsrfPreventionFilterBase.java 
  (with props)
Modified:
    tomcat/trunk/java/org/apache/catalina/filters/CsrfPreventionFilter.java

Modified: 
tomcat/trunk/java/org/apache/catalina/filters/CsrfPreventionFilter.java
URL: 
http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/catalina/filters/CsrfPreventionFilter.java?rev=1708957&r1=1708956&r2=1708957&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/catalina/filters/CsrfPreventionFilter.java 
(original)
+++ tomcat/trunk/java/org/apache/catalina/filters/CsrfPreventionFilter.java Fri 
Oct 16 11:16:35 2015
@@ -18,15 +18,12 @@ package org.apache.catalina.filters;
 
 import java.io.IOException;
 import java.io.Serializable;
-import java.security.SecureRandom;
 import java.util.HashSet;
 import java.util.LinkedHashMap;
 import java.util.Map;
-import java.util.Random;
 import java.util.Set;
 
 import javax.servlet.FilterChain;
-import javax.servlet.FilterConfig;
 import javax.servlet.ServletException;
 import javax.servlet.ServletRequest;
 import javax.servlet.ServletResponse;
@@ -35,9 +32,6 @@ import javax.servlet.http.HttpServletRes
 import javax.servlet.http.HttpServletResponseWrapper;
 import javax.servlet.http.HttpSession;
 
-import org.apache.juli.logging.Log;
-import org.apache.juli.logging.LogFactory;
-
 /**
  * Provides basic CSRF protection for a web application. The filter assumes
  * that:
@@ -48,44 +42,12 @@ import org.apache.juli.logging.LogFactor
  * returned to the client
  * </ul>
  */
-public class CsrfPreventionFilter extends FilterBase {
-
-    private static final Log log =
-        LogFactory.getLog(CsrfPreventionFilter.class);
-
-    private String randomClass = SecureRandom.class.getName();
-
-    private Random randomSource;
-
-    private int denyStatus = HttpServletResponse.SC_FORBIDDEN;
+public class CsrfPreventionFilter extends CsrfPreventionFilterBase {
 
     private final Set<String> entryPoints = new HashSet<>();
 
     private int nonceCacheSize = 5;
 
-    @Override
-    protected Log getLogger() {
-        return log;
-    }
-
-    /**
-     * Return response status code that is used to reject denied request.
-     */
-    public int getDenyStatus() {
-        return denyStatus;
-    }
-
-    /**
-     * Set response status code that is used to reject denied request. If none
-     * set, the default value of 403 will be used.
-     *
-     * @param denyStatus
-     *            HTTP status code
-     */
-    public void setDenyStatus(int denyStatus) {
-        this.denyStatus = denyStatus;
-    }
-
     /**
      * Entry points are URLs that will not be tested for the presence of a 
valid
      * nonce. They are used to provide a way to navigate back to a protected
@@ -116,39 +78,6 @@ public class CsrfPreventionFilter extend
         this.nonceCacheSize = nonceCacheSize;
     }
 
-    /**
-     * Specify the class to use to generate the nonces. Must be in instance of
-     * {@link Random}.
-     *
-     * @param randomClass   The name of the class to use
-     */
-    public void setRandomClass(String randomClass) {
-        this.randomClass = randomClass;
-    }
-
-    @Override
-    public void init(FilterConfig filterConfig) throws ServletException {
-        // Set the parameters
-        super.init(filterConfig);
-
-        try {
-            Class<?> clazz = Class.forName(randomClass);
-            randomSource = (Random) clazz.newInstance();
-        } catch (ClassNotFoundException e) {
-            ServletException se = new ServletException(sm.getString(
-                    "csrfPrevention.invalidRandomClass", randomClass), e);
-            throw se;
-        } catch (InstantiationException e) {
-            ServletException se = new ServletException(sm.getString(
-                    "csrfPrevention.invalidRandomClass", randomClass), e);
-            throw se;
-        } catch (IllegalAccessException e) {
-            ServletException se = new ServletException(sm.getString(
-                    "csrfPrevention.invalidRandomClass", randomClass), e);
-            throw se;
-        }
-    }
-
     @Override
     public void doFilter(ServletRequest request, ServletResponse response,
             FilterChain chain) throws IOException, ServletException {
@@ -187,7 +116,7 @@ public class CsrfPreventionFilter extend
 
                 if (nonceCache == null || previousNonce == null ||
                         !nonceCache.contains(previousNonce)) {
-                    res.sendError(denyStatus);
+                    res.sendError(getDenyStatus());
                     return;
                 }
             }
@@ -214,44 +143,6 @@ public class CsrfPreventionFilter extend
     }
 
 
-    @Override
-    protected boolean isConfigProblemFatal() {
-        return true;
-    }
-
-
-    /**
-     * Generate a once time token (nonce) for authenticating subsequent
-     * requests. This will also add the token to the session. The nonce
-     * generation is a simplified version of ManagerBase.generateSessionId().
-     *
-     */
-    protected String generateNonce() {
-        byte random[] = new byte[16];
-
-        // Render the result as a String of hexadecimal digits
-        StringBuilder buffer = new StringBuilder();
-
-        randomSource.nextBytes(random);
-
-        for (int j = 0; j < random.length; j++) {
-            byte b1 = (byte) ((random[j] & 0xf0) >> 4);
-            byte b2 = (byte) (random[j] & 0x0f);
-            if (b1 < 10) {
-                buffer.append((char) ('0' + b1));
-            } else {
-                buffer.append((char) ('A' + (b1 - 10)));
-            }
-            if (b2 < 10) {
-                buffer.append((char) ('0' + b2));
-            } else {
-                buffer.append((char) ('A' + (b2 - 10)));
-            }
-        }
-
-        return buffer.toString();
-    }
-
     protected static class CsrfResponseWrapper
             extends HttpServletResponseWrapper {
 

Added: 
tomcat/trunk/java/org/apache/catalina/filters/CsrfPreventionFilterBase.java
URL: 
http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/catalina/filters/CsrfPreventionFilterBase.java?rev=1708957&view=auto
==============================================================================
--- tomcat/trunk/java/org/apache/catalina/filters/CsrfPreventionFilterBase.java 
(added)
+++ tomcat/trunk/java/org/apache/catalina/filters/CsrfPreventionFilterBase.java 
Fri Oct 16 11:16:35 2015
@@ -0,0 +1,124 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.catalina.filters;
+
+import java.security.SecureRandom;
+import java.util.Random;
+
+import javax.servlet.FilterConfig;
+import javax.servlet.ServletException;
+import javax.servlet.http.HttpServletResponse;
+
+import org.apache.juli.logging.Log;
+import org.apache.juli.logging.LogFactory;
+
+public abstract class CsrfPreventionFilterBase extends FilterBase {
+
+    private static final Log log = 
LogFactory.getLog(CsrfPreventionFilterBase.class);
+
+    private String randomClass = SecureRandom.class.getName();
+
+    private Random randomSource;
+
+    private int denyStatus = HttpServletResponse.SC_FORBIDDEN;
+
+    @Override
+    protected Log getLogger() {
+        return log;
+    }
+
+    /**
+     * Return response status code that is used to reject denied request.
+     */
+    public int getDenyStatus() {
+        return denyStatus;
+    }
+
+    /**
+     * Set response status code that is used to reject denied request. If none
+     * set, the default value of 403 will be used.
+     *
+     * @param denyStatus
+     *            HTTP status code
+     */
+    public void setDenyStatus(int denyStatus) {
+        this.denyStatus = denyStatus;
+    }
+
+    /**
+     * Specify the class to use to generate the nonces. Must be in instance of
+     * {@link Random}.
+     *
+     * @param randomClass
+     *            The name of the class to use
+     */
+    public void setRandomClass(String randomClass) {
+        this.randomClass = randomClass;
+    }
+
+    @Override
+    public void init(FilterConfig filterConfig) throws ServletException {
+        // Set the parameters
+        super.init(filterConfig);
+
+        try {
+            Class<?> clazz = Class.forName(randomClass);
+            randomSource = (Random) clazz.newInstance();
+        } catch (ClassNotFoundException | InstantiationException | 
IllegalAccessException e) {
+            ServletException se = new ServletException(sm.getString(
+                    "csrfPrevention.invalidRandomClass", randomClass), e);
+            throw se;
+        }
+    }
+
+    @Override
+    protected boolean isConfigProblemFatal() {
+        return true;
+    }
+
+    /**
+     * Generate a once time token (nonce) for authenticating subsequent
+     * requests. The nonce generation is a simplified version of
+     * ManagerBase.generateSessionId().
+     */
+    protected String generateNonce() {
+        byte random[] = new byte[16];
+
+        // Render the result as a String of hexadecimal digits
+        StringBuilder buffer = new StringBuilder();
+
+        randomSource.nextBytes(random);
+
+        for (int j = 0; j < random.length; j++) {
+            byte b1 = (byte) ((random[j] & 0xf0) >> 4);
+            byte b2 = (byte) (random[j] & 0x0f);
+            if (b1 < 10) {
+                buffer.append((char) ('0' + b1));
+            } else {
+                buffer.append((char) ('A' + (b1 - 10)));
+            }
+            if (b2 < 10) {
+                buffer.append((char) ('0' + b2));
+            } else {
+                buffer.append((char) ('A' + (b2 - 10)));
+            }
+        }
+
+        return buffer.toString();
+    }
+
+}

Propchange: 
tomcat/trunk/java/org/apache/catalina/filters/CsrfPreventionFilterBase.java
------------------------------------------------------------------------------
    svn:eol-style = native



---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscr...@tomcat.apache.org
For additional commands, e-mail: dev-h...@tomcat.apache.org

Reply via email to