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 ad...@apache.org on 2017/11/15 11:15:51 UTC

[10/19] james-project git commit: JAMES-2214 Make calls to MailFactory less ambiguous by only requiring an Envelope and not a full JMAP Message

JAMES-2214 Make calls to MailFactory less ambiguous by only requiring an Envelope and not a full JMAP Message


Project: http://git-wip-us.apache.org/repos/asf/james-project/repo
Commit: http://git-wip-us.apache.org/repos/asf/james-project/commit/a04c071c
Tree: http://git-wip-us.apache.org/repos/asf/james-project/tree/a04c071c
Diff: http://git-wip-us.apache.org/repos/asf/james-project/diff/a04c071c

Branch: refs/heads/master
Commit: a04c071c42926fb917f7df127d8dde2b69252e5e
Parents: 2b22852
Author: benwa <bt...@linagora.com>
Authored: Mon Nov 13 16:48:48 2017 +0700
Committer: benwa <bt...@linagora.com>
Committed: Wed Nov 15 18:05:45 2017 +0700

----------------------------------------------------------------------
 .../james/jmap/methods/MessageSender.java       |  28 ++---
 .../methods/SetMessagesCreationProcessor.java   |   4 +-
 .../org/apache/james/jmap/model/Envelope.java   | 116 +++++++++++++++++++
 .../org/apache/james/jmap/send/MailFactory.java |  46 ++------
 .../apache/james/jmap/send/MailFactoryTest.java |   7 +-
 5 files changed, 142 insertions(+), 59 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/james-project/blob/a04c071c/server/protocols/jmap/src/main/java/org/apache/james/jmap/methods/MessageSender.java
----------------------------------------------------------------------
diff --git a/server/protocols/jmap/src/main/java/org/apache/james/jmap/methods/MessageSender.java b/server/protocols/jmap/src/main/java/org/apache/james/jmap/methods/MessageSender.java
index 6a1a089..8d86355 100644
--- a/server/protocols/jmap/src/main/java/org/apache/james/jmap/methods/MessageSender.java
+++ b/server/protocols/jmap/src/main/java/org/apache/james/jmap/methods/MessageSender.java
@@ -24,7 +24,7 @@ import java.io.IOException;
 import javax.inject.Inject;
 import javax.mail.MessagingException;
 
-import org.apache.james.jmap.model.Message;
+import org.apache.james.jmap.model.Envelope;
 import org.apache.james.jmap.model.MessageFactory;
 import org.apache.james.jmap.send.MailFactory;
 import org.apache.james.jmap.send.MailMetadata;
@@ -44,39 +44,31 @@ public class MessageSender {
         this.mailFactory = mailFactory;
     }
 
-    public void sendMessage(Message jmapMessage,
-                            MessageFactory.MetaDataWithContent message,
+    public void sendMessage(MessageFactory.MetaDataWithContent message,
+                            Envelope envelope,
                             MailboxSession session) throws MailboxException, MessagingException {
-        assertUserIsInSenders(jmapMessage, session);
-        Mail mail = buildMessage(message, jmapMessage);
+        assertUserIsInSenders(envelope, session);
+        Mail mail = buildMessage(message, envelope);
         try {
-            MailMetadata metadata = new MailMetadata(jmapMessage.getId(), session.getUser().getUserName());
+            MailMetadata metadata = new MailMetadata(message.getMessageId(), session.getUser().getUserName());
             mailSpool.send(mail, metadata);
         } finally {
             LifecycleUtil.dispose(mail);
         }
     }
 
-    private Mail buildMessage(MessageFactory.MetaDataWithContent message, Message jmapMessage) throws MessagingException {
+    private Mail buildMessage(MessageFactory.MetaDataWithContent message, Envelope envelope) throws MessagingException {
         try {
-            return mailFactory.build(message, jmapMessage);
+            return mailFactory.build(message, envelope);
         } catch (IOException e) {
             throw new MessagingException("error building message to send", e);
         }
     }
 
-    private void assertUserIsInSenders(Message message, MailboxSession session) throws MailboxSendingNotAllowedException {
+    private void assertUserIsInSenders(Envelope envelope, MailboxSession session) throws MailboxSendingNotAllowedException {
         String allowedSender = session.getUser().getUserName();
-        if (!isAllowedFromAddress(message, allowedSender)) {
+        if (!session.getUser().isSameUser(envelope.getFrom().asString())) {
             throw new MailboxSendingNotAllowedException(allowedSender);
         }
     }
-
-    private boolean isAllowedFromAddress(Message message, String allowedFromMailAddress) {
-        return message.getFrom()
-            .map(draftEmailer -> draftEmailer.getEmail()
-                .map(allowedFromMailAddress::equals)
-                .orElse(false))
-            .orElse(false);
-    }
 }

http://git-wip-us.apache.org/repos/asf/james-project/blob/a04c071c/server/protocols/jmap/src/main/java/org/apache/james/jmap/methods/SetMessagesCreationProcessor.java
----------------------------------------------------------------------
diff --git a/server/protocols/jmap/src/main/java/org/apache/james/jmap/methods/SetMessagesCreationProcessor.java b/server/protocols/jmap/src/main/java/org/apache/james/jmap/methods/SetMessagesCreationProcessor.java
index 19dc981..4bb43dc 100644
--- a/server/protocols/jmap/src/main/java/org/apache/james/jmap/methods/SetMessagesCreationProcessor.java
+++ b/server/protocols/jmap/src/main/java/org/apache/james/jmap/methods/SetMessagesCreationProcessor.java
@@ -36,6 +36,7 @@ import org.apache.james.jmap.exceptions.MailboxNotOwnedException;
 import org.apache.james.jmap.methods.ValueWithId.CreationMessageEntry;
 import org.apache.james.jmap.methods.ValueWithId.MessageWithId;
 import org.apache.james.jmap.model.CreationMessage;
+import org.apache.james.jmap.model.Envelope;
 import org.apache.james.jmap.model.Keyword;
 import org.apache.james.jmap.model.Message;
 import org.apache.james.jmap.model.MessageFactory;
@@ -235,7 +236,8 @@ public class SetMessagesCreationProcessor implements SetMessagesProcessor {
         MessageManager outbox = getMailboxWithRole(session, Role.OUTBOX).orElseThrow(() -> new MailboxNotFoundException(Role.OUTBOX.serialize()));
         MetaDataWithContent newMessage = messageAppender.appendMessageInMailbox(entry, outbox, session);
         Message jmapMessage = messageFactory.fromMetaDataWithContent(newMessage);
-        messageSender.sendMessage(jmapMessage, newMessage, session);
+        Envelope envelope = Envelope.fromMessage(jmapMessage);
+        messageSender.sendMessage(newMessage, envelope, session);
         return new ValueWithId.MessageWithId(entry.getCreationId(), jmapMessage);
     }
 

http://git-wip-us.apache.org/repos/asf/james-project/blob/a04c071c/server/protocols/jmap/src/main/java/org/apache/james/jmap/model/Envelope.java
----------------------------------------------------------------------
diff --git a/server/protocols/jmap/src/main/java/org/apache/james/jmap/model/Envelope.java b/server/protocols/jmap/src/main/java/org/apache/james/jmap/model/Envelope.java
new file mode 100644
index 0000000..e823aca
--- /dev/null
+++ b/server/protocols/jmap/src/main/java/org/apache/james/jmap/model/Envelope.java
@@ -0,0 +1,116 @@
+/****************************************************************
+ * 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.jmap.model;
+
+import java.util.List;
+import java.util.Objects;
+import java.util.Set;
+import java.util.stream.Collectors;
+
+import javax.mail.internet.AddressException;
+
+import org.apache.james.core.MailAddress;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import com.google.common.base.Preconditions;
+import com.google.common.base.Throwables;
+
+public class Envelope {
+    private static final Logger LOGGER = LoggerFactory.getLogger(Envelope.class);
+
+    public static Envelope fromMessage(Message jmapMessage) {
+        MailAddress sender = jmapMessage.getFrom()
+            .map(Envelope::emailerToMailAddress)
+            .orElseThrow(() -> new RuntimeException("Sender is mandatory"));
+        Set<MailAddress> to = emailersToMailAddressSet(jmapMessage.getTo());
+        Set<MailAddress> cc = emailersToMailAddressSet(jmapMessage.getCc());
+        Set<MailAddress> bcc = emailersToMailAddressSet(jmapMessage.getBcc());
+
+        return new Envelope(sender, to, cc, bcc);
+    }
+
+    private static Set<MailAddress> emailersToMailAddressSet(List<Emailer> emailers) {
+        return emailers.stream()
+            .map(Envelope::emailerToMailAddress)
+            .collect(Collectors.toSet());
+    }
+
+    private static MailAddress emailerToMailAddress(Emailer emailer) {
+        Preconditions.checkArgument(emailer.getEmail().isPresent(), "eMailer mail address should be present when sending a mail using JMAP");
+        try {
+            return new MailAddress(emailer.getEmail().get());
+        } catch (AddressException e) {
+            LOGGER.error("Invalid mail address", emailer.getEmail());
+            throw Throwables.propagate(e);
+        }
+    }
+
+    private final MailAddress from;
+    private final Set<MailAddress> to;
+    private final Set<MailAddress> cc;
+    private final Set<MailAddress> bcc;
+
+    private Envelope(MailAddress from, Set<MailAddress> to, Set<MailAddress> cc, Set<MailAddress> bcc) {
+        Preconditions.checkNotNull(from);
+        Preconditions.checkNotNull(to);
+        Preconditions.checkNotNull(cc);
+        Preconditions.checkNotNull(bcc);
+
+        this.from = from;
+        this.to = to;
+        this.cc = cc;
+        this.bcc = bcc;
+    }
+
+    public MailAddress getFrom() {
+        return from;
+    }
+
+    public Set<MailAddress> getTo() {
+        return to;
+    }
+
+    public Set<MailAddress> getCc() {
+        return cc;
+    }
+
+    public Set<MailAddress> getBcc() {
+        return bcc;
+    }
+
+    @Override
+    public final boolean equals(Object o) {
+        if (o instanceof Envelope) {
+            Envelope envelope = (Envelope) o;
+
+            return Objects.equals(this.from, envelope.from)
+                && Objects.equals(this.to, envelope.to)
+                && Objects.equals(this.cc, envelope.cc)
+                && Objects.equals(this.bcc, envelope.bcc);
+        }
+        return false;
+    }
+
+    @Override
+    public final int hashCode() {
+        return Objects.hash(from, to, cc, bcc);
+    }
+}

http://git-wip-us.apache.org/repos/asf/james-project/blob/a04c071c/server/protocols/jmap/src/main/java/org/apache/james/jmap/send/MailFactory.java
----------------------------------------------------------------------
diff --git a/server/protocols/jmap/src/main/java/org/apache/james/jmap/send/MailFactory.java b/server/protocols/jmap/src/main/java/org/apache/james/jmap/send/MailFactory.java
index 4fa46c5..7db6a9b 100644
--- a/server/protocols/jmap/src/main/java/org/apache/james/jmap/send/MailFactory.java
+++ b/server/protocols/jmap/src/main/java/org/apache/james/jmap/send/MailFactory.java
@@ -20,60 +20,30 @@
 package org.apache.james.jmap.send;
 
 import java.io.IOException;
-import java.util.List;
-import java.util.Set;
-import java.util.stream.Collectors;
 
 import javax.mail.MessagingException;
-import javax.mail.internet.AddressException;
 
-import org.apache.james.server.core.MailImpl;
-import org.apache.james.jmap.model.Emailer;
-import org.apache.james.jmap.model.Message;
+import org.apache.james.core.MailAddress;
+import org.apache.james.jmap.model.Envelope;
 import org.apache.james.jmap.model.MessageFactory.MetaDataWithContent;
+import org.apache.james.server.core.MailImpl;
 import org.apache.mailet.Mail;
-import org.apache.james.core.MailAddress;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
 
 import com.google.common.annotations.VisibleForTesting;
-import com.google.common.base.Preconditions;
-import com.google.common.base.Throwables;
 import com.google.common.collect.ImmutableSet;
 import com.google.common.collect.Sets;
 
 public class MailFactory {
-    private static final Logger LOGGER = LoggerFactory.getLogger(MailFactory.class);
     
     @VisibleForTesting MailFactory() {
     }
 
-    public Mail build(MetaDataWithContent message, Message jmapMessage) throws MessagingException, IOException {
-        MailAddress sender = jmapMessage.getFrom()
-                .map(this::emailerToMailAddress)
-                .orElseThrow(() -> new RuntimeException("Sender is mandatory"));
-        Set<MailAddress> to = emailersToMailAddressSet(jmapMessage.getTo());
-        Set<MailAddress> cc = emailersToMailAddressSet(jmapMessage.getCc());
-        Set<MailAddress> bcc = emailersToMailAddressSet(jmapMessage.getBcc());
+    public Mail build(MetaDataWithContent message, Envelope envelope) throws MessagingException, IOException {
         ImmutableSet<MailAddress> recipients = Sets.union(
-                Sets.union(to, cc),
-                bcc).immutableCopy();
-        return new MailImpl(jmapMessage.getId().serialize(), sender, recipients, message.getContent());
+            Sets.union(envelope.getTo(), envelope.getCc()),
+                envelope.getBcc()).immutableCopy();
+        return new MailImpl(message.getMessageId().serialize(),
+            envelope.getFrom(), recipients, message.getContent());
     }
 
-    private MailAddress emailerToMailAddress(Emailer emailer) {
-        Preconditions.checkArgument(emailer.getEmail().isPresent(), "eMailer mail address should be present when sending a mail using JMAP");
-        try {
-            return new MailAddress(emailer.getEmail().get());
-        } catch (AddressException e) {
-            LOGGER.error("Invalid mail address", emailer.getEmail());
-            throw Throwables.propagate(e);
-        }
-    }
-
-    private Set<MailAddress> emailersToMailAddressSet(List<Emailer> emailers) {
-        return emailers.stream()
-            .map(this::emailerToMailAddress)
-            .collect(Collectors.toSet());
-    }
 }

http://git-wip-us.apache.org/repos/asf/james-project/blob/a04c071c/server/protocols/jmap/src/test/java/org/apache/james/jmap/send/MailFactoryTest.java
----------------------------------------------------------------------
diff --git a/server/protocols/jmap/src/test/java/org/apache/james/jmap/send/MailFactoryTest.java b/server/protocols/jmap/src/test/java/org/apache/james/jmap/send/MailFactoryTest.java
index 501e9c1..7dfffc1 100644
--- a/server/protocols/jmap/src/test/java/org/apache/james/jmap/send/MailFactoryTest.java
+++ b/server/protocols/jmap/src/test/java/org/apache/james/jmap/send/MailFactoryTest.java
@@ -29,6 +29,7 @@ import java.util.Collection;
 import javax.mail.util.SharedByteArrayInputStream;
 
 import org.apache.james.core.MailAddress;
+import org.apache.james.jmap.model.Envelope;
 import org.apache.james.jmap.model.Keyword;
 import org.apache.james.jmap.model.Keywords;
 import org.apache.james.jmap.model.Message;
@@ -57,6 +58,7 @@ public class MailFactoryTest {
     private MailFactory testee;
     private MetaDataWithContent message;
     private Message jmapMessage;
+    private Envelope envelope;
 
     @Before
     public void init() throws MailboxException {
@@ -88,11 +90,12 @@ public class MailFactoryTest {
         when(blobManager.toBlobId(any(MessageId.class))).thenReturn(BlobId.fromString("fake"));
         MessageFactory messageFactory = new MessageFactory(blobManager, messagePreview, messageContentExtractor, htmlTextExtractor);
         jmapMessage = messageFactory.fromMetaDataWithContent(message);
+        envelope = Envelope.fromMessage(jmapMessage);
     }
 
     @Test(expected=NullPointerException.class)
     public void buildMailShouldThrowWhenNullMailboxMessage() throws Exception {
-        testee.build(null, jmapMessage);
+        testee.build(null, envelope);
     }
 
     @Test(expected=NullPointerException.class)
@@ -110,7 +113,7 @@ public class MailFactoryTest {
                 new MailAddress("2@example.com"),
                 new MailAddress("4@example.com"));
         
-        Mail actual = testee.build(message, jmapMessage);
+        Mail actual = testee.build(message, envelope);
         
         assertThat(actual.getName()).isEqualTo(expectedName);
         assertThat(actual.getSender()).isEqualTo(expectedSender);


---------------------------------------------------------------------
To unsubscribe, e-mail: server-dev-unsubscribe@james.apache.org
For additional commands, e-mail: server-dev-help@james.apache.org