You are viewing a plain text version of this content. The canonical link for it is here.
Posted to server-dev@james.apache.org by no...@apache.org on 2010/02/13 10:00:00 UTC
svn commit: r909776 - in /james/server/trunk:
mina-socket/src/main/java/org/apache/james/socket/mina/codec/
smtpserver/src/main/java/org/apache/james/smtpserver/mina/
smtpserver/src/test/java/org/apache/james/smtpserver/
Author: norman
Date: Sat Feb 13 08:59:59 2010
New Revision: 909776
URL: http://svn.apache.org/viewvc?rev=909776&view=rev
Log:
More performant + correct handling of MaxLineLength detection
Modified:
james/server/trunk/mina-socket/src/main/java/org/apache/james/socket/mina/codec/CRLFTerminatedLineDecoder.java
james/server/trunk/smtpserver/src/main/java/org/apache/james/smtpserver/mina/SMTPIoHandler.java
james/server/trunk/smtpserver/src/test/java/org/apache/james/smtpserver/AsyncSMTPServerTest.java
Modified: james/server/trunk/mina-socket/src/main/java/org/apache/james/socket/mina/codec/CRLFTerminatedLineDecoder.java
URL: http://svn.apache.org/viewvc/james/server/trunk/mina-socket/src/main/java/org/apache/james/socket/mina/codec/CRLFTerminatedLineDecoder.java?rev=909776&r1=909775&r2=909776&view=diff
==============================================================================
--- james/server/trunk/mina-socket/src/main/java/org/apache/james/socket/mina/codec/CRLFTerminatedLineDecoder.java (original)
+++ james/server/trunk/mina-socket/src/main/java/org/apache/james/socket/mina/codec/CRLFTerminatedLineDecoder.java Sat Feb 13 08:59:59 2010
@@ -68,15 +68,17 @@
// Now find the first CRLF in the buffer.
byte previous = 0;
- int count = 0;
+
+ if (maxLineLength != -1 && in.remaining() > maxLineLength) {
+
+ // clear the buffer before throw exception
+ in.clear();
+
+ throw new LineLengthExceededException(maxLineLength, in.remaining());
+ }
while (in.hasRemaining()) {
byte current = in.get();
- count++;
-
- // max line lenth exceed. Throw exception to prevent DOS
- if (maxLineLength != -1 && count > maxLineLength) {
- throw new LineLengthExceededException(maxLineLength, in.capacity());
- }
+
if (previous == '\r' && current == '\n') {
// Remember the current position and limit.
Modified: james/server/trunk/smtpserver/src/main/java/org/apache/james/smtpserver/mina/SMTPIoHandler.java
URL: http://svn.apache.org/viewvc/james/server/trunk/smtpserver/src/main/java/org/apache/james/smtpserver/mina/SMTPIoHandler.java?rev=909776&r1=909775&r2=909776&view=diff
==============================================================================
--- james/server/trunk/smtpserver/src/main/java/org/apache/james/smtpserver/mina/SMTPIoHandler.java (original)
+++ james/server/trunk/smtpserver/src/main/java/org/apache/james/smtpserver/mina/SMTPIoHandler.java Sat Feb 13 08:59:59 2010
@@ -28,7 +28,9 @@
import org.apache.james.protocols.smtp.SMTPRetCode;
import org.apache.james.protocols.smtp.SMTPSession;
import org.apache.james.socket.mina.AbstractIoHandler;
+import org.apache.james.socket.mina.codec.LineLengthExceededException;
import org.apache.mina.core.session.IoSession;
+import org.apache.mina.filter.codec.ProtocolDecoderException;
import org.apache.mina.filter.ssl.SslContextFactory;
/**
@@ -60,12 +62,22 @@
*/
public void exceptionCaught(IoSession session, Throwable exception)
throws Exception {
- logger.error("Caught exception: " + session.getCurrentWriteMessage(),
+ logger.debug("Caught exception: " + session.getCurrentWriteMessage(),
exception);
-
+ if (exception instanceof ProtocolDecoderException) {
+ ProtocolDecoderException e = (ProtocolDecoderException) exception;
+ if (e.getCause() instanceof LineLengthExceededException) {
+ session.write(new SMTPResponse(SMTPRetCode.SYNTAX_ERROR_COMMAND_UNRECOGNIZED, "Line length exceeded. See RFC 2821 #4.5.3.1."));
+ return;
+ }
+ }
+
+
if (session.isConnected()) {
session.write(new SMTPResponse(SMTPRetCode.LOCAL_ERROR, "Unable to process smtp request"));
}
+
+
}
@Override
Modified: james/server/trunk/smtpserver/src/test/java/org/apache/james/smtpserver/AsyncSMTPServerTest.java
URL: http://svn.apache.org/viewvc/james/server/trunk/smtpserver/src/test/java/org/apache/james/smtpserver/AsyncSMTPServerTest.java?rev=909776&r1=909775&r2=909776&view=diff
==============================================================================
--- james/server/trunk/smtpserver/src/test/java/org/apache/james/smtpserver/AsyncSMTPServerTest.java (original)
+++ james/server/trunk/smtpserver/src/test/java/org/apache/james/smtpserver/AsyncSMTPServerTest.java Sat Feb 13 08:59:59 2010
@@ -50,6 +50,7 @@
import org.apache.james.services.MailServer;
import org.apache.james.smtpserver.mina.AsyncSMTPServer;
import org.apache.james.socket.ProtocolHandlerChainImpl;
+import org.apache.james.socket.mina.codec.CRLFTerminatedLineDecoder;
import org.apache.james.test.mock.DummyVirtualUserTableStore;
import org.apache.james.test.mock.avalon.MockStore;
import org.apache.james.test.mock.james.MockFileSystem;
@@ -160,6 +161,8 @@
protected void setUp() throws Exception {
setUpFakeLoader();
+ SimpleLog log = new SimpleLog("Mock");
+ log.setLevel(SimpleLog.LOG_LEVEL_ALL);
m_testConfiguration = new SMTPTestConfiguration(m_smtpListenerPort);
m_smtpServer = new AsyncSMTPServer();
@@ -168,11 +171,11 @@
chain = new ProtocolHandlerChainImpl();
chain.setInstanceFactory(m_serviceManager);
- chain.setLog(new SimpleLog("ChainLog"));
+ chain.setLog(log);
m_smtpServer.setProtocolHandlerChain(chain);
- m_smtpServer.setLog(new SimpleLog("Mock"));
+ m_smtpServer.setLog(log);
m_smtpServer.setMailServer(m_mailServer);
}
@@ -264,6 +267,28 @@
// mail was propagated by SMTPServer
assertNotNull("mail received by mail server", m_mailServer.getLastMail());
}
+
+ public void testMaxLineLength() throws Exception {
+ finishSetUp(m_testConfiguration);
+
+ SMTPClient smtpProtocol = new SMTPClient();
+ smtpProtocol.connect("127.0.0.1", m_smtpListenerPort);
+
+ StringBuffer sb = new StringBuffer();
+ for (int i = 0; i < CRLFTerminatedLineDecoder.DEFAULT_MAX_LINE_LENTH; i++) {
+ sb.append("A");
+ }
+ smtpProtocol.sendCommand("EHLO " + sb.toString());
+ System.out.println(smtpProtocol.getReplyString());
+ assertEquals("Line length exceed", 500, smtpProtocol.getReplyCode());
+
+ smtpProtocol.sendCommand("EHLO test");
+ assertEquals("Line length ok", 250, smtpProtocol.getReplyCode());
+
+
+ smtpProtocol.quit();
+ smtpProtocol.disconnect();
+ }
public void testStartTLSInEHLO() throws Exception {
m_testConfiguration.setStartTLS();
---------------------------------------------------------------------
To unsubscribe, e-mail: server-dev-unsubscribe@james.apache.org
For additional commands, e-mail: server-dev-help@james.apache.org