001: package org.apache.mina.example.echoserver.ssl;
002:
003: import java.net.InetSocketAddress;
004: import java.net.Socket;
005: import java.nio.charset.Charset;
006: import java.security.cert.CertificateException;
007: import java.util.ArrayList;
008: import java.util.List;
009:
010: import javax.net.ssl.SSLContext;
011: import javax.net.ssl.SSLSocket;
012: import javax.net.ssl.TrustManager;
013: import javax.net.ssl.X509TrustManager;
014:
015: import junit.framework.TestCase;
016:
017: import org.apache.mina.common.IoAcceptor;
018: import org.apache.mina.common.IoHandlerAdapter;
019: import org.apache.mina.common.IoSession;
020: import org.apache.mina.filter.codec.ProtocolCodecFilter;
021: import org.apache.mina.filter.codec.textline.TextLineCodecFactory;
022: import org.apache.mina.filter.ssl.SslFilter;
023: import org.apache.mina.transport.socket.nio.NioSocketAcceptor;
024:
025: public class SslFilterTest extends TestCase {
026:
027: private static final int PORT = 17887;
028:
029: private IoAcceptor acceptor;
030:
031: @Override
032: protected void setUp() throws Exception {
033: super .setUp();
034: acceptor = new NioSocketAcceptor();
035: }
036:
037: @Override
038: protected void tearDown() throws Exception {
039: acceptor.setCloseOnDeactivation(true);
040: acceptor.dispose();
041: super .tearDown();
042: }
043:
044: public void testMessageSentIsCalled() throws Exception {
045: testMessageSentIsCalled(false);
046: }
047:
048: public void testMessageSentIsCalled_With_SSL() throws Exception {
049: testMessageSentIsCalled(true);
050: }
051:
052: private void testMessageSentIsCalled(boolean useSSL)
053: throws Exception {
054: SslFilter sslFilter = null;
055: if (useSSL) {
056: sslFilter = new SslFilter(BogusSslContextFactory
057: .getInstance(true));
058: acceptor.getFilterChain().addLast("sslFilter", sslFilter);
059: }
060: acceptor.getFilterChain().addLast(
061: "codec",
062: new ProtocolCodecFilter(new TextLineCodecFactory(
063: Charset.forName("UTF-8"))));
064:
065: EchoHandler handler = new EchoHandler();
066: acceptor.setHandler(handler);
067: acceptor.bind(new InetSocketAddress(PORT));
068: System.out.println("MINA server started.");
069:
070: Socket socket = getClientSocket(useSSL);
071: int bytesSent = 0;
072: bytesSent += writeMessage(socket, "test-1\n");
073:
074: if (useSSL) {
075: // Test renegotiation
076: SSLSocket ss = (SSLSocket) socket;
077: //ss.getSession().invalidate();
078: ss.startHandshake();
079: }
080:
081: bytesSent += writeMessage(socket, "test-2\n");
082:
083: int[] response = new int[bytesSent];
084: for (int i = 0; i < response.length; i++) {
085: response[i] = socket.getInputStream().read();
086: }
087:
088: if (useSSL) {
089: // Read SSL close notify.
090: while (socket.getInputStream().read() >= 0) {
091: continue;
092: }
093: }
094:
095: socket.close();
096: while (acceptor.getManagedSessions().size() != 0) {
097: Thread.sleep(100);
098: }
099:
100: System.out.println("handler: " + handler.sentMessages);
101: assertEquals("handler should have sent 2 messages:", 2,
102: handler.sentMessages.size());
103: assertTrue(handler.sentMessages.contains("test-1"));
104: assertTrue(handler.sentMessages.contains("test-2"));
105: }
106:
107: private int writeMessage(Socket socket, String message)
108: throws Exception {
109: byte request[] = message.getBytes("UTF-8");
110: socket.getOutputStream().write(request);
111: return request.length;
112: }
113:
114: private Socket getClientSocket(boolean ssl) throws Exception {
115: if (ssl) {
116: SSLContext ctx = SSLContext.getInstance("TLS");
117: ctx.init(null, trustManagers, null);
118: return ctx.getSocketFactory().createSocket("localhost",
119: PORT);
120: }
121: return new Socket("localhost", PORT);
122: }
123:
124: private static class EchoHandler extends IoHandlerAdapter {
125:
126: List<String> sentMessages = new ArrayList<String>();
127:
128: @Override
129: public void exceptionCaught(IoSession session, Throwable cause)
130: throws Exception {
131: cause.printStackTrace();
132: }
133:
134: @Override
135: public void messageReceived(IoSession session, Object message)
136: throws Exception {
137: session.write(message);
138: }
139:
140: @Override
141: public void messageSent(IoSession session, Object message)
142: throws Exception {
143: sentMessages.add(message.toString());
144: System.out.println(message);
145: if (sentMessages.size() >= 2) {
146: session.close();
147: }
148: }
149: }
150:
151: TrustManager[] trustManagers = new TrustManager[] { new TrustAnyone() };
152:
153: private static class TrustAnyone implements X509TrustManager {
154: public void checkClientTrusted(
155: java.security.cert.X509Certificate[] x509Certificates,
156: String s) throws CertificateException {
157: }
158:
159: public void checkServerTrusted(
160: java.security.cert.X509Certificate[] x509Certificates,
161: String s) throws CertificateException {
162: }
163:
164: public java.security.cert.X509Certificate[] getAcceptedIssuers() {
165: return new java.security.cert.X509Certificate[0];
166: }
167: }
168:
169: }
|