You are viewing a plain text version of this content. The canonical link for it is here.
Posted to server-dev@james.apache.org by ro...@apache.org on 2016/11/23 13:50:05 UTC
[02/46] james-project git commit: JAMES-1854 Move mailets related
with local delivery in same package
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 <bt...@linagora.com>
Authored: Thu Oct 27 14:47:53 2016 +0200
Committer: Benoit Tellier <bt...@linagora.com>
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: server-dev-unsubscribe@james.apache.org
For additional commands, e-mail: server-dev-help@james.apache.org