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