Repository: james-project
Updated Branches:
  refs/heads/master 0ecf6d6a0 -> 71f89a8f8


JAMES-1954 Disablecommand injection detection on DATA


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

Branch: refs/heads/master
Commit: 81fc006154c3bf2a136006a27c5501bc3d153583
Parents: 381f2d7
Author: benwa <btell...@linagora.com>
Authored: Mon Mar 6 16:58:30 2017 +0700
Committer: benwa <btell...@linagora.com>
Committed: Mon Mar 13 18:32:07 2017 +0700

----------------------------------------------------------------------
 .../netty/AbstractChannelPipelineFactory.java       |  2 +-
 .../protocols/netty/ChannelHandlerFactory.java      |  3 ++-
 .../LineDelimiterBasedChannelHandlerFactory.java    |  3 ++-
 .../smtp/AllButStartTlsDelimiterChannelHandler.java | 16 ++++++++++++----
 ...tStartTlsLineDelimiterChannelHandlerFactory.java |  5 +++--
 .../apache/james/protocols/smtp/SMTPSession.java    |  6 ++++++
 .../james/protocols/smtp/SMTPSessionImpl.java       | 16 ++++++++++++++++
 .../james/protocols/smtp/core/DataCmdHandler.java   |  3 ++-
 .../protocols/smtp/utils/BaseFakeSMTPSession.java   | 15 +++++++++++++++
 .../apache/james/imapserver/netty/IMAPServer.java   |  2 +-
 ...chableLineDelimiterBasedFrameDecoderFactory.java |  3 ++-
 .../managesieveserver/netty/ManageSieveServer.java  |  2 +-
 12 files changed, 63 insertions(+), 13 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/james-project/blob/81fc0061/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 04a91ac..a09e665 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
@@ -73,7 +73,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, 
frameHandlerFactory.create());
+        pipeline.addLast(HandlerConstants.FRAMER, 
frameHandlerFactory.create(pipeline));
        
         // Add the ChunkedWriteHandler to be able to write ChunkInput
         pipeline.addLast(HandlerConstants.CHUNK_HANDLER, new 
ChunkedWriteHandler());

http://git-wip-us.apache.org/repos/asf/james-project/blob/81fc0061/protocols/netty/src/main/java/org/apache/james/protocols/netty/ChannelHandlerFactory.java
----------------------------------------------------------------------
diff --git 
a/protocols/netty/src/main/java/org/apache/james/protocols/netty/ChannelHandlerFactory.java
 
b/protocols/netty/src/main/java/org/apache/james/protocols/netty/ChannelHandlerFactory.java
index eba8210..771ddb2 100644
--- 
a/protocols/netty/src/main/java/org/apache/james/protocols/netty/ChannelHandlerFactory.java
+++ 
b/protocols/netty/src/main/java/org/apache/james/protocols/netty/ChannelHandlerFactory.java
@@ -19,8 +19,9 @@
 package org.apache.james.protocols.netty;
 
 import org.jboss.netty.channel.ChannelHandler;
+import org.jboss.netty.channel.ChannelPipeline;
 
 public interface ChannelHandlerFactory {
-    ChannelHandler create();
+    ChannelHandler create(ChannelPipeline pipeline);
 
 }

http://git-wip-us.apache.org/repos/asf/james-project/blob/81fc0061/protocols/netty/src/main/java/org/apache/james/protocols/netty/LineDelimiterBasedChannelHandlerFactory.java
----------------------------------------------------------------------
diff --git 
a/protocols/netty/src/main/java/org/apache/james/protocols/netty/LineDelimiterBasedChannelHandlerFactory.java
 
b/protocols/netty/src/main/java/org/apache/james/protocols/netty/LineDelimiterBasedChannelHandlerFactory.java
index dcd9b7c..63e39b5 100644
--- 
a/protocols/netty/src/main/java/org/apache/james/protocols/netty/LineDelimiterBasedChannelHandlerFactory.java
+++ 
b/protocols/netty/src/main/java/org/apache/james/protocols/netty/LineDelimiterBasedChannelHandlerFactory.java
@@ -19,6 +19,7 @@
 package org.apache.james.protocols.netty;
 
 import org.jboss.netty.channel.ChannelHandler;
+import org.jboss.netty.channel.ChannelPipeline;
 import org.jboss.netty.handler.codec.frame.DelimiterBasedFrameDecoder;
 import org.jboss.netty.handler.codec.frame.Delimiters;
 
@@ -30,7 +31,7 @@ public class LineDelimiterBasedChannelHandlerFactory 
implements ChannelHandlerFa
     }
 
     @Override
-    public ChannelHandler create() {
+    public ChannelHandler create(ChannelPipeline pipeline) {
         return new DelimiterBasedFrameDecoder(maxLineLength, false, 
Delimiters.lineDelimiter());
     }
 

http://git-wip-us.apache.org/repos/asf/james-project/blob/81fc0061/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
index ad0db9c..9d8998e 100644
--- 
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
@@ -18,9 +18,11 @@
  ****************************************************************/
 package org.apache.james.protocols.smtp;
 
+import org.apache.james.protocols.netty.HandlerConstants;
 import org.jboss.netty.buffer.ChannelBuffer;
 import org.jboss.netty.channel.Channel;
 import org.jboss.netty.channel.ChannelHandlerContext;
+import org.jboss.netty.channel.ChannelPipeline;
 import org.jboss.netty.handler.codec.frame.DelimiterBasedFrameDecoder;
 
 import com.google.common.base.Charsets;
@@ -28,16 +30,22 @@ import com.google.common.base.Charsets;
 public class AllButStartTlsDelimiterChannelHandler extends 
DelimiterBasedFrameDecoder {
 
     private static final String STARTTLS = "starttls";
+    private final ChannelPipeline pipeline;
 
-    public AllButStartTlsDelimiterChannelHandler(int maxFrameLength, boolean 
stripDelimiter, ChannelBuffer[] delimiters) {
+    public AllButStartTlsDelimiterChannelHandler(ChannelPipeline pipeline, int 
maxFrameLength, boolean stripDelimiter, ChannelBuffer[] delimiters) {
         super(maxFrameLength, stripDelimiter, delimiters);
+        this.pipeline = pipeline;
     }
 
     @Override
     protected Object decode(ChannelHandlerContext ctx, Channel channel, 
ChannelBuffer buffer) throws Exception {
-        String trimedLowerCasedInput = readAll(buffer).trim().toLowerCase();
-        if (hasCommandInjection(trimedLowerCasedInput)) {
-            throw new CommandInjectionDetectedException();
+        SMTPSession session = (SMTPSession) 
pipeline.getContext(HandlerConstants.CORE_HANDLER).getAttachment();
+
+        if (session.needsCommandInjectionDetection()) {
+            String trimedLowerCasedInput = 
readAll(buffer).trim().toLowerCase();
+            if (hasCommandInjection(trimedLowerCasedInput)) {
+                throw new CommandInjectionDetectedException();
+            }
         }
         return super.decode(ctx, channel, buffer);
     }

http://git-wip-us.apache.org/repos/asf/james-project/blob/81fc0061/protocols/smtp/src/main/java/org/apache/james/protocols/smtp/AllButStartTlsLineDelimiterChannelHandlerFactory.java
----------------------------------------------------------------------
diff --git 
a/protocols/smtp/src/main/java/org/apache/james/protocols/smtp/AllButStartTlsLineDelimiterChannelHandlerFactory.java
 
b/protocols/smtp/src/main/java/org/apache/james/protocols/smtp/AllButStartTlsLineDelimiterChannelHandlerFactory.java
index de33ac6..22939ff 100644
--- 
a/protocols/smtp/src/main/java/org/apache/james/protocols/smtp/AllButStartTlsLineDelimiterChannelHandlerFactory.java
+++ 
b/protocols/smtp/src/main/java/org/apache/james/protocols/smtp/AllButStartTlsLineDelimiterChannelHandlerFactory.java
@@ -20,6 +20,7 @@ package org.apache.james.protocols.smtp;
 
 import org.apache.james.protocols.netty.ChannelHandlerFactory;
 import org.jboss.netty.channel.ChannelHandler;
+import org.jboss.netty.channel.ChannelPipeline;
 import org.jboss.netty.handler.codec.frame.Delimiters;
 
 public class AllButStartTlsLineDelimiterChannelHandlerFactory implements 
ChannelHandlerFactory {
@@ -31,7 +32,7 @@ public class AllButStartTlsLineDelimiterChannelHandlerFactory 
implements Channel
     }
 
     @Override
-    public ChannelHandler create() {
-        return new AllButStartTlsDelimiterChannelHandler(maxFrameLength, 
false, Delimiters.lineDelimiter());
+    public ChannelHandler create(ChannelPipeline pipeline) {
+        return new AllButStartTlsDelimiterChannelHandler(pipeline, 
maxFrameLength, false, Delimiters.lineDelimiter());
     }
 }

http://git-wip-us.apache.org/repos/asf/james-project/blob/81fc0061/protocols/smtp/src/main/java/org/apache/james/protocols/smtp/SMTPSession.java
----------------------------------------------------------------------
diff --git 
a/protocols/smtp/src/main/java/org/apache/james/protocols/smtp/SMTPSession.java 
b/protocols/smtp/src/main/java/org/apache/james/protocols/smtp/SMTPSession.java
index bdc6bd3..71c6714 100644
--- 
a/protocols/smtp/src/main/java/org/apache/james/protocols/smtp/SMTPSession.java
+++ 
b/protocols/smtp/src/main/java/org/apache/james/protocols/smtp/SMTPSession.java
@@ -51,6 +51,12 @@ public interface SMTPSession extends ProtocolSession{
      * @return the relaying status
      */
     boolean isRelayingAllowed();
+
+    boolean needsCommandInjectionDetection();
+
+    void startDetectingCommadInjection();
+
+    void stopDetectingCommandInjection();
     
     /**
      * Set if reallying is allowed

http://git-wip-us.apache.org/repos/asf/james-project/blob/81fc0061/protocols/smtp/src/main/java/org/apache/james/protocols/smtp/SMTPSessionImpl.java
----------------------------------------------------------------------
diff --git 
a/protocols/smtp/src/main/java/org/apache/james/protocols/smtp/SMTPSessionImpl.java
 
b/protocols/smtp/src/main/java/org/apache/james/protocols/smtp/SMTPSessionImpl.java
index b4662da..124e30f 100644
--- 
a/protocols/smtp/src/main/java/org/apache/james/protocols/smtp/SMTPSessionImpl.java
+++ 
b/protocols/smtp/src/main/java/org/apache/james/protocols/smtp/SMTPSessionImpl.java
@@ -36,12 +36,28 @@ public class SMTPSessionImpl extends ProtocolSessionImpl 
implements SMTPSession
     private static final Response FATAL_ERROR = new 
SMTPResponse(SMTPRetCode.LOCAL_ERROR, "Unable to process request").immutable();
     
     private boolean relayingAllowed;
+    private boolean needsCommandInjectionDetection;
     
     public SMTPSessionImpl(Logger logger, ProtocolTransport transport, 
SMTPConfiguration config) {
         super(logger, transport, config);
         relayingAllowed = 
config.isRelayingAllowed(getRemoteAddress().getAddress().getHostAddress());
+        needsCommandInjectionDetection = true;
     }
 
+    @Override
+    public boolean needsCommandInjectionDetection() {
+        return needsCommandInjectionDetection;
+    }
+
+    @Override
+    public void startDetectingCommadInjection() {
+        needsCommandInjectionDetection = true;
+    }
+
+    @Override
+    public void stopDetectingCommandInjection() {
+        needsCommandInjectionDetection = false;
+    }
 
     /**
      * @see org.apache.james.protocols.smtp.SMTPSession#isRelayingAllowed()

http://git-wip-us.apache.org/repos/asf/james-project/blob/81fc0061/protocols/smtp/src/main/java/org/apache/james/protocols/smtp/core/DataCmdHandler.java
----------------------------------------------------------------------
diff --git 
a/protocols/smtp/src/main/java/org/apache/james/protocols/smtp/core/DataCmdHandler.java
 
b/protocols/smtp/src/main/java/org/apache/james/protocols/smtp/core/DataCmdHandler.java
index 0f51c9f..c68be56 100644
--- 
a/protocols/smtp/src/main/java/org/apache/james/protocols/smtp/core/DataCmdHandler.java
+++ 
b/protocols/smtp/src/main/java/org/apache/james/protocols/smtp/core/DataCmdHandler.java
@@ -138,7 +138,7 @@ public class DataCmdHandler implements 
CommandHandler<SMTPSession>, ExtensibleHa
      */
     public Response onCommand(SMTPSession session, Request request) {
         TimeMetric timeMetric = metricFactory.timer("SMTP-" + 
request.getCommand());
-
+        session.stopDetectingCommandInjection();
         try {
             String parameters = request.getArgument();
             Response response = doDATAFilter(session, parameters);
@@ -150,6 +150,7 @@ public class DataCmdHandler implements 
CommandHandler<SMTPSession>, ExtensibleHa
             }
         } finally {
             timeMetric.stopAndPublish();
+            session.needsCommandInjectionDetection();
         }
     }
 

http://git-wip-us.apache.org/repos/asf/james-project/blob/81fc0061/protocols/smtp/src/test/java/org/apache/james/protocols/smtp/utils/BaseFakeSMTPSession.java
----------------------------------------------------------------------
diff --git 
a/protocols/smtp/src/test/java/org/apache/james/protocols/smtp/utils/BaseFakeSMTPSession.java
 
b/protocols/smtp/src/test/java/org/apache/james/protocols/smtp/utils/BaseFakeSMTPSession.java
index 396d63a..5b2e371 100644
--- 
a/protocols/smtp/src/test/java/org/apache/james/protocols/smtp/utils/BaseFakeSMTPSession.java
+++ 
b/protocols/smtp/src/test/java/org/apache/james/protocols/smtp/utils/BaseFakeSMTPSession.java
@@ -39,6 +39,21 @@ public class BaseFakeSMTPSession implements SMTPSession {
 
     private static final Logger log = new MockLogger();
 
+    @Override
+    public boolean needsCommandInjectionDetection() {
+        throw new UnsupportedOperationException("Unimplemented Stub Method");
+    }
+
+    @Override
+    public void startDetectingCommadInjection() {
+        throw new UnsupportedOperationException("Unimplemented Stub Method");
+    }
+
+    @Override
+    public void stopDetectingCommandInjection() {
+        throw new UnsupportedOperationException("Unimplemented Stub Method");
+    }
+
     /**
      * @see org.apache.james.protocols.smtp.SMTPSession#getConnectionState()
      */

http://git-wip-us.apache.org/repos/asf/james-project/blob/81fc0061/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 cc9c300..06488c3 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
@@ -139,7 +139,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, getFrameHandlerFactory().create());
+                pipeline.addLast(FRAMER, 
getFrameHandlerFactory().create(pipeline));
                
                 Encryption secure = getEncryption();
                 if (secure != null && !secure.isStartTLS()) {

http://git-wip-us.apache.org/repos/asf/james-project/blob/81fc0061/server/protocols/protocols-imap4/src/main/java/org/apache/james/imapserver/netty/SwitchableLineDelimiterBasedFrameDecoderFactory.java
----------------------------------------------------------------------
diff --git 
a/server/protocols/protocols-imap4/src/main/java/org/apache/james/imapserver/netty/SwitchableLineDelimiterBasedFrameDecoderFactory.java
 
b/server/protocols/protocols-imap4/src/main/java/org/apache/james/imapserver/netty/SwitchableLineDelimiterBasedFrameDecoderFactory.java
index 1335ae3..0350f09 100644
--- 
a/server/protocols/protocols-imap4/src/main/java/org/apache/james/imapserver/netty/SwitchableLineDelimiterBasedFrameDecoderFactory.java
+++ 
b/server/protocols/protocols-imap4/src/main/java/org/apache/james/imapserver/netty/SwitchableLineDelimiterBasedFrameDecoderFactory.java
@@ -20,6 +20,7 @@ package org.apache.james.imapserver.netty;
 
 import org.apache.james.protocols.netty.ChannelHandlerFactory;
 import org.jboss.netty.channel.ChannelHandler;
+import org.jboss.netty.channel.ChannelPipeline;
 import org.jboss.netty.handler.codec.frame.Delimiters;
 
 public class SwitchableLineDelimiterBasedFrameDecoderFactory implements 
ChannelHandlerFactory {
@@ -31,7 +32,7 @@ public class SwitchableLineDelimiterBasedFrameDecoderFactory 
implements ChannelH
     }
 
     @Override
-    public ChannelHandler create() {
+    public ChannelHandler create(ChannelPipeline pipeline) {
         return new SwitchableDelimiterBasedFrameDecoder(maxLineLength, false, 
Delimiters.lineDelimiter());
     }
 }

http://git-wip-us.apache.org/repos/asf/james-project/blob/81fc0061/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 827fa40..9ad91c8 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
@@ -114,7 +114,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, getFrameHandlerFactory().create());
+                pipeline.addLast(FRAMER, 
getFrameHandlerFactory().create(pipeline));
                 pipeline.addLast(CONNECTION_COUNT_HANDLER, 
getConnectionCountHandler());
                 pipeline.addLast(CHUNK_WRITE_HANDLER, new 
ChunkedWriteHandler());
 


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

Reply via email to