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 rc...@apache.org on 2020/06/08 03:12:25 UTC

[james-project] 04/16: JAMES-3196 Add sender/rcpt/helo to SMTP logs context

This is an automated email from the ASF dual-hosted git repository.

rcordier pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/james-project.git

commit fafbcd9770fe6b734531802fd108e589943724af
Author: Benoit Tellier <bt...@linagora.com>
AuthorDate: Thu May 28 12:07:25 2020 +0700

    JAMES-3196 Add sender/rcpt/helo to SMTP logs context
---
 .../netty/BasicChannelUpstreamHandler.java         | 21 +++++-----
 .../apache/james/protocols/netty/NettyServer.java  |  2 +-
 ...Context.java => ProtocolMDCContextFactory.java} | 16 ++++++--
 .../smtp/core/SMTPMDCContextFactory.java}          | 46 ++++++----------------
 .../apache/james/pop3server/netty/POP3Server.java  |  3 +-
 .../netty/SMTPChannelUpstreamHandler.java          |  5 ++-
 6 files changed, 43 insertions(+), 50 deletions(-)

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 b3246ab..0adcb0c 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
@@ -55,15 +55,18 @@ import org.slf4j.LoggerFactory;
 @Sharable
 public class BasicChannelUpstreamHandler extends SimpleChannelUpstreamHandler {
     private static final Logger LOGGER = LoggerFactory.getLogger(BasicChannelUpstreamHandler.class);
+
+    private final ProtocolMDCContextFactory mdcContextFactory;
     protected final Protocol protocol;
     protected final ProtocolHandlerChain chain;
     protected final Encryption secure;
 
-    public BasicChannelUpstreamHandler(Protocol protocol) {
-        this(protocol, null);
+    public BasicChannelUpstreamHandler(ProtocolMDCContextFactory mdcContextFactory, Protocol protocol) {
+        this(mdcContextFactory, protocol, null);
     }
 
-    public BasicChannelUpstreamHandler(Protocol protocol, Encryption secure) {
+    public BasicChannelUpstreamHandler(ProtocolMDCContextFactory mdcContextFactory, Protocol protocol, Encryption secure) {
+        this.mdcContextFactory = mdcContextFactory;
         this.protocol = protocol;
         this.chain = protocol.getProtocolChain();
         this.secure = secure;
@@ -72,7 +75,7 @@ public class BasicChannelUpstreamHandler extends SimpleChannelUpstreamHandler {
 
     @Override
     public void channelBound(ChannelHandlerContext ctx, ChannelStateEvent e) throws Exception {
-        try (Closeable closeable = ProtocolMDCContext.from(protocol, ctx)) {
+        try (Closeable closeable = mdcContextFactory.from(protocol, ctx)) {
             ctx.setAttachment(createSession(ctx));
             super.channelBound(ctx, e);
         }
@@ -86,7 +89,7 @@ public class BasicChannelUpstreamHandler extends SimpleChannelUpstreamHandler {
     @SuppressWarnings({ "unchecked", "rawtypes" })
     @Override
     public void channelConnected(ChannelHandlerContext ctx, ChannelStateEvent e) throws Exception {
-        try (Closeable closeable = ProtocolMDCContext.from(protocol, ctx)) {
+        try (Closeable closeable = mdcContextFactory.from(protocol, ctx)) {
             List<ConnectHandler> connectHandlers = chain.getHandlers(ConnectHandler.class);
             List<ProtocolHandlerResultHandler> resultHandlers = chain.getHandlers(ProtocolHandlerResultHandler.class);
             ProtocolSession session = (ProtocolSession) ctx.getAttachment();
@@ -116,7 +119,7 @@ public class BasicChannelUpstreamHandler extends SimpleChannelUpstreamHandler {
     @SuppressWarnings({ "rawtypes", "unchecked" })
     @Override
     public void channelDisconnected(ChannelHandlerContext ctx, ChannelStateEvent e) throws Exception {
-        try (Closeable closeable = ProtocolMDCContext.from(protocol, ctx)) {
+        try (Closeable closeable = mdcContextFactory.from(protocol, ctx)) {
             List<DisconnectHandler> connectHandlers = chain.getHandlers(DisconnectHandler.class);
             ProtocolSession session = (ProtocolSession) ctx.getAttachment();
             if (connectHandlers != null) {
@@ -135,7 +138,7 @@ public class BasicChannelUpstreamHandler extends SimpleChannelUpstreamHandler {
     @SuppressWarnings({ "unchecked", "rawtypes" })
     @Override
     public void messageReceived(ChannelHandlerContext ctx, MessageEvent e) throws Exception {
-        try (Closeable closeable = ProtocolMDCContext.from(protocol, ctx)) {
+        try (Closeable closeable = mdcContextFactory.from(protocol, ctx)) {
             ProtocolSession pSession = (ProtocolSession) ctx.getAttachment();
             LinkedList<LineHandler> lineHandlers = chain.getHandlers(LineHandler.class);
             LinkedList<ProtocolHandlerResultHandler> resultHandlers = chain.getHandlers(ProtocolHandlerResultHandler.class);
@@ -166,7 +169,7 @@ public class BasicChannelUpstreamHandler extends SimpleChannelUpstreamHandler {
 
     @Override
     public void channelClosed(ChannelHandlerContext ctx, ChannelStateEvent e) throws Exception {
-        try (Closeable closeable = ProtocolMDCContext.from(protocol, ctx)) {
+        try (Closeable closeable = mdcContextFactory.from(protocol, ctx)) {
             ProtocolSession session = (ProtocolSession) ctx.getAttachment();
             LOGGER.info("Connection closed for {}", session.getRemoteAddress().getAddress().getHostAddress());
             cleanup(ctx);
@@ -203,7 +206,7 @@ public class BasicChannelUpstreamHandler extends SimpleChannelUpstreamHandler {
 
     @Override
     public void exceptionCaught(ChannelHandlerContext ctx, ExceptionEvent e) throws Exception {
-        try (Closeable closeable = ProtocolMDCContext.from(protocol, ctx)) {
+        try (Closeable closeable = mdcContextFactory.from(protocol, ctx)) {
             Channel channel = ctx.getChannel();
             ProtocolSession session = (ProtocolSession) ctx.getAttachment();
             if (e.getCause() instanceof TooLongFrameException && session != null) {
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 a523660..27ca9a8 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
@@ -100,7 +100,7 @@ public class NettyServer extends AbstractAsyncServer {
     }
     
     protected ChannelUpstreamHandler createCoreHandler() {
-        return new BasicChannelUpstreamHandler(protocol, secure);
+        return new BasicChannelUpstreamHandler(new ProtocolMDCContextFactory.Standard(), protocol, secure);
     }
     
     @Override
diff --git a/protocols/netty/src/main/java/org/apache/james/protocols/netty/ProtocolMDCContext.java b/protocols/netty/src/main/java/org/apache/james/protocols/netty/ProtocolMDCContextFactory.java
similarity index 87%
copy from protocols/netty/src/main/java/org/apache/james/protocols/netty/ProtocolMDCContext.java
copy to protocols/netty/src/main/java/org/apache/james/protocols/netty/ProtocolMDCContextFactory.java
index 810a448..7501530 100644
--- a/protocols/netty/src/main/java/org/apache/james/protocols/netty/ProtocolMDCContext.java
+++ b/protocols/netty/src/main/java/org/apache/james/protocols/netty/ProtocolMDCContextFactory.java
@@ -29,14 +29,22 @@ import org.apache.james.protocols.api.ProtocolSession;
 import org.apache.james.util.MDCBuilder;
 import org.jboss.netty.channel.ChannelHandlerContext;
 
-public class ProtocolMDCContext {
-    public static Closeable from(Protocol protocol, ChannelHandlerContext ctx) {
+public interface ProtocolMDCContextFactory {
+    class Standard implements ProtocolMDCContextFactory {
+        @Override
+        public Closeable from(Protocol protocol, ChannelHandlerContext ctx) {
+            return mdcContext(protocol, ctx).build();
+        }
+    }
+
+    Closeable from(Protocol protocol, ChannelHandlerContext ctx);
+
+    static MDCBuilder mdcContext(Protocol protocol, ChannelHandlerContext ctx) {
         return MDCBuilder.create()
             .addContext(from(ctx.getAttachment()))
             .addContext(MDCBuilder.PROTOCOL, protocol.getName())
             .addContext(MDCBuilder.IP, retrieveIp(ctx))
-            .addContext(MDCBuilder.HOST, retrieveHost(ctx))
-            .build();
+            .addContext(MDCBuilder.HOST, retrieveHost(ctx));
     }
 
     private static String retrieveIp(ChannelHandlerContext ctx) {
diff --git a/protocols/netty/src/main/java/org/apache/james/protocols/netty/ProtocolMDCContext.java b/protocols/smtp/src/main/java/org/apache/james/protocols/smtp/core/SMTPMDCContextFactory.java
similarity index 51%
rename from protocols/netty/src/main/java/org/apache/james/protocols/netty/ProtocolMDCContext.java
rename to protocols/smtp/src/main/java/org/apache/james/protocols/smtp/core/SMTPMDCContextFactory.java
index 810a448..cec99ae 100644
--- a/protocols/netty/src/main/java/org/apache/james/protocols/netty/ProtocolMDCContext.java
+++ b/protocols/smtp/src/main/java/org/apache/james/protocols/smtp/core/SMTPMDCContextFactory.java
@@ -17,55 +17,35 @@
  * under the License.                                           *
  ****************************************************************/
 
-package org.apache.james.protocols.netty;
+package org.apache.james.protocols.smtp.core;
 
 import java.io.Closeable;
-import java.net.InetSocketAddress;
-import java.net.SocketAddress;
 import java.util.Optional;
 
 import org.apache.james.protocols.api.Protocol;
 import org.apache.james.protocols.api.ProtocolSession;
+import org.apache.james.protocols.netty.ProtocolMDCContextFactory;
+import org.apache.james.protocols.smtp.SMTPSession;
 import org.apache.james.util.MDCBuilder;
 import org.jboss.netty.channel.ChannelHandlerContext;
 
-public class ProtocolMDCContext {
-    public static Closeable from(Protocol protocol, ChannelHandlerContext ctx) {
+public class SMTPMDCContextFactory implements ProtocolMDCContextFactory {
+
+    public Closeable from(Protocol protocol, ChannelHandlerContext ctx) {
         return MDCBuilder.create()
+            .addContext(ProtocolMDCContextFactory.mdcContext(protocol, ctx))
             .addContext(from(ctx.getAttachment()))
-            .addContext(MDCBuilder.PROTOCOL, protocol.getName())
-            .addContext(MDCBuilder.IP, retrieveIp(ctx))
-            .addContext(MDCBuilder.HOST, retrieveHost(ctx))
             .build();
     }
 
-    private static String retrieveIp(ChannelHandlerContext ctx) {
-        SocketAddress remoteAddress = ctx.getChannel().getRemoteAddress();
-        if (remoteAddress instanceof InetSocketAddress) {
-            InetSocketAddress address = (InetSocketAddress) remoteAddress;
-            return address.getAddress().getHostAddress();
-        }
-        return remoteAddress.toString();
-    }
-
-    private static String retrieveHost(ChannelHandlerContext ctx) {
-        SocketAddress remoteAddress = ctx.getChannel().getRemoteAddress();
-        if (remoteAddress instanceof InetSocketAddress) {
-            InetSocketAddress address = (InetSocketAddress) remoteAddress;
-            return address.getHostName();
-        }
-        return remoteAddress.toString();
-    }
-
-    private static MDCBuilder from(Object o) {
+    private MDCBuilder from(Object o) {
         return Optional.ofNullable(o)
-            .filter(object -> object instanceof ProtocolSession)
-            .map(object -> (ProtocolSession) object)
+            .filter(object -> object instanceof SMTPSession)
+            .map(object -> (SMTPSession) object)
             .map(protocolSession -> MDCBuilder.create()
-                .addContext(MDCBuilder.SESSION_ID, protocolSession.getSessionID())
-                .addContext(MDCBuilder.CHARSET, protocolSession.getCharset().displayName())
-                .addContext(MDCBuilder.USER, protocolSession.getUsername()))
+                .addContext("ehlo", protocolSession.getAttachment(SMTPSession.CURRENT_HELO_NAME, ProtocolSession.State.Connection))
+                .addContext("sender", protocolSession.getAttachment(SMTPSession.SENDER, ProtocolSession.State.Transaction))
+                .addContext("recipients", protocolSession.getAttachment(SMTPSession.RCPT_LIST, ProtocolSession.State.Transaction)))
             .orElse(MDCBuilder.create());
     }
-
 }
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 cd4f4f5..bd235ec 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
@@ -27,6 +27,7 @@ import org.apache.james.protocols.netty.AbstractChannelPipelineFactory;
 import org.apache.james.protocols.netty.BasicChannelUpstreamHandler;
 import org.apache.james.protocols.netty.ChannelHandlerFactory;
 import org.apache.james.protocols.netty.LineDelimiterBasedChannelHandlerFactory;
+import org.apache.james.protocols.netty.ProtocolMDCContextFactory;
 import org.apache.james.protocols.pop3.POP3Protocol;
 import org.jboss.netty.channel.ChannelUpstreamHandler;
 
@@ -75,7 +76,7 @@ public class POP3Server extends AbstractProtocolAsyncServer implements POP3Serve
     protected void preInit() throws Exception {
         super.preInit();
         POP3Protocol protocol = new POP3Protocol(getProtocolHandlerChain(), theConfigData);
-        coreHandler = new BasicChannelUpstreamHandler(protocol, getEncryption());
+        coreHandler = new BasicChannelUpstreamHandler(new ProtocolMDCContextFactory.Standard(), protocol, getEncryption());
     }
 
     @Override
diff --git a/server/protocols/protocols-smtp/src/main/java/org/apache/james/smtpserver/netty/SMTPChannelUpstreamHandler.java b/server/protocols/protocols-smtp/src/main/java/org/apache/james/smtpserver/netty/SMTPChannelUpstreamHandler.java
index 6933c2b..fbfcf55 100644
--- a/server/protocols/protocols-smtp/src/main/java/org/apache/james/smtpserver/netty/SMTPChannelUpstreamHandler.java
+++ b/server/protocols/protocols-smtp/src/main/java/org/apache/james/smtpserver/netty/SMTPChannelUpstreamHandler.java
@@ -24,6 +24,7 @@ import org.apache.james.protocols.api.Protocol;
 import org.apache.james.protocols.api.ProtocolSession.State;
 import org.apache.james.protocols.netty.BasicChannelUpstreamHandler;
 import org.apache.james.protocols.smtp.SMTPSession;
+import org.apache.james.protocols.smtp.core.SMTPMDCContextFactory;
 import org.apache.james.smtpserver.SMTPConstants;
 import org.jboss.netty.channel.ChannelHandler.Sharable;
 import org.jboss.netty.channel.ChannelHandlerContext;
@@ -40,12 +41,12 @@ public class SMTPChannelUpstreamHandler extends BasicChannelUpstreamHandler {
     private final SmtpMetrics smtpMetrics;
 
     public SMTPChannelUpstreamHandler(Protocol protocol, Encryption encryption, SmtpMetrics smtpMetrics) {
-        super(protocol, encryption);
+        super(new SMTPMDCContextFactory(), protocol, encryption);
         this.smtpMetrics = smtpMetrics;
     }
 
     public SMTPChannelUpstreamHandler(Protocol protocol, SmtpMetrics smtpMetrics) {
-        super(protocol);
+        super(new SMTPMDCContextFactory(), protocol);
         this.smtpMetrics = smtpMetrics;
     }
 


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