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