You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@mina.apache.org by jo...@apache.org on 2022/01/15 13:54:27 UTC

[mina] branch 2.2.X updated: Small improvements and testing with SSL

This is an automated email from the ASF dual-hosted git repository.

johnnyv pushed a commit to branch 2.2.X
in repository https://gitbox.apache.org/repos/asf/mina.git


The following commit(s) were added to refs/heads/2.2.X by this push:
     new 557c6ea  Small improvements and testing with SSL
557c6ea is described below

commit 557c6eac2430cd0b92c77c1a303ca5ab5ddab9d9
Author: Jonathan Valliere <jo...@apache.org>
AuthorDate: Sat Jan 15 08:54:24 2022 -0500

    Small improvements and testing with SSL
    
    * Adds SSL inboundDone check and throws illegal state
    * Fixes spelling mistake in SSLHandler
    * Read/Write improvements to SslFilterTest
---
 .../org/apache/mina/filter/ssl/SSLHandlerG0.java   |  11 +-
 .../mina/example/echoserver/ssl/SslFilterTest.java | 280 +++++++++++----------
 2 files changed, 149 insertions(+), 142 deletions(-)

diff --git a/mina-core/src/main/java/org/apache/mina/filter/ssl/SSLHandlerG0.java b/mina-core/src/main/java/org/apache/mina/filter/ssl/SSLHandlerG0.java
index db007b3..648e0bb 100644
--- a/mina-core/src/main/java/org/apache/mina/filter/ssl/SSLHandlerG0.java
+++ b/mina-core/src/main/java/org/apache/mina/filter/ssl/SSLHandlerG0.java
@@ -177,14 +177,19 @@ public class SSLHandlerG0 extends SSLHandler {
 			LOGGER.debug("{} receive_loop() - source {}", toString(), message);
 		}
 
+		if (mEngine.isInboundDone()) {
+			throw new IllegalStateException("closed");
+		}
+
 		final IoBuffer source = message;
 		final IoBuffer dest = allocate_app_buffer(source.remaining());
 
 		final SSLEngineResult result = mEngine.unwrap(source.buf(), dest.buf());
 
 		if (LOGGER.isDebugEnabled()) {
-			LOGGER.debug("{} receive_loop() - bytes-consumed {}, bytes-produced {}, status {}, handshake {}", toString(),
-					result.bytesConsumed(), result.bytesProduced(), result.getStatus(), result.getHandshakeStatus());
+			LOGGER.debug("{} receive_loop() - bytes-consumed {}, bytes-produced {}, status {}, handshake {}",
+					toString(), result.bytesConsumed(), result.bytesProduced(), result.getStatus(),
+					result.getHandshakeStatus());
 		}
 
 		if (result.bytesProduced() == 0) {
@@ -467,7 +472,7 @@ public class SSLHandlerG0 extends SSLHandler {
 		switch (result.getHandshakeStatus()) {
 			case NEED_UNWRAP:
 				if (LOGGER.isDebugEnabled()) {
-					LOGGER.debug("{} lwrwrite_handshake_loopite() - handshake needs unwrap, invoking receive",
+					LOGGER.debug("{} write_handshake_loop() - handshake needs unwrap, invoking receive",
 							toString());
 				}
 				this.receive(next, ZERO);
diff --git a/mina-example/src/test/java/org/apache/mina/example/echoserver/ssl/SslFilterTest.java b/mina-example/src/test/java/org/apache/mina/example/echoserver/ssl/SslFilterTest.java
index 7a999aa..dfe4d08 100644
--- a/mina-example/src/test/java/org/apache/mina/example/echoserver/ssl/SslFilterTest.java
+++ b/mina-example/src/test/java/org/apache/mina/example/echoserver/ssl/SslFilterTest.java
@@ -22,6 +22,10 @@ package org.apache.mina.example.echoserver.ssl;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertTrue;
 
+import java.io.BufferedReader;
+import java.io.BufferedWriter;
+import java.io.InputStreamReader;
+import java.io.OutputStreamWriter;
 import java.net.InetSocketAddress;
 import java.net.Socket;
 import java.nio.charset.StandardCharsets;
@@ -52,144 +56,142 @@ import org.junit.Test;
  */
 public class SslFilterTest {
 
-    private int port;
-    private SocketAcceptor acceptor;
-
-    @Before
-    public void setUp() throws Exception {
-        acceptor = new NioSocketAcceptor();
-    }
-
-    @After
-    public void tearDown() throws Exception {
-        acceptor.setCloseOnDeactivation(true);
-        acceptor.dispose();
-    }
-
-    @Test
-    public void testMessageSentIsCalled() throws Exception {
-        testMessageSentIsCalled(false);
-    }
-
-    @Test
-    public void testMessageSentIsCalled_With_SSL() throws Exception {
-        testMessageSentIsCalled(true);
-    }
-
-    private void testMessageSentIsCalled(boolean useSSL) throws Exception {
-        // Workaround to fix TLS issue : http://java.sun.com/javase/javaseforbusiness/docs/TLSReadme.html
-        java.lang.System.setProperty( "sun.security.ssl.allowUnsafeRenegotiation", "true" );
-
-        SSLFilter sslFilter = null;
-        if (useSSL) {
-            sslFilter = new SSLFilter(BogusSslContextFactory.getInstance(true));
-            acceptor.getFilterChain().addLast("sslFilter", sslFilter);
-        }
-        acceptor.getFilterChain().addLast(
-                "codec",
-                new ProtocolCodecFilter(new TextLineCodecFactory(StandardCharsets.UTF_8)));
-
-        EchoHandler handler = new EchoHandler();
-        acceptor.setHandler(handler);
-        acceptor.bind(new InetSocketAddress(0));
-        port = acceptor.getLocalAddress().getPort();
-        //System.out.println("MINA server started.");
-
-        Socket socket = getClientSocket(useSSL);
-        int bytesSent = 0;
-        bytesSent += writeMessage(socket, "test-1\n");
-
-        if (useSSL) {
-            // Test renegotiation
-            SSLSocket ss = (SSLSocket) socket;
-            //ss.getSession().invalidate();
-            ss.startHandshake();
-        }
-
-        bytesSent += writeMessage(socket, "test-2\n");
-
-        int[] response = new int[bytesSent];
-        for (int i = 0; i < response.length; i++) {
-            response[i] = socket.getInputStream().read();
-        }
-
-        if (useSSL) {
-            // Read SSL close notify.
-            while (socket.getInputStream().read() >= 0) {
-                continue;
-            }
-        }
-
-        socket.close();
-        while (acceptor.getManagedSessions().size() != 0) {
-            Thread.sleep(100);
-        }
-
-        //System.out.println("handler: " + handler.sentMessages);
-        assertEquals("handler should have sent 2 messages:", 2,
-                handler.sentMessages.size());
-        assertTrue(handler.sentMessages.contains("test-1"));
-        assertTrue(handler.sentMessages.contains("test-2"));
-    }
-
-    private int writeMessage(Socket socket, String message) throws Exception {
-        byte request[] = message.getBytes(StandardCharsets.UTF_8);
-        socket.getOutputStream().write(request);
-        return request.length;
-    }
-
-    private Socket getClientSocket(boolean ssl) throws Exception {
-        if (ssl) {
-            SSLContext ctx = SSLContext.getInstance("TLS");
-            ctx.init(null, trustManagers, null);
-            return ctx.getSocketFactory().createSocket("localhost", port);
-        }
-        return new Socket("localhost", port);
-    }
-
-    private static class EchoHandler extends IoHandlerAdapter {
-
-        List<String> sentMessages = new ArrayList<String>();
-
-        @Override
-        public void exceptionCaught(IoSession session, Throwable cause)
-                throws Exception {
-            //cause.printStackTrace();
-        }
-
-        @Override
-        public void messageReceived(IoSession session, Object message)
-                throws Exception {
-            session.write(message);
-        }
-
-        @Override
-        public void messageSent(IoSession session, Object message)
-                throws Exception {
-            sentMessages.add(message.toString());
-
-            if (sentMessages.size() >= 2) {
-                session.closeNow();
-            }
-        }
-    }
-
-    TrustManager[] trustManagers = new TrustManager[] { new TrustAnyone() };
-
-    private static class TrustAnyone implements X509TrustManager {
-        public void checkClientTrusted(
-                java.security.cert.X509Certificate[] x509Certificates, String s)
-                throws CertificateException {
-        }
-
-        public void checkServerTrusted(
-                java.security.cert.X509Certificate[] x509Certificates, String s)
-                throws CertificateException {
-        }
-
-        public java.security.cert.X509Certificate[] getAcceptedIssuers() {
-            return new java.security.cert.X509Certificate[0];
-        }
-    }
+	private int port;
+	private SocketAcceptor acceptor;
+
+	@Before
+	public void setUp() throws Exception {
+		acceptor = new NioSocketAcceptor();
+	}
+
+	@After
+	public void tearDown() throws Exception {
+		acceptor.setCloseOnDeactivation(true);
+		acceptor.dispose();
+	}
+
+	@Test
+	public void testMessageSentIsCalled() throws Exception {
+		testMessageSentIsCalled(false);
+	}
+
+	@Test
+	public void testMessageSentIsCalled_With_SSL() throws Exception {
+		testMessageSentIsCalled(true);
+	}
+
+	private void testMessageSentIsCalled(boolean useSSL) throws Exception {
+		// Workaround to fix TLS issue :
+		// http://java.sun.com/javase/javaseforbusiness/docs/TLSReadme.html
+		java.lang.System.setProperty("sun.security.ssl.allowUnsafeRenegotiation", "true");
+
+		SSLFilter sslFilter = null;
+		if (useSSL) {
+			sslFilter = new SSLFilter(BogusSslContextFactory.getInstance(true));
+			acceptor.getFilterChain().addLast("sslFilter", sslFilter);
+		}
+		acceptor.getFilterChain().addLast("codec",
+				new ProtocolCodecFilter(new TextLineCodecFactory(StandardCharsets.UTF_8)));
+
+		EchoHandler handler = new EchoHandler();
+		acceptor.setHandler(handler);
+		acceptor.bind(new InetSocketAddress(0));
+		port = acceptor.getLocalAddress().getPort();
+		// System.out.println("MINA server started.");
+
+		Socket socket = getClientSocket(useSSL);
+
+		BufferedWriter output = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
+		BufferedReader input = new BufferedReader(new InputStreamReader(socket.getInputStream()));
+
+		output.write("test-1\n");
+		output.flush();
+
+		assert input.readLine().equals("test-1");
+
+		if (useSSL) {
+			// Test renegotiation
+			SSLSocket ss = (SSLSocket) socket;
+			// ss.getSession().invalidate();
+			ss.startHandshake();
+		}
+
+		output.write("test-2\n");
+		output.flush();
+
+		assert input.readLine().equals("test-2");
+
+		if (useSSL) {
+			// Read SSL close notify.
+			while (socket.getInputStream().read() >= 0) {
+				continue;
+			}
+		}
+
+		socket.close();
+		while (acceptor.getManagedSessions().size() != 0) {
+			Thread.sleep(100);
+		}
+
+		// System.out.println("handler: " + handler.sentMessages);
+		assertEquals("handler should have sent 2 messages:", 2, handler.sentMessages.size());
+		assertTrue(handler.sentMessages.contains("test-1"));
+		assertTrue(handler.sentMessages.contains("test-2"));
+	}
+
+	private int writeMessage(Socket socket, String message) throws Exception {
+		byte request[] = message.getBytes(StandardCharsets.UTF_8);
+		socket.getOutputStream().write(request);
+		return request.length;
+	}
+
+	private Socket getClientSocket(boolean ssl) throws Exception {
+		if (ssl) {
+			SSLContext ctx = SSLContext.getInstance("TLS");
+			ctx.init(null, trustManagers, null);
+			return ctx.getSocketFactory().createSocket("localhost", port);
+		}
+		return new Socket("localhost", port);
+	}
+
+	private static class EchoHandler extends IoHandlerAdapter {
+
+		List<String> sentMessages = new ArrayList<String>();
+
+		@Override
+		public void exceptionCaught(IoSession session, Throwable cause) throws Exception {
+			// cause.printStackTrace();
+		}
+
+		@Override
+		public void messageReceived(IoSession session, Object message) throws Exception {
+			session.write(message);
+		}
+
+		@Override
+		public void messageSent(IoSession session, Object message) throws Exception {
+			sentMessages.add(message.toString());
+
+			if (sentMessages.size() >= 2) {
+				session.closeNow();
+			}
+		}
+	}
+
+	TrustManager[] trustManagers = new TrustManager[] { new TrustAnyone() };
+
+	private static class TrustAnyone implements X509TrustManager {
+		public void checkClientTrusted(java.security.cert.X509Certificate[] x509Certificates, String s)
+				throws CertificateException {
+		}
+
+		public void checkServerTrusted(java.security.cert.X509Certificate[] x509Certificates, String s)
+				throws CertificateException {
+		}
+
+		public java.security.cert.X509Certificate[] getAcceptedIssuers() {
+			return new java.security.cert.X509Certificate[0];
+		}
+	}
 
 }