From 9a290e85b9d13a2c395b7106b1e43aceb4ac2fc2 Mon Sep 17 00:00:00 2001 From: marci4 Date: Mon, 19 Apr 2021 19:56:00 +0200 Subject: [PATCH] Provide SSLSession in WebSocketClient Fixes #1142 --- .../client/WebSocketClient.java | 8 +- .../java_websocket/issues/Issue1142Test.java | 138 ++++++++++++++++++ 2 files changed, 144 insertions(+), 2 deletions(-) create mode 100644 src/test/java/org/java_websocket/issues/Issue1142Test.java diff --git a/src/main/java/org/java_websocket/client/WebSocketClient.java b/src/main/java/org/java_websocket/client/WebSocketClient.java index 203c9b67..ae45f676 100644 --- a/src/main/java/org/java_websocket/client/WebSocketClient.java +++ b/src/main/java/org/java_websocket/client/WebSocketClient.java @@ -955,12 +955,16 @@ public String getResourceDescriptor() { @Override public boolean hasSSLSupport() { - return engine.hasSSLSupport(); + return socket instanceof SSLSocket; } @Override public SSLSession getSSLSession() { - return engine.getSSLSession(); + if (!hasSSLSupport()) { + throw new IllegalArgumentException( + "This websocket uses ws instead of wss. No SSLSession available."); + } + return ((SSLSocket)socket).getSession(); } @Override diff --git a/src/test/java/org/java_websocket/issues/Issue1142Test.java b/src/test/java/org/java_websocket/issues/Issue1142Test.java new file mode 100644 index 00000000..21de76bb --- /dev/null +++ b/src/test/java/org/java_websocket/issues/Issue1142Test.java @@ -0,0 +1,138 @@ +package org.java_websocket.issues; + +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertTrue; + +import java.io.IOException; +import java.net.InetSocketAddress; +import java.net.URI; +import java.net.URISyntaxException; +import java.security.KeyManagementException; +import java.security.KeyStoreException; +import java.security.NoSuchAlgorithmException; +import java.security.UnrecoverableKeyException; +import java.security.cert.CertificateException; +import java.util.concurrent.CountDownLatch; +import javax.net.ssl.SSLContext; +import org.java_websocket.WebSocket; +import org.java_websocket.client.WebSocketClient; +import org.java_websocket.handshake.ClientHandshake; +import org.java_websocket.handshake.ServerHandshake; +import org.java_websocket.server.DefaultSSLWebSocketServerFactory; +import org.java_websocket.server.WebSocketServer; +import org.java_websocket.util.SSLContextUtil; +import org.java_websocket.util.SocketUtil; +import org.junit.Test; + +public class Issue1142Test { + + + + @Test(timeout = 4000) + public void testWithoutSSLSession() + throws IOException, URISyntaxException, InterruptedException { + int port = SocketUtil.getAvailablePort(); + final CountDownLatch countServerDownLatch = new CountDownLatch(1); + final WebSocketClient webSocket = new WebSocketClient(new URI("ws://localhost:" + port)) { + @Override + public void onOpen(ServerHandshake handshakedata) { + countServerDownLatch.countDown(); + } + + @Override + public void onMessage(String message) { + } + + @Override + public void onClose(int code, String reason, boolean remote) { + } + + @Override + public void onError(Exception ex) { + } + }; + WebSocketServer server = new MyWebSocketServer(port, countServerDownLatch); + server.start(); + countServerDownLatch.await(); + webSocket.connectBlocking(); + assertFalse(webSocket.hasSSLSupport()); + try { + webSocket.getSSLSession(); + assertFalse(false); + } catch (IllegalArgumentException e) { + // Fine + } + server.stop(); + } + + @Test(timeout = 4000) + public void testWithSSLSession() + throws IOException, URISyntaxException, KeyStoreException, NoSuchAlgorithmException, KeyManagementException, UnrecoverableKeyException, CertificateException, InterruptedException { + int port = SocketUtil.getAvailablePort(); + final CountDownLatch countServerDownLatch = new CountDownLatch(1); + final WebSocketClient webSocket = new WebSocketClient(new URI("wss://localhost:" + port)) { + @Override + public void onOpen(ServerHandshake handshakedata) { + countServerDownLatch.countDown(); + } + + @Override + public void onMessage(String message) { + } + + @Override + public void onClose(int code, String reason, boolean remote) { + } + + @Override + public void onError(Exception ex) { + } + }; + WebSocketServer server = new MyWebSocketServer(port, countServerDownLatch); + SSLContext sslContext = SSLContextUtil.getContext(); + + server.setWebSocketFactory(new DefaultSSLWebSocketServerFactory(sslContext)); + webSocket.setSocketFactory(sslContext.getSocketFactory()); + server.start(); + countServerDownLatch.await(); + webSocket.connectBlocking(); + assertTrue(webSocket.hasSSLSupport()); + assertNotNull(webSocket.getSSLSession()); + server.stop(); + } + + private static class MyWebSocketServer extends WebSocketServer { + + private final CountDownLatch countServerLatch; + + + public MyWebSocketServer(int port, CountDownLatch serverDownLatch) { + super(new InetSocketAddress(port)); + this.countServerLatch = serverDownLatch; + } + + @Override + public void onOpen(WebSocket conn, ClientHandshake handshake) { + } + + @Override + public void onClose(WebSocket conn, int code, String reason, boolean remote) { + } + + @Override + public void onMessage(WebSocket conn, String message) { + + } + + @Override + public void onError(WebSocket conn, Exception ex) { + ex.printStackTrace(); + } + + @Override + public void onStart() { + countServerLatch.countDown(); + } + } +}