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

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

commit d520a0e70c73d821fee075a8cbb68b8973e6dadf
Author: Quan Tran <[email protected]>
AuthorDate: Thu Jul 9 15:33:36 2026 +0700

    JAMES-4210 Add a test to cover SMTP explicit PLAIN SASL requireSSL behavior
    
    Add an SMTP integration test proving that explicitly configured 
`PlainSaslMechanismFactory` still accepts AUTH PLAIN on clear-text connections 
when `auth.requireSSL` is true, preserving SMTP legacy command behavior while 
requireSSL controls capability announcement.
---
 .../mailets/SmtpSaslMechanismIntegrationTest.java  | 69 +++++++++++++++-------
 1 file changed, 48 insertions(+), 21 deletions(-)

diff --git 
a/server/mailet/integration-testing/src/test/java/org/apache/james/mailets/SmtpSaslMechanismIntegrationTest.java
 
b/server/mailet/integration-testing/src/test/java/org/apache/james/mailets/SmtpSaslMechanismIntegrationTest.java
index 3cd5188c12..65a6c643a6 100644
--- 
a/server/mailet/integration-testing/src/test/java/org/apache/james/mailets/SmtpSaslMechanismIntegrationTest.java
+++ 
b/server/mailet/integration-testing/src/test/java/org/apache/james/mailets/SmtpSaslMechanismIntegrationTest.java
@@ -39,7 +39,6 @@ import org.apache.james.modules.protocols.SmtpGuiceProbe;
 import org.apache.james.probe.DataProbe;
 import org.apache.james.utils.DataProbeImpl;
 import org.junit.jupiter.api.AfterEach;
-import org.junit.jupiter.api.BeforeEach;
 import org.junit.jupiter.api.Test;
 import org.junit.jupiter.api.io.TempDir;
 
@@ -50,26 +49,12 @@ class SmtpSaslMechanismIntegrationTest {
         return Base64.getEncoder().encodeToString(value.getBytes(UTF_8));
     }
 
-    private TemporaryJamesServer jamesServer;
-
-    @BeforeEach
-    void setup(@TempDir File temporaryFolder) throws Exception {
-        jamesServer = TemporaryJamesServer.builder()
-            .withBase(MemoryJamesServerMain.SMTP_ONLY_MODULE)
-            .withMailetContainer(minimalMailetContainer())
-            .withSmtpConfiguration(SmtpConfiguration.builder()
-                .doNotVerifyIdentity()
-                .requireSSLForAuth(true)
-                .withSaslMechanisms("LoginSaslMechanismFactory")
-                .build())
-            .build(temporaryFolder);
-        jamesServer.start();
-
-        DataProbe dataProbe = jamesServer.getProbe(DataProbeImpl.class);
-        dataProbe.addDomain(DEFAULT_DOMAIN);
-        dataProbe.addUser(USER, PASSWORD);
+    private static String plainInitialResponse(String username, String 
password) {
+        return base64(String.join("\0", "", username, password));
     }
 
+    private TemporaryJamesServer jamesServer;
+
     private MailetContainer.Builder minimalMailetContainer() {
         return MailetContainer.builder()
             .putProcessor(CommonProcessors.simpleRoot())
@@ -83,11 +68,15 @@ class SmtpSaslMechanismIntegrationTest {
 
     @AfterEach
     void tearDown() {
-        jamesServer.shutdown();
+        if (jamesServer != null) {
+            jamesServer.shutdown();
+        }
     }
 
     @Test
-    void explicitlyConfiguredLoginSaslMechanismShouldAuthenticate() throws 
Exception {
+    void explicitlyConfiguredLoginSaslMechanismShouldAuthenticate(@TempDir 
File temporaryFolder) throws Exception {
+        startJamesServer(temporaryFolder, "LoginSaslMechanismFactory");
+
         SMTPClient smtpClient = new SMTPClient();
         try {
             smtpClient.connect(LOCALHOST_IP, 
jamesServer.getProbe(SmtpGuiceProbe.class).getSmtpPort().getValue());
@@ -110,4 +99,42 @@ class SmtpSaslMechanismIntegrationTest {
         }
     }
 
+    @Test
+    void 
explicitlyConfiguredPlainSaslMechanismShouldAuthenticateOverClearTextWhenRequireSSLIsTrue(@TempDir
 File temporaryFolder) throws Exception {
+        // SMTP keeps accepting AUTH PLAIN on clear-text connections even when 
auth.requireSSL controls capability announcement.
+        startJamesServer(temporaryFolder, "PlainSaslMechanismFactory");
+
+        SMTPClient smtpClient = new SMTPClient();
+        try {
+            smtpClient.connect(LOCALHOST_IP, 
jamesServer.getProbe(SmtpGuiceProbe.class).getSmtpPort().getValue());
+
+            smtpClient.sendCommand("EHLO", "localhost");
+            assertThat(smtpClient.getReplyCode()).isEqualTo(250);
+
+            smtpClient.sendCommand("AUTH", "PLAIN " + 
plainInitialResponse(USER, PASSWORD));
+            assertThat(smtpClient.getReplyCode()).isEqualTo(235);
+        } finally {
+            if (smtpClient.isConnected()) {
+                smtpClient.disconnect();
+            }
+        }
+    }
+
+    private void startJamesServer(File temporaryFolder, String saslMechanisms) 
throws Exception {
+        jamesServer = TemporaryJamesServer.builder()
+            .withBase(MemoryJamesServerMain.SMTP_ONLY_MODULE)
+            .withMailetContainer(minimalMailetContainer())
+            .withSmtpConfiguration(SmtpConfiguration.builder()
+                .doNotVerifyIdentity()
+                .requireSSLForAuth(true)
+                .withSaslMechanisms(saslMechanisms)
+                .build())
+            .build(temporaryFolder);
+        jamesServer.start();
+
+        DataProbe dataProbe = jamesServer.getProbe(DataProbeImpl.class);
+        dataProbe.addDomain(DEFAULT_DOMAIN);
+        dataProbe.addUser(USER, PASSWORD);
+    }
+
 }


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to