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:13 UTC
[10/46] james-project git commit: JAMES-1854 Extract poster
JAMES-1854 Extract poster
Project: http://git-wip-us.apache.org/repos/asf/james-project/repo
Commit: http://git-wip-us.apache.org/repos/asf/james-project/commit/f4f044f2
Tree: http://git-wip-us.apache.org/repos/asf/james-project/tree/f4f044f2
Diff: http://git-wip-us.apache.org/repos/asf/james-project/diff/f4f044f2
Branch: refs/heads/master
Commit: f4f044f23415a1d7374677562f7fd923a9e36110
Parents: c85c6a8
Author: Benoit Tellier <bt...@linagora.com>
Authored: Thu Oct 27 17:11:57 2016 +0200
Committer: Benoit Tellier <bt...@linagora.com>
Committed: Fri Nov 18 18:46:46 2016 +0700
----------------------------------------------------------------------
.../mailets/delivery/LocalDelivery.java | 1 +
.../transport/mailets/delivery/SieveMailet.java | 138 ++----------------
.../transport/mailets/delivery/SievePoster.java | 141 +++++++++++++++++++
.../mailets/delivery/ToRecipientFolder.java | 1 +
.../mailets/delivery/SieveMailetTest.java | 1 +
5 files changed, 158 insertions(+), 124 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/james-project/blob/f4f044f2/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 4412794..8db7444 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
@@ -117,6 +117,7 @@ public class LocalDelivery extends GenericMailet {
.mailboxManager(mailboxManager)
.userRepository(usersRepository)
.resourceLocator(ResourceLocatorImpl.instanciate(usersRepository, sieveRepository))
+ .mailetContext(getMailetContext())
.consume(getInitParameter("consume", true))
.quiet(getInitParameter("quiet", false))
.verbose(getInitParameter("verbose", false))
http://git-wip-us.apache.org/repos/asf/james-project/blob/f4f044f2/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
index 89cd500..1eaa6e6 100644
--- 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
@@ -21,7 +21,6 @@ package org.apache.james.transport.mailets.delivery;
import java.io.IOException;
import java.util.Collection;
import java.util.Collections;
-import java.util.Date;
import java.util.List;
import java.util.Vector;
@@ -31,20 +30,11 @@ import javax.mail.internet.MimeMessage;
import javax.mail.internet.MimeMultipart;
import org.apache.commons.logging.Log;
-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.ActionDispatcher;
import org.apache.james.transport.mailets.jsieve.CommonsLoggingAdapter;
-import org.apache.james.transport.mailets.jsieve.Poster;
import org.apache.james.transport.mailets.jsieve.ResourceLocator;
import org.apache.james.transport.mailets.jsieve.SieveMailAdapter;
-import org.apache.james.transport.util.MailetContextLog;
import org.apache.james.user.api.UsersRepository;
import org.apache.james.user.api.UsersRepositoryException;
import org.apache.jsieve.ConfigurationManager;
@@ -55,6 +45,7 @@ import org.apache.jsieve.parser.generated.ParseException;
import org.apache.jsieve.parser.generated.TokenMgrError;
import org.apache.mailet.Mail;
import org.apache.mailet.MailAddress;
+import org.apache.mailet.MailetContext;
import org.apache.mailet.MailetException;
import org.apache.mailet.base.GenericMailet;
import org.apache.mailet.base.RFC2822Headers;
@@ -64,7 +55,7 @@ import com.google.common.base.Optional;
/**
* Contains resource bindings.
*/
-public class SieveMailet extends GenericMailet implements Poster {
+public class SieveMailet extends GenericMailet {
public static final String DELIVERED_TO = "Delivered-To";
@@ -77,6 +68,7 @@ public class SieveMailet extends GenericMailet implements Poster {
private MailboxManager mailboxManager;
private String folder;
private ResourceLocator resourceLocator;
+ private MailetContext mailetContext;
private boolean consume;
private Optional<Boolean> verbose = Optional.absent();
private Optional<Boolean> quiet = Optional.absent();
@@ -116,17 +108,22 @@ public class SieveMailet extends GenericMailet implements Poster {
return this;
}
+ public Builder mailetContext(MailetContext mailetContext) {
+ this.mailetContext = mailetContext;
+ return this;
+ }
+
public SieveMailet build() throws MessagingException {
if (resourceLocator == null) {
throw new MailetException("Not initialised. Please ensure that the mailet container supports either setter or constructor injection");
}
- return new SieveMailet(usersRepos, mailboxManager, resourceLocator, folder, consume, verbose.or(false), quiet.or(false));
+ return new SieveMailet(usersRepos, mailboxManager, resourceLocator, mailetContext, folder, consume, verbose.or(false), quiet.or(false));
}
}
private final UsersRepository usersRepos;
- private final MailboxManager mailboxManager;
+ private final SievePoster sievePoster;
private final String folder;
private final ResourceLocator resourceLocator;
private final boolean isInfo;
@@ -136,12 +133,11 @@ public class SieveMailet extends GenericMailet implements Poster {
private final ActionDispatcher actionDispatcher;
private final Log log;
- private SieveMailet(UsersRepository usersRepos, MailboxManager mailboxManager, ResourceLocator resourceLocator, String folder,
+ private SieveMailet(UsersRepository usersRepos, MailboxManager mailboxManager, ResourceLocator resourceLocator, MailetContext mailetContext, String folder,
boolean consume, boolean verbose, boolean quiet) throws MessagingException {
-
+ this.sievePoster = new SievePoster(mailboxManager, folder, usersRepos, mailetContext);
this.usersRepos = usersRepos;
this.resourceLocator = resourceLocator;
- this.mailboxManager = mailboxManager;
this.folder = folder;
this.actionDispatcher = new ActionDispatcher();
this.consume = consume;
@@ -205,112 +201,6 @@ public class SieveMailet extends GenericMailet 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 ("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");
- }
- }
- }
-
/**
* Delivers a mail to a local mailbox.
@@ -388,7 +278,7 @@ public class SieveMailet extends GenericMailet implements Poster {
private void sieveMessageEvaluate(MailAddress recipient, Mail aMail, ResourceLocator.UserSieveInformation userSieveInformation) throws MessagingException, IOException {
try {
SieveMailAdapter aMailAdapter = new SieveMailAdapter(aMail,
- getMailetContext(), actionDispatcher, this, userSieveInformation.getScriptActivationDate(),
+ getMailetContext(), actionDispatcher, sievePoster, userSieveInformation.getScriptActivationDate(),
userSieveInformation.getScriptInterpretationDate(), recipient);
aMailAdapter.setLog(log);
// This logging operation is potentially costly
@@ -410,7 +300,7 @@ public class SieveMailet extends GenericMailet implements Poster {
}
protected void storeMessageInbox(String username, MimeMessage message) throws MessagingException {
- post("mailbox://" + username + "/", message);
+ sievePoster.post("mailbox://" + username + "/", message);
}
http://git-wip-us.apache.org/repos/asf/james-project/blob/f4f044f2/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
new file mode 100644
index 0000000..c4595d1
--- /dev/null
+++ b/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/delivery/SievePoster.java
@@ -0,0 +1,141 @@
+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.util.MailetContextLog;
+import org.apache.james.user.api.UsersRepository;
+import org.apache.james.user.api.UsersRepositoryException;
+import org.apache.mailet.MailetContext;
+
+public class SievePoster implements Poster {
+
+ private final MailboxManager mailboxManager;
+ private final String folder;
+ private final UsersRepository usersRepos;
+ private final MailetContext mailetContext;
+
+ public SievePoster(MailboxManager mailboxManager, String folder, UsersRepository usersRepos, MailetContext mailetContext) {
+ this.mailboxManager = mailboxManager;
+ this.folder = folder;
+ this.usersRepos = usersRepos;
+ this.mailetContext = mailetContext;
+ }
+
+ @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(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);
+
+ }
+ }
+
+ }
+
+ 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/f4f044f2/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 642d087..c26b3f1 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
@@ -95,6 +95,7 @@ public class ToRecipientFolder extends GenericMailet {
.mailboxManager(mailboxManager)
.userRepository(usersRepository)
.resourceLocator(ResourceLocatorImpl.instanciate(usersRepository, sieveRepository))
+ .mailetContext(getMailetContext())
.folder(getInitParameter(FOLDER_PARAMETER, "INBOX"))
.consume(getInitParameter(CONSUME_PARAMETER, false))
.verbose(getInitParameter("verbose", false))
http://git-wip-us.apache.org/repos/asf/james-project/blob/f4f044f2/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 9df40ee..0febd31 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
@@ -107,6 +107,7 @@ public class SieveMailetTest {
.userRepository(usersRepository)
.mailboxManager(mailboxManager)
.resourceLocator(resourceLocator)
+ .mailetContext(fakeMailContext)
.folder("INBOX")
.consume(true)
.build();
---------------------------------------------------------------------
To unsubscribe, e-mail: server-dev-unsubscribe@james.apache.org
For additional commands, e-mail: server-dev-help@james.apache.org