diff --git a/src/java/org/jivesoftware/multiplexer/ConnectionManager.java b/src/java/org/jivesoftware/multiplexer/ConnectionManager.java
index ac3d9a7..93eee10 100644
--- a/src/java/org/jivesoftware/multiplexer/ConnectionManager.java
+++ b/src/java/org/jivesoftware/multiplexer/ConnectionManager.java
@@ -339,7 +339,7 @@
}
catch (Exception e) {
httpBindManager = null;
- System.err.println("Error starting http bind servlet " + plainPort + "and" + sslPort
+ System.err.println("Error starting http bind servlet " + plainPort + " and " + sslPort
+ ": " + e.getMessage());
Log.error(LocaleUtils.getLocalizedString("admin.error.http.bind"), e);
}
diff --git a/src/java/org/jivesoftware/multiplexer/net/SSLConfig.java b/src/java/org/jivesoftware/multiplexer/net/SSLConfig.java
index 732975c..7e66780 100644
--- a/src/java/org/jivesoftware/multiplexer/net/SSLConfig.java
+++ b/src/java/org/jivesoftware/multiplexer/net/SSLConfig.java
@@ -38,13 +38,14 @@
private static String trustpass;
private static String keyStoreLocation;
private static String trustStoreLocation;
+ private static String storeType;
private SSLConfig() {
}
static {
String algorithm = JiveGlobals.getXMLProperty("xmpp.socket.ssl.algorithm", "TLS");
- String storeType = JiveGlobals.getXMLProperty("xmpp.socket.ssl.storeType", "jks");
+ storeType = JiveGlobals.getXMLProperty("xmpp.socket.ssl.storeType", "jks");
// Get the keystore location. The default location is security/keystore
keyStoreLocation = JiveGlobals.getXMLProperty("xmpp.socket.ssl.keystore",
@@ -153,4 +154,20 @@
return sslFactory.createServerSocket(port, -1, ifAddress);
}
}
+
+ public static String getKeystoreLocation() {
+ return keyStoreLocation;
+ }
+
+ public static String getTruststoreLocation() {
+ return trustStoreLocation;
+ }
+
+ public static String getStoreType() {
+ return storeType;
+ }
+
+ public static SSLJiveServerSocketFactory getServerSocketFactory() {
+ return sslFactory;
+ }
}
\ No newline at end of file
diff --git a/src/java/org/jivesoftware/multiplexer/net/http/HttpBindManager.java b/src/java/org/jivesoftware/multiplexer/net/http/HttpBindManager.java
index d4a78d7..e7c503f 100644
--- a/src/java/org/jivesoftware/multiplexer/net/http/HttpBindManager.java
+++ b/src/java/org/jivesoftware/multiplexer/net/http/HttpBindManager.java
@@ -12,14 +12,20 @@
import org.mortbay.jetty.Server;
import org.mortbay.jetty.Connector;
+import org.mortbay.jetty.Handler;
+import org.mortbay.jetty.security.SslSocketConnector;
import org.mortbay.jetty.servlet.ServletHolder;
import org.mortbay.jetty.servlet.ServletHandler;
import org.mortbay.jetty.nio.SelectChannelConnector;
+import org.jivesoftware.multiplexer.net.SSLConfig;
+import org.jivesoftware.util.Log;
+
+import javax.net.ssl.SSLServerSocketFactory;
/**
- * Manages connections to the server which use the HTTP Bind protocol specified in
- * XEP-0124. The manager maps a servlet
- * to an embedded servlet container using the ports provided in the constructor.
+ * Manages connections to the server which use the HTTP Bind protocol specified in XEP-0124. The manager maps a servlet to
+ * an embedded servlet container using the ports provided in the constructor.
*
* @author Alexander Wenckus
*/
@@ -42,17 +48,49 @@
* @throws Exception if there is an error starting up the server.
*/
public void startup() throws Exception {
- SelectChannelConnector connector = new SelectChannelConnector();
- connector.setPort(plainPort);
- server.setConnectors(new Connector[]{connector});
+ for(Connector connector : createConnectors()) {
+ server.addConnector(connector);
+ }
+ server.addHandler(createServletHandler());
+ server.start();
+ }
+
+ private Handler createServletHandler() {
ServletHolder servletHolder = new ServletHolder(
new HttpBindServlet(new HttpSessionManager(serverName)));
ServletHandler servletHandler = new ServletHandler();
servletHandler.addServletWithMapping(servletHolder, "/");
- server.addHandler(servletHandler);
+ return servletHandler;
+ }
- server.start();
+ private Connector[] createConnectors() {
+ SelectChannelConnector connector = new SelectChannelConnector();
+ connector.setPort(plainPort);
+
+ if (sslPort > 0) {
+ try {
+ SslSocketConnector secureConnector = new JiveSslConnector();
+ secureConnector.setPort(sslPort);
+
+ secureConnector.setTrustPassword(SSLConfig.getTrustPassword());
+ secureConnector.setTruststoreType(SSLConfig.getStoreType());
+ secureConnector.setTruststore(SSLConfig.getTruststoreLocation());
+ secureConnector.setNeedClientAuth(false);
+ secureConnector.setWantClientAuth(false);
+
+ secureConnector.setKeyPassword(SSLConfig.getKeyPassword());
+ secureConnector.setKeystoreType(SSLConfig.getStoreType());
+ secureConnector.setKeystore(SSLConfig.getKeystoreLocation());
+
+ return new Connector[]{connector, secureConnector};
+ }
+ catch (Exception ex) {
+ Log.error("Error establishing SSL connector for HTTP Bind", ex);
+ }
+ }
+
+ return new Connector[]{connector};
}
/**
@@ -63,4 +101,12 @@
public void shutdown() throws Exception {
server.stop();
}
+
+ private class JiveSslConnector extends SslSocketConnector {
+
+ @Override
+ protected SSLServerSocketFactory createFactory() throws Exception {
+ return SSLConfig.getServerSocketFactory();
+ }
+ }
}