You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@logging.apache.org by gg...@apache.org on 2017/08/17 21:42:24 UTC

logging-log4j2 git commit: [LOG4J2-2013] SslSocketManager does not apply SSLContext on TCP reconnect.

Repository: logging-log4j2
Updated Branches:
  refs/heads/master 679e6e502 -> fb6f73d48


[LOG4J2-2013] SslSocketManager does not apply SSLContext on TCP
reconnect.

Project: http://git-wip-us.apache.org/repos/asf/logging-log4j2/repo
Commit: http://git-wip-us.apache.org/repos/asf/logging-log4j2/commit/fb6f73d4
Tree: http://git-wip-us.apache.org/repos/asf/logging-log4j2/tree/fb6f73d4
Diff: http://git-wip-us.apache.org/repos/asf/logging-log4j2/diff/fb6f73d4

Branch: refs/heads/master
Commit: fb6f73d48b85c8248ad7576468f77bbbb7acf670
Parents: 679e6e5
Author: Gary Gregory <ga...@gmail.com>
Authored: Thu Aug 17 15:42:13 2017 -0600
Committer: Gary Gregory <ga...@gmail.com>
Committed: Thu Aug 17 15:42:13 2017 -0600

----------------------------------------------------------------------
 .../SecureSocketAppenderConnectReConnectIT.java |   7 +-
 .../logging/log4j/core/net/SocketOptions.java   |  33 ++++--
 .../log4j/core/net/SslSocketManager.java        | 102 +++++++------------
 .../log4j/core/net/TcpSocketManager.java        |  63 ++++++++----
 src/changes/changes.xml                         |   3 +
 5 files changed, 106 insertions(+), 102 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/fb6f73d4/log4j-core-its/src/test/java/org/apache/logging/log4j/core/appender/net/SecureSocketAppenderConnectReConnectIT.java
----------------------------------------------------------------------
diff --git a/log4j-core-its/src/test/java/org/apache/logging/log4j/core/appender/net/SecureSocketAppenderConnectReConnectIT.java b/log4j-core-its/src/test/java/org/apache/logging/log4j/core/appender/net/SecureSocketAppenderConnectReConnectIT.java
index 97499b7..2a46cac 100644
--- a/log4j-core-its/src/test/java/org/apache/logging/log4j/core/appender/net/SecureSocketAppenderConnectReConnectIT.java
+++ b/log4j-core-its/src/test/java/org/apache/logging/log4j/core/appender/net/SecureSocketAppenderConnectReConnectIT.java
@@ -21,6 +21,7 @@ import java.net.Socket;
 
 import org.apache.logging.log4j.core.appender.SocketAppender;
 import org.apache.logging.log4j.core.layout.JsonLayout;
+import org.apache.logging.log4j.core.net.SocketOptions;
 import org.apache.logging.log4j.core.net.ssl.SslConfiguration;
 import org.apache.logging.log4j.core.net.ssl.SslConfigurationTest;
 import org.apache.logging.log4j.core.net.ssl.StoreConfigurationException;
@@ -66,16 +67,18 @@ public class SecureSocketAppenderConnectReConnectIT extends AbstractSocketAppend
     }
 
     @Test
-    @Ignore
+    //@Ignore
     public void testConnectReConnect() throws Exception {
         port = AvailablePortFinder.getNextAvailable();
         // Start server
-        server = TcpSocketServer.createJsonSocketServer(port);
+        server = SecureTcpSocketServer.createJsonServer(port, sslConfiguration);
         startServer(200);
         // Start appender
         // @formatter:off
         appender = SocketAppender.newBuilder()
                 .withPort(port)
+                .withConnectTimeoutMillis(1000)
+                .withSocketOptions(SocketOptions.newBuilder().setSoTimeout(1000))
                 .withReconnectDelayMillis(1000)
                 .withName("test")
                 .withLayout(JsonLayout.newBuilder().build())

http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/fb6f73d4/log4j-core/src/main/java/org/apache/logging/log4j/core/net/SocketOptions.java
----------------------------------------------------------------------
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/net/SocketOptions.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/net/SocketOptions.java
index 62364e5..711d044 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/net/SocketOptions.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/net/SocketOptions.java
@@ -167,48 +167,59 @@ public class SocketOptions implements Builder<SocketOptions>, Cloneable {
         return tcpNoDelay;
     }
 
-    public void setKeepAlive(final boolean keepAlive) {
+    public SocketOptions setKeepAlive(final boolean keepAlive) {
         this.keepAlive = Boolean.valueOf(keepAlive);
+        return this;
     }
 
-    public void setOobInline(final boolean oobInline) {
+    public SocketOptions setOobInline(final boolean oobInline) {
         this.oobInline = Boolean.valueOf(oobInline);
+        return this;
     }
 
-    public void setPerformancePreferences(final SocketPerformancePreferences performancePreferences) {
+    public SocketOptions setPerformancePreferences(final SocketPerformancePreferences performancePreferences) {
         this.performancePreferences = performancePreferences;
+        return this;
     }
 
-    public void setReceiveBufferSize(final int receiveBufferSize) {
+    public SocketOptions setReceiveBufferSize(final int receiveBufferSize) {
         this.receiveBufferSize = receiveBufferSize;
+        return this;
     }
 
-    public void setReuseAddress(final boolean reuseAddress) {
+    public SocketOptions setReuseAddress(final boolean reuseAddress) {
         this.reuseAddress = Boolean.valueOf(reuseAddress);
+        return this;
     }
 
-    public void setRfc1349TrafficClass(final Rfc1349TrafficClass trafficClass) {
+    public SocketOptions setRfc1349TrafficClass(final Rfc1349TrafficClass trafficClass) {
         this.rfc1349TrafficClass = trafficClass;
+        return this;
     }
 
-    public void setSendBufferSize(final int sendBufferSize) {
+    public SocketOptions setSendBufferSize(final int sendBufferSize) {
         this.sendBufferSize = sendBufferSize;
+        return this;
     }
 
-    public void setSoLinger(final int soLinger) {
+    public SocketOptions setSoLinger(final int soLinger) {
         this.soLinger = soLinger;
+        return this;
     }
 
-    public void setSoTimeout(final int soTimeout) {
+    public SocketOptions setSoTimeout(final int soTimeout) {
         this.soTimeout = soTimeout;
+        return this;
     }
 
-    public void setTcpNoDelay(final boolean tcpNoDelay) {
+    public SocketOptions setTcpNoDelay(final boolean tcpNoDelay) {
         this.tcpNoDelay = Boolean.valueOf(tcpNoDelay);
+        return this;
     }
 
-    public void setTrafficClass(final int trafficClass) {
+    public SocketOptions setTrafficClass(final int trafficClass) {
         this.trafficClass = trafficClass;
+        return this;
     }
 
     @Override

http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/fb6f73d4/log4j-core/src/main/java/org/apache/logging/log4j/core/net/SslSocketManager.java
----------------------------------------------------------------------
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/net/SslSocketManager.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/net/SslSocketManager.java
index 6d0b872..2a4593d 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/net/SslSocketManager.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/net/SslSocketManager.java
@@ -16,23 +16,18 @@
  */
 package org.apache.logging.log4j.core.net;
 
-import java.io.ByteArrayOutputStream;
 import java.io.IOException;
 import java.io.OutputStream;
 import java.io.Serializable;
 import java.net.InetAddress;
 import java.net.InetSocketAddress;
 import java.net.Socket;
-import java.net.UnknownHostException;
 
 import javax.net.ssl.SSLSocket;
 import javax.net.ssl.SSLSocketFactory;
 
-import org.apache.logging.log4j.Level;
 import org.apache.logging.log4j.core.Layout;
-import org.apache.logging.log4j.core.appender.ManagerFactory;
 import org.apache.logging.log4j.core.net.ssl.SslConfiguration;
-import org.apache.logging.log4j.core.util.Closer;
 import org.apache.logging.log4j.util.Strings;
 
 /**
@@ -95,13 +90,20 @@ public class SslSocketManager extends TcpSocketManager {
         protected SslConfiguration sslConfiguration;
 
         public SslFactoryData(final SslConfiguration sslConfiguration, final String host, final int port,
-                final int connectTimeoutMillis, final int reconnectDelayMillis, final int delayMillis,
-                final boolean immediateFail, final Layout<? extends Serializable> layout, final int bufferSize,
-                final SocketOptions socketOptions) {
+                final int connectTimeoutMillis, final int reconnectDelayMillis, final boolean immediateFail,
+                final Layout<? extends Serializable> layout, final int bufferSize, final SocketOptions socketOptions) {
             super(host, port, connectTimeoutMillis, reconnectDelayMillis, immediateFail, layout, bufferSize,
                     socketOptions);
             this.sslConfiguration = sslConfiguration;
         }
+
+        @Override
+        public String toString() {
+            return "SslFactoryData [sslConfiguration=" + sslConfiguration + ", host=" + host + ", port=" + port
+                    + ", connectTimeoutMillis=" + connectTimeoutMillis + ", reconnectDelayMillis="
+                    + reconnectDelayMillis + ", immediateFail=" + immediateFail + ", layout=" + layout + ", bufferSize="
+                    + bufferSize + ", socketOptions=" + socketOptions + "]";
+        }
     }
 
     /**
@@ -126,8 +128,9 @@ public class SslSocketManager extends TcpSocketManager {
         if (reconnectDelayMillis == 0) {
             reconnectDelayMillis = DEFAULT_RECONNECTION_DELAY_MILLIS;
         }
-        return (SslSocketManager) getManager("TLS:" + host + ':' + port, new SslFactoryData(sslConfig, host, port,
-                connectTimeoutMillis, 0, reconnectDelayMillis, immediateFail, layout, bufferSize, socketOptions), FACTORY);
+        final String name = "TLS:" + host + ':' + port;
+        return (SslSocketManager) getManager(name, new SslFactoryData(sslConfig, host, port, connectTimeoutMillis,
+                reconnectDelayMillis, immediateFail, layout, bufferSize, socketOptions), FACTORY);
     }
 
     @Override
@@ -152,73 +155,36 @@ public class SslSocketManager extends TcpSocketManager {
     }
 
 
-    private static class SslSocketManagerFactory implements ManagerFactory<SslSocketManager, SslFactoryData> {
-
-        private static class TlsSocketManagerFactoryException extends Exception {
+    private static class SslSocketManagerFactory extends TcpSocketManagerFactory<SslSocketManager, SslFactoryData> {
 
-            private static final long serialVersionUID = 1L;
-        }
-
-        @SuppressWarnings("resource")
         @Override
-        public SslSocketManager createManager(final String name, final SslFactoryData data) {
-            InetAddress inetAddress = null;
-            OutputStream os = null;
-            Socket socket = null;
-            try {
-                inetAddress = resolveAddress(data.host);
-                socket = createSocket(data);
-                os = socket.getOutputStream();
-                checkDelay(data.reconnectDelayMillis, os);
-            } catch (final IOException e) {
-                LOGGER.error("SslSocketManager ({})", name, e);
-                os = new ByteArrayOutputStream();
-            } catch (final TlsSocketManagerFactoryException e) {
-                LOGGER.catching(Level.DEBUG, e);
-                Closer.closeSilently(socket);
-                return null;
-            }
+        SslSocketManager createManager(final String name, OutputStream os, Socket socket, InetAddress inetAddress,
+                final SslFactoryData data) {
             return new SslSocketManager(name, os, socket, data.sslConfiguration, inetAddress, data.host, data.port,
                     data.connectTimeoutMillis, data.reconnectDelayMillis, data.immediateFail, data.layout, data.bufferSize,
                     data.socketOptions);
         }
-
-        private InetAddress resolveAddress(final String hostName) throws TlsSocketManagerFactoryException {
-            InetAddress address;
-
-            try {
-                address = InetAddress.getByName(hostName);
-            } catch (final UnknownHostException ex) {
-                LOGGER.error("Could not find address of {}", hostName, ex);
-                throw new TlsSocketManagerFactoryException();
-            }
-
-            return address;
+        
+        @Override
+        Socket createSocket(final SslFactoryData data) throws IOException {
+            return SslSocketManager.createSocket(data.host, data.port, data.connectTimeoutMillis, data.sslConfiguration,
+                    data.socketOptions);
         }
+    }
 
-        private void checkDelay(final int delay, final OutputStream os) throws TlsSocketManagerFactoryException {
-            if (delay == 0 && os == null) {
-                throw new TlsSocketManagerFactoryException();
-            }
+    static Socket createSocket(final String host, int port, int connectTimeoutMillis,
+            final SslConfiguration sslConfiguration, SocketOptions socketOptions) throws IOException {
+        final SSLSocketFactory socketFactory = createSslSocketFactory(sslConfiguration);
+        final SSLSocket socket = (SSLSocket) socketFactory.createSocket();
+        if (socketOptions != null) {
+            // Not sure which options must be applied before or after the connect() call.
+            socketOptions.apply(socket);
         }
-
-        private Socket createSocket(final SslFactoryData data) throws IOException {
-            SSLSocketFactory socketFactory;
-            SSLSocket socket;
-
-            socketFactory = createSslSocketFactory(data.sslConfiguration);
-            socket = (SSLSocket) socketFactory.createSocket();
-            final SocketOptions socketOptions = data.socketOptions;
-            if (socketOptions != null) {
-                // Not sure which options must be applied before or after the connect() call.
-                socketOptions.apply(socket);
-            }
-            socket.connect(new InetSocketAddress(data.host, data.port), data.connectTimeoutMillis);
-            if (socketOptions != null) {
-                // Not sure which options must be applied before or after the connect() call.
-                socketOptions.apply(socket);
-            }
-            return socket;
+        socket.connect(new InetSocketAddress(host, port), connectTimeoutMillis);
+        if (socketOptions != null) {
+            // Not sure which options must be applied before or after the connect() call.
+            socketOptions.apply(socket);
         }
+        return socket;
     }
 }

http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/fb6f73d4/log4j-core/src/main/java/org/apache/logging/log4j/core/net/TcpSocketManager.java
----------------------------------------------------------------------
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/net/TcpSocketManager.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/net/TcpSocketManager.java
index 95b9bee..15d2bc8 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/net/TcpSocketManager.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/net/TcpSocketManager.java
@@ -33,6 +33,8 @@ import org.apache.logging.log4j.core.Layout;
 import org.apache.logging.log4j.core.appender.AppenderLoggingException;
 import org.apache.logging.log4j.core.appender.ManagerFactory;
 import org.apache.logging.log4j.core.appender.OutputStreamManager;
+import org.apache.logging.log4j.core.net.TcpSocketManager.FactoryData;
+import org.apache.logging.log4j.core.net.TcpSocketManager.TcpSocketManagerFactory;
 import org.apache.logging.log4j.core.util.Closer;
 import org.apache.logging.log4j.core.util.Log4jThread;
 import org.apache.logging.log4j.core.util.NullOutputStream;
@@ -51,7 +53,7 @@ public class TcpSocketManager extends AbstractSocketManager {
      */
     private static final int DEFAULT_PORT = 4560;
 
-    private static final TcpSocketManagerFactory FACTORY = new TcpSocketManagerFactory();
+    private static final TcpSocketManagerFactory<TcpSocketManager, FactoryData> FACTORY = new TcpSocketManagerFactory<>();
 
     private final int reconnectionDelayMillis;
 
@@ -341,7 +343,7 @@ public class TcpSocketManager extends AbstractSocketManager {
         }
 
         void reconnect() throws IOException {
-            final Socket sock = createSocket(inetAddress, port);
+            final Socket sock = createSocket(inetAddress.getHostName(), port);
             @SuppressWarnings("resource") // newOS is managed by the enclosing Manager.
             final OutputStream newOS = sock.getOutputStream();
             synchronized (owner) {
@@ -367,14 +369,21 @@ public class TcpSocketManager extends AbstractSocketManager {
         return recon;
     }
 
-    protected Socket createSocket(final InetAddress host, final int port) throws IOException {
-        return createSocket(host.getHostName(), port);
+    protected Socket createSocket(final String host, final int port) throws IOException {
+        return createSocket(host, port, socketOptions, connectTimeoutMillis);
     }
 
-    protected Socket createSocket(final String host, final int port) throws IOException {
+    protected static Socket createSocket(final String host, final int port, final SocketOptions socketOptions,
+            final int connectTimeoutMillis) throws IOException {
+        LOGGER.debug("Creating socket {}:{}", host, port);
         final Socket newSocket = new Socket();
+        if (socketOptions != null) {
+            // Not sure which options must be applied before or after the connect() call.
+            socketOptions.apply(newSocket);
+        }
         newSocket.connect(new InetSocketAddress(host, port), connectTimeoutMillis);
         if (socketOptions != null) {
+            // Not sure which options must be applied before or after the connect() call.
             socketOptions.apply(newSocket);
         }
         return newSocket;
@@ -416,13 +425,18 @@ public class TcpSocketManager extends AbstractSocketManager {
 
     /**
      * Factory to create a TcpSocketManager.
+     * 
+     * @param <M>
+     *            The manager type.
+     * @param <T>
+     *            The factory data type.
      */
-    protected static class TcpSocketManagerFactory implements ManagerFactory<TcpSocketManager, FactoryData> {
+    protected static class TcpSocketManagerFactory<M extends TcpSocketManager, T extends FactoryData>
+            implements ManagerFactory<M, T> {
 
         @SuppressWarnings("resource")
         @Override
-        public TcpSocketManager createManager(final String name, final FactoryData data) {
-
+        public M createManager(final String name, final T data) {
             InetAddress inetAddress;
             OutputStream os;
             try {
@@ -436,9 +450,7 @@ public class TcpSocketManager extends AbstractSocketManager {
                 // LOG4J2-1042
                 socket = createSocket(data);
                 os = socket.getOutputStream();
-                return new TcpSocketManager(name, os, socket, inetAddress, data.host, data.port,
-                        data.connectTimeoutMillis, data.reconnectDelayMillis, data.immediateFail, data.layout,
-                        data.bufferSize, data.socketOptions);
+                return createManager(name, os, socket, inetAddress, data);
             } catch (final IOException ex) {
                 LOGGER.error("TcpSocketManager ({}) caught exception and will continue:", name, ex, ex);
                 os = NullOutputStream.getInstance();
@@ -447,18 +459,18 @@ public class TcpSocketManager extends AbstractSocketManager {
                 Closer.closeSilently(socket);
                 return null;
             }
-            return new TcpSocketManager(name, os, null, inetAddress, data.host, data.port, data.connectTimeoutMillis,
-                    data.reconnectDelayMillis, data.immediateFail, data.layout, data.bufferSize, data.socketOptions);
+            return createManager(name, os, null, inetAddress, data);
         }
 
-        static Socket createSocket(final FactoryData data) throws IOException, SocketException {
-            final Socket socket = new Socket();
-            socket.connect(new InetSocketAddress(data.host, data.port), data.connectTimeoutMillis);
-            final SocketOptions socketOptions = data.socketOptions;
-            if (socketOptions != null) {
-                socketOptions.apply(socket);
-            }
-            return socket;
+        @SuppressWarnings("unchecked")
+        M createManager(final String name, OutputStream os, Socket socket, InetAddress inetAddress, final T data) {
+            return (M) new TcpSocketManager(name, os, socket, inetAddress, data.host, data.port,
+                    data.connectTimeoutMillis, data.reconnectDelayMillis, data.immediateFail, data.layout,
+                    data.bufferSize, data.socketOptions);
+        }
+
+        Socket createSocket(final T data) throws IOException {
+            return TcpSocketManager.createSocket(data.host, data.port, data.socketOptions, data.connectTimeoutMillis);
         }
 
     }
@@ -481,4 +493,13 @@ public class TcpSocketManager extends AbstractSocketManager {
         return reconnectionDelayMillis;
     }
 
+    @Override
+    public String toString() {
+        return "TcpSocketManager [reconnectionDelayMillis=" + reconnectionDelayMillis + ", reconnector=" + reconnector
+                + ", socket=" + socket + ", socketOptions=" + socketOptions + ", retry=" + retry + ", immediateFail="
+                + immediateFail + ", connectTimeoutMillis=" + connectTimeoutMillis + ", inetAddress=" + inetAddress
+                + ", host=" + host + ", port=" + port + ", layout=" + layout + ", byteBuffer=" + byteBuffer + ", count="
+                + count + "]";
+    }
+
 }

http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/fb6f73d4/src/changes/changes.xml
----------------------------------------------------------------------
diff --git a/src/changes/changes.xml b/src/changes/changes.xml
index 69c8b53..70e88d1 100644
--- a/src/changes/changes.xml
+++ b/src/changes/changes.xml
@@ -37,6 +37,9 @@
       <action issue="LOG4J2-2018" dev="rpopma" type="fix">
         Fix incorrect documentation for LoggerNameLevelRewritePolicy.
       </action>
+      <action issue="LOG4J2-2013" dev="ggregory" type="fix" due-to="Taylor Patton, Gary Gregory">
+        SslSocketManager does not apply SSLContext on TCP reconnect.
+      </action>
       <action issue="LOG4J2-2015" dev="ggregory" type="update">
         Allow KeyStoreConfiguration and TrustStoreConfiguration to find files as resources.
       </action>