[prev in list] [next in list] [prev in thread] [next in thread] 

List:       james-dev
Subject:    [12/13] james-project git commit: JAMES-2268 Functionnal style and tests for PostmasterAlias
From:       btellier () apache ! org
Date:       2017-12-25 4:26:56
Message-ID: 042825c09e124c28ad6ec73f1fb2a080 () git ! apache ! org
[Download RAW message or body]

JAMES-2268 Functionnal style and tests for PostmasterAlias

PostmasterAlias was altering directly mail recipients and thus triggered an error \
while modifying Immutable collection


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

Branch: refs/heads/master
Commit: dfd3f420bfe4cb6ad38150034380221d793aa6a8
Parents: 02f9631
Author: benwa <btellier@linagora.com>
Authored: Thu Dec 21 14:00:29 2017 +0700
Committer: benwa <btellier@linagora.com>
Committed: Mon Dec 25 11:25:18 2017 +0700

----------------------------------------------------------------------
 .../transport/mailets/PostmasterAlias.java      |  48 ++++---
 .../transport/mailets/PostmasterAliasTest.java  | 125 +++++++++++++++++++
 2 files changed, 147 insertions(+), 26 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/james-project/blob/dfd3f420/mailet/standard/src/main/java/org/apache/james/transport/mailets/PostmasterAlias.java
                
----------------------------------------------------------------------
diff --git a/mailet/standard/src/main/java/org/apache/james/transport/mailets/PostmasterAlias.java \
b/mailet/standard/src/main/java/org/apache/james/transport/mailets/PostmasterAlias.java
 index 04c8c72..3366c86 100644
--- a/mailet/standard/src/main/java/org/apache/james/transport/mailets/PostmasterAlias.java
                
+++ b/mailet/standard/src/main/java/org/apache/james/transport/mailets/PostmasterAlias.java
 @@ -17,26 +17,24 @@
  * under the License.                                           *
  ****************************************************************/
 
-
-
 package org.apache.james.transport.mailets;
 
 import java.util.Collection;
-import java.util.Vector;
+import java.util.stream.Stream;
 
 import javax.mail.MessagingException;
 
-import org.apache.mailet.Mail;
 import org.apache.james.core.MailAddress;
-import org.apache.mailet.MailetContext;
+import org.apache.mailet.Mail;
 import org.apache.mailet.base.GenericMailet;
 
+import com.github.steveash.guavate.Guavate;
+
 /**
  * Rewrites recipient addresses to make sure email for the postmaster is
  * always handled.  This mailet is silently inserted at the top of the root
  * spool processor.  All recipients mapped to postmaster@<servernames> are
  * changed to the postmaster account as specified in the server conf.
- *
  */
 public class PostmasterAlias extends GenericMailet {
 
@@ -49,30 +47,28 @@ public class PostmasterAlias extends GenericMailet {
      * @throws MessagingException if an error is encountered while modifying the \
                message
      */
     public void service(Mail mail) throws MessagingException {
-        Collection<MailAddress> recipients = mail.getRecipients();
-        Collection<MailAddress> recipientsToRemove = null;
-        MailetContext mailetContext = getMailetContext();
-        boolean postmasterAddressed = false;
+        Collection<MailAddress> postmasterAliases = mail.getRecipients()
+            .stream()
+            .filter(this::isPostmasterAlias)
+            .collect(Guavate.toImmutableList());
 
-        for (MailAddress addr : recipients) {
-            if (addr.getLocalPart().equalsIgnoreCase("postmaster") &&
-                    mailetContext.isLocalServer(addr.getDomain()) && \
                !mailetContext.isLocalEmail(addr)) {
-                //Should remove this address... we want to replace it with
-                //  the server's postmaster address
-                if (recipientsToRemove == null) {
-                    recipientsToRemove = new Vector<>();
-                }
-                recipientsToRemove.add(addr);
-                //Flag this as having found the postmaster
-                postmasterAddressed = true;
-            }
-        }
-        if (postmasterAddressed) {
-            recipients.removeAll(recipientsToRemove);
-            recipients.add(getMailetContext().getPostmaster());
+        if (!postmasterAliases.isEmpty()) {
+            mail.setRecipients(
+                Stream.concat(
+                    mail.getRecipients()
+                        .stream()
+                        .filter(address -> !postmasterAliases.contains(address)),
+                    Stream.of(getMailetContext().getPostmaster()))
+                .collect(Guavate.toImmutableSet()));
         }
     }
 
+    private boolean isPostmasterAlias(MailAddress addr) {
+        return addr.getLocalPart().equalsIgnoreCase("postmaster")
+            && getMailetContext().isLocalServer(addr.getDomain())
+            && !getMailetContext().isLocalEmail(addr);
+    }
+
     /**
      * Return a string describing this mailet.
      *

http://git-wip-us.apache.org/repos/asf/james-project/blob/dfd3f420/mailet/standard/src/test/java/org/apache/james/transport/mailets/PostmasterAliasTest.java
                
----------------------------------------------------------------------
diff --git a/mailet/standard/src/test/java/org/apache/james/transport/mailets/PostmasterAliasTest.java \
b/mailet/standard/src/test/java/org/apache/james/transport/mailets/PostmasterAliasTest.java
 new file mode 100644
index 0000000..f485158
--- /dev/null
+++ b/mailet/standard/src/test/java/org/apache/james/transport/mailets/PostmasterAliasTest.java
 @@ -0,0 +1,125 @@
+/****************************************************************
+ * 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.transport.mailets;
+
+import static org.assertj.core.api.Assertions.assertThat;
+
+import org.apache.james.core.MailAddress;
+import org.apache.mailet.Mail;
+import org.apache.mailet.base.MailAddressFixture;
+import org.apache.mailet.base.test.FakeMail;
+import org.apache.mailet.base.test.FakeMailContext;
+import org.apache.mailet.base.test.FakeMailetConfig;
+import org.junit.Before;
+import org.junit.Test;
+
+public class PostmasterAliasTest {
+    private PostmasterAlias testee;
+    private MailAddress postmaster;
+    private MailAddress postmasterAlias;
+
+    @Before
+    public void setUp() throws Exception {
+        postmaster = new MailAddress("admin@localhost");
+        postmasterAlias = new MailAddress("postmaster@localhost");
+        testee = new PostmasterAlias();
+        testee.init(FakeMailetConfig.builder()
+            .mailetContext(FakeMailContext.builder()
+                .postmaster(postmaster))
+            .build());
+    }
+
+    @Test
+    public void serviceShouldAcceptMailsWithNoRecipients() throws Exception {
+        Mail mail = FakeMail.builder().build();
+
+        testee.service(mail);
+
+        assertThat(mail.getRecipients()).isEmpty();
+    }
+
+    @Test
+    public void serviceShouldNotAlterMailsForPostmaster() throws Exception {
+        Mail mail = FakeMail.builder()
+            .recipient(postmaster)
+            .build();
+
+        testee.service(mail);
+
+        assertThat(mail.getRecipients()).containsOnly(postmaster);
+    }
+
+    @Test
+    public void serviceShouldNotAlterMailForOtherUsers() throws Exception {
+        Mail mail = FakeMail.builder()
+            .recipient(MailAddressFixture.ANY_AT_JAMES)
+            .build();
+
+        testee.service(mail);
+
+        assertThat(mail.getRecipients()).containsOnly(MailAddressFixture.ANY_AT_JAMES);
 +    }
+
+    @Test
+    public void serviceShouldNotAlterPostmasterAliasWhenForOtherDomains() throws \
Exception { +        MailAddress otherDomainPostmaster = new \
MailAddress("postmaster@otherDomain"); +        Mail mail = FakeMail.builder()
+            .recipient(otherDomainPostmaster)
+            .build();
+
+        testee.service(mail);
+
+        assertThat(mail.getRecipients()).containsOnly(otherDomainPostmaster);
+    }
+
+    @Test
+    public void serviceShouldRewritePostmasterAlias() throws Exception {
+        Mail mail = FakeMail.builder()
+            .recipient(postmasterAlias)
+            .build();
+
+        testee.service(mail);
+
+        assertThat(mail.getRecipients()).containsOnly(postmaster);
+    }
+
+    @Test
+    public void serviceShouldNotAlterOtherRecipientsWhenRewritingPostmaster() throws \
Exception { +        Mail mail = FakeMail.builder()
+            .recipients(postmasterAlias, MailAddressFixture.ANY_AT_JAMES)
+            .build();
+
+        testee.service(mail);
+
+        assertThat(mail.getRecipients()).containsOnly(postmaster, \
MailAddressFixture.ANY_AT_JAMES); +    }
+
+    @Test
+    public void serviceShouldNotDuplicatePostmaster() throws Exception {
+        Mail mail = FakeMail.builder()
+            .recipients(postmasterAlias, postmaster)
+            .build();
+
+        testee.service(mail);
+
+        assertThat(mail.getRecipients()).containsOnly(postmaster);
+    }
+
+}
\ No newline at end of file


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


[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic