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]
