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 e21f85beec484153358d2b2a40d75f7b59ca1423 Author: Benoit TELLIER <btell...@linagora.com> AuthorDate: Tue Dec 19 08:11:57 2023 +0100 JAMES-3944 IsSenderInRRTLoop should also rely on recorded recipients This allows detecting and breaking loops involving filtering rules. Note that it enabled using the classing "rrt-error" processor involving a bounce in order to notify the sender (if possible). --- .../james/mailets/ForwardLoopIntegrationTest.java | 7 +----- .../transport/matchers/IsSenderInRRTLoop.java | 11 ++++++++- .../transport/matchers/IsSenderInRRTLoopTest.java | 27 ++++++++++++++++++++++ 3 files changed, 38 insertions(+), 7 deletions(-) diff --git a/server/mailet/integration-testing/src/test/java/org/apache/james/mailets/ForwardLoopIntegrationTest.java b/server/mailet/integration-testing/src/test/java/org/apache/james/mailets/ForwardLoopIntegrationTest.java index 1168a86d28..2e5ddd4474 100644 --- a/server/mailet/integration-testing/src/test/java/org/apache/james/mailets/ForwardLoopIntegrationTest.java +++ b/server/mailet/integration-testing/src/test/java/org/apache/james/mailets/ForwardLoopIntegrationTest.java @@ -108,12 +108,7 @@ public class ForwardLoopIntegrationTest { .mailet(ToRepository.class) .addProperty("repositoryPath", CUSTOM_REPOSITORY.asString()))) .putProcessor(CommonProcessors.error()) - .putProcessor(ProcessorConfiguration.builder() - .state("rrt-error") - .addMailet(MailetConfiguration.builder() - .matcher(All.class) - .mailet(ToRepository.class) - .addProperty("repositoryPath", RRT_ERROR_REPOSITORY.asString()))) + .putProcessor(CommonProcessors.rrtError()) .putProcessor(CommonProcessors.transport()) .putProcessor(CommonProcessors.bounces())) .build(temporaryFolder); diff --git a/server/mailet/mailets/src/main/java/org/apache/james/transport/matchers/IsSenderInRRTLoop.java b/server/mailet/mailets/src/main/java/org/apache/james/transport/matchers/IsSenderInRRTLoop.java index 31cb937e94..9c52eb2ce2 100644 --- a/server/mailet/mailets/src/main/java/org/apache/james/transport/matchers/IsSenderInRRTLoop.java +++ b/server/mailet/mailets/src/main/java/org/apache/james/transport/matchers/IsSenderInRRTLoop.java @@ -25,6 +25,7 @@ import javax.inject.Inject; import org.apache.james.core.MailAddress; import org.apache.james.rrt.api.RecipientRewriteTable; +import org.apache.mailet.LoopPrevention; import org.apache.mailet.Mail; import org.apache.mailet.base.GenericMatcher; import org.slf4j.LoggerFactory; @@ -64,6 +65,14 @@ public class IsSenderInRRTLoop extends GenericMatcher { } catch (Exception e) { LoggerFactory.getLogger(IsSenderInRRTLoop.class).warn("Error while executing RRT"); } - return ImmutableList.of(); + return mail.getMaybeSender() + .asOptional() + .filter(sender -> recordedRecipientsContainSender(mail, sender)) + .map(any -> mail.getRecipients()) + .orElse(ImmutableList.of()); + } + + private static boolean recordedRecipientsContainSender(Mail mail, MailAddress sender) { + return LoopPrevention.RecordedRecipients.fromMail(mail).getRecipients().contains(sender); } } diff --git a/server/mailet/mailets/src/test/java/org/apache/james/transport/matchers/IsSenderInRRTLoopTest.java b/server/mailet/mailets/src/test/java/org/apache/james/transport/matchers/IsSenderInRRTLoopTest.java index 775be5f851..e4999fd59d 100644 --- a/server/mailet/mailets/src/test/java/org/apache/james/transport/matchers/IsSenderInRRTLoopTest.java +++ b/server/mailet/mailets/src/test/java/org/apache/james/transport/matchers/IsSenderInRRTLoopTest.java @@ -34,6 +34,7 @@ import org.apache.james.rrt.api.RecipientRewriteTable; import org.apache.james.rrt.api.RecipientRewriteTableConfiguration; import org.apache.james.rrt.lib.MappingSource; import org.apache.james.rrt.memory.MemoryRecipientRewriteTable; +import org.apache.mailet.LoopPrevention; import org.apache.mailet.base.test.FakeMail; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; @@ -66,6 +67,32 @@ class IsSenderInRRTLoopTest { assertThat(result).isEmpty(); } + @Test + void matchShouldReturnRecipientsWhenSenderIsRecorded() throws Exception { + FakeMail mail = FakeMail.builder() + .name("name") + .sender(SENDER) + .recipient(RECIPIENT1) + .build(); + LoopPrevention.RecordedRecipients.fromMail(mail).merge(SENDER).recordOn(mail); + Collection<MailAddress> result = testee.match(mail); + + assertThat(result).containsOnly(RECIPIENT1); + } + + @Test + void matchShouldReturnEmptyWhenOnlyRecipientIsRecorded() throws Exception { + FakeMail mail = FakeMail.builder() + .name("name") + .sender(SENDER) + .recipient(RECIPIENT1) + .build(); + LoopPrevention.RecordedRecipients.fromMail(mail).merge(RECIPIENT1).recordOn(mail); + Collection<MailAddress> result = testee.match(mail); + + assertThat(result).isEmpty(); + } + @Test void matchShouldNotFailWhenNoSender() throws Exception { Collection<MailAddress> result = testee.match(FakeMail.builder() --------------------------------------------------------------------- To unsubscribe, e-mail: notifications-unsubscr...@james.apache.org For additional commands, e-mail: notifications-h...@james.apache.org