Author: eric
Date: Wed Dec 19 11:22:57 2012
New Revision: 1423827
URL: http://svn.apache.org/viewvc?rev=1423827&view=rev
Log:
Fix rewrite recipients to both local and remote users, patch contributed by
Eike Kettner (JAMES-1443)
Added:
james/server/trunk/mailets/src/test/java/org/apache/james/transport/mailets/RecipientRewriteTableMock.java
james/server/trunk/mailets/src/test/java/org/apache/james/transport/mailets/RecordingMailContext.java
Removed:
james/server/trunk/mailets/src/test/java/org/apache/james/transport/mailets/smime/
Modified:
james/server/trunk/mailets/src/main/java/org/apache/james/transport/mailets/AbstractRecipientRewriteTableMailet.java
james/server/trunk/mailets/src/test/java/org/apache/james/transport/mailets/RecipientRewriteTableTest.java
Modified:
james/server/trunk/mailets/src/main/java/org/apache/james/transport/mailets/AbstractRecipientRewriteTableMailet.java
URL:
http://svn.apache.org/viewvc/james/server/trunk/mailets/src/main/java/org/apache/james/transport/mailets/AbstractRecipientRewriteTableMailet.java?rev=1423827&r1=1423826&r2=1423827&view=diff
==============================================================================
---
james/server/trunk/mailets/src/main/java/org/apache/james/transport/mailets/AbstractRecipientRewriteTableMailet.java
(original)
+++
james/server/trunk/mailets/src/main/java/org/apache/james/transport/mailets/AbstractRecipientRewriteTableMailet.java
Wed Dec 19 11:22:57 2012
@@ -157,7 +157,6 @@ public abstract class AbstractRecipientR
logBuffer.append(", ");
}
getMailetContext().log(logBuffer.toString());
- return null;
} catch (MessagingException me) {
StringBuffer logBuffer = new StringBuffer(128).append("Error
forwarding mail to ");
for (Iterator<MailAddress> j = remoteRecipients.iterator();
j.hasNext();) {
Added:
james/server/trunk/mailets/src/test/java/org/apache/james/transport/mailets/RecipientRewriteTableMock.java
URL:
http://svn.apache.org/viewvc/james/server/trunk/mailets/src/test/java/org/apache/james/transport/mailets/RecipientRewriteTableMock.java?rev=1423827&view=auto
==============================================================================
---
james/server/trunk/mailets/src/test/java/org/apache/james/transport/mailets/RecipientRewriteTableMock.java
(added)
+++
james/server/trunk/mailets/src/test/java/org/apache/james/transport/mailets/RecipientRewriteTableMock.java
Wed Dec 19 11:22:57 2012
@@ -0,0 +1,148 @@
+/****************************************************************
+ * 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 org.apache.james.rrt.api.RecipientRewriteTableException;
+
+import java.util.*;
+
+/**
+ * @since 15.12.12 11:40
+ */
+public class RecipientRewriteTableMock implements
org.apache.james.rrt.api.RecipientRewriteTable {
+
+ public static class Mapping {
+ public final String address;
+ public final List<String> target;
+
+ public Mapping(String address, List<String> target) {
+ this.address = address;
+ this.target = target;
+ }
+
+ public Mapping(String address) {
+ this.address = address;
+ this.target = null;
+ }
+
+ public Mapping to(String... target) {
+ return new Mapping(address, Arrays.asList(target));
+ }
+ }
+
+ public static Mapping mapFrom(String from) {
+ return new Mapping(from);
+ }
+
+ public static RecipientRewriteTableMock rewriteTableMock(Mapping...
mappings) {
+ return new RecipientRewriteTableMock(Arrays.asList(mappings));
+ }
+
+ private final List<Mapping> mappings = new LinkedList<Mapping>();
+
+ private RecipientRewriteTableMock(List<Mapping> mappings) {
+ this.mappings.addAll(mappings);
+ }
+
+ private List<Mapping> findUserDomain(String user, String domain) {
+ List<Mapping> results = new LinkedList<Mapping>();
+ for (Mapping m : mappings) {
+ String[] parts = m.address.split("@", 2);
+ if (parts.length == 2) {
+ if (user.equals(parts[0]) && domain.equals(parts[1])) {
+ results.add(m);
+ }
+ }
+ }
+ return results;
+ }
+
+ @Override
+ public Collection<String> getMappings(String user, String domain) throws
ErrorMappingException, RecipientRewriteTableException {
+ List<String> recipients = new LinkedList<String>();
+ for (Mapping m : findUserDomain(user, domain)) {
+ recipients.addAll(m.target);
+ }
+ if (recipients.isEmpty()) {
+ return null;
+ } else {
+ return recipients;
+ }
+ }
+
+ @Override
+ public void addRegexMapping(String user, String domain, String regex)
throws RecipientRewriteTableException {
+ throw new UnsupportedOperationException("Not implemented");
+ }
+
+ @Override
+ public void removeRegexMapping(String user, String domain, String regex)
throws RecipientRewriteTableException {
+ throw new UnsupportedOperationException("Not implemented");
+ }
+
+ @Override
+ public void addAddressMapping(String user, String domain, String address)
throws RecipientRewriteTableException {
+ throw new UnsupportedOperationException("Not implemented");
+ }
+
+ @Override
+ public void removeAddressMapping(String user, String domain, String
address) throws RecipientRewriteTableException {
+ throw new UnsupportedOperationException("Not implemented");
+ }
+
+ @Override
+ public void addErrorMapping(String user, String domain, String error)
throws RecipientRewriteTableException {
+ throw new UnsupportedOperationException("Not implemented");
+ }
+
+ @Override
+ public void removeErrorMapping(String user, String domain, String error)
throws RecipientRewriteTableException {
+ throw new UnsupportedOperationException("Not implemented");
+ }
+
+ @Override
+ public Collection<String> getUserDomainMappings(String user, String
domain) throws RecipientRewriteTableException {
+ throw new UnsupportedOperationException("Not implemented");
+ }
+
+ @Override
+ public void addMapping(String user, String domain, String mapping) throws
RecipientRewriteTableException {
+ throw new UnsupportedOperationException("Not implemented");
+ }
+
+ @Override
+ public void removeMapping(String user, String domain, String mapping)
throws RecipientRewriteTableException {
+ throw new UnsupportedOperationException("Not implemented");
+ }
+
+ @Override
+ public Map<String, Collection<String>> getAllMappings() throws
RecipientRewriteTableException {
+ throw new UnsupportedOperationException("Not implemented");
+ }
+
+ @Override
+ public void addAliasDomainMapping(String aliasDomain, String realDomain)
throws RecipientRewriteTableException {
+ throw new UnsupportedOperationException("Not implemented");
+ }
+
+ @Override
+ public void removeAliasDomainMapping(String aliasDomain, String
realDomain) throws RecipientRewriteTableException {
+ throw new UnsupportedOperationException("Not implemented");
+ }
+}
Modified:
james/server/trunk/mailets/src/test/java/org/apache/james/transport/mailets/RecipientRewriteTableTest.java
URL:
http://svn.apache.org/viewvc/james/server/trunk/mailets/src/test/java/org/apache/james/transport/mailets/RecipientRewriteTableTest.java?rev=1423827&r1=1423826&r2=1423827&view=diff
==============================================================================
---
james/server/trunk/mailets/src/test/java/org/apache/james/transport/mailets/RecipientRewriteTableTest.java
(original)
+++
james/server/trunk/mailets/src/test/java/org/apache/james/transport/mailets/RecipientRewriteTableTest.java
Wed Dec 19 11:22:57 2012
@@ -18,28 +18,34 @@
****************************************************************/
package org.apache.james.transport.mailets;
-import java.util.*;
-import javax.mail.MessagingException;
-import org.apache.james.rrt.api.RecipientRewriteTableException;
import org.apache.mailet.Mail;
import org.apache.mailet.MailAddress;
+import org.apache.mailet.MailetContext;
import org.apache.mailet.base.test.FakeMail;
import org.apache.mailet.base.test.FakeMailContext;
import org.apache.mailet.base.test.FakeMailetConfig;
import org.apache.mailet.base.test.FakeMimeMessage;
import org.junit.After;
-import static org.junit.Assert.*;
import org.junit.Before;
import org.junit.Test;
+import javax.mail.Message;
+import javax.mail.MessagingException;
+import javax.mail.internet.MimeMessage;
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.Properties;
+
+import static
org.apache.james.transport.mailets.RecipientRewriteTableMock.mapFrom;
+import static
org.apache.james.transport.mailets.RecipientRewriteTableMock.rewriteTableMock;
+import static org.junit.Assert.assertEquals;
+
public class RecipientRewriteTableTest {
private org.apache.james.transport.mailets.RecipientRewriteTable table;
@Before
public void setUp() throws Exception {
-
- table = new org.apache.james.transport.mailets.RecipientRewriteTable();
final FakeMailContext mockMailetContext = new FakeMailContext() {
@Override
@@ -51,99 +57,23 @@ public class RecipientRewriteTableTest {
return false;
}
};
- FakeMailetConfig mockMailetConfig = new FakeMailetConfig("vut",
mockMailetContext, new Properties());
- // mockMailetConfig.put("recipientrewritetable", "vut");
-
- table.setRecipientRewriteTable(new
org.apache.james.rrt.api.RecipientRewriteTable() {
-
- @Override
- public Collection<String> getMappings(String user, String domain)
throws ErrorMappingException,
- RecipientRewriteTableException {
- if (user.equals("test") && domain.equals("localhost")) {
- return Arrays.asList(new String[]{"whatever@localhost",
"blah@localhost"});
- }
- return null;
- }
-
- @Override
- public void addRegexMapping(String user, String domain, String
regex) throws RecipientRewriteTableException {
- throw new UnsupportedOperationException("Not implemented");
- }
-
- @Override
- public void removeRegexMapping(String user, String domain, String
regex) throws
- RecipientRewriteTableException {
- throw new UnsupportedOperationException("Not implemented");
-
- }
-
- @Override
- public void addAddressMapping(String user, String domain, String
address) throws
- RecipientRewriteTableException {
- throw new UnsupportedOperationException("Not implemented");
-
- }
-
- @Override
- public void removeAddressMapping(String user, String domain,
String address) throws
- RecipientRewriteTableException {
- throw new UnsupportedOperationException("Not implemented");
-
- }
-
- @Override
- public void addErrorMapping(String user, String domain, String
error) throws RecipientRewriteTableException {
- throw new UnsupportedOperationException("Not implemented");
-
- }
-
- @Override
- public void removeErrorMapping(String user, String domain, String
error) throws
- RecipientRewriteTableException {
- throw new UnsupportedOperationException("Not implemented");
- }
-
- @Override
- public Collection<String> getUserDomainMappings(String user,
String domain) throws
- RecipientRewriteTableException {
- throw new UnsupportedOperationException("Not implemented");
- }
-
- @Override
- public void addMapping(String user, String domain, String mapping)
throws RecipientRewriteTableException {
- throw new UnsupportedOperationException("Not implemented");
-
- }
-
- @Override
- public void removeMapping(String user, String domain, String
mapping) throws RecipientRewriteTableException {
- throw new UnsupportedOperationException("Not implemented");
-
- }
-
- @Override
- public Map<String, Collection<String>> getAllMappings() throws
RecipientRewriteTableException {
- throw new UnsupportedOperationException("Not implemented");
- }
-
- @Override
- public void addAliasDomainMapping(String aliasDomain, String
realDomain) throws
- RecipientRewriteTableException {
- throw new UnsupportedOperationException("Not implemented");
-
- }
-
- @Override
- public void removeAliasDomainMapping(String aliasDomain, String
realDomain) throws
- RecipientRewriteTableException {
- throw new UnsupportedOperationException("Not implemented");
-
- }
- });
+ table = createRecipientRewriteMailet(
+
rewriteTableMock(mapFrom("test@localhost").to("whatever@localhost",
"blah@localhost")),
+ mockMailetContext
+ );
+ }
- table.init(mockMailetConfig);
+ private static RecipientRewriteTable createRecipientRewriteMailet(
+ org.apache.james.rrt.api.RecipientRewriteTable vut,
+ MailetContext mailContext) throws MessagingException {
+ RecipientRewriteTable rrt = new
org.apache.james.transport.mailets.RecipientRewriteTable();
+ FakeMailetConfig mockMailetConfig = new FakeMailetConfig("vut",
mailContext, new Properties());
+ // mockMailetConfig.put("recipientrewritetable", "vut");
+ rrt.setRecipientRewriteTable(vut);
+ rrt.init(mockMailetConfig);
+ return rrt;
}
@After
@@ -178,4 +108,35 @@ public class RecipientRewriteTableTest {
mail.setMessage(new FakeMimeMessage());
return mail;
}
+
+ @Test
+ public void testMixedLocalAndRemoteRecipients() throws Exception {
+ RecordingMailContext context = new RecordingMailContext();
+ RecipientRewriteTable mailet = createRecipientRewriteMailet(
+ rewriteTableMock(mapFrom("mixed@localhost").to("a@localhost",
"[email protected]")),
+ context
+ );
+ Mail mail = createMail(new String[]{"mixed@localhost"});
+ mailet.service(mail);
+ //the mail must be send via the context to [email protected], the other
+ //recipient a@localhost must be in the recipient list of the message
+ //after processing.
+ assertEquals(context.getSendmails().size(), 1);
+ MimeMessage msg = context.getSendmails().get(0).getMessage();
+ if (msg == null) {
+ msg = context.getSendmails().get(0).getMail().getMessage();
+ }
+ if (msg.getRecipients(Message.RecipientType.TO).length == 1) {
+
assertEquals(msg.getRecipients(Message.RecipientType.TO)[0].toString(),
"[email protected]");
+ } else {
+ assertEquals(context.getSendmails().get(0).getRecipients().size(),
1);
+ MailAddress rec =
context.getSendmails().get(0).getRecipients().iterator().next();
+ assertEquals(rec.toInternetAddress().toString(),
"[email protected]");
+ }
+
+ assertEquals(mail.getRecipients().size(), 1);
+ MailAddress localRec = (MailAddress)
mail.getRecipients().iterator().next();
+ assertEquals(localRec.toInternetAddress().toString(), "a@localhost");
+ }
+
}
Added:
james/server/trunk/mailets/src/test/java/org/apache/james/transport/mailets/RecordingMailContext.java
URL:
http://svn.apache.org/viewvc/james/server/trunk/mailets/src/test/java/org/apache/james/transport/mailets/RecordingMailContext.java?rev=1423827&view=auto
==============================================================================
---
james/server/trunk/mailets/src/test/java/org/apache/james/transport/mailets/RecordingMailContext.java
(added)
+++
james/server/trunk/mailets/src/test/java/org/apache/james/transport/mailets/RecordingMailContext.java
Wed Dec 19 11:22:57 2012
@@ -0,0 +1,121 @@
+/****************************************************************
+ * Licensed to the Apache Software Foundation (ASF) under one *
+ * or more contributor license agreements. See the NOTICE file *
+ * distributed with this work for additional information *
+ * regarding copyright ownership. The ASF licenses this file *
+ * to you under the Apache License, Version 2.0 (the *
+ * "License"); you may not use this file except in compliance *
+ * with the License. You may obtain a copy of the License at *
+ * *
+ * http://www.apache.org/licenses/LICENSE-2.0 *
+ * *
+ * Unless required by applicable law or agreed to in writing, *
+ * software distributed under the License is distributed on an *
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY *
+ * KIND, either express or implied. See the License for the *
+ * specific language governing permissions and limitations *
+ * under the License. *
+ ****************************************************************/
+package org.apache.james.transport.mailets;
+
+import org.apache.mailet.Mail;
+import org.apache.mailet.MailAddress;
+import org.apache.mailet.base.test.FakeMailContext;
+
+import javax.mail.MessagingException;
+import javax.mail.internet.MimeMessage;
+import java.util.Collection;
+import java.util.LinkedList;
+import java.util.List;
+
+/**
+ * @since 15.12.12 12:02
+ */
+public class RecordingMailContext extends FakeMailContext {
+
+ private final List<SendMailEvent> sendmails = new
LinkedList<SendMailEvent>();
+
+ @Override
+ public boolean isLocalServer(String serverName) {
+ return "localhost".equals(serverName);
+ }
+
+ @Override
+ public void sendMail(Mail mail) throws MessagingException {
+ sendmails.add(new SendMailEvent(mail));
+ }
+
+ @Override
+ public void sendMail(MimeMessage msg) throws MessagingException {
+ sendmails.add(new SendMailEvent(msg));
+ }
+
+ @Override
+ public void sendMail(MailAddress sender, Collection recipients,
MimeMessage msg) throws MessagingException {
+ sendmails.add(new SendMailEvent(msg, sender, recipients));
+ }
+
+ @Override
+ public void sendMail(MailAddress sender, Collection recipients,
MimeMessage msg, String state) throws MessagingException {
+ sendmails.add(new SendMailEvent(msg, sender, recipients, state));
+ }
+
+ public List<SendMailEvent> getSendmails() {
+ return sendmails;
+ }
+
+ public static class SendMailEvent {
+ private final Object message;
+ private final MailAddress sender;
+ private final Collection<MailAddress> recipients;
+ private final String state;
+
+ private SendMailEvent(Object message, MailAddress sender,
Collection<MailAddress> recipients, String state) {
+ this.message = message;
+ this.sender = sender;
+ this.recipients = recipients;
+ this.state = state;
+ }
+
+ public SendMailEvent(Mail mail) {
+ this(mail, null, null, null);
+ }
+
+ public SendMailEvent(MimeMessage mail) {
+ this(mail, null, null, null);
+ }
+
+ public SendMailEvent(MimeMessage mail, MailAddress sender,
Collection<MailAddress> recipients) {
+ this(mail, sender, recipients, null);
+ }
+ public SendMailEvent(MimeMessage mail, MailAddress sender,
Collection<MailAddress> recipients, String state) {
+ this((Object)mail, sender, recipients, state);
+ }
+
+ public Mail getMail() {
+ if (message instanceof Mail) {
+ return (Mail) message;
+ }
+ return null;
+ }
+ public MimeMessage getMessage() {
+ if (message instanceof MimeMessage) {
+ return (MimeMessage) message;
+ }
+ return null;
+ }
+
+ public MailAddress getSender() {
+ return sender;
+ }
+
+ public Collection<MailAddress> getRecipients() {
+ return recipients;
+ }
+
+ public String getState() {
+ return state;
+ }
+ }
+
+}
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]