JAMES-1854 Sieve usage should be optional This is done threw extracting the "storing mail" capability, and includes a tested SimpleMailStorer
Project: http://git-wip-us.apache.org/repos/asf/james-project/repo Commit: http://git-wip-us.apache.org/repos/asf/james-project/commit/989d60e6 Tree: http://git-wip-us.apache.org/repos/asf/james-project/tree/989d60e6 Diff: http://git-wip-us.apache.org/repos/asf/james-project/diff/989d60e6 Branch: refs/heads/master Commit: 989d60e676bec7d17a26157d2d55ca4d89998b3a Parents: 58ef3d2 Author: Benoit Tellier <[email protected]> Authored: Fri Oct 28 14:31:52 2016 +0200 Committer: Benoit Tellier <[email protected]> Committed: Fri Nov 18 18:46:46 2016 +0700 ---------------------------------------------------------------------- server/mailet/mailets/pom.xml | 22 +++ .../mailets/delivery/DeliveryUtils.java | 4 - .../mailets/delivery/LocalDelivery.java | 17 +- .../mailets/delivery/MailboxAppender.java | 113 +++++++++++ .../mailets/delivery/SieveLocalDelivery.java | 118 ++++++++++++ .../transport/mailets/delivery/SievePoster.java | 73 +------ .../delivery/SieveToRecipientFolder.java | 111 +++++++++++ .../mailets/delivery/SimpleMailStorer.java | 93 +++++++++ .../mailets/delivery/ToRecipientFolder.java | 17 +- .../mailets/delivery/LocalDeliveryTest.java | 187 ------------------ .../mailets/delivery/MailboxAppenderTest.java | 176 +++++++++++++++++ .../mailets/delivery/SieveIntegrationTest.java | 9 +- .../delivery/SieveLocalDeliveryTest.java | 152 +++++++++++++++ .../delivery/SieveToRecipientFolderTest.java | 187 ++++++++++++++++++ .../mailets/delivery/SimpleMailStorerTest.java | 121 ++++++++++++ .../mailets/delivery/ToRecipientFolderTest.java | 189 ------------------- 16 files changed, 1109 insertions(+), 480 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/james-project/blob/989d60e6/server/mailet/mailets/pom.xml ---------------------------------------------------------------------- diff --git a/server/mailet/mailets/pom.xml b/server/mailet/mailets/pom.xml index 97f88fd..6b4394a 100644 --- a/server/mailet/mailets/pom.xml +++ b/server/mailet/mailets/pom.xml @@ -167,6 +167,28 @@ <type>test-jar</type> </dependency> <dependency> + <groupId>org.apache.james</groupId> + <artifactId>apache-james-mailbox-store</artifactId> + <scope>test</scope> + </dependency> + <dependency> + <groupId>org.apache.james</groupId> + <artifactId>apache-james-mailbox-store</artifactId> + <scope>test</scope> + <type>test-jar</type> + </dependency> + <dependency> + <groupId>org.apache.james</groupId> + <artifactId>apache-james-mailbox-memory</artifactId> + <scope>test</scope> + </dependency> + <dependency> + <groupId>org.apache.james</groupId> + <artifactId>apache-james-mailbox-memory</artifactId> + <scope>test</scope> + <type>test-jar</type> + </dependency> + <dependency> <groupId>org.assertj</groupId> <artifactId>assertj-core</artifactId> <version>${assertj-1.version}</version> http://git-wip-us.apache.org/repos/asf/james-project/blob/989d60e6/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/delivery/DeliveryUtils.java ---------------------------------------------------------------------- diff --git a/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/delivery/DeliveryUtils.java b/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/delivery/DeliveryUtils.java index 9c1abef..72fb609 100644 --- a/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/delivery/DeliveryUtils.java +++ b/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/delivery/DeliveryUtils.java @@ -17,12 +17,8 @@ * under the License. * ****************************************************************/ - package org.apache.james.transport.mailets.delivery; -import org.apache.commons.logging.Log; -import org.apache.james.user.api.UsersRepository; -import org.apache.james.user.api.UsersRepositoryException; import org.apache.mailet.MailAddress; public class DeliveryUtils { http://git-wip-us.apache.org/repos/asf/james-project/blob/989d60e6/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/delivery/LocalDelivery.java ---------------------------------------------------------------------- diff --git a/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/delivery/LocalDelivery.java b/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/delivery/LocalDelivery.java index 08fce5d..b90a8ed 100644 --- a/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/delivery/LocalDelivery.java +++ b/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/delivery/LocalDelivery.java @@ -26,9 +26,7 @@ import javax.mail.MessagingException; import org.apache.commons.logging.Log; import org.apache.james.domainlist.api.DomainList; import org.apache.james.mailbox.MailboxManager; -import org.apache.james.sieverepository.api.SieveRepository; import org.apache.james.transport.mailets.RecipientRewriteTable; -import org.apache.james.transport.mailets.ResourceLocatorImpl; import org.apache.james.transport.mailets.jsieve.CommonsLoggingAdapter; import org.apache.james.user.api.UsersRepository; import org.apache.mailet.Mail; @@ -48,12 +46,6 @@ public class LocalDelivery extends GenericMailet { private UsersRepository usersRepository; private MailboxManager mailboxManager; private DomainList domainList; - private SieveRepository sieveRepository; - - @Inject - public void setSieveRepository(SieveRepository sieveRepository) { - this.sieveRepository = sieveRepository; - } @Inject public void setRrt(org.apache.james.rrt.api.RecipientRewriteTable rrt) { @@ -99,14 +91,11 @@ public class LocalDelivery extends GenericMailet { .quiet(getInitParameter("quiet", false)) .verbose(getInitParameter("verbose", false)) .build(); - String folder = "INBOX"; mailDispatcher = MailDispatcher.builder() - .mailStorer(SieveMailStorer.builder() - .sievePoster(new SievePoster(mailboxManager, folder, usersRepository, getMailetContext())) + .mailStorer(SimpleMailStorer.builder() + .mailboxAppender(new MailboxAppender(mailboxManager, getMailetContext())) .usersRepository(usersRepository) - .resourceLocator(ResourceLocatorImpl.instanciate(usersRepository, sieveRepository)) - .mailetContext(getMailetContext()) - .folder(folder) + .folder("INBOX") .log(log) .build()) .consume(getInitParameter("consume", true)) http://git-wip-us.apache.org/repos/asf/james-project/blob/989d60e6/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/delivery/MailboxAppender.java ---------------------------------------------------------------------- diff --git a/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/delivery/MailboxAppender.java b/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/delivery/MailboxAppender.java new file mode 100644 index 0000000..ac5bdf1 --- /dev/null +++ b/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/delivery/MailboxAppender.java @@ -0,0 +1,113 @@ +/**************************************************************** + * 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.delivery; + +import java.util.Date; + +import javax.mail.Flags; +import javax.mail.MessagingException; +import javax.mail.internet.MimeMessage; + +import org.apache.james.core.MimeMessageInputStream; +import org.apache.james.mailbox.MailboxManager; +import org.apache.james.mailbox.MailboxSession; +import org.apache.james.mailbox.MessageManager; +import org.apache.james.mailbox.exception.BadCredentialsException; +import org.apache.james.mailbox.exception.MailboxException; +import org.apache.james.mailbox.model.MailboxPath; +import org.apache.james.transport.util.MailetContextLog; +import org.apache.mailet.MailetContext; + +import com.google.common.base.Strings; + +public class MailboxAppender { + private static final boolean IS_RECENT = true; + private static final Flags FLAGS = null; + + private final MailboxManager mailboxManager; + private final MailetContext mailetContext; + + public MailboxAppender(MailboxManager mailboxManager, MailetContext mailetContext) { + this.mailboxManager = mailboxManager; + this.mailetContext = mailetContext; + } + + public void append(MimeMessage mail, String user, String folder) throws MessagingException { + MailboxSession session = createMailboxSession(user); + append(mail, user, folder, session); + } + + public void appendAndUseSlashAsSeparator(MimeMessage mail, String user, String folder, String fallbackFolder) throws MessagingException { + MailboxSession session = createMailboxSession(user); + append(mail, user, useSlashAsSeparator(folder, session, fallbackFolder)); + } + + private String useSlashAsSeparator(String urlPath, MailboxSession session, String fallbackFolder) { + String destination = urlPath.replace('/', session.getPathDelimiter()); + if (Strings.isNullOrEmpty(destination)) { + destination = fallbackFolder; + } + if (destination.charAt(0) == session.getPathDelimiter()) { + destination = destination.substring(1); + } + return destination; + } + + private void append(MimeMessage mail, String user, String folder, MailboxSession session) throws MessagingException { + mailboxManager.startProcessingRequest(session); + try { + MailboxPath mailboxPath = new MailboxPath(session.getPersonalSpace(), user, folder); + appendMessageToMailbox(mail, session, mailboxPath); + } catch (MailboxException e) { + throw new MessagingException("Unable to access mailbox.", e); + } finally { + session.close(); + try { + mailboxManager.logout(session, true); + } catch (MailboxException e) { + throw new MessagingException("Can logout from mailbox", e); + } + mailboxManager.endProcessingRequest(session); + } + } + + private void appendMessageToMailbox(MimeMessage mail, MailboxSession session, MailboxPath path) throws MailboxException, MessagingException { + if (!mailboxManager.mailboxExists(path, session)) { + mailboxManager.createMailbox(path, session); + } + final MessageManager mailbox = mailboxManager.getMailbox(path, session); + if (mailbox == null) { + throw new MessagingException("Mailbox for user " + session.getUser().getUserName() + " was not found on this server."); + } + mailbox.appendMessage(new MimeMessageInputStream(mail), new Date(), session, IS_RECENT, FLAGS); + } + + public MailboxSession createMailboxSession(String user) throws MessagingException { + try { + return mailboxManager.createSystemSession(user, new MailetContextLog(mailetContext)); + } catch (BadCredentialsException e) { + throw new MessagingException("Unable to authenticate to mailbox", e); + } catch (MailboxException e) { + throw new MessagingException("Can not access mailbox", e); + } + } + + +} http://git-wip-us.apache.org/repos/asf/james-project/blob/989d60e6/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/delivery/SieveLocalDelivery.java ---------------------------------------------------------------------- diff --git a/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/delivery/SieveLocalDelivery.java b/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/delivery/SieveLocalDelivery.java new file mode 100644 index 0000000..eeba376 --- /dev/null +++ b/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/delivery/SieveLocalDelivery.java @@ -0,0 +1,118 @@ +/**************************************************************** + * 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.delivery; + +import javax.inject.Inject; +import javax.inject.Named; +import javax.mail.MessagingException; + +import org.apache.commons.logging.Log; +import org.apache.james.domainlist.api.DomainList; +import org.apache.james.mailbox.MailboxManager; +import org.apache.james.sieverepository.api.SieveRepository; +import org.apache.james.transport.mailets.RecipientRewriteTable; +import org.apache.james.transport.mailets.ResourceLocatorImpl; +import org.apache.james.transport.mailets.jsieve.CommonsLoggingAdapter; +import org.apache.james.user.api.UsersRepository; +import org.apache.mailet.Mail; +import org.apache.mailet.base.GenericMailet; + +/** + * Receives a Mail from the Queue and takes care of delivery of the + * message to local inboxes applying SIEVE rules. + * + * This mailet is a composition of RecipientRewriteTable, SieveMailet + * and MailboxManager configured to mimic the old "LocalDelivery" + * James 2.3 behavior. + */ +public class SieveLocalDelivery extends GenericMailet { + + private org.apache.james.rrt.api.RecipientRewriteTable rrt; + private UsersRepository usersRepository; + private MailboxManager mailboxManager; + private DomainList domainList; + private SieveRepository sieveRepository; + + @Inject + public void setSieveRepository(SieveRepository sieveRepository) { + this.sieveRepository = sieveRepository; + } + + @Inject + public void setRrt(org.apache.james.rrt.api.RecipientRewriteTable rrt) { + this.rrt = rrt; + } + + @Inject + public void setUsersRepository(UsersRepository usersRepository) { + this.usersRepository = usersRepository; + } + + @Inject + public void setMailboxManager(@Named("mailboxmanager") MailboxManager mailboxManager) { + this.mailboxManager = mailboxManager; + } + + @Inject + public void setDomainList(DomainList domainList) { + this.domainList = domainList; + } + + private MailDispatcher mailDispatcher; // Mailet that actually stores the message + private RecipientRewriteTable recipientRewriteTable; // Mailet that applies RecipientRewriteTable + + public void service(Mail mail) throws MessagingException { + recipientRewriteTable.service(mail); + if (!mail.getState().equals(Mail.GHOST)) { + mailDispatcher.dispatch(mail); + } + } + + public String getMailetInfo() { + return "Local Delivery Mailet"; + } + + public void init() throws MessagingException { + recipientRewriteTable = new RecipientRewriteTable(); + recipientRewriteTable.setDomainList(domainList); + recipientRewriteTable.setRecipientRewriteTable(rrt); + recipientRewriteTable.init(getMailetConfig()); + Log log = CommonsLoggingAdapter.builder() + .mailet(this) + .quiet(getInitParameter("quiet", false)) + .verbose(getInitParameter("verbose", false)) + .build(); + String folder = "INBOX"; + mailDispatcher = MailDispatcher.builder() + .mailStorer(SieveMailStorer.builder() + .sievePoster(new SievePoster(new MailboxAppender(mailboxManager, getMailetContext()), folder, usersRepository, getMailetContext())) + .usersRepository(usersRepository) + .resourceLocator(ResourceLocatorImpl.instanciate(usersRepository, sieveRepository)) + .mailetContext(getMailetContext()) + .folder(folder) + .log(log) + .build()) + .consume(getInitParameter("consume", true)) + .mailetContext(getMailetContext()) + .log(log) + .build(); + } + +} http://git-wip-us.apache.org/repos/asf/james-project/blob/989d60e6/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/delivery/SievePoster.java ---------------------------------------------------------------------- diff --git a/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/delivery/SievePoster.java b/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/delivery/SievePoster.java index c287689..ce6ba76 100644 --- a/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/delivery/SievePoster.java +++ b/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/delivery/SievePoster.java @@ -19,22 +19,13 @@ package org.apache.james.transport.mailets.delivery; -import java.util.Date; - -import javax.mail.Flags; import javax.mail.MessagingException; import javax.mail.internet.MimeMessage; -import org.apache.james.core.MimeMessageInputStream; -import org.apache.james.mailbox.MailboxManager; import org.apache.james.mailbox.MailboxSession; -import org.apache.james.mailbox.MessageManager; -import org.apache.james.mailbox.exception.BadCredentialsException; -import org.apache.james.mailbox.exception.MailboxException; import org.apache.james.mailbox.model.MailboxConstants; import org.apache.james.mailbox.model.MailboxPath; import org.apache.james.transport.mailets.jsieve.Poster; -import org.apache.james.transport.util.MailetContextLog; import org.apache.james.user.api.UsersRepository; import org.apache.james.user.api.UsersRepositoryException; import org.apache.mailet.MailetContext; @@ -43,16 +34,13 @@ import com.google.common.base.Strings; public class SievePoster implements Poster { - private static final boolean IS_RECENT = true; - private static final Flags FLAGS = null; - - private final MailboxManager mailboxManager; + private final MailboxAppender mailboxAppender; private final String folder; private final UsersRepository usersRepos; private final MailetContext mailetContext; - public SievePoster(MailboxManager mailboxManager, String folder, UsersRepository usersRepos, MailetContext mailetContext) { - this.mailboxManager = mailboxManager; + public SievePoster(MailboxAppender mailboxAppender, String folder, UsersRepository usersRepos, MailetContext mailetContext) { + this.mailboxAppender = mailboxAppender; this.folder = folder; this.usersRepos = usersRepos; this.mailetContext = mailetContext; @@ -86,8 +74,7 @@ public class SievePoster implements Poster { String user = parseUser(url, startOfUser, endOfUser, host); String urlPath = parseUrlPath(url, endOfHost); - MailboxSession session = createMailboxSession(user); - appendMessageToMailboxWithSession(mail, user, session, parseDestinationMailboxPath(user, urlPath, session)); + mailboxAppender.appendAndUseSlashAsSeparator(mail, user, urlPath, folder); } } @@ -116,56 +103,4 @@ public class SievePoster implements Poster { throw new MessagingException("Unable to accessUsersRepository", e); } } - - private void appendMessageToMailboxWithSession(MimeMessage mail, String user, MailboxSession session, MailboxPath path) throws MessagingException { - mailboxManager.startProcessingRequest(session); - try { - appendMessageToMailbox(mail, user, session, path); - } catch (MailboxException e) { - throw new MessagingException("Unable to access mailbox.", e); - } finally { - session.close(); - try { - mailboxManager.logout(session, true); - } catch (MailboxException e) { - throw new MessagingException("Can logout from mailbox", e); - } - mailboxManager.endProcessingRequest(session); - } - } - - private void appendMessageToMailbox(MimeMessage mail, String user, MailboxSession session, MailboxPath path) throws MailboxException, MessagingException { - if (this.folder.equalsIgnoreCase(path.getName()) && !(mailboxManager.mailboxExists(path, session))) { - mailboxManager.createMailbox(path, session); - } - final MessageManager mailbox = mailboxManager.getMailbox(path, session); - if (mailbox == null) { - throw new MessagingException("Mailbox for user " + user + " was not found on this server."); - } - mailbox.appendMessage(new MimeMessageInputStream(mail), new Date(), session, IS_RECENT, FLAGS); - } - - private MailboxPath parseDestinationMailboxPath(String user, String urlPath, MailboxSession session) { - // This allows Sieve scripts to use a standard delimiter - // regardless of mailbox implementation - String destination = urlPath.replace('/', session.getPathDelimiter()); - if (Strings.isNullOrEmpty(destination)) { - destination = this.folder; - } - if (destination.charAt(0) == session.getPathDelimiter()) { - destination = destination.substring(1); - } - // Use the MailboxSession to construct the MailboxPath - See JAMES-1326 - return new MailboxPath(MailboxConstants.USER_NAMESPACE, user, destination); - } - - private MailboxSession createMailboxSession(String user) throws MessagingException { - try { - return mailboxManager.createSystemSession(user, new MailetContextLog(mailetContext)); - } catch (BadCredentialsException e) { - throw new MessagingException("Unable to authenticate to mailbox", e); - } catch (MailboxException e) { - throw new MessagingException("Can not access mailbox", e); - } - } } http://git-wip-us.apache.org/repos/asf/james-project/blob/989d60e6/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/delivery/SieveToRecipientFolder.java ---------------------------------------------------------------------- diff --git a/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/delivery/SieveToRecipientFolder.java b/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/delivery/SieveToRecipientFolder.java new file mode 100644 index 0000000..634f653 --- /dev/null +++ b/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/delivery/SieveToRecipientFolder.java @@ -0,0 +1,111 @@ +/**************************************************************** + * 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.delivery; + +import javax.inject.Inject; +import javax.inject.Named; +import javax.mail.MessagingException; + +import org.apache.commons.logging.Log; +import org.apache.james.mailbox.MailboxManager; +import org.apache.james.sieverepository.api.SieveRepository; +import org.apache.james.transport.mailets.ResourceLocatorImpl; +import org.apache.james.transport.mailets.jsieve.CommonsLoggingAdapter; +import org.apache.james.user.api.UsersRepository; +import org.apache.mailet.Mail; +import org.apache.mailet.base.GenericMailet; + +/** + * Receives a Mail from the Queue and takes care to deliver the message + * to a defined folder of the recipient(s) applying SIEVE rules. + * + * You have to define the folder name of the recipient(s). + * The flag 'consume' will tell is the mail will be further + * processed by the upcoming processor mailets, or not. + * + * <pre> + * <mailet match="RecipientIsLocal" class="ToRecipientFolder"> + * <folder> <i>Junk</i> </folder> + * <consume> <i>false</i> </consume> + * </mailet> + * </pre> + * + */ +public class SieveToRecipientFolder extends GenericMailet { + + public static final String FOLDER_PARAMETER = "folder"; + public static final String CONSUME_PARAMETER = "consume"; + + private MailboxManager mailboxManager; + private SieveRepository sieveRepository; + private UsersRepository usersRepository; + + @Inject + public void setMailboxManager(@Named("mailboxmanager")MailboxManager mailboxManager) { + this.mailboxManager = mailboxManager; + } + + @Inject + public void setSieveRepository(SieveRepository sieveRepository) { + this.sieveRepository = sieveRepository; + } + + @Inject + public void setUsersRepository(UsersRepository usersRepository) { + this.usersRepository = usersRepository; + } + + private MailDispatcher mailDispatcher; + + @Override + public void service(Mail mail) throws MessagingException { + if (!mail.getState().equals(Mail.GHOST)) { + mailDispatcher.dispatch(mail); + } + } + + @Override + public void init() throws MessagingException { + Log log = CommonsLoggingAdapter.builder() + .mailet(this) + .quiet(getInitParameter("quiet", true)) + .verbose(getInitParameter("verbose", false)) + .build(); + String folder = getInitParameter(FOLDER_PARAMETER, "INBOX"); + mailDispatcher = MailDispatcher.builder() + .mailStorer(SieveMailStorer.builder() + .sievePoster(new SievePoster(new MailboxAppender(mailboxManager, getMailetContext()), folder, usersRepository, getMailetContext())) + .usersRepository(usersRepository) + .resourceLocator(ResourceLocatorImpl.instanciate(usersRepository, sieveRepository)) + .mailetContext(getMailetContext()) + .folder(folder) + .log(log) + .build()) + .consume(getInitParameter(CONSUME_PARAMETER, false)) + .mailetContext(getMailetContext()) + .log(log) + .build(); + } + + @Override + public String getMailetInfo() { + return SieveToRecipientFolder.class.getName() + " Mailet"; + } + +} http://git-wip-us.apache.org/repos/asf/james-project/blob/989d60e6/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/delivery/SimpleMailStorer.java ---------------------------------------------------------------------- diff --git a/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/delivery/SimpleMailStorer.java b/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/delivery/SimpleMailStorer.java new file mode 100644 index 0000000..31f3251 --- /dev/null +++ b/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/delivery/SimpleMailStorer.java @@ -0,0 +1,93 @@ +/**************************************************************** + * 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.delivery; + +import javax.mail.MessagingException; + +import org.apache.commons.logging.Log; +import org.apache.james.user.api.UsersRepository; +import org.apache.mailet.Mail; +import org.apache.mailet.MailAddress; + +import com.google.common.base.Preconditions; + +public class SimpleMailStorer implements MailStorer { + + public static Builder builder() { + return new Builder(); + } + + public static class Builder { + private UsersRepository usersRepos; + private MailboxAppender mailboxAppender; + private String folder; + private Log log; + + public Builder folder(String folder) { + this.folder = folder; + return this; + } + + public Builder usersRepository(UsersRepository usersRepository) { + this.usersRepos = usersRepository; + return this; + } + + public Builder mailboxAppender(MailboxAppender mailboxAppender) { + this.mailboxAppender = mailboxAppender; + return this; + } + + public Builder log(Log log) { + this.log = log; + return this; + } + + public SimpleMailStorer build() throws MessagingException { + Preconditions.checkNotNull(usersRepos); + Preconditions.checkNotNull(folder); + Preconditions.checkNotNull(log); + Preconditions.checkNotNull(mailboxAppender); + return new SimpleMailStorer(mailboxAppender, usersRepos, log, folder); + } + } + + private final MailboxAppender mailboxAppender; + private final UsersRepository usersRepository; + private final Log log; + private final String folder; + + private SimpleMailStorer(MailboxAppender mailboxAppender, UsersRepository usersRepository, Log log, String folder) { + this.mailboxAppender = mailboxAppender; + this.usersRepository = usersRepository; + this.log = log; + this.folder = folder; + } + + @Override + public void storeMail(MailAddress sender, MailAddress recipient, Mail mail) throws MessagingException { + String username = DeliveryUtils.getUsername(recipient, usersRepository, log); + + mailboxAppender.append(mail.getMessage(), username, folder); + + log.info("Local delivered mail " + mail.getName() + " sucessfully from " + DeliveryUtils.prettyPrint(sender) + + " to " + DeliveryUtils.prettyPrint(recipient) + " in folder " + this.folder); + } +} http://git-wip-us.apache.org/repos/asf/james-project/blob/989d60e6/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/delivery/ToRecipientFolder.java ---------------------------------------------------------------------- diff --git a/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/delivery/ToRecipientFolder.java b/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/delivery/ToRecipientFolder.java index 9e8ba2d..1167c28 100644 --- a/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/delivery/ToRecipientFolder.java +++ b/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/delivery/ToRecipientFolder.java @@ -24,8 +24,6 @@ import javax.mail.MessagingException; import org.apache.commons.logging.Log; import org.apache.james.mailbox.MailboxManager; -import org.apache.james.sieverepository.api.SieveRepository; -import org.apache.james.transport.mailets.ResourceLocatorImpl; import org.apache.james.transport.mailets.jsieve.CommonsLoggingAdapter; import org.apache.james.user.api.UsersRepository; import org.apache.mailet.Mail; @@ -53,7 +51,6 @@ public class ToRecipientFolder extends GenericMailet { public static final String CONSUME_PARAMETER = "consume"; private MailboxManager mailboxManager; - private SieveRepository sieveRepository; private UsersRepository usersRepository; @Inject @@ -62,11 +59,6 @@ public class ToRecipientFolder extends GenericMailet { } @Inject - public void setSieveRepository(SieveRepository sieveRepository) { - this.sieveRepository = sieveRepository; - } - - @Inject public void setUsersRepository(UsersRepository usersRepository) { this.usersRepository = usersRepository; } @@ -87,14 +79,11 @@ public class ToRecipientFolder extends GenericMailet { .quiet(getInitParameter("quiet", true)) .verbose(getInitParameter("verbose", false)) .build(); - String folder = getInitParameter(FOLDER_PARAMETER, "INBOX"); mailDispatcher = MailDispatcher.builder() - .mailStorer(SieveMailStorer.builder() - .sievePoster(new SievePoster(mailboxManager, folder, usersRepository, getMailetContext())) + .mailStorer(SimpleMailStorer.builder() + .mailboxAppender(new MailboxAppender(mailboxManager, getMailetContext())) .usersRepository(usersRepository) - .resourceLocator(ResourceLocatorImpl.instanciate(usersRepository, sieveRepository)) - .mailetContext(getMailetContext()) - .folder(folder) + .folder(getInitParameter(FOLDER_PARAMETER, "INBOX")) .log(log) .build()) .consume(getInitParameter(CONSUME_PARAMETER, false)) http://git-wip-us.apache.org/repos/asf/james-project/blob/989d60e6/server/mailet/mailets/src/test/java/org/apache/james/transport/mailets/delivery/LocalDeliveryTest.java ---------------------------------------------------------------------- diff --git a/server/mailet/mailets/src/test/java/org/apache/james/transport/mailets/delivery/LocalDeliveryTest.java b/server/mailet/mailets/src/test/java/org/apache/james/transport/mailets/delivery/LocalDeliveryTest.java deleted file mode 100644 index 9a188ff..0000000 --- a/server/mailet/mailets/src/test/java/org/apache/james/transport/mailets/delivery/LocalDeliveryTest.java +++ /dev/null @@ -1,187 +0,0 @@ -/**************************************************************** - * 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.delivery; - -import static org.mockito.Matchers.any; -import static org.mockito.Matchers.eq; -import static org.mockito.Mockito.mock; -import static org.mockito.Mockito.verify; -import static org.mockito.Mockito.when; - -import java.io.IOException; -import java.io.InputStream; -import java.util.Date; -import java.util.Properties; - -import javax.activation.DataHandler; -import javax.mail.Flags; -import javax.mail.MessagingException; -import javax.mail.Session; -import javax.mail.internet.InternetAddress; -import javax.mail.internet.MimeBodyPart; -import javax.mail.internet.MimeMessage; -import javax.mail.internet.MimeMultipart; -import javax.mail.util.ByteArrayDataSource; - -import org.apache.james.domainlist.api.DomainList; -import org.apache.james.mailbox.MailboxManager; -import org.apache.james.mailbox.MailboxSession; -import org.apache.james.mailbox.MessageManager; -import org.apache.james.mailbox.model.MailboxPath; -import org.apache.james.rrt.api.RecipientRewriteTable; -import org.apache.james.sieverepository.api.SieveRepository; -import org.apache.james.sieverepository.api.exception.ScriptNotFoundException; -import org.apache.james.user.api.UsersRepository; -import org.apache.mailet.Mail; -import org.apache.mailet.MailAddress; -import org.apache.mailet.base.test.FakeMail; -import org.apache.mailet.base.test.FakeMailetConfig; -import org.junit.Before; -import org.junit.Test; -import org.mockito.invocation.InvocationOnMock; -import org.mockito.stubbing.Answer; -import org.slf4j.Logger; - -public class LocalDeliveryTest { - - private UsersRepository usersRepository; - private RecipientRewriteTable recipientRewriteTable; - private MailboxManager mailboxManager; - private DomainList domainList; - private SieveRepository sieveRepository; - private LocalDelivery localDelivery; - - @Before - public void setUp() throws Exception { - sieveRepository = mock(SieveRepository.class); - usersRepository = mock(UsersRepository.class); - recipientRewriteTable = mock(RecipientRewriteTable.class); - mailboxManager = mock(MailboxManager.class); - domainList = mock(DomainList.class); - - localDelivery = new LocalDelivery(); - localDelivery.setDomainList(domainList); - localDelivery.setMailboxManager(mailboxManager); - localDelivery.setRrt(recipientRewriteTable); - localDelivery.setUsersRepository(usersRepository); - localDelivery.setSieveRepository(sieveRepository); - } - - @Test - public void mailShouldBeWellDeliveredByDefaultToUserWhenvirtualHostingIsTurnedOn() throws Exception { - when(usersRepository.supportVirtualHosting()).thenAnswer(new Answer<Boolean>() { - public Boolean answer(InvocationOnMock invocationOnMock) throws Throwable { - return true; - } - }); - when(sieveRepository.getActive("[email protected]")).thenThrow(new ScriptNotFoundException()); - MailboxPath inbox = new MailboxPath("#private", "[email protected]", "INBOX"); - final MessageManager messageManager = mock(MessageManager.class); - when(mailboxManager.getMailbox(eq(inbox), any(MailboxSession.class))).thenAnswer(new Answer<MessageManager>() { - public MessageManager answer(InvocationOnMock invocationOnMock) throws Throwable { - return messageManager; - } - }); - final MailboxSession session = mock(MailboxSession.class); - when(session.getPathDelimiter()).thenAnswer(new Answer<Character>() { - @Override - public Character answer(InvocationOnMock invocationOnMock) throws Throwable { - return '.'; - } - }); - when(mailboxManager.createSystemSession(any(String.class), any(Logger.class))).thenAnswer(new Answer<MailboxSession>() { - @Override - public MailboxSession answer(InvocationOnMock invocationOnMock) throws Throwable { - return session; - } - }); - - Mail mail = createMail(); - - localDelivery.init(new FakeMailetConfig()); - localDelivery.service(mail); - - verify(messageManager).appendMessage(any(InputStream.class), any(Date.class), any(MailboxSession.class), eq(true), any(Flags.class)); - } - - @Test - public void mailShouldBeWellDeliveredByDefaultToUserWhenvirtualHostingIsTurnedOff() throws Exception { - when(usersRepository.supportVirtualHosting()).thenAnswer(new Answer<Boolean>() { - public Boolean answer(InvocationOnMock invocationOnMock) throws Throwable { - return false; - } - }); - when(sieveRepository.getActive("receiver")).thenThrow(new ScriptNotFoundException()); - MailboxPath inbox = new MailboxPath("#private", "receiver", "INBOX"); - final MessageManager messageManager = mock(MessageManager.class); - when(mailboxManager.getMailbox(eq(inbox), any(MailboxSession.class))).thenAnswer(new Answer<MessageManager>() { - public MessageManager answer(InvocationOnMock invocationOnMock) throws Throwable { - return messageManager; - } - }); - final MailboxSession session = mock(MailboxSession.class); - when(session.getPathDelimiter()).thenAnswer(new Answer<Character>() { - @Override - public Character answer(InvocationOnMock invocationOnMock) throws Throwable { - return '.'; - } - }); - when(mailboxManager.createSystemSession(any(String.class), any(Logger.class))).thenAnswer(new Answer<MailboxSession>() { - @Override - public MailboxSession answer(InvocationOnMock invocationOnMock) throws Throwable { - return session; - } - }); - - Mail mail = createMail(); - - localDelivery.init(new FakeMailetConfig()); - localDelivery.service(mail); - - verify(messageManager).appendMessage(any(InputStream.class), any(Date.class), any(MailboxSession.class), eq(true), any(Flags.class)); - } - - private Mail createMail() throws MessagingException, IOException { - MimeMessage message = new MimeMessage(Session.getDefaultInstance(new Properties())); - message.setSubject("Subject"); - message.setSender(new InternetAddress("[email protected]")); - message.setRecipient(MimeMessage.RecipientType.TO, new InternetAddress("[email protected]")); - MimeMultipart multipart = new MimeMultipart(); - MimeBodyPart scriptPart = new MimeBodyPart(); - scriptPart.setDataHandler( - new DataHandler( - new ByteArrayDataSource( - "toto", - "application/sieve; charset=UTF-8") - )); - scriptPart.setDisposition(MimeBodyPart.ATTACHMENT); - scriptPart.setHeader("Content-Type", "application/sieve; charset=UTF-8"); - scriptPart.setFileName("file.txt"); - multipart.addBodyPart(scriptPart); - message.setContent(multipart); - message.saveChanges(); - return FakeMail.builder() - .mimeMessage(message) - .state(Mail.DEFAULT) - .recipient(new MailAddress("[email protected]")) - .build(); - } - -} \ No newline at end of file http://git-wip-us.apache.org/repos/asf/james-project/blob/989d60e6/server/mailet/mailets/src/test/java/org/apache/james/transport/mailets/delivery/MailboxAppenderTest.java ---------------------------------------------------------------------- diff --git a/server/mailet/mailets/src/test/java/org/apache/james/transport/mailets/delivery/MailboxAppenderTest.java b/server/mailet/mailets/src/test/java/org/apache/james/transport/mailets/delivery/MailboxAppenderTest.java new file mode 100644 index 0000000..2a76fec --- /dev/null +++ b/server/mailet/mailets/src/test/java/org/apache/james/transport/mailets/delivery/MailboxAppenderTest.java @@ -0,0 +1,176 @@ +/**************************************************************** + * 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.delivery; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.mockito.Mockito.mock; + + +import java.util.Properties; + +import javax.activation.DataHandler; +import javax.mail.Multipart; +import javax.mail.Session; +import javax.mail.internet.MimeBodyPart; +import javax.mail.internet.MimeMessage; +import javax.mail.internet.MimeMultipart; +import javax.mail.util.ByteArrayDataSource; + +import org.apache.james.mailbox.MailboxManager; +import org.apache.james.mailbox.MailboxSession; +import org.apache.james.mailbox.exception.MailboxNotFoundException; +import org.apache.james.mailbox.inmemory.manager.InMemoryIntegrationResources; +import org.apache.james.mailbox.manager.ManagerTestResources; +import org.apache.james.mailbox.model.FetchGroupImpl; +import org.apache.james.mailbox.model.MailboxPath; +import org.apache.james.mailbox.model.MessageRange; +import org.apache.james.mailbox.model.MessageResult; +import org.apache.james.mailbox.model.MessageResultIterator; +import org.apache.mailet.MailetContext; +import org.junit.After; +import org.junit.Before; +import org.junit.Rule; +import org.junit.Test; +import org.junit.rules.ExpectedException; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class MailboxAppenderTest { + private static final Logger LOGGER = LoggerFactory.getLogger(MailboxAppenderTest.class); + + public static final String USER = "user"; + public static final String FOLDER = "folder"; + public static final String FALLBACK_FOLDER = "fallback_folder"; + public static final String EMPTY_FOLDER = ""; + + @Rule public ExpectedException expectedException = ExpectedException.none(); + + private MailboxAppender testee; + private MailboxManager mailboxManager; + private MimeMessage mimeMessage; + private InMemoryIntegrationResources integrationResources; + private MailboxSession session; + + @Before + public void setUp() throws Exception { + mimeMessage = new MimeMessage(Session.getDefaultInstance(new Properties())); + Multipart multipart = new MimeMultipart(); + MimeBodyPart bodyPart = new MimeBodyPart(); + bodyPart.setDataHandler( + new DataHandler( + new ByteArrayDataSource( + "toto", + "text/plain; charset=UTF-8") + )); + multipart.addBodyPart(bodyPart); + mimeMessage.setContent(multipart); + mimeMessage.saveChanges(); + + integrationResources = new InMemoryIntegrationResources(); + integrationResources.init(); + mailboxManager = new ManagerTestResources(integrationResources).getMailboxManager(); + MailetContext mailetContext = mock(MailetContext.class); + testee = new MailboxAppender(mailboxManager, mailetContext); + + session = mailboxManager.createSystemSession("TEST", LOGGER); + } + + @After + public void cleanUp() throws Exception { + integrationResources.clean(); + } + + @Test + public void appendShouldAddMessageToDesiredMailbox() throws Exception { + testee.append(mimeMessage, USER, FOLDER); + + MessageResultIterator messages = mailboxManager.getMailbox(new MailboxPath("#private", USER, FOLDER), session) + .getMessages(MessageRange.all(), new FetchGroupImpl(MessageResult.FetchGroup.FULL_CONTENT), session); + + assertThat(messages).hasSize(1); + } + + @Test + public void appendAndUseSlashAsSeparatorShouldAddMessageToDesiredMailbox() throws Exception { + testee.appendAndUseSlashAsSeparator(mimeMessage, USER, FOLDER, FALLBACK_FOLDER); + + MessageResultIterator messages = mailboxManager.getMailbox(new MailboxPath("#private", USER, FOLDER), session) + .getMessages(MessageRange.all(), new FetchGroupImpl(MessageResult.FetchGroup.FULL_CONTENT), session); + + assertThat(messages).hasSize(1); + } + + + @Test + public void appendShouldAddMessageToDesiredMailboxWhenMailboxExists() throws Exception { + MailboxPath mailboxPath = new MailboxPath("#private", USER, FOLDER); + mailboxManager.createMailbox(mailboxPath, session); + + testee.append(mimeMessage, USER, FOLDER); + + MessageResultIterator messages = mailboxManager.getMailbox(mailboxPath, session) + .getMessages(MessageRange.all(), new FetchGroupImpl(MessageResult.FetchGroup.FULL_CONTENT), session); + + assertThat(messages).hasSize(1); + } + + @Test + public void appendAndUseSlashAsSeparatorShouldAddMessageToDesiredMailboxWhenMailboxExists() throws Exception { + MailboxPath mailboxPath = new MailboxPath("#private", USER, FOLDER); + mailboxManager.createMailbox(mailboxPath, session); + + testee.appendAndUseSlashAsSeparator(mimeMessage, USER, FOLDER, FALLBACK_FOLDER); + + MessageResultIterator messages = mailboxManager.getMailbox(mailboxPath, session) + .getMessages(MessageRange.all(), new FetchGroupImpl(MessageResult.FetchGroup.FULL_CONTENT), session); + + assertThat(messages).hasSize(1); + } + + @Test + public void appendAndUseSlashAsSeparatorShouldNotAppendToEmptyFolder() throws Exception { + testee.appendAndUseSlashAsSeparator(mimeMessage, USER, EMPTY_FOLDER, FALLBACK_FOLDER); + + expectedException.expect(MailboxNotFoundException.class); + + mailboxManager.getMailbox(new MailboxPath("#private", USER, EMPTY_FOLDER), session); + } + + + @Test + public void appendAndUseSlashAsSeparatorShouldAppendToFallback() throws Exception { + testee.appendAndUseSlashAsSeparator(mimeMessage, USER, EMPTY_FOLDER, FALLBACK_FOLDER); + + MessageResultIterator messages = mailboxManager.getMailbox(new MailboxPath("#private", USER, FALLBACK_FOLDER), session) + .getMessages(MessageRange.all(), new FetchGroupImpl(MessageResult.FetchGroup.FULL_CONTENT), session); + + assertThat(messages).hasSize(1); + } + + @Test + public void appendAndUseSlashAsSeparatorShouldRemovePathSeparatorAsFirstChar() throws Exception { + testee.appendAndUseSlashAsSeparator(mimeMessage, USER, "." + FOLDER, FALLBACK_FOLDER); + + MessageResultIterator messages = mailboxManager.getMailbox(new MailboxPath("#private", USER, FOLDER), session) + .getMessages(MessageRange.all(), new FetchGroupImpl(MessageResult.FetchGroup.FULL_CONTENT), session); + + assertThat(messages).hasSize(1); + } +} http://git-wip-us.apache.org/repos/asf/james-project/blob/989d60e6/server/mailet/mailets/src/test/java/org/apache/james/transport/mailets/delivery/SieveIntegrationTest.java ---------------------------------------------------------------------- diff --git a/server/mailet/mailets/src/test/java/org/apache/james/transport/mailets/delivery/SieveIntegrationTest.java b/server/mailet/mailets/src/test/java/org/apache/james/transport/mailets/delivery/SieveIntegrationTest.java index d7470a1..4158231 100644 --- a/server/mailet/mailets/src/test/java/org/apache/james/transport/mailets/delivery/SieveIntegrationTest.java +++ b/server/mailet/mailets/src/test/java/org/apache/james/transport/mailets/delivery/SieveIntegrationTest.java @@ -107,7 +107,7 @@ public class SieveIntegrationTest { .resourceLocator(resourceLocator) .usersRepository(usersRepository) .folder("INBOX") - .sievePoster(new SievePoster(mailboxManager, "INBOX", usersRepository, fakeMailContext)) + .sievePoster(new SievePoster(new MailboxAppender(mailboxManager, fakeMailContext), "INBOX", usersRepository, fakeMailContext)) .log(mock(Log.class)) .mailetContext(fakeMailContext) .build(); @@ -943,12 +943,15 @@ public class SieveIntegrationTest { ClassLoader.getSystemResourceAsStream(script))); } - private MessageManager prepareMessageManagerOn(MailboxPath inbox) throws MailboxException { + private MessageManager prepareMessageManagerOn(MailboxPath mailboxPath) throws MailboxException { final MessageManager messageManager = mock(MessageManager.class); - when(mailboxManager.getMailbox(eq(inbox), any(MailboxSession.class))).thenReturn(messageManager); + when(mailboxManager.getMailbox(eq(mailboxPath), any(MailboxSession.class))).thenReturn(messageManager); final MailboxSession session = mock(MailboxSession.class); when(session.getPathDelimiter()).thenReturn('.'); when(mailboxManager.createSystemSession(any(String.class), any(Logger.class))).thenReturn(session); + MailboxSession.User user = mock(MailboxSession.User.class); + when(session.getUser()).thenReturn(user); + when(user.getUserName()).thenReturn(mailboxPath.getUser()); return messageManager; } http://git-wip-us.apache.org/repos/asf/james-project/blob/989d60e6/server/mailet/mailets/src/test/java/org/apache/james/transport/mailets/delivery/SieveLocalDeliveryTest.java ---------------------------------------------------------------------- diff --git a/server/mailet/mailets/src/test/java/org/apache/james/transport/mailets/delivery/SieveLocalDeliveryTest.java b/server/mailet/mailets/src/test/java/org/apache/james/transport/mailets/delivery/SieveLocalDeliveryTest.java new file mode 100644 index 0000000..6cb9781 --- /dev/null +++ b/server/mailet/mailets/src/test/java/org/apache/james/transport/mailets/delivery/SieveLocalDeliveryTest.java @@ -0,0 +1,152 @@ +/**************************************************************** + * 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.delivery; + +import static org.mockito.Matchers.any; +import static org.mockito.Matchers.eq; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; + +import java.io.IOException; +import java.io.InputStream; +import java.util.Date; +import java.util.Properties; + +import javax.activation.DataHandler; +import javax.mail.Flags; +import javax.mail.MessagingException; +import javax.mail.Session; +import javax.mail.internet.InternetAddress; +import javax.mail.internet.MimeBodyPart; +import javax.mail.internet.MimeMessage; +import javax.mail.internet.MimeMultipart; +import javax.mail.util.ByteArrayDataSource; + +import org.apache.james.domainlist.api.DomainList; +import org.apache.james.mailbox.MailboxManager; +import org.apache.james.mailbox.MailboxSession; +import org.apache.james.mailbox.MessageManager; +import org.apache.james.mailbox.model.MailboxPath; +import org.apache.james.rrt.api.RecipientRewriteTable; +import org.apache.james.sieverepository.api.SieveRepository; +import org.apache.james.sieverepository.api.exception.ScriptNotFoundException; +import org.apache.james.user.api.UsersRepository; +import org.apache.mailet.Mail; +import org.apache.mailet.MailAddress; +import org.apache.mailet.base.test.FakeMail; +import org.apache.mailet.base.test.FakeMailetConfig; +import org.junit.Before; +import org.junit.Test; +import org.slf4j.Logger; + +public class SieveLocalDeliveryTest { + + private UsersRepository usersRepository; + private MailboxManager mailboxManager; + private SieveRepository sieveRepository; + private SieveLocalDelivery sieveLocalDelivery; + private MailboxSession.User user; + + @Before + public void setUp() throws Exception { + sieveRepository = mock(SieveRepository.class); + usersRepository = mock(UsersRepository.class); + mailboxManager = mock(MailboxManager.class); + RecipientRewriteTable recipientRewriteTable = mock(RecipientRewriteTable.class); + DomainList domainList = mock(DomainList.class); + user = mock(MailboxSession.User.class); + MailboxSession session = mock(MailboxSession.class); + + sieveLocalDelivery = new SieveLocalDelivery(); + sieveLocalDelivery.setDomainList(domainList); + sieveLocalDelivery.setMailboxManager(mailboxManager); + sieveLocalDelivery.setRrt(recipientRewriteTable); + sieveLocalDelivery.setUsersRepository(usersRepository); + sieveLocalDelivery.setSieveRepository(sieveRepository); + + when(session.getPathDelimiter()).thenReturn('.'); + when(mailboxManager.createSystemSession(any(String.class), any(Logger.class))).thenReturn(session); + when(session.getUser()).thenReturn(user); + } + + @Test + public void mailShouldBeWellDeliveredByDefaultToUserWhenVirtualHostingIsTurnedOn() throws Exception { + when(usersRepository.supportVirtualHosting()).thenReturn(true); + String username = "[email protected]"; + when(sieveRepository.getActive(username)).thenThrow(new ScriptNotFoundException()); + MailboxPath inbox = new MailboxPath("#private", username, "INBOX"); + MessageManager messageManager = mock(MessageManager.class); + when(mailboxManager.getMailbox(eq(inbox), any(MailboxSession.class))).thenReturn(messageManager); + when(user.getUserName()).thenReturn(username); + + Mail mail = createMail(); + + sieveLocalDelivery.init(new FakeMailetConfig()); + sieveLocalDelivery.service(mail); + + verify(messageManager).appendMessage(any(InputStream.class), any(Date.class), any(MailboxSession.class), eq(true), any(Flags.class)); + } + + @Test + public void mailShouldBeWellDeliveredByDefaultToUserWhenVirtualHostingIsTurnedOff() throws Exception { + when(usersRepository.supportVirtualHosting()).thenReturn(false); + String username = "receiver"; + when(sieveRepository.getActive(username)).thenThrow(new ScriptNotFoundException()); + MailboxPath inbox = new MailboxPath("#private", username, "INBOX"); + final MessageManager messageManager = mock(MessageManager.class); + when(mailboxManager.getMailbox(eq(inbox), any(MailboxSession.class))).thenReturn(messageManager); + when(user.getUserName()).thenReturn(username); + + Mail mail = createMail(); + + sieveLocalDelivery.init(new FakeMailetConfig()); + sieveLocalDelivery.service(mail); + + verify(messageManager).appendMessage(any(InputStream.class), any(Date.class), any(MailboxSession.class), eq(true), any(Flags.class)); + } + + private Mail createMail() throws MessagingException, IOException { + MimeMessage message = new MimeMessage(Session.getDefaultInstance(new Properties())); + message.setSubject("Subject"); + message.setSender(new InternetAddress("[email protected]")); + message.setRecipient(MimeMessage.RecipientType.TO, new InternetAddress("[email protected]")); + MimeMultipart multipart = new MimeMultipart(); + MimeBodyPart scriptPart = new MimeBodyPart(); + scriptPart.setDataHandler( + new DataHandler( + new ByteArrayDataSource( + "toto", + "application/sieve; charset=UTF-8") + )); + scriptPart.setDisposition(MimeBodyPart.ATTACHMENT); + scriptPart.setHeader("Content-Type", "application/sieve; charset=UTF-8"); + scriptPart.setFileName("file.txt"); + multipart.addBodyPart(scriptPart); + message.setContent(multipart); + message.saveChanges(); + return FakeMail.builder() + .mimeMessage(message) + .state(Mail.DEFAULT) + .recipient(new MailAddress("[email protected]")) + .build(); + } + +} \ No newline at end of file http://git-wip-us.apache.org/repos/asf/james-project/blob/989d60e6/server/mailet/mailets/src/test/java/org/apache/james/transport/mailets/delivery/SieveToRecipientFolderTest.java ---------------------------------------------------------------------- diff --git a/server/mailet/mailets/src/test/java/org/apache/james/transport/mailets/delivery/SieveToRecipientFolderTest.java b/server/mailet/mailets/src/test/java/org/apache/james/transport/mailets/delivery/SieveToRecipientFolderTest.java new file mode 100644 index 0000000..5de9ab0 --- /dev/null +++ b/server/mailet/mailets/src/test/java/org/apache/james/transport/mailets/delivery/SieveToRecipientFolderTest.java @@ -0,0 +1,187 @@ +/**************************************************************** + * 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.delivery; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.mockito.Matchers.any; +import static org.mockito.Matchers.eq; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; + +import java.io.IOException; +import java.io.InputStream; +import java.util.Date; +import java.util.Properties; + +import javax.activation.DataHandler; +import javax.mail.Flags; +import javax.mail.MessagingException; +import javax.mail.Session; +import javax.mail.internet.InternetAddress; +import javax.mail.internet.MimeBodyPart; +import javax.mail.internet.MimeMessage; +import javax.mail.internet.MimeMultipart; +import javax.mail.util.ByteArrayDataSource; + +import org.apache.james.mailbox.MailboxManager; +import org.apache.james.mailbox.MailboxSession; +import org.apache.james.mailbox.MessageManager; +import org.apache.james.mailbox.model.MailboxPath; +import org.apache.james.sieverepository.api.SieveRepository; +import org.apache.james.user.api.UsersRepository; +import org.apache.mailet.Mail; +import org.apache.mailet.MailAddress; +import org.apache.mailet.base.test.FakeMail; +import org.apache.mailet.base.test.FakeMailContext; +import org.apache.mailet.base.test.FakeMailetConfig; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; +import org.slf4j.Logger; + +public class SieveToRecipientFolderTest { + + public static final String USER_LOCAL_PART = "receiver"; + public static final String USER = USER_LOCAL_PART + "@domain.com"; + public static final MailboxPath INBOX = new MailboxPath("#private", USER, "INBOX"); + public static final MailboxPath JUNK = new MailboxPath("#private", USER_LOCAL_PART, "Junk"); + public static final MailboxPath JUNK_VIRTUAL_HOSTING = new MailboxPath("#private", USER, "Junk"); + private UsersRepository usersRepository; + private MailboxManager mailboxManager; + private SieveToRecipientFolder recipientFolder; + private FakeMailetConfig mailetConfig; + private MailboxSession.User user; + private MessageManager messageManager; + + @Before + public void setUp() throws Exception { + usersRepository = mock(UsersRepository.class); + mailboxManager = mock(MailboxManager.class); + + mailetConfig = new FakeMailetConfig("RecipientFolderTest", FakeMailContext.defaultContext()); + + recipientFolder = new SieveToRecipientFolder(); + recipientFolder.setMailboxManager(mailboxManager); + recipientFolder.setUsersRepository(usersRepository); + recipientFolder.setSieveRepository(mock(SieveRepository.class)); + + messageManager = mock(MessageManager.class); + MailboxSession session = mock(MailboxSession.class); + when(session.getPathDelimiter()).thenReturn('.'); + when(mailboxManager.createSystemSession(any(String.class), any(Logger.class))).thenReturn(session); + user = mock(MailboxSession.User.class); + when(session.getUser()).thenReturn(user); + } + + @Test + public void initParameterTesting() throws Exception { + mailetConfig.setProperty(ToRecipientFolder.FOLDER_PARAMETER, "Junk"); + recipientFolder.init(mailetConfig); + + Assert.assertEquals("Junk", recipientFolder.getInitParameter(ToRecipientFolder.FOLDER_PARAMETER)); + } + + @Test + public void consumeOptionShouldGhostTheMail() throws Exception { + mailetConfig.setProperty(ToRecipientFolder.CONSUME_PARAMETER, "true"); + recipientFolder.init(mailetConfig); + + Mail mail = createMail(); + recipientFolder.service(mail); + + assertThat(mail.getState()).isEqualTo(Mail.GHOST); + } + + @Test + public void consumeOptionShouldNotGhostTheMailByDefault() throws Exception { + recipientFolder.init(mailetConfig); + + Mail mail = createMail(); + recipientFolder.service(mail); + + assertThat(mail.getState()).isEqualTo(Mail.DEFAULT); + } + + @Test + public void folderParameterShouldIndicateDestinationFolder() throws Exception { + when(usersRepository.supportVirtualHosting()).thenReturn(true); + when(mailboxManager.getMailbox(eq(JUNK_VIRTUAL_HOSTING), any(MailboxSession.class))).thenReturn(messageManager); + when(user.getUserName()).thenReturn(USER); + + mailetConfig.setProperty(ToRecipientFolder.FOLDER_PARAMETER, "Junk"); + recipientFolder.init(mailetConfig); + recipientFolder.service(createMail()); + + verify(messageManager).appendMessage(any(InputStream.class), any(Date.class), any(MailboxSession.class), eq(true), any(Flags.class)); + } + + @Test + public void folderParameterShouldBeInboxByDefault() throws Exception { + when(usersRepository.supportVirtualHosting()).thenReturn(true); + when(mailboxManager.getMailbox(eq(INBOX), any(MailboxSession.class))).thenReturn(messageManager); + when(user.getUserName()).thenReturn(USER); + + recipientFolder.init(mailetConfig); + recipientFolder.service(createMail()); + + verify(messageManager).appendMessage(any(InputStream.class), any(Date.class), any(MailboxSession.class), eq(true), any(Flags.class)); + } + + @Test + public void folderParameterShouldWorkWhenVirtualHostingIsTurnedOff() throws Exception { + when(usersRepository.supportVirtualHosting()).thenReturn(false); + when(mailboxManager.getMailbox(eq(JUNK), any(MailboxSession.class))).thenReturn(messageManager); + when(user.getUserName()).thenReturn(USER_LOCAL_PART); + + mailetConfig.setProperty(ToRecipientFolder.FOLDER_PARAMETER, "Junk"); + recipientFolder.init(mailetConfig); + recipientFolder.service(createMail()); + + verify(messageManager).appendMessage(any(InputStream.class), any(Date.class), any(MailboxSession.class), eq(true), any(Flags.class)); + } + + private Mail createMail() throws MessagingException, IOException { + MimeMessage message = new MimeMessage(Session.getDefaultInstance(new Properties())); + message.setSubject("Subject"); + message.setSender(new InternetAddress("[email protected]")); + message.setRecipient(MimeMessage.RecipientType.TO, new InternetAddress(USER)); + MimeMultipart multipart = new MimeMultipart(); + MimeBodyPart scriptPart = new MimeBodyPart(); + scriptPart.setDataHandler( + new DataHandler( + new ByteArrayDataSource( + "toto", + "application/sieve; charset=UTF-8") + )); + scriptPart.setDisposition(MimeBodyPart.ATTACHMENT); + scriptPart.setHeader("Content-Type", "application/sieve; charset=UTF-8"); + scriptPart.setFileName("file.txt"); + multipart.addBodyPart(scriptPart); + message.setContent(multipart); + message.saveChanges(); + return FakeMail.builder() + .mimeMessage(message) + .state(Mail.DEFAULT) + .recipient(new MailAddress(USER)) + .build(); + } + +} http://git-wip-us.apache.org/repos/asf/james-project/blob/989d60e6/server/mailet/mailets/src/test/java/org/apache/james/transport/mailets/delivery/SimpleMailStorerTest.java ---------------------------------------------------------------------- diff --git a/server/mailet/mailets/src/test/java/org/apache/james/transport/mailets/delivery/SimpleMailStorerTest.java b/server/mailet/mailets/src/test/java/org/apache/james/transport/mailets/delivery/SimpleMailStorerTest.java new file mode 100644 index 0000000..1f25190 --- /dev/null +++ b/server/mailet/mailets/src/test/java/org/apache/james/transport/mailets/delivery/SimpleMailStorerTest.java @@ -0,0 +1,121 @@ +/**************************************************************** + * 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.delivery; + +import static org.mockito.Matchers.any; +import static org.mockito.Matchers.eq; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; + +import java.util.Properties; + +import javax.activation.DataHandler; +import javax.mail.Multipart; +import javax.mail.Session; +import javax.mail.internet.MimeBodyPart; +import javax.mail.internet.MimeMessage; +import javax.mail.internet.MimeMultipart; +import javax.mail.util.ByteArrayDataSource; + +import org.apache.commons.logging.Log; +import org.apache.james.user.api.UsersRepository; +import org.apache.james.user.api.UsersRepositoryException; +import org.apache.mailet.MailAddress; +import org.apache.mailet.base.MailAddressFixture; +import org.apache.mailet.base.test.FakeMail; +import org.junit.Before; +import org.junit.Test; + +public class SimpleMailStorerTest { + + public static final String FOLDER = "FOLDER"; + private SimpleMailStorer testee; + private MailboxAppender mailboxAppender; + private UsersRepository usersRepository; + private MimeMessage mimeMessage; + + @Before + public void setUp() throws Exception { + mailboxAppender = mock(MailboxAppender.class); + usersRepository = mock(UsersRepository.class); + testee = SimpleMailStorer.builder() + .usersRepository(usersRepository) + .mailboxAppender(mailboxAppender) + .folder(FOLDER) + .log(mock(Log.class)) + .build(); + + mimeMessage = new MimeMessage(Session.getDefaultInstance(new Properties())); + Multipart multipart = new MimeMultipart(); + MimeBodyPart bodyPart = new MimeBodyPart(); + bodyPart.setDataHandler( + new DataHandler( + new ByteArrayDataSource( + "toto", + "text/plain; charset=UTF-8") + )); + multipart.addBodyPart(bodyPart); + mimeMessage.setContent(multipart); + mimeMessage.saveChanges(); + } + + @Test + public void storeMailShouldUseFullMailAddressWhenSupportsVirtualHosting() throws Exception { + when(usersRepository.supportVirtualHosting()).thenReturn(true); + + MailAddress sender = MailAddressFixture.ANY_AT_JAMES; + MailAddress recipient = MailAddressFixture.OTHER_AT_JAMES; + FakeMail mail = FakeMail.builder() + .mimeMessage(mimeMessage) + .build(); + testee.storeMail(sender, recipient, mail); + + verify(mailboxAppender).append(any(MimeMessage.class), eq(recipient.toString()), eq(FOLDER)); + } + + @Test + public void storeMailShouldUseLocalPartWhenSupportsVirtualHosting() throws Exception { + when(usersRepository.supportVirtualHosting()).thenReturn(false); + + MailAddress sender = MailAddressFixture.ANY_AT_JAMES; + MailAddress recipient = MailAddressFixture.OTHER_AT_JAMES; + FakeMail mail = FakeMail.builder() + .mimeMessage(mimeMessage) + .build(); + testee.storeMail(sender, recipient, mail); + + verify(mailboxAppender).append(any(MimeMessage.class), eq(recipient.getLocalPart()), eq(FOLDER)); + } + + @Test + public void storeMailShouldUseFullMailAddressWhenErrorReadingUsersRepository() throws Exception { + when(usersRepository.supportVirtualHosting()).thenThrow(new UsersRepositoryException("Any message")); + + MailAddress sender = MailAddressFixture.ANY_AT_JAMES; + MailAddress recipient = MailAddressFixture.OTHER_AT_JAMES; + FakeMail mail = FakeMail.builder() + .mimeMessage(mimeMessage) + .build(); + testee.storeMail(sender, recipient, mail); + + verify(mailboxAppender).append(any(MimeMessage.class), eq(recipient.toString()), eq(FOLDER)); + } +} http://git-wip-us.apache.org/repos/asf/james-project/blob/989d60e6/server/mailet/mailets/src/test/java/org/apache/james/transport/mailets/delivery/ToRecipientFolderTest.java ---------------------------------------------------------------------- diff --git a/server/mailet/mailets/src/test/java/org/apache/james/transport/mailets/delivery/ToRecipientFolderTest.java b/server/mailet/mailets/src/test/java/org/apache/james/transport/mailets/delivery/ToRecipientFolderTest.java deleted file mode 100644 index 7123b80..0000000 --- a/server/mailet/mailets/src/test/java/org/apache/james/transport/mailets/delivery/ToRecipientFolderTest.java +++ /dev/null @@ -1,189 +0,0 @@ -/**************************************************************** - * 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.delivery; - -import static org.assertj.core.api.Assertions.assertThat; -import static org.mockito.Matchers.any; -import static org.mockito.Matchers.eq; -import static org.mockito.Mockito.mock; -import static org.mockito.Mockito.verify; -import static org.mockito.Mockito.when; - -import java.io.IOException; -import java.io.InputStream; -import java.util.Date; -import java.util.Properties; - -import javax.activation.DataHandler; -import javax.mail.Flags; -import javax.mail.MessagingException; -import javax.mail.Session; -import javax.mail.internet.InternetAddress; -import javax.mail.internet.MimeBodyPart; -import javax.mail.internet.MimeMessage; -import javax.mail.internet.MimeMultipart; -import javax.mail.util.ByteArrayDataSource; - -import org.apache.james.mailbox.MailboxManager; -import org.apache.james.mailbox.MailboxSession; -import org.apache.james.mailbox.MessageManager; -import org.apache.james.mailbox.model.MailboxPath; -import org.apache.james.sieverepository.api.SieveRepository; -import org.apache.james.user.api.UsersRepository; -import org.apache.mailet.Mail; -import org.apache.mailet.MailAddress; -import org.apache.mailet.base.test.FakeMail; -import org.apache.mailet.base.test.FakeMailContext; -import org.apache.mailet.base.test.FakeMailetConfig; -import org.junit.Assert; -import org.junit.Before; -import org.junit.Test; -import org.slf4j.Logger; - -public class ToRecipientFolderTest { - - public static final String USER = "[email protected]"; - public static final MailboxPath INBOX = new MailboxPath("#private", USER, "INBOX"); - public static final MailboxPath JUNK = new MailboxPath("#private", "receiver", "Junk"); - public static final MailboxPath JUNK_VIRTUAL_HOSTING = new MailboxPath("#private", USER, "Junk"); - private UsersRepository usersRepository; - private MailboxManager mailboxManager; - private ToRecipientFolder recipientFolder; - private FakeMailetConfig mailetConfig; - - @Before - public void setUp() throws Exception { - usersRepository = mock(UsersRepository.class); - mailboxManager = mock(MailboxManager.class); - - mailetConfig = new FakeMailetConfig("RecipientFolderTest", FakeMailContext.defaultContext()); - - recipientFolder = new ToRecipientFolder(); - recipientFolder.setMailboxManager(mailboxManager); - recipientFolder.setUsersRepository(usersRepository); - recipientFolder.setSieveRepository(mock(SieveRepository.class)); - } - - @Test - public void initParameterTesting() throws Exception { - mailetConfig.setProperty(ToRecipientFolder.FOLDER_PARAMETER, "Junk"); - recipientFolder.init(mailetConfig); - - Assert.assertEquals("Junk", recipientFolder.getInitParameter(ToRecipientFolder.FOLDER_PARAMETER)); - } - - @Test - public void consumeOptionShouldGhostTheMail() throws Exception { - mailetConfig.setProperty(ToRecipientFolder.CONSUME_PARAMETER, "true"); - recipientFolder.init(mailetConfig); - - Mail mail = createMail(); - recipientFolder.service(mail); - - assertThat(mail.getState()).isEqualTo(Mail.GHOST); - } - - @Test - public void consumeOptionShouldNotGhostTheMailByDefault() throws Exception { - recipientFolder.init(mailetConfig); - - Mail mail = createMail(); - recipientFolder.service(mail); - - assertThat(mail.getState()).isEqualTo(Mail.DEFAULT); - } - - @Test - public void folderParameterShouldIndicateDestinationFolder() throws Exception { - MessageManager messageManager = mock(MessageManager.class); - MailboxSession session = mock(MailboxSession.class); - - when(usersRepository.supportVirtualHosting()).thenReturn(true); - when(mailboxManager.getMailbox(eq(JUNK_VIRTUAL_HOSTING), any(MailboxSession.class))).thenReturn(messageManager); - when(session.getPathDelimiter()).thenReturn('.'); - when(mailboxManager.createSystemSession(any(String.class), any(Logger.class))).thenReturn(session); - - mailetConfig.setProperty(ToRecipientFolder.FOLDER_PARAMETER, "Junk"); - recipientFolder.init(mailetConfig); - recipientFolder.service(createMail()); - - verify(messageManager).appendMessage(any(InputStream.class), any(Date.class), any(MailboxSession.class), eq(true), any(Flags.class)); - } - - @Test - public void folderParameterShouldBeInboxByDefault() throws Exception { - MessageManager messageManager = mock(MessageManager.class); - MailboxSession session = mock(MailboxSession.class); - - when(usersRepository.supportVirtualHosting()).thenReturn(true); - when(mailboxManager.getMailbox(eq(INBOX), any(MailboxSession.class))).thenReturn(messageManager); - when(session.getPathDelimiter()).thenReturn('.'); - when(mailboxManager.createSystemSession(any(String.class), any(Logger.class))).thenReturn(session); - - recipientFolder.init(mailetConfig); - recipientFolder.service(createMail()); - - verify(messageManager).appendMessage(any(InputStream.class), any(Date.class), any(MailboxSession.class), eq(true), any(Flags.class)); - } - - @Test - public void folderParameterShouldWorkWhenVirtualHostingIsTurnedOff() throws Exception { - MessageManager messageManager = mock(MessageManager.class); - MailboxSession session = mock(MailboxSession.class); - - when(usersRepository.supportVirtualHosting()).thenReturn(false); - when(mailboxManager.getMailbox(eq(JUNK), any(MailboxSession.class))).thenReturn(messageManager); - when(session.getPathDelimiter()).thenReturn('.'); - when(mailboxManager.createSystemSession(any(String.class), any(Logger.class))).thenReturn(session); - - mailetConfig.setProperty(ToRecipientFolder.FOLDER_PARAMETER, "Junk"); - recipientFolder.init(mailetConfig); - recipientFolder.service(createMail()); - - verify(messageManager).appendMessage(any(InputStream.class), any(Date.class), any(MailboxSession.class), eq(true), any(Flags.class)); - } - - private Mail createMail() throws MessagingException, IOException { - MimeMessage message = new MimeMessage(Session.getDefaultInstance(new Properties())); - message.setSubject("Subject"); - message.setSender(new InternetAddress("[email protected]")); - message.setRecipient(MimeMessage.RecipientType.TO, new InternetAddress(USER)); - MimeMultipart multipart = new MimeMultipart(); - MimeBodyPart scriptPart = new MimeBodyPart(); - scriptPart.setDataHandler( - new DataHandler( - new ByteArrayDataSource( - "toto", - "application/sieve; charset=UTF-8") - )); - scriptPart.setDisposition(MimeBodyPart.ATTACHMENT); - scriptPart.setHeader("Content-Type", "application/sieve; charset=UTF-8"); - scriptPart.setFileName("file.txt"); - multipart.addBodyPart(scriptPart); - message.setContent(multipart); - message.saveChanges(); - return FakeMail.builder() - .mimeMessage(message) - .state(Mail.DEFAULT) - .recipient(new MailAddress(USER)) - .build(); - } - -} --------------------------------------------------------------------- To unsubscribe, e-mail: [email protected] For additional commands, e-mail: [email protected]
