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
The following commit(s) were added to refs/heads/master by this push:
new aaa5931eaf JAMES-3755 Allow RSpamDScanner to override url settings
(#2819)
aaa5931eaf is described below
commit aaa5931eaf81d2eaec129087bc040896448ec0e6
Author: Benoit TELLIER <[email protected]>
AuthorDate: Mon Sep 22 17:29:43 2025 +0200
JAMES-3755 Allow RSpamDScanner to override url settings (#2819)
---
third-party/rspamd/README.md | 5 +++
.../org/apache/james/rspamd/RspamdScanner.java | 18 ++++++++--
.../org/apache/james/rspamd/RspamdScannerTest.java | 42 ++++++++++++++++++++++
3 files changed, 62 insertions(+), 3 deletions(-)
diff --git a/third-party/rspamd/README.md b/third-party/rspamd/README.md
index 3706c6eaeb..31c7be977f 100644
--- a/third-party/rspamd/README.md
+++ b/third-party/rspamd/README.md
@@ -86,6 +86,11 @@ If true `virusProcessor` and `rejectSpamProcessor` are
honnered per user, at the
</processor>
```
+`RSpamdScanner` supports addition `rspamdUrl`, `rspamdPassword`,
`rspamdTimeout`, `perUserBayes` properties allowing to
+override content defined in `rspamd.properties`, which allows running several
instances on distict Rspamd instance. A
+possible use case is to use 1 RSpamD cluster on user incoming spam, trained in
perUserBayes mode, and another RSpamD
+cluster configured to check outgoing email for spams with a tolerant threshold
and a specifc configuration.
+
- Declare the webadmin for Rspamd in `webadmin.properties`
```
diff --git
a/third-party/rspamd/src/main/java/org/apache/james/rspamd/RspamdScanner.java
b/third-party/rspamd/src/main/java/org/apache/james/rspamd/RspamdScanner.java
index 19a5ce13e1..63c4b8ef8e 100644
---
a/third-party/rspamd/src/main/java/org/apache/james/rspamd/RspamdScanner.java
+++
b/third-party/rspamd/src/main/java/org/apache/james/rspamd/RspamdScanner.java
@@ -20,6 +20,7 @@
package org.apache.james.rspamd;
+import java.net.URL;
import java.util.Collection;
import java.util.List;
import java.util.Optional;
@@ -63,9 +64,10 @@ 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 final RspamdClientConfiguration configuration;
+ private RspamdHttpClient rspamdHttpClient;
private boolean rewriteSubject;
+ private boolean perUserBayes;
private Optional<String> virusProcessor;
private Optional<String> rejectSpamProcessor;
@@ -73,18 +75,28 @@ public class RspamdScanner extends GenericMailet {
public RspamdScanner(RspamdHttpClient rspamdHttpClient,
RspamdClientConfiguration configuration) {
this.rspamdHttpClient = rspamdHttpClient;
this.configuration = configuration;
+ this.perUserBayes = configuration.usePerUserBayes();
}
@Override
public void init() {
- rewriteSubject =
getBooleanParameter(getInitParameter("rewriteSubject"), false);
+ rewriteSubject = getInitParameter("rewriteSubject", false);
virusProcessor = getInitParameterAsOptional("virusProcessor");
rejectSpamProcessor =
getInitParameterAsOptional("rejectSpamProcessor");
+
+ perUserBayes = getInitParameter("perUserBayes",
configuration.usePerUserBayes());
+
+ getInitParameterAsOptional("rspamdUrl")
+ .ifPresent(Throwing.consumer(url -> this.rspamdHttpClient = new
RspamdHttpClient(new RspamdClientConfiguration(
+ new URL(url),
+ getInitParameter("rspamdPassword",
configuration.getPassword()),
+
getInitParameterAsOptional("rspamdTimeout").map(Integer::parseInt).or(configuration::getTimeout),
+ perUserBayes))));
}
@Override
public void service(Mail mail) throws MessagingException {
- if (configuration.usePerUserBayes()) {
+ if (perUserBayes) {
scanPerUser(mail);
} else {
scanAll(mail);
diff --git
a/third-party/rspamd/src/test/java/org/apache/james/rspamd/RspamdScannerTest.java
b/third-party/rspamd/src/test/java/org/apache/james/rspamd/RspamdScannerTest.java
index 7485914879..57449d472a 100644
---
a/third-party/rspamd/src/test/java/org/apache/james/rspamd/RspamdScannerTest.java
+++
b/third-party/rspamd/src/test/java/org/apache/james/rspamd/RspamdScannerTest.java
@@ -23,6 +23,7 @@ import static org.assertj.core.api.Assertions.assertThat;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.ArgumentMatchers.eq;
import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.verifyNoInteractions;
import static org.mockito.Mockito.when;
import java.util.Collection;
@@ -313,6 +314,47 @@ class RspamdScannerTest {
assertThat(mail.getState()).isEqualTo("spam");
}
+ @Test
+ void shouldSupportCustomRSpamDURL() throws Exception {
+ RspamdHttpClient rspamdHttpClient = mock(RspamdHttpClient.class);
+
when(rspamdHttpClient.checkV2(any(Mail.class))).thenReturn(Mono.just(AnalysisResult.builder()
+ .action(AnalysisResult.Action.REJECT)
+ .score(12.1F)
+ .requiredScore(14F)
+ .build()));
+
+ FakeMailetConfig mailetConfig = FakeMailetConfig.builder()
+ .setProperty("rejectSpamProcessor", "spam")
+ .setProperty("rspamdUrl", "http://imap.failing.com")
+ .setProperty("rspamdPassword", "secret")
+ .setProperty("rspamdTimeout", "20000")
+ .build();
+
+ mailet = new RspamdScanner(rspamdHttpClient, configuration);
+
+ Mail mail = FakeMail.builder()
+ .name("name")
+ .state("initial")
+ .recipient("[email protected]")
+ .mimeMessage(MimeMessageBuilder.mimeMessageBuilder()
+ .addToRecipient("[email protected]")
+ .addFrom("[email protected]")
+ .setSubject(INIT_SUBJECT)
+ .setText("Please!")
+ .build())
+ .build();
+
+ mailet.init(mailetConfig);
+ try {
+ mailet.service(mail);
+ } catch (Exception e) {
+ // ignore
+ }
+
+ // We overloaded the mock supplied in the constructor
+ verifyNoInteractions(rspamdHttpClient);
+ }
+
@Test
void serviceShouldNotMoveRejetedEmailWhenNoSpamProcessor() throws
Exception {
RspamdHttpClient rspamdHttpClient = mock(RspamdHttpClient.class);
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]