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/04/24 20:58:51 UTC
svn commit: r937671 - in /james/server/trunk:
netty-socket/src/main/java/org/apache/james/socket/netty/
smtpserver/src/main/java/org/apache/james/smtpserver/netty/
smtpserver/src/test/java/org/apache/james/smtpserver/
Author: norman
Date: Sat Apr 24 18:58:50 2010
New Revision: 937671
URL: http://svn.apache.org/viewvc?rev=937671&view=rev
Log:
* Write a error message back to client in SMTP if the max line length was exceed
* Don't strip the LineDelimiter, so we don't need to copy it back later
Modified:
james/server/trunk/netty-socket/src/main/java/org/apache/james/socket/netty/AbstractChannelPipelineFactory.java
james/server/trunk/netty-socket/src/main/java/org/apache/james/socket/netty/AbstractChannelUpstreamHandler.java
james/server/trunk/netty-socket/src/main/java/org/apache/james/socket/netty/LineHandlerUpstreamHandler.java
james/server/trunk/smtpserver/src/main/java/org/apache/james/smtpserver/netty/SMTPChannelUpstreamHandler.java
james/server/trunk/smtpserver/src/test/java/org/apache/james/smtpserver/AbstractSMTPServerTest.java
james/server/trunk/smtpserver/src/test/java/org/apache/james/smtpserver/AsyncSMTPServerTest.java
james/server/trunk/smtpserver/src/test/java/org/apache/james/smtpserver/NioSMTPServerTest.java
Modified: james/server/trunk/netty-socket/src/main/java/org/apache/james/socket/netty/AbstractChannelPipelineFactory.java
URL: http://svn.apache.org/viewvc/james/server/trunk/netty-socket/src/main/java/org/apache/james/socket/netty/AbstractChannelPipelineFactory.java?rev=937671&r1=937670&r2=937671&view=diff
==============================================================================
--- james/server/trunk/netty-socket/src/main/java/org/apache/james/socket/netty/AbstractChannelPipelineFactory.java (original)
+++ james/server/trunk/netty-socket/src/main/java/org/apache/james/socket/netty/AbstractChannelPipelineFactory.java Sat Apr 24 18:58:50 2010
@@ -39,6 +39,7 @@ import org.jboss.netty.util.Timer;
*/
public abstract class AbstractChannelPipelineFactory implements ChannelPipelineFactory{
+ public final static int MAX_LINE_LENGTH = 8192;
private final Timer timer = new HashedWheelTimer();
/*
* (non-Javadoc)
@@ -53,15 +54,14 @@ public abstract class AbstractChannelPip
pipeline.addLast("connectionPerIpLimit", new ConnectionPerIpLimitUpstreamHandler(getMaxConnectionsPerIP()));
- // Add the text line codec combination first,
- // decoder
- pipeline.addLast("framer", new DelimiterBasedFrameDecoder(8192, Delimiters.lineDelimiter()));
+ // Add the text line decoder which limit the max line length, don't strip the delimiter and use CRLF as delimiter
+ pipeline.addLast("framer", new DelimiterBasedFrameDecoder(MAX_LINE_LENGTH, false, Delimiters.lineDelimiter()));
// encoder
pipeline.addLast("encoderResponse", createEncoder());
pipeline.addLast("streamer", new ChunkedWriteHandler());
- pipeline.addLast("timeoutHandler", new TimeoutHandler(timer, 120,120,0));
+ pipeline.addLast("timeoutHandler", new TimeoutHandler(timer, 120, 120, 0));
pipeline.addLast("coreHandler", createHandler());
Modified: james/server/trunk/netty-socket/src/main/java/org/apache/james/socket/netty/AbstractChannelUpstreamHandler.java
URL: http://svn.apache.org/viewvc/james/server/trunk/netty-socket/src/main/java/org/apache/james/socket/netty/AbstractChannelUpstreamHandler.java?rev=937671&r1=937670&r2=937671&view=diff
==============================================================================
--- james/server/trunk/netty-socket/src/main/java/org/apache/james/socket/netty/AbstractChannelUpstreamHandler.java (original)
+++ james/server/trunk/netty-socket/src/main/java/org/apache/james/socket/netty/AbstractChannelUpstreamHandler.java Sat Apr 24 18:58:50 2010
@@ -35,6 +35,7 @@ import org.jboss.netty.channel.ChannelUp
import org.jboss.netty.channel.ExceptionEvent;
import org.jboss.netty.channel.MessageEvent;
import org.jboss.netty.channel.SimpleChannelUpstreamHandler;
+import org.jboss.netty.handler.codec.frame.TooLongFrameException;
/**
* This abstract {@link ChannelUpstreamHandler} handling the calling of ConnectHandler and LineHandlers
@@ -105,7 +106,9 @@ public abstract class AbstractChannelUps
@Override
public void exceptionCaught(ChannelHandlerContext ctx, ExceptionEvent e) throws Exception {
- cleanup(ctx.getChannel());
+ if ((e.getCause() instanceof TooLongFrameException) == false) {
+ cleanup(ctx.getChannel());
+ }
}
private void cleanup(Channel channel) {
Modified: james/server/trunk/netty-socket/src/main/java/org/apache/james/socket/netty/LineHandlerUpstreamHandler.java
URL: http://svn.apache.org/viewvc/james/server/trunk/netty-socket/src/main/java/org/apache/james/socket/netty/LineHandlerUpstreamHandler.java?rev=937671&r1=937670&r2=937671&view=diff
==============================================================================
--- james/server/trunk/netty-socket/src/main/java/org/apache/james/socket/netty/LineHandlerUpstreamHandler.java (original)
+++ james/server/trunk/netty-socket/src/main/java/org/apache/james/socket/netty/LineHandlerUpstreamHandler.java Sat Apr 24 18:58:50 2010
@@ -39,27 +39,19 @@ public class LineHandlerUpstreamHandler<
public LineHandlerUpstreamHandler(LineHandler<Session> handler) {
this.handler = handler;
}
+
@SuppressWarnings("unchecked")
@Override
public void messageReceived(ChannelHandlerContext ctx, MessageEvent e) throws Exception {
Session pSession = (Session) attributes.get(ctx.getChannel());
ChannelBuffer buf = (ChannelBuffer) e.getMessage();
-
+
+ // copy the ChannelBuffer to a byte array to process the LineHandler
byte[] line = new byte[buf.capacity()];
buf.getBytes(0, line);
- // TODO: improve me!
- // thats not the most performant thing but it at least works for now
- // this should get improved later
- byte[] newLine = new byte[line.length +2];
- for (int i = 0; i < line.length; i++) {
- newLine[i] = line[i];
- }
- newLine[newLine.length -2] = '\r';
- newLine[newLine.length -1] = '\n';
-
- handler.onLine(pSession,newLine);
+ handler.onLine(pSession, line);
}
Modified: james/server/trunk/smtpserver/src/main/java/org/apache/james/smtpserver/netty/SMTPChannelUpstreamHandler.java
URL: http://svn.apache.org/viewvc/james/server/trunk/smtpserver/src/main/java/org/apache/james/smtpserver/netty/SMTPChannelUpstreamHandler.java?rev=937671&r1=937670&r2=937671&view=diff
==============================================================================
--- james/server/trunk/smtpserver/src/main/java/org/apache/james/smtpserver/netty/SMTPChannelUpstreamHandler.java (original)
+++ james/server/trunk/smtpserver/src/main/java/org/apache/james/smtpserver/netty/SMTPChannelUpstreamHandler.java Sat Apr 24 18:58:50 2010
@@ -35,6 +35,7 @@ import org.jboss.netty.channel.ChannelHa
import org.jboss.netty.channel.ChannelStateEvent;
import org.jboss.netty.channel.ChannelUpstreamHandler;
import org.jboss.netty.channel.ExceptionEvent;
+import org.jboss.netty.handler.codec.frame.TooLongFrameException;
/**
* {@link ChannelUpstreamHandler} which is used by the SMTPServer
@@ -78,11 +79,16 @@ public class SMTPChannelUpstreamHandler
@Override
public void exceptionCaught(ChannelHandlerContext ctx, ExceptionEvent e) throws Exception {
Channel channel = ctx.getChannel();
- if (channel.isConnected()) {
- ctx.getChannel().write(new SMTPResponse(SMTPRetCode.LOCAL_ERROR, "Unable to process smtp request"));
+ if (e.getCause() instanceof TooLongFrameException) {
+ ctx.getChannel().write(new SMTPResponse(SMTPRetCode.SYNTAX_ERROR_COMMAND_UNRECOGNIZED, "Line length exceeded. See RFC 2821 #4.5.3.1."));
+ } else {
+ if (channel.isConnected()) {
+ ctx.getChannel().write(new SMTPResponse(SMTPRetCode.LOCAL_ERROR, "Unable to process smtp request"));
+ }
+ cleanup(channel);
+ channel.close();
}
- cleanup(channel);
- channel.close();
+
super.exceptionCaught(ctx, e);
}
Modified: james/server/trunk/smtpserver/src/test/java/org/apache/james/smtpserver/AbstractSMTPServerTest.java
URL: http://svn.apache.org/viewvc/james/server/trunk/smtpserver/src/test/java/org/apache/james/smtpserver/AbstractSMTPServerTest.java?rev=937671&r1=937670&r2=937671&view=diff
==============================================================================
--- james/server/trunk/smtpserver/src/test/java/org/apache/james/smtpserver/AbstractSMTPServerTest.java (original)
+++ james/server/trunk/smtpserver/src/test/java/org/apache/james/smtpserver/AbstractSMTPServerTest.java Sat Apr 24 18:58:50 2010
@@ -49,7 +49,6 @@ import org.apache.james.lifecycle.Lifecy
import org.apache.james.services.FileSystem;
import org.apache.james.services.MailServer;
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;
@@ -264,27 +263,7 @@ public abstract class AbstractSMTPServer
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();
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=937671&r1=937670&r2=937671&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 Apr 24 18:58:50 2010
@@ -20,7 +20,9 @@
package org.apache.james.smtpserver;
import org.apache.commons.logging.impl.SimpleLog;
+import org.apache.commons.net.smtp.SMTPClient;
import org.apache.james.smtpserver.mina.AsyncSMTPServer;
+import org.apache.james.socket.mina.codec.CRLFTerminatedLineDecoder;
public class AsyncSMTPServerTest extends AbstractSMTPServerTest{
@@ -46,4 +48,25 @@ public class AsyncSMTPServerTest extends
m_smtpServer.init();
}
+ 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();
+ }
}
Modified: james/server/trunk/smtpserver/src/test/java/org/apache/james/smtpserver/NioSMTPServerTest.java
URL: http://svn.apache.org/viewvc/james/server/trunk/smtpserver/src/test/java/org/apache/james/smtpserver/NioSMTPServerTest.java?rev=937671&r1=937670&r2=937671&view=diff
==============================================================================
--- james/server/trunk/smtpserver/src/test/java/org/apache/james/smtpserver/NioSMTPServerTest.java (original)
+++ james/server/trunk/smtpserver/src/test/java/org/apache/james/smtpserver/NioSMTPServerTest.java Sat Apr 24 18:58:50 2010
@@ -20,7 +20,9 @@
package org.apache.james.smtpserver;
import org.apache.commons.logging.impl.SimpleLog;
+import org.apache.commons.net.smtp.SMTPClient;
import org.apache.james.smtpserver.netty.NioSMTPServer;
+import org.apache.james.socket.netty.AbstractChannelPipelineFactory;
public class NioSMTPServerTest extends AbstractSMTPServerTest{
@@ -47,9 +49,26 @@ public class NioSMTPServerTest extends A
m_smtpServer.setMailServer(m_mailServer);
}
- @Override
public void testMaxLineLength() throws Exception {
- // TODO: Add support
+ finishSetUp(m_testConfiguration);
+
+ SMTPClient smtpProtocol = new SMTPClient();
+ smtpProtocol.connect("127.0.0.1", m_smtpListenerPort);
+
+ StringBuffer sb = new StringBuffer();
+ for (int i = 0; i < AbstractChannelPipelineFactory.MAX_LINE_LENGTH; 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();
}
}
---------------------------------------------------------------------
To unsubscribe, e-mail: server-dev-unsubscribe@james.apache.org
For additional commands, e-mail: server-dev-help@james.apache.org