You are viewing a plain text version of this content. The canonical link for it is here.
Posted to ftpserver-commits@incubator.apache.org by ng...@apache.org on 2007/02/15 22:55:09 UTC

svn commit: r508224 [2/2] - in /incubator/ftpserver/trunk: core/src/java/org/apache/ftpserver/ core/src/java/org/apache/ftpserver/command/ core/src/java/org/apache/ftpserver/ftplet/ core/src/java/org/apache/ftpserver/interfaces/ core/src/java/org/apach...

Propchange: incubator/ftpserver/trunk/core/src/java/org/apache/ftpserver/listener/AbstractListener.java
------------------------------------------------------------------------------
    svn:eol-style = native

Modified: incubator/ftpserver/trunk/core/src/java/org/apache/ftpserver/listener/Connection.java
URL: http://svn.apache.org/viewvc/incubator/ftpserver/trunk/core/src/java/org/apache/ftpserver/listener/Connection.java?view=diff&rev=508224&r1=508223&r2=508224
==============================================================================
--- incubator/ftpserver/trunk/core/src/java/org/apache/ftpserver/listener/Connection.java (original)
+++ incubator/ftpserver/trunk/core/src/java/org/apache/ftpserver/listener/Connection.java Thu Feb 15 14:55:05 2007
@@ -21,6 +21,7 @@
 
 import org.apache.ftpserver.ftplet.FtpSession;
 import org.apache.ftpserver.interfaces.FtpServerContext;
+import org.apache.ftpserver.interfaces.FtpServerSession;
 
 /**
  * This is the connection request handler interface.
@@ -54,8 +55,8 @@
      * @param type The type of security to use, i.e. SSL or TLS
      * @throws Exception
      */
-    void beforeSecureControlChannel(String type) throws Exception;
+    void beforeSecureControlChannel(FtpServerSession session, String type) throws Exception;
 
-    void afterSecureControlChannel(String type) throws Exception;
+    void afterSecureControlChannel(FtpServerSession session, String type) throws Exception;
 }
  

Modified: incubator/ftpserver/trunk/core/src/java/org/apache/ftpserver/listener/ConnectionManager.java
URL: http://svn.apache.org/viewvc/incubator/ftpserver/trunk/core/src/java/org/apache/ftpserver/listener/ConnectionManager.java?view=diff&rev=508224&r1=508223&r2=508224
==============================================================================
--- incubator/ftpserver/trunk/core/src/java/org/apache/ftpserver/listener/ConnectionManager.java (original)
+++ incubator/ftpserver/trunk/core/src/java/org/apache/ftpserver/listener/ConnectionManager.java Thu Feb 15 14:55:05 2007
@@ -21,8 +21,6 @@
 
 import java.util.List;
 
-import org.apache.ftpserver.ftplet.Component;
-
 /**
  * It manages all the ftp connections.
  */

Modified: incubator/ftpserver/trunk/core/src/java/org/apache/ftpserver/listener/FtpProtocolHandler.java
URL: http://svn.apache.org/viewvc/incubator/ftpserver/trunk/core/src/java/org/apache/ftpserver/listener/FtpProtocolHandler.java?view=diff&rev=508224&r1=508223&r2=508224
==============================================================================
--- incubator/ftpserver/trunk/core/src/java/org/apache/ftpserver/listener/FtpProtocolHandler.java (original)
+++ incubator/ftpserver/trunk/core/src/java/org/apache/ftpserver/listener/FtpProtocolHandler.java Thu Feb 15 14:55:05 2007
@@ -27,8 +27,8 @@
 import org.apache.ftpserver.FtpWriter;
 import org.apache.ftpserver.ftplet.FileSystemView;
 import org.apache.ftpserver.ftplet.FtpException;
-import org.apache.ftpserver.ftplet.FtpRequest;
 import org.apache.ftpserver.ftplet.FtpReply;
+import org.apache.ftpserver.ftplet.FtpRequest;
 import org.apache.ftpserver.ftplet.FtpSession;
 import org.apache.ftpserver.ftplet.Ftplet;
 import org.apache.ftpserver.ftplet.FtpletEnum;

Modified: incubator/ftpserver/trunk/core/src/java/org/apache/ftpserver/listener/Listener.java
URL: http://svn.apache.org/viewvc/incubator/ftpserver/trunk/core/src/java/org/apache/ftpserver/listener/Listener.java?view=diff&rev=508224&r1=508223&r2=508224
==============================================================================
--- incubator/ftpserver/trunk/core/src/java/org/apache/ftpserver/listener/Listener.java (original)
+++ incubator/ftpserver/trunk/core/src/java/org/apache/ftpserver/listener/Listener.java Thu Feb 15 14:55:05 2007
@@ -19,6 +19,9 @@
 
 package org.apache.ftpserver.listener;
 
+import org.apache.ftpserver.interfaces.FtpServerContext;
+import org.apache.ftpserver.interfaces.Ssl;
+
 
 /**
  * Interface for the component responsible for waiting for incoming
@@ -27,6 +30,8 @@
  */
 public interface Listener {
     
+    Ssl getSsl();
+    
     /**
      * Start the listener, will initiate the listener waiting
      * on the socket.
@@ -35,7 +40,7 @@
      * 
      * @throws Exception On error during start up
      */
-    void start() throws Exception;
+    void start(FtpServerContext serverContext) throws Exception;
 
     /**
      * Stop the listener, it should no longer except socket requests.

Modified: incubator/ftpserver/trunk/core/src/java/org/apache/ftpserver/listener/io/IOConnection.java
URL: http://svn.apache.org/viewvc/incubator/ftpserver/trunk/core/src/java/org/apache/ftpserver/listener/io/IOConnection.java?view=diff&rev=508224&r1=508223&r2=508224
==============================================================================
--- incubator/ftpserver/trunk/core/src/java/org/apache/ftpserver/listener/io/IOConnection.java (original)
+++ incubator/ftpserver/trunk/core/src/java/org/apache/ftpserver/listener/io/IOConnection.java Thu Feb 15 14:55:05 2007
@@ -35,6 +35,7 @@
 import org.apache.ftpserver.FtpWriter;
 import org.apache.ftpserver.ftplet.FtpException;
 import org.apache.ftpserver.interfaces.FtpServerContext;
+import org.apache.ftpserver.interfaces.FtpServerSession;
 import org.apache.ftpserver.interfaces.Ssl;
 import org.apache.ftpserver.listener.AbstractConnection;
 import org.apache.ftpserver.listener.ConnectionObserver;
@@ -59,7 +60,7 @@
     /**
      * Constructor - set the control socket.
      */
-    public IOConnection(FtpServerContext serverContext, Socket controlSocket) throws IOException {
+    public IOConnection(FtpServerContext serverContext, Socket controlSocket, IOListener listener) throws IOException {
         super(serverContext);
         
         this.controlSocket = controlSocket;
@@ -73,6 +74,8 @@
         ftpSession = new FtpSessionImpl(serverContext);
         ftpSession.setClientAddress(this.controlSocket.getInetAddress());
         ftpSession.setServerAddress(this.controlSocket.getLocalAddress());
+        ftpSession.setServerPort(this.controlSocket.getLocalPort());
+        ftpSession.setListener(listener);
 
         FtpDataConnectionFactory dataCon = new FtpDataConnectionFactory(this.serverContext, ftpSession);
         dataCon.setServerControlAddress(controlSocket.getLocalAddress());
@@ -148,7 +151,7 @@
         } catch(SSLException ex) {
             log.warn("The client did not initiate the SSL connection correctly", ex);
         } catch(Exception ex) {
-            log.warn("RequestHandler.run()", ex);
+            log.warn("Client error, closing session", ex);
         }
         finally {
             // close all resources if not done already
@@ -196,10 +199,10 @@
     /**
      * Create secure socket.
      */
-    public void afterSecureControlChannel(String protocol) throws Exception {
+    public void afterSecureControlChannel(FtpServerSession ftpSession, String protocol) throws Exception {
 
         // change socket to SSL socket
-        Ssl ssl = serverContext.getSocketFactory().getSSL();
+        Ssl ssl = ftpSession.getListener().getSsl();
         if(ssl == null) {
             throw new FtpException("Socket factory SSL not configured");
         }
@@ -213,7 +216,7 @@
         controlSocket = ssoc;
     }
 
-    public void beforeSecureControlChannel(String type) throws Exception {
+    public void beforeSecureControlChannel(FtpServerSession ftpSession, String type) throws Exception {
         // do nothing
         
     }

Modified: incubator/ftpserver/trunk/core/src/java/org/apache/ftpserver/listener/io/IOListener.java
URL: http://svn.apache.org/viewvc/incubator/ftpserver/trunk/core/src/java/org/apache/ftpserver/listener/io/IOListener.java?view=diff&rev=508224&r1=508223&r2=508224
==============================================================================
--- incubator/ftpserver/trunk/core/src/java/org/apache/ftpserver/listener/io/IOListener.java (original)
+++ incubator/ftpserver/trunk/core/src/java/org/apache/ftpserver/listener/io/IOListener.java Thu Feb 15 14:55:05 2007
@@ -26,6 +26,7 @@
 
 import org.apache.commons.logging.Log;
 import org.apache.ftpserver.interfaces.FtpServerContext;
+import org.apache.ftpserver.listener.AbstractListener;
 import org.apache.ftpserver.listener.Connection;
 import org.apache.ftpserver.listener.ConnectionManager;
 import org.apache.ftpserver.listener.Listener;
@@ -34,10 +35,10 @@
  * The default {@link Listener} implementation.
  *
  */
-public class IOListener implements Listener, Runnable {
+public class IOListener extends AbstractListener implements Runnable {
 
     private Log log;
-    
+
     private FtpServerContext serverContext;
 
     private ServerSocket serverSocket;
@@ -47,26 +48,38 @@
     private boolean suspended = false;
 
     /**
-     * Constructs a listener based on the configuration object
-     * 
-     * @param serverContext Configuration for the listener
+     * @see Listener#start(FtpServerContext)
      */
-    public IOListener(FtpServerContext serverContext) {
+    public void start(FtpServerContext serverContext) throws Exception {
         this.serverContext = serverContext;
         
         log = serverContext.getLogFactory().getInstance(getClass());
-    }
 
-    /**
-     * @see Listener#start()
-     */
-    public void start() throws Exception {
-        serverSocket = serverContext.getSocketFactory().createServerSocket();
+        serverSocket = createServerSocket();
 
         listenerThread = new Thread(this);
         listenerThread.start();
 
     }
+    
+    /**
+     * Create server socket.
+     */
+    private ServerSocket createServerSocket() throws Exception { 
+        ServerSocket ssocket = null;
+        
+        if(isImplicitSsl()) {
+            ssocket = getSsl().createServerSocket(null, getServerAddress(), getPort());
+        } else  {
+            if(getServerAddress() == null) {
+                ssocket = new ServerSocket(getPort(), 100);
+            } else {
+                ssocket = new ServerSocket(getPort(), 100, getServerAddress());
+            }
+        }
+        
+        return ssocket;
+    }
 
     /**
      * The main thread method for the listener
@@ -106,7 +119,7 @@
                     continue;
                 }
 
-                Connection connection = new IOConnection(serverContext, soc);
+                Connection connection = new IOConnection(serverContext, soc, this);
                 conManager.newConnection(connection);
             } catch (SocketException ex) {
                 return;

Modified: incubator/ftpserver/trunk/core/src/java/org/apache/ftpserver/listener/mina/MinaConnection.java
URL: http://svn.apache.org/viewvc/incubator/ftpserver/trunk/core/src/java/org/apache/ftpserver/listener/mina/MinaConnection.java?view=diff&rev=508224&r1=508223&r2=508224
==============================================================================
--- incubator/ftpserver/trunk/core/src/java/org/apache/ftpserver/listener/mina/MinaConnection.java (original)
+++ incubator/ftpserver/trunk/core/src/java/org/apache/ftpserver/listener/mina/MinaConnection.java Thu Feb 15 14:55:05 2007
@@ -29,6 +29,7 @@
 import org.apache.ftpserver.FtpSessionImpl;
 import org.apache.ftpserver.ftplet.FtpException;
 import org.apache.ftpserver.interfaces.FtpServerContext;
+import org.apache.ftpserver.interfaces.FtpServerSession;
 import org.apache.ftpserver.interfaces.Ssl;
 import org.apache.ftpserver.listener.AbstractConnection;
 import org.apache.ftpserver.listener.ConnectionObserver;
@@ -42,7 +43,7 @@
 
     private IoSession session;
     
-    public MinaConnection(FtpServerContext serverContext, IoSession session) throws IOException {
+    public MinaConnection(FtpServerContext serverContext, IoSession session, MinaListener listener) throws IOException {
         super(serverContext);
         
         this.session = session;
@@ -53,6 +54,8 @@
         ftpSession = new FtpSessionImpl(serverContext);
         ftpSession.setClientAddress(((InetSocketAddress)session.getRemoteAddress()).getAddress());
         ftpSession.setServerAddress(((InetSocketAddress)session.getLocalAddress()).getAddress());
+        ftpSession.setServerPort(((InetSocketAddress)session.getLocalAddress()).getPort());
+        ftpSession.setListener(listener);
 
         FtpDataConnectionFactory dataCon = new FtpDataConnectionFactory(this.serverContext, ftpSession);
         dataCon.setServerControlAddress(((InetSocketAddress)session.getLocalAddress()).getAddress());
@@ -86,8 +89,8 @@
         
     }
 
-    public void beforeSecureControlChannel(String type) throws Exception {
-        Ssl ssl = serverContext.getSocketFactory().getSSL();
+    public void beforeSecureControlChannel(FtpServerSession ftpSession, String type) throws Exception {
+        Ssl ssl = ftpSession.getListener().getSsl();
         
         if(ssl != null) {
             session.setAttribute(SSLFilter.DISABLE_ENCRYPTION_ONCE);
@@ -102,7 +105,7 @@
         
     }
 
-    public void afterSecureControlChannel(String type) throws Exception {
+    public void afterSecureControlChannel(FtpServerSession ftpSession, String type) throws Exception {
         // do nothing
     }
 }

Modified: incubator/ftpserver/trunk/core/src/java/org/apache/ftpserver/listener/mina/MinaFtpProtocolHandler.java
URL: http://svn.apache.org/viewvc/incubator/ftpserver/trunk/core/src/java/org/apache/ftpserver/listener/mina/MinaFtpProtocolHandler.java?view=diff&rev=508224&r1=508223&r2=508224
==============================================================================
--- incubator/ftpserver/trunk/core/src/java/org/apache/ftpserver/listener/mina/MinaFtpProtocolHandler.java (original)
+++ incubator/ftpserver/trunk/core/src/java/org/apache/ftpserver/listener/mina/MinaFtpProtocolHandler.java Thu Feb 15 14:55:05 2007
@@ -43,17 +43,20 @@
     
     private FtpServerContext serverContext;
     private FtpProtocolHandler protocolHandler;
+    private MinaListener listener;
     
-    public MinaFtpProtocolHandler(FtpServerContext serverContext, FtpProtocolHandler protocolHandler) throws IOException {
+    public MinaFtpProtocolHandler(FtpServerContext serverContext, FtpProtocolHandler protocolHandler, MinaListener listener) throws IOException {
         this.serverContext = serverContext;
         this.protocolHandler = protocolHandler;
+        this.listener = listener;
+         
     }
 
     /* (non-Javadoc)
      * @see org.apache.mina.common.IoHandlerAdapter#sessionCreated(org.apache.mina.common.IoSession)
      */
     public void sessionCreated(IoSession session) throws Exception {
-        MinaConnection connection = new MinaConnection(serverContext, session);
+        MinaConnection connection = new MinaConnection(serverContext, session, listener);
         session.setAttribute(CONNECTION_KEY, connection);
         
         MinaFtpResponseOutput output = new MinaFtpResponseOutput(session);

Modified: incubator/ftpserver/trunk/core/src/java/org/apache/ftpserver/listener/mina/MinaListener.java
URL: http://svn.apache.org/viewvc/incubator/ftpserver/trunk/core/src/java/org/apache/ftpserver/listener/mina/MinaListener.java?view=diff&rev=508224&r1=508223&r2=508224
==============================================================================
--- incubator/ftpserver/trunk/core/src/java/org/apache/ftpserver/listener/mina/MinaListener.java (original)
+++ incubator/ftpserver/trunk/core/src/java/org/apache/ftpserver/listener/mina/MinaListener.java Thu Feb 15 14:55:05 2007
@@ -20,16 +20,14 @@
 package org.apache.ftpserver.listener.mina;
 
 import java.io.IOException;
-import java.net.InetAddress;
 import java.net.InetSocketAddress;
 import java.security.GeneralSecurityException;
 
 import org.apache.commons.logging.Log;
 import org.apache.ftpserver.interfaces.FtpServerContext;
-import org.apache.ftpserver.interfaces.Ssl;
+import org.apache.ftpserver.listener.AbstractListener;
 import org.apache.ftpserver.listener.FtpProtocolHandler;
 import org.apache.ftpserver.listener.Listener;
-import org.apache.ftpserver.socketfactory.SSLFtpSocketFactory;
 import org.apache.mina.common.IoAcceptor;
 import org.apache.mina.filter.LoggingFilter;
 import org.apache.mina.filter.SSLFilter;
@@ -42,11 +40,9 @@
  * The default {@link Listener} implementation.
  *
  */
-public class MinaListener implements Listener {
+public class MinaListener extends AbstractListener {
 
     private Log log;
-    
-    private FtpServerContext serverContext;
 
     private IoAcceptor acceptor = new SocketAcceptor();
     
@@ -57,27 +53,18 @@
     private SocketAcceptorConfig cfg;
     
     boolean suspended = false;
- 
 
     /**
-     * Constructs a listener based on the configuration object
-     * 
-     * @param serverContext Configuration for the listener
-     * @throws Exception 
+     * @see Listener#start(FtpServerContext)
      */
-    public MinaListener(FtpServerContext serverContext) throws Exception {
-        this.serverContext = serverContext;
+    public void start(FtpServerContext serverContext) throws Exception {
         
         log = serverContext.getLogFactory().getInstance(getClass());
         
-        
-        int port = serverContext.getSocketFactory().getPort();
-        InetAddress serverAddress = serverContext.getSocketFactory().getServerAddress();
-        
-        if(serverAddress != null) {
-            address = new InetSocketAddress(serverAddress, port );
+        if(getServerAddress() != null) {
+            address = new InetSocketAddress(getServerAddress(), getPort() );
         } else {
-            address = new InetSocketAddress( port );
+            address = new InetSocketAddress( getPort() );
         }
         
         cfg = new SocketAcceptorConfig();
@@ -91,10 +78,9 @@
         // Decrease the default receiver buffer size
         ((SocketSessionConfig) acceptor.getDefaultConfig().getSessionConfig()).setReceiveBufferSize(512); 
         
-        if(serverContext.getSocketFactory() instanceof SSLFtpSocketFactory) {
-            Ssl ssl = serverContext.getSocketFactory().getSSL();
+        if(isImplicitSsl()) {
             try {
-                SSLFilter sslFilter = new SSLFilter( ssl.getSSLContext() );
+                SSLFilter sslFilter = new SSLFilter( getSsl().getSSLContext() );
                 cfg.getFilterChain().addFirst("sslFilter", sslFilter);
 
             } catch (GeneralSecurityException e) {
@@ -102,14 +88,9 @@
             }
             
         }
-    }
-
-    /**
-     * @see Listener#start()
-     */
-    public void start() throws Exception {
         
-        protocolHandler = new MinaFtpProtocolHandler(serverContext, new FtpProtocolHandler(serverContext));
+        
+        protocolHandler = new MinaFtpProtocolHandler(serverContext, new FtpProtocolHandler(serverContext), this);
 
         acceptor.bind(address, protocolHandler, cfg );
     }

Modified: incubator/ftpserver/trunk/core/src/java/org/apache/ftpserver/socketfactory/FtpSocketFactory.java
URL: http://svn.apache.org/viewvc/incubator/ftpserver/trunk/core/src/java/org/apache/ftpserver/socketfactory/FtpSocketFactory.java?view=diff&rev=508224&r1=508223&r2=508224
==============================================================================
--- incubator/ftpserver/trunk/core/src/java/org/apache/ftpserver/socketfactory/FtpSocketFactory.java (original)
+++ incubator/ftpserver/trunk/core/src/java/org/apache/ftpserver/socketfactory/FtpSocketFactory.java Thu Feb 15 14:55:05 2007
@@ -77,13 +77,13 @@
             Configuration sslConf = conf.subset("ssl");
             if(!sslConf.isEmpty()) {
                 ssl = (Ssl)Class.forName("org.apache.ftpserver.ssl.DefaultSsl").newInstance();
-                ssl.setLogFactory(logFactory);
-                ssl.configure(sslConf);
+                //ssl.setLogFactory(logFactory);
+                //ssl.configure(sslConf);
             }
         }
-        catch(FtpException ex) {
+        /*catch(FtpException ex) {
             throw ex;
-        }
+        }*/
         catch(Exception ex) {
             log.fatal("FtpSocketFactory.configure()", ex);
             throw new FtpException("FtpSocketFactory.configure()", ex);

Modified: incubator/ftpserver/trunk/core/src/java/org/apache/ftpserver/ssl/DefaultSsl.java
URL: http://svn.apache.org/viewvc/incubator/ftpserver/trunk/core/src/java/org/apache/ftpserver/ssl/DefaultSsl.java?view=diff&rev=508224&r1=508223&r2=508224
==============================================================================
--- incubator/ftpserver/trunk/core/src/java/org/apache/ftpserver/ssl/DefaultSsl.java (original)
+++ incubator/ftpserver/trunk/core/src/java/org/apache/ftpserver/ssl/DefaultSsl.java Thu Feb 15 14:55:05 2007
@@ -19,6 +19,7 @@
 
 package org.apache.ftpserver.ssl;
 
+import java.io.File;
 import java.io.FileInputStream;
 import java.net.InetAddress;
 import java.net.ServerSocket;
@@ -37,9 +38,7 @@
 
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
-import org.apache.ftpserver.ftplet.Component;
-import org.apache.ftpserver.ftplet.Configuration;
-import org.apache.ftpserver.ftplet.FtpException;
+import org.apache.ftpserver.FtpServerConfigurationException;
 import org.apache.ftpserver.interfaces.Ssl;
 import org.apache.ftpserver.util.IoUtils;
 
@@ -48,18 +47,18 @@
  * Ssl implementation. This class encapsulates all 
  * the SSL functionalities.
  */
-public class DefaultSsl implements Ssl, Component {
+public class DefaultSsl implements Ssl {
     
-    private Log log;
+    private Log log = LogFactory.getLog(DefaultSsl.class);
     
-    private String keystoreFile;
-    private String keystorePass;
-    private String keystoreType;
-    private String keystoreAlgorithm;
-    
-    private String sslProtocol;
-    private boolean clientAuthReqd;
-    private String keyPass;
+    private File keystoreFile = new File("./res/.keystore");
+    private String keystorePass = "password";   // TODO should we really default this value?
+    private String keystoreType = "JKS";
+    private String keystoreAlgorithm = "SunX509";
+    
+    private String sslProtocol = "TLS";
+    private boolean clientAuthReqd = false;
+    private String keyPass = "password";   // TODO should we really default this value?
 
     private KeyStore keyStore;
     private KeyManagerFactory keyManagerFactory;
@@ -67,30 +66,41 @@
     
     private HashMap sslContextMap;
     
+    public void setKeystoreFile(File keyStoreFile) {
+        this.keystoreFile = keyStoreFile;
+    }
     
-    /**
-     * Set the log actory.
-     */
-    public void setLogFactory(LogFactory factory) {
-        log = factory.getInstance(getClass());
+    public void setKeystorePassword(String keystorePass) {
+        this.keystorePass = keystorePass;
+    }
+    
+    public void setKeystoreType(String keystoreType) {
+        this.keystoreType = keystoreType;
+    }
+    
+    public void setKeystoreAlgorithm(String keystoreAlgorithm) {
+        this.keystoreAlgorithm = keystoreAlgorithm;
+    }
+    
+    public void setSslProtocol(String sslProtocol) {
+        this.sslProtocol = sslProtocol;
     }
     
+    public void setClientAuthentication(boolean clientAuthReqd) {
+        this.clientAuthReqd = clientAuthReqd;
+    }
+    
+    public void setKeyPassword(String keyPass) {
+        this.keyPass = keyPass;
+    }
+    
+    
     /**
      * Configure secure server related properties. 
      */
-    public void configure(Configuration conf) throws FtpException {
+    public synchronized void init() {
         
         try {
-            
-            // get configuration parameters
-            keystoreFile      = conf.getString("keystore-file", "./res/.keystore");
-            keystorePass      = conf.getString("keystore-password", "password");
-            keystoreType      = conf.getString("keystore-type", "JKS");
-            keystoreAlgorithm = conf.getString("keystore-algorithm", "SunX509");
-            sslProtocol       = conf.getString("ssl-protocol", "TLS");
-            clientAuthReqd    = conf.getBoolean("client-authentication", false);
-            keyPass           = conf.getString("key-password", "password");
-            
             // initialize keystore
             FileInputStream fin = null;
             try {
@@ -116,7 +126,13 @@
         }
         catch(Exception ex) {
             log.fatal("DefaultSsl.configure()", ex);
-            throw new FtpException("DefaultSsl.configure()", ex);
+            throw new FtpServerConfigurationException("DefaultSsl.configure()", ex);
+        }
+    }
+    
+    private void lazyInit() {
+        if(keyManagerFactory == null) {
+            init();
         }
     }
     
@@ -124,6 +140,7 @@
      * Get SSL Context.
      */
     public synchronized SSLContext getSSLContext(String protocol) throws GeneralSecurityException {
+        lazyInit();
         
         // null value check
         if(protocol == null) {
@@ -153,7 +170,8 @@
     public ServerSocket createServerSocket(String protocol,
                                            InetAddress addr, 
                                            int port) throws Exception {
-
+        lazyInit();
+        
         // get server socket factory
         SSLContext ctx = getSSLContext(protocol);
         SSLServerSocketFactory ssocketFactory = ctx.getServerSocketFactory();
@@ -180,6 +198,7 @@
     public Socket createSocket(String protocol,
                                Socket soc, 
                                boolean clientMode) throws Exception {
+        lazyInit();
         
         // already wrapped - no need to do anything
         if(soc instanceof SSLSocket) {
@@ -211,7 +230,8 @@
                                InetAddress addr, 
                                int port,
                                boolean clientMode) throws Exception {
-
+        lazyInit();
+        
         // get socket factory
         SSLContext ctx = getSSLContext(protocol);
         SSLSocketFactory socFactory = ctx.getSocketFactory();
@@ -235,6 +255,7 @@
                                InetAddress localhost,
                                int localport,
                                boolean clientMode) throws Exception {
+        lazyInit();
         
         // get socket factory
         SSLContext ctx = getSSLContext(protocol);

Modified: incubator/ftpserver/trunk/core/src/java/org/apache/ftpserver/util/ClassUtils.java
URL: http://svn.apache.org/viewvc/incubator/ftpserver/trunk/core/src/java/org/apache/ftpserver/util/ClassUtils.java?view=diff&rev=508224&r1=508223&r2=508224
==============================================================================
--- incubator/ftpserver/trunk/core/src/java/org/apache/ftpserver/util/ClassUtils.java (original)
+++ incubator/ftpserver/trunk/core/src/java/org/apache/ftpserver/util/ClassUtils.java Thu Feb 15 14:55:05 2007
@@ -43,6 +43,7 @@
 import java.util.Map;
 import java.util.StringTokenizer;
 
+import org.apache.ftpserver.FtpServerConfigurationException;
 import org.apache.ftpserver.ftplet.Configuration;
 
 
@@ -58,6 +59,10 @@
     public static void setProperty(Object target, String propertyName, Object propertyValue) {
         PropertyDescriptor setter = getDescriptor(target.getClass(), propertyName);
         
+        if(setter == null) {
+            return;
+        }
+        
         setProperty(target, setter, propertyValue);
     }
     
@@ -156,8 +161,10 @@
                 
                 while (mapKeys.hasNext()) {
                     String mapKey = (String) mapKeys.next();
+                    String mapValue = config.getString(mapKey, null);
+                    Configuration mapConfig = config.subset(mapKey);
                     
-                    map.put(mapKey, config.getString(mapKey, null));
+                    map.put(mapKey, createObject(String.class, mapConfig, mapValue));
                 }
                 
                 value = map;
@@ -237,6 +244,11 @@
         return keyList.iterator();
     }
     
+    public static Map createMap(Configuration config) {
+        return (Map) createObject(Map.class, config, null);
+        
+    }
+    
     public static Object createBean(Configuration config, String defaultClass) {
         String className = config.getString("class", defaultClass);
         
@@ -264,6 +276,10 @@
             String propValue = config.getString(key, null);
             
             PropertyDescriptor descriptor = getDescriptor(clazz, key);
+            
+            if(descriptor == null) {
+                throw new FtpServerConfigurationException("Unknown property \"" + key + "\" on class " + className);
+            }
 
             Object value = createObject(descriptor.getPropertyType(), subConfig, propValue);
 

Modified: incubator/ftpserver/trunk/core/src/java/org/apache/ftpserver/util/FtpReplyUtil.java
URL: http://svn.apache.org/viewvc/incubator/ftpserver/trunk/core/src/java/org/apache/ftpserver/util/FtpReplyUtil.java?view=diff&rev=508224&r1=508223&r2=508224
==============================================================================
--- incubator/ftpserver/trunk/core/src/java/org/apache/ftpserver/util/FtpReplyUtil.java (original)
+++ incubator/ftpserver/trunk/core/src/java/org/apache/ftpserver/util/FtpReplyUtil.java Thu Feb 15 14:55:05 2007
@@ -23,8 +23,8 @@
 
 import org.apache.ftpserver.DefaultFtpReply;
 import org.apache.ftpserver.ftplet.FileSystemView;
-import org.apache.ftpserver.ftplet.FtpRequest;
 import org.apache.ftpserver.ftplet.FtpReply;
+import org.apache.ftpserver.ftplet.FtpRequest;
 import org.apache.ftpserver.ftplet.FtpStatistics;
 import org.apache.ftpserver.interfaces.FtpServerSession;
 import org.apache.ftpserver.interfaces.MessageResource;
@@ -283,7 +283,7 @@
         
         // server port
         else if(varName.equals(SERVER_PORT)) {
-            varVal = String.valueOf(session.getServerContext().getServerPort());
+            varVal = String.valueOf(session.getServerPort());
         }
         
         return varVal;

Modified: incubator/ftpserver/trunk/core/src/test/org/apache/ftpserver/AbstractFtpServerTestTemplate.java
URL: http://svn.apache.org/viewvc/incubator/ftpserver/trunk/core/src/test/org/apache/ftpserver/AbstractFtpServerTestTemplate.java?view=diff&rev=508224&r1=508223&r2=508224
==============================================================================
--- incubator/ftpserver/trunk/core/src/test/org/apache/ftpserver/AbstractFtpServerTestTemplate.java (original)
+++ incubator/ftpserver/trunk/core/src/test/org/apache/ftpserver/AbstractFtpServerTestTemplate.java Thu Feb 15 14:55:05 2007
@@ -54,7 +54,7 @@
 
     protected Properties createConfig() {
         Properties configProps = new Properties();
-        configProps.setProperty("config.socket-factory.port", Integer
+        configProps.setProperty("config.listeners.default.port", Integer
                 .toString(serverPort));
 
         return configProps;

Modified: incubator/ftpserver/trunk/core/src/test/org/apache/ftpserver/ComponentBeanTest.java
URL: http://svn.apache.org/viewvc/incubator/ftpserver/trunk/core/src/test/org/apache/ftpserver/ComponentBeanTest.java?view=diff&rev=508224&r1=508223&r2=508224
==============================================================================
--- incubator/ftpserver/trunk/core/src/test/org/apache/ftpserver/ComponentBeanTest.java (original)
+++ incubator/ftpserver/trunk/core/src/test/org/apache/ftpserver/ComponentBeanTest.java Thu Feb 15 14:55:05 2007
@@ -21,13 +21,13 @@
 
 import java.util.Properties;
 
+import junit.framework.TestCase;
+
 import org.apache.commons.logging.LogFactory;
 import org.apache.ftpserver.config.PropertiesConfiguration;
 import org.apache.ftpserver.ftplet.Component;
 import org.apache.ftpserver.ftplet.Configuration;
 import org.apache.ftpserver.ftplet.FtpException;
-
-import junit.framework.TestCase;
 
 
 public class ComponentBeanTest extends TestCase {

Added: incubator/ftpserver/trunk/core/src/test/org/apache/ftpserver/ConfigurableFtpServerContextTest.java
URL: http://svn.apache.org/viewvc/incubator/ftpserver/trunk/core/src/test/org/apache/ftpserver/ConfigurableFtpServerContextTest.java?view=auto&rev=508224
==============================================================================
--- incubator/ftpserver/trunk/core/src/test/org/apache/ftpserver/ConfigurableFtpServerContextTest.java (added)
+++ incubator/ftpserver/trunk/core/src/test/org/apache/ftpserver/ConfigurableFtpServerContextTest.java Thu Feb 15 14:55:05 2007
@@ -0,0 +1,58 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *  http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */  
+
+package org.apache.ftpserver;
+
+import java.util.Properties;
+
+import junit.framework.TestCase;
+
+import org.apache.ftpserver.config.PropertiesConfiguration;
+import org.apache.ftpserver.ftplet.Configuration;
+import org.apache.ftpserver.listener.Listener;
+import org.apache.ftpserver.listener.io.IOListener;
+import org.apache.ftpserver.listener.mina.MinaListener;
+
+
+public class ConfigurableFtpServerContextTest extends TestCase {
+
+    public void testConfigListeners() throws Exception {
+        Properties props = new Properties();
+        props.setProperty("config.listeners.foo1.class", IOListener.class.getName());
+        props.setProperty("config.listeners.foo2.class", MinaListener.class.getName());
+        
+        Configuration config = new PropertiesConfiguration(props);
+        
+        ConfigurableFtpServerContext ctx = new ConfigurableFtpServerContext(config);
+        
+        assertNotNull(ctx.getListener("foo1"));
+        assertTrue(ctx.getListener("foo1") instanceof IOListener);
+        
+        assertNotNull(ctx.getListener("foo2"));
+        assertTrue(ctx.getListener("foo2") instanceof MinaListener);
+        
+        Listener[] listeners = ctx.getListeners();
+        
+        assertEquals(2, listeners.length);
+        assertTrue(listeners[0] instanceof Listener);
+        assertTrue(listeners[1] instanceof Listener);
+        
+    }
+    
+}

Propchange: incubator/ftpserver/trunk/core/src/test/org/apache/ftpserver/ConfigurableFtpServerContextTest.java
------------------------------------------------------------------------------
    svn:eol-style = native

Modified: incubator/ftpserver/trunk/core/src/test/org/apache/ftpserver/PassivePortsTest.java
URL: http://svn.apache.org/viewvc/incubator/ftpserver/trunk/core/src/test/org/apache/ftpserver/PassivePortsTest.java?view=diff&rev=508224&r1=508223&r2=508224
==============================================================================
--- incubator/ftpserver/trunk/core/src/test/org/apache/ftpserver/PassivePortsTest.java (original)
+++ incubator/ftpserver/trunk/core/src/test/org/apache/ftpserver/PassivePortsTest.java Thu Feb 15 14:55:05 2007
@@ -32,7 +32,6 @@
     }
 
     public void testParseMaxValue() {
-        System.out.println(Short.MAX_VALUE);
         PassivePorts ports = PassivePorts.parse("65535");
         
         assertEquals(65535, ports.reserveNextPort());

Modified: incubator/ftpserver/trunk/core/src/test/org/apache/ftpserver/clienttests/ClientTestTemplate.java
URL: http://svn.apache.org/viewvc/incubator/ftpserver/trunk/core/src/test/org/apache/ftpserver/clienttests/ClientTestTemplate.java?view=diff&rev=508224&r1=508223&r2=508224
==============================================================================
--- incubator/ftpserver/trunk/core/src/test/org/apache/ftpserver/clienttests/ClientTestTemplate.java (original)
+++ incubator/ftpserver/trunk/core/src/test/org/apache/ftpserver/clienttests/ClientTestTemplate.java Thu Feb 15 14:55:05 2007
@@ -33,6 +33,7 @@
 import org.apache.ftpserver.FtpServer;
 import org.apache.ftpserver.config.PropertiesConfiguration;
 import org.apache.ftpserver.interfaces.FtpServerContext;
+import org.apache.ftpserver.listener.mina.MinaListener;
 import org.apache.ftpserver.test.TestUtil;
 import org.apache.ftpserver.util.IoUtils;
 import org.apache.log4j.Logger;
@@ -70,7 +71,8 @@
         assertTrue(USERS_FILE.getAbsolutePath() + " must exist", USERS_FILE.exists());
 
         Properties configProps = new Properties();
-        configProps.setProperty("config.socket-factory.port", Integer
+        configProps.setProperty("config.listeners.default.class", MinaListener.class.getName());
+        configProps.setProperty("config.listeners.default.port", Integer
                 .toString(port));
         configProps.setProperty("config.user-manager.class",
                 "org.apache.ftpserver.usermanager.PropertiesUserManager");

Modified: incubator/ftpserver/trunk/core/src/test/org/apache/ftpserver/interfaces/ServerFtpStatisticsTestTemplate.java
URL: http://svn.apache.org/viewvc/incubator/ftpserver/trunk/core/src/test/org/apache/ftpserver/interfaces/ServerFtpStatisticsTestTemplate.java?view=diff&rev=508224&r1=508223&r2=508224
==============================================================================
--- incubator/ftpserver/trunk/core/src/test/org/apache/ftpserver/interfaces/ServerFtpStatisticsTestTemplate.java (original)
+++ incubator/ftpserver/trunk/core/src/test/org/apache/ftpserver/interfaces/ServerFtpStatisticsTestTemplate.java Thu Feb 15 14:55:05 2007
@@ -49,7 +49,7 @@
         public void run() {            
         }
 
-        public void beforeSecureControlChannel(String type) throws Exception {
+        public void beforeSecureControlChannel(FtpServerSession session, String type) throws Exception {
             
         }
 
@@ -65,7 +65,7 @@
             return 0;
         }
 
-        public void afterSecureControlChannel(String type) throws Exception {
+        public void afterSecureControlChannel(FtpServerSession session, String type) throws Exception {
             
         }
         

Modified: incubator/ftpserver/trunk/core/src/test/org/apache/ftpserver/util/ClassUtilsTest.java
URL: http://svn.apache.org/viewvc/incubator/ftpserver/trunk/core/src/test/org/apache/ftpserver/util/ClassUtilsTest.java?view=diff&rev=508224&r1=508223&r2=508224
==============================================================================
--- incubator/ftpserver/trunk/core/src/test/org/apache/ftpserver/util/ClassUtilsTest.java (original)
+++ incubator/ftpserver/trunk/core/src/test/org/apache/ftpserver/util/ClassUtilsTest.java Thu Feb 15 14:55:05 2007
@@ -278,6 +278,28 @@
         assertEquals("bar3", map.get("foo3"));
         assertEquals("bar4", map.get("foo4"));
     }
+    
+    public void testCreateMap() {
+        Properties props = new Properties();
+        props.setProperty("config.foo1.class", MyBean.class.getName());
+        props.setProperty("config.foo1.foo", "bar1");
+        props.setProperty("config.foo2.class", MyBean.class.getName());
+        props.setProperty("config.foo2.foo", "bar2");
+        props.setProperty("config.foo3.class", MyBean.class.getName());
+        props.setProperty("config.foo3.foo", "bar3");
+        props.setProperty("config.foo4.class", MyBean.class.getName());
+        props.setProperty("config.foo4.foo", "bar4");
+        
+        Configuration config = new PropertiesConfiguration(props);
+        
+        Map map = ClassUtils.createMap(config);
+        
+        for(int i = 1; i<5; i++) {
+            MyBean bean = (MyBean) map.get("foo" + i);
+            assertEquals("bar" + i, bean.getFoo());
+            
+        }
+    }
  
     public static class MyCollectionBean {
         private List list;

Modified: incubator/ftpserver/trunk/ftplet-api/src/java/org/apache/ftpserver/ftplet/FtpSession.java
URL: http://svn.apache.org/viewvc/incubator/ftpserver/trunk/ftplet-api/src/java/org/apache/ftpserver/ftplet/FtpSession.java?view=diff&rev=508224&r1=508223&r2=508224
==============================================================================
--- incubator/ftpserver/trunk/ftplet-api/src/java/org/apache/ftpserver/ftplet/FtpSession.java (original)
+++ incubator/ftpserver/trunk/ftplet-api/src/java/org/apache/ftpserver/ftplet/FtpSession.java Thu Feb 15 14:55:05 2007
@@ -48,6 +48,8 @@
     
     InetAddress getServerAddress();
     
+    int getServerPort();
+    
     Certificate[] getClientCertificates();
     
     /**

Modified: incubator/ftpserver/trunk/ftplet-api/src/java/org/apache/ftpserver/ftplet/FtpletContext.java
URL: http://svn.apache.org/viewvc/incubator/ftpserver/trunk/ftplet-api/src/java/org/apache/ftpserver/ftplet/FtpletContext.java?view=diff&rev=508224&r1=508223&r2=508224
==============================================================================
--- incubator/ftpserver/trunk/ftplet-api/src/java/org/apache/ftpserver/ftplet/FtpletContext.java (original)
+++ incubator/ftpserver/trunk/ftplet-api/src/java/org/apache/ftpserver/ftplet/FtpletContext.java Thu Feb 15 14:55:05 2007
@@ -19,8 +19,6 @@
 
 package org.apache.ftpserver.ftplet;
 
-import java.net.InetAddress;
-
 import org.apache.commons.logging.LogFactory;
 
 /**
@@ -55,14 +53,4 @@
      * Get Ftplet.
      */
     Ftplet getFtplet(String name);
-    
-    /**
-     * Get server address.
-     */
-    InetAddress getServerAddress();
-        
-    /**
-     * Get server port.
-     */ 
-    int getServerPort();
 }

Modified: incubator/ftpserver/trunk/ssl-tests/src/test/org/apache/ftpserver/ssl/ImplicitClientAuthTest.java
URL: http://svn.apache.org/viewvc/incubator/ftpserver/trunk/ssl-tests/src/test/org/apache/ftpserver/ssl/ImplicitClientAuthTest.java?view=diff&rev=508224&r1=508223&r2=508224
==============================================================================
--- incubator/ftpserver/trunk/ssl-tests/src/test/org/apache/ftpserver/ssl/ImplicitClientAuthTest.java (original)
+++ incubator/ftpserver/trunk/ssl-tests/src/test/org/apache/ftpserver/ssl/ImplicitClientAuthTest.java Thu Feb 15 14:55:05 2007
@@ -26,8 +26,8 @@
 
     protected Properties createConfig() {
         Properties config = super.createConfig();
-        config.setProperty("config.socket-factory.class",
-                "org.apache.ftpserver.socketfactory.SSLFtpSocketFactory");
+        config.setProperty("config.listeners.default.implicitSsl",
+                "true");
 
         return config;
     }

Modified: incubator/ftpserver/trunk/ssl-tests/src/test/org/apache/ftpserver/ssl/ImplicitSecurityTestTemplate.java
URL: http://svn.apache.org/viewvc/incubator/ftpserver/trunk/ssl-tests/src/test/org/apache/ftpserver/ssl/ImplicitSecurityTestTemplate.java?view=diff&rev=508224&r1=508223&r2=508224
==============================================================================
--- incubator/ftpserver/trunk/ssl-tests/src/test/org/apache/ftpserver/ssl/ImplicitSecurityTestTemplate.java (original)
+++ incubator/ftpserver/trunk/ssl-tests/src/test/org/apache/ftpserver/ssl/ImplicitSecurityTestTemplate.java Thu Feb 15 14:55:05 2007
@@ -32,8 +32,8 @@
      */
     protected Properties createConfig() {
         Properties config = super.createConfig();
-        config.setProperty("config.socket-factory.class",
-                "org.apache.ftpserver.socketfactory.SSLFtpSocketFactory");
+        config.setProperty("config.listeners.default.implicitSsl",
+                "true");
 
         return config;
     }

Modified: incubator/ftpserver/trunk/ssl-tests/src/test/org/apache/ftpserver/ssl/SSLTestTemplate.java
URL: http://svn.apache.org/viewvc/incubator/ftpserver/trunk/ssl-tests/src/test/org/apache/ftpserver/ssl/SSLTestTemplate.java?view=diff&rev=508224&r1=508223&r2=508224
==============================================================================
--- incubator/ftpserver/trunk/ssl-tests/src/test/org/apache/ftpserver/ssl/SSLTestTemplate.java (original)
+++ incubator/ftpserver/trunk/ssl-tests/src/test/org/apache/ftpserver/ssl/SSLTestTemplate.java Thu Feb 15 14:55:05 2007
@@ -38,6 +38,7 @@
 import org.apache.ftpserver.FtpServer;
 import org.apache.ftpserver.config.PropertiesConfiguration;
 import org.apache.ftpserver.interfaces.FtpServerContext;
+import org.apache.ftpserver.listener.io.IOListener;
 import org.apache.ftpserver.util.IoUtils;
 
 public abstract class SSLTestTemplate extends TestCase {
@@ -82,8 +83,24 @@
         assertTrue(FTPSERVER_KEYSTORE.exists());
         
         Properties configProps = new Properties();
-        configProps.setProperty("config.socket-factory.port", Integer
+        configProps.setProperty("config.listeners.default.class", IOListener.class.getName());
+        configProps.setProperty("config.listeners.default.port", Integer
                 .toString(port));
+        configProps.setProperty("config.listeners.default.ssl.class",
+                DefaultSsl.class.getName());
+        configProps.setProperty("config.listeners.default.ssl.keystore-file",
+                FTPSERVER_KEYSTORE.getAbsolutePath());
+        configProps.setProperty("config.listeners.default.ssl.keystore-password",
+                "password");
+        configProps
+                .setProperty("config.listeners.default.ssl.ssl-protocol", getAuthValue());
+        configProps.setProperty(
+                "config.listeners.default.ssl.client-authentication", getClientAuth());
+        configProps.setProperty("config.listeners.default.ssl.key-password",
+                "password");
+
+        //configProps.setProperty("config.socket-factory.port", Integer
+        //        .toString(port));
         configProps.setProperty("config.user-manager.class",
                 "org.apache.ftpserver.usermanager.PropertiesUserManager");
         configProps.setProperty("config.user-manager.admin", "admin");
@@ -93,19 +110,21 @@
                 USERS_FILE.getAbsolutePath());
         configProps.setProperty("config.create-default-user", "false");
 
-        configProps.setProperty("config.socket-factory.class",
-                "org.apache.ftpserver.socketfactory.FtpSocketFactory");
-        configProps.setProperty("config.socket-factory.ssl.keystore-file",
-                FTPSERVER_KEYSTORE.getAbsolutePath());
-        configProps.setProperty("config.socket-factory.ssl.keystore-password",
-                "password");
-        configProps
-                .setProperty("config.socket-factory.ssl.ssl-protocol", getAuthValue());
-        configProps.setProperty(
-                "config.socket-factory.ssl.client-authentication", getClientAuth());
-        configProps.setProperty("config.socket-factory.ssl.key-password",
-                "password");
-
+        //configProps.setProperty("config.socket-factory.class",
+        //        "org.apache.ftpserver.socketfactory.FtpSocketFactory");
+//        configProps.setProperty("config.socket-factory.ssl.keystore-file",
+//                FTPSERVER_KEYSTORE.getAbsolutePath());
+//        configProps.setProperty("config.socket-factory.ssl.keystore-password",
+//                "password");
+//        configProps
+//                .setProperty("config.socket-factory.ssl.ssl-protocol", getAuthValue());
+//        configProps.setProperty(
+//                "config.socket-factory.ssl.client-authentication", getClientAuth());
+//        configProps.setProperty("config.socket-factory.ssl.key-password",
+//                "password");
+//
+        configProps.setProperty("config.data-connection.ssl.class",
+                DefaultSsl.class.getName());
         configProps.setProperty("config.data-connection.ssl.keystore-file",
                 FTPSERVER_KEYSTORE.getAbsolutePath());
         configProps.setProperty("config.data-connection.ssl.keystore-password",