Author: markt
Date: Sat Jan 30 00:18:19 2016
New Revision: 1727667

URL: http://svn.apache.org/viewvc?rev=1727667&view=rev
Log:
Fix an NPE in the Manager web application when displaying ciphers for APR/native
Align OpenSsl's handling of enabled ciphers/protocols with JSSE
Modified:
    tomcat/trunk/java/org/apache/tomcat/util/net/AprEndpoint.java
    tomcat/trunk/java/org/apache/tomcat/util/net/SSLUtilBase.java
    tomcat/trunk/java/org/apache/tomcat/util/net/openssl/OpenSSLEngine.java
    tomcat/trunk/webapps/docs/changelog.xml

Modified: tomcat/trunk/java/org/apache/tomcat/util/net/AprEndpoint.java
URL: 
http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/tomcat/util/net/AprEndpoint.java?rev=1727667&r1=1727666&r2=1727667&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/tomcat/util/net/AprEndpoint.java (original)
+++ tomcat/trunk/java/org/apache/tomcat/util/net/AprEndpoint.java Sat Jan 30 
00:18:19 2016
@@ -24,7 +24,9 @@ import java.nio.channels.CompletionHandl
 import java.nio.charset.StandardCharsets;
 import java.util.ArrayList;
 import java.util.HashMap;
+import java.util.List;
 import java.util.Map;
+import java.util.Set;
 import java.util.concurrent.ConcurrentHashMap;
 import java.util.concurrent.Executor;
 import java.util.concurrent.RejectedExecutionException;
@@ -54,6 +56,7 @@ import org.apache.tomcat.util.buf.ByteBu
 import org.apache.tomcat.util.net.AbstractEndpoint.Acceptor.AcceptorState;
 import org.apache.tomcat.util.net.AbstractEndpoint.Handler.SocketState;
 import org.apache.tomcat.util.net.SSLHostConfig.Type;
+import org.apache.tomcat.util.net.openssl.OpenSSLEngine;
 
 
 /**
@@ -346,13 +349,32 @@ public class AprEndpoint extends Abstrac
         if (isSSLEnabled()) {
             for (SSLHostConfig sslHostConfig : sslHostConfigs.values()) {
 
-                for (SSLHostConfigCertificate certificate : 
sslHostConfig.getCertificates(true)) {
+                Set<SSLHostConfigCertificate> certificates = 
sslHostConfig.getCertificates(true);
+                boolean firstCertificate = true;
+                for (SSLHostConfigCertificate certificate : certificates) {
                     if 
(SSLHostConfig.adjustRelativePath(certificate.getCertificateFile()) == null) {
                         // This is required
                         throw new 
Exception(sm.getString("endpoint.apr.noSslCertFile"));
                     }
+                    if (firstCertificate) {
+                        // TODO: Duplicates code in SSLUtilBase. Consider
+                        //       refactoring to reduce duplication
+                        firstCertificate = false;
+                        // Configure the enabled protocols
+                        List<String> enabledProtocols = 
SSLUtilBase.getEnabled("protocols", log,
+                                true, sslHostConfig.getProtocols(),
+                                OpenSSLEngine.IMPLEMENTED_PROTOCOLS_SET);
+                        sslHostConfig.setEnabledProtocols(
+                                enabledProtocols.toArray(new 
String[enabledProtocols.size()]));
+                        // Configure the enabled ciphers
+                        List<String> enabledCiphers = 
SSLUtilBase.getEnabled("ciphers", log,
+                                false, sslHostConfig.getJsseCipherNames(),
+                                OpenSSLEngine.AVAILABLE_CIPHER_SUITES);
+                        sslHostConfig.setEnabledCiphers(
+                                enabledCiphers.toArray(new 
String[enabledCiphers.size()]));
+                    }
                 }
-                if (sslHostConfig.getCertificates().size() > 2) {
+                if (certificates.size() > 2) {
                     // TODO: Can this limitation be removed?
                     throw new 
Exception(sm.getString("endpoint.apr.tooManyCertFiles"));
                 }
@@ -363,7 +385,7 @@ public class AprEndpoint extends Abstrac
                     // Native fallback used if protocols=""
                     value = SSL.SSL_PROTOCOL_ALL;
                 } else {
-                    for (String protocol : sslHostConfig.getProtocols()) {
+                    for (String protocol : 
sslHostConfig.getEnabledProtocols()) {
                         if 
(Constants.SSL_PROTO_SSLv2Hello.equalsIgnoreCase(protocol)) {
                             // NO-OP. OpenSSL always supports SSLv2Hello
                         } else if 
(Constants.SSL_PROTO_SSLv2.equalsIgnoreCase(protocol)) {

Modified: tomcat/trunk/java/org/apache/tomcat/util/net/SSLUtilBase.java
URL: 
http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/tomcat/util/net/SSLUtilBase.java?rev=1727667&r1=1727666&r2=1727667&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/tomcat/util/net/SSLUtilBase.java (original)
+++ tomcat/trunk/java/org/apache/tomcat/util/net/SSLUtilBase.java Sat Jan 30 
00:18:19 2016
@@ -45,19 +45,19 @@ public abstract class SSLUtilBase implem
         Set<String> configuredProtocols = sslHostConfig.getProtocols();
         Set<String> implementedProtocols = getImplementedProtocols();
         List<String> enabledProtocols =
-                getEnabled("protocols", true, configuredProtocols, 
implementedProtocols);
+                getEnabled("protocols", getLog(), true, configuredProtocols, 
implementedProtocols);
         this.enabledProtocols = enabledProtocols.toArray(new 
String[enabledProtocols.size()]);
 
         // Calculate the enabled ciphers
         List<String> configuredCiphers = sslHostConfig.getJsseCipherNames();
         Set<String> implementedCiphers = getImplementedCiphers();
         List<String> enabledCiphers =
-                getEnabled("ciphers", false, configuredCiphers, 
implementedCiphers);
+                getEnabled("ciphers", getLog(), false, configuredCiphers, 
implementedCiphers);
         this.enabledCiphers = enabledCiphers.toArray(new 
String[enabledCiphers.size()]);
     }
 
 
-    private <T> List<T> getEnabled(String name, boolean warnOnSkip, 
Collection<T> configured,
+    static <T> List<T> getEnabled(String name, Log log, boolean warnOnSkip, 
Collection<T> configured,
             Collection<T> implemented) {
 
         List<T> enabled = new ArrayList<>();
@@ -80,19 +80,19 @@ public abstract class SSLUtilBase implem
                 throw new IllegalArgumentException(
                         sm.getString("sslUtilBase.noneSupported", name, 
configured));
             }
-            if (getLog().isDebugEnabled()) {
-                getLog().debug(sm.getString("sslUtilBase.active", name, 
enabled));
+            if (log.isDebugEnabled()) {
+                log.debug(sm.getString("sslUtilBase.active", name, enabled));
             }
-            if (getLog().isDebugEnabled() || warnOnSkip) {
+            if (log.isDebugEnabled() || warnOnSkip) {
                 if (enabled.size() != configured.size()) {
                     List<T> skipped = new ArrayList<>();
                     skipped.addAll(configured);
                     skipped.removeAll(enabled);
                     String msg = sm.getString("sslUtilBase.skipped", name, 
skipped);
                     if (warnOnSkip) {
-                        getLog().warn(msg);
+                        log.warn(msg);
                     } else {
-                        getLog().debug(msg);
+                        log.debug(msg);
                     }
                 }
             }

Modified: 
tomcat/trunk/java/org/apache/tomcat/util/net/openssl/OpenSSLEngine.java
URL: 
http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/tomcat/util/net/openssl/OpenSSLEngine.java?rev=1727667&r1=1727666&r2=1727667&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/tomcat/util/net/openssl/OpenSSLEngine.java 
(original)
+++ tomcat/trunk/java/org/apache/tomcat/util/net/openssl/OpenSSLEngine.java Sat 
Jan 30 00:18:19 2016
@@ -68,7 +68,7 @@ public final class OpenSSLEngine extends
     private static final SSLException ENGINE_CLOSED = new 
SSLException(sm.getString("engine.engineClosed"));
     private static final SSLException ENCRYPTED_PACKET_OVERSIZED = new 
SSLException(sm.getString("engine.oversizedPacket"));
 
-    protected static final Set<String> AVAILABLE_CIPHER_SUITES;
+    public static final Set<String> AVAILABLE_CIPHER_SUITES;
 
     static {
         final Set<String> availableCipherSuites = new LinkedHashSet<>(128);
@@ -122,8 +122,8 @@ public final class OpenSSLEngine extends
         Constants.SSL_PROTO_TLSv1_1,
         Constants.SSL_PROTO_TLSv1_2
     };
-    protected static final Set<String> IMPLEMENTED_PROTOCOLS_SET =
-            new HashSet<>(Arrays.asList(IMPLEMENTED_PROTOCOLS));
+    public static final Set<String> IMPLEMENTED_PROTOCOLS_SET =
+            Collections.unmodifiableSet(new 
HashSet<>(Arrays.asList(IMPLEMENTED_PROTOCOLS)));
 
     // Header (5) + Data (2^14) + Compression (1024) + Encryption (1024) + MAC 
(20) + Padding (256)
     static final int MAX_ENCRYPTED_PACKET_LENGTH = MAX_CIPHERTEXT_LENGTH + 5 + 
20 + 256;

Modified: tomcat/trunk/webapps/docs/changelog.xml
URL: 
http://svn.apache.org/viewvc/tomcat/trunk/webapps/docs/changelog.xml?rev=1727667&r1=1727666&r2=1727667&view=diff
==============================================================================
--- tomcat/trunk/webapps/docs/changelog.xml (original)
+++ tomcat/trunk/webapps/docs/changelog.xml Sat Jan 30 00:18:19 2016
@@ -78,6 +78,18 @@
       </fix>
     </changelog>
   </subsection>
+  <subsection name="Coyote">
+    <changelog>
+      <fix>
+        Correct a regression in the connector refactoring in 9.0.0.M2 that 
broke
+        TLS support for the APR/native connector. (remm)
+      </fix>
+      <fix>
+        Correct an NPE when listing the enabled ciphers (e.g. via the Manager
+        web application) for a TLS enabled APR/native connector. (markt)
+      </fix>
+    </changelog>
+  </subsection>
 </section>
 <section name="Tomcat 9.0.0.M2" rtext="Voting in progress">
   <subsection name="Catalina">



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

Reply via email to