rana_b 2003/01/20 07:19:23 Modified: ftpserver/src/java/org/apache/avalon/ftpserver FtpConfig.java Log: making it firewall friendly Revision Changes Path 1.17 +153 -80 jakarta-avalon-apps/ftpserver/src/java/org/apache/avalon/ftpserver/FtpConfig.java Index: FtpConfig.java =================================================================== RCS file: /home/cvs/jakarta-avalon-apps/ftpserver/src/java/org/apache/avalon/ftpserver/FtpConfig.java,v retrieving revision 1.16 retrieving revision 1.17 diff -u -r1.16 -r1.17 --- FtpConfig.java 10 Oct 2002 16:06:27 -0000 1.16 +++ FtpConfig.java 20 Jan 2003 15:19:23 -0000 1.17 @@ -13,6 +13,7 @@ import java.io.IOException; import java.net.InetAddress; import java.net.UnknownHostException; +import java.util.StringTokenizer; import org.apache.avalon.phoenix.BlockContext; import org.apache.avalon.framework.configuration.Configuration; @@ -38,19 +39,6 @@ public class FtpConfig { - private int miMaxConnection; - private int miMaxAnonConnection; - private int miServerPort; - private int miRmiPort; - private int miSchedulerInterval; - private int miDefaultIdle; - - private boolean mbAnonAllowed; - private boolean mbRemoteAdminAllowed; - private boolean mbCreateHome; - - private File mDefaultRoot = null; - private FtpStatus mStatus = null; private ConnectionService mConService = null; private IpRestrictorInterface mIpRestrictor = null; @@ -64,17 +52,29 @@ private Logger mLogger = null; private FtpStatistics mStatistics = null; - private AsyncMessageQueue mMsgQ = null; private RemoteHandler mRemoteHandler = null; + private int miServerPort; + private int miDataPort[][]; + private int miRmiPort; + private int miMaxLogin; + private int miAnonLogin; + private int miPollInterval; + private int miDefaultIdle; + private boolean mbAnonAllowed; + private boolean mbCreateHome; + private boolean mbRemoteAdminAllowed; + private File mDefaultRoot; + private AsyncMessageQueue mQueue; + /** * Default constructor - first step. */ public FtpConfig() throws IOException { mStatus = new FtpStatus(); - mMsgQ = new AsyncMessageQueue(); - mMsgQ.setMaxSize(4096); + mQueue = new AsyncMessageQueue(); + mQueue.setMaxSize(4096); } /** @@ -109,11 +109,17 @@ Configuration tmpConf = null; // get server address - tmpConf = conf.getChild("ftp-host", false); + tmpConf = conf.getChild("server-host", false); if(tmpConf != null) { mServerAddress = InetAddress.getByName(tmpConf.getValue()); } - + + // get self address + tmpConf = conf.getChild("self-host", false); + if(tmpConf != null) { + mSelfAddress = InetAddress.getByName(tmpConf.getValue()); + } + // get server port miServerPort = 21; tmpConf = conf.getChild("ftp-port", false); @@ -122,10 +128,10 @@ } // get maximum number of connections - miMaxConnection = 20; + miMaxLogin = 20; tmpConf = conf.getChild("max-connection", false); if(tmpConf != null) { - miMaxConnection = tmpConf.getValueAsInteger(miMaxConnection); + miMaxLogin = tmpConf.getValueAsInteger(miMaxLogin); } // get anonymous login allow flag @@ -136,17 +142,17 @@ } // get maximum number of anonymous connections - miMaxAnonConnection = 10; + miAnonLogin = 10; tmpConf = conf.getChild("anonymous-max-connection", false); if(tmpConf != null) { - miMaxAnonConnection = tmpConf.getValueAsInteger(miMaxAnonConnection); + miAnonLogin = tmpConf.getValueAsInteger(miAnonLogin); } // get scheduler interval - miSchedulerInterval = 120; + miPollInterval = 120; tmpConf = conf.getChild("poll-interval", false); if(tmpConf != null) { - miSchedulerInterval = tmpConf.getValueAsInteger(miSchedulerInterval); + miPollInterval = tmpConf.getValueAsInteger(miPollInterval); } // get rmi port @@ -185,13 +191,26 @@ } mDefaultRoot = new File(defaultRoot); - // get self address - if(mServerAddress != null) { - mSelfAddress = mServerAddress; - } - else { + // get data port number + String dataPort = "0"; + tmpConf = conf.getChild("data-port-pool", false); + if(tmpConf != null) { + dataPort = tmpConf.getValue(dataPort); + } + StringTokenizer st = new StringTokenizer(dataPort, ", \t\n\r\f"); + miDataPort = new int[st.countTokens()][2]; + for(int i=0; i<miDataPort.length; i++) { + miDataPort[i][0] = Integer.parseInt(st.nextToken()); + miDataPort[i][1] = 0; + } + + // get host addresses + if (mSelfAddress == null) { mSelfAddress = InetAddress.getLocalHost(); - } + } + if(mServerAddress == null) { + mServerAddress = mSelfAddress; + } mStatistics = new FtpStatistics(this); mConService = new ConnectionService(this); @@ -201,17 +220,55 @@ } /** - * Get ftp status resource. + * Get data port. Data port number zero (0) means that + * any available port will be used. */ - public FtpStatus getStatus() { - return mStatus; - } + public int getDataPort() { + synchronized(miDataPort) { + int dataPort = -1; + int loopTimes = 2; + Thread currThread = Thread.currentThread(); + while( (dataPort==-1) && (--loopTimes >= 0) && (!currThread.isInterrupted()) ) { + + // search for a free port + for(int i=0; i<miDataPort.length; i++) { + if(miDataPort[i][1] == 0) { + if(miDataPort[i][0] != 0) { + miDataPort[i][1] = 1; + } + dataPort = miDataPort[i][0]; + break; + } + } + + // no available free port - wait for the release notification + if(dataPort == -1) { + try { + miDataPort.wait(); + } + catch(InterruptedException ex) { + } + } + + } + return dataPort; + } + } + /** - * Get message queue. + * Release data port */ - public AsyncMessageQueue getMessageQueue() { - return mMsgQ; + public void releaseDataPort(int port) { + synchronized(miDataPort) { + for(int i=0; i<miDataPort.length; i++) { + if(miDataPort[i][0] == port) { + miDataPort[i][1] = 0; + break; + } + } + miDataPort.notify(); + } } /** @@ -222,24 +279,17 @@ } /** - * Get context - */ - public BlockContext getContext() { - return mContext; - } - - /** - * Get user manager + * Get server port. */ - public UserManagerInterface getUserManager() { - return mUserManager; + public int getServerPort() { + return miServerPort; } - + /** - * Get ip restrictor + * Get context */ - public IpRestrictorInterface getIpRestrictor() { - return mIpRestrictor; + public BlockContext getContext() { + return mContext; } /** @@ -264,31 +314,38 @@ } /** - * Get server port. - */ - public int getServerPort() { - return miServerPort; - } - - /** * Check annonymous login support. */ public boolean isAnonymousLoginAllowed() { return mbAnonAllowed; } + + /** + * Get ftp status resource. + */ + public FtpStatus getStatus() { + return mStatus; + } /** - * Get user properties. + * Get connection service. */ public ConnectionService getConnectionService() { return mConService; } - + + /** + * Get user manager. + */ + public UserManagerInterface getUserManager() { + return mUserManager; + } + /** * Get maximum number of connections. */ public int getMaxConnections() { - return miMaxConnection; + return miMaxLogin; } /** @@ -298,14 +355,14 @@ if(!isAnonymousLoginAllowed()) { return 0; } - return miMaxAnonConnection; + return miAnonLogin; } /** * Get poll interval in seconds. */ public int getSchedulerInterval() { - return miSchedulerInterval; + return miPollInterval; } /** @@ -314,7 +371,7 @@ public int getDefaultIdleTime() { return miDefaultIdle; } - + /** * Get default root directory */ @@ -323,10 +380,10 @@ } /** - * Get global statistics object. + * Create user home directory if not exist during login */ - public FtpStatistics getStatistics() { - return mStatistics; + public boolean isCreateHome() { + return mbCreateHome; } /** @@ -344,20 +401,35 @@ } /** - * Is autometic user home creation allowed? - */ - public boolean isCreateHome() { - return mbCreateHome; - } - - /** * Get base directory */ public File getBaseDirectory() { return mContext.getBaseDirectory(); } + + /** + * Get IP restrictor object. + */ + public IpRestrictorInterface getIpRestrictor() { + return mIpRestrictor; + } + + /** + * Get global statistics object. + */ + public FtpStatistics getStatistics() { + return mStatistics; + } /** + * Get message queue + */ + public AsyncMessageQueue getMessageQueue() { + return mQueue; + } + + + /** * Get the system name. */ public String getSystemName() { @@ -370,8 +442,8 @@ systemName = systemName.replace(' ', '-'); } return systemName; - } - + } + /** * Close this config and all the related resources. Ftp server * <code>FtpServer.stop()</code> method will call this method. @@ -391,13 +463,14 @@ } // close message queue - if (mMsgQ != null) { - mMsgQ.stop(); - mMsgQ = null; + if (mQueue != null) { + mQueue.stop(); + mQueue = null; } } } +
-- To unsubscribe, e-mail: <mailto:[EMAIL PROTECTED]> For additional commands, e-mail: <mailto:[EMAIL PROTECTED]>