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 <john...@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];
+               }
+       }
 
 }

Reply via email to