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

Reply via email to