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

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

commit 3183f7f9be683e765ca34702156313943c3880df
Author: Pablo Pita <[email protected]>
AuthorDate: Sat Mar 16 15:10:47 2019 +0100

    JAMES-2682 Prevent infinite loop with Sieve error notifications
---
 .../transport/mailets/jsieve/delivery/SieveExecutor.java  | 15 ++++++++++++++-
 .../transport/mailets/delivery/SieveIntegrationTest.java  | 10 ++++++++++
 2 files changed, 24 insertions(+), 1 deletion(-)

diff --git 
a/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/jsieve/delivery/SieveExecutor.java
 
b/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/jsieve/delivery/SieveExecutor.java
index bd50190..ebb78ce 100644
--- 
a/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/jsieve/delivery/SieveExecutor.java
+++ 
b/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/jsieve/delivery/SieveExecutor.java
@@ -21,6 +21,7 @@
 package org.apache.james.transport.mailets.jsieve.delivery;
 
 import java.io.IOException;
+import java.util.Optional;
 
 import javax.mail.MessagingException;
 
@@ -36,6 +37,9 @@ import org.apache.jsieve.SieveFactory;
 import org.apache.jsieve.exception.SieveException;
 import org.apache.jsieve.parser.generated.ParseException;
 import org.apache.jsieve.parser.generated.TokenMgrError;
+import org.apache.mailet.Attribute;
+import org.apache.mailet.AttributeName;
+import org.apache.mailet.AttributeValue;
 import org.apache.mailet.Mail;
 import org.apache.mailet.MailetContext;
 import org.slf4j.Logger;
@@ -46,6 +50,7 @@ import com.google.common.collect.ImmutableList;
 
 public class SieveExecutor {
     private static final Logger LOGGER = 
LoggerFactory.getLogger(SieveExecutor.class);
+    public static final AttributeName SIEVE_NOTIFICATION = 
AttributeName.of("SieveNotification");
 
     public static Builder builder() {
         return new Builder();
@@ -114,7 +119,14 @@ public class SieveExecutor {
     public boolean execute(MailAddress recipient, Mail mail) throws 
MessagingException {
         Preconditions.checkNotNull(recipient, "Recipient for mail to be 
spooled cannot be null.");
         Preconditions.checkNotNull(mail.getMessage(), "Mail message to be 
spooled cannot be null.");
-
+        Optional<Attribute> oSieveNotification = 
mail.getAttribute(SIEVE_NOTIFICATION);
+        if (oSieveNotification.isPresent()) {
+            AttributeValue<Boolean> attrValue = (AttributeValue<Boolean>) 
oSieveNotification.get().getValue();
+            if (attrValue.value()) {
+                throw new MessagingException("Do not process Sieve error 
notification emails");
+            }
+        }
+        
         return sieveMessage(recipient, mail);
     }
 
@@ -150,6 +162,7 @@ public class SieveExecutor {
     }
 
     protected void handleFailure(MailAddress recipient, Mail aMail, Exception 
ex) throws MessagingException, IOException {
+        aMail.setAttribute(new Attribute(SIEVE_NOTIFICATION, 
AttributeValue.of(true)));
         mailetContext.sendMail(recipient, ImmutableList.of(recipient), 
SieveFailureMessageComposer.composeMessage(aMail, ex, recipient.toString()));
     }
 }
diff --git 
a/server/mailet/mailets/src/test/java/org/apache/james/transport/mailets/delivery/SieveIntegrationTest.java
 
b/server/mailet/mailets/src/test/java/org/apache/james/transport/mailets/delivery/SieveIntegrationTest.java
index 9c5ea36..a287734 100644
--- 
a/server/mailet/mailets/src/test/java/org/apache/james/transport/mailets/delivery/SieveIntegrationTest.java
+++ 
b/server/mailet/mailets/src/test/java/org/apache/james/transport/mailets/delivery/SieveIntegrationTest.java
@@ -36,6 +36,7 @@ import org.apache.james.mailbox.model.MailboxPath;
 import org.apache.james.sieverepository.api.exception.ScriptNotFoundException;
 import org.apache.james.transport.mailets.Sieve;
 import org.apache.james.transport.mailets.jsieve.ResourceLocator;
+import org.apache.james.transport.mailets.jsieve.delivery.SieveExecutor;
 import org.apache.james.user.api.UsersRepository;
 import org.apache.james.util.MimeMessageUtil;
 import org.apache.mailet.Attribute;
@@ -937,6 +938,15 @@ public class SieveIntegrationTest {
             .build();
         
assertThat(fakeMailContext.getSentMails()).containsExactly(expectedSentMail);
     }
+    
+    @Test(expected = MessagingException.class)
+    public void sieveErrorNotificationEmailsShouldNotBeProcessed() throws 
Exception {
+        
prepareTestUsingScript("org/apache/james/transport/mailets/delivery/keep.script");
+
+        FakeMail mail = createMail();
+        mail.setAttribute(new Attribute(SieveExecutor.SIEVE_NOTIFICATION, 
AttributeValue.of(true)));
+        testee.service(mail);
+    }
 
     private void prepareTestUsingScript(final String script) throws Exception {
         prepareTestUsingScriptAndDates(script, DATE_DEFAULT, DATE_DEFAULT);


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

Reply via email to