JAMES-1854 Rework SievePoster
Project: http://git-wip-us.apache.org/repos/asf/james-project/repo Commit: http://git-wip-us.apache.org/repos/asf/james-project/commit/135f8e1d Tree: http://git-wip-us.apache.org/repos/asf/james-project/tree/135f8e1d Diff: http://git-wip-us.apache.org/repos/asf/james-project/diff/135f8e1d Branch: refs/heads/master Commit: 135f8e1dc714da4cd76d3006f0cf1992aefba7d0 Parents: ca85c52 Author: Benoit Tellier <[email protected]> Authored: Thu Oct 27 22:04:40 2016 +0200 Committer: Benoit Tellier <[email protected]> Committed: Fri Nov 18 18:46:46 2016 +0700 ---------------------------------------------------------------------- .../mailets/delivery/LocalDelivery.java | 10 +- .../mailets/delivery/SieveMailStorer.java | 18 +- .../transport/mailets/delivery/SievePoster.java | 212 +++++++++++-------- .../mailets/delivery/ToRecipientFolder.java | 10 +- 4 files changed, 132 insertions(+), 118 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/james-project/blob/135f8e1d/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 47a96ae..08fce5d 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 @@ -19,6 +19,10 @@ 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; @@ -28,13 +32,8 @@ 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.MailetConfig; import org.apache.mailet.base.GenericMailet; -import javax.inject.Inject; -import javax.inject.Named; -import javax.mail.MessagingException; - /** * Receives a Mail from the Queue and takes care of delivery of the * message to local inboxes. @@ -105,7 +104,6 @@ public class LocalDelivery extends GenericMailet { .mailStorer(SieveMailStorer.builder() .sievePoster(new SievePoster(mailboxManager, folder, usersRepository, getMailetContext())) .usersRepository(usersRepository) - .mailboxManager(mailboxManager) .resourceLocator(ResourceLocatorImpl.instanciate(usersRepository, sieveRepository)) .mailetContext(getMailetContext()) .folder(folder) http://git-wip-us.apache.org/repos/asf/james-project/blob/135f8e1d/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/delivery/SieveMailStorer.java ---------------------------------------------------------------------- diff --git a/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/delivery/SieveMailStorer.java b/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/delivery/SieveMailStorer.java index 56736ba..5cfd2c0 100644 --- a/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/delivery/SieveMailStorer.java +++ b/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/delivery/SieveMailStorer.java @@ -26,7 +26,6 @@ import javax.mail.MessagingException; import javax.mail.internet.MimeMessage; import org.apache.commons.logging.Log; -import org.apache.james.mailbox.MailboxManager; import org.apache.james.transport.mailets.jsieve.ActionDispatcher; import org.apache.james.transport.mailets.jsieve.ResourceLocator; import org.apache.james.transport.mailets.jsieve.SieveMailAdapter; @@ -56,7 +55,6 @@ public class SieveMailStorer implements MailStorer { private String folder; private ResourceLocator resourceLocator; private Log log; - private MailboxManager mailboxManager; public Builder folder(String folder) { this.folder = folder; @@ -88,11 +86,6 @@ public class SieveMailStorer implements MailStorer { return this; } - public Builder mailboxManager(MailboxManager mailboxManager) { - this.mailboxManager = mailboxManager; - return this; - } - public SieveMailStorer build() throws MessagingException { Preconditions.checkNotNull(mailetContext); Preconditions.checkNotNull(usersRepos); @@ -100,10 +93,8 @@ public class SieveMailStorer implements MailStorer { Preconditions.checkNotNull(resourceLocator); Preconditions.checkNotNull(log); Preconditions.checkNotNull(sievePoster); - return new SieveMailStorer(mailetContext, usersRepos, mailboxManager, folder, resourceLocator, log); + return new SieveMailStorer(mailetContext, usersRepos, sievePoster, folder, resourceLocator, log); } - - } private final MailetContext mailetContext; @@ -115,11 +106,11 @@ public class SieveMailStorer implements MailStorer { private final ActionDispatcher actionDispatcher; private final Log log; - public SieveMailStorer(MailetContext mailetContext, UsersRepository usersRepos, MailboxManager mailboxManager, String folder, + public SieveMailStorer(MailetContext mailetContext, UsersRepository usersRepos, SievePoster sievePoster, String folder, ResourceLocator resourceLocator, Log log) throws MessagingException { this.mailetContext = mailetContext; this.usersRepos = usersRepos; - this.sievePoster = new SievePoster(mailboxManager, folder, usersRepos, mailetContext); + this.sievePoster = sievePoster; this.folder = folder; this.resourceLocator = resourceLocator; try { @@ -190,7 +181,4 @@ public class SieveMailStorer implements MailStorer { protected void storeMessageInbox(String username, MimeMessage message) throws MessagingException { sievePoster.post("mailbox://" + username + "/", message); } - - - } http://git-wip-us.apache.org/repos/asf/james-project/blob/135f8e1d/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 c4595d1..c287689 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 @@ -1,7 +1,27 @@ +/**************************************************************** + * 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; @@ -19,8 +39,13 @@ import org.apache.james.user.api.UsersRepository; import org.apache.james.user.api.UsersRepositoryException; import org.apache.mailet.MailetContext; +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 String folder; private final UsersRepository usersRepos; @@ -35,107 +60,112 @@ public class SievePoster implements Poster { @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 (scheme.equals("mailbox")) { + handleMailboxProtocol(url, mail, endOfScheme); + } else { + throw new MessagingException("Unsupported protocol"); + } } + } - else { + private void handleMailboxProtocol(String url, MimeMessage mail, int endOfScheme) throws MessagingException { + int startOfUser = endOfScheme + 3; + int endOfUser = url.indexOf('@', startOfUser); + int startOfHost = endOfUser + 1; + int endOfHost = url.indexOf('/', startOfHost); + if (endOfUser < 0) { + // TODO: When user missing, append to a default location + throw new MessagingException("Shared mailbox is not supported"); + } else { + String host = url.substring(startOfHost, endOfHost); + String user = parseUser(url, startOfUser, endOfUser, host); + String urlPath = parseUrlPath(url, endOfHost); + + MailboxSession session = createMailboxSession(user); + appendMessageToMailboxWithSession(mail, user, session, parseDestinationMailboxPath(user, urlPath, session)); + } + } - 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(mailetContext)); - } 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); - - } - } + private String parseUrlPath(String url, int endOfHost) { + String urlPath; + int length = url.length(); + if (endOfHost + 1 == length) { + urlPath = this.folder; + } else { + urlPath = url.substring(endOfHost, length); + } + return urlPath; + } + private String parseUser(String url, int startOfUser, int endOfUser, String host) throws MessagingException { + // lowerCase the user - see + // https://issues.apache.org/jira/browse/JAMES-1369 + String user = url.substring(startOfUser, endOfUser).toLowerCase(); + // Check if we should use the full email address as username + try { + if (usersRepos.supportVirtualHosting()) { + return user + "@" + host; } + return user; + } catch (UsersRepositoryException e) { + throw new MessagingException("Unable to accessUsersRepository", e); + } + } - 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"); + 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/135f8e1d/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 e791d9a..9e8ba2d 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 @@ -18,6 +18,10 @@ ****************************************************************/ 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; @@ -25,13 +29,8 @@ 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.MailetConfig; import org.apache.mailet.base.GenericMailet; -import javax.inject.Inject; -import javax.inject.Named; -import javax.mail.MessagingException; - /** * Receives a Mail from the Queue and takes care to deliver the message * to a defined folder of the recipient(s). @@ -95,7 +94,6 @@ public class ToRecipientFolder extends GenericMailet { .usersRepository(usersRepository) .resourceLocator(ResourceLocatorImpl.instanciate(usersRepository, sieveRepository)) .mailetContext(getMailetContext()) - .mailboxManager(mailboxManager) .folder(folder) .log(log) .build()) --------------------------------------------------------------------- To unsubscribe, e-mail: [email protected] For additional commands, e-mail: [email protected]
