You are viewing a plain text version of this content. The canonical link for it is here.
Posted to server-dev@james.apache.org by bt...@apache.org on 2019/03/26 04:39:38 UTC

[james-project] 07/10: JAMES-2682 Prevent infinite loop with Sieve error notifications

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 <pa...@gmail.com>
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: server-dev-unsubscribe@james.apache.org
For additional commands, e-mail: server-dev-help@james.apache.org