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 <[email protected]> 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: [email protected] For additional commands, e-mail: [email protected]
