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 ad...@apache.org on 2016/12/06 12:25:19 UTC

[01/12] james-project git commit: JAMES-1862 Fix Eclipse warnings

Repository: james-project
Updated Branches:
  refs/heads/master b38510b9a -> a816b1269


JAMES-1862 Fix Eclipse warnings


Project: http://git-wip-us.apache.org/repos/asf/james-project/repo
Commit: http://git-wip-us.apache.org/repos/asf/james-project/commit/76f9d610
Tree: http://git-wip-us.apache.org/repos/asf/james-project/tree/76f9d610
Diff: http://git-wip-us.apache.org/repos/asf/james-project/diff/76f9d610

Branch: refs/heads/master
Commit: 76f9d610193ba219cb4e9bf03df6875bd44fe61a
Parents: 8687657
Author: Antoine Duprat <ad...@apache.org>
Authored: Thu Dec 1 14:17:00 2016 +0100
Committer: Antoine Duprat <ad...@apache.org>
Committed: Thu Dec 1 14:17:00 2016 +0100

----------------------------------------------------------------------
 .../org/apache/james/transport/mailets/jsieve/FileIntoAction.java | 2 --
 .../java/org/apache/james/transport/mailets/jsieve/Poster.java    | 1 -
 .../java/org/apache/james/imapserver/netty/IMAPServerFactory.java | 1 -
 .../java/org/apache/james/imapserver/netty/OioIMAPServer.java     | 1 -
 .../main/java/org/apache/james/queue/jms/JMSMailQueueFactory.java | 3 +--
 5 files changed, 1 insertion(+), 7 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/james-project/blob/76f9d610/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/jsieve/FileIntoAction.java
----------------------------------------------------------------------
diff --git a/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/jsieve/FileIntoAction.java b/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/jsieve/FileIntoAction.java
index 1c91bba..6a56482 100644
--- a/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/jsieve/FileIntoAction.java
+++ b/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/jsieve/FileIntoAction.java
@@ -19,7 +19,6 @@
 package org.apache.james.transport.mailets.jsieve;
 
 import javax.mail.MessagingException;
-import javax.mail.internet.MimeMessage;
 
 import org.apache.commons.logging.Log;
 import org.apache.jsieve.mail.Action;
@@ -68,7 +67,6 @@ public class FileIntoAction implements MailAction {
      * @param context not null
      * @throws MessagingException
      */
-    @SuppressWarnings("deprecation")
     public void execute(ActionFileInto anAction, Mail aMail, final ActionContext context) throws MessagingException
     {
         String destinationMailbox = anAction.getDestination();

http://git-wip-us.apache.org/repos/asf/james-project/blob/76f9d610/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/jsieve/Poster.java
----------------------------------------------------------------------
diff --git a/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/jsieve/Poster.java b/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/jsieve/Poster.java
index c86d352..ae94779 100644
--- a/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/jsieve/Poster.java
+++ b/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/jsieve/Poster.java
@@ -20,7 +20,6 @@
 package org.apache.james.transport.mailets.jsieve;
 
 import javax.mail.MessagingException;
-import javax.mail.internet.MimeMessage;
 
 import org.apache.mailet.Mail;
 

http://git-wip-us.apache.org/repos/asf/james-project/blob/76f9d610/server/protocols/protocols-imap4/src/main/java/org/apache/james/imapserver/netty/IMAPServerFactory.java
----------------------------------------------------------------------
diff --git a/server/protocols/protocols-imap4/src/main/java/org/apache/james/imapserver/netty/IMAPServerFactory.java b/server/protocols/protocols-imap4/src/main/java/org/apache/james/imapserver/netty/IMAPServerFactory.java
index cb92875..351dac3 100644
--- a/server/protocols/protocols-imap4/src/main/java/org/apache/james/imapserver/netty/IMAPServerFactory.java
+++ b/server/protocols/protocols-imap4/src/main/java/org/apache/james/imapserver/netty/IMAPServerFactory.java
@@ -28,7 +28,6 @@ import org.apache.james.filesystem.api.FileSystem;
 import org.apache.james.imap.api.process.ImapProcessor;
 import org.apache.james.imap.decode.ImapDecoder;
 import org.apache.james.imap.encode.ImapEncoder;
-import org.apache.james.metrics.api.Metric;
 import org.apache.james.metrics.api.MetricFactory;
 import org.apache.james.protocols.lib.netty.AbstractConfigurableAsyncServer;
 import org.apache.james.protocols.lib.netty.AbstractServerFactory;

http://git-wip-us.apache.org/repos/asf/james-project/blob/76f9d610/server/protocols/protocols-imap4/src/main/java/org/apache/james/imapserver/netty/OioIMAPServer.java
----------------------------------------------------------------------
diff --git a/server/protocols/protocols-imap4/src/main/java/org/apache/james/imapserver/netty/OioIMAPServer.java b/server/protocols/protocols-imap4/src/main/java/org/apache/james/imapserver/netty/OioIMAPServer.java
index c3ce882..90e4d4a 100644
--- a/server/protocols/protocols-imap4/src/main/java/org/apache/james/imapserver/netty/OioIMAPServer.java
+++ b/server/protocols/protocols-imap4/src/main/java/org/apache/james/imapserver/netty/OioIMAPServer.java
@@ -21,7 +21,6 @@ package org.apache.james.imapserver.netty;
 import org.apache.james.imap.api.process.ImapProcessor;
 import org.apache.james.imap.decode.ImapDecoder;
 import org.apache.james.imap.encode.ImapEncoder;
-import org.apache.james.metrics.api.Metric;
 import org.jboss.netty.channel.socket.ServerSocketChannelFactory;
 import org.jboss.netty.channel.socket.oio.OioServerSocketChannelFactory;
 import org.jboss.netty.handler.execution.ExecutionHandler;

http://git-wip-us.apache.org/repos/asf/james-project/blob/76f9d610/server/queue/queue-jms/src/main/java/org/apache/james/queue/jms/JMSMailQueueFactory.java
----------------------------------------------------------------------
diff --git a/server/queue/queue-jms/src/main/java/org/apache/james/queue/jms/JMSMailQueueFactory.java b/server/queue/queue-jms/src/main/java/org/apache/james/queue/jms/JMSMailQueueFactory.java
index eea2319..36770d6 100644
--- a/server/queue/queue-jms/src/main/java/org/apache/james/queue/jms/JMSMailQueueFactory.java
+++ b/server/queue/queue-jms/src/main/java/org/apache/james/queue/jms/JMSMailQueueFactory.java
@@ -21,11 +21,10 @@ package org.apache.james.queue.jms;
 import javax.inject.Inject;
 import javax.jms.ConnectionFactory;
 
-import org.apache.james.metrics.api.Metric;
 import org.apache.james.metrics.api.MetricFactory;
-import org.apache.james.queue.api.MailQueueItemDecoratorFactory;
 import org.apache.james.queue.api.MailQueue;
 import org.apache.james.queue.api.MailQueueFactory;
+import org.apache.james.queue.api.MailQueueItemDecoratorFactory;
 import org.apache.james.queue.library.AbstractMailQueueFactory;
 
 /**


---------------------------------------------------------------------
To unsubscribe, e-mail: server-dev-unsubscribe@james.apache.org
For additional commands, e-mail: server-dev-help@james.apache.org


[07/12] james-project git commit: JAMES-1862 Add FrameHandler when building the server protocols

Posted by ad...@apache.org.
JAMES-1862 Add FrameHandler when building the server protocols


Project: http://git-wip-us.apache.org/repos/asf/james-project/repo
Commit: http://git-wip-us.apache.org/repos/asf/james-project/commit/b61399a6
Tree: http://git-wip-us.apache.org/repos/asf/james-project/tree/b61399a6
Diff: http://git-wip-us.apache.org/repos/asf/james-project/diff/b61399a6

Branch: refs/heads/master
Commit: b61399a6c3dc6f5c717f2ce118e4c3f84c2a4677
Parents: 50cf7b4
Author: Antoine Duprat <ad...@apache.org>
Authored: Wed Nov 30 14:27:15 2016 +0100
Committer: Antoine Duprat <ad...@linagora.com>
Committed: Tue Dec 6 11:29:31 2016 +0100

----------------------------------------------------------------------
 .../lmtp/netty/NettyLMTPSServerTest.java        |  5 +-
 .../lmtp/netty/NettyLMTPServerTest.java         |  4 +-
 protocols/netty/pom.xml                         | 14 ++++
 .../netty/AbstractChannelPipelineFactory.java   | 14 ++--
 .../AbstractSSLAwareChannelPipelineFactory.java | 11 +--
 .../netty/BasicChannelUpstreamHandler.java      |  6 +-
 .../james/protocols/netty/NettyServer.java      | 64 +++++++++++++++---
 .../james/protocols/netty/NettyServerTest.java  | 71 ++++++++++++++++++++
 .../pop3/netty/NettyPOP3SServerTest.java        |  5 +-
 .../pop3/netty/NettyPOP3ServerTest.java         |  4 +-
 .../pop3/netty/NettyStartTlsPOP3ServerTest.java |  5 +-
 .../smtp/netty/NettySMTPSServerTest.java        |  5 +-
 .../smtp/netty/NettySMTPServerTest.java         |  4 +-
 .../smtp/netty/NettyStartTlsSMTPServerTest.java | 32 +++++++--
 .../james/imapserver/netty/IMAPServer.java      |  8 ++-
 .../netty/AbstractConfigurableAsyncServer.java  | 12 +++-
 ...ractExecutorAwareChannelPipelineFactory.java |  9 +--
 .../james/lmtpserver/netty/LMTPServer.java      |  9 +++
 .../netty/ManageSieveServer.java                | 16 +++--
 .../james/pop3server/netty/POP3Server.java      |  9 +++
 .../james/smtpserver/netty/SMTPServer.java      |  9 +++
 21 files changed, 265 insertions(+), 51 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/james-project/blob/b61399a6/protocols/lmtp/src/test/java/org/apache/james/protocols/lmtp/netty/NettyLMTPSServerTest.java
----------------------------------------------------------------------
diff --git a/protocols/lmtp/src/test/java/org/apache/james/protocols/lmtp/netty/NettyLMTPSServerTest.java b/protocols/lmtp/src/test/java/org/apache/james/protocols/lmtp/netty/NettyLMTPSServerTest.java
index f7c46de..6915fcc 100644
--- a/protocols/lmtp/src/test/java/org/apache/james/protocols/lmtp/netty/NettyLMTPSServerTest.java
+++ b/protocols/lmtp/src/test/java/org/apache/james/protocols/lmtp/netty/NettyLMTPSServerTest.java
@@ -13,7 +13,10 @@ public class NettyLMTPSServerTest extends AbstractLMTPSServerTest{
 
     @Override
     protected ProtocolServer createServer(Protocol protocol, InetSocketAddress address) {
-        NettyServer server =  new NettyServer(protocol, Encryption.createTls(BogusSslContextFactory.getServerContext()));
+        NettyServer server =  NettyServer.builder()
+                .protocol(protocol)
+                .secure(Encryption.createTls(BogusSslContextFactory.getServerContext()))
+                .build();
         server.setListenAddresses(address);
         return server;
     }

http://git-wip-us.apache.org/repos/asf/james-project/blob/b61399a6/protocols/lmtp/src/test/java/org/apache/james/protocols/lmtp/netty/NettyLMTPServerTest.java
----------------------------------------------------------------------
diff --git a/protocols/lmtp/src/test/java/org/apache/james/protocols/lmtp/netty/NettyLMTPServerTest.java b/protocols/lmtp/src/test/java/org/apache/james/protocols/lmtp/netty/NettyLMTPServerTest.java
index ae72cc1..6e1a571 100644
--- a/protocols/lmtp/src/test/java/org/apache/james/protocols/lmtp/netty/NettyLMTPServerTest.java
+++ b/protocols/lmtp/src/test/java/org/apache/james/protocols/lmtp/netty/NettyLMTPServerTest.java
@@ -29,7 +29,9 @@ public class NettyLMTPServerTest extends AbstractLMTPServerTest {
 
     @Override
     protected ProtocolServer createServer(Protocol protocol, InetSocketAddress address) {
-        NettyServer server =  new NettyServer(protocol);
+        NettyServer server = NettyServer.builder()
+                .protocol(protocol)
+                .build();
         server.setListenAddresses(address);
         return server;
     }

http://git-wip-us.apache.org/repos/asf/james-project/blob/b61399a6/protocols/netty/pom.xml
----------------------------------------------------------------------
diff --git a/protocols/netty/pom.xml b/protocols/netty/pom.xml
index 5eb8849..330904f 100644
--- a/protocols/netty/pom.xml
+++ b/protocols/netty/pom.xml
@@ -39,9 +39,23 @@
             <artifactId>protocols-api</artifactId>
         </dependency>
         <dependency>
+            <groupId>com.google.guava</groupId>
+            <artifactId>guava</artifactId>
+        </dependency>
+        <dependency>
             <groupId>io.netty</groupId>
             <artifactId>netty</artifactId>
         </dependency>
+        <dependency>
+            <groupId>junit</groupId>
+            <artifactId>junit</artifactId>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.mockito</groupId>
+            <artifactId>mockito-core</artifactId>
+            <scope>test</scope>
+        </dependency>
     </dependencies>
 
 </project>
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/james-project/blob/b61399a6/protocols/netty/src/main/java/org/apache/james/protocols/netty/AbstractChannelPipelineFactory.java
----------------------------------------------------------------------
diff --git a/protocols/netty/src/main/java/org/apache/james/protocols/netty/AbstractChannelPipelineFactory.java b/protocols/netty/src/main/java/org/apache/james/protocols/netty/AbstractChannelPipelineFactory.java
index 90af526..39a5b5f 100644
--- a/protocols/netty/src/main/java/org/apache/james/protocols/netty/AbstractChannelPipelineFactory.java
+++ b/protocols/netty/src/main/java/org/apache/james/protocols/netty/AbstractChannelPipelineFactory.java
@@ -20,6 +20,7 @@ package org.apache.james.protocols.netty;
 
 import static org.jboss.netty.channel.Channels.pipeline;
 
+import org.jboss.netty.channel.ChannelHandler;
 import org.jboss.netty.channel.ChannelPipeline;
 import org.jboss.netty.channel.ChannelPipelineFactory;
 import org.jboss.netty.channel.ChannelUpstreamHandler;
@@ -45,21 +46,22 @@ public abstract class AbstractChannelPipelineFactory implements ChannelPipelineF
     private final ChannelGroupHandler groupHandler;
 	private final int timeout;
     private final ExecutionHandler eHandler;
+    private final ChannelHandler frameHandler;
     public AbstractChannelPipelineFactory(int timeout, int maxConnections, int maxConnectsPerIp, ChannelGroup channels) {
-        this(timeout, maxConnections, maxConnectsPerIp, channels, null);
+        this(timeout, maxConnections, maxConnectsPerIp, channels, null, new DelimiterBasedFrameDecoder(MAX_LINE_LENGTH, false, Delimiters.lineDelimiter()));
     }
     
-    public AbstractChannelPipelineFactory(int timeout, int maxConnections, int maxConnectsPerIp, ChannelGroup channels, ExecutionHandler eHandler) {
+    public AbstractChannelPipelineFactory(int timeout, int maxConnections, int maxConnectsPerIp, ChannelGroup channels, ExecutionHandler eHandler,
+            ChannelHandler frameHandler) {
         this.connectionLimitHandler = new ConnectionLimitUpstreamHandler(maxConnections);
         this.connectionPerIpLimitHandler = new ConnectionPerIpLimitUpstreamHandler(maxConnectsPerIp);
         this.groupHandler = new ChannelGroupHandler(channels);
         this.timeout = timeout;
         this.eHandler = eHandler;
+        this.frameHandler = frameHandler;
     }
     
     
-    
-    
     /**
      * @see org.jboss.netty.channel.ChannelPipelineFactory#getPipeline()
      */
@@ -74,7 +76,7 @@ public abstract class AbstractChannelPipelineFactory implements ChannelPipelineF
 
         
         // Add the text line decoder which limit the max line length, don't strip the delimiter and use CRLF as delimiter
-        pipeline.addLast(HandlerConstants.FRAMER, new DelimiterBasedFrameDecoder(MAX_LINE_LENGTH, false, Delimiters.lineDelimiter()));
+        pipeline.addLast(HandlerConstants.FRAMER, frameHandler);
        
         // Add the ChunkedWriteHandler to be able to write ChunkInput
         pipeline.addLast(HandlerConstants.CHUNK_HANDLER, new ChunkedWriteHandler());
@@ -90,8 +92,6 @@ public abstract class AbstractChannelPipelineFactory implements ChannelPipelineF
         return pipeline;
     }
 
-
-
     
     /**
      * Create the core {@link ChannelUpstreamHandler} to use

http://git-wip-us.apache.org/repos/asf/james-project/blob/b61399a6/protocols/netty/src/main/java/org/apache/james/protocols/netty/AbstractSSLAwareChannelPipelineFactory.java
----------------------------------------------------------------------
diff --git a/protocols/netty/src/main/java/org/apache/james/protocols/netty/AbstractSSLAwareChannelPipelineFactory.java b/protocols/netty/src/main/java/org/apache/james/protocols/netty/AbstractSSLAwareChannelPipelineFactory.java
index 1ec33a3..e78695c 100644
--- a/protocols/netty/src/main/java/org/apache/james/protocols/netty/AbstractSSLAwareChannelPipelineFactory.java
+++ b/protocols/netty/src/main/java/org/apache/james/protocols/netty/AbstractSSLAwareChannelPipelineFactory.java
@@ -21,6 +21,7 @@ package org.apache.james.protocols.netty;
 import javax.net.ssl.SSLContext;
 import javax.net.ssl.SSLEngine;
 
+import org.jboss.netty.channel.ChannelHandler;
 import org.jboss.netty.channel.ChannelPipeline;
 import org.jboss.netty.channel.group.ChannelGroup;
 import org.jboss.netty.handler.execution.ExecutionHandler;
@@ -37,13 +38,15 @@ public abstract class AbstractSSLAwareChannelPipelineFactory extends AbstractCha
     private String[] enabledCipherSuites = null;
 
     public AbstractSSLAwareChannelPipelineFactory(int timeout,
-            int maxConnections, int maxConnectsPerIp, ChannelGroup group, ExecutionHandler eHandler) {
-        super(timeout, maxConnections, maxConnectsPerIp, group, eHandler);
+            int maxConnections, int maxConnectsPerIp, ChannelGroup group, ExecutionHandler eHandler,
+            ChannelHandler frameHandler) {
+        super(timeout, maxConnections, maxConnectsPerIp, group, eHandler, frameHandler);
     }
 
     public AbstractSSLAwareChannelPipelineFactory(int timeout,
-            int maxConnections, int maxConnectsPerIp, ChannelGroup group, String[] enabledCipherSuites, ExecutionHandler eHandler) {
-        this(timeout, maxConnections, maxConnectsPerIp, group, eHandler);
+            int maxConnections, int maxConnectsPerIp, ChannelGroup group, String[] enabledCipherSuites, ExecutionHandler eHandler,
+            ChannelHandler frameHandler) {
+        this(timeout, maxConnections, maxConnectsPerIp, group, eHandler, frameHandler);
         
         // We need to copy the String array becuase of possible security issues.
         // See https://issues.apache.org/jira/browse/PROTOCOLS-18

http://git-wip-us.apache.org/repos/asf/james-project/blob/b61399a6/protocols/netty/src/main/java/org/apache/james/protocols/netty/BasicChannelUpstreamHandler.java
----------------------------------------------------------------------
diff --git a/protocols/netty/src/main/java/org/apache/james/protocols/netty/BasicChannelUpstreamHandler.java b/protocols/netty/src/main/java/org/apache/james/protocols/netty/BasicChannelUpstreamHandler.java
index c3450d6..1464b2b 100644
--- a/protocols/netty/src/main/java/org/apache/james/protocols/netty/BasicChannelUpstreamHandler.java
+++ b/protocols/netty/src/main/java/org/apache/james/protocols/netty/BasicChannelUpstreamHandler.java
@@ -23,19 +23,18 @@ import java.util.List;
 
 import javax.net.ssl.SSLEngine;
 
-import org.apache.james.protocols.api.ProtocolSessionImpl;
+import org.apache.james.protocols.api.Encryption;
 import org.apache.james.protocols.api.Protocol;
 import org.apache.james.protocols.api.ProtocolSession;
+import org.apache.james.protocols.api.ProtocolSessionImpl;
 import org.apache.james.protocols.api.ProtocolTransport;
 import org.apache.james.protocols.api.Response;
-import org.apache.james.protocols.api.Encryption;
 import org.apache.james.protocols.api.future.FutureResponse;
 import org.apache.james.protocols.api.handler.ConnectHandler;
 import org.apache.james.protocols.api.handler.DisconnectHandler;
 import org.apache.james.protocols.api.handler.LineHandler;
 import org.apache.james.protocols.api.handler.ProtocolHandlerChain;
 import org.apache.james.protocols.api.handler.ProtocolHandlerResultHandler;
-import org.apache.james.protocols.netty.NettyProtocolTransport;
 import org.jboss.netty.buffer.ChannelBuffer;
 import org.jboss.netty.channel.Channel;
 import org.jboss.netty.channel.ChannelHandler.Sharable;
@@ -139,7 +138,6 @@ public class BasicChannelUpstreamHandler extends SimpleChannelUpstreamHandler {
         if (lineHandlers.size() > 0) {
         
             ChannelBuffer buf = (ChannelBuffer) e.getMessage();      
-            
             LineHandler lHandler=  (LineHandler) lineHandlers.getLast();
             long start = System.currentTimeMillis();            
             Response response = lHandler.onLine(pSession,buf.toByteBuffer());

http://git-wip-us.apache.org/repos/asf/james-project/blob/b61399a6/protocols/netty/src/main/java/org/apache/james/protocols/netty/NettyServer.java
----------------------------------------------------------------------
diff --git a/protocols/netty/src/main/java/org/apache/james/protocols/netty/NettyServer.java b/protocols/netty/src/main/java/org/apache/james/protocols/netty/NettyServer.java
index 4817182..d2a9285 100644
--- a/protocols/netty/src/main/java/org/apache/james/protocols/netty/NettyServer.java
+++ b/protocols/netty/src/main/java/org/apache/james/protocols/netty/NettyServer.java
@@ -21,42 +21,81 @@ package org.apache.james.protocols.netty;
 
 import javax.net.ssl.SSLContext;
 
-import org.apache.james.protocols.api.Protocol;
 import org.apache.james.protocols.api.Encryption;
+import org.apache.james.protocols.api.Protocol;
 import org.apache.james.protocols.api.handler.ProtocolHandler;
+import org.jboss.netty.channel.ChannelHandler;
 import org.jboss.netty.channel.ChannelPipelineFactory;
 import org.jboss.netty.channel.ChannelUpstreamHandler;
 import org.jboss.netty.channel.group.ChannelGroup;
+import org.jboss.netty.handler.codec.frame.DelimiterBasedFrameDecoder;
+import org.jboss.netty.handler.codec.frame.Delimiters;
 import org.jboss.netty.handler.execution.ExecutionHandler;
 import org.jboss.netty.handler.execution.OrderedMemoryAwareThreadPoolExecutor;
 
+import com.google.common.base.Optional;
+import com.google.common.base.Preconditions;
+
 
 /**
  * Generic NettyServer 
  */
 public class NettyServer extends AbstractAsyncServer {
 
+    public static Builder builder() {
+        return new Builder();
+    }
+
+    public static class Builder {
+        private Protocol protocol;
+        private Optional<Encryption> secure;
+        private Optional<ChannelHandler> frameHandler;
+
+        private Builder() {
+            secure = Optional.absent();
+            frameHandler = Optional.absent();
+        }
+
+        public Builder protocol(Protocol protocol) {
+            Preconditions.checkNotNull(protocol, "'protocol' is mandatory");
+            this.protocol = protocol;
+            return this;
+        }
+
+        public Builder secure(Encryption secure) {
+            this.secure = Optional.fromNullable(secure);
+            return this;
+        }
+
+        public Builder frameHandler(ChannelHandler frameHandler) {
+            this.frameHandler = Optional.fromNullable(frameHandler);
+            return this;
+        }
+
+        public NettyServer build() {
+            Preconditions.checkState(protocol != null, "'protocol' is mandatory");
+            return new NettyServer(protocol, 
+                    secure.orNull(),
+                    frameHandler.or(new DelimiterBasedFrameDecoder(AbstractChannelPipelineFactory.MAX_LINE_LENGTH, false, Delimiters.lineDelimiter())));
+        }
+    }
+
     protected final Protocol protocol;
+    protected final Encryption secure;
+    private final ChannelHandler frameHandler;
     
     private ExecutionHandler eHandler;
     
     private ChannelUpstreamHandler coreHandler;
 
-    protected final Encryption secure;
-
     private int maxCurConnections;
 
     private int maxCurConnectionsPerIP;
    
-    public NettyServer(Protocol protocol) {
-        this(protocol, null);
-    }
-    
-    
-    public NettyServer(Protocol protocol, Encryption secure) {
-        super();
+    private NettyServer(Protocol protocol, Encryption secure, ChannelHandler frameHandler) {
         this.protocol = protocol;
         this.secure = secure;
+        this.frameHandler = frameHandler;
     }
     
     protected ExecutionHandler createExecutionHandler(int size) {
@@ -102,11 +141,14 @@ public class NettyServer extends AbstractAsyncServer {
         super.bind();
     }
 
+    private ChannelHandler getFrameHandler() {
+        return frameHandler;
+    }
 
     @Override
     protected ChannelPipelineFactory createPipelineFactory(ChannelGroup group) {
 
-        return new AbstractSSLAwareChannelPipelineFactory(getTimeout(), maxCurConnections, maxCurConnectionsPerIP, group, eHandler) {
+        return new AbstractSSLAwareChannelPipelineFactory(getTimeout(), maxCurConnections, maxCurConnectionsPerIP, group, eHandler, getFrameHandler()) {
 
             @Override
             protected ChannelUpstreamHandler createHandler() {

http://git-wip-us.apache.org/repos/asf/james-project/blob/b61399a6/protocols/netty/src/test/java/org/apache/james/protocols/netty/NettyServerTest.java
----------------------------------------------------------------------
diff --git a/protocols/netty/src/test/java/org/apache/james/protocols/netty/NettyServerTest.java b/protocols/netty/src/test/java/org/apache/james/protocols/netty/NettyServerTest.java
new file mode 100644
index 0000000..1d327db
--- /dev/null
+++ b/protocols/netty/src/test/java/org/apache/james/protocols/netty/NettyServerTest.java
@@ -0,0 +1,71 @@
+/****************************************************************
+ * Licensed to the Apache Software Foundation (ASF) under one   *
+ * or more contributor license agreements.  See the NOTICE file *
+ * distributed with this work for additional information        *
+ * regarding copyright ownership.  The ASF licenses this file   *
+ * to you under the Apache License, Version 2.0 (the            *
+ * "License"); you may not use this file except in compliance   *
+ * with the License.  You may obtain a copy of the License at   *
+ *                                                              *
+ *   http://www.apache.org/licenses/LICENSE-2.0                 *
+ *                                                              *
+ * Unless required by applicable law or agreed to in writing,   *
+ * software distributed under the License is distributed on an  *
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY       *
+ * KIND, either express or implied.  See the License for the    *
+ * specific language governing permissions and limitations      *
+ * under the License.                                           *
+ ****************************************************************/
+
+package org.apache.james.protocols.netty;
+
+import static org.mockito.Mockito.mock;
+
+import javax.net.ssl.SSLContext;
+
+import org.apache.james.protocols.api.Encryption;
+import org.apache.james.protocols.api.Protocol;
+import org.jboss.netty.channel.ChannelHandler;
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.rules.ExpectedException;
+
+public class NettyServerTest {
+
+    @Rule
+    public ExpectedException expectedException = ExpectedException.none();
+
+    @Test
+    public void protocolShouldThrowWhenProtocolIsNull() {
+        expectedException.expect(NullPointerException.class);
+        NettyServer.builder()
+            .protocol(null);
+    }
+
+    @Test
+    public void buildShouldThrowWhenProtocolIsNotGiven() {
+        expectedException.expect(IllegalStateException.class);
+        NettyServer.builder()
+            .build();
+    }
+
+    @Test
+    public void buildShouldWorkWhenProtocolIsGiven() {
+        Protocol protocol = mock(Protocol.class);
+        NettyServer.builder()
+            .protocol(protocol)
+            .build();
+    }
+
+    @Test
+    public void buildShouldWorkWhenEverythingIsGiven() throws Exception {
+        Protocol protocol = mock(Protocol.class);
+        Encryption encryption = Encryption.createStartTls(SSLContext.getDefault());
+        ChannelHandler channelHandler = mock(ChannelHandler.class);
+        NettyServer.builder()
+            .protocol(protocol)
+            .secure(encryption)
+            .frameHandler(channelHandler)
+            .build();
+    }
+}

http://git-wip-us.apache.org/repos/asf/james-project/blob/b61399a6/protocols/pop3/src/test/java/org/apache/james/protocols/pop3/netty/NettyPOP3SServerTest.java
----------------------------------------------------------------------
diff --git a/protocols/pop3/src/test/java/org/apache/james/protocols/pop3/netty/NettyPOP3SServerTest.java b/protocols/pop3/src/test/java/org/apache/james/protocols/pop3/netty/NettyPOP3SServerTest.java
index 4014038..c1ac359 100644
--- a/protocols/pop3/src/test/java/org/apache/james/protocols/pop3/netty/NettyPOP3SServerTest.java
+++ b/protocols/pop3/src/test/java/org/apache/james/protocols/pop3/netty/NettyPOP3SServerTest.java
@@ -30,7 +30,10 @@ public class NettyPOP3SServerTest extends AbstractPOP3SServerTest {
 
     @Override
     protected ProtocolServer createEncryptedServer(Protocol protocol, InetSocketAddress address, Encryption enc) {
-        NettyServer server = new NettyServer(protocol, enc);
+        NettyServer server = NettyServer.builder()
+                .protocol(protocol)
+                .secure(enc)
+                .build();
         server.setListenAddresses(address);
         return server;
     }

http://git-wip-us.apache.org/repos/asf/james-project/blob/b61399a6/protocols/pop3/src/test/java/org/apache/james/protocols/pop3/netty/NettyPOP3ServerTest.java
----------------------------------------------------------------------
diff --git a/protocols/pop3/src/test/java/org/apache/james/protocols/pop3/netty/NettyPOP3ServerTest.java b/protocols/pop3/src/test/java/org/apache/james/protocols/pop3/netty/NettyPOP3ServerTest.java
index 81e29be..8bf701d 100644
--- a/protocols/pop3/src/test/java/org/apache/james/protocols/pop3/netty/NettyPOP3ServerTest.java
+++ b/protocols/pop3/src/test/java/org/apache/james/protocols/pop3/netty/NettyPOP3ServerTest.java
@@ -29,7 +29,9 @@ public class NettyPOP3ServerTest extends AbstractPOP3ServerTest{
 
     @Override
     protected ProtocolServer createServer(Protocol protocol, InetSocketAddress address) {
-        NettyServer server =  new NettyServer(protocol);
+        NettyServer server =  NettyServer.builder()
+                .protocol(protocol)
+                .build();
         server.setListenAddresses(address);
         return server;
     }

http://git-wip-us.apache.org/repos/asf/james-project/blob/b61399a6/protocols/pop3/src/test/java/org/apache/james/protocols/pop3/netty/NettyStartTlsPOP3ServerTest.java
----------------------------------------------------------------------
diff --git a/protocols/pop3/src/test/java/org/apache/james/protocols/pop3/netty/NettyStartTlsPOP3ServerTest.java b/protocols/pop3/src/test/java/org/apache/james/protocols/pop3/netty/NettyStartTlsPOP3ServerTest.java
index 20b4718..5071353 100644
--- a/protocols/pop3/src/test/java/org/apache/james/protocols/pop3/netty/NettyStartTlsPOP3ServerTest.java
+++ b/protocols/pop3/src/test/java/org/apache/james/protocols/pop3/netty/NettyStartTlsPOP3ServerTest.java
@@ -30,7 +30,10 @@ public class NettyStartTlsPOP3ServerTest extends AbstractStartTlsPOP3ServerTest{
 
     @Override
     protected ProtocolServer createServer(Protocol protocol, InetSocketAddress address, Encryption enc) {
-        NettyServer server = new NettyServer(protocol, enc);
+        NettyServer server = NettyServer.builder()
+                .protocol(protocol)
+                .secure(enc)
+                .build();
         server.setListenAddresses(address);
         
         return server;

http://git-wip-us.apache.org/repos/asf/james-project/blob/b61399a6/protocols/smtp/src/test/java/org/apache/james/protocols/smtp/netty/NettySMTPSServerTest.java
----------------------------------------------------------------------
diff --git a/protocols/smtp/src/test/java/org/apache/james/protocols/smtp/netty/NettySMTPSServerTest.java b/protocols/smtp/src/test/java/org/apache/james/protocols/smtp/netty/NettySMTPSServerTest.java
index b6fa768..cdb3d2e 100644
--- a/protocols/smtp/src/test/java/org/apache/james/protocols/smtp/netty/NettySMTPSServerTest.java
+++ b/protocols/smtp/src/test/java/org/apache/james/protocols/smtp/netty/NettySMTPSServerTest.java
@@ -35,7 +35,10 @@ public class NettySMTPSServerTest extends AbstractSMTPSServerTest{
 
     @Override
     protected ProtocolServer createEncryptedServer(Protocol protocol, InetSocketAddress address, Encryption enc) {
-        NettyServer server = new NettyServer(protocol, enc);
+        NettyServer server = NettyServer.builder()
+                .protocol(protocol)
+                .secure(enc)
+                .build();
         server.setListenAddresses(address);
         return server;
     }

http://git-wip-us.apache.org/repos/asf/james-project/blob/b61399a6/protocols/smtp/src/test/java/org/apache/james/protocols/smtp/netty/NettySMTPServerTest.java
----------------------------------------------------------------------
diff --git a/protocols/smtp/src/test/java/org/apache/james/protocols/smtp/netty/NettySMTPServerTest.java b/protocols/smtp/src/test/java/org/apache/james/protocols/smtp/netty/NettySMTPServerTest.java
index af691b0..d796506 100644
--- a/protocols/smtp/src/test/java/org/apache/james/protocols/smtp/netty/NettySMTPServerTest.java
+++ b/protocols/smtp/src/test/java/org/apache/james/protocols/smtp/netty/NettySMTPServerTest.java
@@ -35,7 +35,9 @@ public class NettySMTPServerTest extends AbstractSMTPServerTest{
     
     @Override
     protected ProtocolServer createServer(Protocol protocol, InetSocketAddress address) {
-        NettyServer server =  new NettyServer(protocol);
+        NettyServer server = NettyServer.builder()
+                .protocol(protocol)
+                .build();
         server.setListenAddresses(address);
         return server;
     }

http://git-wip-us.apache.org/repos/asf/james-project/blob/b61399a6/protocols/smtp/src/test/java/org/apache/james/protocols/smtp/netty/NettyStartTlsSMTPServerTest.java
----------------------------------------------------------------------
diff --git a/protocols/smtp/src/test/java/org/apache/james/protocols/smtp/netty/NettyStartTlsSMTPServerTest.java b/protocols/smtp/src/test/java/org/apache/james/protocols/smtp/netty/NettyStartTlsSMTPServerTest.java
index 5a8058c..e8c16af 100644
--- a/protocols/smtp/src/test/java/org/apache/james/protocols/smtp/netty/NettyStartTlsSMTPServerTest.java
+++ b/protocols/smtp/src/test/java/org/apache/james/protocols/smtp/netty/NettyStartTlsSMTPServerTest.java
@@ -42,11 +42,15 @@ import org.apache.james.protocols.api.utils.BogusSslContextFactory;
 import org.apache.james.protocols.api.utils.BogusTrustManagerFactory;
 import org.apache.james.protocols.api.utils.MockLogger;
 import org.apache.james.protocols.api.utils.TestUtils;
+import org.apache.james.protocols.netty.AbstractChannelPipelineFactory;
 import org.apache.james.protocols.netty.NettyServer;
 import org.apache.james.protocols.smtp.SMTPConfigurationImpl;
 import org.apache.james.protocols.smtp.SMTPProtocol;
 import org.apache.james.protocols.smtp.SMTPProtocolHandlerChain;
 import org.apache.james.protocols.smtp.utils.TestMessageHook;
+import org.assertj.core.api.AssertDelegateTarget;
+import org.jboss.netty.handler.codec.frame.DelimiterBasedFrameDecoder;
+import org.jboss.netty.handler.codec.frame.Delimiters;
 import org.junit.After;
 import org.junit.Test;
 
@@ -65,7 +69,11 @@ public class NettyStartTlsSMTPServerTest {
     }
 
     private ProtocolServer createServer(Protocol protocol, InetSocketAddress address, Encryption enc) {
-        NettyServer server = new NettyServer(protocol, enc);
+        NettyServer server = NettyServer.builder()
+                .protocol(protocol)
+                .secure(enc)
+                .frameHandler(new DelimiterBasedFrameDecoder(AbstractChannelPipelineFactory.MAX_LINE_LENGTH, false, Delimiters.lineDelimiter()))
+                .build();
         server.setListenAddresses(address);
         return server;
     }
@@ -125,19 +133,29 @@ public class NettyStartTlsSMTPServerTest {
         client.connect(address.getAddress().getHostAddress(), address.getPort());
         client.sendCommand("EHLO localhost");
 
-        assertThat(isStartTLSAnnounced(client)).isTrue();
+        assertThat(new StartTLSAssert(client)).isStartTLSAnnounced();
 
         client.quit();
         client.disconnect();
     }
 
-    private boolean isStartTLSAnnounced(SMTPSClient client) {
-        for (String reply: client.getReplyStrings()) {
-            if (reply.toUpperCase(Locale.UK).endsWith("STARTTLS")) {
-                return true;
+    private static class StartTLSAssert implements AssertDelegateTarget {
+
+        private final SMTPSClient client;
+
+        public StartTLSAssert(SMTPSClient client) {
+            this.client = client;
+            
+        }
+
+        public boolean isStartTLSAnnounced() {
+            for (String reply: client.getReplyStrings()) {
+                if (reply.toUpperCase(Locale.UK).endsWith("STARTTLS")) {
+                    return true;
+                }
             }
+            return false;
         }
-        return false;
     }
 
     @Test

http://git-wip-us.apache.org/repos/asf/james-project/blob/b61399a6/server/protocols/protocols-imap4/src/main/java/org/apache/james/imapserver/netty/IMAPServer.java
----------------------------------------------------------------------
diff --git a/server/protocols/protocols-imap4/src/main/java/org/apache/james/imapserver/netty/IMAPServer.java b/server/protocols/protocols-imap4/src/main/java/org/apache/james/imapserver/netty/IMAPServer.java
index 0d592c4..371c50a 100644
--- a/server/protocols/protocols-imap4/src/main/java/org/apache/james/imapserver/netty/IMAPServer.java
+++ b/server/protocols/protocols-imap4/src/main/java/org/apache/james/imapserver/netty/IMAPServer.java
@@ -35,6 +35,7 @@ import org.apache.james.protocols.lib.netty.AbstractConfigurableAsyncServer;
 import org.apache.james.protocols.netty.ChannelGroupHandler;
 import org.apache.james.protocols.netty.ConnectionLimitUpstreamHandler;
 import org.apache.james.protocols.netty.ConnectionPerIpLimitUpstreamHandler;
+import org.jboss.netty.channel.ChannelHandler;
 import org.jboss.netty.channel.ChannelPipeline;
 import org.jboss.netty.channel.ChannelPipelineFactory;
 import org.jboss.netty.channel.ChannelUpstreamHandler;
@@ -139,7 +140,7 @@ public class IMAPServer extends AbstractConfigurableAsyncServer implements ImapC
                 // Add the text line decoder which limit the max line length,
                 // don't strip the delimiter and use CRLF as delimiter
                 // Use a SwitchableDelimiterBasedFrameDecoder, see JAMES-1436
-                pipeline.addLast(FRAMER, new SwitchableDelimiterBasedFrameDecoder(maxLineLength, false, Delimiters.lineDelimiter()));
+                pipeline.addLast(FRAMER, createFrameHandler());
                
                 Encryption secure = getEncryption();
                 if (secure != null && !secure.isStartTLS()) {
@@ -192,4 +193,9 @@ public class IMAPServer extends AbstractConfigurableAsyncServer implements ImapC
         return null;
     }
 
+    @Override
+    protected ChannelHandler createFrameHandler() {
+        return new SwitchableDelimiterBasedFrameDecoder(maxLineLength, false, Delimiters.lineDelimiter());
+    }
+
 }

http://git-wip-us.apache.org/repos/asf/james-project/blob/b61399a6/server/protocols/protocols-library/src/main/java/org/apache/james/protocols/lib/netty/AbstractConfigurableAsyncServer.java
----------------------------------------------------------------------
diff --git a/server/protocols/protocols-library/src/main/java/org/apache/james/protocols/lib/netty/AbstractConfigurableAsyncServer.java b/server/protocols/protocols-library/src/main/java/org/apache/james/protocols/lib/netty/AbstractConfigurableAsyncServer.java
index 4575172..3fbf7e5 100644
--- a/server/protocols/protocols-library/src/main/java/org/apache/james/protocols/lib/netty/AbstractConfigurableAsyncServer.java
+++ b/server/protocols/protocols-library/src/main/java/org/apache/james/protocols/lib/netty/AbstractConfigurableAsyncServer.java
@@ -47,6 +47,7 @@ import org.apache.james.protocols.lib.jmx.ServerMBean;
 import org.apache.james.protocols.netty.AbstractAsyncServer;
 import org.apache.james.util.concurrent.JMXEnabledThreadPoolExecutor;
 import org.jboss.netty.bootstrap.ServerBootstrap;
+import org.jboss.netty.channel.ChannelHandler;
 import org.jboss.netty.channel.ChannelPipelineFactory;
 import org.jboss.netty.channel.ChannelUpstreamHandler;
 import org.jboss.netty.channel.group.ChannelGroup;
@@ -110,11 +111,13 @@ public abstract class AbstractConfigurableAsyncServer extends AbstractAsyncServe
     private final ConnectionCountHandler countHandler = new ConnectionCountHandler();
 
     private ExecutionHandler executionHandler = null;
+    private ChannelHandler frameHandler;
 
     private int maxExecutorThreads;
 
     private MBeanServer mbeanServer;
 
+
     @Inject
     public final void setFileSystem(FileSystem filesystem) {
         this.fileSystem = filesystem;
@@ -268,6 +271,7 @@ public abstract class AbstractConfigurableAsyncServer extends AbstractAsyncServe
             buildSSLContext();
             preInit();
             executionHandler = createExecutionHander();
+            frameHandler = createFrameHandler();
             bind();
 
             mbeanServer = ManagementFactory.getPlatformMBeanServer();
@@ -564,6 +568,8 @@ public abstract class AbstractConfigurableAsyncServer extends AbstractAsyncServe
         return new ExecutionHandler(new JMXEnabledOrderedMemoryAwareThreadPoolExecutor(maxExecutorThreads, 0, 0, getThreadPoolJMXPath(), getDefaultJMXName() + "-executor"));
     }
 
+    protected abstract ChannelHandler createFrameHandler();
+
     /**
      * Return the {@link ExecutionHandler} or null if non should be used. Be sure you call {@link #createExecutionHander()} before
      * 
@@ -573,11 +579,15 @@ public abstract class AbstractConfigurableAsyncServer extends AbstractAsyncServe
         return executionHandler;
     }
     
+    protected ChannelHandler getFrameHandler() {
+        return frameHandler;
+    }
+
     protected abstract ChannelUpstreamHandler createCoreHandler();
     
     @Override
     protected ChannelPipelineFactory createPipelineFactory(ChannelGroup group) {
-        return new AbstractExecutorAwareChannelPipelineFactory(getTimeout(), connectionLimit, connPerIP, group, enabledCipherSuites, getExecutionHandler()) {
+        return new AbstractExecutorAwareChannelPipelineFactory(getTimeout(), connectionLimit, connPerIP, group, enabledCipherSuites, getExecutionHandler(), getFrameHandler()) {
             @Override
             protected SSLContext getSSLContext() {
                 if (encryption == null) {

http://git-wip-us.apache.org/repos/asf/james-project/blob/b61399a6/server/protocols/protocols-library/src/main/java/org/apache/james/protocols/lib/netty/AbstractExecutorAwareChannelPipelineFactory.java
----------------------------------------------------------------------
diff --git a/server/protocols/protocols-library/src/main/java/org/apache/james/protocols/lib/netty/AbstractExecutorAwareChannelPipelineFactory.java b/server/protocols/protocols-library/src/main/java/org/apache/james/protocols/lib/netty/AbstractExecutorAwareChannelPipelineFactory.java
index 1a88d9e..6b71a51 100644
--- a/server/protocols/protocols-library/src/main/java/org/apache/james/protocols/lib/netty/AbstractExecutorAwareChannelPipelineFactory.java
+++ b/server/protocols/protocols-library/src/main/java/org/apache/james/protocols/lib/netty/AbstractExecutorAwareChannelPipelineFactory.java
@@ -20,6 +20,7 @@ package org.apache.james.protocols.lib.netty;
 
 import org.apache.james.protocols.netty.AbstractSSLAwareChannelPipelineFactory;
 import org.apache.james.protocols.netty.HandlerConstants;
+import org.jboss.netty.channel.ChannelHandler;
 import org.jboss.netty.channel.ChannelPipeline;
 import org.jboss.netty.channel.group.ChannelGroup;
 import org.jboss.netty.handler.execution.ExecutionHandler;
@@ -31,12 +32,12 @@ import org.jboss.netty.handler.execution.ExecutionHandler;
  */
 public abstract class AbstractExecutorAwareChannelPipelineFactory extends AbstractSSLAwareChannelPipelineFactory{
 
-    public AbstractExecutorAwareChannelPipelineFactory(int timeout, int maxConnections, int maxConnectsPerIp, ChannelGroup group, ExecutionHandler eHandler) {
-        super(timeout, maxConnections, maxConnectsPerIp, group, eHandler);
+    public AbstractExecutorAwareChannelPipelineFactory(int timeout, int maxConnections, int maxConnectsPerIp, ChannelGroup group, ExecutionHandler eHandler, ChannelHandler frameHandler) {
+        super(timeout, maxConnections, maxConnectsPerIp, group, eHandler, frameHandler);
     }
 
-    public AbstractExecutorAwareChannelPipelineFactory(int timeout, int maxConnections, int maxConnectsPerIp, ChannelGroup group, String[] enabledCipherSuites, ExecutionHandler eHandler) {
-        super(timeout, maxConnections, maxConnectsPerIp, group, enabledCipherSuites, eHandler);
+    public AbstractExecutorAwareChannelPipelineFactory(int timeout, int maxConnections, int maxConnectsPerIp, ChannelGroup group, String[] enabledCipherSuites, ExecutionHandler eHandler, ChannelHandler frameHandler) {
+        super(timeout, maxConnections, maxConnectsPerIp, group, enabledCipherSuites, eHandler, frameHandler);
     }
     
     @Override

http://git-wip-us.apache.org/repos/asf/james-project/blob/b61399a6/server/protocols/protocols-lmtp/src/main/java/org/apache/james/lmtpserver/netty/LMTPServer.java
----------------------------------------------------------------------
diff --git a/server/protocols/protocols-lmtp/src/main/java/org/apache/james/lmtpserver/netty/LMTPServer.java b/server/protocols/protocols-lmtp/src/main/java/org/apache/james/lmtpserver/netty/LMTPServer.java
index 860a05f..f6c4fee 100644
--- a/server/protocols/protocols-lmtp/src/main/java/org/apache/james/lmtpserver/netty/LMTPServer.java
+++ b/server/protocols/protocols-lmtp/src/main/java/org/apache/james/lmtpserver/netty/LMTPServer.java
@@ -27,9 +27,13 @@ import org.apache.james.protocols.api.logger.ProtocolLoggerAdapter;
 import org.apache.james.protocols.lib.handler.HandlersPackage;
 import org.apache.james.protocols.lib.netty.AbstractProtocolAsyncServer;
 import org.apache.james.protocols.lmtp.LMTPConfiguration;
+import org.apache.james.protocols.netty.AbstractChannelPipelineFactory;
 import org.apache.james.protocols.smtp.SMTPProtocol;
 import org.apache.james.smtpserver.netty.SMTPChannelUpstreamHandler;
+import org.jboss.netty.channel.ChannelHandler;
 import org.jboss.netty.channel.ChannelUpstreamHandler;
+import org.jboss.netty.handler.codec.frame.DelimiterBasedFrameDecoder;
+import org.jboss.netty.handler.codec.frame.Delimiters;
 
 public class LMTPServer extends AbstractProtocolAsyncServer implements LMTPServerMBean {
 
@@ -155,4 +159,9 @@ public class LMTPServer extends AbstractProtocolAsyncServer implements LMTPServe
         return JMXHandlersLoader.class;
     }
 
+    @Override
+    protected ChannelHandler createFrameHandler() {
+        return new DelimiterBasedFrameDecoder(AbstractChannelPipelineFactory.MAX_LINE_LENGTH, false, Delimiters.lineDelimiter());
+    }
+
 }

http://git-wip-us.apache.org/repos/asf/james-project/blob/b61399a6/server/protocols/protocols-managesieve/src/main/java/org/apache/james/managesieveserver/netty/ManageSieveServer.java
----------------------------------------------------------------------
diff --git a/server/protocols/protocols-managesieve/src/main/java/org/apache/james/managesieveserver/netty/ManageSieveServer.java b/server/protocols/protocols-managesieve/src/main/java/org/apache/james/managesieveserver/netty/ManageSieveServer.java
index 2308714..82c8ed3 100644
--- a/server/protocols/protocols-managesieve/src/main/java/org/apache/james/managesieveserver/netty/ManageSieveServer.java
+++ b/server/protocols/protocols-managesieve/src/main/java/org/apache/james/managesieveserver/netty/ManageSieveServer.java
@@ -19,12 +19,17 @@
 
 package org.apache.james.managesieveserver.netty;
 
+import static org.jboss.netty.channel.Channels.pipeline;
+
+import javax.net.ssl.SSLEngine;
+
 import org.apache.james.managesieve.transcode.ManageSieveProcessor;
 import org.apache.james.protocols.api.Encryption;
 import org.apache.james.protocols.lib.netty.AbstractConfigurableAsyncServer;
 import org.apache.james.protocols.netty.ChannelGroupHandler;
 import org.apache.james.protocols.netty.ConnectionLimitUpstreamHandler;
 import org.apache.james.protocols.netty.ConnectionPerIpLimitUpstreamHandler;
+import org.jboss.netty.channel.ChannelHandler;
 import org.jboss.netty.channel.ChannelPipeline;
 import org.jboss.netty.channel.ChannelPipelineFactory;
 import org.jboss.netty.channel.ChannelUpstreamHandler;
@@ -40,10 +45,6 @@ import org.jboss.netty.util.CharsetUtil;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import javax.net.ssl.SSLEngine;
-
-import static org.jboss.netty.channel.Channels.pipeline;
-
 public class ManageSieveServer extends AbstractConfigurableAsyncServer implements ManageSieveServerMBean {
 
     private static final Logger LOGGER = LoggerFactory.getLogger(ManageSieveServer.class);
@@ -114,7 +115,7 @@ public class ManageSieveServer extends AbstractConfigurableAsyncServer implement
                 // Add the text line decoder which limit the max line length,
                 // don't strip the delimiter and use CRLF as delimiter
                 // Use a SwitchableDelimiterBasedFrameDecoder, see JAMES-1436
-                pipeline.addLast(FRAMER, new DelimiterBasedFrameDecoder(maxLineLength, false, Delimiters.lineDelimiter()));
+                pipeline.addLast(FRAMER, createFrameHandler());
                 pipeline.addLast(CONNECTION_COUNT_HANDLER, getConnectionCountHandler());
                 pipeline.addLast(CHUNK_WRITE_HANDLER, new ChunkedWriteHandler());
 
@@ -136,4 +137,9 @@ public class ManageSieveServer extends AbstractConfigurableAsyncServer implement
     public String getServiceType() {
         return "Manage Sieve Service";
     }
+
+    @Override
+    protected ChannelHandler createFrameHandler() {
+        return new DelimiterBasedFrameDecoder(maxLineLength, false, Delimiters.lineDelimiter());
+    }
 }

http://git-wip-us.apache.org/repos/asf/james-project/blob/b61399a6/server/protocols/protocols-pop3/src/main/java/org/apache/james/pop3server/netty/POP3Server.java
----------------------------------------------------------------------
diff --git a/server/protocols/protocols-pop3/src/main/java/org/apache/james/pop3server/netty/POP3Server.java b/server/protocols/protocols-pop3/src/main/java/org/apache/james/pop3server/netty/POP3Server.java
index 62ae9fa..5b14d46 100644
--- a/server/protocols/protocols-pop3/src/main/java/org/apache/james/pop3server/netty/POP3Server.java
+++ b/server/protocols/protocols-pop3/src/main/java/org/apache/james/pop3server/netty/POP3Server.java
@@ -24,9 +24,13 @@ import org.apache.james.protocols.api.ProtocolConfiguration;
 import org.apache.james.protocols.api.logger.ProtocolLoggerAdapter;
 import org.apache.james.protocols.lib.handler.HandlersPackage;
 import org.apache.james.protocols.lib.netty.AbstractProtocolAsyncServer;
+import org.apache.james.protocols.netty.AbstractChannelPipelineFactory;
 import org.apache.james.protocols.netty.BasicChannelUpstreamHandler;
 import org.apache.james.protocols.pop3.POP3Protocol;
+import org.jboss.netty.channel.ChannelHandler;
 import org.jboss.netty.channel.ChannelUpstreamHandler;
+import org.jboss.netty.handler.codec.frame.DelimiterBasedFrameDecoder;
+import org.jboss.netty.handler.codec.frame.Delimiters;
 
 /**
  * NIO POP3 Server which use Netty
@@ -100,4 +104,9 @@ public class POP3Server extends AbstractProtocolAsyncServer implements POP3Serve
         return JMXHandlersLoader.class;
     }
 
+    @Override
+    protected ChannelHandler createFrameHandler() {
+        return new DelimiterBasedFrameDecoder(AbstractChannelPipelineFactory.MAX_LINE_LENGTH, false, Delimiters.lineDelimiter());
+    }
+
 }

http://git-wip-us.apache.org/repos/asf/james-project/blob/b61399a6/server/protocols/protocols-smtp/src/main/java/org/apache/james/smtpserver/netty/SMTPServer.java
----------------------------------------------------------------------
diff --git a/server/protocols/protocols-smtp/src/main/java/org/apache/james/smtpserver/netty/SMTPServer.java b/server/protocols/protocols-smtp/src/main/java/org/apache/james/smtpserver/netty/SMTPServer.java
index bacc31a..c7d291c 100644
--- a/server/protocols/protocols-smtp/src/main/java/org/apache/james/smtpserver/netty/SMTPServer.java
+++ b/server/protocols/protocols-smtp/src/main/java/org/apache/james/smtpserver/netty/SMTPServer.java
@@ -29,12 +29,16 @@ import org.apache.james.protocols.api.ProtocolTransport;
 import org.apache.james.protocols.api.logger.ProtocolLoggerAdapter;
 import org.apache.james.protocols.lib.handler.HandlersPackage;
 import org.apache.james.protocols.lib.netty.AbstractProtocolAsyncServer;
+import org.apache.james.protocols.netty.AbstractChannelPipelineFactory;
 import org.apache.james.protocols.smtp.SMTPConfiguration;
 import org.apache.james.protocols.smtp.SMTPProtocol;
 import org.apache.james.smtpserver.CoreCmdHandlerLoader;
 import org.apache.james.smtpserver.ExtendedSMTPSession;
 import org.apache.james.smtpserver.jmx.JMXHandlersLoader;
+import org.jboss.netty.channel.ChannelHandler;
 import org.jboss.netty.channel.ChannelUpstreamHandler;
+import org.jboss.netty.handler.codec.frame.DelimiterBasedFrameDecoder;
+import org.jboss.netty.handler.codec.frame.Delimiters;
 
 /**
  * NIO SMTPServer which use Netty
@@ -359,4 +363,9 @@ public class SMTPServer extends AbstractProtocolAsyncServer implements SMTPServe
         return JMXHandlersLoader.class;
     }
 
+    @Override
+    protected ChannelHandler createFrameHandler() {
+        return new DelimiterBasedFrameDecoder(AbstractChannelPipelineFactory.MAX_LINE_LENGTH, false, Delimiters.lineDelimiter());
+    }
+
 }


---------------------------------------------------------------------
To unsubscribe, e-mail: server-dev-unsubscribe@james.apache.org
For additional commands, e-mail: server-dev-help@james.apache.org


[11/12] james-project git commit: JAMES-1862 Upgrade testcontainers

Posted by ad...@apache.org.
JAMES-1862 Upgrade testcontainers


Project: http://git-wip-us.apache.org/repos/asf/james-project/repo
Commit: http://git-wip-us.apache.org/repos/asf/james-project/commit/cc01139f
Tree: http://git-wip-us.apache.org/repos/asf/james-project/tree/cc01139f
Diff: http://git-wip-us.apache.org/repos/asf/james-project/diff/cc01139f

Branch: refs/heads/master
Commit: cc01139ff9b74f83c5cd331339adf2cd9e96f183
Parents: b4f1ed6
Author: Antoine Duprat <ad...@apache.org>
Authored: Thu Dec 1 12:15:20 2016 +0100
Committer: Antoine Duprat <ad...@linagora.com>
Committed: Tue Dec 6 11:31:26 2016 +0100

----------------------------------------------------------------------
 .../src/main/java/org/apache/james/mpt/smtp/ForwardSmtpTest.java  | 3 ++-
 mpt/pom.xml                                                       | 2 +-
 2 files changed, 3 insertions(+), 2 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/james-project/blob/cc01139f/mpt/impl/smtp/core/src/main/java/org/apache/james/mpt/smtp/ForwardSmtpTest.java
----------------------------------------------------------------------
diff --git a/mpt/impl/smtp/core/src/main/java/org/apache/james/mpt/smtp/ForwardSmtpTest.java b/mpt/impl/smtp/core/src/main/java/org/apache/james/mpt/smtp/ForwardSmtpTest.java
index 46214b2..e27c9e0 100644
--- a/mpt/impl/smtp/core/src/main/java/org/apache/james/mpt/smtp/ForwardSmtpTest.java
+++ b/mpt/impl/smtp/core/src/main/java/org/apache/james/mpt/smtp/ForwardSmtpTest.java
@@ -52,7 +52,7 @@ public class ForwardSmtpTest extends AbstractSimpleScriptedTestProtocol {
     public static final String PASSWORD = "secret";
 
     private final TemporaryFolder folder = new TemporaryFolder();
-    private final GenericContainer fakeSmtp = new SwarmGenericContainer("weave/rest-smtp-sink:latest")
+    private final GenericContainer<?> fakeSmtp = new SwarmGenericContainer("weave/rest-smtp-sink:latest")
             .withAffinityToContainer();
     
     @Rule
@@ -66,6 +66,7 @@ public class ForwardSmtpTest extends AbstractSimpleScriptedTestProtocol {
     }
 
     @Before
+    @SuppressWarnings("deprecation")
     public void setUp() throws Exception {
         super.setUp();
         InetAddress containerIp = InetAddresses.forString(fakeSmtp.getContainerInfo().getNetworkSettings().getIpAddress());

http://git-wip-us.apache.org/repos/asf/james-project/blob/cc01139f/mpt/pom.xml
----------------------------------------------------------------------
diff --git a/mpt/pom.xml b/mpt/pom.xml
index 99375bb..a8feadb 100644
--- a/mpt/pom.xml
+++ b/mpt/pom.xml
@@ -472,7 +472,7 @@
             <dependency>
                 <groupId>org.testcontainers</groupId>
                 <artifactId>testcontainers</artifactId>
-                <version>1.0.2</version>
+                <version>1.1.7</version>
             </dependency>
         </dependencies>
     </dependencyManagement>


---------------------------------------------------------------------
To unsubscribe, e-mail: server-dev-unsubscribe@james.apache.org
For additional commands, e-mail: server-dev-help@james.apache.org


[05/12] james-project git commit: JAMES-1862 Remove abstract level in StartTls tests

Posted by ad...@apache.org.
JAMES-1862 Remove abstract level in StartTls tests


Project: http://git-wip-us.apache.org/repos/asf/james-project/repo
Commit: http://git-wip-us.apache.org/repos/asf/james-project/commit/5ca0f7b0
Tree: http://git-wip-us.apache.org/repos/asf/james-project/tree/5ca0f7b0
Diff: http://git-wip-us.apache.org/repos/asf/james-project/diff/5ca0f7b0

Branch: refs/heads/master
Commit: 5ca0f7b0366b49a5c7b32d25d8ccb8525bb9582c
Parents: 8633537
Author: Antoine Duprat <ad...@apache.org>
Authored: Wed Nov 30 10:27:35 2016 +0100
Committer: Antoine Duprat <ad...@apache.org>
Committed: Thu Dec 1 14:17:03 2016 +0100

----------------------------------------------------------------------
 .../smtp/AbstractStartTlsSMTPServerTest.java    | 165 ---------------
 .../smtp/netty/NettyStartTlsSMTPServerTest.java | 211 +++++++++++++++----
 2 files changed, 172 insertions(+), 204 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/james-project/blob/5ca0f7b0/protocols/smtp/src/test/java/org/apache/james/protocols/smtp/AbstractStartTlsSMTPServerTest.java
----------------------------------------------------------------------
diff --git a/protocols/smtp/src/test/java/org/apache/james/protocols/smtp/AbstractStartTlsSMTPServerTest.java b/protocols/smtp/src/test/java/org/apache/james/protocols/smtp/AbstractStartTlsSMTPServerTest.java
deleted file mode 100644
index 02f87ec..0000000
--- a/protocols/smtp/src/test/java/org/apache/james/protocols/smtp/AbstractStartTlsSMTPServerTest.java
+++ /dev/null
@@ -1,165 +0,0 @@
-/****************************************************************
- * Licensed to the Apache Software Foundation (ASF) under one   *
- * or more contributor license agreements.  See the NOTICE file *
- * distributed with this work for additional information        *
- * regarding copyright ownership.  The ASF licenses this file   *
- * to you under the Apache License, Version 2.0 (the            *
- * "License"); you may not use this file except in compliance   *
- * with the License.  You may obtain a copy of the License at   *
- *                                                              *
- *   http://www.apache.org/licenses/LICENSE-2.0                 *
- *                                                              *
- * Unless required by applicable law or agreed to in writing,   *
- * software distributed under the License is distributed on an  *
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY       *
- * KIND, either express or implied.  See the License for the    *
- * specific language governing permissions and limitations      *
- * under the License.                                           *
- ****************************************************************/
-package org.apache.james.protocols.smtp;
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertTrue;
-
-import java.net.InetSocketAddress;
-import java.net.Socket;
-import java.util.Arrays;
-import java.util.Locale;
-import java.util.Properties;
-
-import javax.mail.Address;
-import javax.mail.Message;
-import javax.mail.Session;
-import javax.mail.internet.InternetAddress;
-import javax.mail.internet.MimeMessage;
-
-import org.apache.commons.net.smtp.SMTPReply;
-import org.apache.commons.net.smtp.SMTPSClient;
-import org.apache.james.protocols.api.Encryption;
-import org.apache.james.protocols.api.Protocol;
-import org.apache.james.protocols.api.ProtocolServer;
-import org.apache.james.protocols.api.handler.ProtocolHandler;
-import org.apache.james.protocols.api.handler.WiringException;
-import org.apache.james.protocols.api.utils.BogusSSLSocketFactory;
-import org.apache.james.protocols.api.utils.BogusSslContextFactory;
-import org.apache.james.protocols.api.utils.BogusTrustManagerFactory;
-import org.apache.james.protocols.api.utils.MockLogger;
-import org.apache.james.protocols.api.utils.TestUtils;
-import org.apache.james.protocols.smtp.utils.TestMessageHook;
-import org.junit.Test;
-
-import com.sun.mail.smtp.SMTPTransport;
-
-public abstract class AbstractStartTlsSMTPServerTest {
-    
-    protected SMTPSClient createClient() {
-        SMTPSClient client = new SMTPSClient(false, BogusSslContextFactory.getClientContext());
-        client.setTrustManager(BogusTrustManagerFactory.getTrustManagers()[0]);
-        return client;
-    }
-
-    protected abstract ProtocolServer createServer(Protocol protocol, InetSocketAddress address, Encryption enc);
-
-    
-    protected Protocol createProtocol(ProtocolHandler... handlers) throws WiringException {
-        SMTPProtocolHandlerChain chain = new SMTPProtocolHandlerChain();
-        chain.addAll(0, Arrays.asList(handlers));
-        chain.wireExtensibleHandlers();
-        return new SMTPProtocol(chain, new SMTPConfigurationImpl(), new MockLogger());
-    }
-
-
-    @Test
-    public void testStartTLS() throws Exception {
-        InetSocketAddress address = new InetSocketAddress("127.0.0.1", TestUtils.getFreePort());
-        
-        
-        ProtocolServer server = null;
-        try {
-            server = createServer(createProtocol(new ProtocolHandler[0]), address, Encryption.createStartTls(BogusSslContextFactory.getServerContext()));  
-            server.bind();
-            
-            SMTPSClient client = createClient();
-            client.connect(address.getAddress().getHostAddress(), address.getPort());
-            assertTrue(SMTPReply.isPositiveCompletion(client.getReplyCode()));
-            
-            client.sendCommand("EHLO localhost");
-            assertTrue(SMTPReply.isPositiveCompletion(client.getReplyCode()));
-            
-            boolean startTLSAnnounced = false;
-            for (String reply: client.getReplyStrings()) {
-                if (reply.toUpperCase(Locale.UK).endsWith("STARTTLS")) {
-                    startTLSAnnounced = true;
-                    break;
-                }
-            }
-            assertTrue(startTLSAnnounced);
-            
-            assertTrue(client.execTLS());
-            
-            client.quit();
-            assertTrue("Reply="+ client.getReplyString(), SMTPReply.isPositiveCompletion(client.getReplyCode()));
-            
-            client.disconnect();
-
-
-        } finally {
-            if (server != null) {
-                server.unbind();
-            }
-        }
-        
-    }
-    
-    @Test
-    public void testStartTLSWithJavamail() throws Exception {
-        InetSocketAddress address = new InetSocketAddress("127.0.0.1", TestUtils.getFreePort());
-        
-        
-        ProtocolServer server = null;
-        try {
-            TestMessageHook hook = new TestMessageHook();
-            server = createServer(createProtocol(hook) , address, Encryption.createStartTls(BogusSslContextFactory.getServerContext()));  
-            server.bind();
-            
-            
-            Properties mailProps = new Properties();
-            mailProps.put("mail.smtp.from", "test@localhost");
-            mailProps.put("mail.smtp.host", address.getHostName());
-            mailProps.put("mail.smtp.port", address.getPort());
-            mailProps.put("mail.smtp.socketFactory.class", BogusSSLSocketFactory.class.getName());
-            mailProps.put("mail.smtp.socketFactory.fallback", "false");
-            mailProps.put("mail.smtp.starttls.enable", "true");
-
-            Session mailSession = Session.getDefaultInstance(mailProps);
-
-            MimeMessage message = new MimeMessage(mailSession);
-            message.setFrom(new InternetAddress("test@localhost"));
-            String[] emails = { "valid@localhost" };
-            Address rcpts[] = new Address[emails.length];
-            for (int i = 0; i < emails.length; i++) {
-                rcpts[i] = new InternetAddress(emails[i].trim().toLowerCase());
-            }
-            message.setRecipients(Message.RecipientType.TO, rcpts);
-            message.setSubject("Testmail", "UTF-8");
-            message.setText("Test.....");
-
-            SMTPTransport transport = (SMTPTransport) mailSession.getTransport("smtps");
-            
-            transport.connect(new Socket(address.getHostName(), address.getPort()));
-            transport.sendMessage(message, rcpts);
-            
-           
-            assertEquals(1, hook.getQueued().size());
-            
-
-
-        } finally {
-            if (server != null) {
-                server.unbind();
-            }
-        }
-        
-    }
-    
-}

http://git-wip-us.apache.org/repos/asf/james-project/blob/5ca0f7b0/protocols/smtp/src/test/java/org/apache/james/protocols/smtp/netty/NettyStartTlsSMTPServerTest.java
----------------------------------------------------------------------
diff --git a/protocols/smtp/src/test/java/org/apache/james/protocols/smtp/netty/NettyStartTlsSMTPServerTest.java b/protocols/smtp/src/test/java/org/apache/james/protocols/smtp/netty/NettyStartTlsSMTPServerTest.java
index d643611..41f3b9c 100644
--- a/protocols/smtp/src/test/java/org/apache/james/protocols/smtp/netty/NettyStartTlsSMTPServerTest.java
+++ b/protocols/smtp/src/test/java/org/apache/james/protocols/smtp/netty/NettyStartTlsSMTPServerTest.java
@@ -1,39 +1,172 @@
-/****************************************************************
- * Licensed to the Apache Software Foundation (ASF) under one   *
- * or more contributor license agreements.  See the NOTICE file *
- * distributed with this work for additional information        *
- * regarding copyright ownership.  The ASF licenses this file   *
- * to you under the Apache License, Version 2.0 (the            *
- * "License"); you may not use this file except in compliance   *
- * with the License.  You may obtain a copy of the License at   *
- *                                                              *
- *   http://www.apache.org/licenses/LICENSE-2.0                 *
- *                                                              *
- * Unless required by applicable law or agreed to in writing,   *
- * software distributed under the License is distributed on an  *
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY       *
- * KIND, either express or implied.  See the License for the    *
- * specific language governing permissions and limitations      *
- * under the License.                                           *
- ****************************************************************/
-package org.apache.james.protocols.smtp.netty;
-
-import java.net.InetSocketAddress;
-
-import org.apache.james.protocols.api.Encryption;
-import org.apache.james.protocols.api.Protocol;
-import org.apache.james.protocols.api.ProtocolServer;
-import org.apache.james.protocols.netty.NettyServer;
-import org.apache.james.protocols.smtp.AbstractStartTlsSMTPServerTest;
-
-public class NettyStartTlsSMTPServerTest extends AbstractStartTlsSMTPServerTest{
-
-    @Override
-    protected ProtocolServer createServer(Protocol protocol, InetSocketAddress address, Encryption enc) {
-        NettyServer server = new NettyServer(protocol, enc);
-        server.setListenAddresses(address);
-        
-        return server;
-    }
-
-}
+/****************************************************************
+ * Licensed to the Apache Software Foundation (ASF) under one   *
+ * or more contributor license agreements.  See the NOTICE file *
+ * distributed with this work for additional information        *
+ * regarding copyright ownership.  The ASF licenses this file   *
+ * to you under the Apache License, Version 2.0 (the            *
+ * "License"); you may not use this file except in compliance   *
+ * with the License.  You may obtain a copy of the License at   *
+ *                                                              *
+ *   http://www.apache.org/licenses/LICENSE-2.0                 *
+ *                                                              *
+ * Unless required by applicable law or agreed to in writing,   *
+ * software distributed under the License is distributed on an  *
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY       *
+ * KIND, either express or implied.  See the License for the    *
+ * specific language governing permissions and limitations      *
+ * under the License.                                           *
+ ****************************************************************/
+package org.apache.james.protocols.smtp.netty;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
+
+import java.net.InetSocketAddress;
+import java.net.Socket;
+import java.util.Arrays;
+import java.util.Locale;
+import java.util.Properties;
+
+import javax.mail.Address;
+import javax.mail.Message;
+import javax.mail.Session;
+import javax.mail.internet.InternetAddress;
+import javax.mail.internet.MimeMessage;
+
+import org.apache.commons.net.smtp.SMTPReply;
+import org.apache.commons.net.smtp.SMTPSClient;
+import org.apache.james.protocols.api.Encryption;
+import org.apache.james.protocols.api.Protocol;
+import org.apache.james.protocols.api.ProtocolServer;
+import org.apache.james.protocols.api.handler.ProtocolHandler;
+import org.apache.james.protocols.api.handler.WiringException;
+import org.apache.james.protocols.api.utils.BogusSSLSocketFactory;
+import org.apache.james.protocols.api.utils.BogusSslContextFactory;
+import org.apache.james.protocols.api.utils.BogusTrustManagerFactory;
+import org.apache.james.protocols.api.utils.MockLogger;
+import org.apache.james.protocols.api.utils.TestUtils;
+import org.apache.james.protocols.netty.NettyServer;
+import org.apache.james.protocols.smtp.SMTPConfigurationImpl;
+import org.apache.james.protocols.smtp.SMTPProtocol;
+import org.apache.james.protocols.smtp.SMTPProtocolHandlerChain;
+import org.apache.james.protocols.smtp.utils.TestMessageHook;
+import org.junit.Test;
+
+import com.sun.mail.smtp.SMTPTransport;
+
+public class NettyStartTlsSMTPServerTest {
+
+    private ProtocolServer createServer(Protocol protocol, InetSocketAddress address, Encryption enc) {
+        NettyServer server = new NettyServer(protocol, enc);
+        server.setListenAddresses(address);
+        
+        return server;
+    }
+
+    private SMTPSClient createClient() {
+        SMTPSClient client = new SMTPSClient(false, BogusSslContextFactory.getClientContext());
+        client.setTrustManager(BogusTrustManagerFactory.getTrustManagers()[0]);
+        return client;
+    }
+
+    private Protocol createProtocol(ProtocolHandler... handlers) throws WiringException {
+        SMTPProtocolHandlerChain chain = new SMTPProtocolHandlerChain();
+        chain.addAll(0, Arrays.asList(handlers));
+        chain.wireExtensibleHandlers();
+        return new SMTPProtocol(chain, new SMTPConfigurationImpl(), new MockLogger());
+    }
+
+    @Test
+    public void testStartTLS() throws Exception {
+        InetSocketAddress address = new InetSocketAddress("127.0.0.1", TestUtils.getFreePort());
+        
+        
+        ProtocolServer server = null;
+        try {
+            server = createServer(createProtocol(new ProtocolHandler[0]), address, Encryption.createStartTls(BogusSslContextFactory.getServerContext()));  
+            server.bind();
+            
+            SMTPSClient client = createClient();
+            client.connect(address.getAddress().getHostAddress(), address.getPort());
+            assertTrue(SMTPReply.isPositiveCompletion(client.getReplyCode()));
+            
+            client.sendCommand("EHLO localhost");
+            assertTrue(SMTPReply.isPositiveCompletion(client.getReplyCode()));
+            
+            boolean startTLSAnnounced = false;
+            for (String reply: client.getReplyStrings()) {
+                if (reply.toUpperCase(Locale.UK).endsWith("STARTTLS")) {
+                    startTLSAnnounced = true;
+                    break;
+                }
+            }
+            assertTrue(startTLSAnnounced);
+            
+            assertTrue(client.execTLS());
+            
+            client.quit();
+            assertTrue("Reply="+ client.getReplyString(), SMTPReply.isPositiveCompletion(client.getReplyCode()));
+            
+            client.disconnect();
+
+
+        } finally {
+            if (server != null) {
+                server.unbind();
+            }
+        }
+        
+    }
+    
+    @Test
+    public void testStartTLSWithJavamail() throws Exception {
+        InetSocketAddress address = new InetSocketAddress("127.0.0.1", TestUtils.getFreePort());
+        
+        
+        ProtocolServer server = null;
+        try {
+            TestMessageHook hook = new TestMessageHook();
+            server = createServer(createProtocol(hook) , address, Encryption.createStartTls(BogusSslContextFactory.getServerContext()));  
+            server.bind();
+            
+            
+            Properties mailProps = new Properties();
+            mailProps.put("mail.smtp.from", "test@localhost");
+            mailProps.put("mail.smtp.host", address.getHostName());
+            mailProps.put("mail.smtp.port", address.getPort());
+            mailProps.put("mail.smtp.socketFactory.class", BogusSSLSocketFactory.class.getName());
+            mailProps.put("mail.smtp.socketFactory.fallback", "false");
+            mailProps.put("mail.smtp.starttls.enable", "true");
+
+            Session mailSession = Session.getDefaultInstance(mailProps);
+
+            MimeMessage message = new MimeMessage(mailSession);
+            message.setFrom(new InternetAddress("test@localhost"));
+            String[] emails = { "valid@localhost" };
+            Address rcpts[] = new Address[emails.length];
+            for (int i = 0; i < emails.length; i++) {
+                rcpts[i] = new InternetAddress(emails[i].trim().toLowerCase());
+            }
+            message.setRecipients(Message.RecipientType.TO, rcpts);
+            message.setSubject("Testmail", "UTF-8");
+            message.setText("Test.....");
+
+            SMTPTransport transport = (SMTPTransport) mailSession.getTransport("smtps");
+            
+            transport.connect(new Socket(address.getHostName(), address.getPort()));
+            transport.sendMessage(message, rcpts);
+            
+           
+            assertEquals(1, hook.getQueued().size());
+            
+
+
+        } finally {
+            if (server != null) {
+                server.unbind();
+            }
+        }
+        
+    }
+
+}


---------------------------------------------------------------------
To unsubscribe, e-mail: server-dev-unsubscribe@james.apache.org
For additional commands, e-mail: server-dev-help@james.apache.org


[12/12] james-project git commit: Merge remote-tracking branch 'mine/JAMES-1862-2'

Posted by ad...@apache.org.
Merge remote-tracking branch 'mine/JAMES-1862-2'


Project: http://git-wip-us.apache.org/repos/asf/james-project/repo
Commit: http://git-wip-us.apache.org/repos/asf/james-project/commit/a816b126
Tree: http://git-wip-us.apache.org/repos/asf/james-project/tree/a816b126
Diff: http://git-wip-us.apache.org/repos/asf/james-project/diff/a816b126

Branch: refs/heads/master
Commit: a816b1269a2bcd8896dafeffef9169825bebd89b
Parents: b38510b e0315c4
Author: Antoine Duprat <ad...@apache.org>
Authored: Tue Dec 6 13:25:00 2016 +0100
Committer: Antoine Duprat <ad...@apache.org>
Committed: Tue Dec 6 13:25:00 2016 +0100

----------------------------------------------------------------------
 .../apache/james/mpt/smtp/SmtpTestModule.java   |   2 +-
 .../apache/james/mpt/smtp/StarttlsSmtpTest.java |  33 ++
 .../james/mpt/smtp/StarttlsSmtpTestModule.java  |  32 ++
 .../smtp/host/CassandraJamesSmtpHostSystem.java |   4 +-
 .../cassandra/src/test/resources/smtpserver.xml |   4 +-
 .../apache/james/mpt/smtp/ForwardSmtpTest.java  |   3 +-
 .../james/mpt/smtp/SmtpStarttlsCommandTest.java |  65 +++
 .../org/apache/james/smtp/scripts/starttls.test |  11 +
 .../smtp/scripts/starttls_with_injection.test   |  11 +
 mpt/pom.xml                                     |   2 +-
 .../lmtp/netty/NettyLMTPSServerTest.java        |   5 +-
 .../lmtp/netty/NettyLMTPServerTest.java         |   4 +-
 protocols/netty/pom.xml                         |  14 +
 .../netty/AbstractChannelPipelineFactory.java   |  14 +-
 .../AbstractSSLAwareChannelPipelineFactory.java |  11 +-
 .../netty/BasicChannelUpstreamHandler.java      |   6 +-
 .../james/protocols/netty/NettyServer.java      |  64 ++-
 .../james/protocols/netty/NettyServerTest.java  |  71 +++
 .../pop3/netty/NettyPOP3SServerTest.java        |   5 +-
 .../pop3/netty/NettyPOP3ServerTest.java         |   4 +-
 .../pop3/netty/NettyStartTlsPOP3ServerTest.java |   5 +-
 protocols/smtp/pom.xml                          |  33 +-
 .../AllButStartTlsDelimiterChannelHandler.java  |  53 ++
 .../smtp/CommandInjectionDetectedException.java |  23 +
 .../smtp/AbstractStartTlsSMTPServerTest.java    | 168 -------
 .../smtp/netty/NettySMTPSServerTest.java        |   5 +-
 .../smtp/netty/NettySMTPServerTest.java         |   4 +-
 .../smtp/netty/NettyStartTlsSMTPServerTest.java | 262 ++++++++--
 .../mailets/jsieve/FileIntoAction.java          |   2 -
 .../james/transport/mailets/jsieve/Poster.java  |   1 -
 .../james/imapserver/netty/IMAPServer.java      |   8 +-
 .../imapserver/netty/IMAPServerFactory.java     |   1 -
 .../james/imapserver/netty/OioIMAPServer.java   |   1 -
 .../netty/AbstractConfigurableAsyncServer.java  |  12 +-
 ...ractExecutorAwareChannelPipelineFactory.java |   9 +-
 .../james/lmtpserver/netty/LMTPServer.java      |   9 +
 .../netty/ManageSieveServer.java                |  16 +-
 .../james/pop3server/netty/POP3Server.java      |   9 +
 server/protocols/protocols-smtp/pom.xml         |   6 +
 .../james/smtpserver/netty/SMTPServer.java      |   9 +
 .../apache/james/smtpserver/SMTPServerTest.java | 504 ++++++++++++++-----
 .../james/queue/jms/JMSMailQueueFactory.java    |   3 +-
 42 files changed, 1108 insertions(+), 400 deletions(-)
----------------------------------------------------------------------



---------------------------------------------------------------------
To unsubscribe, e-mail: server-dev-unsubscribe@james.apache.org
For additional commands, e-mail: server-dev-help@james.apache.org


[06/12] james-project git commit: JAMES-1862 Use assertj in StartTls tests

Posted by ad...@apache.org.
JAMES-1862 Use assertj in StartTls tests


Project: http://git-wip-us.apache.org/repos/asf/james-project/repo
Commit: http://git-wip-us.apache.org/repos/asf/james-project/commit/eece4acb
Tree: http://git-wip-us.apache.org/repos/asf/james-project/tree/eece4acb
Diff: http://git-wip-us.apache.org/repos/asf/james-project/diff/eece4acb

Branch: refs/heads/master
Commit: eece4acb83ee3a48f3844f321aefd8686c5b611a
Parents: 5ca0f7b
Author: Antoine Duprat <ad...@apache.org>
Authored: Wed Nov 30 10:33:00 2016 +0100
Committer: Antoine Duprat <ad...@apache.org>
Committed: Thu Dec 1 14:17:03 2016 +0100

----------------------------------------------------------------------
 protocols/smtp/pom.xml                          | 27 ++++++++++++--------
 .../smtp/netty/NettyStartTlsSMTPServerTest.java | 24 +++++++----------
 2 files changed, 25 insertions(+), 26 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/james-project/blob/eece4acb/protocols/smtp/pom.xml
----------------------------------------------------------------------
diff --git a/protocols/smtp/pom.xml b/protocols/smtp/pom.xml
index c028f35..7adc77b 100644
--- a/protocols/smtp/pom.xml
+++ b/protocols/smtp/pom.xml
@@ -39,17 +39,6 @@
             <artifactId>protocols-api</artifactId>
         </dependency>
         <dependency>
-            <groupId>commons-codec</groupId>
-            <artifactId>commons-codec</artifactId>
-            <optional>true</optional>
-        </dependency>
-
-        <dependency>
-            <groupId>commons-net</groupId>
-            <artifactId>commons-net</artifactId>
-            <scope>test</scope>
-        </dependency>
-        <dependency>
             <groupId>org.apache.james.protocols</groupId>
             <artifactId>protocols-api</artifactId>
             <scope>test</scope>
@@ -61,6 +50,16 @@
             <scope>test</scope>
         </dependency>
         <dependency>
+            <groupId>commons-codec</groupId>
+            <artifactId>commons-codec</artifactId>
+            <optional>true</optional>
+        </dependency>
+        <dependency>
+            <groupId>commons-net</groupId>
+            <artifactId>commons-net</artifactId>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
             <groupId>junit</groupId>
             <artifactId>junit</artifactId>
             <scope>test</scope>
@@ -70,6 +69,12 @@
             <artifactId>mail</artifactId>
             <scope>test</scope>
         </dependency>
+        <dependency>
+            <groupId>org.assertj</groupId>
+            <artifactId>assertj-core</artifactId>
+            <version>${assertj-1.version}</version>
+            <scope>test</scope>
+        </dependency>
     </dependencies>
 
     <build>

http://git-wip-us.apache.org/repos/asf/james-project/blob/eece4acb/protocols/smtp/src/test/java/org/apache/james/protocols/smtp/netty/NettyStartTlsSMTPServerTest.java
----------------------------------------------------------------------
diff --git a/protocols/smtp/src/test/java/org/apache/james/protocols/smtp/netty/NettyStartTlsSMTPServerTest.java b/protocols/smtp/src/test/java/org/apache/james/protocols/smtp/netty/NettyStartTlsSMTPServerTest.java
index 41f3b9c..c9dda94 100644
--- a/protocols/smtp/src/test/java/org/apache/james/protocols/smtp/netty/NettyStartTlsSMTPServerTest.java
+++ b/protocols/smtp/src/test/java/org/apache/james/protocols/smtp/netty/NettyStartTlsSMTPServerTest.java
@@ -18,8 +18,7 @@
  ****************************************************************/
 package org.apache.james.protocols.smtp.netty;
 
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertTrue;
+import static org.assertj.core.api.Assertions.assertThat;
 
 import java.net.InetSocketAddress;
 import java.net.Socket;
@@ -88,10 +87,10 @@ public class NettyStartTlsSMTPServerTest {
             
             SMTPSClient client = createClient();
             client.connect(address.getAddress().getHostAddress(), address.getPort());
-            assertTrue(SMTPReply.isPositiveCompletion(client.getReplyCode()));
+            assertThat(SMTPReply.isPositiveCompletion(client.getReplyCode())).isTrue();
             
             client.sendCommand("EHLO localhost");
-            assertTrue(SMTPReply.isPositiveCompletion(client.getReplyCode()));
+            assertThat(SMTPReply.isPositiveCompletion(client.getReplyCode())).isTrue();
             
             boolean startTLSAnnounced = false;
             for (String reply: client.getReplyStrings()) {
@@ -100,16 +99,15 @@ public class NettyStartTlsSMTPServerTest {
                     break;
                 }
             }
-            assertTrue(startTLSAnnounced);
-            
-            assertTrue(client.execTLS());
+            assertThat(startTLSAnnounced).isTrue();
+            assertThat(client.execTLS()).isTrue();
             
             client.quit();
-            assertTrue("Reply="+ client.getReplyString(), SMTPReply.isPositiveCompletion(client.getReplyCode()));
+            assertThat(SMTPReply.isPositiveCompletion(client.getReplyCode()))
+                .as("Reply="+ client.getReplyString())
+                .isTrue();
             
             client.disconnect();
-
-
         } finally {
             if (server != null) {
                 server.unbind();
@@ -156,11 +154,7 @@ public class NettyStartTlsSMTPServerTest {
             transport.connect(new Socket(address.getHostName(), address.getPort()));
             transport.sendMessage(message, rcpts);
             
-           
-            assertEquals(1, hook.getQueued().size());
-            
-
-
+            assertThat(hook.getQueued()).hasSize(1);
         } finally {
             if (server != null) {
                 server.unbind();


---------------------------------------------------------------------
To unsubscribe, e-mail: server-dev-unsubscribe@james.apache.org
For additional commands, e-mail: server-dev-help@james.apache.org


[08/12] james-project git commit: JAMES-1862 Add port in SmtpHostSystem

Posted by ad...@apache.org.
JAMES-1862 Add port in SmtpHostSystem


Project: http://git-wip-us.apache.org/repos/asf/james-project/repo
Commit: http://git-wip-us.apache.org/repos/asf/james-project/commit/dedad3f4
Tree: http://git-wip-us.apache.org/repos/asf/james-project/tree/dedad3f4
Diff: http://git-wip-us.apache.org/repos/asf/james-project/diff/dedad3f4

Branch: refs/heads/master
Commit: dedad3f471a6c18a50228a4a5f44be8f94f7a502
Parents: cc01139
Author: Antoine Duprat <ad...@apache.org>
Authored: Thu Dec 1 12:44:14 2016 +0100
Committer: Antoine Duprat <ad...@linagora.com>
Committed: Tue Dec 6 11:31:26 2016 +0100

----------------------------------------------------------------------
 .../src/test/java/org/apache/james/mpt/smtp/SmtpTestModule.java  | 2 +-
 .../apache/james/mpt/smtp/host/CassandraJamesSmtpHostSystem.java | 4 ++--
 2 files changed, 3 insertions(+), 3 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/james-project/blob/dedad3f4/mpt/impl/smtp/cassandra/src/test/java/org/apache/james/mpt/smtp/SmtpTestModule.java
----------------------------------------------------------------------
diff --git a/mpt/impl/smtp/cassandra/src/test/java/org/apache/james/mpt/smtp/SmtpTestModule.java b/mpt/impl/smtp/cassandra/src/test/java/org/apache/james/mpt/smtp/SmtpTestModule.java
index 7e1d3fd..923c854 100644
--- a/mpt/impl/smtp/cassandra/src/test/java/org/apache/james/mpt/smtp/SmtpTestModule.java
+++ b/mpt/impl/smtp/cassandra/src/test/java/org/apache/james/mpt/smtp/SmtpTestModule.java
@@ -26,7 +26,7 @@ public class SmtpTestModule extends AbstractModule {
 
     @Override
     protected void configure() {
-        bind(SmtpHostSystem.class).to(CassandraJamesSmtpHostSystem.class);
+        bind(SmtpHostSystem.class).toInstance(new CassandraJamesSmtpHostSystem(1025));
     }
 
 }

http://git-wip-us.apache.org/repos/asf/james-project/blob/dedad3f4/mpt/impl/smtp/cassandra/src/test/java/org/apache/james/mpt/smtp/host/CassandraJamesSmtpHostSystem.java
----------------------------------------------------------------------
diff --git a/mpt/impl/smtp/cassandra/src/test/java/org/apache/james/mpt/smtp/host/CassandraJamesSmtpHostSystem.java b/mpt/impl/smtp/cassandra/src/test/java/org/apache/james/mpt/smtp/host/CassandraJamesSmtpHostSystem.java
index bc8f678..f90bca9 100644
--- a/mpt/impl/smtp/cassandra/src/test/java/org/apache/james/mpt/smtp/host/CassandraJamesSmtpHostSystem.java
+++ b/mpt/impl/smtp/cassandra/src/test/java/org/apache/james/mpt/smtp/host/CassandraJamesSmtpHostSystem.java
@@ -46,8 +46,8 @@ public class CassandraJamesSmtpHostSystem extends ExternalSessionFactory impleme
     private InMemoryDNSService inMemoryDNSService;
 
 
-    public CassandraJamesSmtpHostSystem() {
-        super("localhost", 1025, new SystemLoggingMonitor(), "220 mydomain.tld smtp");
+    public CassandraJamesSmtpHostSystem(int smtpPort) {
+        super("localhost", smtpPort, new SystemLoggingMonitor(), "220 mydomain.tld smtp");
     }
 
     @Override


---------------------------------------------------------------------
To unsubscribe, e-mail: server-dev-unsubscribe@james.apache.org
For additional commands, e-mail: server-dev-help@james.apache.org


[09/12] james-project git commit: JAMES-1862 Add starttls SMTP command integration tests

Posted by ad...@apache.org.
JAMES-1862 Add starttls SMTP command integration tests


Project: http://git-wip-us.apache.org/repos/asf/james-project/repo
Commit: http://git-wip-us.apache.org/repos/asf/james-project/commit/e0315c4f
Tree: http://git-wip-us.apache.org/repos/asf/james-project/tree/e0315c4f
Diff: http://git-wip-us.apache.org/repos/asf/james-project/diff/e0315c4f

Branch: refs/heads/master
Commit: e0315c4f6491e9e5730b4359ef8445bf8f0681d0
Parents: dedad3f
Author: Antoine Duprat <ad...@apache.org>
Authored: Thu Dec 1 13:34:36 2016 +0100
Committer: Antoine Duprat <ad...@linagora.com>
Committed: Tue Dec 6 11:31:26 2016 +0100

----------------------------------------------------------------------
 .../apache/james/mpt/smtp/StarttlsSmtpTest.java | 33 ++++++++++
 .../james/mpt/smtp/StarttlsSmtpTestModule.java  | 32 ++++++++++
 .../cassandra/src/test/resources/smtpserver.xml |  4 +-
 .../james/mpt/smtp/SmtpStarttlsCommandTest.java | 65 ++++++++++++++++++++
 .../org/apache/james/smtp/scripts/starttls.test | 11 ++++
 .../smtp/scripts/starttls_with_injection.test   | 11 ++++
 6 files changed, 154 insertions(+), 2 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/james-project/blob/e0315c4f/mpt/impl/smtp/cassandra/src/test/java/org/apache/james/mpt/smtp/StarttlsSmtpTest.java
----------------------------------------------------------------------
diff --git a/mpt/impl/smtp/cassandra/src/test/java/org/apache/james/mpt/smtp/StarttlsSmtpTest.java b/mpt/impl/smtp/cassandra/src/test/java/org/apache/james/mpt/smtp/StarttlsSmtpTest.java
new file mode 100644
index 0000000..376579f
--- /dev/null
+++ b/mpt/impl/smtp/cassandra/src/test/java/org/apache/james/mpt/smtp/StarttlsSmtpTest.java
@@ -0,0 +1,33 @@
+/****************************************************************
+ * Licensed to the Apache Software Foundation (ASF) under one   *
+ * or more contributor license agreements.  See the NOTICE file *
+ * distributed with this work for additional information        *
+ * regarding copyright ownership.  The ASF licenses this file   *
+ * to you under the Apache License, Version 2.0 (the            *
+ * "License"); you may not use this file except in compliance   *
+ * with the License.  You may obtain a copy of the License at   *
+ *                                                              *
+ *   http://www.apache.org/licenses/LICENSE-2.0                 *
+ *                                                              *
+ * Unless required by applicable law or agreed to in writing,   *
+ * software distributed under the License is distributed on an  *
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY       *
+ * KIND, either express or implied.  See the License for the    *
+ * specific language governing permissions and limitations      *
+ * under the License.                                           *
+ ****************************************************************/
+package org.apache.james.mpt.smtp;
+
+import org.apache.james.mpt.onami.test.OnamiSuite;
+import org.apache.james.mpt.onami.test.annotation.GuiceModules;
+import org.junit.runner.RunWith;
+import org.junit.runners.Suite;
+
+@RunWith(OnamiSuite.class)
+@Suite.SuiteClasses({
+    SmtpStarttlsCommandTest.class
+})
+@GuiceModules({ StarttlsSmtpTestModule.class })
+public class StarttlsSmtpTest {
+
+}

http://git-wip-us.apache.org/repos/asf/james-project/blob/e0315c4f/mpt/impl/smtp/cassandra/src/test/java/org/apache/james/mpt/smtp/StarttlsSmtpTestModule.java
----------------------------------------------------------------------
diff --git a/mpt/impl/smtp/cassandra/src/test/java/org/apache/james/mpt/smtp/StarttlsSmtpTestModule.java b/mpt/impl/smtp/cassandra/src/test/java/org/apache/james/mpt/smtp/StarttlsSmtpTestModule.java
new file mode 100644
index 0000000..88b44d5
--- /dev/null
+++ b/mpt/impl/smtp/cassandra/src/test/java/org/apache/james/mpt/smtp/StarttlsSmtpTestModule.java
@@ -0,0 +1,32 @@
+/****************************************************************
+ * Licensed to the Apache Software Foundation (ASF) under one   *
+ * or more contributor license agreements.  See the NOTICE file *
+ * distributed with this work for additional information        *
+ * regarding copyright ownership.  The ASF licenses this file   *
+ * to you under the Apache License, Version 2.0 (the            *
+ * "License"); you may not use this file except in compliance   *
+ * with the License.  You may obtain a copy of the License at   *
+ *                                                              *
+ *   http://www.apache.org/licenses/LICENSE-2.0                 *
+ *                                                              *
+ * Unless required by applicable law or agreed to in writing,   *
+ * software distributed under the License is distributed on an  *
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY       *
+ * KIND, either express or implied.  See the License for the    *
+ * specific language governing permissions and limitations      *
+ * under the License.                                           *
+ ****************************************************************/
+package org.apache.james.mpt.smtp;
+
+import org.apache.james.mpt.smtp.host.CassandraJamesSmtpHostSystem;
+
+import com.google.inject.AbstractModule;
+
+public class StarttlsSmtpTestModule extends AbstractModule {
+
+    @Override
+    protected void configure() {
+        bind(SmtpHostSystem.class).toInstance(new CassandraJamesSmtpHostSystem(1587));
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/james-project/blob/e0315c4f/mpt/impl/smtp/cassandra/src/test/resources/smtpserver.xml
----------------------------------------------------------------------
diff --git a/mpt/impl/smtp/cassandra/src/test/resources/smtpserver.xml b/mpt/impl/smtp/cassandra/src/test/resources/smtpserver.xml
index 0eaeb3d..c2b31b5 100644
--- a/mpt/impl/smtp/cassandra/src/test/resources/smtpserver.xml
+++ b/mpt/impl/smtp/cassandra/src/test/resources/smtpserver.xml
@@ -77,8 +77,8 @@
         <jmxName>smtpserver-authenticated</jmxName>
         <bind>0.0.0.0:1587</bind>
         <connectionBacklog>200</connectionBacklog>
-        <tls socketTLS="false" startTLS="false">
-            <keystore>file://conf/keystore</keystore>
+        <tls socketTLS="false" startTLS="true">
+            <keystore>keystore</keystore>
             <secret>james72laBalle</secret>
             <provider>org.bouncycastle.jce.provider.BouncyCastleProvider</provider>
             <algorithm>SunX509</algorithm>

http://git-wip-us.apache.org/repos/asf/james-project/blob/e0315c4f/mpt/impl/smtp/core/src/main/java/org/apache/james/mpt/smtp/SmtpStarttlsCommandTest.java
----------------------------------------------------------------------
diff --git a/mpt/impl/smtp/core/src/main/java/org/apache/james/mpt/smtp/SmtpStarttlsCommandTest.java b/mpt/impl/smtp/core/src/main/java/org/apache/james/mpt/smtp/SmtpStarttlsCommandTest.java
new file mode 100644
index 0000000..2dd7246
--- /dev/null
+++ b/mpt/impl/smtp/core/src/main/java/org/apache/james/mpt/smtp/SmtpStarttlsCommandTest.java
@@ -0,0 +1,65 @@
+/****************************************************************
+ * Licensed to the Apache Software Foundation (ASF) under one   *
+ * or more contributor license agreements.  See the NOTICE file *
+ * distributed with this work for additional information        *
+ * regarding copyright ownership.  The ASF licenses this file   *
+ * to you under the Apache License, Version 2.0 (the            *
+ * "License"); you may not use this file except in compliance   *
+ * with the License.  You may obtain a copy of the License at   *
+ *                                                              *
+ *   http://www.apache.org/licenses/LICENSE-2.0                 *
+ *                                                              *
+ * Unless required by applicable law or agreed to in writing,   *
+ * software distributed under the License is distributed on an  *
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY       *
+ * KIND, either express or implied.  See the License for the    *
+ * specific language governing permissions and limitations      *
+ * under the License.                                           *
+ ****************************************************************/
+package org.apache.james.mpt.smtp;
+
+import java.util.Locale;
+
+import javax.inject.Inject;
+
+import org.apache.james.mpt.script.AbstractSimpleScriptedTestProtocol;
+import org.junit.Before;
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.rules.RuleChain;
+import org.junit.rules.TemporaryFolder;
+
+public class SmtpStarttlsCommandTest extends AbstractSimpleScriptedTestProtocol {
+
+    public static final String USER = "bob";
+    public static final String DOMAIN = "mydomain.tld";
+    public static final String USER_AT_DOMAIN = USER + "@" + DOMAIN;
+    public static final String PASSWORD = "secret";
+
+    private final TemporaryFolder folder = new TemporaryFolder();
+    
+    @Rule
+    public final RuleChain chain = RuleChain.outerRule(folder);
+
+    @Inject
+    private static SmtpHostSystem hostSystem;
+
+    public SmtpStarttlsCommandTest() throws Exception {
+        super(hostSystem, USER_AT_DOMAIN, PASSWORD, "/org/apache/james/smtp/scripts/");
+    }
+
+    @Before
+    public void setUp() throws Exception {
+        super.setUp();
+    }
+
+    @Test
+    public void starttlsShouldWork() throws Exception {
+        scriptTest("starttls", Locale.US);
+    }
+
+    @Test
+    public void starttlsShouldBeRejectedWhenFollowedByCommand() throws Exception {
+        scriptTest("starttls_with_injection", Locale.US);
+    }
+}

http://git-wip-us.apache.org/repos/asf/james-project/blob/e0315c4f/mpt/impl/smtp/core/src/main/resources/org/apache/james/smtp/scripts/starttls.test
----------------------------------------------------------------------
diff --git a/mpt/impl/smtp/core/src/main/resources/org/apache/james/smtp/scripts/starttls.test b/mpt/impl/smtp/core/src/main/resources/org/apache/james/smtp/scripts/starttls.test
new file mode 100644
index 0000000..abcb5c9
--- /dev/null
+++ b/mpt/impl/smtp/core/src/main/resources/org/apache/james/smtp/scripts/starttls.test
@@ -0,0 +1,11 @@
+S: 220 mydomain.tld smtp
+
+C: ehlo yopmail.com
+S: 250.*
+S: 250-PIPELINING
+S: 250-ENHANCEDSTATUSCODES
+S: 250-8BITMIME
+S: 250 STARTTLS
+
+C: starttls
+S: 220 2.0.0 Ready to start TLS

http://git-wip-us.apache.org/repos/asf/james-project/blob/e0315c4f/mpt/impl/smtp/core/src/main/resources/org/apache/james/smtp/scripts/starttls_with_injection.test
----------------------------------------------------------------------
diff --git a/mpt/impl/smtp/core/src/main/resources/org/apache/james/smtp/scripts/starttls_with_injection.test b/mpt/impl/smtp/core/src/main/resources/org/apache/james/smtp/scripts/starttls_with_injection.test
new file mode 100644
index 0000000..5c09717
--- /dev/null
+++ b/mpt/impl/smtp/core/src/main/resources/org/apache/james/smtp/scripts/starttls_with_injection.test
@@ -0,0 +1,11 @@
+S: 220 mydomain.tld smtp
+
+C: ehlo yopmail.com
+S: 250.*
+S: 250-PIPELINING
+S: 250-ENHANCEDSTATUSCODES
+S: 250-8BITMIME
+S: 250 STARTTLS
+
+C: starttls\r\nmail from:<ma...@yopmail.com>\r\n
+S: 451 Unable to process request


---------------------------------------------------------------------
To unsubscribe, e-mail: server-dev-unsubscribe@james.apache.org
For additional commands, e-mail: server-dev-help@james.apache.org


[04/12] james-project git commit: JAMES-1862 Refactor NettyStartTlsSMTPServerTest

Posted by ad...@apache.org.
JAMES-1862 Refactor NettyStartTlsSMTPServerTest


Project: http://git-wip-us.apache.org/repos/asf/james-project/repo
Commit: http://git-wip-us.apache.org/repos/asf/james-project/commit/99521482
Tree: http://git-wip-us.apache.org/repos/asf/james-project/tree/99521482
Diff: http://git-wip-us.apache.org/repos/asf/james-project/diff/99521482

Branch: refs/heads/master
Commit: 99521482330c8a33b3c51f963a450ebec5fd5d0b
Parents: eece4ac
Author: Antoine Duprat <ad...@apache.org>
Authored: Wed Nov 30 10:56:22 2016 +0100
Committer: Antoine Duprat <ad...@apache.org>
Committed: Thu Dec 1 14:17:03 2016 +0100

----------------------------------------------------------------------
 protocols/smtp/pom.xml                          |   4 +
 .../smtp/netty/NettyStartTlsSMTPServerTest.java | 191 +++++++++++--------
 2 files changed, 112 insertions(+), 83 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/james-project/blob/99521482/protocols/smtp/pom.xml
----------------------------------------------------------------------
diff --git a/protocols/smtp/pom.xml b/protocols/smtp/pom.xml
index 7adc77b..aaf2b49 100644
--- a/protocols/smtp/pom.xml
+++ b/protocols/smtp/pom.xml
@@ -50,6 +50,10 @@
             <scope>test</scope>
         </dependency>
         <dependency>
+            <groupId>com.google.guava</groupId>
+            <artifactId>guava</artifactId>
+        </dependency>
+        <dependency>
             <groupId>commons-codec</groupId>
             <artifactId>commons-codec</artifactId>
             <optional>true</optional>

http://git-wip-us.apache.org/repos/asf/james-project/blob/99521482/protocols/smtp/src/test/java/org/apache/james/protocols/smtp/netty/NettyStartTlsSMTPServerTest.java
----------------------------------------------------------------------
diff --git a/protocols/smtp/src/test/java/org/apache/james/protocols/smtp/netty/NettyStartTlsSMTPServerTest.java b/protocols/smtp/src/test/java/org/apache/james/protocols/smtp/netty/NettyStartTlsSMTPServerTest.java
index c9dda94..5a8058c 100644
--- a/protocols/smtp/src/test/java/org/apache/james/protocols/smtp/netty/NettyStartTlsSMTPServerTest.java
+++ b/protocols/smtp/src/test/java/org/apache/james/protocols/smtp/netty/NettyStartTlsSMTPServerTest.java
@@ -22,11 +22,9 @@ import static org.assertj.core.api.Assertions.assertThat;
 
 import java.net.InetSocketAddress;
 import java.net.Socket;
-import java.util.Arrays;
 import java.util.Locale;
 import java.util.Properties;
 
-import javax.mail.Address;
 import javax.mail.Message;
 import javax.mail.Session;
 import javax.mail.internet.InternetAddress;
@@ -49,16 +47,26 @@ import org.apache.james.protocols.smtp.SMTPConfigurationImpl;
 import org.apache.james.protocols.smtp.SMTPProtocol;
 import org.apache.james.protocols.smtp.SMTPProtocolHandlerChain;
 import org.apache.james.protocols.smtp.utils.TestMessageHook;
+import org.junit.After;
 import org.junit.Test;
 
+import com.google.common.base.Optional;
 import com.sun.mail.smtp.SMTPTransport;
 
 public class NettyStartTlsSMTPServerTest {
 
+    private ProtocolServer server;
+
+    @After
+    public void tearDown() {
+        if (server != null) {
+            server.unbind();
+        }
+    }
+
     private ProtocolServer createServer(Protocol protocol, InetSocketAddress address, Encryption enc) {
         NettyServer server = new NettyServer(protocol, enc);
         server.setListenAddresses(address);
-        
         return server;
     }
 
@@ -68,99 +76,116 @@ public class NettyStartTlsSMTPServerTest {
         return client;
     }
 
-    private Protocol createProtocol(ProtocolHandler... handlers) throws WiringException {
+    private Protocol createProtocol(Optional<ProtocolHandler> handler) throws WiringException {
         SMTPProtocolHandlerChain chain = new SMTPProtocolHandlerChain();
-        chain.addAll(0, Arrays.asList(handlers));
+        if (handler.isPresent()) {
+            chain.add(handler.get());
+        }
         chain.wireExtensibleHandlers();
         return new SMTPProtocol(chain, new SMTPConfigurationImpl(), new MockLogger());
     }
 
     @Test
-    public void testStartTLS() throws Exception {
+    public void connectShouldReturnTrueWhenConnecting() throws Exception {
         InetSocketAddress address = new InetSocketAddress("127.0.0.1", TestUtils.getFreePort());
-        
-        
-        ProtocolServer server = null;
-        try {
-            server = createServer(createProtocol(new ProtocolHandler[0]), address, Encryption.createStartTls(BogusSslContextFactory.getServerContext()));  
-            server.bind();
-            
-            SMTPSClient client = createClient();
-            client.connect(address.getAddress().getHostAddress(), address.getPort());
-            assertThat(SMTPReply.isPositiveCompletion(client.getReplyCode())).isTrue();
-            
-            client.sendCommand("EHLO localhost");
-            assertThat(SMTPReply.isPositiveCompletion(client.getReplyCode())).isTrue();
-            
-            boolean startTLSAnnounced = false;
-            for (String reply: client.getReplyStrings()) {
-                if (reply.toUpperCase(Locale.UK).endsWith("STARTTLS")) {
-                    startTLSAnnounced = true;
-                    break;
-                }
-            }
-            assertThat(startTLSAnnounced).isTrue();
-            assertThat(client.execTLS()).isTrue();
-            
-            client.quit();
-            assertThat(SMTPReply.isPositiveCompletion(client.getReplyCode()))
-                .as("Reply="+ client.getReplyString())
-                .isTrue();
-            
-            client.disconnect();
-        } finally {
-            if (server != null) {
-                server.unbind();
-            }
-        }
-        
+        ProtocolServer server = createServer(createProtocol(Optional.<ProtocolHandler> absent()), address, Encryption.createStartTls(BogusSslContextFactory.getServerContext()));  
+        server.bind();
+
+        SMTPSClient client = createClient();
+        client.connect(address.getAddress().getHostAddress(), address.getPort());
+        assertThat(SMTPReply.isPositiveCompletion(client.getReplyCode())).isTrue();
+
+        client.quit();
+        client.disconnect();
     }
-    
+
     @Test
-    public void testStartTLSWithJavamail() throws Exception {
+    public void ehloShouldReturnTrueWhenSendingTheCommand() throws Exception {
         InetSocketAddress address = new InetSocketAddress("127.0.0.1", TestUtils.getFreePort());
+        ProtocolServer server = createServer(createProtocol(Optional.<ProtocolHandler> absent()), address, Encryption.createStartTls(BogusSslContextFactory.getServerContext()));  
+        server.bind();
+
+        SMTPSClient client = createClient();
+        client.connect(address.getAddress().getHostAddress(), address.getPort());
+
+        client.sendCommand("EHLO localhost");
+        assertThat(SMTPReply.isPositiveCompletion(client.getReplyCode())).isTrue();
         
-        
-        ProtocolServer server = null;
-        try {
-            TestMessageHook hook = new TestMessageHook();
-            server = createServer(createProtocol(hook) , address, Encryption.createStartTls(BogusSslContextFactory.getServerContext()));  
-            server.bind();
-            
-            
-            Properties mailProps = new Properties();
-            mailProps.put("mail.smtp.from", "test@localhost");
-            mailProps.put("mail.smtp.host", address.getHostName());
-            mailProps.put("mail.smtp.port", address.getPort());
-            mailProps.put("mail.smtp.socketFactory.class", BogusSSLSocketFactory.class.getName());
-            mailProps.put("mail.smtp.socketFactory.fallback", "false");
-            mailProps.put("mail.smtp.starttls.enable", "true");
-
-            Session mailSession = Session.getDefaultInstance(mailProps);
-
-            MimeMessage message = new MimeMessage(mailSession);
-            message.setFrom(new InternetAddress("test@localhost"));
-            String[] emails = { "valid@localhost" };
-            Address rcpts[] = new Address[emails.length];
-            for (int i = 0; i < emails.length; i++) {
-                rcpts[i] = new InternetAddress(emails[i].trim().toLowerCase());
-            }
-            message.setRecipients(Message.RecipientType.TO, rcpts);
-            message.setSubject("Testmail", "UTF-8");
-            message.setText("Test.....");
-
-            SMTPTransport transport = (SMTPTransport) mailSession.getTransport("smtps");
-            
-            transport.connect(new Socket(address.getHostName(), address.getPort()));
-            transport.sendMessage(message, rcpts);
-            
-            assertThat(hook.getQueued()).hasSize(1);
-        } finally {
-            if (server != null) {
-                server.unbind();
+        client.quit();
+        client.disconnect();
+    }
+
+    @Test
+    public void startTlsShouldBeAnnouncedWhenServerSupportsIt() throws Exception {
+        InetSocketAddress address = new InetSocketAddress("127.0.0.1", TestUtils.getFreePort());
+        ProtocolServer server = createServer(createProtocol(Optional.<ProtocolHandler> absent()), address, Encryption.createStartTls(BogusSslContextFactory.getServerContext()));  
+        server.bind();
+
+        SMTPSClient client = createClient();
+        client.connect(address.getAddress().getHostAddress(), address.getPort());
+        client.sendCommand("EHLO localhost");
+
+        assertThat(isStartTLSAnnounced(client)).isTrue();
+
+        client.quit();
+        client.disconnect();
+    }
+
+    private boolean isStartTLSAnnounced(SMTPSClient client) {
+        for (String reply: client.getReplyStrings()) {
+            if (reply.toUpperCase(Locale.UK).endsWith("STARTTLS")) {
+                return true;
             }
         }
-        
+        return false;
+    }
+
+    @Test
+    public void startTlsShouldReturnTrueWhenServerSupportsIt() throws Exception {
+        InetSocketAddress address = new InetSocketAddress("127.0.0.1", TestUtils.getFreePort());
+        ProtocolServer server = createServer(createProtocol(Optional.<ProtocolHandler> absent()), address, Encryption.createStartTls(BogusSslContextFactory.getServerContext()));  
+        server.bind();
+
+        SMTPSClient client = createClient();
+        client.connect(address.getAddress().getHostAddress(), address.getPort());
+        client.sendCommand("EHLO localhost");
+
+        boolean execTLS = client.execTLS();
+        assertThat(execTLS).isTrue();
+
+        client.quit();
+        client.disconnect();
     }
 
+    @Test
+    public void startTlsShouldWorkWhenUsingJavamail() throws Exception {
+        TestMessageHook hook = new TestMessageHook();
+        InetSocketAddress address = new InetSocketAddress("127.0.0.1", TestUtils.getFreePort());
+        ProtocolServer server = createServer(createProtocol(Optional.<ProtocolHandler> of(hook)) , address, Encryption.createStartTls(BogusSslContextFactory.getServerContext()));  
+        server.bind();
+
+        Properties mailProps = new Properties();
+        mailProps.put("mail.smtp.from", "test@localhost");
+        mailProps.put("mail.smtp.host", address.getHostName());
+        mailProps.put("mail.smtp.port", address.getPort());
+        mailProps.put("mail.smtp.socketFactory.class", BogusSSLSocketFactory.class.getName());
+        mailProps.put("mail.smtp.socketFactory.fallback", "false");
+        mailProps.put("mail.smtp.starttls.enable", "true");
+
+        Session mailSession = Session.getDefaultInstance(mailProps);
+
+        InternetAddress[] rcpts = new InternetAddress[] { new InternetAddress("valid@localhost") };
+        MimeMessage message = new MimeMessage(mailSession);
+        message.setFrom(new InternetAddress("test@localhost"));
+        message.setRecipients(Message.RecipientType.TO, rcpts);
+        message.setSubject("Testmail", "UTF-8");
+        message.setText("Test.....");
+
+        SMTPTransport transport = (SMTPTransport) mailSession.getTransport("smtps");
+
+        transport.connect(new Socket(address.getHostName(), address.getPort()));
+        transport.sendMessage(message, rcpts);
+
+        assertThat(hook.getQueued()).hasSize(1);
+    }
 }


---------------------------------------------------------------------
To unsubscribe, e-mail: server-dev-unsubscribe@james.apache.org
For additional commands, e-mail: server-dev-help@james.apache.org


[03/12] james-project git commit: JAMES-1862 Use assertj in SMTPServer tests

Posted by ad...@apache.org.
JAMES-1862 Use assertj in SMTPServer tests


Project: http://git-wip-us.apache.org/repos/asf/james-project/repo
Commit: http://git-wip-us.apache.org/repos/asf/james-project/commit/50cf7b48
Tree: http://git-wip-us.apache.org/repos/asf/james-project/tree/50cf7b48
Diff: http://git-wip-us.apache.org/repos/asf/james-project/diff/50cf7b48

Branch: refs/heads/master
Commit: 50cf7b48d010b09a64437193abdd23f8b931d804
Parents: 9952148
Author: Antoine Duprat <ad...@apache.org>
Authored: Wed Nov 30 16:01:37 2016 +0100
Committer: Antoine Duprat <ad...@apache.org>
Committed: Thu Dec 1 14:17:03 2016 +0100

----------------------------------------------------------------------
 server/protocols/protocols-smtp/pom.xml         |   6 +
 .../apache/james/smtpserver/SMTPServerTest.java | 464 ++++++++++++++-----
 2 files changed, 345 insertions(+), 125 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/james-project/blob/50cf7b48/server/protocols/protocols-smtp/pom.xml
----------------------------------------------------------------------
diff --git a/server/protocols/protocols-smtp/pom.xml b/server/protocols/protocols-smtp/pom.xml
index a4e4a3c..a466eea 100644
--- a/server/protocols/protocols-smtp/pom.xml
+++ b/server/protocols/protocols-smtp/pom.xml
@@ -216,6 +216,12 @@
             <scope>test</scope>
         </dependency>
         <dependency>
+            <groupId>org.assertj</groupId>
+            <artifactId>assertj-core</artifactId>
+            <version>${assertj-1.version}</version>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
             <groupId>org.slf4j</groupId>
             <artifactId>slf4j-log4j12</artifactId>
             <scope>test</scope>

http://git-wip-us.apache.org/repos/asf/james-project/blob/50cf7b48/server/protocols/protocols-smtp/src/test/java/org/apache/james/smtpserver/SMTPServerTest.java
----------------------------------------------------------------------
diff --git a/server/protocols/protocols-smtp/src/test/java/org/apache/james/smtpserver/SMTPServerTest.java b/server/protocols/protocols-smtp/src/test/java/org/apache/james/smtpserver/SMTPServerTest.java
index 780e919..578b824 100644
--- a/server/protocols/protocols-smtp/src/test/java/org/apache/james/smtpserver/SMTPServerTest.java
+++ b/server/protocols/protocols-smtp/src/test/java/org/apache/james/smtpserver/SMTPServerTest.java
@@ -18,11 +18,7 @@
  ****************************************************************/
 package org.apache.james.smtpserver;
 
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertNotNull;
-import static org.junit.Assert.assertNull;
-import static org.junit.Assert.assertTrue;
+import static org.assertj.core.api.Assertions.assertThat;
 import static org.junit.Assert.fail;
 import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.when;
@@ -344,10 +340,14 @@ public class SMTPServerTest {
         }
         smtpProtocol.sendCommand("EHLO " + sb.toString());
         System.out.println(smtpProtocol.getReplyString());
-        assertEquals("Line length exceed", 500, smtpProtocol.getReplyCode());
+        assertThat(smtpProtocol.getReplyCode())
+            .as("Line length exceed")
+            .isEqualTo(500);
 
         smtpProtocol.sendCommand("EHLO test");
-        assertEquals("Line length ok", 250, smtpProtocol.getReplyCode());
+        assertThat(smtpProtocol.getReplyCode())
+            .as("Line length ok")
+            .isEqualTo(250);
 
         smtpProtocol.quit();
         smtpProtocol.disconnect();
@@ -390,25 +390,33 @@ public class SMTPServerTest {
 
     public void verifyLastMail(String sender, String recipient, MimeMessage msg) throws IOException, MessagingException {
         Mail mailData = queue.getLastMail();
-        assertNotNull("mail received by mail server", mailData);
+        assertThat(mailData)
+            .as("mail received by mail server")
+            .isNotNull();
 
         if (sender == null && recipient == null && msg == null) {
             fail("no verification can be done with all arguments null");
         }
 
         if (sender != null) {
-            assertEquals("sender verfication", sender, mailData.getSender().toString());
+            assertThat(mailData.getSender().toString())
+                .as("sender verfication")
+                .isEqualTo(sender);
         }
         if (recipient != null) {
-            assertTrue("recipient verfication", mailData.getRecipients().contains(new MailAddress(recipient)));
+            assertThat(mailData.getRecipients())
+                .as("recipient verfication")
+                .containsOnly(new MailAddress(recipient));
         }
         if (msg != null) {
             ByteArrayOutputStream bo1 = new ByteArrayOutputStream();
             msg.writeTo(bo1);
             ByteArrayOutputStream bo2 = new ByteArrayOutputStream();
             mailData.getMessage().writeTo(bo2);
-            assertEquals(bo1.toString(), bo2.toString());
-            assertEquals("message verification", msg, mailData.getMessage());
+            assertThat(bo2.toString()).isEqualTo(bo1.toString());
+            assertThat(mailData.getMessage())
+                .as("message verification")
+                .isEqualTo(msg);
         }
     }
 
@@ -420,7 +428,9 @@ public class SMTPServerTest {
         smtpProtocol.connect("127.0.0.1", smtpListenerPort);
 
         // no message there, yet
-        assertNull("no mail received by mail server", queue.getLastMail());
+        assertThat(queue.getLastMail())
+            .as("no mail received by mail server")
+            .isNull();;
 
         smtpProtocol.sendCommand("EHLO " + InetAddress.getLocalHost());
         String[] capabilityRes = smtpProtocol.getReplyStrings();
@@ -430,10 +440,18 @@ public class SMTPServerTest {
             capabilitieslist.add(capabilityRes[i].substring(4));
         }
 
-        assertEquals("capabilities", 3, capabilitieslist.size());
-        assertTrue("capabilities present PIPELINING", capabilitieslist.contains("PIPELINING"));
-        assertTrue("capabilities present ENHANCEDSTATUSCODES", capabilitieslist.contains("ENHANCEDSTATUSCODES"));
-        assertTrue("capabilities present 8BITMIME", capabilitieslist.contains("8BITMIME"));
+        assertThat(capabilitieslist)
+            .as("capabilities")
+            .hasSize(3);
+        assertThat(capabilitieslist.contains("PIPELINING"))
+            .as("capabilities present PIPELINING")
+            .isTrue();
+        assertThat(capabilitieslist.contains("ENHANCEDSTATUSCODES"))
+            .as("capabilities present ENHANCEDSTATUSCODES")
+            .isTrue();
+        assertThat(capabilitieslist.contains("8BITMIME"))
+            .as("capabilities present 8BITMIME")
+            .isTrue();
 
         smtpProtocol.setSender("mail@localhost");
         smtpProtocol.addRecipient("mail@localhost");
@@ -443,7 +461,9 @@ public class SMTPServerTest {
         smtpProtocol.disconnect();
 
         // mail was propagated by SMTPServer
-        assertNotNull("mail received by mail server", queue.getLastMail());
+        assertThat(queue.getLastMail())
+            .as("mail received by mail server")
+            .isNotNull();
     }
 
     @Test
@@ -455,7 +475,9 @@ public class SMTPServerTest {
         smtpProtocol.connect("127.0.0.1", smtpListenerPort);
 
         // no message there, yet
-        assertNull("no mail received by mail server", queue.getLastMail());
+        assertThat(queue.getLastMail())
+            .as("no mail received by mail server")
+            .isNull();;
 
         smtpProtocol.sendCommand("EHLO " + InetAddress.getLocalHost());
         String[] capabilityRes = smtpProtocol.getReplyStrings();
@@ -465,11 +487,12 @@ public class SMTPServerTest {
             capabilitieslist.add(capabilityRes[i].substring(4));
         }
 
-        assertEquals("capabilities", 4, capabilitieslist.size());
-        assertTrue("capabilities present PIPELINING", capabilitieslist.contains("PIPELINING"));
-        assertTrue("capabilities present ENHANCEDSTATUSCODES", capabilitieslist.contains("ENHANCEDSTATUSCODES"));
-        assertTrue("capabilities present 8BITMIME", capabilitieslist.contains("8BITMIME"));
-        assertTrue("capabilities present STARTTLS", capabilitieslist.contains("STARTTLS"));
+        assertThat(capabilitieslist)
+            .as("capabilities")
+            .hasSize(4);
+        assertThat(capabilitieslist)
+            .as("capabilities present PIPELINING ENHANCEDSTATUSCODES 8BITMIME STARTTLS")
+            .containsOnly("PIPELINING", "ENHANCEDSTATUSCODES", "8BITMIME", "STARTTLS");
 
         smtpProtocol.quit();
         smtpProtocol.disconnect();
@@ -503,7 +526,9 @@ public class SMTPServerTest {
         SMTPClient smtp = newSMTPClient();
 
         // no message there, yet
-        assertNull("no mail received by mail server", queue.getLastMail());
+        assertThat(queue.getLastMail())
+            .as("no mail received by mail server")
+            .isNull();;
 
         smtp.helo(InetAddress.getLocalHost().toString());
         smtp.setSender("mail@localhost");
@@ -513,8 +538,9 @@ public class SMTPServerTest {
         smtp.quit();
         smtp.disconnect();
 
-        assertNotNull("spooled mail has Received header",
-                queue.getLastMail().getMessage().getHeader("Received"));
+        assertThat(queue.getLastMail().getMessage().getHeader("Received"))
+            .as("spooled mail has Received header")
+            .isNotNull();
     }
 
     // FIXME
@@ -526,7 +552,9 @@ public class SMTPServerTest {
         SMTPClient smtp = newSMTPClient();
 
         // no message there, yet
-        assertNull("no mail received by mail server", queue.getLastMail());
+        assertThat(queue.getLastMail())
+            .as("no mail received by mail server")
+            .isNull();;
 
         smtp.helo(InetAddress.getLocalHost().toString());
         smtp.setSender("mail@localhost");
@@ -536,8 +564,9 @@ public class SMTPServerTest {
         smtp.quit();
         smtp.disconnect();
 
-        assertNotNull("spooled mail has Received header",
-                queue.getLastMail().getMessage().getHeader("Received"));
+        assertThat(queue.getLastMail().getMessage().getHeader("Received"))
+            .as("spooled mail has Received header")
+            .isNotNull();
         // TODO: test body size
     }
 
@@ -549,7 +578,9 @@ public class SMTPServerTest {
         smtpProtocol.connect("127.0.0.1", smtpListenerPort);
 
         // no message there, yet
-        assertNull("no mail received by mail server", queue.getLastMail());
+        assertThat(queue.getLastMail())
+            .as("no mail received by mail server")
+            .isNull();
 
         smtpProtocol.helo(InetAddress.getLocalHost().toString());
 
@@ -563,7 +594,9 @@ public class SMTPServerTest {
         smtpProtocol.disconnect();
 
         // mail was propagated by SMTPServer
-        assertNotNull("mail received by mail server", queue.getLastMail());
+        assertThat(queue.getLastMail())
+            .as("mail received by mail server")
+            .isNotNull();
     }
 
     @Test
@@ -575,11 +608,17 @@ public class SMTPServerTest {
         SMTPClient smtpProtocol2 = new SMTPClient();
         smtpProtocol2.connect("127.0.0.1", smtpListenerPort);
 
-        assertTrue("first connection taken", smtpProtocol1.isConnected());
-        assertTrue("second connection taken", smtpProtocol2.isConnected());
+        assertThat(smtpProtocol1.isConnected())
+            .as("first connection taken")
+            .isTrue();
+        assertThat(smtpProtocol2.isConnected())
+            .as("second connection taken")
+            .isTrue();
 
         // no message there, yet
-        assertNull("no mail received by mail server", queue.getLastMail());
+        assertThat(queue.getLastMail())
+            .as("no mail received by mail server")
+            .isNull();
 
         smtpProtocol1.helo(InetAddress.getLocalHost().toString());
         smtpProtocol2.helo(InetAddress.getLocalHost().toString());
@@ -614,10 +653,14 @@ public class SMTPServerTest {
         SMTPClient smtpProtocol1 = new SMTPClient();
         smtpProtocol1.connect("127.0.0.1", smtpListenerPort);
 
-        assertTrue("first connection taken", smtpProtocol1.isConnected());
+        assertThat(smtpProtocol1.isConnected())
+            .as("first connection taken")
+            .isTrue();
 
         // no message there, yet
-        assertNull("no mail received by mail server", queue.getLastMail());
+        assertThat(queue.getLastMail())
+            .as("no mail received by mail server")
+            .isNull();
 
         smtpProtocol1.helo(InetAddress.getLocalHost().toString());
 
@@ -654,10 +697,14 @@ public class SMTPServerTest {
         SMTPClient smtpProtocol = new SMTPClient();
         smtpProtocol.connect("127.0.0.1", smtpListenerPort);
 
-        assertTrue("first connection taken", smtpProtocol.isConnected());
+        assertThat(smtpProtocol.isConnected())
+            .as("first connection taken")
+            .isTrue();
 
         // no message there, yet
-        assertNull("no mail received by mail server", queue.getLastMail());
+        assertThat(queue.getLastMail())
+            .as("no mail received by mail server")
+            .isNull();
 
         String fictionalDomain = "abgsfe3rsf.de";
         String existingDomain = "james.apache.org";
@@ -669,7 +716,9 @@ public class SMTPServerTest {
         smtpProtocol.addRecipient(rcpt);
 
         // this should give a 501 code cause the helo/ehlo could not resolved
-        assertEquals("expected error: " + heloCommand + " could not resolved", 501, smtpProtocol.getReplyCode());
+        assertThat(smtpProtocol.getReplyCode())
+            .as("expected error: " + heloCommand + " could not resolved")
+            .isEqualTo(501);
 
         smtpProtocol.sendCommand(heloCommand, existingDomain);
         smtpProtocol.setSender(mail);
@@ -679,7 +728,9 @@ public class SMTPServerTest {
             fail(existingDomain + " domain currently cannot be resolved (check your DNS/internet connection/proxy settings to make test pass)");
         }
         // helo/ehlo is resolvable. so this should give a 250 code
-        assertEquals(heloCommand + " accepted", 250, smtpProtocol.getReplyCode());
+        assertThat(smtpProtocol.getReplyCode())
+            .as(heloCommand + " accepted")
+            .isEqualTo(250);
 
         smtpProtocol.quit();
     }
@@ -693,7 +744,9 @@ public class SMTPServerTest {
 
         smtpProtocol1.helo("abgsfe3rsf.de");
         // helo should not be checked. so this should give a 250 code
-        assertEquals("Helo accepted", 250, smtpProtocol1.getReplyCode());
+        assertThat(smtpProtocol1.getReplyCode())
+            .as("Helo accepted")
+            .isEqualTo(250);
 
         smtpProtocol1.quit();
     }
@@ -714,10 +767,14 @@ public class SMTPServerTest {
             SMTPClient smtpProtocol1 = new SMTPClient();
             smtpProtocol1.connect("127.0.0.1", smtpListenerPort);
 
-            assertTrue("first connection taken", smtpProtocol1.isConnected());
+            assertThat(smtpProtocol1.isConnected())
+                .as("first connection taken")
+                .isTrue();
 
             // no message there, yet
-            assertNull("no mail received by mail server", queue.getLastMail());
+            assertThat(queue.getLastMail())
+                .as("no mail received by mail server")
+                .isNull();
 
             String helo1 = "abgsfe3rsf.de";
             String helo2 = "james.apache.org";
@@ -730,14 +787,18 @@ public class SMTPServerTest {
 
             // this should give a 501 code cause the helo not equal reverse of
             // ip
-            assertEquals("expected error: helo not equals reverse of ip", 501, smtpProtocol1.getReplyCode());
+            assertThat(smtpProtocol1.getReplyCode())
+                .as("expected error: helo not equals reverse of ip")
+                .isEqualTo(501);
 
             smtpProtocol1.sendCommand("helo", helo2);
             smtpProtocol1.setSender(mail);
             smtpProtocol1.addRecipient(rcpt);
 
             // helo is resolvable. so this should give a 250 code
-            assertEquals("Helo accepted", 250, smtpProtocol1.getReplyCode());
+            assertThat(smtpProtocol1.getReplyCode())
+                .as("Helo accepted")
+                .isEqualTo(250);
 
             smtpProtocol1.quit();
         } finally {
@@ -754,20 +815,28 @@ public class SMTPServerTest {
         SMTPClient smtpProtocol1 = new SMTPClient();
         smtpProtocol1.connect("127.0.0.1", smtpListenerPort);
 
-        assertTrue("first connection taken", smtpProtocol1.isConnected());
+        assertThat(smtpProtocol1.isConnected())
+            .as("first connection taken")
+            .isTrue();
 
         // no message there, yet
-        assertNull("no mail received by mail server", queue.getLastMail());
+        assertThat(queue.getLastMail())
+            .as("no mail received by mail server")
+            .isNull();
 
         smtpProtocol1.helo(InetAddress.getLocalHost().toString());
 
         String sender1 = "mail_sender1@xfwrqqfgfe.de";
 
         smtpProtocol1.setSender(sender1);
-        assertEquals("expected 501 error", 501, smtpProtocol1.getReplyCode());
+        assertThat(smtpProtocol1.getReplyCode())
+            .as("expected 501 error")
+            .isEqualTo(501);
 
         smtpProtocol1.addRecipient("test@localhost");
-        assertEquals("Recipient not accepted cause no valid sender", 503, smtpProtocol1.getReplyCode());
+        assertThat(smtpProtocol1.getReplyCode())
+            .as("Recipient not accepted cause no valid sender")
+            .isEqualTo(503);
         smtpProtocol1.quit();
 
     }
@@ -796,10 +865,14 @@ public class SMTPServerTest {
         SMTPClient smtpProtocol1 = new SMTPClient();
         smtpProtocol1.connect("127.0.0.1", smtpListenerPort);
 
-        assertTrue("first connection taken", smtpProtocol1.isConnected());
+        assertThat(smtpProtocol1.isConnected())
+            .as("first connection taken")
+            .isTrue();
 
         // no message there, yet
-        assertNull("no mail received by mail server", queue.getLastMail());
+        assertThat(queue.getLastMail())
+            .as("no mail received by mail server")
+            .isNull();
 
         smtpProtocol1.helo(InetAddress.getLocalHost().toString());
 
@@ -821,10 +894,14 @@ public class SMTPServerTest {
         SMTPClient smtpProtocol1 = new SMTPClient();
         smtpProtocol1.connect("127.0.0.1", smtpListenerPort);
 
-        assertTrue("first connection taken", smtpProtocol1.isConnected());
+        assertThat(smtpProtocol1.isConnected())
+            .as("first connection taken")
+            .isTrue();
 
         // no message there, yet
-        assertNull("no mail received by mail server", queue.getLastMail());
+        assertThat(queue.getLastMail())
+            .as("no mail received by mail server")
+            .isNull();
 
         smtpProtocol1.helo(InetAddress.getLocalHost().toString());
 
@@ -832,7 +909,9 @@ public class SMTPServerTest {
         String sender2 = "mail_sender2@james.apache.org";
 
         smtpProtocol1.setSender(sender1);
-        assertEquals("expected 501 error", 501, smtpProtocol1.getReplyCode());
+        assertThat(smtpProtocol1.getReplyCode())
+            .as("expected 501 error")
+            .isEqualTo(501);
 
         smtpProtocol1.setSender(sender2);
 
@@ -848,10 +927,14 @@ public class SMTPServerTest {
         SMTPClient smtpProtocol1 = new SMTPClient();
         smtpProtocol1.connect("127.0.0.1", smtpListenerPort);
 
-        assertTrue("first connection taken", smtpProtocol1.isConnected());
+        assertThat(smtpProtocol1.isConnected())
+            .as("first connection taken")
+            .isTrue();
 
         // no message there, yet
-        assertNull("no mail received by mail server", queue.getLastMail());
+        assertThat(queue.getLastMail())
+            .as("no mail received by mail server")
+            .isNull();
 
         smtpProtocol1.helo(InetAddress.getLocalHost().toString());
 
@@ -863,7 +946,9 @@ public class SMTPServerTest {
         smtpProtocol1.addRecipient(rcpt1);
 
         smtpProtocol1.addRecipient(rcpt2);
-        assertEquals("expected 452 error", 452, smtpProtocol1.getReplyCode());
+        assertThat(smtpProtocol1.getReplyCode())
+            .as("expected 452 error")
+            .isEqualTo(452);
 
         smtpProtocol1.sendShortMessageData("Subject: test\r\n\r\nTest body testMaxRcpt1\r\n");
 
@@ -919,7 +1004,9 @@ public class SMTPServerTest {
 
         smtpProtocol1.sendCommand("ehlo", "abgsfe3rsf.de");
         // ehlo should not be checked. so this should give a 250 code
-        assertEquals("ehlo accepted", 250, smtpProtocol1.getReplyCode());
+        assertThat(smtpProtocol1.getReplyCode())
+            .as("ehlo accepted")
+            .isEqualTo(250);
 
         smtpProtocol1.quit();
     }
@@ -951,10 +1038,13 @@ public class SMTPServerTest {
             SMTPClient smtpProtocol1 = new SMTPClient();
             smtpProtocol1.connect("127.0.0.1", smtpListenerPort);
 
-            assertTrue("first connection taken", smtpProtocol1.isConnected());
-
+            assertThat(smtpProtocol1.isConnected())
+                .as("first connection taken")
+                .isTrue();
             // no message there, yet
-            assertNull("no mail received by mail server", queue.getLastMail());
+            assertThat(queue.getLastMail())
+                .as("no mail received by mail server")
+                .isNull();
 
             String ehlo1 = "abgsfe3rsf.de";
             String ehlo2 = "james.apache.org";
@@ -967,14 +1057,18 @@ public class SMTPServerTest {
 
             // this should give a 501 code cause the ehlo not equals reverse of
             // ip
-            assertEquals("expected error: ehlo not equals reverse of ip", 501, smtpProtocol1.getReplyCode());
+            assertThat(smtpProtocol1.getReplyCode())
+                .as("expected error: ehlo not equals reverse of ip")
+                .isEqualTo(501);
 
             smtpProtocol1.sendCommand("ehlo", ehlo2);
             smtpProtocol1.setSender(mail);
             smtpProtocol1.addRecipient(rcpt);
 
             // ehlo is resolvable. so this should give a 250 code
-            assertEquals("ehlo accepted", 250, smtpProtocol1.getReplyCode());
+            assertThat(smtpProtocol1.getReplyCode())
+                .as("ehlo accepted")
+                .isEqualTo(250);
 
             smtpProtocol1.quit();
         } finally {
@@ -989,14 +1083,20 @@ public class SMTPServerTest {
         SMTPClient smtpProtocol1 = new SMTPClient();
         smtpProtocol1.connect("127.0.0.1", smtpListenerPort);
 
-        assertTrue("first connection taken", smtpProtocol1.isConnected());
+        assertThat(smtpProtocol1.isConnected())
+            .as("first connection taken")
+            .isTrue();
 
         // no message there, yet
-        assertNull("no mail received by mail server", queue.getLastMail());
+        assertThat(queue.getLastMail())
+            .as("no mail received by mail server")
+            .isNull();
 
         String sender1 = "mail_sender1@localhost";
         smtpProtocol1.setSender(sender1);
-        assertEquals("expected 503 error", 503, smtpProtocol1.getReplyCode());
+        assertThat(smtpProtocol1.getReplyCode())
+            .as("expected 503 error")
+            .isEqualTo(503);
 
         smtpProtocol1.helo(InetAddress.getLocalHost().toString());
 
@@ -1013,10 +1113,14 @@ public class SMTPServerTest {
         SMTPClient smtpProtocol1 = new SMTPClient();
         smtpProtocol1.connect("127.0.0.1", smtpListenerPort);
 
-        assertTrue("first connection taken", smtpProtocol1.isConnected());
+        assertThat(smtpProtocol1.isConnected())
+            .as("first connection taken")
+            .isTrue();
 
         // no message there, yet
-        assertNull("no mail received by mail server", queue.getLastMail());
+        assertThat(queue.getLastMail())
+            .as("no mail received by mail server")
+            .isNull();
 
         String sender1 = "mail_sender1@localhost";
 
@@ -1038,11 +1142,15 @@ public class SMTPServerTest {
 
         smtpProtocol.sendCommand("AUTH PLAIN");
 
-        assertEquals("start auth.", 334, smtpProtocol.getReplyCode());
+        assertThat(smtpProtocol.getReplyCode())
+            .as("start auth.")
+            .isEqualTo(334);
 
         smtpProtocol.sendCommand("*");
 
-        assertEquals("cancel auth.", 501, smtpProtocol.getReplyCode());
+        assertThat(smtpProtocol.getReplyCode())
+            .as("cancel auth.")
+            .isEqualTo(501);
 
         smtpProtocol.quit();
 
@@ -1066,7 +1174,9 @@ public class SMTPServerTest {
             capabilitieslist.add(capabilityRes[i].substring(4));
         }
 
-        assertTrue("anouncing auth required", capabilitieslist.contains("AUTH LOGIN PLAIN"));
+        assertThat(capabilitieslist.contains("AUTH LOGIN PLAIN"))
+            .as("anouncing auth required")
+            .isTrue();
         // is this required or just for compatibility?
         // assertTrue("anouncing auth required",
         // capabilitieslist.contains("AUTH=LOGIN PLAIN"));
@@ -1075,32 +1185,46 @@ public class SMTPServerTest {
         String noexistUserName = "noexist_test_user_smtp";
         String sender = "test_user_smtp@localhost";
         smtpProtocol.sendCommand("AUTH FOO", null);
-        assertEquals("expected error: unrecognized authentication type", 504, smtpProtocol.getReplyCode());
+        assertThat(smtpProtocol.getReplyCode())
+            .as("expected error: unrecognized authentication type")
+            .isEqualTo(504);
 
         smtpProtocol.setSender(sender);
 
         smtpProtocol.addRecipient("mail@sample.com");
-        assertEquals("expected 530 error", 530, smtpProtocol.getReplyCode());
+        assertThat(smtpProtocol.getReplyCode())
+            .as("expected 530 error")
+            .isEqualTo(530);
 
-        assertFalse("user not existing", usersRepository.contains(noexistUserName));
+        assertThat(usersRepository.contains(noexistUserName))
+            .as("user not existing")
+            .isFalse();
 
         smtpProtocol.sendCommand("AUTH PLAIN");
         smtpProtocol.sendCommand(Base64.encodeAsString("\0" + noexistUserName + "\0pwd\0"));
         // smtpProtocol.sendCommand(noexistUserName+"pwd".toCharArray());
-        assertEquals("expected error", 535, smtpProtocol.getReplyCode());
+        assertThat(smtpProtocol.getReplyCode())
+            .as("expected error")
+            .isEqualTo(535);
 
         usersRepository.addUser(userName, "pwd");
 
         smtpProtocol.sendCommand("AUTH PLAIN");
         smtpProtocol.sendCommand(Base64.encodeAsString("\0" + userName + "\0wrongpwd\0"));
-        assertEquals("expected error", 535, smtpProtocol.getReplyCode());
+        assertThat(smtpProtocol.getReplyCode())
+            .as("expected error")
+            .isEqualTo(535);
 
         smtpProtocol.sendCommand("AUTH PLAIN");
         smtpProtocol.sendCommand(Base64.encodeAsString("\0" + userName + "\0pwd\0"));
-        assertEquals("authenticated", 235, smtpProtocol.getReplyCode());
+        assertThat(smtpProtocol.getReplyCode())
+            .as("authenticated")
+            .isEqualTo(235);
 
         smtpProtocol.sendCommand("AUTH PLAIN");
-        assertEquals("expected error: User has previously authenticated.", 503, smtpProtocol.getReplyCode());
+        assertThat(smtpProtocol.getReplyCode())
+            .as("expected error: User has previously authenticated.")
+            .isEqualTo(503);
 
         smtpProtocol.addRecipient("mail@sample.com");
         smtpProtocol.sendShortMessageData("Subject: test\r\n\r\nTest body testAuth\r\n");
@@ -1108,7 +1232,9 @@ public class SMTPServerTest {
         smtpProtocol.quit();
 
         // mail was propagated by SMTPServer
-        assertNotNull("mail received by mail server", queue.getLastMail());
+        assertThat(queue.getLastMail())
+            .as("mail received by mail server")
+            .isNotNull();
     }
 
     @Test
@@ -1129,10 +1255,14 @@ public class SMTPServerTest {
 
         smtpProtocol.sendCommand("AUTH PLAIN");
         smtpProtocol.sendCommand(Base64.encodeAsString("\0" + userName + "\0pwd\0"));
-        assertEquals("authenticated", 235, smtpProtocol.getReplyCode());
+        assertThat(smtpProtocol.getReplyCode())
+            .as("authenticated")
+            .isEqualTo(235);
 
         smtpProtocol.addRecipient("mail@sample.com");
-        assertEquals("expected error", 503, smtpProtocol.getReplyCode());
+        assertThat(smtpProtocol.getReplyCode())
+            .as("expected error")
+            .isEqualTo(503);
 
         smtpProtocol.quit();
     }
@@ -1151,12 +1281,16 @@ public class SMTPServerTest {
         // left out for test smtpProtocol.rcpt(new Address("mail@localhost"));
 
         smtpProtocol.sendShortMessageData("Subject: test\r\n\r\nTest body testNoRecepientSpecified\r\n");
-        assertTrue("sending succeeded without recepient", SMTPReply.isNegativePermanent(smtpProtocol.getReplyCode()));
+        assertThat(SMTPReply.isNegativePermanent(smtpProtocol.getReplyCode()))
+            .as("sending succeeded without recepient")
+            .isTrue();
 
         smtpProtocol.quit();
 
         // mail was propagated by SMTPServer
-        assertNull("no mail received by mail server", queue.getLastMail());
+        assertThat(queue.getLastMail())
+            .as("no mail received by mail server")
+            .isNull();
     }
 
     @Test
@@ -1177,7 +1311,9 @@ public class SMTPServerTest {
         smtpProtocol.quit();
 
         // mail was propagated by SMTPServer
-        assertNull("no mail received by mail server", queue.getLastMail());
+        assertThat(queue.getLastMail())
+            .as("no mail received by mail server")
+            .isNull();
     }
 
     @Test
@@ -1193,7 +1329,9 @@ public class SMTPServerTest {
         smtpProtocol.setSender("mail@sample.com");
 
         smtpProtocol.addRecipient("maila@sample.com");
-        assertEquals("expected 550 error", 550, smtpProtocol.getReplyCode());
+        assertThat(smtpProtocol.getReplyCode())
+            .as("expected 550 error")
+            .isEqualTo(550);
     }
 
     @Test
@@ -1207,10 +1345,14 @@ public class SMTPServerTest {
         smtpProtocol.sendCommand("ehlo " + InetAddress.getLocalHost());
 
         smtpProtocol.sendCommand("MAIL FROM:<ma...@localhost> SIZE=1025", null);
-        assertEquals("expected error: max msg size exceeded", 552, smtpProtocol.getReplyCode());
+        assertThat(smtpProtocol.getReplyCode())
+            .as("expected error: max msg size exceeded")
+            .isEqualTo(552);
 
         smtpProtocol.addRecipient("mail@localhost");
-        assertEquals("expected error", 503, smtpProtocol.getReplyCode());
+        assertThat(smtpProtocol.getReplyCode())
+            .as("expected error")
+            .isEqualTo(503);
     }
 
     public void testHandleMessageSizeLimitExceeded() throws Exception {
@@ -1242,9 +1384,12 @@ public class SMTPServerTest {
         wr.write("123456781012345678201\r\n"); // 521 + CRLF = 523 + 502 => 1025
         wr.close();
 
-        assertFalse(smtpProtocol.completePendingCommand());
+        assertThat(smtpProtocol.completePendingCommand())
+            .isFalse();
 
-        assertEquals("expected 552 error", 552, smtpProtocol.getReplyCode());
+        assertThat(smtpProtocol.getReplyCode())
+            .as("expected 552 error")
+            .isEqualTo(552);
 
     }
 
@@ -1276,9 +1421,12 @@ public class SMTPServerTest {
         wr.write("1234567810123456782012\r\n"); // 1022 + CRLF = 1024
         wr.close();
 
-        assertTrue(smtpProtocol.completePendingCommand());
+        assertThat(smtpProtocol.completePendingCommand())
+            .isTrue();
 
-        assertEquals("expected 250 ok", 250, smtpProtocol.getReplyCode());
+        assertThat(smtpProtocol.getReplyCode())
+            .as("expected 250 ok")
+            .isEqualTo(250);
 
     }
     // Check if auth users get not rejected cause rbl. See JAMES-566
@@ -1303,7 +1451,9 @@ public class SMTPServerTest {
             capabilitieslist.add(capabilityRes[i].substring(4));
         }
 
-        assertTrue("anouncing auth required", capabilitieslist.contains("AUTH LOGIN PLAIN"));
+        assertThat(capabilitieslist.contains("AUTH LOGIN PLAIN"))
+            .as("anouncing auth required")
+            .isTrue();
         // is this required or just for compatibility? assertTrue("anouncing
         // auth required", capabilitieslist.contains("AUTH=LOGIN PLAIN"));
 
@@ -1316,17 +1466,23 @@ public class SMTPServerTest {
 
         smtpProtocol.sendCommand("AUTH PLAIN");
         smtpProtocol.sendCommand(Base64.encodeAsString("\0" + userName + "\0pwd\0"));
-        assertEquals("authenticated", 235, smtpProtocol.getReplyCode());
+        assertThat(smtpProtocol.getReplyCode())
+            .as("authenticated")
+            .isEqualTo(235);
 
         smtpProtocol.addRecipient("mail@sample.com");
-        assertEquals("authenticated.. not reject", 250, smtpProtocol.getReplyCode());
+        assertThat(smtpProtocol.getReplyCode())
+            .as("authenticated.. not reject")
+            .isEqualTo(250);
 
         smtpProtocol.sendShortMessageData("Subject: test\r\n\r\nTest body testDNSRBLNotRejectAuthUser\r\n");
 
         smtpProtocol.quit();
 
         // mail was propagated by SMTPServer
-        assertNotNull("mail received by mail server", queue.getLastMail());
+        assertThat(queue.getLastMail())
+            .as("mail received by mail server")
+            .isNotNull();
     }
 
     @Test
@@ -1347,14 +1503,18 @@ public class SMTPServerTest {
         smtpProtocol.setSender(sender);
 
         smtpProtocol.addRecipient("mail@sample.com");
-        assertEquals("reject", 554, smtpProtocol.getReplyCode());
+        assertThat(smtpProtocol.getReplyCode())
+            .as("reject")
+            .isEqualTo(554);
 
         smtpProtocol.sendShortMessageData("Subject: test\r\n\r\nTest body testDNSRBLRejectWorks\r\n");
 
         smtpProtocol.quit();
 
         // mail was rejected by SMTPServer
-        assertNull("mail reject by mail server", queue.getLastMail());
+        assertThat(queue.getLastMail())
+            .as("mail reject by mail server")
+            .isNull();
     }
 
     @Test
@@ -1367,10 +1527,14 @@ public class SMTPServerTest {
         smtpProtocol.sendCommand("ehlo", InetAddress.getLocalHost().toString());
 
         smtpProtocol.sendCommand("mail from:", "test@localhost");
-        assertEquals("accept", 250, smtpProtocol.getReplyCode());
+        assertThat(smtpProtocol.getReplyCode())
+            .as("accept")
+            .isEqualTo(250);
 
         smtpProtocol.sendCommand("rcpt to:", "mail@sample.com");
-        assertEquals("accept", 250, smtpProtocol.getReplyCode());
+        assertThat(smtpProtocol.getReplyCode())
+            .as("accept")
+            .isEqualTo(250);
 
         smtpProtocol.quit();
 
@@ -1379,10 +1543,14 @@ public class SMTPServerTest {
         smtpProtocol.sendCommand("ehlo", InetAddress.getLocalHost().toString());
 
         smtpProtocol.sendCommand("mail from:", "<te...@localhost>");
-        assertEquals("accept", 250, smtpProtocol.getReplyCode());
+        assertThat(smtpProtocol.getReplyCode())
+            .as("accept")
+            .isEqualTo(250);
 
         smtpProtocol.sendCommand("rcpt to:", "<ma...@sample.com>");
-        assertEquals("accept", 250, smtpProtocol.getReplyCode());
+        assertThat(smtpProtocol.getReplyCode())
+            .as("accept")
+            .isEqualTo(250);
 
         smtpProtocol.quit();
     }
@@ -1396,14 +1564,22 @@ public class SMTPServerTest {
         smtpProtocol.sendCommand("ehlo", InetAddress.getLocalHost().toString());
 
         smtpProtocol.sendCommand("mail from:", "test@localhost");
-        assertEquals("reject", 501, smtpProtocol.getReplyCode());
+        assertThat(smtpProtocol.getReplyCode())
+            .as("reject")
+            .isEqualTo(501);
         smtpProtocol.sendCommand("mail from:", "<te...@localhost>");
-        assertEquals("accept", 250, smtpProtocol.getReplyCode());
+        assertThat(smtpProtocol.getReplyCode())
+            .as("accept")
+            .isEqualTo(250);
 
         smtpProtocol.sendCommand("rcpt to:", "mail@sample.com");
-        assertEquals("reject", 501, smtpProtocol.getReplyCode());
+        assertThat(smtpProtocol.getReplyCode())
+            .as("reject")
+            .isEqualTo(501);
         smtpProtocol.sendCommand("rcpt to:", "<ma...@sample.com>");
-        assertEquals("accept", 250, smtpProtocol.getReplyCode());
+        assertThat(smtpProtocol.getReplyCode())
+            .as("accept")
+            .isEqualTo(250);
 
         smtpProtocol.quit();
     }
@@ -1441,12 +1617,24 @@ public class SMTPServerTest {
 
         BufferedReader in = new BufferedReader(new InputStreamReader(client.getInputStream()));
 
-        assertEquals("Connection made", 220, Integer.parseInt(in.readLine().split(" ")[0]));
-        assertEquals("HELO accepted", 250, Integer.parseInt(in.readLine().split(" ")[0]));
-        assertEquals("MAIL FROM accepted", 250, Integer.parseInt(in.readLine().split(" ")[0]));
-        assertEquals("RCPT TO accepted", 250, Integer.parseInt(in.readLine().split(" ")[0]));
-        assertEquals("DATA accepted", 354, Integer.parseInt(in.readLine().split(" ")[0]));
-        assertEquals("Message accepted", 250, Integer.parseInt(in.readLine().split(" ")[0]));
+        assertThat(Integer.parseInt(in.readLine().split(" ")[0]))
+            .as("Connection made")
+            .isEqualTo(220);
+        assertThat(Integer.parseInt(in.readLine().split(" ")[0]))
+            .as("HELO accepted")
+            .isEqualTo(250);
+        assertThat(Integer.parseInt(in.readLine().split(" ")[0]))
+            .as("MAIL FROM accepted")
+            .isEqualTo(250);
+        assertThat(Integer.parseInt(in.readLine().split(" ")[0]))
+            .as("RCPT TO accepted")
+            .isEqualTo(250);
+        assertThat(Integer.parseInt(in.readLine().split(" ")[0]))
+            .as("DATA accepted")
+            .isEqualTo(354);
+        assertThat(Integer.parseInt(in.readLine().split(" ")[0]))
+            .as("Message accepted")
+            .isEqualTo(250);
         in.close();
         out.close();
         client.close();
@@ -1488,12 +1676,24 @@ public class SMTPServerTest {
 
         BufferedReader in = new BufferedReader(new InputStreamReader(client.getInputStream()));
 
-        assertEquals("Connection made", 220, Integer.parseInt(in.readLine().split(" ")[0]));
-        assertEquals("HELO accepted", 250, Integer.parseInt(in.readLine().split(" ")[0]));
-        assertEquals("MAIL FROM accepted", 250, Integer.parseInt(in.readLine().split(" ")[0]));
-        assertEquals("RCPT TO rejected", 550, Integer.parseInt(in.readLine().split(" ")[0]));
-        assertEquals("RCPT TO rejected", 550, Integer.parseInt(in.readLine().split(" ")[0]));
-        assertEquals("DATA not accepted", 503, Integer.parseInt(in.readLine().split(" ")[0]));
+        assertThat(Integer.parseInt(in.readLine().split(" ")[0]))
+            .as("Connection made")
+            .isEqualTo(220);
+        assertThat(Integer.parseInt(in.readLine().split(" ")[0]))
+            .as("HELO accepted")
+            .isEqualTo(250);
+        assertThat(Integer.parseInt(in.readLine().split(" ")[0]))
+            .as("MAIL FROM accepted")
+            .isEqualTo(250);
+        assertThat(Integer.parseInt(in.readLine().split(" ")[0]))
+            .as("RCPT TO rejected")
+            .isEqualTo(550);
+        assertThat(Integer.parseInt(in.readLine().split(" ")[0]))
+            .as("RCPT TO rejected")
+            .isEqualTo(550);
+        assertThat(Integer.parseInt(in.readLine().split(" ")[0]))
+            .as("DATA not accepted")
+            .isEqualTo(503);
         in.close();
         out.close();
         client.close();
@@ -1534,13 +1734,27 @@ public class SMTPServerTest {
 
         BufferedReader in = new BufferedReader(new InputStreamReader(client.getInputStream()));
 
-        assertEquals("Connection made", 220, Integer.parseInt(in.readLine().split(" ")[0]));
-        assertEquals("HELO accepted", 250, Integer.parseInt(in.readLine().split(" ")[0]));
-        assertEquals("MAIL FROM accepted", 250, Integer.parseInt(in.readLine().split(" ")[0]));
-        assertEquals("RCPT TO rejected", 550, Integer.parseInt(in.readLine().split(" ")[0]));
-        assertEquals("RCPT accepted", 250, Integer.parseInt(in.readLine().split(" ")[0]));
-        assertEquals("DATA accepted", 354, Integer.parseInt(in.readLine().split(" ")[0]));
-        assertEquals("Message accepted", 250, Integer.parseInt(in.readLine().split(" ")[0]));
+        assertThat(Integer.parseInt(in.readLine().split(" ")[0]))
+            .as("Connection made")
+            .isEqualTo(220);
+        assertThat(Integer.parseInt(in.readLine().split(" ")[0]))
+            .as("HELO accepted")
+            .isEqualTo(250);
+        assertThat(Integer.parseInt(in.readLine().split(" ")[0]))
+            .as("MAIL FROM accepted")
+            .isEqualTo(250);
+        assertThat(Integer.parseInt(in.readLine().split(" ")[0]))
+            .as("RCPT TO rejected")
+            .isEqualTo(550);
+        assertThat(Integer.parseInt(in.readLine().split(" ")[0]))
+            .as("RCPT accepted")
+            .isEqualTo(250);
+        assertThat(Integer.parseInt(in.readLine().split(" ")[0]))
+            .as("DATA accepted")
+            .isEqualTo(354);
+        assertThat(Integer.parseInt(in.readLine().split(" ")[0]))
+            .as("Message accepted")
+            .isEqualTo(250);
         in.close();
         out.close();
         client.close();


---------------------------------------------------------------------
To unsubscribe, e-mail: server-dev-unsubscribe@james.apache.org
For additional commands, e-mail: server-dev-help@james.apache.org


[02/12] james-project git commit: JAMES-1862 Remove TODO note on commons-net fix

Posted by ad...@apache.org.
JAMES-1862 Remove TODO note on commons-net fix


Project: http://git-wip-us.apache.org/repos/asf/james-project/repo
Commit: http://git-wip-us.apache.org/repos/asf/james-project/commit/8633537d
Tree: http://git-wip-us.apache.org/repos/asf/james-project/tree/8633537d
Diff: http://git-wip-us.apache.org/repos/asf/james-project/diff/8633537d

Branch: refs/heads/master
Commit: 8633537d9c82f15c155c9ec36201e7144b3bb223
Parents: 76f9d61
Author: Antoine Duprat <ad...@apache.org>
Authored: Wed Nov 30 10:04:30 2016 +0100
Committer: Antoine Duprat <ad...@apache.org>
Committed: Thu Dec 1 14:17:02 2016 +0100

----------------------------------------------------------------------
 .../james/protocols/smtp/AbstractStartTlsSMTPServerTest.java  | 7 ++-----
 1 file changed, 2 insertions(+), 5 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/james-project/blob/8633537d/protocols/smtp/src/test/java/org/apache/james/protocols/smtp/AbstractStartTlsSMTPServerTest.java
----------------------------------------------------------------------
diff --git a/protocols/smtp/src/test/java/org/apache/james/protocols/smtp/AbstractStartTlsSMTPServerTest.java b/protocols/smtp/src/test/java/org/apache/james/protocols/smtp/AbstractStartTlsSMTPServerTest.java
index 626cb17..02f87ec 100644
--- a/protocols/smtp/src/test/java/org/apache/james/protocols/smtp/AbstractStartTlsSMTPServerTest.java
+++ b/protocols/smtp/src/test/java/org/apache/james/protocols/smtp/AbstractStartTlsSMTPServerTest.java
@@ -97,11 +97,8 @@ public abstract class AbstractStartTlsSMTPServerTest {
             
             assertTrue(client.execTLS());
             
-            // TODO: Add back once commons-net 3.1.0 was released.
-            // See: NET-421
-            //
-            //client.quit();
-            //assertTrue("Reply="+ client.getReplyString(), SMTPReply.isPositiveCompletion(client.getReplyCode()));
+            client.quit();
+            assertTrue("Reply="+ client.getReplyString(), SMTPReply.isPositiveCompletion(client.getReplyCode()));
             
             client.disconnect();
 


---------------------------------------------------------------------
To unsubscribe, e-mail: server-dev-unsubscribe@james.apache.org
For additional commands, e-mail: server-dev-help@james.apache.org


[10/12] james-project git commit: JAMES-1862 Dont frame SMTP commands when STARTTLS is present

Posted by ad...@apache.org.
JAMES-1862 Dont frame SMTP commands when STARTTLS is present


Project: http://git-wip-us.apache.org/repos/asf/james-project/repo
Commit: http://git-wip-us.apache.org/repos/asf/james-project/commit/b4f1ed6a
Tree: http://git-wip-us.apache.org/repos/asf/james-project/tree/b4f1ed6a
Diff: http://git-wip-us.apache.org/repos/asf/james-project/diff/b4f1ed6a

Branch: refs/heads/master
Commit: b4f1ed6ab5ad08feb1d4ad3ac5ef7aa2a2b7a893
Parents: b61399a
Author: Antoine Duprat <ad...@apache.org>
Authored: Thu Dec 1 13:38:42 2016 +0100
Committer: Antoine Duprat <ad...@linagora.com>
Committed: Tue Dec 6 11:31:26 2016 +0100

----------------------------------------------------------------------
 protocols/smtp/pom.xml                          |  4 ++
 .../AllButStartTlsDelimiterChannelHandler.java  | 53 ++++++++++++++++++++
 .../smtp/CommandInjectionDetectedException.java | 23 +++++++++
 .../smtp/netty/NettyStartTlsSMTPServerTest.java | 18 ++++++-
 .../james/smtpserver/netty/SMTPServer.java      |  4 +-
 .../apache/james/smtpserver/SMTPServerTest.java | 40 +++++++++++++++
 6 files changed, 138 insertions(+), 4 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/james-project/blob/b4f1ed6a/protocols/smtp/pom.xml
----------------------------------------------------------------------
diff --git a/protocols/smtp/pom.xml b/protocols/smtp/pom.xml
index aaf2b49..a9f913f 100644
--- a/protocols/smtp/pom.xml
+++ b/protocols/smtp/pom.xml
@@ -64,6 +64,10 @@
             <scope>test</scope>
         </dependency>
         <dependency>
+            <groupId>io.netty</groupId>
+            <artifactId>netty</artifactId>
+        </dependency>
+        <dependency>
             <groupId>junit</groupId>
             <artifactId>junit</artifactId>
             <scope>test</scope>

http://git-wip-us.apache.org/repos/asf/james-project/blob/b4f1ed6a/protocols/smtp/src/main/java/org/apache/james/protocols/smtp/AllButStartTlsDelimiterChannelHandler.java
----------------------------------------------------------------------
diff --git a/protocols/smtp/src/main/java/org/apache/james/protocols/smtp/AllButStartTlsDelimiterChannelHandler.java b/protocols/smtp/src/main/java/org/apache/james/protocols/smtp/AllButStartTlsDelimiterChannelHandler.java
new file mode 100644
index 0000000..ad0db9c
--- /dev/null
+++ b/protocols/smtp/src/main/java/org/apache/james/protocols/smtp/AllButStartTlsDelimiterChannelHandler.java
@@ -0,0 +1,53 @@
+/****************************************************************
+ * Licensed to the Apache Software Foundation (ASF) under one   *
+ * or more contributor license agreements.  See the NOTICE file *
+ * distributed with this work for additional information        *
+ * regarding copyright ownership.  The ASF licenses this file   *
+ * to you under the Apache License, Version 2.0 (the            *
+ * "License"); you may not use this file except in compliance   *
+ * with the License.  You may obtain a copy of the License at   *
+ *                                                              *
+ *   http://www.apache.org/licenses/LICENSE-2.0                 *
+ *                                                              *
+ * Unless required by applicable law or agreed to in writing,   *
+ * software distributed under the License is distributed on an  *
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY       *
+ * KIND, either express or implied.  See the License for the    *
+ * specific language governing permissions and limitations      *
+ * under the License.                                           *
+ ****************************************************************/
+package org.apache.james.protocols.smtp;
+
+import org.jboss.netty.buffer.ChannelBuffer;
+import org.jboss.netty.channel.Channel;
+import org.jboss.netty.channel.ChannelHandlerContext;
+import org.jboss.netty.handler.codec.frame.DelimiterBasedFrameDecoder;
+
+import com.google.common.base.Charsets;
+
+public class AllButStartTlsDelimiterChannelHandler extends DelimiterBasedFrameDecoder {
+
+    private static final String STARTTLS = "starttls";
+
+    public AllButStartTlsDelimiterChannelHandler(int maxFrameLength, boolean stripDelimiter, ChannelBuffer[] delimiters) {
+        super(maxFrameLength, stripDelimiter, delimiters);
+    }
+
+    @Override
+    protected Object decode(ChannelHandlerContext ctx, Channel channel, ChannelBuffer buffer) throws Exception {
+        String trimedLowerCasedInput = readAll(buffer).trim().toLowerCase();
+        if (hasCommandInjection(trimedLowerCasedInput)) {
+            throw new CommandInjectionDetectedException();
+        }
+        return super.decode(ctx, channel, buffer);
+    }
+
+    private String readAll(ChannelBuffer buffer) {
+        return buffer.toString(Charsets.US_ASCII);
+    }
+
+    private boolean hasCommandInjection(String trimedLowerCasedInput) {
+        return trimedLowerCasedInput.contains(STARTTLS)
+                && !trimedLowerCasedInput.endsWith(STARTTLS);
+    }
+}

http://git-wip-us.apache.org/repos/asf/james-project/blob/b4f1ed6a/protocols/smtp/src/main/java/org/apache/james/protocols/smtp/CommandInjectionDetectedException.java
----------------------------------------------------------------------
diff --git a/protocols/smtp/src/main/java/org/apache/james/protocols/smtp/CommandInjectionDetectedException.java b/protocols/smtp/src/main/java/org/apache/james/protocols/smtp/CommandInjectionDetectedException.java
new file mode 100644
index 0000000..1c15346
--- /dev/null
+++ b/protocols/smtp/src/main/java/org/apache/james/protocols/smtp/CommandInjectionDetectedException.java
@@ -0,0 +1,23 @@
+/****************************************************************
+ * Licensed to the Apache Software Foundation (ASF) under one   *
+ * or more contributor license agreements.  See the NOTICE file *
+ * distributed with this work for additional information        *
+ * regarding copyright ownership.  The ASF licenses this file   *
+ * to you under the Apache License, Version 2.0 (the            *
+ * "License"); you may not use this file except in compliance   *
+ * with the License.  You may obtain a copy of the License at   *
+ *                                                              *
+ *   http://www.apache.org/licenses/LICENSE-2.0                 *
+ *                                                              *
+ * Unless required by applicable law or agreed to in writing,   *
+ * software distributed under the License is distributed on an  *
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY       *
+ * KIND, either express or implied.  See the License for the    *
+ * specific language governing permissions and limitations      *
+ * under the License.                                           *
+ ****************************************************************/
+package org.apache.james.protocols.smtp;
+
+public class CommandInjectionDetectedException extends RuntimeException {
+
+}

http://git-wip-us.apache.org/repos/asf/james-project/blob/b4f1ed6a/protocols/smtp/src/test/java/org/apache/james/protocols/smtp/netty/NettyStartTlsSMTPServerTest.java
----------------------------------------------------------------------
diff --git a/protocols/smtp/src/test/java/org/apache/james/protocols/smtp/netty/NettyStartTlsSMTPServerTest.java b/protocols/smtp/src/test/java/org/apache/james/protocols/smtp/netty/NettyStartTlsSMTPServerTest.java
index e8c16af..161985c 100644
--- a/protocols/smtp/src/test/java/org/apache/james/protocols/smtp/netty/NettyStartTlsSMTPServerTest.java
+++ b/protocols/smtp/src/test/java/org/apache/james/protocols/smtp/netty/NettyStartTlsSMTPServerTest.java
@@ -44,12 +44,12 @@ import org.apache.james.protocols.api.utils.MockLogger;
 import org.apache.james.protocols.api.utils.TestUtils;
 import org.apache.james.protocols.netty.AbstractChannelPipelineFactory;
 import org.apache.james.protocols.netty.NettyServer;
+import org.apache.james.protocols.smtp.AllButStartTlsDelimiterChannelHandler;
 import org.apache.james.protocols.smtp.SMTPConfigurationImpl;
 import org.apache.james.protocols.smtp.SMTPProtocol;
 import org.apache.james.protocols.smtp.SMTPProtocolHandlerChain;
 import org.apache.james.protocols.smtp.utils.TestMessageHook;
 import org.assertj.core.api.AssertDelegateTarget;
-import org.jboss.netty.handler.codec.frame.DelimiterBasedFrameDecoder;
 import org.jboss.netty.handler.codec.frame.Delimiters;
 import org.junit.After;
 import org.junit.Test;
@@ -72,7 +72,7 @@ public class NettyStartTlsSMTPServerTest {
         NettyServer server = NettyServer.builder()
                 .protocol(protocol)
                 .secure(enc)
-                .frameHandler(new DelimiterBasedFrameDecoder(AbstractChannelPipelineFactory.MAX_LINE_LENGTH, false, Delimiters.lineDelimiter()))
+                .frameHandler(new AllButStartTlsDelimiterChannelHandler(AbstractChannelPipelineFactory.MAX_LINE_LENGTH, false, Delimiters.lineDelimiter()))
                 .build();
         server.setListenAddresses(address);
         return server;
@@ -176,6 +176,20 @@ public class NettyStartTlsSMTPServerTest {
     }
 
     @Test
+    public void startTlsShouldFailWhenFollowedByInjectedCommand() throws Exception {
+        InetSocketAddress address = new InetSocketAddress("127.0.0.1", TestUtils.getFreePort());
+        ProtocolServer server = createServer(createProtocol(Optional.<ProtocolHandler> absent()), address, Encryption.createStartTls(BogusSslContextFactory.getServerContext()));  
+        server.bind();
+
+        SMTPSClient client = createClient();
+        client.connect(address.getAddress().getHostAddress(), address.getPort());
+        client.sendCommand("EHLO localhost");
+
+        client.sendCommand("STARTTLS\r\nRSET\r\n");
+        assertThat(SMTPReply.isPositiveCompletion(client.getReplyCode())).isFalse();
+    }
+
+    @Test
     public void startTlsShouldWorkWhenUsingJavamail() throws Exception {
         TestMessageHook hook = new TestMessageHook();
         InetSocketAddress address = new InetSocketAddress("127.0.0.1", TestUtils.getFreePort());

http://git-wip-us.apache.org/repos/asf/james-project/blob/b4f1ed6a/server/protocols/protocols-smtp/src/main/java/org/apache/james/smtpserver/netty/SMTPServer.java
----------------------------------------------------------------------
diff --git a/server/protocols/protocols-smtp/src/main/java/org/apache/james/smtpserver/netty/SMTPServer.java b/server/protocols/protocols-smtp/src/main/java/org/apache/james/smtpserver/netty/SMTPServer.java
index c7d291c..cad8941 100644
--- a/server/protocols/protocols-smtp/src/main/java/org/apache/james/smtpserver/netty/SMTPServer.java
+++ b/server/protocols/protocols-smtp/src/main/java/org/apache/james/smtpserver/netty/SMTPServer.java
@@ -30,6 +30,7 @@ import org.apache.james.protocols.api.logger.ProtocolLoggerAdapter;
 import org.apache.james.protocols.lib.handler.HandlersPackage;
 import org.apache.james.protocols.lib.netty.AbstractProtocolAsyncServer;
 import org.apache.james.protocols.netty.AbstractChannelPipelineFactory;
+import org.apache.james.protocols.smtp.AllButStartTlsDelimiterChannelHandler;
 import org.apache.james.protocols.smtp.SMTPConfiguration;
 import org.apache.james.protocols.smtp.SMTPProtocol;
 import org.apache.james.smtpserver.CoreCmdHandlerLoader;
@@ -37,7 +38,6 @@ import org.apache.james.smtpserver.ExtendedSMTPSession;
 import org.apache.james.smtpserver.jmx.JMXHandlersLoader;
 import org.jboss.netty.channel.ChannelHandler;
 import org.jboss.netty.channel.ChannelUpstreamHandler;
-import org.jboss.netty.handler.codec.frame.DelimiterBasedFrameDecoder;
 import org.jboss.netty.handler.codec.frame.Delimiters;
 
 /**
@@ -365,7 +365,7 @@ public class SMTPServer extends AbstractProtocolAsyncServer implements SMTPServe
 
     @Override
     protected ChannelHandler createFrameHandler() {
-        return new DelimiterBasedFrameDecoder(AbstractChannelPipelineFactory.MAX_LINE_LENGTH, false, Delimiters.lineDelimiter());
+        return new AllButStartTlsDelimiterChannelHandler(AbstractChannelPipelineFactory.MAX_LINE_LENGTH, false, Delimiters.lineDelimiter());
     }
 
 }

http://git-wip-us.apache.org/repos/asf/james-project/blob/b4f1ed6a/server/protocols/protocols-smtp/src/test/java/org/apache/james/smtpserver/SMTPServerTest.java
----------------------------------------------------------------------
diff --git a/server/protocols/protocols-smtp/src/test/java/org/apache/james/smtpserver/SMTPServerTest.java b/server/protocols/protocols-smtp/src/test/java/org/apache/james/smtpserver/SMTPServerTest.java
index 578b824..0efae7d 100644
--- a/server/protocols/protocols-smtp/src/test/java/org/apache/james/smtpserver/SMTPServerTest.java
+++ b/server/protocols/protocols-smtp/src/test/java/org/apache/james/smtpserver/SMTPServerTest.java
@@ -499,6 +499,46 @@ public class SMTPServerTest {
 
     }
 
+    @Test
+    public void startTlsCommandShouldWorkWhenAlone() throws Exception {
+        smtpConfiguration.setStartTLS();
+        init(smtpConfiguration);
+
+        SMTPClient smtpProtocol = new SMTPClient();
+        smtpProtocol.connect("127.0.0.1", smtpListenerPort);
+
+        // no message there, yet
+        assertThat(queue.getLastMail())
+            .as("no mail received by mail server")
+            .isNull();;
+
+        smtpProtocol.sendCommand("EHLO " + InetAddress.getLocalHost());
+        smtpProtocol.sendCommand("STARTTLS");
+        assertThat(smtpProtocol.getReplyCode()).isEqualTo(220);
+        
+        smtpProtocol.disconnect();
+    }
+
+    @Test
+    public void startTlsCommandShouldFailWhenFollowedByInjectedCommand() throws Exception {
+        smtpConfiguration.setStartTLS();
+        init(smtpConfiguration);
+
+        SMTPClient smtpProtocol = new SMTPClient();
+        smtpProtocol.connect("127.0.0.1", smtpListenerPort);
+
+        // no message there, yet
+        assertThat(queue.getLastMail())
+            .as("no mail received by mail server")
+            .isNull();;
+
+        smtpProtocol.sendCommand("EHLO " + InetAddress.getLocalHost());
+        smtpProtocol.sendCommand("STARTTLS\r\nAUTH PLAIN");
+        assertThat(smtpProtocol.getReplyCode()).isEqualTo(451);
+        
+        smtpProtocol.disconnect();
+    }
+
     protected SMTPClient newSMTPClient() throws IOException {
         SMTPClient smtp = new SMTPClient();
         smtp.connect("127.0.0.1", smtpListenerPort);


---------------------------------------------------------------------
To unsubscribe, e-mail: server-dev-unsubscribe@james.apache.org
For additional commands, e-mail: server-dev-help@james.apache.org