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 bt...@apache.org on 2017/08/24 03:46:34 UTC

[09/38] james-project git commit: JAMES-2114 MDC logging context for MANAGE-SIEVE

JAMES-2114 MDC logging context for MANAGE-SIEVE


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

Branch: refs/heads/master
Commit: f998640aec61cf08c38753e8879947d14329603c
Parents: 56974b9
Author: benwa <bt...@linagora.com>
Authored: Mon Aug 14 11:35:44 2017 +0700
Committer: benwa <bt...@linagora.com>
Committed: Thu Aug 24 10:34:42 2017 +0700

----------------------------------------------------------------------
 server/protocols/protocols-managesieve/pom.xml  |  4 +
 .../ManageSieveChannelUpstreamHandler.java      | 88 +++++++++-----------
 .../netty/ManageSieveMDCContext.java            | 67 +++++++++++++++
 3 files changed, 110 insertions(+), 49 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/james-project/blob/f998640a/server/protocols/protocols-managesieve/pom.xml
----------------------------------------------------------------------
diff --git a/server/protocols/protocols-managesieve/pom.xml b/server/protocols/protocols-managesieve/pom.xml
index 81863e6..5bbcbb6 100644
--- a/server/protocols/protocols-managesieve/pom.xml
+++ b/server/protocols/protocols-managesieve/pom.xml
@@ -22,6 +22,10 @@
             <artifactId>james-server-filesystem-api</artifactId>
         </dependency>
         <dependency>
+            <groupId>org.apache.james</groupId>
+            <artifactId>james-server-util-java8</artifactId>
+        </dependency>
+        <dependency>
             <groupId>org.apache.james.protocols</groupId>
             <artifactId>protocols-managesieve</artifactId>
         </dependency>

http://git-wip-us.apache.org/repos/asf/james-project/blob/f998640a/server/protocols/protocols-managesieve/src/main/java/org/apache/james/managesieveserver/netty/ManageSieveChannelUpstreamHandler.java
----------------------------------------------------------------------
diff --git a/server/protocols/protocols-managesieve/src/main/java/org/apache/james/managesieveserver/netty/ManageSieveChannelUpstreamHandler.java b/server/protocols/protocols-managesieve/src/main/java/org/apache/james/managesieveserver/netty/ManageSieveChannelUpstreamHandler.java
index 11b182f..8f63517 100644
--- a/server/protocols/protocols-managesieve/src/main/java/org/apache/james/managesieveserver/netty/ManageSieveChannelUpstreamHandler.java
+++ b/server/protocols/protocols-managesieve/src/main/java/org/apache/james/managesieveserver/netty/ManageSieveChannelUpstreamHandler.java
@@ -19,8 +19,8 @@
 
 package org.apache.james.managesieveserver.netty;
 
+import java.io.Closeable;
 import java.net.InetSocketAddress;
-import java.util.function.Supplier;
 
 import javax.net.ssl.SSLContext;
 
@@ -28,7 +28,6 @@ import org.apache.james.managesieve.api.Session;
 import org.apache.james.managesieve.api.SessionTerminatedException;
 import org.apache.james.managesieve.transcode.ManageSieveProcessor;
 import org.apache.james.managesieve.util.SettableSession;
-import org.apache.james.protocols.api.logger.ContextualLogger;
 import org.jboss.netty.buffer.ChannelBuffers;
 import org.jboss.netty.channel.Channel;
 import org.jboss.netty.channel.ChannelFutureListener;
@@ -65,28 +64,32 @@ public class ManageSieveChannelUpstreamHandler extends SimpleChannelUpstreamHand
 
     @Override
     public void messageReceived(ChannelHandlerContext ctx, MessageEvent e) throws Exception {
-        String request = (String) e.getMessage();
-        Session manageSieveSession = attributes.get(ctx.getChannel());
-        String responseString = manageSieveProcessor.handleRequest(manageSieveSession, request);
-        ((ChannelManageSieveResponseWriter)ctx.getAttachment()).write(responseString);
-        if (manageSieveSession.getState() == Session.State.SSL_NEGOCIATION) {
-            turnSSLon(ctx.getChannel());
-            manageSieveSession.setSslEnabled(true);
-            manageSieveSession.setState(Session.State.UNAUTHENTICATED);
+        try (Closeable closeable = ManageSieveMDCContext.from(ctx, attributes)) {
+            String request = (String) e.getMessage();
+            Session manageSieveSession = attributes.get(ctx.getChannel());
+            String responseString = manageSieveProcessor.handleRequest(manageSieveSession, request);
+            ((ChannelManageSieveResponseWriter) ctx.getAttachment()).write(responseString);
+            if (manageSieveSession.getState() == Session.State.SSL_NEGOCIATION) {
+                turnSSLon(ctx.getChannel());
+                manageSieveSession.setSslEnabled(true);
+                manageSieveSession.setState(Session.State.UNAUTHENTICATED);
+            }
         }
     }
 
     @Override
     public void exceptionCaught(ChannelHandlerContext ctx, ExceptionEvent e) throws Exception {
-        getLogger(ctx).warn("Error while processing ManageSieve request", e.getCause());
-
-        if (e.getCause() instanceof TooLongFrameException) {
-            // Max line length exceeded
-            // See also JAMES-1190
-            ((ChannelManageSieveResponseWriter)ctx.getAttachment()).write("NO Maximum command line length exceeded");
-        } else if (e.getCause() instanceof SessionTerminatedException) {
-            ((ChannelManageSieveResponseWriter)ctx.getAttachment()).write("OK channel is closing");
-            logout(ctx);
+        try (Closeable closeable = ManageSieveMDCContext.from(ctx, attributes)) {
+            logger.warn("Error while processing ManageSieve request", e.getCause());
+
+            if (e.getCause() instanceof TooLongFrameException) {
+                // Max line length exceeded
+                // See also JAMES-1190
+                ((ChannelManageSieveResponseWriter) ctx.getAttachment()).write("NO Maximum command line length exceeded");
+            } else if (e.getCause() instanceof SessionTerminatedException) {
+                ((ChannelManageSieveResponseWriter) ctx.getAttachment()).write("OK channel is closing");
+                logout(ctx);
+            }
         }
     }
 
@@ -102,42 +105,29 @@ public class ManageSieveChannelUpstreamHandler extends SimpleChannelUpstreamHand
 
     @Override
     public void channelConnected(ChannelHandlerContext ctx, ChannelStateEvent e) throws Exception {
-        InetSocketAddress address = (InetSocketAddress) ctx.getChannel().getRemoteAddress();
-        getLogger(ctx).info("Connection established from " + address.getAddress().getHostAddress());
+        try (Closeable closeable = ManageSieveMDCContext.from(ctx, attributes)) {
+            InetSocketAddress address = (InetSocketAddress) ctx.getChannel().getRemoteAddress();
+            logger.info("Connection established from " + address.getAddress().getHostAddress());
 
-        Session session = new SettableSession();
-        if (sslServer) {
-            session.setSslEnabled(true);
+            Session session = new SettableSession();
+            if (sslServer) {
+                session.setSslEnabled(true);
+            }
+            attributes.set(ctx.getChannel(), session);
+            ctx.setAttachment(new ChannelManageSieveResponseWriter(ctx.getChannel()));
+            super.channelBound(ctx, e);
+            ((ChannelManageSieveResponseWriter) ctx.getAttachment()).write(manageSieveProcessor.getAdvertisedCapabilities());
         }
-        attributes.set(ctx.getChannel(), session);
-        ctx.setAttachment(new ChannelManageSieveResponseWriter(ctx.getChannel()));
-        super.channelBound(ctx, e);
-        ((ChannelManageSieveResponseWriter)ctx.getAttachment()).write(manageSieveProcessor.getAdvertisedCapabilities());
     }
 
     @Override
     public void channelClosed(ChannelHandlerContext ctx, ChannelStateEvent e) throws Exception {
-        InetSocketAddress address = (InetSocketAddress) ctx.getChannel().getRemoteAddress();
-        getLogger(ctx).info("Connection closed for " + address.getAddress().getHostAddress());
-
-        attributes.remove(ctx.getChannel());
-        super.channelClosed(ctx, e);
-    }
-
-    private Logger getLogger(final ChannelHandlerContext ctx) {
-        return new ContextualLogger(getUserSupplier(ctx),
-            Integer.toString(ctx.getChannel().getId()),
-            logger);
-    }
-
-    private Supplier<String> getUserSupplier(final ChannelHandlerContext ctx) {
-        return () -> {
-            Session session = attributes.get(ctx.getChannel());
-            if (session != null) {
-                return session.getUser();
-            }
-            return null;
-        };
+        try (Closeable closeable = ManageSieveMDCContext.from(ctx, attributes)) {
+            InetSocketAddress address = (InetSocketAddress) ctx.getChannel().getRemoteAddress();
+            logger.info("Connection closed for " + address.getAddress().getHostAddress());
+            attributes.remove(ctx.getChannel());
+            super.channelClosed(ctx, e);
+        }
     }
 
     private void turnSSLon(Channel channel) {

http://git-wip-us.apache.org/repos/asf/james-project/blob/f998640a/server/protocols/protocols-managesieve/src/main/java/org/apache/james/managesieveserver/netty/ManageSieveMDCContext.java
----------------------------------------------------------------------
diff --git a/server/protocols/protocols-managesieve/src/main/java/org/apache/james/managesieveserver/netty/ManageSieveMDCContext.java b/server/protocols/protocols-managesieve/src/main/java/org/apache/james/managesieveserver/netty/ManageSieveMDCContext.java
new file mode 100644
index 0000000..d069f7a
--- /dev/null
+++ b/server/protocols/protocols-managesieve/src/main/java/org/apache/james/managesieveserver/netty/ManageSieveMDCContext.java
@@ -0,0 +1,67 @@
+/****************************************************************
+ * 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.managesieveserver.netty;
+
+import java.io.Closeable;
+import java.net.InetSocketAddress;
+import java.net.SocketAddress;
+import java.util.Optional;
+
+import org.apache.james.managesieve.api.Session;
+import org.apache.james.util.MDCBuilder;
+import org.jboss.netty.channel.ChannelHandlerContext;
+import org.jboss.netty.channel.ChannelLocal;
+
+public class ManageSieveMDCContext {
+    public static Closeable from(ChannelHandlerContext ctx, ChannelLocal<Session> attributes) {
+        return MDCBuilder.create()
+            .addContext(from(attributes.get(ctx.getChannel())))
+            .addContext(MDCBuilder.PROTOCOL, "MANAGE-SIEVE")
+            .addContext(MDCBuilder.IP, retrieveIp(ctx))
+            .addContext(MDCBuilder.HOST, retrieveHost(ctx))
+            .addContext(MDCBuilder.SESSION_ID, ctx.getChannel().getId())
+            .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(Session session) {
+        return Optional.ofNullable(session)
+            .map(s -> MDCBuilder.create()
+                .addContext(MDCBuilder.USER, s.getUser()))
+            .orElse(MDCBuilder.create());
+    }
+}


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