Skip to content

Commit

Permalink
JAMES-3775 RSpamD mailet should support rewrite subject (linagora#1106)
Browse files Browse the repository at this point in the history
  • Loading branch information
quantranhong1999 authored Aug 16, 2022
1 parent 574196b commit 8b17f1d
Show file tree
Hide file tree
Showing 3 changed files with 121 additions and 3 deletions.
5 changes: 5 additions & 0 deletions third-party/rspamd/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -150,6 +150,11 @@
<artifactId>mockito-core</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.mockito</groupId>
<artifactId>mockito-core</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.testcontainers</groupId>
<artifactId>testcontainers</artifactId>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -36,25 +36,37 @@
import org.apache.mailet.PerRecipientHeaders;
import org.apache.mailet.base.GenericMailet;

import com.github.fge.lambdas.Throwing;
import com.google.common.collect.ImmutableList;

public class RSpamDScanner extends GenericMailet {
public static final AttributeName FLAG_MAIL = AttributeName.of("org.apache.james.rspamd.flag");
public static final AttributeName STATUS_MAIL = AttributeName.of("org.apache.james.rspamd.status");

private final RSpamDHttpClient rSpamDHttpClient;
private boolean rewriteSubject;

@Inject
public RSpamDScanner(RSpamDHttpClient rSpamDHttpClient) {
this.rSpamDHttpClient = rSpamDHttpClient;
}

@Override
public void init() {
rewriteSubject = getBooleanParameter(getInitParameter("rewriteSubject"), false);
}

@Override
public void service(Mail mail) throws MessagingException {
AnalysisResult rSpamDResult = rSpamDHttpClient.checkV2(new MimeMessageInputStream(mail.getMessage())).block();

mail.getRecipients()
.forEach(recipient -> appendRSpamDResultHeader(mail, recipient, rSpamDResult));

if (rewriteSubject) {
rSpamDResult.getDesiredRewriteSubject()
.ifPresent(Throwing.consumer(desiredRewriteSubject -> mail.getMessage().setSubject(desiredRewriteSubject)));
}
}

private void appendRSpamDResultHeader(Mail mail, MailAddress recipient, AnalysisResult rSpamDResult) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,8 +19,11 @@

package org.apache.james.rspamd;


import static org.apache.james.rspamd.DockerRSpamD.PASSWORD;
import static org.assertj.core.api.Assertions.assertThat;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;

import java.util.Collection;
import java.util.Optional;
Expand All @@ -31,28 +34,33 @@
import org.apache.james.core.builder.MimeMessageBuilder;
import org.apache.james.rspamd.client.RSpamDClientConfiguration;
import org.apache.james.rspamd.client.RSpamDHttpClient;
import org.apache.james.rspamd.model.AnalysisResult;
import org.apache.james.util.MimeMessageUtil;
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.assertj.core.api.SoftAssertions;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.RegisterExtension;

import com.google.common.collect.ImmutableList;

import reactor.core.publisher.Mono;

class RSpamDScannerTest {

@RegisterExtension
static DockerRSpamDExtension rSpamDExtension = new DockerRSpamDExtension();
static final String rSpamDPassword = "admin";
static final String INIT_SUBJECT = "initial subject";
static final String REWRITE_SUBJECT = "rewrite subject";

private RSpamDScanner mailet;

@BeforeEach
void setup() {
RSpamDClientConfiguration configuration = new RSpamDClientConfiguration(rSpamDExtension.getBaseUrl(), rSpamDPassword, Optional.empty());
RSpamDClientConfiguration configuration = new RSpamDClientConfiguration(rSpamDExtension.getBaseUrl(), PASSWORD, Optional.empty());
RSpamDHttpClient client = new RSpamDHttpClient(configuration);
mailet = new RSpamDScanner(client);
}
Expand Down Expand Up @@ -148,4 +156,97 @@ void serviceShouldWriteMessageAsSpamWhenSpam() throws Exception {

});
}

@Test
void shouldRewriteSubjectWhenRewriteSubjectIsTrueAndAnalysisResultHasDesiredRewriteSubject() throws Exception {
RSpamDHttpClient rSpamDHttpClient = mock(RSpamDHttpClient.class);
when(rSpamDHttpClient.checkV2(any())).thenReturn(Mono.just(AnalysisResult.builder()
.action(AnalysisResult.Action.REWRITE_SUBJECT)
.score(12.1F)
.requiredScore(14F)
.desiredRewriteSubject(REWRITE_SUBJECT)
.build()));

FakeMailetConfig mailetConfig = FakeMailetConfig.builder()
.setProperty("rewriteSubject", "true")
.build();

mailet = new RSpamDScanner(rSpamDHttpClient);

Mail mail = FakeMail.builder()
.name("name")
.recipient("user1@exemple.com")
.mimeMessage(MimeMessageBuilder.mimeMessageBuilder()
.addToRecipient("user1@exemple.com")
.addFrom("sender@exemple.com")
.setSubject(INIT_SUBJECT)
.setText("Please!")
.build())
.build();

mailet.init(mailetConfig);
mailet.service(mail);

assertThat(mail.getMessage().getSubject()).isEqualTo(REWRITE_SUBJECT);
}

@Test
void shouldNotRewriteSubjectWhenRewriteSubjectIsFalseByDefaultAndAnalysisResultHasDesiredRewriteSubject() throws Exception {
RSpamDHttpClient rSpamDHttpClient = mock(RSpamDHttpClient.class);
when(rSpamDHttpClient.checkV2(any())).thenReturn(Mono.just(AnalysisResult.builder()
.action(AnalysisResult.Action.REWRITE_SUBJECT)
.score(12.1F)
.requiredScore(14F)
.desiredRewriteSubject(REWRITE_SUBJECT)
.build()));

mailet = new RSpamDScanner(rSpamDHttpClient);

Mail mail = FakeMail.builder()
.name("name")
.recipient("user1@exemple.com")
.mimeMessage(MimeMessageBuilder.mimeMessageBuilder()
.addToRecipient("user1@exemple.com")
.addFrom("sender@exemple.com")
.setSubject(INIT_SUBJECT)
.setText("Please!")
.build())
.build();

mailet.service(mail);

assertThat(mail.getMessage().getSubject()).isEqualTo(INIT_SUBJECT);
}

@Test
void shouldNotRewriteSubjectWhenRewriteSubjectIsTrueAndAnalysisResultDoesNotHaveDesiredRewriteSubject() throws Exception {
RSpamDHttpClient rSpamDHttpClient = mock(RSpamDHttpClient.class);
when(rSpamDHttpClient.checkV2(any())).thenReturn(Mono.just(AnalysisResult.builder()
.action(AnalysisResult.Action.NO_ACTION)
.score(0.99F)
.requiredScore(14F)
.build()));

FakeMailetConfig mailetConfig = FakeMailetConfig.builder()
.setProperty("rewriteSubject", "true")
.build();

mailet = new RSpamDScanner(rSpamDHttpClient);

Mail mail = FakeMail.builder()
.name("name")
.recipient("user1@exemple.com")
.mimeMessage(MimeMessageBuilder.mimeMessageBuilder()
.addToRecipient("user1@exemple.com")
.addFrom("sender@exemple.com")
.setSubject(INIT_SUBJECT)
.setText("Please!")
.build())
.build();

mailet.init(mailetConfig);
mailet.service(mail);

assertThat(mail.getMessage().getSubject()).isEqualTo(INIT_SUBJECT);
}
}

0 comments on commit 8b17f1d

Please sign in to comment.