Author: ngn
Date: Wed Mar 12 01:46:53 2008
New Revision: 636253
URL: http://svn.apache.org/viewvc?rev=636253&view=rev
Log:
Serializing commands in a session to fix race conditions in command execution
Fixing broken message
Modified:
mina/ftpserver/trunk/core/src/main/java/org/apache/ftpserver/FtpHandler.java
mina/ftpserver/trunk/core/src/main/java/org/apache/ftpserver/command/PASS.java
mina/ftpserver/trunk/core/src/main/java/org/apache/ftpserver/listener/mina/MinaListener.java
mina/ftpserver/trunk/core/src/main/resources/org/apache/ftpserver/message/FtpStatus.properties
Modified:
mina/ftpserver/trunk/core/src/main/java/org/apache/ftpserver/FtpHandler.java
URL:
http://svn.apache.org/viewvc/mina/ftpserver/trunk/core/src/main/java/org/apache/ftpserver/FtpHandler.java?rev=636253&r1=636252&r2=636253&view=diff
==============================================================================
---
mina/ftpserver/trunk/core/src/main/java/org/apache/ftpserver/FtpHandler.java
(original)
+++
mina/ftpserver/trunk/core/src/main/java/org/apache/ftpserver/FtpHandler.java
Wed Mar 12 01:46:53 2008
@@ -76,7 +76,9 @@
if(command != null) {
- command.execute(ftpSession, context, request);
+ synchronized (session) {
+ command.execute(ftpSession, context, request);
+ }
}
else {
session.write(FtpReplyUtil.translate(ftpSession, request,
context, FtpReply.REPLY_502_COMMAND_NOT_IMPLEMENTED, "not.implemented", null));
Modified:
mina/ftpserver/trunk/core/src/main/java/org/apache/ftpserver/command/PASS.java
URL:
http://svn.apache.org/viewvc/mina/ftpserver/trunk/core/src/main/java/org/apache/ftpserver/command/PASS.java?rev=636253&r1=636252&r2=636253&view=diff
==============================================================================
---
mina/ftpserver/trunk/core/src/main/java/org/apache/ftpserver/command/PASS.java
(original)
+++
mina/ftpserver/trunk/core/src/main/java/org/apache/ftpserver/command/PASS.java
Wed Mar 12 01:46:53 2008
@@ -134,7 +134,7 @@
authenticatedUser = userManager.authenticate(auth);
} catch(AuthenticationFailedException e) {
authenticatedUser = null;
- LOG.warn("User failed to log in", e);
+ LOG.warn("User failed to log in");
}
catch(Exception e) {
authenticatedUser = null;
Modified:
mina/ftpserver/trunk/core/src/main/java/org/apache/ftpserver/listener/mina/MinaListener.java
URL:
http://svn.apache.org/viewvc/mina/ftpserver/trunk/core/src/main/java/org/apache/ftpserver/listener/mina/MinaListener.java?rev=636253&r1=636252&r2=636253&view=diff
==============================================================================
---
mina/ftpserver/trunk/core/src/main/java/org/apache/ftpserver/listener/mina/MinaListener.java
(original)
+++
mina/ftpserver/trunk/core/src/main/java/org/apache/ftpserver/listener/mina/MinaListener.java
Wed Mar 12 01:46:53 2008
@@ -21,6 +21,9 @@
import java.io.IOException;
import java.net.InetSocketAddress;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
+import java.util.concurrent.TimeUnit;
import org.apache.ftpserver.FtpHandler;
import org.apache.ftpserver.interfaces.FtpServerContext;
@@ -30,6 +33,7 @@
import org.apache.ftpserver.ssl.SslConfiguration;
import org.apache.mina.common.IdleStatus;
import org.apache.mina.filter.codec.ProtocolCodecFilter;
+import org.apache.mina.filter.executor.ExecutorFilter;
import org.apache.mina.filter.logging.LoggingFilter;
import org.apache.mina.filter.logging.MdcInjectionFilter;
import org.apache.mina.filter.ssl.SslFilter;
@@ -53,6 +57,8 @@
boolean suspended = false;
+ private ExecutorService filterExecutor = Executors.newCachedThreadPool();
+
/**
* @see Listener#start(FtpServerContext)
*/
@@ -75,11 +81,12 @@
MdcInjectionFilter mdcFilter = new MdcInjectionFilter();
acceptor.getFilterChain().addLast("mdcFilter", mdcFilter);
+ acceptor.getFilterChain().addLast("threadPool", new
ExecutorFilter(filterExecutor));
acceptor.getFilterChain().addLast(
- "codec",
- new ProtocolCodecFilter( new FtpServerProtocolCodecFactory() )
);
-
+ "codec",
+ new ProtocolCodecFilter( new
FtpServerProtocolCodecFactory() ) );
acceptor.getFilterChain().addLast("logger", new LoggingFilter() );
+
acceptor.getFilterChain().addLast("mdcFilter2", mdcFilter);
@@ -115,6 +122,16 @@
acceptor.dispose();
acceptor = null;
}
+
+ if(filterExecutor != null) {
+ filterExecutor.shutdown();
+ try {
+ filterExecutor.awaitTermination(5000, TimeUnit.MILLISECONDS);
+ } catch (InterruptedException e) {
+ } finally {
+// TODO: how to handle?
+ }
+ }
}
/**
@@ -153,4 +170,22 @@
acceptor.unbind(address);
}
}
+
+ /**
+ * Get the [EMAIL PROTECTED] ExecutorService} used for processing
requests. The default
+ * value is a cached thread pool.
+ * @return The [EMAIL PROTECTED] ExecutorService}
+ */
+ public ExecutorService getFilterExecutor() {
+ return filterExecutor;
+ }
+
+ /**
+ * Set the [EMAIL PROTECTED] ExecutorService} used for processing requests
+ * @param filterExecutor The [EMAIL PROTECTED] ExecutorService}
+ */
+ public void setFilterExecutor(ExecutorService filterExecutor) {
+ this.filterExecutor = filterExecutor;
+ }
+
}
Modified:
mina/ftpserver/trunk/core/src/main/resources/org/apache/ftpserver/message/FtpStatus.properties
URL:
http://svn.apache.org/viewvc/mina/ftpserver/trunk/core/src/main/resources/org/apache/ftpserver/message/FtpStatus.properties?rev=636253&r1=636252&r2=636253&view=diff
==============================================================================
---
mina/ftpserver/trunk/core/src/main/resources/org/apache/ftpserver/message/FtpStatus.properties
(original)
+++
mina/ftpserver/trunk/core/src/main/resources/org/apache/ftpserver/message/FtpStatus.properties
Wed Mar 12 01:46:53 2008
@@ -267,7 +267,7 @@
421.USER.anonymous=Maximum anonymous login limit has been reached.
421.USER.login=Maximum login limit has been reached.
331.USER.anonymous=Guest login okay, send your complete e-mail address as
password.
-331.USER=User name okay, need password for {client.login.name}.
+331.USER=User name okay, need password for {output.msg}.
251.MD5={output.msg}
252.MMD5={output.msg}