Author: degenaro
Date: Fri Jun 17 14:06:44 2016
New Revision: 1748861

URL: http://svn.apache.org/viewvc?rev=1748861&view=rev
Log:
UIMA-4730 Update Web Server (WS) to properly employ https with the new Jetty

Modified:
    uima/uima-ducc/trunk/src/main/admin/ducc_post_install
    
uima/uima-ducc/trunk/uima-ducc-web/src/main/java/org/apache/uima/ducc/ws/server/DuccWebServer.java
    
uima/uima-ducc/trunk/uima-ducc-web/src/main/java/org/apache/uima/ducc/ws/server/DuccWebServerHelper.java

Modified: uima/uima-ducc/trunk/src/main/admin/ducc_post_install
URL: 
http://svn.apache.org/viewvc/uima/uima-ducc/trunk/src/main/admin/ducc_post_install?rev=1748861&r1=1748860&r2=1748861&view=diff
==============================================================================
--- uima/uima-ducc/trunk/src/main/admin/ducc_post_install (original)
+++ uima/uima-ducc/trunk/src/main/admin/ducc_post_install Fri Jun 17 14:06:44 
2016
@@ -221,9 +221,9 @@ class PostInstall():
             rc = os.system(cmd);
 
         self.default_keystore_prop.v = reply
-        print 'keystore created as', reply
-            
-
+        print 'keystore = ', keystore
+        #print 'keypass = ', reply
+        #print 'storepass = ', reply
     # Setup and verify amq
     # make sure verify_ducc is sufficient - maybe move some checks to there?
 

Modified: 
uima/uima-ducc/trunk/uima-ducc-web/src/main/java/org/apache/uima/ducc/ws/server/DuccWebServer.java
URL: 
http://svn.apache.org/viewvc/uima/uima-ducc/trunk/uima-ducc-web/src/main/java/org/apache/uima/ducc/ws/server/DuccWebServer.java?rev=1748861&r1=1748860&r2=1748861&view=diff
==============================================================================
--- 
uima/uima-ducc/trunk/uima-ducc-web/src/main/java/org/apache/uima/ducc/ws/server/DuccWebServer.java
 (original)
+++ 
uima/uima-ducc/trunk/uima-ducc-web/src/main/java/org/apache/uima/ducc/ws/server/DuccWebServer.java
 Fri Jun 17 14:06:44 2016
@@ -35,10 +35,13 @@ import org.apache.uima.ducc.common.utils
 import org.apache.uima.ducc.ws.DuccPlugins;
 import org.eclipse.jetty.server.Connector;
 import org.eclipse.jetty.server.Handler;
+import org.eclipse.jetty.server.HttpConfiguration;
 import org.eclipse.jetty.server.HttpConnectionFactory;
 import org.eclipse.jetty.server.NCSARequestLog;
+import org.eclipse.jetty.server.SecureRequestCustomizer;
 import org.eclipse.jetty.server.Server;
 import org.eclipse.jetty.server.ServerConnector;
+import org.eclipse.jetty.server.SslConnectionFactory;
 import org.eclipse.jetty.server.handler.DefaultHandler;
 import org.eclipse.jetty.server.handler.HandlerList;
 import org.eclipse.jetty.server.handler.RequestLogHandler;
@@ -87,14 +90,6 @@ public class DuccWebServer {
                  }
         }
        
-       
-       /**
-        * The default port can be overridden in ducc.properties file, for 
example:
-        *              ducc.ws.port = 41233
-        */
-       //private int port = 42133;
-       //private String ipaddress = null;
-       
        /**
         * To support https, do the following:
         * 
@@ -102,23 +97,12 @@ public class DuccWebServer {
         *    keystore in ducc_web/etc directory
         * 2. in ducc.properties set SSL port, for example:
         *              ducc.ws.port.ssl = 42155
-        * 3. in ducc.properties set SSL password, for example:
-     *                 ducc.ws.port.ssl.pw = quackquack
-     *       
-     * Note: if SSL port is not set in ducc.properties, the webserver will not 
create
-     *       the SSL connection, and thus secure communications will be 
unsupported.
         */
-       private int portSsl = -1;
-       private String portSslPw = "quackquack";
-       private String rootDir = "?";
-
-       //
        
+       private String rootDir = "?";
        private Server server;
-       
        private CommonConfiguration commonConfiguration;
        
-       
        public DuccWebServer(CommonConfiguration commonConfiguration) {
                this.commonConfiguration = commonConfiguration;
                init();
@@ -141,12 +125,22 @@ public class DuccWebServer {
        }
        
        public int getPortSsl() {
-               return portSsl;
+               String property = 
DuccPropertiesResolver.get(DuccPropertiesResolver.ducc_ws_port_https);
+        int portHttps = ConfigValue.PortHttps.getInt(property);
+        return portHttps;
        }
        
        public String getRootDir() {
                return rootDir;
        }
+
+       public String getKeyStorePassword() {
+               return DuccWebServerHelper.getKeyStorePassword();
+       }
+
+       public String getKeyManagerPassword() {
+               return DuccWebServerHelper.getKeyManagerPassword();
+       }
        
        private void init() {
                String methodName = "init";
@@ -154,102 +148,92 @@ public class DuccWebServer {
                logger.info(methodName, null, messages.fetchLabel("cluster 
name")+getClusterName());
                logger.info(methodName, null, messages.fetchLabel("class 
definition file")+getClassDefinitionFile());
                
-                String property;
+               String property;
 
-         /**                                                                   
                                                                                
     
-          * Determine server idle timeout                                      
                                                                                
     
-          * ducc.ws.idle.timeout                                               
                                                                                
     
-          */
-         property = 
DuccPropertiesResolver.get(DuccPropertiesResolver.ducc_ws_idle_timeout);
-         int idleTimeout = ConfigValue.IdleTimeout.getInt(property);
+        /**                                                                    
                                                                                
    
+         * Determine server idle timeout                                       
                                                                                
    
+         * ducc.ws.idle.timeout                                                
                                                                                
    
+         */
+        property = 
DuccPropertiesResolver.get(DuccPropertiesResolver.ducc_ws_idle_timeout);
+        int idleTimeout = ConfigValue.IdleTimeout.getInt(property);
 
-         /**                                                                   
                                                                                
     
-          * Determine server max threads                                       
                                                                                
     
-          * ducc.ws.max.threads                                                
                                                                                
     
-          */
-         property = 
DuccPropertiesResolver.get(DuccPropertiesResolver.ducc_ws_max_threads);
-         int maxThreads = ConfigValue.MaxThreads.getInt(property);
+        /**                                                                    
                                                                                
    
+         * Determine server max threads                                        
                                                                                
    
+         * ducc.ws.max.threads                                                 
                                                                                
    
+         */
+        property = 
DuccPropertiesResolver.get(DuccPropertiesResolver.ducc_ws_max_threads);
+        int maxThreads = ConfigValue.MaxThreads.getInt(property);
 
-         /**                                                                   
                                                                                
     
-          * Determine server http port                                         
                                                                                
     
-          * ducc.ws.port                                                       
                                                                                
     
-          */
-         property = 
DuccPropertiesResolver.get(DuccPropertiesResolver.ducc_ws_port);
-         int portHttp = ConfigValue.PortHttp.getInt(property);
+        /**                                                                    
                                                                                
    
+         * Determine server http port                                          
                                                                                
    
+         * ducc.ws.port                                                        
                                                                                
    
+         */
+        property = 
DuccPropertiesResolver.get(DuccPropertiesResolver.ducc_ws_port);
+        int portHttp = ConfigValue.PortHttp.getInt(property);
 
         /**                                                                    
                                                                                
    
           * Determine server https port                                        
                                                                                
     
           * ducc.ws.port.https                                                 
                                                                                
     
           */
-         property = 
DuccPropertiesResolver.get(DuccPropertiesResolver.ducc_ws_port_https);
-         int portHttps = ConfigValue.PortHttps.getInt(property);
-
-         try {
-                 InetAddress inetAddress = InetAddress.getLocalHost();
-                 String host = inetAddress.getCanonicalHostName();
-                 DuccWebMonitor.getInstance().register(host, ""+portHttp);
-         }
-         catch(Exception e) {
-                 logger.error(methodName, jobid, e);
-         }
-
-         // === jetty.xml ===                                                  
                                                                                
     
-
-         // Setup Threadpool                                                   
                                                                                
     
-         QueuedThreadPool threadPool = new QueuedThreadPool();
-         threadPool.setMaxThreads(maxThreads);
-
-         // Server                                                             
                                                                                
             
-         server = new Server(threadPool);
-
-         // Scheduler                                                          
                                                                                
             
-         server.addBean(new ScheduledExecutorScheduler());
-
-         // === jetty-http.xml ===                                             
                                                                                
             
-         ServerConnector http = new ServerConnector(server, new 
HttpConnectionFactory());
-         http.setPort(portHttp);
-         http.setIdleTimeout(idleTimeout);
-         server.addConnector(http);
-
-         // === jetty-https.xml ===                                            
                                                                                
             
-         // SSL Context Factory                                                
                                                                                
             
-         SslContextFactory sslContextFactory = new SslContextFactory();
-         String keystore = DuccWebServerHelper.getDuccWebKeyStore();
+        property = 
DuccPropertiesResolver.get(DuccPropertiesResolver.ducc_ws_port_https);
+        int portHttps = ConfigValue.PortHttps.getInt(property);
 
+        try {
+               InetAddress inetAddress = InetAddress.getLocalHost();
+            String host = inetAddress.getCanonicalHostName();
+            DuccWebMonitor.getInstance().register(host, ""+portHttp);
+        }
+        catch(Exception e) {
+            logger.error(methodName, jobid, e);
+        }
 
+        // === jetty.xml ===                                                   
                                                                                
    
 
+        // Setup Threadpool                                                    
                                                                                
    
+        QueuedThreadPool threadPool = new QueuedThreadPool();
+        threadPool.setMaxThreads(maxThreads);
+
+        // Server                                                              
                                                                                
            
+        server = new Server(threadPool);
+
+        // Scheduler                                                           
                                                                                
            
+        server.addBean(new ScheduledExecutorScheduler());
+
+        // === jetty-http.xml ===                                              
                                                                                
            
+        ServerConnector http = new ServerConnector(server, new 
HttpConnectionFactory());
+        http.setPort(portHttp);
+        http.setIdleTimeout(idleTimeout);
+        server.addConnector(http);
+
+        // === jetty-https.xml ===                                             
                                                                                
            
+        // SSL Context Factory                                                 
                                                                                
            
+        SslContextFactory sslContextFactory = new SslContextFactory();
+        String keystore = DuccWebServerHelper.getDuccWebKeyStore();
+
+        logger.info(methodName, jobid, "keystore="+keystore);
+        HttpConfiguration http_config = new HttpConfiguration();
+               http_config.setSecureScheme("https");
+               http_config.setSecurePort(portHttps);
+               logger.info(methodName, jobid, "portHttps="+portHttps);
+        HttpConfiguration https_config = new HttpConfiguration(http_config);
+        https_config.addCustomizer(new SecureRequestCustomizer());
          
+        ServerConnector https = new ServerConnector(server,
+             new SslConnectionFactory(sslContextFactory,"http/1.1"),
+             new HttpConnectionFactory(https_config));
+
+        https.setPort(portHttps);
+        sslContextFactory.setKeyStorePath(keystore);
+        String pw = getKeyStorePassword();
+        logger.trace(methodName, jobid, "pw="+pw);
+        sslContextFactory.setKeyStorePassword(getKeyStorePassword());    
+        sslContextFactory.setKeyManagerPassword(getKeyManagerPassword());
+        
+        server.setConnectors(new Connector[] { http });
+        server.addConnector(https);
+        
+        // JSP
          
-         
-         
-         /*
-         
-               server = new Server();
-               SelectChannelConnector connector0 = new 
SelectChannelConnector();
-        connector0.setPort(port);
-        if(ipaddress != null) {
-               connector0.setHost(ipaddress);
-        }
-        if(portSsl < 0) {
-               server.setConnectors(new Connector[]{ connector0 });
-        }
-        else {
-               SslSelectChannelConnector ssl_connector = new 
SslSelectChannelConnector();
-               ssl_connector.setPort(portSsl);
-               if(ipaddress != null) {
-               ssl_connector.setHost(ipaddress);
-            }
-               org.eclipse.jetty.util.ssl.SslContextFactory cf = 
ssl_connector.getSslContextFactory();
-               //SslContextFactory cf = ssl_connector.getSslContextFactory();
-               String keystore = DuccWebServerHelper.getDuccWebKeyStore();
-               logger.info(methodName, null, "keystore:"+keystore);
-               cf.setKeyStorePath(keystore);
-        //     cf.setKeyStore(keystore);
-               cf.setKeyStorePassword(portSslPw);
-               server.setConnectors(new Connector[]{ connector0, ssl_connector 
});
-        }
-        */
-        //
         ServletContextHandler jspHandler = new 
ServletContextHandler(ServletContextHandler.SESSIONS);
         jspHandler.setContextPath("/");
         jspHandler.setResourceBase("root");
@@ -258,13 +242,13 @@ public class DuccWebServer {
         ServletHolder jsp = jspHandler.addServlet(JspServlet.class, "*.jsp");
         jsp.setInitParameter("classpath", jspHandler.getClassPath());
         //
-               ResourceHandler resourceHandler = new ResourceHandler();
-               resourceHandler.setDirectoriesListed(true);
-               resourceHandler.setWelcomeFiles(new String[]{ "index.html" });
-               rootDir = DuccWebServerHelper.getDuccWebRoot();
-               resourceHandler.setResourceBase(rootDir);
-               //
-               try {
+        ResourceHandler resourceHandler = new ResourceHandler();
+        resourceHandler.setDirectoriesListed(true);
+        resourceHandler.setWelcomeFiles(new String[]{ "index.html" });
+        rootDir = DuccWebServerHelper.getDuccWebRoot();
+        resourceHandler.setResourceBase(rootDir);
+        //
+        try {
                        Properties properties = DuccWebProperties.get();
                        String ducc_runmode = 
properties.getProperty("ducc.runmode","Production");
                        logger.debug(methodName, null, 
"ducc.runmode:"+ducc_runmode);
@@ -285,18 +269,18 @@ public class DuccWebServer {
                        out.println(text);
                        out.flush();
                        out.close();
-               }
-               catch(Exception e) {
+        }
+        catch(Exception e) {
                        logger.info(methodName, null, e);
-               }
-               //
-               HandlerList handlers = new HandlerList();
+        }
+        //
+        HandlerList handlers = new HandlerList();
                
-               String key = "ducc.ws.requestLog.RetainDays";
-               int dflt = 0;
-               int requestLogRetainDays = DuccPropertiesResolver.get(key, 
dflt);
-               logger.info(methodName, jobid, 
"requestLogRetainDays="+requestLogRetainDays);
-               if(requestLogRetainDays > 0) {
+        String key = "ducc.ws.requestLog.RetainDays";
+        int dflt = 0;
+        int requestLogRetainDays = DuccPropertiesResolver.get(key, dflt);
+        logger.info(methodName, jobid, 
"requestLogRetainDays="+requestLogRetainDays);
+        if(requestLogRetainDays > 0) {
                        String requestLogTimeZone = "GMT";
                        String requestLogFmt = "yyyy_MM_dd";
                        String requestLogFile = 
IDuccEnv.DUCC_LOGS_WEBSERVER_DIR+requestLogFmt+".request.log";
@@ -312,32 +296,32 @@ public class DuccWebServer {
                    requestLogHandler.setRequestLog(requestLog);
                    handlers.addHandler(requestLogHandler);
                    logger.info(methodName, jobid, 
"requestLogFile="+requestLogFile);
-               }
+        }
                
-               DuccHandler duccHandler = new DuccHandler(this);
-               ArrayList<Handler> localHandlers = 
DuccPlugins.getInstance().gethandlers(this);
-               DuccHandlerClassic duccHandlerClassic = new 
DuccHandlerClassic(this);
-               DuccHandlerJsonFormat duccHandlerJson = new 
DuccHandlerJsonFormat(this);
-               DuccHandlerProxy duccHandlerProxy = new DuccHandlerProxy();
-               DuccHandlerViz duccHandlerViz = new DuccHandlerViz();
-               DuccHandlerUserAuthentication duccHandlerUserAuthentication = 
new DuccHandlerUserAuthentication();
-               SessionHandler sessionHandler = new SessionHandler();
-               handlers.addHandler(sessionHandler);
-               handlers.addHandler(duccHandlerUserAuthentication);
-               for(Handler handler: localHandlers) {
-                       handlers.addHandler(handler);
-               }
-               handlers.addHandler(duccHandlerJson);
-               handlers.addHandler(duccHandlerProxy);
-               handlers.addHandler(duccHandlerClassic);
-               handlers.addHandler(duccHandlerViz);
-               handlers.addHandler(duccHandler);
-               handlers.addHandler(jspHandler);
-               handlers.addHandler(resourceHandler);
-               handlers.addHandler(new DefaultHandler());
-               server.setHandler(handlers);
+        DuccHandler duccHandler = new DuccHandler(this);
+        ArrayList<Handler> localHandlers = 
DuccPlugins.getInstance().gethandlers(this);
+        DuccHandlerClassic duccHandlerClassic = new DuccHandlerClassic(this);
+        DuccHandlerJsonFormat duccHandlerJson = new 
DuccHandlerJsonFormat(this);
+        DuccHandlerProxy duccHandlerProxy = new DuccHandlerProxy();
+        DuccHandlerViz duccHandlerViz = new DuccHandlerViz();
+        DuccHandlerUserAuthentication duccHandlerUserAuthentication = new 
DuccHandlerUserAuthentication();
+        SessionHandler sessionHandler = new SessionHandler();
+        handlers.addHandler(sessionHandler);
+        handlers.addHandler(duccHandlerUserAuthentication);
+        for(Handler handler: localHandlers) {
+               handlers.addHandler(handler);
+        }
+        handlers.addHandler(duccHandlerJson);
+        handlers.addHandler(duccHandlerProxy);
+        handlers.addHandler(duccHandlerClassic);
+        handlers.addHandler(duccHandlerViz);
+        handlers.addHandler(duccHandler);
+        handlers.addHandler(jspHandler);
+        handlers.addHandler(resourceHandler);
+        handlers.addHandler(new DefaultHandler());
+        server.setHandler(handlers);
                
-               logger.trace(methodName, null, messages.fetch("exit"));
+        logger.trace(methodName, null, messages.fetch("exit"));
        }
        
        public void start() throws Exception {

Modified: 
uima/uima-ducc/trunk/uima-ducc-web/src/main/java/org/apache/uima/ducc/ws/server/DuccWebServerHelper.java
URL: 
http://svn.apache.org/viewvc/uima/uima-ducc/trunk/uima-ducc-web/src/main/java/org/apache/uima/ducc/ws/server/DuccWebServerHelper.java?rev=1748861&r1=1748860&r2=1748861&view=diff
==============================================================================
--- 
uima/uima-ducc/trunk/uima-ducc-web/src/main/java/org/apache/uima/ducc/ws/server/DuccWebServerHelper.java
 (original)
+++ 
uima/uima-ducc/trunk/uima-ducc-web/src/main/java/org/apache/uima/ducc/ws/server/DuccWebServerHelper.java
 Fri Jun 17 14:06:44 2016
@@ -24,6 +24,7 @@ import java.io.FileNotFoundException;
 import java.io.IOException;
 import java.util.Properties;
 
+import org.apache.uima.ducc.common.IDuccEnv;
 import org.apache.uima.ducc.common.utils.DuccLogger;
 import org.apache.uima.ducc.common.utils.DuccLoggerComponents;
 import org.apache.uima.ducc.common.utils.id.DuccId;
@@ -66,9 +67,42 @@ public class DuccWebServerHelper {
                return rootDir;
        }
        
+       /**
+        * retrieve keystore pw from resources.private/ducc.private.properties
+        */
+       public static String getKeyStorePassword() {
+               String location = "getKeyStorePassword";
+               String retVal = null;
+               String pwDir = IDuccEnv.DUCC_HOME_DIR+"resources.private";
+               String fileName = 
pwDir+File.separator+"ducc.private.properties";
+               try {
+                       File file = new File(fileName);
+                       FileInputStream fis = new FileInputStream(file);
+                       Properties properties = new Properties();
+                       properties.load(fis);
+                       fis.close();
+                       String key = "ducc.ws.port.ssl.pw";
+                       retVal = properties.getProperty(key);
+               }
+               catch (FileNotFoundException e) {
+                       logger.debug(location, jobid, fileName+" not found");
+               } 
+               catch (IOException e) {
+                       logger.debug(location, jobid, fileName+" load error");
+               }
+               return retVal;
+       }
+       
+       public static String getKeyManagerPassword() {
+               return getKeyStorePassword();
+       }
+       
+       /**
+        * formulate file path to keystore (used for https)
+        */
        public static String getDuccWebKeyStore() {
-               String rootDir = 
getDuccWeb()+File.separator+"etc"+File.separator+"keystore";
-               return rootDir;
+               String retVal = 
IDuccEnv.DUCC_HOME_DIR+"webserver"+File.separator+"etc"+File.separator+"keystore";
+               return retVal;
        }
        
        private static boolean exists(String fileName) {


Reply via email to