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 45356a83d168bd6db714c7ae7f5d612d3d9f26ad
Author: Rene Cordier <rcord...@linagora.com>
AuthorDate: Fri Dec 15 11:37:12 2023 +0700

    JAMES-3944 Forcing local copy out of forwards
---
 .../james/mailets/ForwardIntegrationTest.java      | 13 +++--
 .../james/mailets/ForwardLoopIntegrationTest.java  | 62 ++++++++++++++++------
 .../mailets/RecipientRewriteTableProcessor.java    | 16 ++++--
 3 files changed, 67 insertions(+), 24 deletions(-)

diff --git 
a/server/mailet/integration-testing/src/test/java/org/apache/james/mailets/ForwardIntegrationTest.java
 
b/server/mailet/integration-testing/src/test/java/org/apache/james/mailets/ForwardIntegrationTest.java
index b4dff71d2f..2c93ef3617 100644
--- 
a/server/mailet/integration-testing/src/test/java/org/apache/james/mailets/ForwardIntegrationTest.java
+++ 
b/server/mailet/integration-testing/src/test/java/org/apache/james/mailets/ForwardIntegrationTest.java
@@ -27,6 +27,7 @@ import static 
org.apache.james.mailets.configuration.Constants.PASSWORD;
 import java.io.File;
 
 import org.apache.james.core.MailAddress;
+import org.apache.james.core.MaybeSender;
 import org.apache.james.core.Username;
 import org.apache.james.mailets.configuration.CommonProcessors;
 import org.apache.james.mailets.configuration.MailetConfiguration;
@@ -323,13 +324,19 @@ public class ForwardIntegrationTest {
             .authenticate(FROM, PASSWORD)
             .sendMessage(FROM, BOB.asString());
 
-        Awaitility.await().until(() -> 
mailRepositoryProbe.getRepositoryMailCount(CUSTOM_REPOSITORY) == 1L);
+        Awaitility.await().until(() -> 
mailRepositoryProbe.getRepositoryMailCount(CUSTOM_REPOSITORY) == 2L);
 
         SoftAssertions.assertSoftly(Throwing.consumer(softly -> {
             Mail forwardedMail = 
mailRepositoryProbe.listMails(CUSTOM_REPOSITORY)
+                .filter(mail -> 
mail.getMaybeSender().asString().equals(BOB.asString()))
+                .findAny().get();
+            Mail originalMail = 
mailRepositoryProbe.listMails(CUSTOM_REPOSITORY)
+                .filter(mail -> mail.getMaybeSender().asString().equals(FROM))
                 .findAny().get();
-            
softly.assertThat(forwardedMail.getRecipients()).containsOnly(DELPHINE.asMailAddress(),
 BOB.asMailAddress());
+            
softly.assertThat(forwardedMail.getRecipients()).containsOnly(DELPHINE.asMailAddress());
             
softly.assertThat(forwardedMail.getMaybeSender().asOptional()).contains(BOB.asMailAddress());
+            
softly.assertThat(originalMail.getRecipients()).containsOnly(BOB.asMailAddress());
+            
softly.assertThat(originalMail.getMaybeSender().asOptional().map(MailAddress::asString)).contains(FROM);
         }));
     }
 
@@ -349,7 +356,7 @@ public class ForwardIntegrationTest {
             Mail forwardedMail = 
mailRepositoryProbe.listMails(CUSTOM_REPOSITORY)
                 .findAny().get();
             
softly.assertThat(forwardedMail.getRecipients()).containsOnly(BOB.asMailAddress());
-            
softly.assertThat(forwardedMail.getMaybeSender().asOptional()).contains(BOB.asMailAddress());
+            
softly.assertThat(forwardedMail.getMaybeSender().asOptional().map(MailAddress::asString)).contains(FROM);
         }));
     }
 
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 b892ff7258..a2f665a869 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
@@ -183,14 +183,7 @@ public class ForwardLoopIntegrationTest {
             .sendMessage(SENDER.asString(), ALICE.asString());
 
         Awaitility.await().until(() -> 
jamesServer.getProbe(SpoolerProbe.class).processingFinished());
-        Awaitility.await().until(() -> 
mailRepositoryProbe.getRepositoryMailCount(CUSTOM_REPOSITORY) == 1L);
-
-        SoftAssertions.assertSoftly(Throwing.consumer(softly -> {
-            List<Mail> mails = mailRepositoryProbe.listMails(CUSTOM_REPOSITORY)
-                .collect(ImmutableList.toImmutableList());
-
-            
softly.assertThat(mails.get(0).getRecipients()).containsOnly(CEDRIC.asMailAddress());
-        }));
+        Awaitility.await().until(() -> 
mailRepositoryProbe.getRepositoryMailCount(CUSTOM_REPOSITORY) == 0L);
     }
 
     @Test
@@ -208,10 +201,9 @@ public class ForwardLoopIntegrationTest {
         Awaitility.await().until(() -> 
mailRepositoryProbe.getRepositoryMailCount(CUSTOM_REPOSITORY) == 1L);
 
         SoftAssertions.assertSoftly(Throwing.consumer(softly -> {
-            List<Mail> mails = mailRepositoryProbe.listMails(CUSTOM_REPOSITORY)
-                .collect(ImmutableList.toImmutableList());
-
-            
softly.assertThat(mails.get(0).getRecipients()).containsOnly(SENDER.asMailAddress());
+            Mail mail = 
mailRepositoryProbe.listMails(CUSTOM_REPOSITORY).findAny().get();
+            
softly.assertThat(mail.getRecipients()).containsOnly(SENDER.asMailAddress());
+            
softly.assertThat(mail.getMaybeSender().asOptional()).contains(CEDRIC.asMailAddress());
         }));
     }
 
@@ -305,14 +297,50 @@ public class ForwardLoopIntegrationTest {
             .sendMessage(SENDER.asString(), ALICE.asString());
 
         Awaitility.await().until(() -> 
jamesServer.getProbe(SpoolerProbe.class).processingFinished());
-        Awaitility.await().until(() -> 
mailRepositoryProbe.getRepositoryMailCount(CUSTOM_REPOSITORY) == 2L);
+        Awaitility.await().until(() -> 
mailRepositoryProbe.getRepositoryMailCount(CUSTOM_REPOSITORY) == 1L);
 
         SoftAssertions.assertSoftly(Throwing.consumer(softly -> {
-            List<Mail> mailListOne = 
mailRepositoryProbe.listMails(CUSTOM_REPOSITORY, ALICE.asMailAddress());
-            
softly.assertThat(mailListOne.get(0).getRecipients()).containsOnly(ALICE.asMailAddress());
+            Mail mail = 
mailRepositoryProbe.listMails(CUSTOM_REPOSITORY).findAny().get();
+            
softly.assertThat(mail.getRecipients()).containsOnly(ALICE.asMailAddress());
+            
softly.assertThat(mail.getRecipients()).containsOnly(ALICE.asMailAddress());
+        }));
+    }
 
-            List<Mail> mailListTwo = 
mailRepositoryProbe.listMails(CUSTOM_REPOSITORY, CEDRIC.asMailAddress());
-            
softly.assertThat(mailListTwo.get(0).getRecipients()).containsOnly(CEDRIC.asMailAddress());
+    @Test
+    void localCopyShouldNotOverrideForwardRules() throws Exception {
+        dataProbe.addMapping(MappingSource.fromUser(ALICE), 
Mapping.forward(ALICE.asString()));
+        filteringManagementProbe.defineRulesForUser(ALICE, 
asRule(Forward.to(BOB.asMailAddress()).withoutACopy()));
+
+        messageSender.connect(LOCALHOST_IP, 
jamesServer.getProbe(SmtpGuiceProbe.class).getSmtpPort())
+            .authenticate(SENDER.asString(), PASSWORD)
+            .sendMessage(SENDER.asString(), ALICE.asString());
+
+        Awaitility.await().until(() -> 
jamesServer.getProbe(SpoolerProbe.class).processingFinished());
+        Awaitility.await().until(() -> 
mailRepositoryProbe.getRepositoryMailCount(CUSTOM_REPOSITORY) == 1L);
+
+        SoftAssertions.assertSoftly(Throwing.consumer(softly -> {
+            Mail mail = 
mailRepositoryProbe.listMails(CUSTOM_REPOSITORY).findAny().get();
+            
softly.assertThat(mail.getMaybeSender().asOptional()).contains(ALICE.asMailAddress());
+            
softly.assertThat(mail.getRecipients()).containsOnly(BOB.asMailAddress());
+        }));
+    }
+
+    @Test
+    void localCopyRuleShouldNotOverrideForward() throws Exception {
+        filteringManagementProbe.defineRulesForUser(ALICE, 
asRule(Forward.to(ALICE.asMailAddress()).withoutACopy()));
+        dataProbe.addMapping(MappingSource.fromUser(ALICE), 
Mapping.forward(BOB.asString()));
+
+        messageSender.connect(LOCALHOST_IP, 
jamesServer.getProbe(SmtpGuiceProbe.class).getSmtpPort())
+            .authenticate(SENDER.asString(), PASSWORD)
+            .sendMessage(SENDER.asString(), ALICE.asString());
+
+        Awaitility.await().until(() -> 
jamesServer.getProbe(SpoolerProbe.class).processingFinished());
+        Awaitility.await().until(() -> 
mailRepositoryProbe.getRepositoryMailCount(CUSTOM_REPOSITORY) == 1L);
+
+        SoftAssertions.assertSoftly(Throwing.consumer(softly -> {
+            Mail mail = 
mailRepositoryProbe.listMails(CUSTOM_REPOSITORY).findAny().get();
+            
softly.assertThat(mail.getRecipients()).containsOnly(BOB.asMailAddress());
+            
softly.assertThat(mail.getMaybeSender().asOptional()).contains(ALICE.asMailAddress());
         }));
     }
 }
diff --git 
a/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/RecipientRewriteTableProcessor.java
 
b/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/RecipientRewriteTableProcessor.java
index f57372db3d..a34c12482c 100644
--- 
a/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/RecipientRewriteTableProcessor.java
+++ 
b/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/RecipientRewriteTableProcessor.java
@@ -66,6 +66,7 @@ import com.google.common.collect.ImmutableList;
 import com.google.common.collect.ImmutableListMultimap;
 import com.google.common.collect.ImmutableMap;
 import com.google.common.collect.ImmutableSet;
+import com.google.common.collect.Sets;
 
 public class RecipientRewriteTableProcessor {
     private static final Logger LOGGER = 
LoggerFactory.getLogger(RecipientRewriteTableProcessor.class);
@@ -288,15 +289,22 @@ public class RecipientRewriteTableProcessor {
 
         Set<MailAddress> newRecipients = 
recordedRecipients.nonRecordedRecipients(forwardedRecipients);
 
+        Set<MailAddress> forwardRecipients = Sets.difference(newRecipients, 
ImmutableSet.of(originalRecipient));
+
         if (recordedRecipients.getRecipients().contains(originalRecipient)) {
             return Stream.of();
         }
 
-        if (!newRecipients.isEmpty()) {
-            return Stream.of(ForwardDecision.sendACopy(mailetContext, 
originalRecipient, newRecipients),
-                ForwardDecision.removeRecipient(originalRecipient));
+        ImmutableList.Builder<ForwardDecision> result = 
ImmutableList.builder();
+
+        if (!forwardRecipients.isEmpty()) {
+            result.add(ForwardDecision.sendACopy(mailetContext, 
originalRecipient, forwardRecipients));
         }
-        return Stream.empty();
+        if (!newRecipients.contains(originalRecipient)) {
+            result.add(ForwardDecision.removeRecipient(originalRecipient));
+        }
+
+        return result.build().stream();
     }
 
     private ImmutableSet<Mapping> getForwards(MailAddress recipient) throws 
RecipientRewriteTableException {


---------------------------------------------------------------------
To unsubscribe, e-mail: notifications-unsubscr...@james.apache.org
For additional commands, e-mail: notifications-h...@james.apache.org

Reply via email to