|
|
|
|
@ -2,3 +2,177 @@ http://irc-api.googlecode.com/svn/trunk@179
|
|
|
|
|
|
|
|
|
|
Additional modifications:
|
|
|
|
|
-------------------------
|
|
|
|
|
commit 99062b621dcf6722fc0b8c868abc806092369086
|
|
|
|
|
Author: Danny van Heumen <danny@dannyvanheumen.nl>
|
|
|
|
|
Date: Sun Jan 26 22:46:28 2014 +0100
|
|
|
|
|
|
|
|
|
|
Added support for providing custom SSLContext.
|
|
|
|
|
|
|
|
|
|
diff --git a/src/main/java/com/ircclouds/irc/api/AbstractIRCSession.java b/src/main/java/com/ircclouds/irc/api/AbstractIRCSession.java
|
|
|
|
|
index 67bdecd..08b5030 100644
|
|
|
|
|
--- a/src/main/java/com/ircclouds/irc/api/AbstractIRCSession.java
|
|
|
|
|
+++ b/src/main/java/com/ircclouds/irc/api/AbstractIRCSession.java
|
|
|
|
|
@@ -2,6 +2,8 @@ package com.ircclouds.irc.api;
|
|
|
|
|
|
|
|
|
|
import java.io.*;
|
|
|
|
|
|
|
|
|
|
+import javax.net.ssl.*;
|
|
|
|
|
+
|
|
|
|
|
import com.ircclouds.irc.api.commands.*;
|
|
|
|
|
import com.ircclouds.irc.api.comms.*;
|
|
|
|
|
import com.ircclouds.irc.api.domain.*;
|
|
|
|
|
@@ -90,7 +92,7 @@ public abstract class AbstractIRCSession implements IIRCSession
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@Override
|
|
|
|
|
- public boolean open(IRCServer aServer) throws IOException
|
|
|
|
|
+ public boolean open(IRCServer aServer, SSLContext aCustomContext) throws IOException
|
|
|
|
|
{
|
|
|
|
|
if (!aServer.isSSL())
|
|
|
|
|
{
|
|
|
|
|
@@ -98,7 +100,7 @@ public abstract class AbstractIRCSession implements IIRCSession
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
- conn = new SSLSocketChannelConnection();
|
|
|
|
|
+ conn = new SSLSocketChannelConnection(aCustomContext);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (conn.open(aServer.getHostname(), aServer.getPort()))
|
|
|
|
|
diff --git a/src/main/java/com/ircclouds/irc/api/IIRCSession.java b/src/main/java/com/ircclouds/irc/api/IIRCSession.java
|
|
|
|
|
index eafb171..b17f1ae 100644
|
|
|
|
|
--- a/src/main/java/com/ircclouds/irc/api/IIRCSession.java
|
|
|
|
|
+++ b/src/main/java/com/ircclouds/irc/api/IIRCSession.java
|
|
|
|
|
@@ -2,6 +2,8 @@ package com.ircclouds.irc.api;
|
|
|
|
|
|
|
|
|
|
import java.io.*;
|
|
|
|
|
|
|
|
|
|
+import javax.net.ssl.*;
|
|
|
|
|
+
|
|
|
|
|
import com.ircclouds.irc.api.domain.*;
|
|
|
|
|
import com.ircclouds.irc.api.filters.*;
|
|
|
|
|
import com.ircclouds.irc.api.listeners.*;
|
|
|
|
|
@@ -14,7 +16,7 @@ public interface IIRCSession
|
|
|
|
|
|
|
|
|
|
void removeListener(IMessageListener aListener);
|
|
|
|
|
|
|
|
|
|
- boolean open(IRCServer aServer) throws IOException;
|
|
|
|
|
+ boolean open(IRCServer aServer, SSLContext aCustomContext) throws IOException;
|
|
|
|
|
|
|
|
|
|
void close() throws IOException;
|
|
|
|
|
|
|
|
|
|
diff --git a/src/main/java/com/ircclouds/irc/api/IRCApiImpl.java b/src/main/java/com/ircclouds/irc/api/IRCApiImpl.java
|
|
|
|
|
index 8b60c05..4bb1408 100644
|
|
|
|
|
--- a/src/main/java/com/ircclouds/irc/api/IRCApiImpl.java
|
|
|
|
|
+++ b/src/main/java/com/ircclouds/irc/api/IRCApiImpl.java
|
|
|
|
|
@@ -96,7 +96,7 @@ public class IRCApiImpl implements IRCApi
|
|
|
|
|
boolean _isOpen = false;
|
|
|
|
|
try
|
|
|
|
|
{
|
|
|
|
|
- if (_isOpen = session.open(aServerParameters.getServer()))
|
|
|
|
|
+ if (_isOpen = session.open(aServerParameters.getServer(), aServerParameters.getCustomContext()))
|
|
|
|
|
{
|
|
|
|
|
executeAsync(new ConnectCmd(aServerParameters), aCallback, _d);
|
|
|
|
|
}
|
|
|
|
|
diff --git a/src/main/java/com/ircclouds/irc/api/IServerParameters.java b/src/main/java/com/ircclouds/irc/api/IServerParameters.java
|
|
|
|
|
index b3bc942..2338ed5 100644
|
|
|
|
|
--- a/src/main/java/com/ircclouds/irc/api/IServerParameters.java
|
|
|
|
|
+++ b/src/main/java/com/ircclouds/irc/api/IServerParameters.java
|
|
|
|
|
@@ -2,6 +2,8 @@ package com.ircclouds.irc.api;
|
|
|
|
|
|
|
|
|
|
import java.util.*;
|
|
|
|
|
|
|
|
|
|
+import javax.net.ssl.*;
|
|
|
|
|
+
|
|
|
|
|
import com.ircclouds.irc.api.domain.*;
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
@@ -41,4 +43,10 @@ public interface IServerParameters
|
|
|
|
|
* @return
|
|
|
|
|
*/
|
|
|
|
|
IRCServer getServer();
|
|
|
|
|
+
|
|
|
|
|
+ /**
|
|
|
|
|
+ * Returns the custom SSL context if it is specified, or null otherwise.
|
|
|
|
|
+ * @return returns SSLContext instance or null
|
|
|
|
|
+ */
|
|
|
|
|
+ SSLContext getCustomContext();
|
|
|
|
|
}
|
|
|
|
|
diff --git a/src/main/java/com/ircclouds/irc/api/comms/SSLSocketChannelConnection.java b/src/main/java/com/ircclouds/irc/api/comms/SSLSocketChannelConnection.java
|
|
|
|
|
index c9096ac..abec187 100644
|
|
|
|
|
--- a/src/main/java/com/ircclouds/irc/api/comms/SSLSocketChannelConnection.java
|
|
|
|
|
+++ b/src/main/java/com/ircclouds/irc/api/comms/SSLSocketChannelConnection.java
|
|
|
|
|
@@ -14,7 +14,8 @@ import org.slf4j.*;
|
|
|
|
|
public class SSLSocketChannelConnection implements IConnection
|
|
|
|
|
{
|
|
|
|
|
private static final Logger LOG = LoggerFactory.getLogger(SSLSocketChannelConnection.class);
|
|
|
|
|
-
|
|
|
|
|
+
|
|
|
|
|
+ private final SSLContext customContext;
|
|
|
|
|
private SocketChannel sChannel;
|
|
|
|
|
private SSLEngine sslEngine;
|
|
|
|
|
|
|
|
|
|
@@ -25,12 +26,23 @@ public class SSLSocketChannelConnection implements IConnection
|
|
|
|
|
|
|
|
|
|
private HandshakeStatus hStatus;
|
|
|
|
|
private int remaingUnwraps;
|
|
|
|
|
+
|
|
|
|
|
+ public SSLSocketChannelConnection(SSLContext customContext)
|
|
|
|
|
+ {
|
|
|
|
|
+ this.customContext = customContext;
|
|
|
|
|
+ }
|
|
|
|
|
|
|
|
|
|
public boolean open(String aHostname, int aPort) throws IOException
|
|
|
|
|
{
|
|
|
|
|
try
|
|
|
|
|
{
|
|
|
|
|
- sslEngine = getInitializedSSLContext().createSSLEngine(aHostname, aPort);
|
|
|
|
|
+ SSLContext context = this.customContext;
|
|
|
|
|
+ if (context == null)
|
|
|
|
|
+ {
|
|
|
|
|
+ // initialize default SSLContext
|
|
|
|
|
+ context = getInitializedSSLContext();
|
|
|
|
|
+ }
|
|
|
|
|
+ sslEngine = context.createSSLEngine(aHostname, aPort);
|
|
|
|
|
sslEngine.setNeedClientAuth(false);
|
|
|
|
|
sslEngine.setUseClientMode(true);
|
|
|
|
|
sslEngine.beginHandshake();
|
|
|
|
|
diff --git a/src/test/java/com/ircclouds/irc/api/MockServerParametersImpl.java b/src/test/java/com/ircclouds/irc/api/MockServerParametersImpl.java
|
|
|
|
|
index 105b509..68dd46b 100644
|
|
|
|
|
--- a/src/test/java/com/ircclouds/irc/api/MockServerParametersImpl.java
|
|
|
|
|
+++ b/src/test/java/com/ircclouds/irc/api/MockServerParametersImpl.java
|
|
|
|
|
@@ -2,6 +2,8 @@ package com.ircclouds.irc.api;
|
|
|
|
|
|
|
|
|
|
import java.util.*;
|
|
|
|
|
|
|
|
|
|
+import javax.net.ssl.*;
|
|
|
|
|
+
|
|
|
|
|
import com.ircclouds.irc.api.domain.*;
|
|
|
|
|
|
|
|
|
|
class MockServerParametersImpl implements IServerParameters
|
|
|
|
|
@@ -11,6 +13,7 @@ class MockServerParametersImpl implements IServerParameters
|
|
|
|
|
private String ident;
|
|
|
|
|
private String realname;
|
|
|
|
|
private IRCServer server;
|
|
|
|
|
+ private SSLContext customContext;
|
|
|
|
|
|
|
|
|
|
public MockServerParametersImpl(String aNickname, List<String> aAltNicks, String aIdent, String aRealname, IRCServer aServer)
|
|
|
|
|
{
|
|
|
|
|
@@ -19,6 +22,7 @@ class MockServerParametersImpl implements IServerParameters
|
|
|
|
|
ident = aIdent;
|
|
|
|
|
realname = aRealname;
|
|
|
|
|
server = aServer;
|
|
|
|
|
+ customContext = null;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@Override
|
|
|
|
|
@@ -51,4 +55,9 @@ class MockServerParametersImpl implements IServerParameters
|
|
|
|
|
return server;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
+ @Override
|
|
|
|
|
+ public SSLContext getCustomContext()
|
|
|
|
|
+ {
|
|
|
|
|
+ return customContext;
|
|
|
|
|
+ }
|
|
|
|
|
}
|
|
|
|
|
|