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