You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@james.apache.org by ka...@apache.org on 2022/10/31 09:38:34 UTC

[james-project] branch master updated: JAMES-3842 Access SSLSession from Hooks and Handlers

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

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


The following commit(s) were added to refs/heads/master by this push:
     new d0813c6d58 JAMES-3842 Access SSLSession from Hooks and Handlers
d0813c6d58 is described below

commit d0813c6d58fcfd889163176dede7037d96051fbc
Author: Karsten Otto <ka...@akquinet.de>
AuthorDate: Wed Oct 26 11:41:32 2022 +0200

    JAMES-3842 Access SSLSession from Hooks and Handlers
---
 .../java/org/apache/james/protocols/api/ProtocolSession.java |  7 +++++++
 .../org/apache/james/protocols/api/ProtocolSessionImpl.java  |  7 +++++++
 .../org/apache/james/protocols/api/ProtocolTransport.java    |  8 ++++++++
 .../james/protocols/api/AbstractProtocolTransportTest.java   |  8 ++++++++
 .../java/org/apache/james/imap/api/process/ImapSession.java  |  9 +++++++++
 .../java/org/apache/james/imap/encode/FakeImapSession.java   |  7 +++++++
 .../apache/james/protocols/netty/NettyProtocolTransport.java | 11 +++++++++++
 .../james/protocols/smtp/utils/BaseFakeSMTPSession.java      |  7 +++++++
 .../org/apache/james/imapserver/netty/NettyImapSession.java  | 12 ++++++++++++
 9 files changed, 76 insertions(+)

diff --git a/protocols/api/src/main/java/org/apache/james/protocols/api/ProtocolSession.java b/protocols/api/src/main/java/org/apache/james/protocols/api/ProtocolSession.java
index 280e2784a8..142203977a 100644
--- a/protocols/api/src/main/java/org/apache/james/protocols/api/ProtocolSession.java
+++ b/protocols/api/src/main/java/org/apache/james/protocols/api/ProtocolSession.java
@@ -25,6 +25,8 @@ import java.util.Map;
 import java.util.Objects;
 import java.util.Optional;
 
+import javax.net.ssl.SSLSession;
+
 import org.apache.james.core.Username;
 import org.apache.james.protocols.api.handler.LineHandler;
 
@@ -219,6 +221,11 @@ public interface ProtocolSession extends CommandDetectionSession {
      */
     boolean isTLSStarted();
     
+    /**
+     * Return the {@link SSLSession} of this protocol session. Empty if it does not use SSL/TLS. 
+     */
+    Optional<SSLSession> getSSLSession();
+    
     /**
      * Return the {@link ProtocolConfiguration}
      */
diff --git a/protocols/api/src/main/java/org/apache/james/protocols/api/ProtocolSessionImpl.java b/protocols/api/src/main/java/org/apache/james/protocols/api/ProtocolSessionImpl.java
index dd641a9cb3..ee711356b0 100644
--- a/protocols/api/src/main/java/org/apache/james/protocols/api/ProtocolSessionImpl.java
+++ b/protocols/api/src/main/java/org/apache/james/protocols/api/ProtocolSessionImpl.java
@@ -27,6 +27,8 @@ import java.util.HashMap;
 import java.util.Map;
 import java.util.Optional;
 
+import javax.net.ssl.SSLSession;
+
 import org.apache.james.core.Username;
 import org.apache.james.protocols.api.handler.LineHandler;
 
@@ -120,6 +122,11 @@ public class ProtocolSessionImpl implements ProtocolSession {
         return transport.isTLSStarted();
     }
 
+    @Override
+    public Optional<SSLSession> getSSLSession() {
+        return transport.getSSLSession();
+    }
+
     @Override
     public String getSessionID() {
         return transport.getId();
diff --git a/protocols/api/src/main/java/org/apache/james/protocols/api/ProtocolTransport.java b/protocols/api/src/main/java/org/apache/james/protocols/api/ProtocolTransport.java
index f0f743abf9..db4cc17917 100644
--- a/protocols/api/src/main/java/org/apache/james/protocols/api/ProtocolTransport.java
+++ b/protocols/api/src/main/java/org/apache/james/protocols/api/ProtocolTransport.java
@@ -20,6 +20,9 @@
 package org.apache.james.protocols.api;
 
 import java.net.InetSocketAddress;
+import java.util.Optional;
+
+import javax.net.ssl.SSLSession;
 
 import org.apache.james.protocols.api.handler.LineHandler;
 
@@ -58,6 +61,11 @@ public interface ProtocolTransport {
      */
     boolean isStartTLSSupported();
 
+    /*
+     * Return the {@link SSLSession} of this transport. Empty if it does not use SSL/TLS. 
+     */
+    Optional<SSLSession> getSSLSession();
+
     /**
      * Return <code>true</code> if <code>PROXY</code> is required by this {@link ProtocolTransport}
      */
diff --git a/protocols/api/src/test/java/org/apache/james/protocols/api/AbstractProtocolTransportTest.java b/protocols/api/src/test/java/org/apache/james/protocols/api/AbstractProtocolTransportTest.java
index 910dccbfc6..febde26ed2 100644
--- a/protocols/api/src/test/java/org/apache/james/protocols/api/AbstractProtocolTransportTest.java
+++ b/protocols/api/src/test/java/org/apache/james/protocols/api/AbstractProtocolTransportTest.java
@@ -27,10 +27,13 @@ import java.net.InetSocketAddress;
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.List;
+import java.util.Optional;
 import java.util.UUID;
 import java.util.concurrent.CountDownLatch;
 import java.util.stream.IntStream;
 
+import javax.net.ssl.SSLSession;
+
 import org.apache.james.protocols.api.handler.LineHandler;
 import org.junit.jupiter.api.Test;
 
@@ -81,6 +84,11 @@ public class AbstractProtocolTransportTest {
                 throw new UnsupportedOperationException();
             }
             
+            @Override
+            public Optional<SSLSession> getSSLSession() {
+                throw new UnsupportedOperationException();
+            }
+
             @Override
             public boolean isReadable() {
                 throw new UnsupportedOperationException();
diff --git a/protocols/imap/src/main/java/org/apache/james/imap/api/process/ImapSession.java b/protocols/imap/src/main/java/org/apache/james/imap/api/process/ImapSession.java
index 65287b1f10..0e384c755b 100644
--- a/protocols/imap/src/main/java/org/apache/james/imap/api/process/ImapSession.java
+++ b/protocols/imap/src/main/java/org/apache/james/imap/api/process/ImapSession.java
@@ -23,6 +23,8 @@ import java.time.Duration;
 import java.util.Objects;
 import java.util.Optional;
 
+import javax.net.ssl.SSLSession;
+
 import org.apache.commons.text.RandomStringGenerator;
 import org.apache.james.core.Username;
 import org.apache.james.imap.api.ImapSessionState;
@@ -179,6 +181,13 @@ public interface ImapSession extends CommandDetectionSession {
      */
     boolean supportStartTLS();
 
+    /**
+     * Return the {@link SSLSession} of this protocol session. Empty if it does not use SSL/TLS.
+     * 
+     * @return SSLSession
+     */
+    Optional<SSLSession> getSSLSession();
+    
     /**
      * Return true if compression is active
      * 
diff --git a/protocols/imap/src/main/java/org/apache/james/imap/encode/FakeImapSession.java b/protocols/imap/src/main/java/org/apache/james/imap/encode/FakeImapSession.java
index 2e53993579..44eb77d5ed 100644
--- a/protocols/imap/src/main/java/org/apache/james/imap/encode/FakeImapSession.java
+++ b/protocols/imap/src/main/java/org/apache/james/imap/encode/FakeImapSession.java
@@ -27,6 +27,8 @@ import java.util.concurrent.ScheduledExecutorService;
 import java.util.concurrent.ThreadFactory;
 import java.util.concurrent.TimeUnit;
 
+import javax.net.ssl.SSLSession;
+
 import org.apache.james.imap.api.ImapSessionState;
 import org.apache.james.imap.api.process.ImapLineHandler;
 import org.apache.james.imap.api.process.ImapSession;
@@ -139,6 +141,11 @@ public class FakeImapSession implements ImapSession {
         return false;
     }
 
+    @Override
+    public Optional<SSLSession> getSSLSession() {
+        return Optional.empty();
+    }
+
     @Override
     public boolean isCompressionSupported() {
         return false;
diff --git a/protocols/netty/src/main/java/org/apache/james/protocols/netty/NettyProtocolTransport.java b/protocols/netty/src/main/java/org/apache/james/protocols/netty/NettyProtocolTransport.java
index 0257c07a65..8c1b447ba6 100644
--- a/protocols/netty/src/main/java/org/apache/james/protocols/netty/NettyProtocolTransport.java
+++ b/protocols/netty/src/main/java/org/apache/james/protocols/netty/NettyProtocolTransport.java
@@ -24,6 +24,10 @@ import java.io.IOException;
 import java.io.InputStream;
 import java.net.InetSocketAddress;
 import java.nio.channels.FileChannel;
+import java.util.Optional;
+
+import javax.net.ssl.SSLEngine;
+import javax.net.ssl.SSLSession;
 
 import org.apache.james.protocols.api.AbstractProtocolTransport;
 import org.apache.james.protocols.api.ProtocolSession;
@@ -72,6 +76,13 @@ public class NettyProtocolTransport extends AbstractProtocolTransport {
         return encryption != null && encryption.isStartTLS();
     }
 
+    @Override
+    public Optional<SSLSession> getSSLSession() {
+        return Optional.ofNullable(channel.pipeline().get(SslHandler.class))
+            .map(SslHandler::engine)
+            .map(SSLEngine::getSession);
+    }
+
     @Override
     public boolean isProxyRequired() {
         return proxyRequired;
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 708c10298e..bbdde01c63 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
@@ -33,6 +33,8 @@ import org.apache.james.protocols.api.handler.LineHandler;
 import org.apache.james.protocols.smtp.SMTPConfiguration;
 import org.apache.james.protocols.smtp.SMTPSession;
 
+import javax.net.ssl.SSLSession;
+
 /**
  * Abstract class to simplify the mocks
  */
@@ -127,6 +129,11 @@ public class BaseFakeSMTPSession implements SMTPSession {
         throw new UnsupportedOperationException("Unimplemented Stub Method");
     }
 
+    @Override
+    public Optional<SSLSession> getSSLSession() {
+        throw new UnsupportedOperationException("Unimplemented Stub Method");
+    }
+
     @Override
     public Response newLineTooLongResponse() {
         throw new UnsupportedOperationException("Unimplemented Stub Method");
diff --git a/server/protocols/protocols-imap4/src/main/java/org/apache/james/imapserver/netty/NettyImapSession.java b/server/protocols/protocols-imap4/src/main/java/org/apache/james/imapserver/netty/NettyImapSession.java
index 39da4c269a..b593e0c95b 100644
--- a/server/protocols/protocols-imap4/src/main/java/org/apache/james/imapserver/netty/NettyImapSession.java
+++ b/server/protocols/protocols-imap4/src/main/java/org/apache/james/imapserver/netty/NettyImapSession.java
@@ -24,6 +24,9 @@ import java.util.Map;
 import java.util.Optional;
 import java.util.concurrent.TimeUnit;
 
+import javax.net.ssl.SSLEngine;
+import javax.net.ssl.SSLSession;
+
 import org.apache.commons.lang3.NotImplementedException;
 import org.apache.james.imap.api.ImapSessionState;
 import org.apache.james.imap.api.process.ImapLineHandler;
@@ -43,6 +46,7 @@ import io.netty.handler.codec.compression.JZlibEncoder;
 import io.netty.handler.codec.compression.ZlibDecoder;
 import io.netty.handler.codec.compression.ZlibEncoder;
 import io.netty.handler.codec.compression.ZlibWrapper;
+import io.netty.handler.ssl.SslHandler;
 import reactor.core.publisher.Mono;
 
 public class NettyImapSession implements ImapSession, NettyConstants {
@@ -279,6 +283,14 @@ public class NettyImapSession implements ImapSession, NettyConstants {
         return channel.pipeline().get(SSL_HANDLER) != null;
     }
 
+    @Override
+    public Optional<SSLSession> getSSLSession() {
+        return Optional.ofNullable(channel.pipeline().get(SSL_HANDLER))
+            .map(SslHandler.class::cast)
+            .map(SslHandler::engine)
+            .map(SSLEngine::getSession);
+    }
+
     @Override
     public boolean supportMultipleNamespaces() {
         return false;


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