/** * $RCSfile$ * $Revision: $ * $Date: $ * * Copyright (C) 2006 Jive Software. All rights reserved. * * This software is published under the terms of the GNU Public License (GPL), * a copy of which is included in this distribution. */ package org.jivesoftware.multiplexer.net.http; 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 <a * href="http://www.xmpp.org/extensions/xep-0124.html">XEP-0124</a>. The manager maps a servlet to * an embedded servlet container using the ports provided in the constructor. * * @author Alexander Wenckus */ public class HttpBindManager { private int plainPort; private int sslPort; private Server server; private String serverName; public HttpBindManager(String serverName, int plainPort, int sslPort) { this.plainPort = plainPort; this.sslPort = sslPort; this.server = new Server(); this.serverName = serverName; } /** * Starts the HTTP Bind service. * * @throws Exception if there is an error starting up the server. */ public void startup() throws Exception { 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, "/"); return servletHandler; } 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}; } /** * Shutdown the HTTP Bind service, freeing any related resources. * * @throws Exception if there is an error shutting down the service. */ public void shutdown() throws Exception { server.stop(); } private class JiveSslConnector extends SslSocketConnector { @Override protected SSLServerSocketFactory createFactory() throws Exception { return SSLConfig.getServerSocketFactory(); } } }