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