You are viewing a plain text version of this content. The canonical link for it is here.
Posted to server-dev@james.apache.org by bt...@apache.org on 2019/05/16 08:48:38 UTC
[james-project] 23/23: JAMES-2770 RRT rewriting can lead to
duplicated mails
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 895b50b1fbcb375bfc815d88518fc0985dcaafa6
Author: Benoit Tellier <bt...@linagora.com>
AuthorDate: Wed May 15 11:56:05 2019 +0700
JAMES-2770 RRT rewriting can lead to duplicated mails
---
.../james/transport/mailets/AliasMappingTest.java | 19 +++++++++++++++++
.../mailets/RecipientRewriteTableProcessor.java | 24 ++++++++++++----------
.../RecipientRewriteTableProcessorTest.java | 21 +++++++++++++++++++
3 files changed, 53 insertions(+), 11 deletions(-)
diff --git a/server/mailet/integration-testing/src/test/java/org/apache/james/transport/mailets/AliasMappingTest.java b/server/mailet/integration-testing/src/test/java/org/apache/james/transport/mailets/AliasMappingTest.java
index 116b522..0fe2f42 100644
--- a/server/mailet/integration-testing/src/test/java/org/apache/james/transport/mailets/AliasMappingTest.java
+++ b/server/mailet/integration-testing/src/test/java/org/apache/james/transport/mailets/AliasMappingTest.java
@@ -343,4 +343,23 @@ public class AliasMappingTest {
.getRepositoryMailCount(RRT_ERROR_REPOSITORY) == 1);
}
+ @Test
+ public void userShouldNotReceiveDuplicatesWhenUserAndAliasRegisteredToAGroup() throws Exception {
+ webAdminApi.put(AliasRoutes.ROOT_PATH + "/" + BOB_ADDRESS + "/sources/" + BOB_ALIAS);
+ webAdminApi.put(GroupsRoutes.ROOT_PATH + "/" + GROUP_ADDRESS + "/" + BOB_ADDRESS);
+ webAdminApi.put(GroupsRoutes.ROOT_PATH + "/" + GROUP_ADDRESS + "/" + BOB_ALIAS);
+
+ messageSender.connect(LOCALHOST_IP, jamesServer.getProbe(SmtpGuiceProbe.class).getSmtpPort())
+ .sendMessage(FakeMail.builder()
+ .name("name")
+ .mimeMessage(message)
+ .sender(ALICE_ADDRESS)
+ .recipient(GROUP_ADDRESS));
+
+ imapMessageReader.connect(LOCALHOST_IP, jamesServer.getProbe(ImapGuiceProbe.class).getImapPort())
+ .login(BOB_ADDRESS, PASSWORD)
+ .select(IMAPMessageReader.INBOX)
+ .awaitMessageCount(awaitAtMostOneMinute, 1);
+ }
+
}
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 18ead89..dd890c4 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
@@ -22,6 +22,7 @@ package org.apache.james.transport.mailets;
import java.util.Collection;
import java.util.List;
import java.util.Map;
+import java.util.Set;
import java.util.function.Function;
import java.util.function.Supplier;
import java.util.stream.Collectors;
@@ -49,52 +50,53 @@ import com.github.fge.lambdas.Throwing;
import com.google.common.annotations.VisibleForTesting;
import com.google.common.base.Preconditions;
import com.google.common.collect.ImmutableList;
+import com.google.common.collect.ImmutableSet;
public class RecipientRewriteTableProcessor {
private static final Logger LOGGER = LoggerFactory.getLogger(RecipientRewriteTableProcessor.class);
private static class RrtExecutionResult {
private static RrtExecutionResult empty() {
- return new RrtExecutionResult(ImmutableList.of(), ImmutableList.of());
+ return new RrtExecutionResult(ImmutableSet.of(), ImmutableSet.of());
}
private static RrtExecutionResult error(MailAddress mailAddress) {
- return new RrtExecutionResult(ImmutableList.of(), ImmutableList.of(mailAddress));
+ return new RrtExecutionResult(ImmutableSet.of(), ImmutableSet.of(mailAddress));
}
private static RrtExecutionResult success(MailAddress mailAddress) {
- return new RrtExecutionResult(ImmutableList.of(mailAddress), ImmutableList.of());
+ return new RrtExecutionResult(ImmutableSet.of(mailAddress), ImmutableSet.of());
}
private static RrtExecutionResult success(List<MailAddress> mailAddresses) {
- return new RrtExecutionResult(ImmutableList.copyOf(mailAddresses), ImmutableList.of());
+ return new RrtExecutionResult(ImmutableSet.copyOf(mailAddresses), ImmutableSet.of());
}
private static RrtExecutionResult merge(RrtExecutionResult result1, RrtExecutionResult result2) {
return new RrtExecutionResult(
- ImmutableList.<MailAddress>builder()
+ ImmutableSet.<MailAddress>builder()
.addAll(result1.getNewRecipients())
.addAll(result2.getNewRecipients())
.build(),
- ImmutableList.<MailAddress>builder()
+ ImmutableSet.<MailAddress>builder()
.addAll(result1.getRecipientWithError())
.addAll(result2.getRecipientWithError())
.build());
}
- private final ImmutableList<MailAddress> newRecipients;
- private final ImmutableList<MailAddress> recipientWithError;
+ private final ImmutableSet<MailAddress> newRecipients;
+ private final ImmutableSet<MailAddress> recipientWithError;
- public RrtExecutionResult(ImmutableList<MailAddress> newRecipients, ImmutableList<MailAddress> recipientWithError) {
+ public RrtExecutionResult(ImmutableSet<MailAddress> newRecipients, ImmutableSet<MailAddress> recipientWithError) {
this.newRecipients = newRecipients;
this.recipientWithError = recipientWithError;
}
- public List<MailAddress> getNewRecipients() {
+ public Set<MailAddress> getNewRecipients() {
return newRecipients;
}
- public List<MailAddress> getRecipientWithError() {
+ public Set<MailAddress> getRecipientWithError() {
return recipientWithError;
}
diff --git a/server/mailet/mailets/src/test/java/org/apache/james/transport/mailets/RecipientRewriteTableProcessorTest.java b/server/mailet/mailets/src/test/java/org/apache/james/transport/mailets/RecipientRewriteTableProcessorTest.java
index 6290fab..746ebef 100644
--- a/server/mailet/mailets/src/test/java/org/apache/james/transport/mailets/RecipientRewriteTableProcessorTest.java
+++ b/server/mailet/mailets/src/test/java/org/apache/james/transport/mailets/RecipientRewriteTableProcessorTest.java
@@ -35,6 +35,7 @@ import org.apache.james.domainlist.api.DomainList;
import org.apache.james.domainlist.api.DomainListException;
import org.apache.james.rrt.api.RecipientRewriteTable.ErrorMappingException;
import org.apache.james.rrt.api.RecipientRewriteTableException;
+import org.apache.james.rrt.lib.Mapping;
import org.apache.james.rrt.lib.MappingsImpl;
import org.apache.james.util.MimeMessageUtil;
import org.apache.mailet.Mail;
@@ -258,6 +259,26 @@ public class RecipientRewriteTableProcessorTest {
assertThat(mailetContext.getSentMails()).containsOnly(expected);
assertThat(mail.getRecipients()).containsOnly(MailAddressFixture.ANY_AT_LOCAL);
}
+
+ @Test
+ public void processShouldNotDuplicateRewrittenMailAddresses() throws Exception {
+ when(virtualTableStore.getResolvedMappings(eq("other"), eq(Domain.of(MailAddressFixture.JAMES_LOCAL))))
+ .thenReturn(MappingsImpl.builder()
+ .add(Mapping.alias(MailAddressFixture.ANY_AT_LOCAL.asString()))
+ .add(Mapping.group(MailAddressFixture.ANY_AT_LOCAL.asString()))
+ .build());
+
+ mail = FakeMail.builder()
+ .name("mail")
+ .sender(MailAddressFixture.ANY_AT_JAMES)
+ .mimeMessage(message)
+ .recipients(MailAddressFixture.OTHER_AT_LOCAL)
+ .build();
+
+ processor.processMail(mail);
+
+ assertThat(mail.getRecipients()).containsExactly(MailAddressFixture.ANY_AT_LOCAL);
+ }
@Test
public void processShouldSendMailToAllErrorRecipientsWhenRecipientRewriteTableException() throws Exception {
---------------------------------------------------------------------
To unsubscribe, e-mail: server-dev-unsubscribe@james.apache.org
For additional commands, e-mail: server-dev-help@james.apache.org