JAMES-1854 Move mailets related with local delivery in same package
Project: http://git-wip-us.apache.org/repos/asf/james-project/repo Commit: http://git-wip-us.apache.org/repos/asf/james-project/commit/1559058a Tree: http://git-wip-us.apache.org/repos/asf/james-project/tree/1559058a Diff: http://git-wip-us.apache.org/repos/asf/james-project/diff/1559058a Branch: refs/heads/master Commit: 1559058a63dc9b406551577abb970ffef591db3e Parents: 56acfd0 Author: Benoit Tellier <[email protected]> Authored: Thu Oct 27 14:47:53 2016 +0200 Committer: Benoit Tellier <[email protected]> Committed: Fri Nov 18 18:46:45 2016 +0700 ---------------------------------------------------------------------- .../james/transport/mailets/LocalDelivery.java | 150 ------------- .../james/transport/mailets/SieveMailet.java | 223 ------------------- .../transport/mailets/ToRecipientFolder.java | 133 ----------- .../mailets/delivery/LocalDelivery.java | 152 +++++++++++++ .../transport/mailets/delivery/SieveMailet.java | 223 +++++++++++++++++++ .../mailets/delivery/ToRecipientFolder.java | 134 +++++++++++ .../mailets/delivery/LocalDeliveryTest.java | 1 - .../mailets/delivery/SieveMailetTest.java | 1 - .../mailets/delivery/ToRecipientFolderTest.java | 1 - 9 files changed, 509 insertions(+), 509 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/james-project/blob/1559058a/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/LocalDelivery.java ---------------------------------------------------------------------- diff --git a/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/LocalDelivery.java b/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/LocalDelivery.java deleted file mode 100644 index fa9631d..0000000 --- a/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/LocalDelivery.java +++ /dev/null @@ -1,150 +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; - -import com.google.common.collect.Iterators; -import com.google.common.collect.Lists; -import org.apache.james.domainlist.api.DomainList; -import org.apache.james.mailbox.MailboxManager; -import org.apache.james.sieverepository.api.SieveRepository; -import org.apache.james.user.api.UsersRepository; -import org.apache.mailet.Mail; -import org.apache.mailet.MailetConfig; -import org.apache.mailet.MailetContext; -import org.apache.mailet.base.GenericMailet; - -import javax.inject.Inject; -import javax.inject.Named; -import javax.mail.MessagingException; -import java.util.Iterator; - -/** - * Receives a Mail from the Queue and takes care of delivery of the - * message to local inboxes. - * - * This mailet is a composition of RecipientRewriteTable, SieveMailet - * and MailboxManager configured to mimic the old "LocalDelivery" - * James 2.3 behavior. - */ -public class LocalDelivery 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 SieveMailet sieveMailet; // Mailet that actually stores the message - private RecipientRewriteTable recipientRewriteTable; // Mailet that applies RecipientRewriteTable - - /** - * Delivers a mail to a local mailbox. - * - * @param mail the mail being processed - * - * @throws MessagingException if an error occurs while storing the mail - */ - public void service(Mail mail) throws MessagingException { - recipientRewriteTable.service(mail); - if (!mail.getState().equals(Mail.GHOST)) { - sieveMailet.service(mail); - } - } - - /** - * Return a string describing this mailet. - * - * @return a string describing this mailet - */ - public String getMailetInfo() { - return "Local Delivery Mailet"; - } - - /** - * @see org.apache.mailet.base.GenericMailet#init() - */ - public void init() throws MessagingException { - - super.init(); - - recipientRewriteTable = new RecipientRewriteTable(); - recipientRewriteTable.setDomainList(domainList); - recipientRewriteTable.setRecipientRewriteTable(rrt); - recipientRewriteTable.init(getMailetConfig()); - sieveMailet = new SieveMailet(usersRepository, - mailboxManager, - ResourceLocatorImpl.instanciate(usersRepository, sieveRepository), - "INBOX"); - sieveMailet.init(new MailetConfig() { - public String getInitParameter(String name) { - if ("addDeliveryHeader".equals(name)) { - return "Delivered-To"; - } else if ("resetReturnPath".equals(name)) { - return "true"; - } else { - return getMailetConfig().getInitParameter(name); - } - } - - public Iterator<String> getInitParameterNames() { - return Iterators.concat( - getMailetConfig().getInitParameterNames(), - Lists.newArrayList("addDeliveryHeader", "resetReturnPath").iterator()); - } - - public MailetContext getMailetContext() { - return getMailetConfig().getMailetContext(); - } - - public String getMailetName() { - return getMailetConfig().getMailetName(); - } - - }); - // Override the default value of "quiet" - sieveMailet.setQuiet(getInitParameter("quiet", true)); - } - -} http://git-wip-us.apache.org/repos/asf/james-project/blob/1559058a/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/SieveMailet.java ---------------------------------------------------------------------- diff --git a/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/SieveMailet.java b/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/SieveMailet.java deleted file mode 100644 index 2526fc8..0000000 --- a/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/SieveMailet.java +++ /dev/null @@ -1,223 +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; - -import java.util.Date; - -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.mailets.jsieve.ResourceLocator; -import org.apache.james.transport.mailets.jsieve.SieveMailboxMailet; -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.Mail; -import org.apache.mailet.MailAddress; -import org.apache.mailet.MailetConfig; - -/** - * Contains resource bindings. - */ -public class SieveMailet extends SieveMailboxMailet implements Poster { - private final UsersRepository usersRepos; - private final MailboxManager mailboxManager; - private final String folder; - private final ResourceLocator resourceLocator; - - public SieveMailet(UsersRepository usersRepos, MailboxManager mailboxManager, ResourceLocator resourceLocator, String folder) { - this.usersRepos = usersRepos; - this.resourceLocator = resourceLocator; - this.mailboxManager = mailboxManager; - this.folder = folder; - } - - @Override - public void init(MailetConfig config) throws MessagingException { - setLocator(resourceLocator); - setPoster(this); - super.init(config); - } - - /** - * Return the username to use for sieve processing for the given - * MailAddress. If virtualhosting is supported use the full emailaddrees as - * username - * - * @param m - * @return username - */ - protected String getUsername(MailAddress m) { - try { - if (usersRepos.supportVirtualHosting()) { - return m.toString(); - } else { - return super.getUsername(m); - } - } catch (UsersRepositoryException e) { - log("Unable to access UsersRepository", e); - return super.getUsername(m); - - } - } - - /* - * (non-Javadoc) - * - * @see - * org.apache.jsieve.mailet.SieveMailboxMailet#storeMail(org.apache.mailet - * .MailAddress, org.apache.mailet.MailAddress, org.apache.mailet.Mail) - */ - @Override - public void storeMail(MailAddress sender, MailAddress recipient, Mail mail) throws MessagingException { - super.storeMail(sender, recipient, mail); - String s; - if (sender != null) { - s = sender.toString(); - } else { - s = "<>"; - } - // If no exception was thrown the message was successfully stored in the - // mailbox - log("Local delivered mail " + mail.getName() + " sucessfully from " + s + " to " + recipient.toString() - + " in folder " + this.folder); - } - - /* - * (non-Javadoc) - * - * @see org.apache.jsieve.mailet.Poster#post(java.lang.String, - * javax.mail.internet.MimeMessage) - */ - @Override - public void post(String url, MimeMessage mail) throws MessagingException { - - final int endOfScheme = url.indexOf(':'); - - if (endOfScheme < 0) { - throw new MessagingException("Malformed URI"); - } - - else { - - final String scheme = url.substring(0, endOfScheme); - if ("mailbox".equals(scheme)) { - int startOfUser = endOfScheme + 3; - int endOfUser = url.indexOf('@', startOfUser); - if (endOfUser < 0) { - // TODO: When user missing, append to a default location - throw new MessagingException("Shared mailbox is not supported"); - } else { - // lowerCase the user - see - // https://issues.apache.org/jira/browse/JAMES-1369 - String user = url.substring(startOfUser, endOfUser).toLowerCase(); - int startOfHost = endOfUser + 1; - int endOfHost = url.indexOf('/', startOfHost); - String host = url.substring(startOfHost, endOfHost); - String urlPath; - int length = url.length(); - if (endOfHost + 1 == length) { - urlPath = this.folder; - } else { - urlPath = url.substring(endOfHost, length); - } - - // Check if we should use the full email address as username - try { - if (usersRepos.supportVirtualHosting()) { - user = user + "@" + host; - } - } catch (UsersRepositoryException e) { - throw new MessagingException("Unable to accessUsersRepository", e); - } - - MailboxSession session; - try { - session = mailboxManager.createSystemSession(user, new MailetContextLog(getMailetContext())); - } catch (BadCredentialsException e) { - throw new MessagingException("Unable to authenticate to mailbox", e); - } catch (MailboxException e) { - throw new MessagingException("Can not access mailbox", e); - } - - // Start processing request - mailboxManager.startProcessingRequest(session); - - // This allows Sieve scripts to use a standard delimiter - // regardless of mailbox implementation - String destination = urlPath.replace('/', session.getPathDelimiter()); - - if (destination == null || "".equals(destination)) { - destination = this.folder; - } - if (destination.startsWith(session.getPathDelimiter() + "")) - destination = destination.substring(1); - - // Use the MailboxSession to construct the MailboxPath - See - // JAMES-1326 - final MailboxPath path = new MailboxPath(MailboxConstants.USER_NAMESPACE, user, destination); - try { - if (this.folder.equalsIgnoreCase(destination) && !(mailboxManager.mailboxExists(path, session))) { - mailboxManager.createMailbox(path, session); - } - final MessageManager mailbox = mailboxManager.getMailbox(path, session); - if (mailbox == null) { - final String error = "Mailbox for user " + user + " was not found on this server."; - throw new MessagingException(error); - } - - mailbox.appendMessage(new MimeMessageInputStream(mail), new Date(), session, true, null); - - } 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); - } - - // Stop processing request - mailboxManager.endProcessingRequest(session); - - } - } - - } - - else { - // TODO: add support for more protocols - // TODO: - for example mailto: for forwarding over SMTP - // TODO: - for example xmpp: for forwarding over Jabber - throw new MessagingException("Unsupported protocol"); - } - } - } - -} http://git-wip-us.apache.org/repos/asf/james-project/blob/1559058a/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/ToRecipientFolder.java ---------------------------------------------------------------------- diff --git a/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/ToRecipientFolder.java b/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/ToRecipientFolder.java deleted file mode 100644 index 2adbb3b..0000000 --- a/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/ToRecipientFolder.java +++ /dev/null @@ -1,133 +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; - -import com.google.common.collect.Iterators; -import org.apache.james.mailbox.MailboxManager; -import org.apache.james.sieverepository.api.SieveRepository; -import org.apache.james.user.api.UsersRepository; -import org.apache.mailet.Mail; -import org.apache.mailet.MailetConfig; -import org.apache.mailet.MailetContext; -import org.apache.mailet.base.GenericMailet; - -import javax.inject.Inject; -import javax.inject.Named; -import javax.mail.MessagingException; -import java.util.Arrays; -import java.util.Iterator; - -/** - * Receives a Mail from the Queue and takes care to deliver the message - * to a defined folder of the recipient(s). - * - * 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 ToRecipientFolder 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 SieveMailet sieveMailet; // Mailet that actually stores the message - - /** - * Delivers a mail to a local mailbox in a given folder. - * - * @see org.apache.mailet.base.GenericMailet#service(org.apache.mailet.Mail) - */ - @Override - public void service(Mail mail) throws MessagingException { - if (!mail.getState().equals(Mail.GHOST)) { - sieveMailet.service(mail); - } - } - - @Override - public void init() throws MessagingException { - super.init(); - sieveMailet = new SieveMailet(usersRepository, mailboxManager, ResourceLocatorImpl.instanciate(usersRepository, sieveRepository), getInitParameter(FOLDER_PARAMETER, "INBOX")); - sieveMailet.init(new MailetConfig() { - - @Override - public String getInitParameter(String name) { - if ("addDeliveryHeader".equals(name)) { - return "Delivered-To"; - } else if ("resetReturnPath".equals(name)) { - return "true"; - } else { - return getMailetConfig().getInitParameter(name); - } - } - - @Override - public Iterator<String> getInitParameterNames() { - return Iterators.concat(getMailetConfig().getInitParameterNames(), - Arrays.asList("addDeliveryHeader", "resetReturnPath").iterator()); - } - - @Override - public MailetContext getMailetContext() { - return getMailetConfig().getMailetContext(); - } - - @Override - public String getMailetName() { - return getMailetConfig().getMailetName(); - } - - }); - sieveMailet.setQuiet(getInitParameter("quiet", true)); - sieveMailet.setConsume(getInitParameter(CONSUME_PARAMETER, false)); - } - - @Override - public String getMailetInfo() { - return ToRecipientFolder.class.getName() + " Mailet"; - } - -} http://git-wip-us.apache.org/repos/asf/james-project/blob/1559058a/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 new file mode 100644 index 0000000..7fafbbe --- /dev/null +++ b/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/delivery/LocalDelivery.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 com.google.common.collect.Iterators; +import com.google.common.collect.Lists; +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.user.api.UsersRepository; +import org.apache.mailet.Mail; +import org.apache.mailet.MailetConfig; +import org.apache.mailet.MailetContext; +import org.apache.mailet.base.GenericMailet; + +import javax.inject.Inject; +import javax.inject.Named; +import javax.mail.MessagingException; +import java.util.Iterator; + +/** + * Receives a Mail from the Queue and takes care of delivery of the + * message to local inboxes. + * + * This mailet is a composition of RecipientRewriteTable, SieveMailet + * and MailboxManager configured to mimic the old "LocalDelivery" + * James 2.3 behavior. + */ +public class LocalDelivery 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 SieveMailet sieveMailet; // Mailet that actually stores the message + private RecipientRewriteTable recipientRewriteTable; // Mailet that applies RecipientRewriteTable + + /** + * Delivers a mail to a local mailbox. + * + * @param mail the mail being processed + * + * @throws MessagingException if an error occurs while storing the mail + */ + public void service(Mail mail) throws MessagingException { + recipientRewriteTable.service(mail); + if (!mail.getState().equals(Mail.GHOST)) { + sieveMailet.service(mail); + } + } + + /** + * Return a string describing this mailet. + * + * @return a string describing this mailet + */ + public String getMailetInfo() { + return "Local Delivery Mailet"; + } + + /** + * @see org.apache.mailet.base.GenericMailet#init() + */ + public void init() throws MessagingException { + + super.init(); + + recipientRewriteTable = new RecipientRewriteTable(); + recipientRewriteTable.setDomainList(domainList); + recipientRewriteTable.setRecipientRewriteTable(rrt); + recipientRewriteTable.init(getMailetConfig()); + sieveMailet = new SieveMailet(usersRepository, + mailboxManager, + ResourceLocatorImpl.instanciate(usersRepository, sieveRepository), + "INBOX"); + sieveMailet.init(new MailetConfig() { + public String getInitParameter(String name) { + if ("addDeliveryHeader".equals(name)) { + return "Delivered-To"; + } else if ("resetReturnPath".equals(name)) { + return "true"; + } else { + return getMailetConfig().getInitParameter(name); + } + } + + public Iterator<String> getInitParameterNames() { + return Iterators.concat( + getMailetConfig().getInitParameterNames(), + Lists.newArrayList("addDeliveryHeader", "resetReturnPath").iterator()); + } + + public MailetContext getMailetContext() { + return getMailetConfig().getMailetContext(); + } + + public String getMailetName() { + return getMailetConfig().getMailetName(); + } + + }); + // Override the default value of "quiet" + sieveMailet.setQuiet(getInitParameter("quiet", true)); + } + +} http://git-wip-us.apache.org/repos/asf/james-project/blob/1559058a/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/delivery/SieveMailet.java ---------------------------------------------------------------------- diff --git a/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/delivery/SieveMailet.java b/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/delivery/SieveMailet.java new file mode 100644 index 0000000..c074858 --- /dev/null +++ b/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/delivery/SieveMailet.java @@ -0,0 +1,223 @@ +/**************************************************************** + * 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.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.mailets.jsieve.ResourceLocator; +import org.apache.james.transport.mailets.jsieve.SieveMailboxMailet; +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.Mail; +import org.apache.mailet.MailAddress; +import org.apache.mailet.MailetConfig; + +/** + * Contains resource bindings. + */ +public class SieveMailet extends SieveMailboxMailet implements Poster { + private final UsersRepository usersRepos; + private final MailboxManager mailboxManager; + private final String folder; + private final ResourceLocator resourceLocator; + + public SieveMailet(UsersRepository usersRepos, MailboxManager mailboxManager, ResourceLocator resourceLocator, String folder) { + this.usersRepos = usersRepos; + this.resourceLocator = resourceLocator; + this.mailboxManager = mailboxManager; + this.folder = folder; + } + + @Override + public void init(MailetConfig config) throws MessagingException { + setLocator(resourceLocator); + setPoster(this); + super.init(config); + } + + /** + * Return the username to use for sieve processing for the given + * MailAddress. If virtualhosting is supported use the full emailaddrees as + * username + * + * @param m + * @return username + */ + protected String getUsername(MailAddress m) { + try { + if (usersRepos.supportVirtualHosting()) { + return m.toString(); + } else { + return super.getUsername(m); + } + } catch (UsersRepositoryException e) { + log("Unable to access UsersRepository", e); + return super.getUsername(m); + + } + } + + /* + * (non-Javadoc) + * + * @see + * org.apache.jsieve.mailet.SieveMailboxMailet#storeMail(org.apache.mailet + * .MailAddress, org.apache.mailet.MailAddress, org.apache.mailet.Mail) + */ + @Override + public void storeMail(MailAddress sender, MailAddress recipient, Mail mail) throws MessagingException { + super.storeMail(sender, recipient, mail); + String s; + if (sender != null) { + s = sender.toString(); + } else { + s = "<>"; + } + // If no exception was thrown the message was successfully stored in the + // mailbox + log("Local delivered mail " + mail.getName() + " sucessfully from " + s + " to " + recipient.toString() + + " in folder " + this.folder); + } + + /* + * (non-Javadoc) + * + * @see org.apache.jsieve.mailet.Poster#post(java.lang.String, + * javax.mail.internet.MimeMessage) + */ + @Override + public void post(String url, MimeMessage mail) throws MessagingException { + + final int endOfScheme = url.indexOf(':'); + + if (endOfScheme < 0) { + throw new MessagingException("Malformed URI"); + } + + else { + + final String scheme = url.substring(0, endOfScheme); + if ("mailbox".equals(scheme)) { + int startOfUser = endOfScheme + 3; + int endOfUser = url.indexOf('@', startOfUser); + if (endOfUser < 0) { + // TODO: When user missing, append to a default location + throw new MessagingException("Shared mailbox is not supported"); + } else { + // lowerCase the user - see + // https://issues.apache.org/jira/browse/JAMES-1369 + String user = url.substring(startOfUser, endOfUser).toLowerCase(); + int startOfHost = endOfUser + 1; + int endOfHost = url.indexOf('/', startOfHost); + String host = url.substring(startOfHost, endOfHost); + String urlPath; + int length = url.length(); + if (endOfHost + 1 == length) { + urlPath = this.folder; + } else { + urlPath = url.substring(endOfHost, length); + } + + // Check if we should use the full email address as username + try { + if (usersRepos.supportVirtualHosting()) { + user = user + "@" + host; + } + } catch (UsersRepositoryException e) { + throw new MessagingException("Unable to accessUsersRepository", e); + } + + MailboxSession session; + try { + session = mailboxManager.createSystemSession(user, new MailetContextLog(getMailetContext())); + } catch (BadCredentialsException e) { + throw new MessagingException("Unable to authenticate to mailbox", e); + } catch (MailboxException e) { + throw new MessagingException("Can not access mailbox", e); + } + + // Start processing request + mailboxManager.startProcessingRequest(session); + + // This allows Sieve scripts to use a standard delimiter + // regardless of mailbox implementation + String destination = urlPath.replace('/', session.getPathDelimiter()); + + if (destination == null || "".equals(destination)) { + destination = this.folder; + } + if (destination.startsWith(session.getPathDelimiter() + "")) + destination = destination.substring(1); + + // Use the MailboxSession to construct the MailboxPath - See + // JAMES-1326 + final MailboxPath path = new MailboxPath(MailboxConstants.USER_NAMESPACE, user, destination); + try { + if (this.folder.equalsIgnoreCase(destination) && !(mailboxManager.mailboxExists(path, session))) { + mailboxManager.createMailbox(path, session); + } + final MessageManager mailbox = mailboxManager.getMailbox(path, session); + if (mailbox == null) { + final String error = "Mailbox for user " + user + " was not found on this server."; + throw new MessagingException(error); + } + + mailbox.appendMessage(new MimeMessageInputStream(mail), new Date(), session, true, null); + + } 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); + } + + // Stop processing request + mailboxManager.endProcessingRequest(session); + + } + } + + } + + else { + // TODO: add support for more protocols + // TODO: - for example mailto: for forwarding over SMTP + // TODO: - for example xmpp: for forwarding over Jabber + throw new MessagingException("Unsupported protocol"); + } + } + } + +} http://git-wip-us.apache.org/repos/asf/james-project/blob/1559058a/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 new file mode 100644 index 0000000..e5af0cb --- /dev/null +++ b/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/delivery/ToRecipientFolder.java @@ -0,0 +1,134 @@ +/**************************************************************** + * 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 com.google.common.collect.Iterators; +import org.apache.james.mailbox.MailboxManager; +import org.apache.james.sieverepository.api.SieveRepository; +import org.apache.james.transport.mailets.ResourceLocatorImpl; +import org.apache.james.user.api.UsersRepository; +import org.apache.mailet.Mail; +import org.apache.mailet.MailetConfig; +import org.apache.mailet.MailetContext; +import org.apache.mailet.base.GenericMailet; + +import javax.inject.Inject; +import javax.inject.Named; +import javax.mail.MessagingException; +import java.util.Arrays; +import java.util.Iterator; + +/** + * Receives a Mail from the Queue and takes care to deliver the message + * to a defined folder of the recipient(s). + * + * 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 ToRecipientFolder 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 SieveMailet sieveMailet; // Mailet that actually stores the message + + /** + * Delivers a mail to a local mailbox in a given folder. + * + * @see org.apache.mailet.base.GenericMailet#service(org.apache.mailet.Mail) + */ + @Override + public void service(Mail mail) throws MessagingException { + if (!mail.getState().equals(Mail.GHOST)) { + sieveMailet.service(mail); + } + } + + @Override + public void init() throws MessagingException { + super.init(); + sieveMailet = new SieveMailet(usersRepository, mailboxManager, ResourceLocatorImpl.instanciate(usersRepository, sieveRepository), getInitParameter(FOLDER_PARAMETER, "INBOX")); + sieveMailet.init(new MailetConfig() { + + @Override + public String getInitParameter(String name) { + if ("addDeliveryHeader".equals(name)) { + return "Delivered-To"; + } else if ("resetReturnPath".equals(name)) { + return "true"; + } else { + return getMailetConfig().getInitParameter(name); + } + } + + @Override + public Iterator<String> getInitParameterNames() { + return Iterators.concat(getMailetConfig().getInitParameterNames(), + Arrays.asList("addDeliveryHeader", "resetReturnPath").iterator()); + } + + @Override + public MailetContext getMailetContext() { + return getMailetConfig().getMailetContext(); + } + + @Override + public String getMailetName() { + return getMailetConfig().getMailetName(); + } + + }); + sieveMailet.setQuiet(getInitParameter("quiet", true)); + sieveMailet.setConsume(getInitParameter(CONSUME_PARAMETER, false)); + } + + @Override + public String getMailetInfo() { + return ToRecipientFolder.class.getName() + " Mailet"; + } + +} http://git-wip-us.apache.org/repos/asf/james-project/blob/1559058a/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 index b026327..9a188ff 100644 --- 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 @@ -48,7 +48,6 @@ 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.transport.mailets.LocalDelivery; import org.apache.james.user.api.UsersRepository; import org.apache.mailet.Mail; import org.apache.mailet.MailAddress; http://git-wip-us.apache.org/repos/asf/james-project/blob/1559058a/server/mailet/mailets/src/test/java/org/apache/james/transport/mailets/delivery/SieveMailetTest.java ---------------------------------------------------------------------- diff --git a/server/mailet/mailets/src/test/java/org/apache/james/transport/mailets/delivery/SieveMailetTest.java b/server/mailet/mailets/src/test/java/org/apache/james/transport/mailets/delivery/SieveMailetTest.java index 77f67e7..1c69378 100644 --- a/server/mailet/mailets/src/test/java/org/apache/james/transport/mailets/delivery/SieveMailetTest.java +++ b/server/mailet/mailets/src/test/java/org/apache/james/transport/mailets/delivery/SieveMailetTest.java @@ -49,7 +49,6 @@ import org.apache.james.mailbox.MessageManager; import org.apache.james.mailbox.exception.MailboxException; import org.apache.james.mailbox.model.MailboxPath; import org.apache.james.sieverepository.api.exception.ScriptNotFoundException; -import org.apache.james.transport.mailets.SieveMailet; import org.apache.james.transport.mailets.jsieve.ResourceLocator; import org.apache.james.user.api.UsersRepository; import org.apache.mailet.Mail; http://git-wip-us.apache.org/repos/asf/james-project/blob/1559058a/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 index 350d4f5..7123b80 100644 --- 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 @@ -46,7 +46,6 @@ 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.transport.mailets.ToRecipientFolder; import org.apache.james.user.api.UsersRepository; import org.apache.mailet.Mail; import org.apache.mailet.MailAddress; --------------------------------------------------------------------- To unsubscribe, e-mail: [email protected] For additional commands, e-mail: [email protected]
