Author: remm Date: Fri Apr 21 04:04:05 2006 New Revision: 395849 URL: http://svn.apache.org/viewcvs?rev=395849&view=rev Log: - Remove pre 1.5 compatibility code, which is not used anymore as the new APIs require and use JDK 1.5+. I hope I didn't make any mistake merging the SSL code.
Removed: tomcat/tc6.0.x/trunk/java/org/apache/tomcat/util/compat/Jdk14Compat.java tomcat/tc6.0.x/trunk/java/org/apache/tomcat/util/compat/JdkCompat.java tomcat/tc6.0.x/trunk/java/org/apache/tomcat/util/net/jsse/JSSE13Factory.java tomcat/tc6.0.x/trunk/java/org/apache/tomcat/util/net/jsse/JSSE13SocketFactory.java tomcat/tc6.0.x/trunk/java/org/apache/tomcat/util/net/jsse/JSSE14Factory.java tomcat/tc6.0.x/trunk/java/org/apache/tomcat/util/net/jsse/JSSE14SocketFactory.java tomcat/tc6.0.x/trunk/java/org/apache/tomcat/util/net/jsse/JSSE14Support.java tomcat/tc6.0.x/trunk/java/org/apache/tomcat/util/net/jsse/JSSE15Factory.java tomcat/tc6.0.x/trunk/java/org/apache/tomcat/util/net/jsse/JSSE15SocketFactory.java Modified: tomcat/tc6.0.x/trunk/java/org/apache/catalina/connector/Response.java tomcat/tc6.0.x/trunk/java/org/apache/catalina/core/StandardContext.java tomcat/tc6.0.x/trunk/java/org/apache/catalina/loader/WebappClassLoader.java tomcat/tc6.0.x/trunk/java/org/apache/catalina/mbeans/DefaultContextMBean.java tomcat/tc6.0.x/trunk/java/org/apache/catalina/mbeans/GroupMBean.java tomcat/tc6.0.x/trunk/java/org/apache/catalina/mbeans/MemoryUserDatabaseMBean.java tomcat/tc6.0.x/trunk/java/org/apache/catalina/mbeans/NamingResourcesMBean.java tomcat/tc6.0.x/trunk/java/org/apache/catalina/mbeans/StandardContextMBean.java tomcat/tc6.0.x/trunk/java/org/apache/catalina/mbeans/UserMBean.java tomcat/tc6.0.x/trunk/java/org/apache/catalina/valves/ErrorReportValve.java tomcat/tc6.0.x/trunk/java/org/apache/catalina/valves/RequestFilterValve.java tomcat/tc6.0.x/trunk/java/org/apache/tomcat/util/net/jsse/JSSEFactory.java tomcat/tc6.0.x/trunk/java/org/apache/tomcat/util/net/jsse/JSSEImplementation.java tomcat/tc6.0.x/trunk/java/org/apache/tomcat/util/net/jsse/JSSESocketFactory.java tomcat/tc6.0.x/trunk/java/org/apache/tomcat/util/net/jsse/JSSESupport.java Modified: tomcat/tc6.0.x/trunk/java/org/apache/catalina/connector/Response.java URL: http://svn.apache.org/viewcvs/tomcat/tc6.0.x/trunk/java/org/apache/catalina/connector/Response.java?rev=395849&r1=395848&r2=395849&view=diff ============================================================================== --- tomcat/tc6.0.x/trunk/java/org/apache/catalina/connector/Response.java (original) +++ tomcat/tc6.0.x/trunk/java/org/apache/catalina/connector/Response.java Fri Apr 21 04:04:05 2006 @@ -40,17 +40,16 @@ import org.apache.catalina.Context; import org.apache.catalina.Session; import org.apache.catalina.Wrapper; +import org.apache.catalina.security.SecurityUtil; import org.apache.catalina.util.CharsetMapper; import org.apache.catalina.util.DateTool; import org.apache.catalina.util.StringManager; -import org.apache.catalina.security.SecurityUtil; import org.apache.tomcat.util.buf.CharChunk; import org.apache.tomcat.util.buf.UEncoder; import org.apache.tomcat.util.http.FastHttpDateFormat; import org.apache.tomcat.util.http.MimeHeaders; import org.apache.tomcat.util.http.ServerCookie; import org.apache.tomcat.util.net.URL; -import org.apache.tomcat.util.compat.JdkCompat; /** * Wrapper object for the Coyote response. @@ -80,12 +79,6 @@ /** - * JDK compatibility support - */ - private static final JdkCompat jdkCompat = JdkCompat.getJdkCompat(); - - - /** * Descriptive information about this Response implementation. */ protected static final String info = @@ -1477,7 +1470,7 @@ } catch (PrivilegedActionException pae){ IllegalArgumentException iae = new IllegalArgumentException(location); - jdkCompat.chainException(iae, pae.getException()); + iae.initCause(pae.getException()); throw iae; } } else { @@ -1490,7 +1483,7 @@ } catch (IOException e) { IllegalArgumentException iae = new IllegalArgumentException(location); - jdkCompat.chainException(iae, e); + iae.initCause(e); throw iae; } Modified: tomcat/tc6.0.x/trunk/java/org/apache/catalina/core/StandardContext.java URL: http://svn.apache.org/viewcvs/tomcat/tc6.0.x/trunk/java/org/apache/catalina/core/StandardContext.java?rev=395849&r1=395848&r2=395849&view=diff ============================================================================== --- tomcat/tc6.0.x/trunk/java/org/apache/catalina/core/StandardContext.java (original) +++ tomcat/tc6.0.x/trunk/java/org/apache/catalina/core/StandardContext.java Fri Apr 21 04:04:05 2006 @@ -97,7 +97,6 @@ import org.apache.naming.resources.FileDirContext; import org.apache.naming.resources.ProxyDirContext; import org.apache.naming.resources.WARDirContext; -import org.apache.tomcat.util.compat.JdkCompat; import org.apache.tomcat.util.modeler.Registry; /** @@ -140,12 +139,6 @@ */ private static final String info = "org.apache.catalina.core.StandardContext/1.0"; - - - /** - * JDK compatibility support - */ - private static final JdkCompat jdkCompat = JdkCompat.getJdkCompat(); /** Modified: tomcat/tc6.0.x/trunk/java/org/apache/catalina/loader/WebappClassLoader.java URL: http://svn.apache.org/viewcvs/tomcat/tc6.0.x/trunk/java/org/apache/catalina/loader/WebappClassLoader.java?rev=395849&r1=395848&r2=395849&view=diff ============================================================================== --- tomcat/tc6.0.x/trunk/java/org/apache/catalina/loader/WebappClassLoader.java (original) +++ tomcat/tc6.0.x/trunk/java/org/apache/catalina/loader/WebappClassLoader.java Fri Apr 21 04:04:05 2006 @@ -62,7 +62,6 @@ import org.apache.naming.resources.Resource; import org.apache.naming.resources.ResourceAttributes; import org.apache.tomcat.util.IntrospectionUtils; -import org.apache.tomcat.util.compat.JdkCompat; /** * Specialized web application class loader. @@ -142,11 +141,6 @@ "javax.servlet.Servlet" // Servlet API }; - /** - * Jdk Compatibility Support. - */ - protected static JdkCompat jdkCompat = JdkCompat.getJdkCompat(); - /** * Set of package names which are not allowed to be loaded from a webapp * class loader without delegating first. @@ -548,7 +542,7 @@ } catch (MalformedURLException e) { IllegalArgumentException iae = new IllegalArgumentException ("Invalid repository: " + repository); - jdkCompat.chainException(iae, e); + iae.initCause(e); throw iae; } @@ -2300,7 +2294,14 @@ protected URL getURI(File file) throws MalformedURLException { - return jdkCompat.getURI(file); + File realFile = file; + try { + realFile = realFile.getCanonicalFile(); + } catch (IOException e) { + // Ignore + } + + return realFile.toURI().toURL(); } Modified: tomcat/tc6.0.x/trunk/java/org/apache/catalina/mbeans/DefaultContextMBean.java URL: http://svn.apache.org/viewcvs/tomcat/tc6.0.x/trunk/java/org/apache/catalina/mbeans/DefaultContextMBean.java?rev=395849&r1=395848&r2=395849&view=diff ============================================================================== --- tomcat/tc6.0.x/trunk/java/org/apache/catalina/mbeans/DefaultContextMBean.java (original) +++ tomcat/tc6.0.x/trunk/java/org/apache/catalina/mbeans/DefaultContextMBean.java Fri Apr 21 04:04:05 2006 @@ -28,7 +28,6 @@ import org.apache.catalina.deploy.ContextResource; import org.apache.catalina.deploy.ContextResourceLink; import org.apache.catalina.deploy.NamingResources; -import org.apache.tomcat.util.compat.JdkCompat; import org.apache.tomcat.util.modeler.BaseModelMBean; import org.apache.tomcat.util.modeler.ManagedBean; import org.apache.tomcat.util.modeler.Registry; @@ -64,15 +63,6 @@ } - // ----------------------------------------------------- Class Variables - - - /** - * JDK compatibility support - */ - private static final JdkCompat jdkCompat = JdkCompat.getJdkCompat(); - - // ----------------------------------------------------- Instance Variables @@ -116,7 +106,7 @@ } catch (MalformedObjectNameException e) { IllegalArgumentException iae = new IllegalArgumentException ("Cannot create object name for environment " + envs[i]); - jdkCompat.chainException(iae, e); + iae.initCause(e); throw iae; } } @@ -141,7 +131,7 @@ } catch (MalformedObjectNameException e) { IllegalArgumentException iae = new IllegalArgumentException ("Cannot create object name for resource " + resources[i]); - jdkCompat.chainException(iae, e); + iae.initCause(e); throw iae; } } @@ -166,7 +156,7 @@ } catch (MalformedObjectNameException e) { IllegalArgumentException iae = new IllegalArgumentException ("Cannot create object name for resource " + links[i]); - jdkCompat.chainException(iae, e); + iae.initCause(e); throw iae; } } Modified: tomcat/tc6.0.x/trunk/java/org/apache/catalina/mbeans/GroupMBean.java URL: http://svn.apache.org/viewcvs/tomcat/tc6.0.x/trunk/java/org/apache/catalina/mbeans/GroupMBean.java?rev=395849&r1=395848&r2=395849&view=diff ============================================================================== --- tomcat/tc6.0.x/trunk/java/org/apache/catalina/mbeans/GroupMBean.java (original) +++ tomcat/tc6.0.x/trunk/java/org/apache/catalina/mbeans/GroupMBean.java Fri Apr 21 04:04:05 2006 @@ -29,7 +29,6 @@ import org.apache.catalina.Group; import org.apache.catalina.Role; import org.apache.catalina.User; -import org.apache.tomcat.util.compat.JdkCompat; import org.apache.tomcat.util.modeler.BaseModelMBean; import org.apache.tomcat.util.modeler.ManagedBean; import org.apache.tomcat.util.modeler.Registry; @@ -65,15 +64,6 @@ } - // ----------------------------------------------------- Class Variables - - - /** - * JDK compatibility support - */ - private static final JdkCompat jdkCompat = JdkCompat.getJdkCompat(); - - // ----------------------------------------------------- Instance Variables @@ -117,7 +107,7 @@ } catch (MalformedObjectNameException e) { IllegalArgumentException iae = new IllegalArgumentException ("Cannot create object name for role " + role); - jdkCompat.chainException(iae, e); + iae.initCause(e); throw iae; } } @@ -144,7 +134,7 @@ } catch (MalformedObjectNameException e) { IllegalArgumentException iae = new IllegalArgumentException ("Cannot create object name for user " + user); - jdkCompat.chainException(iae, e); + iae.initCause(e); throw iae; } } Modified: tomcat/tc6.0.x/trunk/java/org/apache/catalina/mbeans/MemoryUserDatabaseMBean.java URL: http://svn.apache.org/viewcvs/tomcat/tc6.0.x/trunk/java/org/apache/catalina/mbeans/MemoryUserDatabaseMBean.java?rev=395849&r1=395848&r2=395849&view=diff ============================================================================== --- tomcat/tc6.0.x/trunk/java/org/apache/catalina/mbeans/MemoryUserDatabaseMBean.java (original) +++ tomcat/tc6.0.x/trunk/java/org/apache/catalina/mbeans/MemoryUserDatabaseMBean.java Fri Apr 21 04:04:05 2006 @@ -19,16 +19,17 @@ import java.util.ArrayList; import java.util.Iterator; -import javax.management.MalformedObjectNameException; + import javax.management.MBeanException; import javax.management.MBeanServer; +import javax.management.MalformedObjectNameException; import javax.management.ObjectName; import javax.management.RuntimeOperationsException; + import org.apache.catalina.Group; import org.apache.catalina.Role; import org.apache.catalina.User; import org.apache.catalina.UserDatabase; -import org.apache.tomcat.util.compat.JdkCompat; import org.apache.tomcat.util.modeler.BaseModelMBean; import org.apache.tomcat.util.modeler.ManagedBean; import org.apache.tomcat.util.modeler.Registry; @@ -64,15 +65,6 @@ } - // ----------------------------------------------------- Class Variables - - - /** - * JDK compatibility support - */ - private static final JdkCompat jdkCompat = JdkCompat.getJdkCompat(); - - // ----------------------------------------------------- Instance Variables @@ -188,7 +180,7 @@ } catch (Exception e) { IllegalArgumentException iae = new IllegalArgumentException ("Exception creating group " + group + " MBean"); - jdkCompat.chainException(iae, e); + iae.initCause(e); throw iae; } return (findGroup(groupname)); @@ -211,7 +203,7 @@ } catch (Exception e) { IllegalArgumentException iae = new IllegalArgumentException ("Exception creating role " + role + " MBean"); - jdkCompat.chainException(iae, e); + iae.initCause(e); throw iae; } return (findRole(rolename)); @@ -236,7 +228,7 @@ } catch (Exception e) { IllegalArgumentException iae = new IllegalArgumentException ("Exception creating user " + user + " MBean"); - jdkCompat.chainException(iae, e); + iae.initCause(e); throw iae; } return (findUser(username)); @@ -264,7 +256,7 @@ } catch (MalformedObjectNameException e) { IllegalArgumentException iae = new IllegalArgumentException ("Cannot create object name for group " + group); - jdkCompat.chainException(iae, e); + iae.initCause(e); throw iae; } @@ -291,7 +283,7 @@ } catch (MalformedObjectNameException e) { IllegalArgumentException iae = new IllegalArgumentException ("Cannot create object name for role " + role); - jdkCompat.chainException(iae, e); + iae.initCause(e); throw iae; } @@ -318,7 +310,7 @@ } catch (MalformedObjectNameException e) { IllegalArgumentException iae = new IllegalArgumentException ("Cannot create object name for user " + user); - jdkCompat.chainException(iae, e); + iae.initCause(e); throw iae; } @@ -343,7 +335,7 @@ } catch (Exception e) { IllegalArgumentException iae = new IllegalArgumentException ("Exception destroying group " + group + " MBean"); - jdkCompat.chainException(iae, e); + iae.initCause(e); throw iae; } @@ -368,7 +360,7 @@ } catch (Exception e) { IllegalArgumentException iae = new IllegalArgumentException ("Exception destroying role " + role + " MBean"); - jdkCompat.chainException(iae, e); + iae.initCause(e); throw iae; } @@ -393,7 +385,7 @@ } catch (Exception e) { IllegalArgumentException iae = new IllegalArgumentException ("Exception destroying user " + user + " MBean"); - jdkCompat.chainException(iae, e); + iae.initCause(e); throw iae; } Modified: tomcat/tc6.0.x/trunk/java/org/apache/catalina/mbeans/NamingResourcesMBean.java URL: http://svn.apache.org/viewcvs/tomcat/tc6.0.x/trunk/java/org/apache/catalina/mbeans/NamingResourcesMBean.java?rev=395849&r1=395848&r2=395849&view=diff ============================================================================== --- tomcat/tc6.0.x/trunk/java/org/apache/catalina/mbeans/NamingResourcesMBean.java (original) +++ tomcat/tc6.0.x/trunk/java/org/apache/catalina/mbeans/NamingResourcesMBean.java Fri Apr 21 04:04:05 2006 @@ -27,7 +27,6 @@ import org.apache.catalina.deploy.ContextResource; import org.apache.catalina.deploy.ContextResourceLink; import org.apache.catalina.deploy.NamingResources; -import org.apache.tomcat.util.compat.JdkCompat; import org.apache.tomcat.util.modeler.BaseModelMBean; import org.apache.tomcat.util.modeler.ManagedBean; import org.apache.tomcat.util.modeler.Registry; @@ -63,15 +62,6 @@ } - // ----------------------------------------------------- Class Variables - - - /** - * JDK compatibility support - */ - private static final JdkCompat jdkCompat = JdkCompat.getJdkCompat(); - - // ----------------------------------------------------- Instance Variables /** @@ -105,7 +95,7 @@ } catch (MalformedObjectNameException e) { IllegalArgumentException iae = new IllegalArgumentException ("Cannot create object name for environment " + envs[i]); - jdkCompat.chainException(iae, e); + iae.initCause(e); throw iae; } } @@ -131,7 +121,7 @@ } catch (MalformedObjectNameException e) { IllegalArgumentException iae = new IllegalArgumentException ("Cannot create object name for resource " + resources[i]); - jdkCompat.chainException(iae, e); + iae.initCause(e); throw iae; } } @@ -157,7 +147,7 @@ } catch (MalformedObjectNameException e) { IllegalArgumentException iae = new IllegalArgumentException ("Cannot create object name for resource " + resourceLinks[i]); - jdkCompat.chainException(iae, e); + iae.initCause(e); throw iae; } } Modified: tomcat/tc6.0.x/trunk/java/org/apache/catalina/mbeans/StandardContextMBean.java URL: http://svn.apache.org/viewcvs/tomcat/tc6.0.x/trunk/java/org/apache/catalina/mbeans/StandardContextMBean.java?rev=395849&r1=395848&r2=395849&view=diff ============================================================================== --- tomcat/tc6.0.x/trunk/java/org/apache/catalina/mbeans/StandardContextMBean.java (original) +++ tomcat/tc6.0.x/trunk/java/org/apache/catalina/mbeans/StandardContextMBean.java Fri Apr 21 04:04:05 2006 @@ -28,7 +28,6 @@ import org.apache.catalina.deploy.ContextResource; import org.apache.catalina.deploy.ContextResourceLink; import org.apache.catalina.deploy.NamingResources; -import org.apache.tomcat.util.compat.JdkCompat; import org.apache.tomcat.util.modeler.BaseModelMBean; import org.apache.tomcat.util.modeler.ManagedBean; import org.apache.tomcat.util.modeler.Registry; @@ -64,15 +63,6 @@ } - // ----------------------------------------------------- Class Variables - - - /** - * JDK compatibility support - */ - private static final JdkCompat jdkCompat = JdkCompat.getJdkCompat(); - - // ----------------------------------------------------- Instance Variables @@ -125,7 +115,7 @@ } catch (MalformedObjectNameException e) { IllegalArgumentException iae = new IllegalArgumentException ("Cannot create object name for environment " + envs[i]); - jdkCompat.chainException(iae, e); + iae.initCause(e); throw iae; } } @@ -150,7 +140,7 @@ } catch (MalformedObjectNameException e) { IllegalArgumentException iae = new IllegalArgumentException ("Cannot create object name for resource " + resources[i]); - jdkCompat.chainException(iae, e); + iae.initCause(e); throw iae; } } @@ -175,7 +165,7 @@ } catch (MalformedObjectNameException e) { IllegalArgumentException iae = new IllegalArgumentException ("Cannot create object name for resource " + links[i]); - jdkCompat.chainException(iae, e); + iae.initCause(e); throw iae; } } Modified: tomcat/tc6.0.x/trunk/java/org/apache/catalina/mbeans/UserMBean.java URL: http://svn.apache.org/viewcvs/tomcat/tc6.0.x/trunk/java/org/apache/catalina/mbeans/UserMBean.java?rev=395849&r1=395848&r2=395849&view=diff ============================================================================== --- tomcat/tc6.0.x/trunk/java/org/apache/catalina/mbeans/UserMBean.java (original) +++ tomcat/tc6.0.x/trunk/java/org/apache/catalina/mbeans/UserMBean.java Fri Apr 21 04:04:05 2006 @@ -29,7 +29,6 @@ import org.apache.catalina.Group; import org.apache.catalina.Role; import org.apache.catalina.User; -import org.apache.tomcat.util.compat.JdkCompat; import org.apache.tomcat.util.modeler.BaseModelMBean; import org.apache.tomcat.util.modeler.ManagedBean; import org.apache.tomcat.util.modeler.Registry; @@ -65,15 +64,6 @@ } - // ----------------------------------------------------- Class Variables - - - /** - * JDK compatibility support - */ - private static final JdkCompat jdkCompat = JdkCompat.getJdkCompat(); - - // ----------------------------------------------------- Instance Variables @@ -117,7 +107,7 @@ } catch (MalformedObjectNameException e) { IllegalArgumentException iae = new IllegalArgumentException ("Cannot create object name for group " + group); - jdkCompat.chainException(iae, e); + iae.initCause(e); throw iae; } } @@ -144,7 +134,7 @@ } catch (MalformedObjectNameException e) { IllegalArgumentException iae = new IllegalArgumentException ("Cannot create object name for role " + role); - jdkCompat.chainException(iae, e); + iae.initCause(e); throw iae; } } Modified: tomcat/tc6.0.x/trunk/java/org/apache/catalina/valves/ErrorReportValve.java URL: http://svn.apache.org/viewcvs/tomcat/tc6.0.x/trunk/java/org/apache/catalina/valves/ErrorReportValve.java?rev=395849&r1=395848&r2=395849&view=diff ============================================================================== --- tomcat/tc6.0.x/trunk/java/org/apache/catalina/valves/ErrorReportValve.java (original) +++ tomcat/tc6.0.x/trunk/java/org/apache/catalina/valves/ErrorReportValve.java Fri Apr 21 04:04:05 2006 @@ -33,7 +33,6 @@ import org.apache.catalina.util.ServerInfo; import org.apache.catalina.util.StringManager; import org.apache.tomcat.util.IntrospectionUtils; -import org.apache.tomcat.util.compat.JdkCompat; /** * <p>Implementation of a Valve that outputs HTML error pages.</p> @@ -220,8 +219,7 @@ if (throwable != null) { - String stackTrace = JdkCompat.getJdkCompat() - .getPartialServletStackTrace(throwable); + String stackTrace = getPartialServletStackTrace(throwable); sb.append("<p><b>"); sb.append(sm.getString("errorReportValve.exception")); sb.append("</b> <pre>"); @@ -229,8 +227,7 @@ sb.append("</pre></p>"); while (rootCause != null) { - stackTrace = JdkCompat.getJdkCompat() - .getPartialServletStackTrace(rootCause); + stackTrace = getPartialServletStackTrace(rootCause); sb.append("<p><b>"); sb.append(sm.getString("errorReportValve.rootCause")); sb.append("</b> <pre>"); @@ -280,5 +277,30 @@ } + + /** + * Print out a partial servlet stack trace (truncating at the last + * occurrence of javax.servlet.). + */ + protected String getPartialServletStackTrace(Throwable t) { + StringBuffer trace = new StringBuffer(); + trace.append(t.toString()).append('\n'); + StackTraceElement[] elements = t.getStackTrace(); + int pos = elements.length; + for (int i = 0; i < elements.length; i++) { + if ((elements[i].getClassName().startsWith + ("org.apache.catalina.core.ApplicationFilterChain")) + && (elements[i].getMethodName().equals("internalDoFilter"))) { + pos = i; + } + } + for (int i = 0; i < pos; i++) { + if (!(elements[i].getClassName().startsWith + ("org.apache.catalina.core."))) { + trace.append('\t').append(elements[i].toString()).append('\n'); + } + } + return trace.toString(); + } } Modified: tomcat/tc6.0.x/trunk/java/org/apache/catalina/valves/RequestFilterValve.java URL: http://svn.apache.org/viewcvs/tomcat/tc6.0.x/trunk/java/org/apache/catalina/valves/RequestFilterValve.java?rev=395849&r1=395848&r2=395849&view=diff ============================================================================== --- tomcat/tc6.0.x/trunk/java/org/apache/catalina/valves/RequestFilterValve.java (original) +++ tomcat/tc6.0.x/trunk/java/org/apache/catalina/valves/RequestFilterValve.java Fri Apr 21 04:04:05 2006 @@ -29,7 +29,6 @@ import org.apache.catalina.connector.Request; import org.apache.catalina.connector.Response; import org.apache.catalina.util.StringManager; -import org.apache.tomcat.util.compat.JdkCompat; /** * Implementation of a Valve that performs filtering based on comparing the @@ -73,12 +72,6 @@ /** - * JDK compatibility support - */ - private static final JdkCompat jdkCompat = JdkCompat.getJdkCompat(); - - - /** * The descriptive information related to this implementation. */ private static final String info = @@ -234,7 +227,7 @@ } catch (PatternSyntaxException e) { IllegalArgumentException iae = new IllegalArgumentException (sm.getString("requestFilterValve.syntax", pattern)); - jdkCompat.chainException(iae, e); + iae.initCause(e); throw iae; } list = list.substring(comma + 1); Modified: tomcat/tc6.0.x/trunk/java/org/apache/tomcat/util/net/jsse/JSSEFactory.java URL: http://svn.apache.org/viewcvs/tomcat/tc6.0.x/trunk/java/org/apache/tomcat/util/net/jsse/JSSEFactory.java?rev=395849&r1=395848&r2=395849&view=diff ============================================================================== --- tomcat/tc6.0.x/trunk/java/org/apache/tomcat/util/net/jsse/JSSEFactory.java (original) +++ tomcat/tc6.0.x/trunk/java/org/apache/tomcat/util/net/jsse/JSSEFactory.java Fri Apr 21 04:04:05 2006 @@ -17,6 +17,9 @@ package org.apache.tomcat.util.net.jsse; import java.net.Socket; + +import javax.net.ssl.SSLSocket; + import org.apache.tomcat.util.net.SSLSupport; import org.apache.tomcat.util.net.ServerSocketFactory; @@ -27,16 +30,20 @@ * @author Bill Barker */ -interface JSSEFactory { +public class JSSEFactory { /** * Returns the ServerSocketFactory to use. */ - public ServerSocketFactory getSocketFactory(); + public ServerSocketFactory getSocketFactory() { + return new JSSESocketFactory(); + } /** * returns the SSLSupport attached to this socket. */ - public SSLSupport getSSLSupport(Socket socket); + public SSLSupport getSSLSupport(Socket socket) { + return new JSSESupport((SSLSocket)socket); + } }; Modified: tomcat/tc6.0.x/trunk/java/org/apache/tomcat/util/net/jsse/JSSEImplementation.java URL: http://svn.apache.org/viewcvs/tomcat/tc6.0.x/trunk/java/org/apache/tomcat/util/net/jsse/JSSEImplementation.java?rev=395849&r1=395848&r2=395849&view=diff ============================================================================== --- tomcat/tc6.0.x/trunk/java/org/apache/tomcat/util/net/jsse/JSSEImplementation.java (original) +++ tomcat/tc6.0.x/trunk/java/org/apache/tomcat/util/net/jsse/JSSEImplementation.java Fri Apr 21 04:04:05 2006 @@ -18,7 +18,6 @@ import java.net.Socket; -import org.apache.tomcat.util.compat.JdkCompat; import org.apache.tomcat.util.net.SSLImplementation; import org.apache.tomcat.util.net.SSLSupport; import org.apache.tomcat.util.net.ServerSocketFactory; @@ -32,12 +31,6 @@ public class JSSEImplementation extends SSLImplementation { - static final String JSSE15Factory = - "org.apache.tomcat.util.net.jsse.JSSE15Factory"; - static final String JSSE14Factory = - "org.apache.tomcat.util.net.jsse.JSSE14Factory"; - static final String JSSE13Factory = - "org.apache.tomcat.util.net.jsse.JSSE13Support"; static final String SSLSocketClass = "javax.net.ssl.SSLSocket"; static org.apache.commons.logging.Log logger = @@ -48,27 +41,7 @@ public JSSEImplementation() throws ClassNotFoundException { // Check to see if JSSE is floating around somewhere Class.forName(SSLSocketClass); - if( JdkCompat.isJava15() ) { - try { - Class factcl = Class.forName(JSSE15Factory); - factory = (JSSEFactory)factcl.newInstance(); - } catch(Exception ex) { - if(logger.isDebugEnabled()) - logger.debug("Error getting factory: " + JSSE15Factory, ex); - } - } - if(factory == null && JdkCompat.isJava14() ) { - try { - Class factcl = Class.forName(JSSE14Factory); - factory = (JSSEFactory)factcl.newInstance(); - } catch(Exception ex) { - if(logger.isDebugEnabled()) { - logger.debug("Error getting factory: " + JSSE14Factory, ex); - } - } - } if(factory == null) { - factory = new JSSE13Factory(); - } + factory = new JSSEFactory(); } Modified: tomcat/tc6.0.x/trunk/java/org/apache/tomcat/util/net/jsse/JSSESocketFactory.java URL: http://svn.apache.org/viewcvs/tomcat/tc6.0.x/trunk/java/org/apache/tomcat/util/net/jsse/JSSESocketFactory.java?rev=395849&r1=395848&r2=395849&view=diff ============================================================================== --- tomcat/tc6.0.x/trunk/java/org/apache/tomcat/util/net/jsse/JSSESocketFactory.java (original) +++ tomcat/tc6.0.x/trunk/java/org/apache/tomcat/util/net/jsse/JSSESocketFactory.java Fri Apr 21 04:04:05 2006 @@ -26,12 +26,34 @@ import java.net.Socket; import java.net.SocketException; import java.security.KeyStore; +import java.security.SecureRandom; +import java.security.cert.CRL; +import java.security.cert.CRLException; +import java.security.cert.CertPathParameters; +import java.security.cert.CertStore; +import java.security.cert.CertStoreParameters; +import java.security.cert.CertificateException; +import java.security.cert.CertificateFactory; +import java.security.cert.CollectionCertStoreParameters; +import java.security.cert.PKIXBuilderParameters; +import java.security.cert.X509CertSelector; +import java.util.Collection; import java.util.Vector; +import javax.net.ssl.CertPathTrustManagerParameters; +import javax.net.ssl.KeyManager; +import javax.net.ssl.KeyManagerFactory; +import javax.net.ssl.ManagerFactoryParameters; +import javax.net.ssl.SSLContext; import javax.net.ssl.SSLException; import javax.net.ssl.SSLServerSocket; import javax.net.ssl.SSLServerSocketFactory; import javax.net.ssl.SSLSocket; +import javax.net.ssl.TrustManager; +import javax.net.ssl.TrustManagerFactory; +import javax.net.ssl.X509KeyManager; + +import org.apache.tomcat.util.res.StringManager; /* 1. Make the JSSE's jars available, either as an installed @@ -49,10 +71,15 @@ * @author Costin Manolache * @author Stefan Freyr Stefansson * @author EKR -- renamed to JSSESocketFactory + * @author Jan Luehe + * @author Bill Barker */ -public abstract class JSSESocketFactory - extends org.apache.tomcat.util.net.ServerSocketFactory -{ +public class JSSESocketFactory + extends org.apache.tomcat.util.net.ServerSocketFactory { + + private static StringManager sm = + StringManager.getManager("org.apache.tomcat.util.net.jsse.res"); + // defaults static String defaultProtocol = "TLS"; static String defaultAlgorithm = "SunX509"; @@ -68,7 +95,17 @@ protected String clientAuth = "false"; protected SSLServerSocketFactory sslProxy = null; protected String[] enabledCiphers; - + + /** + * Flag to state that we require client authentication. + */ + protected boolean requireClientAuth = false; + + /** + * Flag to state that we would like client authentication. + */ + protected boolean wantClientAuth = false; + public JSSESocketFactory () { } @@ -303,12 +340,214 @@ /** * Reads the keystore and initializes the SSL socket factory. - * - * Place holder method to initialize the KeyStore, etc. */ - abstract void init() throws IOException ; + void init() throws IOException { + try { - /* + String clientAuthStr = (String) attributes.get("clientauth"); + if("true".equalsIgnoreCase(clientAuthStr) || + "yes".equalsIgnoreCase(clientAuthStr)) { + requireClientAuth = true; + } else if("want".equalsIgnoreCase(clientAuthStr)) { + wantClientAuth = true; + } + + // SSL protocol variant (e.g., TLS, SSL v3, etc.) + String protocol = (String) attributes.get("protocol"); + if (protocol == null) { + protocol = defaultProtocol; + } + + // Certificate encoding algorithm (e.g., SunX509) + String algorithm = (String) attributes.get("algorithm"); + if (algorithm == null) { + algorithm = defaultAlgorithm; + } + + String keystoreType = (String) attributes.get("keystoreType"); + if (keystoreType == null) { + keystoreType = defaultKeystoreType; + } + + String trustAlgorithm = (String)attributes.get("truststoreAlgorithm"); + if( trustAlgorithm == null ) { + trustAlgorithm = algorithm; + } + // Create and init SSLContext + SSLContext context = SSLContext.getInstance(protocol); + context.init(getKeyManagers(keystoreType, algorithm, + (String) attributes.get("keyAlias")), + getTrustManagers(keystoreType, trustAlgorithm), + new SecureRandom()); + + // create proxy + sslProxy = context.getServerSocketFactory(); + + // Determine which cipher suites to enable + String requestedCiphers = (String)attributes.get("ciphers"); + enabledCiphers = getEnabledCiphers(requestedCiphers, + sslProxy.getSupportedCipherSuites()); + + } catch(Exception e) { + if( e instanceof IOException ) + throw (IOException)e; + throw new IOException(e.getMessage()); + } + } + + /** + * Gets the initialized key managers. + */ + protected KeyManager[] getKeyManagers(String keystoreType, + String algorithm, + String keyAlias) + throws Exception { + + KeyManager[] kms = null; + + String keystorePass = getKeystorePassword(); + + KeyStore ks = getKeystore(keystoreType, keystorePass); + if (keyAlias != null && !ks.isKeyEntry(keyAlias)) { + throw new IOException(sm.getString("jsse.alias_no_key_entry", keyAlias)); + } + + KeyManagerFactory kmf = KeyManagerFactory.getInstance(algorithm); + kmf.init(ks, keystorePass.toCharArray()); + + kms = kmf.getKeyManagers(); + if (keyAlias != null) { + if (JSSESocketFactory.defaultKeystoreType.equals(keystoreType)) { + keyAlias = keyAlias.toLowerCase(); + } + for(int i=0; i<kms.length; i++) { + kms[i] = new JSSEKeyManager((X509KeyManager)kms[i], keyAlias); + } + } + + return kms; + } + + /** + * Gets the intialized trust managers. + */ + protected TrustManager[] getTrustManagers(String keystoreType, String algorithm) + throws Exception { + if (attributes.get("truststoreAlgorithm") == null) { + // in 1.5, the Trust default isn't the same as the Key default. + algorithm = TrustManagerFactory.getDefaultAlgorithm(); + } + String crlf = (String) attributes.get("crlFile"); + + TrustManager[] tms = null; + + String truststoreType = (String) attributes.get("truststoreType"); + if (truststoreType == null) { + truststoreType = keystoreType; + } + KeyStore trustStore = getTrustStore(truststoreType); + if (trustStore != null) { + if (crlf == null) { + TrustManagerFactory tmf = TrustManagerFactory.getInstance(algorithm); + tmf.init(trustStore); + tms = tmf.getTrustManagers(); + } else { + TrustManagerFactory tmf = TrustManagerFactory.getInstance(algorithm); + CertPathParameters params = getParameters(algorithm, crlf, trustStore); + ManagerFactoryParameters mfp = new CertPathTrustManagerParameters(params); + tmf.init(mfp); + tms = tmf.getTrustManagers(); + } + } + + return tms; + } + + /** + * Return the initialization parameters for the TrustManager. + * Currently, only the default <code>PKIX</code> is supported. + * + * @param algorithm The algorithm to get parameters for. + * @param crlf The path to the CRL file. + * @param trustStore The configured TrustStore. + * @return The parameters including the CRLs and TrustStore. + */ + protected CertPathParameters getParameters(String algorithm, + String crlf, + KeyStore trustStore) + throws Exception { + CertPathParameters params = null; + if("PKIX".equalsIgnoreCase(algorithm)) { + PKIXBuilderParameters xparams = new PKIXBuilderParameters(trustStore, + new X509CertSelector()); + Collection crls = getCRLs(crlf); + CertStoreParameters csp = new CollectionCertStoreParameters(crls); + CertStore store = CertStore.getInstance("Collection", csp); + xparams.addCertStore(store); + xparams.setRevocationEnabled(true); + String trustLength = (String)attributes.get("trustMaxCertLength"); + if(trustLength != null) { + try { + xparams.setMaxPathLength(Integer.parseInt(trustLength)); + } catch(Exception ex) { + log.warn("Bad maxCertLength: "+trustLength); + } + } + + params = xparams; + } else { + throw new CRLException("CRLs not supported for type: "+algorithm); + } + return params; + } + + + /** + * Load the collection of CRLs. + * + */ + protected Collection<? extends CRL> getCRLs(String crlf) + throws IOException, CRLException, CertificateException { + + File crlFile = new File(crlf); + if( !crlFile.isAbsolute() ) { + crlFile = new File(System.getProperty("catalina.base"), crlf); + } + Collection<? extends CRL> crls = null; + InputStream is = null; + try { + CertificateFactory cf = CertificateFactory.getInstance("X.509"); + is = new FileInputStream(crlFile); + crls = cf.generateCRLs(is); + } catch(IOException iex) { + throw iex; + } catch(CRLException crle) { + throw crle; + } catch(CertificateException ce) { + throw ce; + } finally { + if(is != null) { + try{ + is.close(); + } catch(Exception ex) { + } + } + } + return crls; + } + + /** + * Set the SSL protocol variants to be enabled. + * @param socket the SSLServerSocket. + * @param protocols the protocols to use. + */ + protected void setEnabledProtocols(SSLServerSocket socket, String []protocols){ + if (protocols != null) { + socket.setEnabledProtocols(protocols); + } + } + + /** * Determines the SSL protocol variants to be enabled. * * @param socket The socket to get supported list from. @@ -318,16 +557,70 @@ * @return Array of SSL protocol variants to be enabled, or null if none of * the requested protocol variants are supported */ - abstract protected String[] getEnabledProtocols(SSLServerSocket socket, - String requestedProtocols); + protected String[] getEnabledProtocols(SSLServerSocket socket, + String requestedProtocols){ + String[] supportedProtocols = socket.getSupportedProtocols(); - /** - * Set the SSL protocol variants to be enabled. - * @param socket the SSLServerSocket. - * @param protocols the protocols to use. - */ - abstract protected void setEnabledProtocols(SSLServerSocket socket, - String [] protocols); + String[] enabledProtocols = null; + + if (requestedProtocols != null) { + Vector vec = null; + String protocol = requestedProtocols; + int index = requestedProtocols.indexOf(','); + if (index != -1) { + int fromIndex = 0; + while (index != -1) { + protocol = requestedProtocols.substring(fromIndex, index).trim(); + if (protocol.length() > 0) { + /* + * Check to see if the requested protocol is among the + * supported protocols, i.e., may be enabled + */ + for (int i=0; supportedProtocols != null + && i<supportedProtocols.length; i++) { + if (supportedProtocols[i].equals(protocol)) { + if (vec == null) { + vec = new Vector(); + } + vec.addElement(protocol); + break; + } + } + } + fromIndex = index+1; + index = requestedProtocols.indexOf(',', fromIndex); + } // while + protocol = requestedProtocols.substring(fromIndex); + } + + if (protocol != null) { + protocol = protocol.trim(); + if (protocol.length() > 0) { + /* + * Check to see if the requested protocol is among the + * supported protocols, i.e., may be enabled + */ + for (int i=0; supportedProtocols != null + && i<supportedProtocols.length; i++) { + if (supportedProtocols[i].equals(protocol)) { + if (vec == null) { + vec = new Vector(); + } + vec.addElement(protocol); + break; + } + } + } + } + + if (vec != null) { + enabledProtocols = new String[vec.size()]; + vec.copyInto(enabledProtocols); + } + } + + return enabledProtocols; + } /** * Configure Client authentication for this version of JSSE. The @@ -335,7 +628,13 @@ * versions of JSSE will treat 'want' as 'false'. * @param socket the SSLServerSocket */ - abstract protected void configureClientAuth(SSLServerSocket socket); + protected void configureClientAuth(SSLServerSocket socket){ + if (wantClientAuth){ + socket.setWantClientAuth(wantClientAuth); + } else { + socket.setNeedClientAuth(requireClientAuth); + } + } /** * Configure Client authentication for this version of JSSE. The @@ -343,7 +642,10 @@ * versions of JSSE will treat 'want' as 'false'. * @param socket the SSLSocket */ - abstract protected void configureClientAuth(SSLSocket socket); + protected void configureClientAuth(SSLSocket socket){ + // Per JavaDocs: SSLSockets returned from + // SSLServerSocket.accept() inherit this setting. + } /** * Configures the given SSL server socket with the requested cipher suites, Modified: tomcat/tc6.0.x/trunk/java/org/apache/tomcat/util/net/jsse/JSSESupport.java URL: http://svn.apache.org/viewcvs/tomcat/tc6.0.x/trunk/java/org/apache/tomcat/util/net/jsse/JSSESupport.java?rev=395849&r1=395848&r2=395849&view=diff ============================================================================== --- tomcat/tc6.0.x/trunk/java/org/apache/tomcat/util/net/jsse/JSSESupport.java (original) +++ tomcat/tc6.0.x/trunk/java/org/apache/tomcat/util/net/jsse/JSSESupport.java Fri Apr 21 04:04:05 2006 @@ -18,8 +18,14 @@ import java.io.ByteArrayInputStream; import java.io.IOException; +import java.io.InputStream; +import java.net.SocketException; +import java.security.cert.Certificate; import java.security.cert.CertificateFactory; +import javax.net.ssl.HandshakeCompletedEvent; +import javax.net.ssl.HandshakeCompletedListener; +import javax.net.ssl.SSLException; import javax.net.ssl.SSLSession; import javax.net.ssl.SSLSocket; import javax.security.cert.X509Certificate; @@ -41,14 +47,17 @@ */ class JSSESupport implements SSLSupport { + private static org.apache.commons.logging.Log log = - org.apache.commons.logging.LogFactory.getLog(JSSESupport.class); + org.apache.commons.logging.LogFactory.getLog(JSSESupport.class); protected SSLSocket ssl; + Listener listener = new Listener(); JSSESupport(SSLSocket sock){ ssl=sock; + sock.addHandshakeCompletedListener(listener); } public String getCipherSuite() throws IOException { @@ -64,41 +73,44 @@ return getPeerCertificateChain(false); } - protected java.security.cert.X509Certificate [] - getX509Certificates(SSLSession session) throws IOException { - X509Certificate jsseCerts[] = null; - try{ - jsseCerts = session.getPeerCertificateChain(); - } catch (Throwable ex){ - // Get rid of the warning in the logs when no Client-Cert is - // available + protected java.security.cert.X509Certificate [] getX509Certificates(SSLSession session) + throws IOException { + Certificate [] certs=null; + try { + certs = session.getPeerCertificates(); + } catch( Throwable t ) { + log.debug("Error getting client certs",t); + return null; + } + if( certs==null ) return null; + + java.security.cert.X509Certificate [] x509Certs = + new java.security.cert.X509Certificate[certs.length]; + for(int i=0; i < certs.length; i++) { + if (certs[i] instanceof java.security.cert.X509Certificate ) { + // always currently true with the JSSE 1.1.x + x509Certs[i] = (java.security.cert.X509Certificate) certs[i]; + } else { + try { + byte [] buffer = certs[i].getEncoded(); + CertificateFactory cf = + CertificateFactory.getInstance("X.509"); + ByteArrayInputStream stream = + new ByteArrayInputStream(buffer); + x509Certs[i] = (java.security.cert.X509Certificate) cf.generateCertificate(stream); + } catch(Exception ex) { + log.info("Error translating cert " + certs[i], ex); + return null; + } + } + if(log.isTraceEnabled()) + log.trace("Cert #" + i + " = " + x509Certs[i]); + } + if(x509Certs.length < 1) + return null; + return x509Certs; } - if(jsseCerts == null) - jsseCerts = new X509Certificate[0]; - java.security.cert.X509Certificate [] x509Certs = - new java.security.cert.X509Certificate[jsseCerts.length]; - for (int i = 0; i < x509Certs.length; i++) { - try { - byte buffer[] = jsseCerts[i].getEncoded(); - CertificateFactory cf = - CertificateFactory.getInstance("X.509"); - ByteArrayInputStream stream = - new ByteArrayInputStream(buffer); - x509Certs[i] = (java.security.cert.X509Certificate) - cf.generateCertificate(stream); - if(log.isTraceEnabled()) - log.trace("Cert #" + i + " = " + x509Certs[i]); - } catch(Exception ex) { - log.info("Error translating " + jsseCerts[i], ex); - return null; - } - } - - if ( x509Certs.length < 1 ) - return null; - return x509Certs; - } public Object[] getPeerCertificateChain(boolean force) throws IOException { // Look up the current SSLSession @@ -124,9 +136,41 @@ } protected void handShake() throws IOException { - ssl.setNeedClientAuth(true); + if( ssl.getWantClientAuth() ) { + log.debug("No client cert sent for want"); + } else { + ssl.setNeedClientAuth(true); + } + + InputStream in = ssl.getInputStream(); + int oldTimeout = ssl.getSoTimeout(); + ssl.setSoTimeout(1000); + byte[] b = new byte[0]; + listener.reset(); ssl.startHandshake(); + int maxTries = 60; // 60 * 1000 = example 1 minute time out + for (int i = 0; i < maxTries; i++) { + if(log.isTraceEnabled()) + log.trace("Reading for try #" +i); + try { + int x = in.read(b); + } catch(SSLException sslex) { + log.info("SSL Error getting client Certs",sslex); + throw sslex; + } catch (IOException e) { + // ignore - presumably the timeout + } + if (listener.completed) { + break; + } + } + ssl.setSoTimeout(oldTimeout); + if (listener.completed == false) { + throw new SocketException("SSL Cert handshake timeout"); + } + } + /** * Copied from <code>org.apache.catalina.valves.CertificateValve</code> */ @@ -173,6 +217,16 @@ return buf.toString(); } + + private static class Listener implements HandshakeCompletedListener { + volatile boolean completed = false; + public void handshakeCompleted(HandshakeCompletedEvent event) { + completed = true; + } + void reset() { + completed = false; + } + } } --------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]