You are viewing a plain text version of this content. The canonical link for it is here.
Posted to server-dev@james.apache.org by ro...@apache.org on 2018/02/28 13:46:36 UTC

[7/8] james-project git commit: JAMES-2341 SpamAssassin listener implementation for SpamEventListener

JAMES-2341 SpamAssassin listener implementation for SpamEventListener


Project: http://git-wip-us.apache.org/repos/asf/james-project/repo
Commit: http://git-wip-us.apache.org/repos/asf/james-project/commit/bd259078
Tree: http://git-wip-us.apache.org/repos/asf/james-project/tree/bd259078
Diff: http://git-wip-us.apache.org/repos/asf/james-project/diff/bd259078

Branch: refs/heads/master
Commit: bd259078b11fd104d6ccd8ec523e109fe114adde
Parents: e640b76
Author: Antoine Duprat <ad...@linagora.com>
Authored: Fri Feb 23 09:48:27 2018 +0100
Committer: Antoine Duprat <ad...@linagora.com>
Committed: Wed Feb 28 13:29:32 2018 +0100

----------------------------------------------------------------------
 mailbox/plugin/spamassassin/pom.xml             |   9 ++
 .../mailbox/spamassassin/SpamAssassin.java      |  40 +++++++
 .../spamassassin/SpamAssassinListener.java      |  75 +++++++++++++
 .../spamassassin/SpamAssassinListenerTest.java  | 105 +++++++++++++++++++
 4 files changed, 229 insertions(+)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/james-project/blob/bd259078/mailbox/plugin/spamassassin/pom.xml
----------------------------------------------------------------------
diff --git a/mailbox/plugin/spamassassin/pom.xml b/mailbox/plugin/spamassassin/pom.xml
index e88cc2d..b510523 100644
--- a/mailbox/plugin/spamassassin/pom.xml
+++ b/mailbox/plugin/spamassassin/pom.xml
@@ -37,6 +37,10 @@
             <artifactId>apache-james-mailbox-api</artifactId>
         </dependency>
         <dependency>
+            <groupId>${project.groupId}</groupId>
+            <artifactId>apache-james-mailbox-store</artifactId>
+        </dependency>
+        <dependency>
             <groupId>junit</groupId>
             <artifactId>junit</artifactId>
             <scope>test</scope>
@@ -51,6 +55,11 @@
             <artifactId>assertj-core</artifactId>
             <scope>test</scope>
         </dependency>
+        <dependency>
+            <groupId>org.mockito</groupId>
+            <artifactId>mockito-core</artifactId>
+            <scope>test</scope>
+        </dependency>
     </dependencies>
 
 </project>

http://git-wip-us.apache.org/repos/asf/james-project/blob/bd259078/mailbox/plugin/spamassassin/src/main/java/org/apache/james/mailbox/spamassassin/SpamAssassin.java
----------------------------------------------------------------------
diff --git a/mailbox/plugin/spamassassin/src/main/java/org/apache/james/mailbox/spamassassin/SpamAssassin.java b/mailbox/plugin/spamassassin/src/main/java/org/apache/james/mailbox/spamassassin/SpamAssassin.java
new file mode 100644
index 0000000..0dfb30e
--- /dev/null
+++ b/mailbox/plugin/spamassassin/src/main/java/org/apache/james/mailbox/spamassassin/SpamAssassin.java
@@ -0,0 +1,40 @@
+/****************************************************************
+ * Licensed to the Apache Software Foundation (ASF) under one   *
+ * or more contributor license agreements.  See the NOTICE file *
+ * distributed with this work for additional information        *
+ * regarding copyright ownership.  The ASF licenses this file   *
+ * to you under the Apache License, Version 2.0 (the            *
+ * "License"); you may not use this file except in compliance   *
+ * with the License.  You may obtain a copy of the License at   *
+ *                                                              *
+ *   http://www.apache.org/licenses/LICENSE-2.0                 *
+ *                                                              *
+ * Unless required by applicable law or agreed to in writing,   *
+ * software distributed under the License is distributed on an  *
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY       *
+ * KIND, either express or implied.  See the License for the    *
+ * specific language governing permissions and limitations      *
+ * under the License.                                           *
+ ****************************************************************/
+package org.apache.james.mailbox.spamassassin;
+
+import java.io.InputStream;
+import java.util.List;
+
+import javax.inject.Inject;
+
+public class SpamAssassin {
+
+    private final SpamAssassinConfiguration spamAssassinConfiguration;
+
+    @Inject
+    public SpamAssassin(SpamAssassinConfiguration spamAssassinConfiguration) {
+        this.spamAssassinConfiguration = spamAssassinConfiguration;
+    }
+
+    public void learnSpam(List<InputStream> messages) {
+        if (spamAssassinConfiguration.isEnable()) {
+            // Will call SpamAssassinInvoker
+        }
+    }
+}

http://git-wip-us.apache.org/repos/asf/james-project/blob/bd259078/mailbox/plugin/spamassassin/src/main/java/org/apache/james/mailbox/spamassassin/SpamAssassinListener.java
----------------------------------------------------------------------
diff --git a/mailbox/plugin/spamassassin/src/main/java/org/apache/james/mailbox/spamassassin/SpamAssassinListener.java b/mailbox/plugin/spamassassin/src/main/java/org/apache/james/mailbox/spamassassin/SpamAssassinListener.java
new file mode 100644
index 0000000..d0888f6
--- /dev/null
+++ b/mailbox/plugin/spamassassin/src/main/java/org/apache/james/mailbox/spamassassin/SpamAssassinListener.java
@@ -0,0 +1,75 @@
+/****************************************************************
+ * Licensed to the Apache Software Foundation (ASF) under one   *
+ * or more contributor license agreements.  See the NOTICE file *
+ * distributed with this work for additional information        *
+ * regarding copyright ownership.  The ASF licenses this file   *
+ * to you under the Apache License, Version 2.0 (the            *
+ * "License"); you may not use this file except in compliance   *
+ * with the License.  You may obtain a copy of the License at   *
+ *                                                              *
+ *   http://www.apache.org/licenses/LICENSE-2.0                 *
+ *                                                              *
+ * Unless required by applicable law or agreed to in writing,   *
+ * software distributed under the License is distributed on an  *
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY       *
+ * KIND, either express or implied.  See the License for the    *
+ * specific language governing permissions and limitations      *
+ * under the License.                                           *
+ ****************************************************************/
+package org.apache.james.mailbox.spamassassin;
+
+import java.io.InputStream;
+
+import javax.inject.Inject;
+
+import org.apache.james.mailbox.Role;
+import org.apache.james.mailbox.store.event.EventFactory;
+import org.apache.james.mailbox.store.event.SpamEventListener;
+import org.apache.james.mailbox.store.mail.model.Message;
+
+import com.github.fge.lambdas.Throwing;
+import com.github.steveash.guavate.Guavate;
+import com.google.common.annotations.VisibleForTesting;
+import com.google.common.collect.ImmutableList;
+
+public class SpamAssassinListener implements SpamEventListener {
+
+    private final SpamAssassin spamAssassin;
+
+    @Inject
+    public SpamAssassinListener(SpamAssassin spamAssassin) {
+        this.spamAssassin = spamAssassin;
+    }
+
+    @Override
+    public ListenerType getType() {
+        return ListenerType.ONCE;
+    }
+
+    @Override
+    public ExecutionMode getExecutionMode() {
+        return ExecutionMode.ASYNCHRONOUS;
+    }
+
+    @Override
+    public void event(Event event) {
+        if (event instanceof EventFactory.AddedImpl) {
+            EventFactory.AddedImpl addedToMailboxEvent = (EventFactory.AddedImpl) event;
+            if (isEventOnSpamMailbox(addedToMailboxEvent)) {
+                ImmutableList<InputStream> messages = addedToMailboxEvent.getAvailableMessages()
+                    .values()
+                    .stream()
+                    .map(Throwing.function(Message::getFullContent))
+                    .collect(Guavate.toImmutableList());
+                spamAssassin.learnSpam(messages);
+            }
+        }
+    }
+
+    @VisibleForTesting
+    boolean isEventOnSpamMailbox(Event event) {
+        return Role.from(event.getMailboxPath().getName())
+            .filter(role -> role.equals(Role.SPAM))
+            .isPresent();
+    }
+}

http://git-wip-us.apache.org/repos/asf/james-project/blob/bd259078/mailbox/plugin/spamassassin/src/test/java/org/apache/james/mailbox/spamassassin/SpamAssassinListenerTest.java
----------------------------------------------------------------------
diff --git a/mailbox/plugin/spamassassin/src/test/java/org/apache/james/mailbox/spamassassin/SpamAssassinListenerTest.java b/mailbox/plugin/spamassassin/src/test/java/org/apache/james/mailbox/spamassassin/SpamAssassinListenerTest.java
new file mode 100644
index 0000000..c6fe083
--- /dev/null
+++ b/mailbox/plugin/spamassassin/src/test/java/org/apache/james/mailbox/spamassassin/SpamAssassinListenerTest.java
@@ -0,0 +1,105 @@
+/****************************************************************
+ * Licensed to the Apache Software Foundation (ASF) under one   *
+ * or more contributor license agreements.  See the NOTICE file *
+ * distributed with this work for additional information        *
+ * regarding copyright ownership.  The ASF licenses this file   *
+ * to you under the Apache License, Version 2.0 (the            *
+ * "License"); you may not use this file except in compliance   *
+ * with the License.  You may obtain a copy of the License at   *
+ *                                                              *
+ *   http://www.apache.org/licenses/LICENSE-2.0                 *
+ *                                                              *
+ * Unless required by applicable law or agreed to in writing,   *
+ * software distributed under the License is distributed on an  *
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY       *
+ * KIND, either express or implied.  See the License for the    *
+ * specific language governing permissions and limitations      *
+ * under the License.                                           *
+ ****************************************************************/
+package org.apache.james.mailbox.spamassassin;
+
+import static org.assertj.core.api.Assertions.assertThat;
+import static org.mockito.Matchers.any;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.verify;
+
+import java.util.Map;
+import java.util.SortedMap;
+
+import org.apache.james.mailbox.DefaultMailboxes;
+import org.apache.james.mailbox.MailboxListener.Added;
+import org.apache.james.mailbox.MailboxSession;
+import org.apache.james.mailbox.MessageUid;
+import org.apache.james.mailbox.model.MailboxPath;
+import org.apache.james.mailbox.model.MessageMetaData;
+import org.apache.james.mailbox.store.event.EventFactory;
+import org.apache.james.mailbox.store.mail.model.Mailbox;
+import org.apache.james.mailbox.store.mail.model.MailboxMessage;
+import org.apache.james.mailbox.store.mail.model.impl.SimpleMailbox;
+import org.junit.Before;
+import org.junit.Test;
+
+import com.google.common.collect.ImmutableMap;
+import com.google.common.collect.ImmutableSortedMap;
+
+public class SpamAssassinListenerTest {
+
+    private SpamAssassin spamAssassin;
+    private SpamAssassinListener listener;
+
+    @Before
+    public void setup() {
+        spamAssassin = mock(SpamAssassin.class);
+        listener = new SpamAssassinListener(spamAssassin);
+    }
+
+    @Test
+    public void isEventOnSpamMailboxShouldReturnFalseWhenMailboxIsNotSpam() {
+        MailboxSession mailboxSession = null;
+        int uidValidity = 1;
+        Mailbox mailbox = new SimpleMailbox(MailboxPath.forUser("user", "mbx"), uidValidity);
+        SortedMap<MessageUid, MessageMetaData> uids = ImmutableSortedMap.of();
+        Map<MessageUid, MailboxMessage> availableMessages = ImmutableMap.of();
+        Added added = new EventFactory().added(mailboxSession, uids, mailbox, availableMessages);
+
+        assertThat(listener.isEventOnSpamMailbox(added)).isFalse();
+    }
+
+    @Test
+    public void isEventOnSpamMailboxShouldReturnTrueWhenMailboxIsSpam() {
+        MailboxSession mailboxSession = null;
+        int uidValidity = 1;
+        Mailbox mailbox = new SimpleMailbox(MailboxPath.forUser("user", DefaultMailboxes.SPAM), uidValidity);
+        SortedMap<MessageUid, MessageMetaData> uids = ImmutableSortedMap.of();
+        Map<MessageUid, MailboxMessage> availableMessages = ImmutableMap.of();
+        Added added = new EventFactory().added(mailboxSession, uids, mailbox, availableMessages);
+
+        assertThat(listener.isEventOnSpamMailbox(added)).isTrue();
+    }
+
+    @Test
+    public void isEventOnSpamMailboxShouldReturnFalseWhenMailboxIsSpamOtherCase() {
+        MailboxSession mailboxSession = null;
+        int uidValidity = 1;
+        Mailbox mailbox = new SimpleMailbox(MailboxPath.forUser("user", "SPAM"), uidValidity);
+        SortedMap<MessageUid, MessageMetaData> uids = ImmutableSortedMap.of();
+        Map<MessageUid, MailboxMessage> availableMessages = ImmutableMap.of();
+        Added added = new EventFactory().added(mailboxSession, uids, mailbox, availableMessages);
+
+        assertThat(listener.isEventOnSpamMailbox(added)).isFalse();
+    }
+
+    @Test
+    public void eventShouldCallSpamAssassinWhenTheEventMatches() {
+        MailboxSession mailboxSession = null;
+        int uidValidity = 1;
+        Mailbox mailbox = new SimpleMailbox(MailboxPath.forUser("user", "Spam"), uidValidity);
+        SortedMap<MessageUid, MessageMetaData> uids = ImmutableSortedMap.of();
+        Map<MessageUid, MailboxMessage> availableMessages = ImmutableMap.of();
+        Added added = new EventFactory().added(mailboxSession, uids, mailbox, availableMessages);
+
+        listener.event(added);
+
+        verify(spamAssassin).learnSpam(any());
+    }
+}


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