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]
