JAMES-2366 Handle Forward mappings in RRT mailet
Project: http://git-wip-us.apache.org/repos/asf/james-project/repo Commit: http://git-wip-us.apache.org/repos/asf/james-project/commit/c9078f25 Tree: http://git-wip-us.apache.org/repos/asf/james-project/tree/c9078f25 Diff: http://git-wip-us.apache.org/repos/asf/james-project/diff/c9078f25 Branch: refs/heads/master Commit: c9078f2569c6cef757f8e6104efb77732bc58164 Parents: d1b0a11 Author: Antoine Duprat <adup...@linagora.com> Authored: Thu Mar 29 16:50:35 2018 +0200 Committer: Antoine Duprat <adup...@linagora.com> Committed: Fri Apr 6 14:39:17 2018 +0200 ---------------------------------------------------------------------- .../RecipientRewriteTableIntegrationTest.java | 69 +++++++++++++++++--- .../mailets/RecipientRewriteTableProcessor.java | 23 +++++-- 2 files changed, 77 insertions(+), 15 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/james-project/blob/c9078f25/server/mailet/integration-testing/src/test/java/org/apache/james/mailets/RecipientRewriteTableIntegrationTest.java ---------------------------------------------------------------------- diff --git a/server/mailet/integration-testing/src/test/java/org/apache/james/mailets/RecipientRewriteTableIntegrationTest.java b/server/mailet/integration-testing/src/test/java/org/apache/james/mailets/RecipientRewriteTableIntegrationTest.java index c176fba..2268a78 100644 --- a/server/mailet/integration-testing/src/test/java/org/apache/james/mailets/RecipientRewriteTableIntegrationTest.java +++ b/server/mailet/integration-testing/src/test/java/org/apache/james/mailets/RecipientRewriteTableIntegrationTest.java @@ -25,6 +25,7 @@ import static org.apache.james.mailets.configuration.Constants.LOCALHOST_IP; import static org.apache.james.mailets.configuration.Constants.PASSWORD; import static org.apache.james.mailets.configuration.Constants.SMTP_PORT; import static org.apache.james.mailets.configuration.Constants.awaitAtMostOneMinute; +import static org.assertj.core.api.Assertions.assertThat; import org.apache.james.probe.DataProbe; import org.apache.james.utils.DataProbeImpl; @@ -39,11 +40,16 @@ import org.junit.rules.TemporaryFolder; public class RecipientRewriteTableIntegrationTest { private static final String JAMES_ANOTHER_DOMAIN = "james.com"; - private static final String FROM = "fromUser@" + DEFAULT_DOMAIN; - private static final String RECIPIENT = "touser@" + DEFAULT_DOMAIN; - private static final String ANY_AT_JAMES = "any@" + DEFAULT_DOMAIN; + private static final String FROM_LOCAL_PART = "fromUser"; + private static final String FROM = FROM_LOCAL_PART + "@" + DEFAULT_DOMAIN; + private static final String RECIPIENT_LOCAL_PART = "touser"; + private static final String RECIPIENT = RECIPIENT_LOCAL_PART + "@" + DEFAULT_DOMAIN; + private static final String ANY_LOCAL_PART = "any"; + private static final String ANY_AT_JAMES = ANY_LOCAL_PART + "@" + DEFAULT_DOMAIN; private static final String OTHER_AT_JAMES = "other@" + DEFAULT_DOMAIN; - private static final String ANY_AT_ANOTHER_DOMAIN = "any@" + JAMES_ANOTHER_DOMAIN; + private static final String ANY_AT_ANOTHER_DOMAIN = ANY_LOCAL_PART + "@" + JAMES_ANOTHER_DOMAIN; + private static final String GROUP_LOCAL_PART = "group"; + private static final String GROUP = GROUP_LOCAL_PART + "@" + DEFAULT_DOMAIN; @Rule public TemporaryFolder temporaryFolder = new TemporaryFolder(); @@ -75,8 +81,8 @@ public class RecipientRewriteTableIntegrationTest { @Test public void rrtServiceShouldDeliverEmailToMappingRecipients() throws Exception { - dataProbe.addAddressMapping("touser", DEFAULT_DOMAIN, ANY_AT_JAMES); - dataProbe.addAddressMapping("touser", DEFAULT_DOMAIN, OTHER_AT_JAMES); + dataProbe.addAddressMapping(RECIPIENT_LOCAL_PART, DEFAULT_DOMAIN, ANY_AT_JAMES); + dataProbe.addAddressMapping(RECIPIENT_LOCAL_PART, DEFAULT_DOMAIN, OTHER_AT_JAMES); messageSender.connect(LOCALHOST_IP, SMTP_PORT) .sendMessage(FROM, RECIPIENT) @@ -86,16 +92,18 @@ public class RecipientRewriteTableIntegrationTest { .login(ANY_AT_JAMES, PASSWORD) .select(IMAPMessageReader.INBOX) .awaitMessage(awaitAtMostOneMinute); + assertThat(imapMessageReader.readFirstMessage()).isNotNull(); imapMessageReader.connect(LOCALHOST_IP, IMAP_PORT) .login(OTHER_AT_JAMES, PASSWORD) .select(IMAPMessageReader.INBOX) .awaitMessage(awaitAtMostOneMinute); + assertThat(imapMessageReader.readFirstMessage()).isNotNull(); } @Test public void rrtServiceShouldNotDeliverEmailToRecipientWhenHaveMappingRecipients() throws Exception { - dataProbe.addAddressMapping("touser", DEFAULT_DOMAIN, ANY_AT_JAMES); - dataProbe.addAddressMapping("touser", DEFAULT_DOMAIN, OTHER_AT_JAMES); + dataProbe.addAddressMapping(RECIPIENT_LOCAL_PART, DEFAULT_DOMAIN, ANY_AT_JAMES); + dataProbe.addAddressMapping(RECIPIENT_LOCAL_PART, DEFAULT_DOMAIN, OTHER_AT_JAMES); messageSender.connect(LOCALHOST_IP, SMTP_PORT) .sendMessage(FROM, RECIPIENT) @@ -105,6 +113,7 @@ public class RecipientRewriteTableIntegrationTest { .login(RECIPIENT, PASSWORD) .select(IMAPMessageReader.INBOX) .awaitNoMessage(awaitAtMostOneMinute); + assertThat(imapMessageReader.readFirstMessage()).isNotNull(); } @Test @@ -113,8 +122,8 @@ public class RecipientRewriteTableIntegrationTest { String localUser = nonDomainUser + "@" + dataProbe.getDefaultDomain(); dataProbe.addUser(localUser, PASSWORD); - dataProbe.addAddressMapping("touser", DEFAULT_DOMAIN, nonDomainUser); - dataProbe.addAddressMapping("touser", DEFAULT_DOMAIN, OTHER_AT_JAMES); + dataProbe.addAddressMapping(RECIPIENT_LOCAL_PART, DEFAULT_DOMAIN, nonDomainUser); + dataProbe.addAddressMapping(RECIPIENT_LOCAL_PART, DEFAULT_DOMAIN, OTHER_AT_JAMES); messageSender.connect(LOCALHOST_IP, SMTP_PORT) .sendMessage(FROM, RECIPIENT) @@ -124,10 +133,12 @@ public class RecipientRewriteTableIntegrationTest { .login(localUser, PASSWORD) .select(IMAPMessageReader.INBOX) .awaitMessage(awaitAtMostOneMinute); + assertThat(imapMessageReader.readFirstMessage()).isNotNull(); imapMessageReader.connect(LOCALHOST_IP, IMAP_PORT) .login(OTHER_AT_JAMES, PASSWORD) .select(IMAPMessageReader.INBOX) .awaitMessage(awaitAtMostOneMinute); + assertThat(imapMessageReader.readFirstMessage()).isNotNull(); } @Test @@ -143,6 +154,7 @@ public class RecipientRewriteTableIntegrationTest { .login(ANY_AT_ANOTHER_DOMAIN, PASSWORD) .select(IMAPMessageReader.INBOX) .awaitMessage(awaitAtMostOneMinute); + assertThat(imapMessageReader.readFirstMessage()).isNotNull(); } @Test @@ -158,6 +170,43 @@ public class RecipientRewriteTableIntegrationTest { .login(ANY_AT_JAMES, PASSWORD) .select(IMAPMessageReader.INBOX) .awaitNoMessage(awaitAtMostOneMinute); + assertThat(imapMessageReader.readFirstMessage()).isNotNull(); } + @Test + public void rrtServiceShouldDeliverEmailToForwardRecipients() throws Exception { + dataProbe.addForwardMapping(RECIPIENT_LOCAL_PART, DEFAULT_DOMAIN, ANY_AT_JAMES); + dataProbe.addForwardMapping(RECIPIENT_LOCAL_PART, DEFAULT_DOMAIN, OTHER_AT_JAMES); + + messageSender.connect(LOCALHOST_IP, SMTP_PORT) + .sendMessage(FROM, RECIPIENT) + .awaitSent(awaitAtMostOneMinute); + + imapMessageReader.connect(LOCALHOST_IP, IMAP_PORT) + .login(ANY_AT_JAMES, PASSWORD) + .select(IMAPMessageReader.INBOX) + .awaitMessage(awaitAtMostOneMinute); + imapMessageReader.connect(LOCALHOST_IP, IMAP_PORT) + .login(OTHER_AT_JAMES, PASSWORD) + .select(IMAPMessageReader.INBOX) + .awaitMessage(awaitAtMostOneMinute); + assertThat(imapMessageReader.readFirstMessage()).isNotNull(); + } + + @Test + public void rrtServiceShouldFollowForwardWhenSendingToAGroup() throws Exception { + dataProbe.addAddressMapping(GROUP_LOCAL_PART, DEFAULT_DOMAIN, ANY_AT_JAMES); + + dataProbe.addForwardMapping(ANY_LOCAL_PART, DEFAULT_DOMAIN, OTHER_AT_JAMES); + + messageSender.connect(LOCALHOST_IP, SMTP_PORT) + .sendMessage(FROM, GROUP) + .awaitSent(awaitAtMostOneMinute); + + imapMessageReader.connect(LOCALHOST_IP, IMAP_PORT) + .login(OTHER_AT_JAMES, PASSWORD) + .select(IMAPMessageReader.INBOX) + .awaitMessage(awaitAtMostOneMinute); + assertThat(imapMessageReader.readFirstMessage()).isNotNull(); + } } http://git-wip-us.apache.org/repos/asf/james-project/blob/c9078f25/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/RecipientRewriteTableProcessor.java ---------------------------------------------------------------------- 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 76961e4..c1bc666 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 @@ -36,6 +36,7 @@ import org.apache.james.rrt.api.RecipientRewriteTable; 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.Mapping.Type; import org.apache.james.rrt.lib.Mappings; import org.apache.james.util.MemoizedSupplier; import org.apache.james.util.OptionalUtils; @@ -105,14 +106,26 @@ public class RecipientRewriteTableProcessor { private final Supplier<Domain> defaultDomainSupplier; private static final Function<Mapping, Optional<MailAddress>> mailAddressFromMapping = - addressMapping -> { - try { - return Optional.of(new MailAddress(addressMapping.asString())); - } catch (AddressException e) { - return Optional.empty(); + mapping -> { + Type type = mapping.getType(); + switch (type) { + case Address: + return parseMappingToMailAddress(mapping.asString()); + case Forward: + return parseMappingToMailAddress(type.withoutPrefix(mapping.asString())); + default: + return Optional.empty(); } }; + private static Optional<MailAddress> parseMappingToMailAddress(String mapping) { + try { + return Optional.of(new MailAddress(mapping)); + } catch (AddressException e) { + return Optional.empty(); + } + } + public RecipientRewriteTableProcessor(RecipientRewriteTable virtualTableStore, DomainList domainList, MailetContext mailetContext) { this.virtualTableStore = virtualTableStore; this.mailetContext = mailetContext; --------------------------------------------------------------------- To unsubscribe, e-mail: server-dev-unsubscr...@james.apache.org For additional commands, e-mail: server-dev-h...@james.apache.org