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]

Reply via email to