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 76c409e66d9a50f52f226cfe62b434892b3e4f33 Author: Quan Tran <[email protected]> AuthorDate: Thu Aug 13 09:44:40 2026 +0700 JAMES-4210 Adapt ManageSieve mailet to shared SASL Replace direct users-repository authentication in the ManageSieve mailet with the shared PLAIN mechanism and James SASL authenticator while preserving its virtual STARTTLS capability. --- server/mailet/mailets/pom.xml | 4 ++++ .../mailets/managesieve/ManageSieveMailet.java | 20 +++++++++++++++----- .../managesieve/ManageSieveMailetTestCase.java | 11 +++++------ 3 files changed, 24 insertions(+), 11 deletions(-) diff --git a/server/mailet/mailets/pom.xml b/server/mailet/mailets/pom.xml index 7ba0134215..0f42f0d61e 100644 --- a/server/mailet/mailets/pom.xml +++ b/server/mailet/mailets/pom.xml @@ -189,6 +189,10 @@ <type>test-jar</type> <scope>test</scope> </dependency> + <dependency> + <groupId>${james.protocols.groupId}</groupId> + <artifactId>protocols-sasl</artifactId> + </dependency> <dependency> <groupId>com.google.guava</groupId> <artifactId>guava</artifactId> diff --git a/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/managesieve/ManageSieveMailet.java b/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/managesieve/ManageSieveMailet.java index 691cda712c..65116ff35d 100644 --- a/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/managesieve/ManageSieveMailet.java +++ b/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/managesieve/ManageSieveMailet.java @@ -33,15 +33,19 @@ import jakarta.inject.Inject; import jakarta.mail.MessagingException; import org.apache.james.core.Username; +import org.apache.james.mailbox.Authenticator; +import org.apache.james.mailbox.Authorizator; import org.apache.james.managesieve.api.Session; import org.apache.james.managesieve.api.SieveParser; import org.apache.james.managesieve.core.CoreProcessor; import org.apache.james.managesieve.transcode.ArgumentParser; import org.apache.james.managesieve.transcode.ManageSieveProcessor; import org.apache.james.managesieve.util.SettableSession; +import org.apache.james.protocols.api.sasl.SaslMechanism; +import org.apache.james.protocols.sasl.JamesSaslAuthenticator; +import org.apache.james.protocols.sasl.plain.PlainSaslMechanism; import org.apache.james.sieverepository.api.SieveRepository; import org.apache.james.transport.mailets.managesieve.transcode.MessageToCoreToMessage; -import org.apache.james.user.api.UsersRepository; import org.apache.mailet.Experimental; import org.apache.mailet.Mail; import org.apache.mailet.base.GenericMailet; @@ -49,6 +53,7 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import com.google.common.annotations.VisibleForTesting; +import com.google.common.collect.ImmutableList; /** * <code>ManageSieveMailet</code> interprets mail from a local sender as @@ -98,7 +103,7 @@ public class ManageSieveMailet extends GenericMailet implements MessageToCoreToM private SieveRepository sieveRepository = null; // Injected private SieveParser sieveParser = null; - private UsersRepository usersRepository; + private Authenticator authenticator; private MessageToCoreToMessage transcoder = null; private URL helpURL = null; private String help = null; @@ -117,8 +122,11 @@ public class ManageSieveMailet extends GenericMailet implements MessageToCoreToM setHelpURL(getInitParameter("helpURL")); cache = getInitParameter("cache", true); + ImmutableList<SaslMechanism> saslMechanisms = ImmutableList.of(new PlainSaslMechanism(true, false)); transcoder = new MessageToCoreToMessage(new ManageSieveProcessor( - new ArgumentParser(new CoreProcessor(sieveRepository, usersRepository, sieveParser), false)), + new ArgumentParser(new CoreProcessor(sieveRepository, sieveParser, saslMechanisms), false), + saslMechanisms, + new JamesSaslAuthenticator(authenticator, (user, otherUser) -> Authorizator.AuthorizationState.FORBIDDEN)), this); } @@ -136,6 +144,8 @@ public class ManageSieveMailet extends GenericMailet implements MessageToCoreToM // Update the Session for the current mail and execute SettableSession session = new SettableSession(); + // ManageSieve-over-mail has historically exposed STARTTLS through its virtual session. + session.setStartTlsSupported(true); if (mail.getAttribute(Mail.SMTP_AUTH_USER).isPresent()) { session.setState(Session.State.AUTHENTICATED); } else { @@ -163,8 +173,8 @@ public class ManageSieveMailet extends GenericMailet implements MessageToCoreToM } @Inject - public void setUsersRepository(UsersRepository usersRepository) { - this.usersRepository = usersRepository; + public void setAuthenticator(Authenticator authenticator) { + this.authenticator = authenticator; } @Override diff --git a/server/mailet/mailets/src/test/java/org/apache/james/transport/mailets/managesieve/ManageSieveMailetTestCase.java b/server/mailet/mailets/src/test/java/org/apache/james/transport/mailets/managesieve/ManageSieveMailetTestCase.java index bb5a80d3ae..fb98551cd0 100644 --- a/server/mailet/mailets/src/test/java/org/apache/james/transport/mailets/managesieve/ManageSieveMailetTestCase.java +++ b/server/mailet/mailets/src/test/java/org/apache/james/transport/mailets/managesieve/ManageSieveMailetTestCase.java @@ -41,6 +41,7 @@ import org.apache.commons.io.IOUtils; import org.apache.james.core.MailAddress; import org.apache.james.core.Username; import org.apache.james.core.builder.MimeMessageBuilder; +import org.apache.james.mailbox.Authenticator; import org.apache.james.managesieve.api.SieveParser; import org.apache.james.managesieve.api.SyntaxException; import org.apache.james.sieverepository.api.ScriptContent; @@ -48,7 +49,6 @@ import org.apache.james.sieverepository.api.ScriptName; import org.apache.james.sieverepository.api.ScriptSummary; import org.apache.james.sieverepository.api.SieveRepository; import org.apache.james.sieverepository.api.exception.ScriptNotFoundException; -import org.apache.james.user.api.UsersRepository; import org.apache.mailet.Attribute; import org.apache.mailet.AttributeValue; import org.apache.mailet.Mail; @@ -73,16 +73,15 @@ class ManageSieveMailetTestCase { private ManageSieveMailet mailet; private SieveRepository sieveRepository; private SieveParser sieveParser; - private UsersRepository usersRepository; + private Authenticator authenticator; private FakeMailContext fakeMailContext; @BeforeEach void setUp() throws Exception { sieveRepository = mock(SieveRepository.class); sieveParser = mock(SieveParser.class); - usersRepository = mock(UsersRepository.class); + authenticator = mock(Authenticator.class); initializeMailet(); - when(usersRepository.contains(USERNAME)).thenReturn(true); } @Test @@ -499,7 +498,7 @@ class ManageSieveMailetTestCase { mailet = new ManageSieveMailet(); mailet.setSieveParser(sieveParser); mailet.setSieveRepository(sieveRepository); - mailet.setUsersRepository(usersRepository); + mailet.setAuthenticator(authenticator); fakeMailContext = FakeMailContext.defaultContext(); FakeMailetConfig config = FakeMailetConfig.builder() .mailetName("ManageSieve mailet") @@ -581,4 +580,4 @@ class ManageSieveMailetTestCase { assertThat(result.getRecipients(RecipientType.TO)).containsOnly(new InternetAddress(USERNAME.asString())); return result; } -} \ No newline at end of file +} --------------------------------------------------------------------- To unsubscribe, e-mail: [email protected] For additional commands, e-mail: [email protected]
