This is an automated email from the ASF dual-hosted git repository. rouazana pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/james-project.git
The following commit(s) were added to refs/heads/master by this push: new 03d42b1 JAMES-2735 Update mailet and matcher that uses the headers and the per recipients new b480dcb Merge remote-tracking branch 'foilen/JAMES-2735' 03d42b1 is described below commit 03d42b12c387785baebf5624a2bd40cc56b76006 Author: Simon Levesque <si...@foilen.com> AuthorDate: Thu Jul 11 06:50:02 2019 -0400 JAMES-2735 Update mailet and matcher that uses the headers and the per recipients --- .../james/transport/mailets/RemoveMimeHeader.java | 24 ++++++- .../mailets/RemoveMimeHeaderByPrefix.java | 21 +++++- .../apache/james/transport/matchers/HasHeader.java | 78 ++++++++++++++++------ .../transport/matchers/HasHeaderWithPrefix.java | 18 ++++- .../mailets/RemoveMimeHeaderByPrefixTest.java | 30 +++++++++ .../transport/mailets/RemoveMimeHeaderTest.java | 66 ++++++++++++++++++ .../james/transport/matchers/HasHeaderTest.java | 45 ++++++++++++- .../matchers/HasHeaderWithPrefixTest.java | 65 ++++++++++++++++++ 8 files changed, 321 insertions(+), 26 deletions(-) diff --git a/mailet/standard/src/main/java/org/apache/james/transport/mailets/RemoveMimeHeader.java b/mailet/standard/src/main/java/org/apache/james/transport/mailets/RemoveMimeHeader.java index 5f19e80..c728237 100644 --- a/mailet/standard/src/main/java/org/apache/james/transport/mailets/RemoveMimeHeader.java +++ b/mailet/standard/src/main/java/org/apache/james/transport/mailets/RemoveMimeHeader.java @@ -19,20 +19,23 @@ package org.apache.james.transport.mailets; +import java.util.Iterator; import java.util.List; +import java.util.stream.Collectors; import javax.mail.MessagingException; import javax.mail.internet.MimeMessage; import org.apache.mailet.Mail; import org.apache.mailet.MailetException; +import org.apache.mailet.PerRecipientHeaders.Header; import org.apache.mailet.base.GenericMailet; import com.google.common.base.Splitter; import com.google.common.collect.ImmutableList; /** - * Remove mime headers + * Remove mime headers from the message (global) and per recipient (specific). * * Sample configuration: * @@ -63,9 +66,28 @@ public class RemoveMimeHeader extends GenericMailet { @Override public void service(Mail mail) throws MessagingException { MimeMessage message = mail.getMessage(); + for (String header : headers) { message.removeHeader(header); } + + removeSpecific(mail); + message.saveChanges(); } + + protected void removeSpecific(Mail mail) { + mail.getPerRecipientSpecificHeaders().getRecipientsWithSpecificHeaders() + .stream() + .collect(Collectors.toList()) // Streaming for concurrent modifications + .forEach(recipient -> { + Iterator<Header> it = mail.getPerRecipientSpecificHeaders().getHeadersForRecipient(recipient).iterator(); + while (it.hasNext()) { + Header next = it.next(); + if (headers.contains(next.getName())) { + it.remove(); + } + } + }); + } } diff --git a/mailet/standard/src/main/java/org/apache/james/transport/mailets/RemoveMimeHeaderByPrefix.java b/mailet/standard/src/main/java/org/apache/james/transport/mailets/RemoveMimeHeaderByPrefix.java index 6a3f464..0118e4d 100644 --- a/mailet/standard/src/main/java/org/apache/james/transport/mailets/RemoveMimeHeaderByPrefix.java +++ b/mailet/standard/src/main/java/org/apache/james/transport/mailets/RemoveMimeHeaderByPrefix.java @@ -20,7 +20,9 @@ package org.apache.james.transport.mailets; +import java.util.Iterator; import java.util.List; +import java.util.stream.Collectors; import javax.mail.Header; import javax.mail.MessagingException; @@ -33,7 +35,7 @@ import com.google.common.base.Strings; import com.google.common.collect.ImmutableList; /** - * This mailet removes all of the headers starting with a given prefix. + * This mailet removes all of the headers starting with a given prefix in the message (global) and per recipient (specific). * * Sample configuration: * @@ -72,6 +74,23 @@ public class RemoveMimeHeaderByPrefix extends GenericMailet { if (!headerNamesToRemove.isEmpty()) { mail.getMessage().saveChanges(); } + + removeSpecific(mail); + } + + protected void removeSpecific(Mail mail) { + mail.getPerRecipientSpecificHeaders().getRecipientsWithSpecificHeaders() + .stream() + .collect(Collectors.toList()) // Streaming for concurrent modifications + .forEach(recipient -> { + Iterator<org.apache.mailet.PerRecipientHeaders.Header> it = mail.getPerRecipientSpecificHeaders().getHeadersForRecipient(recipient).iterator(); + while (it.hasNext()) { + org.apache.mailet.PerRecipientHeaders.Header next = it.next(); + if (next.getName().startsWith(prefix)) { + it.remove(); + } + } + }); } private List<String> headerNamesStartingByPrefix(Mail mail) throws MessagingException { diff --git a/mailet/standard/src/main/java/org/apache/james/transport/matchers/HasHeader.java b/mailet/standard/src/main/java/org/apache/james/transport/matchers/HasHeader.java index e4c8cbb..dba2e2c 100644 --- a/mailet/standard/src/main/java/org/apache/james/transport/matchers/HasHeader.java +++ b/mailet/standard/src/main/java/org/apache/james/transport/matchers/HasHeader.java @@ -17,17 +17,17 @@ * under the License. * ****************************************************************/ - package org.apache.james.transport.matchers; import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; +import java.util.HashSet; import java.util.List; +import java.util.Set; import java.util.StringTokenizer; import javax.mail.MessagingException; -import javax.mail.internet.MimeMessage; import org.apache.james.core.MailAddress; import org.apache.james.mime4j.codec.DecodeMonitor; @@ -36,11 +36,18 @@ import org.apache.james.mime4j.util.MimeUtil; import org.apache.mailet.Mail; import org.apache.mailet.base.GenericMatcher; +import com.github.steveash.guavate.Guavate; + /** - * use: <pre><code><mailet match="HasHeader={<header>[=value]}+" class="..." /></code></pre> + * use: + * + * <pre> + * <code><mailet match="HasHeader={<header>[=value]}+" class="..." /></code> + * </pre> * <p/> - * <p>This matcher checks if the header named is present. If complements the - * AddHeader mailet.</p> + * <p> + * This matcher checks if the header is present in the message (global) and per recipient (specific). It complements the AddHeader mailet. + * </p> */ public class HasHeader extends GenericMatcher { @@ -54,7 +61,7 @@ public class HasHeader extends GenericMatcher { private static final String HEADER_VALUE_SEPARATOR = "="; private interface HeaderCondition { - boolean isMatching(MimeMessage mimeMessage) throws MessagingException; + Collection<MailAddress> isMatching(Mail mail) throws MessagingException; } private static class HeaderNameCondition implements HeaderCondition { @@ -65,9 +72,22 @@ public class HasHeader extends GenericMatcher { } @Override - public boolean isMatching(MimeMessage mimeMessage) throws MessagingException { - String[] headerArray = mimeMessage.getHeader(headerName); - return headerArray != null && headerArray.length > 0; + public Collection<MailAddress> isMatching(Mail mail) throws MessagingException { + String[] headerArray = mail.getMessage().getHeader(headerName); + if (headerArray != null && headerArray.length > 0) { + return mail.getRecipients(); + } + + return matchSpecific(mail); + } + + protected Collection<MailAddress> matchSpecific(Mail mail) { + return mail.getPerRecipientSpecificHeaders().getHeadersByRecipient() + .entries() + .stream() + .filter(entry -> entry.getValue().getName().equals(headerName)) + .map(entry -> entry.getKey()) + .collect(Guavate.toImmutableSet()); } } @@ -81,13 +101,23 @@ public class HasHeader extends GenericMatcher { } @Override - public boolean isMatching(MimeMessage mimeMessage) throws MessagingException { - String[] headerArray = mimeMessage.getHeader(headerName); - if (headerArray != null && headerArray.length > 0) { - return Arrays.stream(headerArray) - .anyMatch(value -> headerValue.equals(sanitizeHeaderField(value))); + public Collection<MailAddress> isMatching(Mail mail) throws MessagingException { + String[] headerArray = mail.getMessage().getHeader(headerName); + if (headerArray != null && headerArray.length > 0 && // + Arrays.stream(headerArray).anyMatch(value -> headerValue.equals(sanitizeHeaderField(value)))) { + return mail.getRecipients(); } - return false; + + return matchSpecific(mail); + } + + protected Collection<MailAddress> matchSpecific(Mail mail) { + return mail.getPerRecipientSpecificHeaders().getHeadersByRecipient() + .entries() + .stream() + .filter(entry -> entry.getValue().getName().equals(headerName) && entry.getValue().getValue().equals(headerValue)) + .map(entry -> entry.getKey()) + .collect(Guavate.toImmutableSet()); } } @@ -109,7 +139,7 @@ public class HasHeader extends GenericMatcher { } String headerName = valueSeparatorTokenizer.nextToken().trim(); if (valueSeparatorTokenizer.hasMoreTokens()) { - return new HeaderValueCondition(headerName, valueSeparatorTokenizer.nextToken().trim()); + return new HeaderValueCondition(headerName, valueSeparatorTokenizer.nextToken().trim()); } else { return new HeaderNameCondition(headerName); } @@ -117,12 +147,20 @@ public class HasHeader extends GenericMatcher { @Override public Collection<MailAddress> match(Mail mail) throws javax.mail.MessagingException { + Set<MailAddress> matchingRecipients = new HashSet<>(); + boolean first = true; for (HeaderCondition headerCondition : headerConditions) { - if (!headerCondition.isMatching(mail.getMessage())) { - return null; + if (first) { + first = false; + // Keep the first list + matchingRecipients.addAll(headerCondition.isMatching(mail)); + } else { + // Ensure intersection (all must be true) + Collection<MailAddress> currentMatching = headerCondition.isMatching(mail); + matchingRecipients.removeIf(it -> !currentMatching.contains(it)); } } - return mail.getRecipients(); + return matchingRecipients.isEmpty() ? null : matchingRecipients; } -} +} diff --git a/mailet/standard/src/main/java/org/apache/james/transport/matchers/HasHeaderWithPrefix.java b/mailet/standard/src/main/java/org/apache/james/transport/matchers/HasHeaderWithPrefix.java index 78f1d75..525eff0 100644 --- a/mailet/standard/src/main/java/org/apache/james/transport/matchers/HasHeaderWithPrefix.java +++ b/mailet/standard/src/main/java/org/apache/james/transport/matchers/HasHeaderWithPrefix.java @@ -30,13 +30,14 @@ import org.apache.james.transport.mailets.utils.MimeMessageUtils; import org.apache.mailet.Mail; import org.apache.mailet.base.GenericMatcher; +import com.github.steveash.guavate.Guavate; import com.google.common.base.Strings; -import com.google.common.collect.ImmutableList; /** * Matches emails with headers having a given prefix. * - * If a header with the given prefix is found, all recipients will be matched. Otherwise, no recipient in returned. + * If a header with the given prefix is found in the message (global) all recipients will be matched. If a header with the given prefix is found per recipient (specific), only these will be matched. + * Otherwise, no recipient in returned. * * use: <pre><code><mailet match="HasHeaderWithPrefix=PREFIX" class="..." /></code></pre> */ @@ -60,11 +61,22 @@ public class HasHeaderWithPrefix extends GenericMatcher { @Override public Collection<MailAddress> match(Mail mail) throws MessagingException { List<Header> headers = new MimeMessageUtils(mail.getMessage()).toHeaderList(); + for (Header header: headers) { if (header.getName().startsWith(prefix)) { return mail.getRecipients(); } } - return ImmutableList.of(); + + return matchSpecific(mail); + } + + protected Collection<MailAddress> matchSpecific(Mail mail) { + return mail.getPerRecipientSpecificHeaders().getHeadersByRecipient() + .entries() + .stream() + .filter(entry -> entry.getValue().getName().startsWith(prefix)) + .map(entry -> entry.getKey()) + .collect(Guavate.toImmutableSet()); } } diff --git a/mailet/standard/src/test/java/org/apache/james/transport/mailets/RemoveMimeHeaderByPrefixTest.java b/mailet/standard/src/test/java/org/apache/james/transport/mailets/RemoveMimeHeaderByPrefixTest.java index 51143c4..9af35a3 100644 --- a/mailet/standard/src/test/java/org/apache/james/transport/mailets/RemoveMimeHeaderByPrefixTest.java +++ b/mailet/standard/src/test/java/org/apache/james/transport/mailets/RemoveMimeHeaderByPrefixTest.java @@ -24,9 +24,11 @@ import static org.assertj.core.api.Assertions.assertThatThrownBy; import javax.mail.MessagingException; +import org.apache.james.core.MailAddress; import org.apache.james.core.builder.MimeMessageBuilder; import org.apache.james.transport.mailets.utils.MimeMessageUtils; import org.apache.mailet.Mail; +import org.apache.mailet.PerRecipientHeaders.Header; import org.apache.mailet.base.GenericMailet; import org.apache.mailet.base.test.FakeMail; import org.apache.mailet.base.test.FakeMailetConfig; @@ -39,6 +41,9 @@ class RemoveMimeHeaderByPrefixTest { private static final String HEADER_NAME_PREFIX_1 = "X-OPENPAAS-FEATURE-A"; private static final String HEADER_NAME_PREFIX_2 = "X-OPENPAAS-FEATURE-B"; private static final String HEADER_NAME_NO_PREFIX = "X-OTHER-BUSINESS"; + private static final String RECIPIENT1 = "r...@example.com"; + private static final String RECIPIENT2 = "r...@example.com"; + private static final String RECIPIENT3 = "r...@example.com"; private GenericMailet mailet; @@ -88,6 +93,31 @@ class RemoveMimeHeaderByPrefixTest { .extracting("name") .doesNotContain(HEADER_NAME_PREFIX_1, HEADER_NAME_PREFIX_2); } + + @Test + void serviceShouldRemoveAllPrefixedHeadersMixed() throws MessagingException { + FakeMailetConfig mailetConfig = FakeMailetConfig.builder() + .mailetName("Test") + .setProperty("prefix", PREFIX) + .build(); + mailet.init(mailetConfig); + + Mail mail = FakeMail.fromMessage(MimeMessageBuilder.mimeMessageBuilder() + .addHeader(HEADER_NAME_PREFIX_1, "true")); + mail.addSpecificHeaderForRecipient(Header.builder().name(HEADER_NAME_PREFIX_2).value("1").build(), new MailAddress(RECIPIENT1)); + mail.addSpecificHeaderForRecipient(Header.builder().name(PREFIX).value("1").build(), new MailAddress(RECIPIENT2)); + mail.addSpecificHeaderForRecipient(Header.builder().name(HEADER_NAME_NO_PREFIX).value("1").build(), new MailAddress(RECIPIENT3)); + + mailet.service(mail); + + assertThat(new MimeMessageUtils(mail.getMessage()).toHeaderList()) + .extracting("name") + .doesNotContain(PREFIX, HEADER_NAME_PREFIX_1, HEADER_NAME_PREFIX_2); + + assertThat(mail.getPerRecipientSpecificHeaders().getHeaderNamesForRecipient(new MailAddress(RECIPIENT1))).isEmpty(); + assertThat(mail.getPerRecipientSpecificHeaders().getHeaderNamesForRecipient(new MailAddress(RECIPIENT2))).isEmpty(); + assertThat(mail.getPerRecipientSpecificHeaders().getHeaderNamesForRecipient(new MailAddress(RECIPIENT3))).isNotEmpty(); + } @Test void serviceShouldNotRemoveNonPrefixedHeaders() throws MessagingException { diff --git a/mailet/standard/src/test/java/org/apache/james/transport/mailets/RemoveMimeHeaderTest.java b/mailet/standard/src/test/java/org/apache/james/transport/mailets/RemoveMimeHeaderTest.java index 807b2df..baa5b5a 100644 --- a/mailet/standard/src/test/java/org/apache/james/transport/mailets/RemoveMimeHeaderTest.java +++ b/mailet/standard/src/test/java/org/apache/james/transport/mailets/RemoveMimeHeaderTest.java @@ -27,8 +27,10 @@ import static org.mockito.Mockito.when; import javax.mail.MessagingException; +import org.apache.james.core.MailAddress; import org.apache.james.core.builder.MimeMessageBuilder; import org.apache.mailet.Mail; +import org.apache.mailet.PerRecipientHeaders.Header; import org.apache.mailet.base.GenericMailet; import org.apache.mailet.base.test.FakeMail; import org.apache.mailet.base.test.FakeMailetConfig; @@ -39,6 +41,8 @@ class RemoveMimeHeaderTest { private static final String HEADER1 = "header1"; private static final String HEADER2 = "header2"; + private static final String RECIPIENT1 = "r...@example.com"; + private static final String RECIPIENT2 = "r...@example.com"; private GenericMailet mailet; @@ -71,6 +75,26 @@ class RemoveMimeHeaderTest { } @Test + public void serviceShouldRemoveSpecificHeaderWhenOneMatching() throws MessagingException { + FakeMailetConfig mailetConfig = FakeMailetConfig.builder() + .mailetName("Test") + .setProperty("name", HEADER1) + .build(); + mailet.init(mailetConfig); + + Mail mail = FakeMail.fromMessage(MimeMessageBuilder.mimeMessageBuilder().addToRecipient(RECIPIENT1).addToRecipient(RECIPIENT2)); + mail.addSpecificHeaderForRecipient(Header.builder().name(HEADER1).value("1").build(), new MailAddress(RECIPIENT1)); + mail.addSpecificHeaderForRecipient(Header.builder().name(HEADER2).value("1").build(), new MailAddress(RECIPIENT2)); + + mailet.service(mail); + + assertThat(mail.getMessage().getHeader(HEADER1)).isNull(); + assertThat(mail.getMessage().getHeader(HEADER2)).isNull(); + assertThat(mail.getPerRecipientSpecificHeaders().getHeaderNamesForRecipient(new MailAddress(RECIPIENT1))).isEmpty(); + assertThat(mail.getPerRecipientSpecificHeaders().getHeaderNamesForRecipient(new MailAddress(RECIPIENT2))).isNotEmpty(); + } + + @Test void serviceShouldRemoveHeadersWhenTwoMatching() throws MessagingException { FakeMailetConfig mailetConfig = FakeMailetConfig.builder() .mailetName("Test") @@ -87,6 +111,48 @@ class RemoveMimeHeaderTest { assertThat(mail.getMessage().getHeader(HEADER1)).isNull(); assertThat(mail.getMessage().getHeader(HEADER2)).isNull(); } + + @Test + public void serviceShouldRemoveSpecificHeadersWhenTwoMatching() throws MessagingException { + FakeMailetConfig mailetConfig = FakeMailetConfig.builder() + .mailetName("Test") + .setProperty("name", HEADER1 + "," + HEADER2) + .build(); + mailet.init(mailetConfig); + + Mail mail = FakeMail.fromMessage(MimeMessageBuilder.mimeMessageBuilder().addToRecipient(RECIPIENT1).addToRecipient(RECIPIENT2)); + mail.addSpecificHeaderForRecipient(Header.builder().name(HEADER1).value("1").build(), new MailAddress(RECIPIENT1)); + mail.addSpecificHeaderForRecipient(Header.builder().name(HEADER2).value("1").build(), new MailAddress(RECIPIENT2)); + + mailet.service(mail); + + assertThat(mail.getMessage().getHeader(HEADER1)).isNull(); + assertThat(mail.getMessage().getHeader(HEADER2)).isNull(); + assertThat(mail.getPerRecipientSpecificHeaders().getHeaderNamesForRecipient(new MailAddress(RECIPIENT1))).isEmpty(); + assertThat(mail.getPerRecipientSpecificHeaders().getHeaderNamesForRecipient(new MailAddress(RECIPIENT2))).isEmpty(); + } + + @Test + public void serviceShouldRemoveSpecificAndGlobalHeadersWhenMixed() throws MessagingException { + FakeMailetConfig mailetConfig = FakeMailetConfig.builder() + .mailetName("Test") + .setProperty("name", HEADER1) + .build(); + mailet.init(mailetConfig); + + Mail mail = FakeMail.fromMessage(MimeMessageBuilder.mimeMessageBuilder().addToRecipient(RECIPIENT1).addToRecipient(RECIPIENT2) + .addHeader(HEADER1, "true") + .addHeader(HEADER2, "true")); + mail.addSpecificHeaderForRecipient(Header.builder().name(HEADER1).value("1").build(), new MailAddress(RECIPIENT1)); + mail.addSpecificHeaderForRecipient(Header.builder().name(HEADER2).value("1").build(), new MailAddress(RECIPIENT2)); + + mailet.service(mail); + + assertThat(mail.getMessage().getHeader(HEADER1)).isNull(); + assertThat(mail.getMessage().getHeader(HEADER2)).isNotNull(); + assertThat(mail.getPerRecipientSpecificHeaders().getHeaderNamesForRecipient(new MailAddress(RECIPIENT1))).isEmpty(); + assertThat(mail.getPerRecipientSpecificHeaders().getHeaderNamesForRecipient(new MailAddress(RECIPIENT2))).isNotEmpty(); + } @Test void serviceShouldNotRemoveHeaderWhenNoneMatching() throws MessagingException { diff --git a/mailet/standard/src/test/java/org/apache/james/transport/matchers/HasHeaderTest.java b/mailet/standard/src/test/java/org/apache/james/transport/matchers/HasHeaderTest.java index 785c266..0dd3ff5 100644 --- a/mailet/standard/src/test/java/org/apache/james/transport/matchers/HasHeaderTest.java +++ b/mailet/standard/src/test/java/org/apache/james/transport/matchers/HasHeaderTest.java @@ -17,18 +17,21 @@ * under the License. * ****************************************************************/ - package org.apache.james.transport.matchers; import static org.assertj.core.api.Assertions.assertThat; +import java.util.Arrays; + import javax.mail.MessagingException; import javax.mail.internet.MimeMessage; +import org.apache.james.core.MailAddress; import org.apache.james.core.builder.MimeMessageBuilder; import org.apache.james.util.MimeMessageUtil; import org.apache.mailet.Mail; import org.apache.mailet.Matcher; +import org.apache.mailet.PerRecipientHeaders.Header; import org.apache.mailet.base.test.FakeMail; import org.apache.mailet.base.test.FakeMatcherConfig; import org.apache.mailet.base.test.MailUtil; @@ -208,4 +211,44 @@ public class HasHeaderTest { assertThat(matcher.match(mail)).containsAll(mockedMail.getRecipients()); } + + @Test + public void matchShouldReturnAddressesWhenAllConditionsMatchGlobalAndSpecific() throws MessagingException { + matcher.init(FakeMatcherConfig.builder().matcherName("HasHeader").condition(HEADER_NAME_1 + "+" + HEADER_NAME_2).build()); + + Mail mail = MailUtil.createMockMail2Recipients(MimeMessageBuilder.mimeMessageBuilder().addHeader(HEADER_NAME_1, HEADER_VALUE_1).build()); + mail.addSpecificHeaderForRecipient(Header.builder().name(HEADER_NAME_2).value(HEADER_VALUE_2).build(), new MailAddress("t...@james.apache.org")); + + assertThat(matcher.match(mail)).containsAll(Arrays.asList(new MailAddress("t...@james.apache.org"))); + } + + @Test + public void matchShouldReturnAddressesWhenAllConditionsMatchSpecific() throws MessagingException { + matcher.init(FakeMatcherConfig.builder().matcherName("HasHeader").condition(HEADER_NAME_1 + "+" + HEADER_NAME_2).build()); + + Mail mail = MailUtil.createMockMail2Recipients(MimeMessageBuilder.mimeMessageBuilder().build()); + mail.addSpecificHeaderForRecipient(Header.builder().name(HEADER_NAME_1).value(HEADER_VALUE_1).build(), new MailAddress("t...@james.apache.org")); + mail.addSpecificHeaderForRecipient(Header.builder().name(HEADER_NAME_2).value(HEADER_VALUE_2).build(), new MailAddress("t...@james.apache.org")); + + assertThat(matcher.match(mail)).containsAll(Arrays.asList(new MailAddress("t...@james.apache.org"))); + } + + @Test + public void matchShouldReturnAddressesWhenAllValueConditionsMatchGlobalAndSpecific() throws MessagingException { + matcher.init(FakeMatcherConfig.builder().matcherName("HasHeader").condition(HEADER_NAME_1 + "=" + HEADER_VALUE_1 + "+" + HEADER_NAME_2).build()); + + Mail mail = FakeMail.builder() // + .name(MailUtil.newId()) // + .mimeMessage(MimeMessageBuilder.mimeMessageBuilder().build()) // + .recipients(new MailAddress("t...@james.apache.org"), new MailAddress("te...@james.apache.org"), new MailAddress("te...@james.apache.org")) // + .build(); + mail.addSpecificHeaderForRecipient(Header.builder().name(HEADER_NAME_1).value("wrong value").build(), new MailAddress("t...@james.apache.org")); + mail.addSpecificHeaderForRecipient(Header.builder().name(HEADER_NAME_1).value(HEADER_VALUE_1).build(), new MailAddress("te...@james.apache.org")); + mail.addSpecificHeaderForRecipient(Header.builder().name(HEADER_NAME_2).value("any value").build(), new MailAddress("te...@james.apache.org")); + mail.addSpecificHeaderForRecipient(Header.builder().name(HEADER_NAME_1).value("wrong value").build(), new MailAddress("te...@james.apache.org")); + mail.addSpecificHeaderForRecipient(Header.builder().name(HEADER_NAME_2).value("any value").build(), new MailAddress("te...@james.apache.org")); + + assertThat(matcher.match(mail)).containsAll(Arrays.asList(new MailAddress("te...@james.apache.org"))); + } + } diff --git a/mailet/standard/src/test/java/org/apache/james/transport/matchers/HasHeaderWithPrefixTest.java b/mailet/standard/src/test/java/org/apache/james/transport/matchers/HasHeaderWithPrefixTest.java index acc4846..ea93dae 100644 --- a/mailet/standard/src/test/java/org/apache/james/transport/matchers/HasHeaderWithPrefixTest.java +++ b/mailet/standard/src/test/java/org/apache/james/transport/matchers/HasHeaderWithPrefixTest.java @@ -23,11 +23,14 @@ package org.apache.james.transport.matchers; import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThatThrownBy; +import java.util.Arrays; + import javax.mail.MessagingException; import org.apache.james.core.builder.MimeMessageBuilder; import org.apache.mailet.Mail; import org.apache.mailet.Matcher; +import org.apache.mailet.PerRecipientHeaders.Header; import org.apache.mailet.base.MailAddressFixture; import org.apache.mailet.base.test.FakeMail; import org.apache.mailet.base.test.FakeMatcherConfig; @@ -66,6 +69,26 @@ class HasHeaderWithPrefixTest { } @Test + void matchShouldReturnAddressesWhenPrefixedHeaderNameInSpecific() throws MessagingException { + FakeMatcherConfig matcherConfig = FakeMatcherConfig.builder() + .matcherName("HasHeader") + .condition(PREFIX) + .build(); + + matcher.init(matcherConfig); + + Mail mail = FakeMail.builder() + .name("mail") + .mimeMessage(MimeMessageBuilder.mimeMessageBuilder()) + .recipients(MailAddressFixture.ANY_AT_JAMES, MailAddressFixture.OTHER_AT_JAMES2) + .build(); + + mail.addSpecificHeaderForRecipient(Header.builder().name(HEADER_NAME_PREFIX_1).value("true").build(), MailAddressFixture.ANY_AT_JAMES); + + assertThat(matcher.match(mail)).containsAll(Arrays.asList(MailAddressFixture.ANY_AT_JAMES)); + } + + @Test void matchShouldReturnAddressesWhenExactlyPrefix() throws MessagingException { FakeMatcherConfig matcherConfig = FakeMatcherConfig.builder() .matcherName("HasHeader") @@ -85,6 +108,26 @@ class HasHeaderWithPrefixTest { } @Test + void matchShouldReturnAddressesWhenExactlyPrefixInSpecific() throws MessagingException { + FakeMatcherConfig matcherConfig = FakeMatcherConfig.builder() + .matcherName("HasHeader") + .condition(PREFIX) + .build(); + + matcher.init(matcherConfig); + + Mail mail = FakeMail.builder() + .name("mail") + .mimeMessage(MimeMessageBuilder.mimeMessageBuilder()) + .recipients(MailAddressFixture.ANY_AT_JAMES, MailAddressFixture.OTHER_AT_JAMES2) + .build(); + + mail.addSpecificHeaderForRecipient(Header.builder().name(PREFIX).value("true").build(), MailAddressFixture.ANY_AT_JAMES); + + assertThat(matcher.match(mail)).containsAll(Arrays.asList(MailAddressFixture.ANY_AT_JAMES)); + } + + @Test void matchShouldReturnEmptyWhenNoPrefixedHeader() throws MessagingException { FakeMatcherConfig matcherConfig = FakeMatcherConfig.builder() .matcherName("HasHeader") @@ -124,6 +167,28 @@ class HasHeaderWithPrefixTest { } @Test + void matchShouldReturnAddressesWhenAtLeastOneHeaderPrefixedInSpecific() throws MessagingException { + FakeMatcherConfig matcherConfig = FakeMatcherConfig.builder() + .matcherName("HasHeader") + .condition(PREFIX) + .build(); + + matcher.init(matcherConfig); + + Mail mail = FakeMail.builder() + .name("mail") + .mimeMessage(MimeMessageBuilder.mimeMessageBuilder()) + .recipients(MailAddressFixture.ANY_AT_JAMES, MailAddressFixture.OTHER_AT_JAMES2) + .build(); + + mail.addSpecificHeaderForRecipient(Header.builder().name(HEADER_NAME_PREFIX_1).value("true").build(), MailAddressFixture.ANY_AT_JAMES); + mail.addSpecificHeaderForRecipient(Header.builder().name(HEADER_NAME_NO_PREFIX).value("true").build(), MailAddressFixture.ANY_AT_JAMES); + mail.addSpecificHeaderForRecipient(Header.builder().name(HEADER_NAME_NO_PREFIX).value("true").build(), MailAddressFixture.OTHER_AT_JAMES2); + + assertThat(matcher.match(mail)).containsAll(Arrays.asList(MailAddressFixture.ANY_AT_JAMES)); + } + + @Test void initShouldRejectEmptyPrefix() { assertThatThrownBy(() -> matcher.init(FakeMatcherConfig.builder() --------------------------------------------------------------------- To unsubscribe, e-mail: server-dev-unsubscr...@james.apache.org For additional commands, e-mail: server-dev-h...@james.apache.org