You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@james.apache.org by rc...@apache.org on 2022/09/20 07:20:45 UTC

[james-project] 02/04: JAMES-3775 Fix - webadmin task should hit to Rspamd server when learning

This is an automated email from the ASF dual-hosted git repository.

rcordier pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/james-project.git

commit 73bc6d06784bdeb4dc9d0d64d4b9bbcacd695955
Author: Tung Van TRAN <vt...@linagora.com>
AuthorDate: Tue Sep 13 13:23:09 2022 +0700

    JAMES-3775 Fix - webadmin task should hit to Rspamd server when learning
---
 .../james/rspamd/client/RspamdHttpClient.java      |  2 ++
 .../james/rspamd/task/FeedHamToRspamdTask.java     |  2 +-
 .../james/rspamd/task/FeedSpamToRspamdTask.java    |  2 +-
 .../james/rspamd/task/FeedHamToRspamdTaskTest.java | 39 ++++++++++++++++++++++
 .../rspamd/task/FeedSpamToRspamdTaskTest.java      | 37 ++++++++++++++++++++
 5 files changed, 80 insertions(+), 2 deletions(-)

diff --git a/third-party/rspamd/src/main/java/org/apache/james/rspamd/client/RspamdHttpClient.java b/third-party/rspamd/src/main/java/org/apache/james/rspamd/client/RspamdHttpClient.java
index 7746c57d9a..a61af61c90 100644
--- a/third-party/rspamd/src/main/java/org/apache/james/rspamd/client/RspamdHttpClient.java
+++ b/third-party/rspamd/src/main/java/org/apache/james/rspamd/client/RspamdHttpClient.java
@@ -58,6 +58,7 @@ public class RspamdHttpClient {
     public static final String LEARN_SPAM_ENDPOINT = "/learnspam";
     public static final String LEARN_HAM_ENDPOINT = "/learnham";
     private static final int OK = 200;
+    private static final int NO_CONTENT = 204;
     private static final int FORBIDDEN = 403;
     private static final int BUFFER_SIZE = 16384;
 
@@ -160,6 +161,7 @@ public class RspamdHttpClient {
 
     private Mono<Void> reportMailHttpResponseHandler(HttpClientResponse httpClientResponse, ByteBufMono byteBufMono) {
         switch (httpClientResponse.status().code()) {
+            case NO_CONTENT:
             case OK:
                 return Mono.empty();
             case FORBIDDEN:
diff --git a/third-party/rspamd/src/main/java/org/apache/james/rspamd/task/FeedHamToRspamdTask.java b/third-party/rspamd/src/main/java/org/apache/james/rspamd/task/FeedHamToRspamdTask.java
index ab75e04c4d..1dd77c09c8 100644
--- a/third-party/rspamd/src/main/java/org/apache/james/rspamd/task/FeedHamToRspamdTask.java
+++ b/third-party/rspamd/src/main/java/org/apache/james/rspamd/task/FeedHamToRspamdTask.java
@@ -239,7 +239,7 @@ public class FeedHamToRspamdTask implements Task {
             .transform(ReactorUtils.<MessageResult, Result>throttle()
                 .elements(runningOptions.getMessagesPerSecond())
                 .per(Duration.ofSeconds(1))
-                .forOperation(messageResult -> Mono.fromSupplier(Throwing.supplier(() -> rspamdHttpClient.reportAsHam(messageResult.getFullContent().getInputStream())))
+                .forOperation(messageResult -> rspamdHttpClient.reportAsHam(Throwing.supplier(() -> messageResult.getFullContent().getInputStream()).get())
                     .then(Mono.fromCallable(() -> {
                         context.incrementReportedHamMessageCount(1);
                         return Result.COMPLETED;
diff --git a/third-party/rspamd/src/main/java/org/apache/james/rspamd/task/FeedSpamToRspamdTask.java b/third-party/rspamd/src/main/java/org/apache/james/rspamd/task/FeedSpamToRspamdTask.java
index 4b1f0068be..8a1a1db55c 100644
--- a/third-party/rspamd/src/main/java/org/apache/james/rspamd/task/FeedSpamToRspamdTask.java
+++ b/third-party/rspamd/src/main/java/org/apache/james/rspamd/task/FeedSpamToRspamdTask.java
@@ -240,7 +240,7 @@ public class FeedSpamToRspamdTask implements Task {
             .transform(ReactorUtils.<MessageResult, Task.Result>throttle()
                 .elements(runningOptions.getMessagesPerSecond())
                 .per(Duration.ofSeconds(1))
-                .forOperation(messageResult -> Mono.fromSupplier(Throwing.supplier(() -> rspamdHttpClient.reportAsSpam(messageResult.getFullContent().getInputStream())))
+                .forOperation(messageResult -> rspamdHttpClient.reportAsSpam(Throwing.supplier(() -> messageResult.getFullContent().getInputStream()).get())
                     .then(Mono.fromCallable(() -> {
                         context.incrementReportedSpamMessageCount(1);
                         return Result.COMPLETED;
diff --git a/third-party/rspamd/src/test/java/org/apache/james/rspamd/task/FeedHamToRspamdTaskTest.java b/third-party/rspamd/src/test/java/org/apache/james/rspamd/task/FeedHamToRspamdTaskTest.java
index 0d9a2d8dd2..29b3da3062 100644
--- a/third-party/rspamd/src/test/java/org/apache/james/rspamd/task/FeedHamToRspamdTaskTest.java
+++ b/third-party/rspamd/src/test/java/org/apache/james/rspamd/task/FeedHamToRspamdTaskTest.java
@@ -29,11 +29,13 @@ import static org.mockito.ArgumentMatchers.any;
 import static org.mockito.Mockito.mock;
 
 import java.io.ByteArrayInputStream;
+import java.io.InputStream;
 import java.time.Clock;
 import java.time.Instant;
 import java.time.ZonedDateTime;
 import java.util.Date;
 import java.util.Optional;
+import java.util.concurrent.atomic.AtomicInteger;
 import java.util.stream.IntStream;
 
 import javax.mail.Flags;
@@ -65,6 +67,8 @@ import org.mockito.Mockito;
 
 import com.github.fge.lambdas.Throwing;
 
+import reactor.core.publisher.Mono;
+
 @Tag(Unstable.TAG)
 public class FeedHamToRspamdTaskTest {
     @RegisterExtension
@@ -83,6 +87,25 @@ public class FeedHamToRspamdTaskTest {
     public static final long ONE_DAY_IN_SECOND = 86400;
     public static final Instant NOW = ZonedDateTime.now().toInstant();
 
+    static class TestRspamdHttpClient extends RspamdHttpClient {
+        private final AtomicInteger hitCounter;
+        public TestRspamdHttpClient(RspamdClientConfiguration configuration) {
+            super(configuration);
+            this.hitCounter = new AtomicInteger(0);
+        }
+
+        @Override
+        public Mono<Void> reportAsHam(InputStream content) {
+            return Mono.fromCallable(() -> content)
+                .doOnNext(e -> hitCounter.incrementAndGet())
+                .then();
+        }
+
+        public int getHitCounter() {
+            return hitCounter.get();
+        }
+    }
+
     private InMemoryMailboxManager mailboxManager;
     private MessageIdManager messageIdManager;
     private MailboxSessionMapperFactory mapperFactory;
@@ -142,6 +165,22 @@ public class FeedHamToRspamdTaskTest {
                 .build());
     }
 
+    @Test
+    void taskShouldHitToRspamdServerWhenLearnHam() throws MailboxException{
+        appendHamMessage(BOB_INBOX_MAILBOX, Date.from(NOW));
+        appendHamMessage(ALICE_INBOX_MAILBOX, Date.from(NOW));
+
+        TestRspamdHttpClient rspamdHttpClient = new TestRspamdHttpClient(new RspamdClientConfiguration(rspamdExtension.getBaseUrl(), PASSWORD, Optional.empty()));
+
+        FeedHamToRspamdTask feedHamToRspamdTask = new FeedHamToRspamdTask(mailboxManager, usersRepository, messageIdManager, mapperFactory, rspamdHttpClient, RunningOptions.DEFAULT, clock);
+
+
+        Task.Result result = feedHamToRspamdTask.run();
+
+        assertThat(result).isEqualTo(Task.Result.COMPLETED);
+        assertThat(rspamdHttpClient.getHitCounter()).isEqualTo(2);
+    }
+
     @Test
     void taskShouldReportHamMessageInPeriod() throws MailboxException {
         RunningOptions runningOptions = new RunningOptions(Optional.of(TWO_DAYS_IN_SECOND),
diff --git a/third-party/rspamd/src/test/java/org/apache/james/rspamd/task/FeedSpamToRspamdTaskTest.java b/third-party/rspamd/src/test/java/org/apache/james/rspamd/task/FeedSpamToRspamdTaskTest.java
index 3bd9abd943..fdafeb8bbb 100644
--- a/third-party/rspamd/src/test/java/org/apache/james/rspamd/task/FeedSpamToRspamdTaskTest.java
+++ b/third-party/rspamd/src/test/java/org/apache/james/rspamd/task/FeedSpamToRspamdTaskTest.java
@@ -29,11 +29,13 @@ import static org.mockito.ArgumentMatchers.any;
 import static org.mockito.Mockito.mock;
 
 import java.io.ByteArrayInputStream;
+import java.io.InputStream;
 import java.time.Clock;
 import java.time.Instant;
 import java.time.ZonedDateTime;
 import java.util.Date;
 import java.util.Optional;
+import java.util.concurrent.atomic.AtomicInteger;
 import java.util.stream.IntStream;
 
 import javax.mail.Flags;
@@ -64,6 +66,9 @@ import org.junit.jupiter.api.extension.RegisterExtension;
 import org.mockito.Mockito;
 
 import com.github.fge.lambdas.Throwing;
+
+import reactor.core.publisher.Mono;
+
 @Tag(Unstable.TAG)
 public class FeedSpamToRspamdTaskTest {
     @RegisterExtension
@@ -79,6 +84,25 @@ public class FeedSpamToRspamdTaskTest {
     public static final long ONE_DAY_IN_SECOND = 86400;
     public static final Instant NOW = ZonedDateTime.now().toInstant();
 
+    static class TestRspamdHttpClient extends RspamdHttpClient {
+        private final AtomicInteger hitCounter;
+        public TestRspamdHttpClient(RspamdClientConfiguration configuration) {
+            super(configuration);
+            this.hitCounter = new AtomicInteger(0);
+        }
+
+        @Override
+        public Mono<Void> reportAsSpam(InputStream content) {
+            return Mono.fromCallable(() -> content)
+                .doOnNext(e -> hitCounter.incrementAndGet())
+                .then();
+        }
+
+        public int getHitCounter() {
+            return hitCounter.get();
+        }
+    }
+
     private InMemoryMailboxManager mailboxManager;
     private MessageIdManager messageIdManager;
     private MailboxSessionMapperFactory mapperFactory;
@@ -135,6 +159,19 @@ public class FeedSpamToRspamdTaskTest {
                 .build());
     }
 
+    @Test
+    void taskShouldHitToRspamdServerWhenLearnSpam() throws MailboxException {
+        appendSpamMessage(BOB_SPAM_MAILBOX, Date.from(NOW));
+        appendSpamMessage(ALICE_SPAM_MAILBOX, Date.from(NOW));
+
+        TestRspamdHttpClient rspamdHttpClient = new TestRspamdHttpClient(new RspamdClientConfiguration(rspamdExtension.getBaseUrl(), PASSWORD, Optional.empty()));
+        FeedSpamToRspamdTask feedSpamToRspamdTask = new FeedSpamToRspamdTask(mailboxManager, usersRepository, messageIdManager, mapperFactory, rspamdHttpClient, RunningOptions.DEFAULT, clock);
+        Task.Result result = feedSpamToRspamdTask.run();
+
+        assertThat(result).isEqualTo(Task.Result.COMPLETED);
+        assertThat(rspamdHttpClient.getHitCounter()).isEqualTo(2);
+    }
+
     @Test
     void taskShouldReportSpamMessageInPeriod() throws MailboxException {
         RunningOptions runningOptions = new RunningOptions(Optional.of(TWO_DAYS_IN_SECOND),


---------------------------------------------------------------------
To unsubscribe, e-mail: notifications-unsubscribe@james.apache.org
For additional commands, e-mail: notifications-help@james.apache.org