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 a5465b3219fb6eec80a931190441cfe952340b80 Author: Quan Tran <[email protected]> AuthorDate: Mon Jul 27 16:42:41 2026 +0700 JAMES-4210 POP3: add a test to verify SASL exchange closure upon client disconnection For POP3, the SASL exchange is well closed upon client disconnection, as `AuthCmdHandler` already implement `DisconnectHandler` to close the SASL exchange. Dropping that piece of code indeed would make the test fail. --- .../apache/james/pop3server/POP3ServerTest.java | 37 ++++++++++++++++++++-- 1 file changed, 34 insertions(+), 3 deletions(-) diff --git a/server/protocols/protocols-pop3/src/test/java/org/apache/james/pop3server/POP3ServerTest.java b/server/protocols/protocols-pop3/src/test/java/org/apache/james/pop3server/POP3ServerTest.java index 932f907a71..3fa4009236 100644 --- a/server/protocols/protocols-pop3/src/test/java/org/apache/james/pop3server/POP3ServerTest.java +++ b/server/protocols/protocols-pop3/src/test/java/org/apache/james/pop3server/POP3ServerTest.java @@ -40,6 +40,7 @@ import java.util.Optional; import java.util.concurrent.Executors; import java.util.concurrent.TimeUnit; import java.util.concurrent.atomic.AtomicBoolean; +import java.util.concurrent.atomic.AtomicInteger; import jakarta.mail.util.SharedByteArrayInputStream; @@ -127,17 +128,25 @@ public class POP3ServerTest { private static final byte[] SERVER_DATA = "server-data".getBytes(StandardCharsets.US_ASCII); private final Username username; - private final AtomicBoolean closed; + private final Runnable closeAction; private final String name; private ServerDataSaslMechanism(Username username, AtomicBoolean closed) { this("TEST", username, closed); } + private ServerDataSaslMechanism(Username username, AtomicInteger closeCount) { + this("TEST", username, closeCount::incrementAndGet); + } + private ServerDataSaslMechanism(String name, Username username, AtomicBoolean closed) { + this(name, username, () -> closed.set(true)); + } + + private ServerDataSaslMechanism(String name, Username username, Runnable closeAction) { this.name = name; this.username = username; - this.closed = closed; + this.closeAction = closeAction; } @Override @@ -160,7 +169,7 @@ public class POP3ServerTest { @Override public void close() { - closed.set(true); + closeAction.run(); } }; } @@ -1215,6 +1224,28 @@ public class POP3ServerTest { } } + @Test + void disconnectDuringSaslContinuationShouldCloseExchange() throws Exception { + Username username = Username.of("auth-user"); + AtomicInteger closeCount = new AtomicInteger(); + pop3Server.setSaslMechanisms(ImmutableList.of(new ServerDataSaslMechanism(username, closeCount))); + finishSetUp(pop3Configuration); + + try (Socket socket = connectToPop3Server(); + BufferedReader reader = reader(socket); + BufferedWriter writer = writer(socket)) { + assertThat(reader.readLine()).startsWith("+OK"); + + send(writer, "AUTH TEST"); + assertThat(reader.readLine()).isEqualTo("+ " + encoded("challenge")); + socket.close(); + + // Disconnect cleanup closes the pending SASL exchange. + Awaitility.await().atMost(Duration.ofSeconds(2)) + .untilAsserted(() -> assertThat(closeCount.get()).isEqualTo(1)); + } + } + @Test void authShouldEnforceInitialCommandLength() throws Exception { Username username = Username.of("auth-user"); --------------------------------------------------------------------- To unsubscribe, e-mail: [email protected] For additional commands, e-mail: [email protected]
