JAMES-2340 SpamAssassin mailet should mark spam per recipient
Project: http://git-wip-us.apache.org/repos/asf/james-project/repo Commit: http://git-wip-us.apache.org/repos/asf/james-project/commit/34bd5809 Tree: http://git-wip-us.apache.org/repos/asf/james-project/tree/34bd5809 Diff: http://git-wip-us.apache.org/repos/asf/james-project/diff/34bd5809 Branch: refs/heads/master Commit: 34bd580903d23a6347223f689c1766bce034fc57 Parents: b998c58 Author: Antoine Duprat <adup...@linagora.com> Authored: Mon Mar 19 16:32:15 2018 +0100 Committer: benwa <btell...@linagora.com> Committed: Tue Mar 27 15:17:37 2018 +0700 ---------------------------------------------------------------------- .../org/apache/mailet/PerRecipientHeaders.java | 8 +- .../mailets/AddDeliveredToHeaderTest.java | 26 +++--- .../james/mailets/configuration/Constants.java | 1 + .../transport/mailets/SpamAssassinTest.java | 48 +++++++--- .../james/transport/mailets/SpamAssassin.java | 8 +- .../transport/matchers/IsMarkedAsSpam.java | 26 +++--- .../transport/mailets/SpamAssassinTest.java | 52 +++++++++-- .../transport/matchers/IsMarkedAsSpamTest.java | 94 +++++++++++++------- .../apache/james/utils/IMAPMessageReader.java | 5 ++ 9 files changed, 183 insertions(+), 85 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/james-project/blob/34bd5809/mailet/api/src/main/java/org/apache/mailet/PerRecipientHeaders.java ---------------------------------------------------------------------- diff --git a/mailet/api/src/main/java/org/apache/mailet/PerRecipientHeaders.java b/mailet/api/src/main/java/org/apache/mailet/PerRecipientHeaders.java index cb3fce7..4e0a434 100644 --- a/mailet/api/src/main/java/org/apache/mailet/PerRecipientHeaders.java +++ b/mailet/api/src/main/java/org/apache/mailet/PerRecipientHeaders.java @@ -59,8 +59,14 @@ public class PerRecipientHeaders implements Serializable { .collect(Guavate.toImmutableSet()); } - public void addHeaderForRecipient(Header header, MailAddress recipient) { + public PerRecipientHeaders addHeaderForRecipient(Header header, MailAddress recipient) { headersByRecipient.put(recipient, header); + return this; + } + + public PerRecipientHeaders addHeaderForRecipient(Header.Builder header, MailAddress recipient) { + headersByRecipient.put(recipient, header.build()); + return this; } public void addAll(PerRecipientHeaders other) { http://git-wip-us.apache.org/repos/asf/james-project/blob/34bd5809/mailet/standard/src/test/java/org/apache/james/transport/mailets/AddDeliveredToHeaderTest.java ---------------------------------------------------------------------- diff --git a/mailet/standard/src/test/java/org/apache/james/transport/mailets/AddDeliveredToHeaderTest.java b/mailet/standard/src/test/java/org/apache/james/transport/mailets/AddDeliveredToHeaderTest.java index 168df21..76a3320 100644 --- a/mailet/standard/src/test/java/org/apache/james/transport/mailets/AddDeliveredToHeaderTest.java +++ b/mailet/standard/src/test/java/org/apache/james/transport/mailets/AddDeliveredToHeaderTest.java @@ -60,19 +60,19 @@ public class AddDeliveredToHeaderTest { testee.service(mail); - PerRecipientHeaders expectedResult = new PerRecipientHeaders(); - expectedResult.addHeaderForRecipient( - PerRecipientHeaders.Header.builder() - .name(AddDeliveredToHeader.DELIVERED_TO) - .value(MailAddressFixture.ANY_AT_JAMES.asString()) - .build(), - MailAddressFixture.ANY_AT_JAMES); - expectedResult.addHeaderForRecipient( - PerRecipientHeaders.Header.builder() - .name(AddDeliveredToHeader.DELIVERED_TO) - .value(MailAddressFixture.OTHER_AT_JAMES.asString()) - .build(), - MailAddressFixture.OTHER_AT_JAMES); + PerRecipientHeaders expectedResult = new PerRecipientHeaders() + .addHeaderForRecipient( + PerRecipientHeaders.Header.builder() + .name(AddDeliveredToHeader.DELIVERED_TO) + .value(MailAddressFixture.ANY_AT_JAMES.asString()) + .build(), + MailAddressFixture.ANY_AT_JAMES) + .addHeaderForRecipient( + PerRecipientHeaders.Header.builder() + .name(AddDeliveredToHeader.DELIVERED_TO) + .value(MailAddressFixture.OTHER_AT_JAMES.asString()) + .build(), + MailAddressFixture.OTHER_AT_JAMES); assertThat(mail.getPerRecipientSpecificHeaders()) .isEqualTo(expectedResult); http://git-wip-us.apache.org/repos/asf/james-project/blob/34bd5809/server/mailet/integration-testing/src/test/java/org/apache/james/mailets/configuration/Constants.java ---------------------------------------------------------------------- diff --git a/server/mailet/integration-testing/src/test/java/org/apache/james/mailets/configuration/Constants.java b/server/mailet/integration-testing/src/test/java/org/apache/james/mailets/configuration/Constants.java index 0bdfb82..5eae0e7 100644 --- a/server/mailet/integration-testing/src/test/java/org/apache/james/mailets/configuration/Constants.java +++ b/server/mailet/integration-testing/src/test/java/org/apache/james/mailets/configuration/Constants.java @@ -43,4 +43,5 @@ public class Constants { public static final String PASSWORD = "secret"; public static final String FROM = "user@" + DEFAULT_DOMAIN; public static final String RECIPIENT = "user2@" + DEFAULT_DOMAIN; + public static final String RECIPIENT2 = "user3@" + DEFAULT_DOMAIN; } http://git-wip-us.apache.org/repos/asf/james-project/blob/34bd5809/server/mailet/integration-testing/src/test/java/org/apache/james/transport/mailets/SpamAssassinTest.java ---------------------------------------------------------------------- diff --git a/server/mailet/integration-testing/src/test/java/org/apache/james/transport/mailets/SpamAssassinTest.java b/server/mailet/integration-testing/src/test/java/org/apache/james/transport/mailets/SpamAssassinTest.java index 3eb88bc..970fe48 100644 --- a/server/mailet/integration-testing/src/test/java/org/apache/james/transport/mailets/SpamAssassinTest.java +++ b/server/mailet/integration-testing/src/test/java/org/apache/james/transport/mailets/SpamAssassinTest.java @@ -25,6 +25,7 @@ import static org.apache.james.mailets.configuration.Constants.IMAP_PORT; 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.RECIPIENT; +import static org.apache.james.mailets.configuration.Constants.RECIPIENT2; 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; @@ -78,12 +79,6 @@ public class SpamAssassinTest { .matcher(All.class) .mailet(SpamAssassin.class) .addProperty(SpamAssassin.SPAMD_HOST, spamAssassinContainer.getContainerIp())) - .addMailet(MailetConfiguration.builder() - .matcher(All.class) - .mailet(MailAttributesToMimeHeaders.class) - .addProperty("simplemapping", - SpamAssassinResult.FLAG_MAIL_ATTRIBUTE_NAME + ";" + SpamAssassinResult.FLAG_MAIL_ATTRIBUTE_NAME + "," + - SpamAssassinResult.STATUS_MAIL_ATTRIBUTE_NAME + ";" + SpamAssassinResult.STATUS_MAIL_ATTRIBUTE_NAME)) .addMailetsFrom(CommonProcessors.deliverOnlyTransport())); jamesServer = TemporaryJamesServer.builder() @@ -95,6 +90,7 @@ public class SpamAssassinTest { probe.addDomain(DEFAULT_DOMAIN); probe.addUser(FROM, PASSWORD); probe.addUser(RECIPIENT, PASSWORD); + probe.addUser(RECIPIENT2, PASSWORD); } @After @@ -105,7 +101,7 @@ public class SpamAssassinTest { @Test public void spamAssassinShouldAppendNewHeaderOnMessage() throws Exception { messageSender.connect(LOCALHOST_IP, SMTP_PORT) - .sendMessage(mailWithContent("This is the content")) + .sendMessage(mailWithContent("This is the content", RECIPIENT)) .awaitSent(awaitAtMostOneMinute); messageReader.connect(LOCALHOST_IP, IMAP_PORT) @@ -122,7 +118,7 @@ public class SpamAssassinTest { @Test public void spamAssassinShouldAppendNewHeaderWhichDetectIsSpamWhenSpamMessage() throws Exception { messageSender.connect(LOCALHOST_IP, SMTP_PORT) - .sendMessage(mailWithContent(SPAM_CONTENT)) + .sendMessage(mailWithContent(SPAM_CONTENT, RECIPIENT)) .awaitSent(awaitAtMostOneMinute); messageReader.connect(LOCALHOST_IP, IMAP_PORT) @@ -138,7 +134,7 @@ public class SpamAssassinTest { @Test public void spamAssassinShouldAppendNewHeaderWhichNoWhenNonSpamMessage() throws Exception { messageSender.connect(LOCALHOST_IP, SMTP_PORT) - .sendMessage(mailWithContent("This is the content")) + .sendMessage(mailWithContent("This is the content", RECIPIENT)) .awaitSent(awaitAtMostOneMinute); messageReader.connect(LOCALHOST_IP, IMAP_PORT) @@ -151,14 +147,42 @@ public class SpamAssassinTest { assertThat(receivedHeaders).contains(SpamAssassinResult.STATUS_MAIL_ATTRIBUTE_NAME + ": No"); } - private FakeMail.Builder mailWithContent(String textContent) throws MessagingException { + @Test + public void spamAssassinShouldAppendNewHeaderPerRecipientOnMessage() throws Exception { + messageSender.connect(LOCALHOST_IP, SMTP_PORT) + .sendMessage(mailWithContent("This is the content", RECIPIENT, RECIPIENT2)) + .awaitSent(awaitAtMostOneMinute); + + messageReader.connect(LOCALHOST_IP, IMAP_PORT) + .login(RECIPIENT, PASSWORD) + .select(IMAPMessageReader.INBOX) + .awaitMessage(awaitAtMostOneMinute); + + assertThat(messageReader.readFirstMessageHeaders()) + .contains( + SpamAssassinResult.FLAG_MAIL_ATTRIBUTE_NAME, + SpamAssassinResult.STATUS_MAIL_ATTRIBUTE_NAME); + + messageReader.disconnect() + .connect(LOCALHOST_IP, IMAP_PORT) + .login(RECIPIENT2, PASSWORD) + .select(IMAPMessageReader.INBOX) + .awaitMessage(awaitAtMostOneMinute); + + assertThat(messageReader.readFirstMessageHeaders()) + .contains( + SpamAssassinResult.FLAG_MAIL_ATTRIBUTE_NAME, + SpamAssassinResult.STATUS_MAIL_ATTRIBUTE_NAME); + } + + private FakeMail.Builder mailWithContent(String textContent, String... recipients) throws MessagingException { return FakeMail.builder() .mimeMessage(MimeMessageBuilder.mimeMessageBuilder() .setSender(FROM) - .addToRecipient(RECIPIENT) + .addToRecipient(recipients) .setSubject("This is the subject") .setText(textContent)) .sender(FROM) - .recipient(RECIPIENT); + .recipients(recipients); } } http://git-wip-us.apache.org/repos/asf/james-project/blob/34bd5809/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/SpamAssassin.java ---------------------------------------------------------------------- diff --git a/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/SpamAssassin.java b/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/SpamAssassin.java index 6112cb3..e704497 100644 --- a/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/SpamAssassin.java +++ b/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/SpamAssassin.java @@ -33,6 +33,7 @@ import org.apache.james.util.Port; import org.apache.james.util.scanner.SpamAssassinInvoker; import org.apache.james.util.scanner.SpamAssassinResult; import org.apache.mailet.Mail; +import org.apache.mailet.PerRecipientHeaders; import org.apache.mailet.base.GenericMailet; import org.apache.mailet.base.MailetUtil; @@ -107,9 +108,12 @@ public class SpamAssassin extends GenericMailet { private void querySpamAssassin(Mail mail, MimeMessage message, SpamAssassinInvoker sa, MailAddress recipient) throws MessagingException, UsersRepositoryException { SpamAssassinResult result = sa.scanMail(message, usersRepository.getUser(recipient)); - // Add headers as attribute to mail object + // Add headers per recipient to mail object for (String key : result.getHeadersAsAttribute().keySet()) { - mail.setAttribute(key, result.getHeadersAsAttribute().get(key)); + mail.addSpecificHeaderForRecipient(PerRecipientHeaders.Header.builder() + .name(key) + .value(result.getHeadersAsAttribute().get(key)) + .build(), recipient); } } http://git-wip-us.apache.org/repos/asf/james-project/blob/34bd5809/server/mailet/mailets/src/main/java/org/apache/james/transport/matchers/IsMarkedAsSpam.java ---------------------------------------------------------------------- diff --git a/server/mailet/mailets/src/main/java/org/apache/james/transport/matchers/IsMarkedAsSpam.java b/server/mailet/mailets/src/main/java/org/apache/james/transport/matchers/IsMarkedAsSpam.java index 252f53b..bbea0c9 100644 --- a/server/mailet/mailets/src/main/java/org/apache/james/transport/matchers/IsMarkedAsSpam.java +++ b/server/mailet/mailets/src/main/java/org/apache/james/transport/matchers/IsMarkedAsSpam.java @@ -19,7 +19,6 @@ package org.apache.james.transport.matchers; -import java.io.Serializable; import java.util.Collection; import java.util.Locale; @@ -30,11 +29,11 @@ import org.apache.james.util.scanner.SpamAssassinResult; import org.apache.mailet.Mail; import org.apache.mailet.base.GenericMatcher; -import com.google.common.collect.ImmutableList; +import com.github.steveash.guavate.Guavate; /** * <p> - * Matches mails having a <pre>org.apache.james.spamassassin.status</pre> attribute with a <pre>Yes</pre> value. + * Matches mails having a <pre>org.apache.james.spamassassin.status</pre> per recipient header with a <pre>Yes</pre> value. * </p> * * As an example, here is a part of a mailet pipeline which can be used in your LocalDelivery processor: @@ -57,7 +56,7 @@ public class IsMarkedAsSpam extends GenericMatcher { @Override public String getMatcherInfo() { - return "Has org.apache.james.spamassassin.status attribute with a Yes value Matcher"; + return "Has org.apache.james.spamassassin.status per recipient header with a Yes value"; } @Override @@ -66,18 +65,17 @@ public class IsMarkedAsSpam extends GenericMatcher { @Override public Collection<MailAddress> match(Mail mail) { - Serializable attribute = mail.getAttribute(SpamAssassinResult.STATUS_MAIL_ATTRIBUTE_NAME); - if (isMarkedAsSpam(attribute)) { - return mail.getRecipients(); - } - return ImmutableList.of(); + return mail.getRecipients() + .stream() + .filter(recipient -> isMarkedAsSpam(mail, recipient)) + .collect(Guavate.toImmutableList()); } - private boolean isMarkedAsSpam(Serializable attribute) { - return attribute instanceof String && - ((String) attribute) - .toLowerCase(Locale.US) - .startsWith(YES); + public boolean isMarkedAsSpam(Mail mail, MailAddress recipient) { + return mail.getPerRecipientSpecificHeaders().getHeadersForRecipient(recipient) + .stream() + .filter(header -> header.getName().equals(SpamAssassinResult.STATUS_MAIL_ATTRIBUTE_NAME)) + .anyMatch(header -> header.getValue().toLowerCase(Locale.US).startsWith(YES)); } } http://git-wip-us.apache.org/repos/asf/james-project/blob/34bd5809/server/mailet/mailets/src/test/java/org/apache/james/transport/mailets/SpamAssassinTest.java ---------------------------------------------------------------------- diff --git a/server/mailet/mailets/src/test/java/org/apache/james/transport/mailets/SpamAssassinTest.java b/server/mailet/mailets/src/test/java/org/apache/james/transport/mailets/SpamAssassinTest.java index 466ad0c..81f9674 100644 --- a/server/mailet/mailets/src/test/java/org/apache/james/transport/mailets/SpamAssassinTest.java +++ b/server/mailet/mailets/src/test/java/org/apache/james/transport/mailets/SpamAssassinTest.java @@ -24,6 +24,7 @@ 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.metrics.api.NoopMetricFactory; import org.apache.james.user.memory.MemoryUsersRepository; @@ -32,11 +33,14 @@ import org.apache.james.util.scanner.SpamAssassinResult; import org.apache.james.utils.MockSpamd; import org.apache.james.utils.MockSpamdTestRule; import org.apache.mailet.Mail; +import org.apache.mailet.PerRecipientHeaders; import org.apache.mailet.base.test.FakeMail; import org.apache.mailet.base.test.FakeMailetConfig; import org.junit.Rule; import org.junit.Test; +import com.github.steveash.guavate.Guavate; + public class SpamAssassinTest { @Rule @@ -93,7 +97,7 @@ public class SpamAssassinTest { } @Test - public void initShouldThrowWhenSpamdPortIsNotNumber() throws Exception { + public void initShouldThrowWhenSpamdPortIsNotNumber() { assertThatThrownBy(() -> mailet.init(FakeMailetConfig.builder() .mailetName("SpamAssassin") .setProperty(SpamAssassin.SPAMD_PORT, "noNumber") @@ -101,7 +105,7 @@ public class SpamAssassinTest { } @Test - public void initShouldThrowWhenSpamdPortIsNegative() throws Exception { + public void initShouldThrowWhenSpamdPortIsNegative() { assertThatThrownBy(() -> mailet.init(FakeMailetConfig.builder() .mailetName("SpamAssassin") .setProperty(SpamAssassin.SPAMD_PORT, "-1") @@ -109,7 +113,7 @@ public class SpamAssassinTest { } @Test - public void initShouldThrowWhenSpamdPortIsZero() throws Exception { + public void initShouldThrowWhenSpamdPortIsZero() { assertThatThrownBy(() -> mailet.init(FakeMailetConfig.builder() .mailetName("SpamAssassin") .setProperty(SpamAssassin.SPAMD_PORT, "0") @@ -117,7 +121,7 @@ public class SpamAssassinTest { } @Test - public void initShouldThrowWhenSpamdPortTooBig() throws Exception { + public void initShouldThrowWhenSpamdPortTooBig() { assertThatThrownBy(() -> mailet.init(FakeMailetConfig.builder() .mailetName("SpamAssassin") .setProperty(SpamAssassin.SPAMD_PORT, @@ -157,8 +161,16 @@ public class SpamAssassinTest { mailet.service(mail); - assertThat(mail.getAttributeNames()) - .containsOnly(SpamAssassinResult.FLAG_MAIL_ATTRIBUTE_NAME, SpamAssassinResult.STATUS_MAIL_ATTRIBUTE_NAME); + + + assertThat( + mail.getPerRecipientSpecificHeaders() + .getHeadersByRecipient() + .get(new MailAddress("us...@exemple.com")) + .stream() + .map(PerRecipientHeaders.Header::getName) + .collect(Guavate.toImmutableList())) + .contains(SpamAssassinResult.FLAG_MAIL_ATTRIBUTE_NAME, SpamAssassinResult.STATUS_MAIL_ATTRIBUTE_NAME); } @Test @@ -182,7 +194,18 @@ public class SpamAssassinTest { mailet.service(mail); - assertThat(mail.getAttribute(SpamAssassinResult.FLAG_MAIL_ATTRIBUTE_NAME)).isEqualTo("NO"); + assertThat(mail.getPerRecipientSpecificHeaders()) + .isEqualTo(new PerRecipientHeaders() + .addHeaderForRecipient( + PerRecipientHeaders.Header.builder() + .name(SpamAssassinResult.FLAG_MAIL_ATTRIBUTE_NAME) + .value("NO"), + new MailAddress("us...@exemple.com")) + .addHeaderForRecipient( + PerRecipientHeaders.Header.builder() + .name(SpamAssassinResult.STATUS_MAIL_ATTRIBUTE_NAME) + .value("No, hits=3 required=5"), + new MailAddress("us...@exemple.com"))); } @Test @@ -206,11 +229,22 @@ public class SpamAssassinTest { mailet.service(mail); - assertThat(mail.getAttribute(SpamAssassinResult.FLAG_MAIL_ATTRIBUTE_NAME)).isEqualTo("YES"); + assertThat(mail.getPerRecipientSpecificHeaders()) + .isEqualTo(new PerRecipientHeaders() + .addHeaderForRecipient( + PerRecipientHeaders.Header.builder() + .name(SpamAssassinResult.FLAG_MAIL_ATTRIBUTE_NAME) + .value("YES"), + new MailAddress("us...@exemple.com")) + .addHeaderForRecipient( + PerRecipientHeaders.Header.builder() + .name(SpamAssassinResult.STATUS_MAIL_ATTRIBUTE_NAME) + .value("Yes, hits=1000 required=5"), + new MailAddress("us...@exemple.com"))); } @Test - public void getMailetInfoShouldReturnSpamAssasinMailetInformation() throws Exception { + public void getMailetInfoShouldReturnSpamAssasinMailetInformation() { assertThat(mailet.getMailetInfo()).isEqualTo("Checks message against SpamAssassin"); } http://git-wip-us.apache.org/repos/asf/james-project/blob/34bd5809/server/mailet/mailets/src/test/java/org/apache/james/transport/matchers/IsMarkedAsSpamTest.java ---------------------------------------------------------------------- diff --git a/server/mailet/mailets/src/test/java/org/apache/james/transport/matchers/IsMarkedAsSpamTest.java b/server/mailet/mailets/src/test/java/org/apache/james/transport/matchers/IsMarkedAsSpamTest.java index a33f763..825384a 100644 --- a/server/mailet/mailets/src/test/java/org/apache/james/transport/matchers/IsMarkedAsSpamTest.java +++ b/server/mailet/mailets/src/test/java/org/apache/james/transport/matchers/IsMarkedAsSpamTest.java @@ -23,6 +23,7 @@ import static org.assertj.core.api.Assertions.assertThat; import java.util.Collection; import org.apache.james.core.MailAddress; +import org.apache.mailet.PerRecipientHeaders; import org.apache.mailet.base.test.FakeMail; import org.junit.Before; import org.junit.Test; @@ -39,81 +40,106 @@ public class IsMarkedAsSpamTest { @Test public void isMarkedAsSpamShouldNotMatchWhenNoHeader() throws Exception { FakeMail mail = FakeMail.builder() - .sender("sen...@james.org") - .recipient("t...@james.org") - .build(); + .sender("sen...@james.org") + .recipient("t...@james.org") + .build(); Collection<MailAddress> matches = matcher.match(mail); assertThat(matches).isEmpty(); } @Test - public void isMarkedAsSpamShouldNotMatchWhenHeaderButNullValue() throws Exception { + public void isMarkedAsSpamShouldNotMatchWhenHeaderButEmptyValue() throws Exception { FakeMail mail = FakeMail.builder() - .sender("sen...@james.org") - .recipient("t...@james.org") - .attribute("org.apache.james.spamassassin.status", null) - .build(); + .sender("sen...@james.org") + .recipient("t...@james.org") + .addHeaderForRecipient(PerRecipientHeaders.Header.builder() + .name("org.apache.james.spamassassin.status") + .value("other") + .build(), + new MailAddress("t...@james.org")) + .build(); Collection<MailAddress> matches = matcher.match(mail); assertThat(matches).isEmpty(); } @Test - public void isMarkedAsSpamShouldNotMatchWhenHeaderButEmptyValue() throws Exception { + public void isMarkedAsSpamShouldNotMatchWhenHeaderButOtherValue() throws Exception { FakeMail mail = FakeMail.builder() - .sender("sen...@james.org") - .recipient("t...@james.org") - .attribute("org.apache.james.spamassassin.status", "") - .build(); + .sender("sen...@james.org") + .recipient("t...@james.org") + .addHeaderForRecipient(PerRecipientHeaders.Header.builder() + .name("org.apache.james.spamassassin.status") + .value("other") + .build(), + new MailAddress("t...@james.org")) + .build(); Collection<MailAddress> matches = matcher.match(mail); assertThat(matches).isEmpty(); } @Test - public void isMarkedAsSpamShouldNotMatchWhenHeaderButOtherValue() throws Exception { + public void isMarkedAsSpamShouldNotMatchWhenHeaderButNoValue() throws Exception { FakeMail mail = FakeMail.builder() - .sender("sen...@james.org") - .recipient("t...@james.org") - .attribute("org.apache.james.spamassassin.status", "other") - .build(); + .sender("sen...@james.org") + .recipient("t...@james.org") + .addHeaderForRecipient(PerRecipientHeaders.Header.builder() + .name("org.apache.james.spamassassin.status") + .value("No, hits=1.8 required=5.0") + .build(), + new MailAddress("t...@james.org")) + .build(); Collection<MailAddress> matches = matcher.match(mail); assertThat(matches).isEmpty(); } @Test - public void isMarkedAsSpamShouldNotMatchWhenHeaderButNoValue() throws Exception { + public void isMarkedAsSpamShouldMatchWhenHeaderAndYesValue() throws Exception { FakeMail mail = FakeMail.builder() - .sender("sen...@james.org") - .recipient("t...@james.org") - .attribute("org.apache.james.spamassassin.status", "No, hits=1.8 required=5.0") - .build(); + .sender("sen...@james.org") + .recipient("t...@james.org") + .addHeaderForRecipient(PerRecipientHeaders.Header.builder() + .name("org.apache.james.spamassassin.status") + .value("Yes, hits=6.8 required=5.0") + .build(), + new MailAddress("t...@james.org")) + .attribute("org.apache.james.spamassassin.status", "Yes, hits=6.8 required=5.0") + .build(); Collection<MailAddress> matches = matcher.match(mail); - assertThat(matches).isEmpty(); + assertThat(matches).contains(new MailAddress("t...@james.org")); } @Test - public void isMarkedAsSpamShouldMatchWhenHeaderAndYesValue() throws Exception { + public void isMarkedAsSpamShouldMatchOnlyRecipientsWithHeaderAndYesValue() throws Exception { FakeMail mail = FakeMail.builder() - .sender("sen...@james.org") - .recipient("t...@james.org") - .attribute("org.apache.james.spamassassin.status", "Yes, hits=6.8 required=5.0") - .build(); + .sender("sen...@james.org") + .recipients("t...@james.org", "t...@james.org") + .addHeaderForRecipient(PerRecipientHeaders.Header.builder() + .name("org.apache.james.spamassassin.status") + .value("Yes, hits=6.8 required=5.0") + .build(), + new MailAddress("t...@james.org")) + .build(); Collection<MailAddress> matches = matcher.match(mail); - assertThat(matches).contains(new MailAddress("t...@james.org")); + assertThat(matches).contains(new MailAddress("t...@james.org")); } @Test public void isMarkedAsSpamShouldMatchWhenHeaderAndYesValueInOtherCase() throws Exception { FakeMail mail = FakeMail.builder() - .sender("sen...@james.org") - .recipient("t...@james.org") - .attribute("org.apache.james.spamassassin.status", "YES, hits=6.8 required=5.0") - .build(); + .sender("sen...@james.org") + .recipient("t...@james.org") + .addHeaderForRecipient(PerRecipientHeaders.Header.builder() + .name("org.apache.james.spamassassin.status") + .value("YES, hits=6.8 required=5.0") + .build(), + new MailAddress("t...@james.org")) + .build(); Collection<MailAddress> matches = matcher.match(mail); assertThat(matches).contains(new MailAddress("t...@james.org")); http://git-wip-us.apache.org/repos/asf/james-project/blob/34bd5809/server/testing/src/main/java/org/apache/james/utils/IMAPMessageReader.java ---------------------------------------------------------------------- diff --git a/server/testing/src/main/java/org/apache/james/utils/IMAPMessageReader.java b/server/testing/src/main/java/org/apache/james/utils/IMAPMessageReader.java index 5912cf3..071c8a8 100644 --- a/server/testing/src/main/java/org/apache/james/utils/IMAPMessageReader.java +++ b/server/testing/src/main/java/org/apache/james/utils/IMAPMessageReader.java @@ -51,6 +51,11 @@ public class IMAPMessageReader extends ExternalResource implements Closeable { return this; } + public IMAPMessageReader disconnect() throws IOException { + imapClient.disconnect(); + return this; + } + public IMAPMessageReader login(String user, String password) throws IOException { imapClient.login(user, password); return this; --------------------------------------------------------------------- To unsubscribe, e-mail: server-dev-unsubscr...@james.apache.org For additional commands, e-mail: server-dev-h...@james.apache.org