From c94fcddcbb9dcdfc5fdccaae03d66c7e26b05c47 Mon Sep 17 00:00:00 2001 From: jasonparallel Date: Tue, 22 Sep 2020 11:49:41 -0400 Subject: [PATCH 1/8] Null checking on close --- .../com/cloudbees/syslog/sender/TcpSyslogMessageSender.java | 3 ++- .../com/cloudbees/syslog/sender/UdpSyslogMessageSender.java | 3 ++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/cloudbees/syslog/sender/TcpSyslogMessageSender.java b/src/main/java/com/cloudbees/syslog/sender/TcpSyslogMessageSender.java index 30859c6..bd4563d 100644 --- a/src/main/java/com/cloudbees/syslog/sender/TcpSyslogMessageSender.java +++ b/src/main/java/com/cloudbees/syslog/sender/TcpSyslogMessageSender.java @@ -287,6 +287,7 @@ public String toString() { @Override public void close() throws IOException { - this.socket.close(); + if(this.socket != null) + this.socket.close(); } } diff --git a/src/main/java/com/cloudbees/syslog/sender/UdpSyslogMessageSender.java b/src/main/java/com/cloudbees/syslog/sender/UdpSyslogMessageSender.java index 4cd253c..e535435 100644 --- a/src/main/java/com/cloudbees/syslog/sender/UdpSyslogMessageSender.java +++ b/src/main/java/com/cloudbees/syslog/sender/UdpSyslogMessageSender.java @@ -151,6 +151,7 @@ public String toString() { @Override public void close() throws IOException { - this.datagramSocket.close(); + if(this.datagramSocket != null) + this.datagramSocket.close(); } } From b5f06d1cc8cf264c06937ad60ef806bed056f036 Mon Sep 17 00:00:00 2001 From: jasonparallel Date: Tue, 22 Sep 2020 12:43:37 -0400 Subject: [PATCH 2/8] Added proxy settings --- .../syslog/sender/TcpSyslogMessageSender.java | 41 ++++++++++++++--- .../syslog/sender/proxy/ProxyConfig.java | 46 +++++++++++++++++++ 2 files changed, 81 insertions(+), 6 deletions(-) create mode 100644 src/main/java/com/cloudbees/syslog/sender/proxy/ProxyConfig.java diff --git a/src/main/java/com/cloudbees/syslog/sender/TcpSyslogMessageSender.java b/src/main/java/com/cloudbees/syslog/sender/TcpSyslogMessageSender.java index bd4563d..0e4c99f 100644 --- a/src/main/java/com/cloudbees/syslog/sender/TcpSyslogMessageSender.java +++ b/src/main/java/com/cloudbees/syslog/sender/TcpSyslogMessageSender.java @@ -19,6 +19,8 @@ import com.cloudbees.syslog.util.CachingReference; import com.cloudbees.syslog.util.IoUtils; +import com.cloudbees.syslog.sender.proxy.ProxyConfig; + import javax.annotation.Nonnull; import javax.annotation.Nullable; import javax.annotation.concurrent.ThreadSafe; @@ -70,6 +72,7 @@ public class TcpSyslogMessageSender extends AbstractSyslogMessageSender implemen private int socketConnectTimeoutInMillis = SETTING_SOCKET_CONNECT_TIMEOUT_IN_MILLIS_DEFAULT_VALUE; private boolean ssl; private SSLContext sslContext; + private ProxyConfig proxyConfig; /** * Number of retries to send a message before throwing an exception. */ @@ -145,18 +148,36 @@ private synchronized void ensureSyslogServerConnection() throws IOException { if (!socketIsValid) { writer = null; try { - if (ssl) { + final SocketFactory socketFactory; + if (ssl) { if (sslContext == null) { - socket = SSLSocketFactory.getDefault().createSocket(); + socketFactory = SSLSocketFactory.getDefault(); } else { - socket = sslContext.getSocketFactory().createSocket(); + socketFactory = sslContext.getSocketFactory(); } } else { - socket = SocketFactory.getDefault().createSocket(); + socketFactory = SocketFactory.getDefault(); } + + final InetSocketAddress syslogServer = new InetSocketAddress(inetAddress, syslogServerPort); + final ProxyConfig currentProxyConfig = this.proxyConfig; + + if(currentProxyConfig == null) { + socket = socketFactory.createSocket(); + }else { + final InetSocketAddress proxyAddr = new InetSocketAddress(currentProxyConfig.getHostnameReference().get(), currentProxyConfig.getPort()); + final Socket underlying = new Socket(new Proxy(Proxy.Type.HTTP, proxyAddr)); + underlying.connect(syslogServer); + socket = ((SSLSocketFactory)socketFactory).createSocket( + underlying, + currentProxyConfig.getHostname(), + currentProxyConfig.getPort(), + true); + } + socket.setKeepAlive(true); socket.connect( - new InetSocketAddress(inetAddress, syslogServerPort), + syslogServer, socketConnectTimeoutInMillis); if (socket instanceof SSLSocket && logger.isLoggable(Level.FINER)) { @@ -241,7 +262,15 @@ public synchronized SSLContext getSSLContext() { return this.sslContext; } - public int getSocketConnectTimeoutInMillis() { + public ProxyConfig getProxyConfig() { + return proxyConfig; + } + + public void setProxyConfig(ProxyConfig proxyConfig) { + this.proxyConfig = proxyConfig; + } + + public int getSocketConnectTimeoutInMillis() { return socketConnectTimeoutInMillis; } diff --git a/src/main/java/com/cloudbees/syslog/sender/proxy/ProxyConfig.java b/src/main/java/com/cloudbees/syslog/sender/proxy/ProxyConfig.java new file mode 100644 index 0000000..b11d8f5 --- /dev/null +++ b/src/main/java/com/cloudbees/syslog/sender/proxy/ProxyConfig.java @@ -0,0 +1,46 @@ +package com.cloudbees.syslog.sender.proxy; + +import java.net.InetAddress; +import java.net.UnknownHostException; + +import javax.annotation.Nullable; + +import com.cloudbees.syslog.sender.SyslogMessageSender; +import com.cloudbees.syslog.util.CachingReference; + +public class ProxyConfig { + + private final int port; + private final String hostname; + private final CachingReference hostnameReference; + + public ProxyConfig (final int port, final String hostname) { + this.port = port; + this.hostname = hostname; + this.hostnameReference = new CachingReference(SyslogMessageSender.DEFAULT_INET_ADDRESS_TTL_IN_NANOS) { + @Nullable + @Override + protected InetAddress newObject() { + try { + return InetAddress.getByName(hostname); + } catch (UnknownHostException e) { + throw new IllegalStateException(e); + } + } + }; + } + + public int getPort() { + return port; + } + + public String getHostname() { + return hostname; + } + + public CachingReference getHostnameReference() { + return hostnameReference; + } + + +} From 4e264956effe0ee59699e0d842dbaf1b7788f234 Mon Sep 17 00:00:00 2001 From: jasonparallel Date: Tue, 22 Sep 2020 13:29:07 -0400 Subject: [PATCH 3/8] Call connect in the correct places --- .settings/org.eclipse.wst.common.component | 6 ++++++ .../org.eclipse.wst.common.project.facet.core.xml | 5 +++++ .../syslog/sender/TcpSyslogMessageSender.java | 11 ++++++----- 3 files changed, 17 insertions(+), 5 deletions(-) create mode 100644 .settings/org.eclipse.wst.common.component create mode 100644 .settings/org.eclipse.wst.common.project.facet.core.xml diff --git a/.settings/org.eclipse.wst.common.component b/.settings/org.eclipse.wst.common.component new file mode 100644 index 0000000..4c91546 --- /dev/null +++ b/.settings/org.eclipse.wst.common.component @@ -0,0 +1,6 @@ + + + + + + diff --git a/.settings/org.eclipse.wst.common.project.facet.core.xml b/.settings/org.eclipse.wst.common.project.facet.core.xml new file mode 100644 index 0000000..1b22d70 --- /dev/null +++ b/.settings/org.eclipse.wst.common.project.facet.core.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/src/main/java/com/cloudbees/syslog/sender/TcpSyslogMessageSender.java b/src/main/java/com/cloudbees/syslog/sender/TcpSyslogMessageSender.java index 0e4c99f..3dd3734 100644 --- a/src/main/java/com/cloudbees/syslog/sender/TcpSyslogMessageSender.java +++ b/src/main/java/com/cloudbees/syslog/sender/TcpSyslogMessageSender.java @@ -164,10 +164,15 @@ private synchronized void ensureSyslogServerConnection() throws IOException { if(currentProxyConfig == null) { socket = socketFactory.createSocket(); + socket.setKeepAlive(true); + socket.connect( + syslogServer, + socketConnectTimeoutInMillis); }else { final InetSocketAddress proxyAddr = new InetSocketAddress(currentProxyConfig.getHostnameReference().get(), currentProxyConfig.getPort()); final Socket underlying = new Socket(new Proxy(Proxy.Type.HTTP, proxyAddr)); - underlying.connect(syslogServer); + underlying.setKeepAlive(true); + underlying.connect(syslogServer); socket = ((SSLSocketFactory)socketFactory).createSocket( underlying, currentProxyConfig.getHostname(), @@ -175,10 +180,6 @@ private synchronized void ensureSyslogServerConnection() throws IOException { true); } - socket.setKeepAlive(true); - socket.connect( - syslogServer, - socketConnectTimeoutInMillis); if (socket instanceof SSLSocket && logger.isLoggable(Level.FINER)) { try { From 389571154ee6e68e1edacb2e0770ad371b641def Mon Sep 17 00:00:00 2001 From: jasonparallel Date: Tue, 22 Sep 2020 13:32:05 -0400 Subject: [PATCH 4/8] Removed eclipse files --- .settings/org.eclipse.wst.common.component | 6 ------ .settings/org.eclipse.wst.common.project.facet.core.xml | 5 ----- 2 files changed, 11 deletions(-) delete mode 100644 .settings/org.eclipse.wst.common.component delete mode 100644 .settings/org.eclipse.wst.common.project.facet.core.xml diff --git a/.settings/org.eclipse.wst.common.component b/.settings/org.eclipse.wst.common.component deleted file mode 100644 index 4c91546..0000000 --- a/.settings/org.eclipse.wst.common.component +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - diff --git a/.settings/org.eclipse.wst.common.project.facet.core.xml b/.settings/org.eclipse.wst.common.project.facet.core.xml deleted file mode 100644 index 1b22d70..0000000 --- a/.settings/org.eclipse.wst.common.project.facet.core.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - From aa8f88a12ecc567703229145ce59d3ba3838cdaf Mon Sep 17 00:00:00 2001 From: jasonparallel Date: Tue, 22 Sep 2020 14:47:22 -0400 Subject: [PATCH 5/8] Fix for connections not being reused via proxy --- .../syslog/sender/TcpSyslogMessageSender.java | 26 ++++++++++++++++--- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/src/main/java/com/cloudbees/syslog/sender/TcpSyslogMessageSender.java b/src/main/java/com/cloudbees/syslog/sender/TcpSyslogMessageSender.java index 3dd3734..8347fc3 100644 --- a/src/main/java/com/cloudbees/syslog/sender/TcpSyslogMessageSender.java +++ b/src/main/java/com/cloudbees/syslog/sender/TcpSyslogMessageSender.java @@ -73,6 +73,12 @@ public class TcpSyslogMessageSender extends AbstractSyslogMessageSender implemen private boolean ssl; private SSLContext sslContext; private ProxyConfig proxyConfig; + /** + * If the last connection was via a proxy server this will contain the + * InetAddress of the syslog server that was connected to via the proxy. + */ + private InetAddress proxyConnectedSyslogServer; + /** * Number of retries to send a message before throwing an exception. */ @@ -127,7 +133,17 @@ public synchronized void sendMessage(@Nonnull SyslogMessage message) throws IOEx private synchronized void ensureSyslogServerConnection() throws IOException { InetAddress inetAddress = syslogServerHostnameReference.get(); - if (socket != null && !Objects.equals(socket.getInetAddress(), inetAddress)) { + final ProxyConfig currentProxyConfig = this.proxyConfig; + if (socket != null && + //If not proxy connected check that socket is connected to current configured syslog + ((proxyConnectedSyslogServer == null && !Objects.equals(socket.getInetAddress(), inetAddress)) + //If proxy configured but last connection was not via proxy + || (currentProxyConfig != null && proxyConnectedSyslogServer == null) + //If proxy not configured but last connection was via proxy + || (currentProxyConfig == null && proxyConnectedSyslogServer != null) + //If proxy connected check that socket is connected to current configured proxy and last connected syslog matches current configured syslog + || (proxyConnectedSyslogServer != null && !Objects.equals(socket.getInetAddress(), proxyConnectedSyslogServer) && + !Objects.equals(socket.getInetAddress(), currentProxyConfig.getHostnameReference().get())))) { logger.info("InetAddress of the Syslog Server have changed, create a new connection. " + "Before=" + socket.getInetAddress() + ", new=" + inetAddress); IoUtils.closeQuietly(socket, writer); @@ -160,7 +176,6 @@ private synchronized void ensureSyslogServerConnection() throws IOException { } final InetSocketAddress syslogServer = new InetSocketAddress(inetAddress, syslogServerPort); - final ProxyConfig currentProxyConfig = this.proxyConfig; if(currentProxyConfig == null) { socket = socketFactory.createSocket(); @@ -168,6 +183,7 @@ private synchronized void ensureSyslogServerConnection() throws IOException { socket.connect( syslogServer, socketConnectTimeoutInMillis); + proxyConnectedSyslogServer = null; }else { final InetSocketAddress proxyAddr = new InetSocketAddress(currentProxyConfig.getHostnameReference().get(), currentProxyConfig.getPort()); final Socket underlying = new Socket(new Proxy(Proxy.Type.HTTP, proxyAddr)); @@ -175,9 +191,11 @@ private synchronized void ensureSyslogServerConnection() throws IOException { underlying.connect(syslogServer); socket = ((SSLSocketFactory)socketFactory).createSocket( underlying, - currentProxyConfig.getHostname(), - currentProxyConfig.getPort(), + syslogServer.getHostName(), + syslogServer.getPort(), true); + socket.setKeepAlive(true); + proxyConnectedSyslogServer = inetAddress; } From 3ce79ab4dc50dca8646284f99b111b22b1f7a8c6 Mon Sep 17 00:00:00 2001 From: jasonparallel Date: Tue, 22 Sep 2020 15:31:29 -0400 Subject: [PATCH 6/8] Make logic more readable --- .../syslog/sender/TcpSyslogMessageSender.java | 37 ++++++++++++++----- 1 file changed, 27 insertions(+), 10 deletions(-) diff --git a/src/main/java/com/cloudbees/syslog/sender/TcpSyslogMessageSender.java b/src/main/java/com/cloudbees/syslog/sender/TcpSyslogMessageSender.java index 8347fc3..678433b 100644 --- a/src/main/java/com/cloudbees/syslog/sender/TcpSyslogMessageSender.java +++ b/src/main/java/com/cloudbees/syslog/sender/TcpSyslogMessageSender.java @@ -131,19 +131,36 @@ public synchronized void sendMessage(@Nonnull SyslogMessage message) throws IOEx } } + /** + * @return true if not proxy connected and the socket is connected to current configured syslog + */ + private boolean notProxyConnectedAddressChange(final InetAddress inetAddress) { + return proxyConnectedSyslogServer == null && !Objects.equals(socket.getInetAddress(), inetAddress); + } + + /** + * @return true if currentProxyConfig status does not match proxyConnectedSyslogServer + */ + private boolean proxyUseHasChanged(final ProxyConfig currentProxyConfig) { + return (currentProxyConfig != null && proxyConnectedSyslogServer == null) + || (currentProxyConfig == null && proxyConnectedSyslogServer != null); + } + + /** + * @return true if proxy connected and either proxy connection or syslog server connection have changed + */ + private boolean proxyConnectedAddressChange(final ProxyConfig currentProxyConfig) { + return proxyConnectedSyslogServer != null && (!Objects.equals(socket.getInetAddress(), proxyConnectedSyslogServer) + || !Objects.equals(socket.getInetAddress(), currentProxyConfig.getHostnameReference().get())); + } + private synchronized void ensureSyslogServerConnection() throws IOException { InetAddress inetAddress = syslogServerHostnameReference.get(); final ProxyConfig currentProxyConfig = this.proxyConfig; - if (socket != null && - //If not proxy connected check that socket is connected to current configured syslog - ((proxyConnectedSyslogServer == null && !Objects.equals(socket.getInetAddress(), inetAddress)) - //If proxy configured but last connection was not via proxy - || (currentProxyConfig != null && proxyConnectedSyslogServer == null) - //If proxy not configured but last connection was via proxy - || (currentProxyConfig == null && proxyConnectedSyslogServer != null) - //If proxy connected check that socket is connected to current configured proxy and last connected syslog matches current configured syslog - || (proxyConnectedSyslogServer != null && !Objects.equals(socket.getInetAddress(), proxyConnectedSyslogServer) && - !Objects.equals(socket.getInetAddress(), currentProxyConfig.getHostnameReference().get())))) { + if (socket != null && ( + notProxyConnectedAddressChange(inetAddress) + || proxyUseHasChanged(currentProxyConfig) + || proxyConnectedAddressChange(currentProxyConfig))) { logger.info("InetAddress of the Syslog Server have changed, create a new connection. " + "Before=" + socket.getInetAddress() + ", new=" + inetAddress); IoUtils.closeQuietly(socket, writer); From f456bca26851ece6b3aeea3b14e2d22b1dfbac57 Mon Sep 17 00:00:00 2001 From: jasonparallel Date: Tue, 22 Sep 2020 16:43:13 -0400 Subject: [PATCH 7/8] Correct logic to compare server and proxy correctly --- .../com/cloudbees/syslog/sender/TcpSyslogMessageSender.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/main/java/com/cloudbees/syslog/sender/TcpSyslogMessageSender.java b/src/main/java/com/cloudbees/syslog/sender/TcpSyslogMessageSender.java index 678433b..0db8aa3 100644 --- a/src/main/java/com/cloudbees/syslog/sender/TcpSyslogMessageSender.java +++ b/src/main/java/com/cloudbees/syslog/sender/TcpSyslogMessageSender.java @@ -149,8 +149,8 @@ private boolean proxyUseHasChanged(final ProxyConfig currentProxyConfig) { /** * @return true if proxy connected and either proxy connection or syslog server connection have changed */ - private boolean proxyConnectedAddressChange(final ProxyConfig currentProxyConfig) { - return proxyConnectedSyslogServer != null && (!Objects.equals(socket.getInetAddress(), proxyConnectedSyslogServer) + private boolean proxyConnectedAddressChange(final InetAddress syslogServer, final ProxyConfig currentProxyConfig) { + return proxyConnectedSyslogServer != null && (!Objects.equals(syslogServer, proxyConnectedSyslogServer) || !Objects.equals(socket.getInetAddress(), currentProxyConfig.getHostnameReference().get())); } @@ -160,7 +160,7 @@ private synchronized void ensureSyslogServerConnection() throws IOException { if (socket != null && ( notProxyConnectedAddressChange(inetAddress) || proxyUseHasChanged(currentProxyConfig) - || proxyConnectedAddressChange(currentProxyConfig))) { + || proxyConnectedAddressChange(inetAddress, currentProxyConfig))) { logger.info("InetAddress of the Syslog Server have changed, create a new connection. " + "Before=" + socket.getInetAddress() + ", new=" + inetAddress); IoUtils.closeQuietly(socket, writer); From f9b84b8b39a76626854a37f31cc8993e4b2af486 Mon Sep 17 00:00:00 2001 From: jasonparallel Date: Sat, 17 Oct 2020 20:55:10 -0400 Subject: [PATCH 8/8] Update TcpSyslogMessageSender.java Enable SSL Hostname Verification --- .../com/cloudbees/syslog/sender/TcpSyslogMessageSender.java | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/main/java/com/cloudbees/syslog/sender/TcpSyslogMessageSender.java b/src/main/java/com/cloudbees/syslog/sender/TcpSyslogMessageSender.java index 0db8aa3..69be81b 100644 --- a/src/main/java/com/cloudbees/syslog/sender/TcpSyslogMessageSender.java +++ b/src/main/java/com/cloudbees/syslog/sender/TcpSyslogMessageSender.java @@ -26,6 +26,7 @@ import javax.annotation.concurrent.ThreadSafe; import javax.net.SocketFactory; import javax.net.ssl.SSLContext; +import javax.net.ssl.SSLParameters; import javax.net.ssl.SSLSession; import javax.net.ssl.SSLSocket; import javax.net.ssl.SSLSocketFactory; @@ -212,6 +213,10 @@ private synchronized void ensureSyslogServerConnection() throws IOException { syslogServer.getPort(), true); socket.setKeepAlive(true); + final SSLSocket sslSocket = (SSLSocket) socket; + final SSLParameters sslParams = new SSLParameters(); + sslParams.setEndpointIdentificationAlgorithm("HTTPS"); + sslSocket.setSSLParameters(sslParams); proxyConnectedSyslogServer = inetAddress; }