You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@james.apache.org by bt...@apache.org on 2023/04/04 02:45:48 UTC

[james-project] branch master updated (3388bfce19 -> 2238ea2377)

This is an automated email from the ASF dual-hosted git repository.

btellier pushed a change to branch master
in repository https://gitbox.apache.org/repos/asf/james-project.git


    from 3388bfce19 JAMES-3898 VacationMailet should Q-Encode special characters (#1508)
     new 22a1d2ff5f [UPGRADE] MIME4J 0.8.7 -> 0.8.9
     new f85fc5815b [REFACTORING] Remove unused method
     new f2f0496d51 [REFACTORING] Remove unused methods in MessageSearches
     new d4a3b1d6d8 [UPGRADE] Mime4J 0.8.9: dispose messages
     new 3310c26851 [UPGRADE] Mime4J 0.8.9: dispose messages
     new efa99fb411 [UPGRADE] Mime4J 0.8.9: dispose messages
     new 0be6921d5c [UPGRADE] Mime4J 0.8.9: use TextBody::getCharset
     new 971362e643 [UPGRADE] Mime4J 0.8.9: use SingleBody::size
     new 2238ea2377 [UPGRADE] Mime4J 0.8.9: use TextBody::getCharset

The 9 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails.  The revisions
listed as "add" were already present in the repository and have only
been added to this reference.


Summary of changes:
 .../model/openjpa/AbstractJPAMailboxMessage.java   |   6 +-
 .../james/vault/DeletedMessageConverter.java       |   4 +-
 .../apache/james/mailbox/store/MessageStorer.java  |  16 ++-
 .../store/mail/model/impl/MessageParser.java       |  45 ++++--
 .../mailbox/store/search/MessageSearches.java      |  32 -----
 .../store/mail/model/impl/MessageParserTest.java   | 157 +++++++++++----------
 pom.xml                                            |   2 +-
 .../james/util/mime/MessageContentExtractor.java   |  11 +-
 .../org/apache/james/jmap/api/model/Preview.java   |   7 +-
 .../jmap/draft/methods/MIMEMessageConverter.java   |   5 +-
 .../james/jmap/draft/methods/MessageAppender.java  |   1 +
 .../james/jmap/draft/methods/SendMDNProcessor.java |   1 +
 .../mailet/ExtractMDNOriginalJMAPMessageId.java    |   1 +
 .../draft/methods/MIMEMessageConverterTest.java    |  14 +-
 .../org/apache/james/jmap/mail/EmailBodyPart.scala |  28 ++--
 .../data/jmap/EmailQueryViewPopulator.java         |   1 +
 .../org/apache/james/webadmin/dto/MailDto.java     |   8 +-
 17 files changed, 174 insertions(+), 165 deletions(-)


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


[james-project] 08/09: [UPGRADE] Mime4J 0.8.9: use SingleBody::size

Posted by bt...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

btellier pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/james-project.git

commit 971362e643671051cf680e1c8ba50a5081029930
Author: Benoit Tellier <bt...@linagora.com>
AuthorDate: Thu Jan 12 10:44:57 2023 +0700

    [UPGRADE] Mime4J 0.8.9: use SingleBody::size
---
 .../org/apache/james/jmap/mail/EmailBodyPart.scala  | 21 +++++++++++++--------
 1 file changed, 13 insertions(+), 8 deletions(-)

diff --git a/server/protocols/jmap-rfc-8621/src/main/scala/org/apache/james/jmap/mail/EmailBodyPart.scala b/server/protocols/jmap-rfc-8621/src/main/scala/org/apache/james/jmap/mail/EmailBodyPart.scala
index 142c244bb8..52adbba120 100644
--- a/server/protocols/jmap-rfc-8621/src/main/scala/org/apache/james/jmap/mail/EmailBodyPart.scala
+++ b/server/protocols/jmap-rfc-8621/src/main/scala/org/apache/james/jmap/mail/EmailBodyPart.scala
@@ -37,7 +37,7 @@ import org.apache.james.jmap.mail.PartId.PartIdValue
 import org.apache.james.mailbox.model.{Cid, MessageAttachmentMetadata, MessageId, MessageResult}
 import org.apache.james.mime4j.codec.{DecodeMonitor, DecoderUtil}
 import org.apache.james.mime4j.dom.field.{ContentDispositionField, ContentLanguageField, ContentTypeField, FieldName}
-import org.apache.james.mime4j.dom.{Entity, Message, Multipart, TextBody => Mime4JTextBody}
+import org.apache.james.mime4j.dom.{Entity, Message, Multipart, SingleBody, TextBody => Mime4JTextBody}
 import org.apache.james.mime4j.message.{DefaultMessageBuilder, DefaultMessageWriter}
 import org.apache.james.mime4j.stream.{Field, MimeConfig, RawField}
 import org.apache.james.util.html.HtmlTextExtractor
@@ -175,14 +175,19 @@ object EmailBodyPart {
     .headOption
     .map(_.getBody)
 
-  private def size(entity: Entity): Try[Size] = {
-    val countingOutputStream: CountingOutputStream = new CountingOutputStream(OutputStream.nullOutputStream())
-    val writer = new DefaultMessageWriter
-    writer.writeBody(entity.getBody, countingOutputStream)
-    refineV[NonNegative](countingOutputStream.getCount) match {
-      case scala.Right(size) => Success(size)
-      case Left(e) => Failure(new IllegalArgumentException(e))
+  private def size(entity: Entity): Try[Size] =
+    entity.getBody match {
+      case body: SingleBody => refineSize(body.size())
+      case body =>
+        val countingOutputStream: CountingOutputStream = new CountingOutputStream(OutputStream.nullOutputStream())
+        val writer = new DefaultMessageWriter
+        writer.writeBody(body, countingOutputStream)
+        refineSize(countingOutputStream.getCount)
     }
+
+  private def refineSize(l: Long): Try[Size] = refineV[NonNegative](l) match {
+    case scala.Right(size) => Success(size)
+    case Left(e) => Failure(new IllegalArgumentException(e))
   }
 
   private def zip[A, B](a: Try[A], b: Try[B]): Try[(A, B)] = for {


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


[james-project] 03/09: [REFACTORING] Remove unused methods in MessageSearches

Posted by bt...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

btellier pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/james-project.git

commit f2f0496d519be9a392d3e8841ba74068497cf985
Author: Benoit Tellier <bt...@linagora.com>
AuthorDate: Wed Jan 11 15:38:16 2023 +0700

    [REFACTORING] Remove unused methods in MessageSearches
---
 .../apache/james/mailbox/store/search/MessageSearches.java | 14 --------------
 1 file changed, 14 deletions(-)

diff --git a/mailbox/store/src/main/java/org/apache/james/mailbox/store/search/MessageSearches.java b/mailbox/store/src/main/java/org/apache/james/mailbox/store/search/MessageSearches.java
index 4d59dfcb73..d09ccd5f13 100644
--- a/mailbox/store/src/main/java/org/apache/james/mailbox/store/search/MessageSearches.java
+++ b/mailbox/store/src/main/java/org/apache/james/mailbox/store/search/MessageSearches.java
@@ -60,12 +60,10 @@ import org.apache.james.mime4j.dom.address.Group;
 import org.apache.james.mime4j.dom.address.Mailbox;
 import org.apache.james.mime4j.dom.address.MailboxList;
 import org.apache.james.mime4j.dom.datetime.DateTime;
-import org.apache.james.mime4j.field.Fields;
 import org.apache.james.mime4j.field.address.AddressFormatter;
 import org.apache.james.mime4j.field.address.LenientAddressParser;
 import org.apache.james.mime4j.field.datetime.parser.DateTimeParser;
 import org.apache.james.mime4j.field.datetime.parser.ParseException;
-import org.apache.james.mime4j.message.HeaderImpl;
 import org.apache.james.mime4j.util.MimeUtil;
 import org.apache.james.mime4j.utils.search.MessageMatcher;
 import org.slf4j.Logger;
@@ -270,18 +268,6 @@ public class MessageSearches implements Iterable<SimpleMessageSearchIndex.Search
             return Stream.of();
         }
     }
-
-    private void addFrom(HeaderImpl headerImpl, MailboxList from) {
-        if (from != null) {
-            headerImpl.addField(Fields.from(Lists.newArrayList(from.iterator())));
-        }
-    }
-
-    private void addAddressList(HeaderImpl headerImpl, AddressList addressList) {
-        if (addressList != null) {
-            headerImpl.addField(Fields.to(Lists.newArrayList(addressList.iterator())));
-        }
-    }
     
     private boolean matches(SearchQuery.ConjunctionCriterion criterion, MailboxMessage message,
             final Collection<MessageUid> recentMessageUids) throws MailboxException {


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


[james-project] 05/09: [UPGRADE] Mime4J 0.8.9: dispose messages

Posted by bt...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

btellier pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/james-project.git

commit 3310c2685154ca06213416bea0b0348684d0822f
Author: Benoit Tellier <bt...@linagora.com>
AuthorDate: Thu Jan 12 10:36:01 2023 +0700

    [UPGRADE] Mime4J 0.8.9: dispose messages
---
 .../model/openjpa/AbstractJPAMailboxMessage.java   |   6 +-
 .../apache/james/mailbox/store/MessageStorer.java  |  15 +-
 .../store/mail/model/impl/MessageParser.java       |  25 +++-
 .../store/mail/model/impl/MessageParserTest.java   | 157 +++++++++++----------
 4 files changed, 116 insertions(+), 87 deletions(-)

diff --git a/mailbox/jpa/src/main/java/org/apache/james/mailbox/jpa/mail/model/openjpa/AbstractJPAMailboxMessage.java b/mailbox/jpa/src/main/java/org/apache/james/mailbox/jpa/mail/model/openjpa/AbstractJPAMailboxMessage.java
index d8c40546db..2b9887f18b 100644
--- a/mailbox/jpa/src/main/java/org/apache/james/mailbox/jpa/mail/model/openjpa/AbstractJPAMailboxMessage.java
+++ b/mailbox/jpa/src/main/java/org/apache/james/mailbox/jpa/mail/model/openjpa/AbstractJPAMailboxMessage.java
@@ -529,12 +529,16 @@ public abstract class AbstractJPAMailboxMessage implements MailboxMessage {
     public List<MessageAttachmentMetadata> getAttachments() {
         try {
             AtomicInteger counter = new AtomicInteger(0);
-            return new MessageParser().retrieveAttachments(getFullContent())
+            MessageParser.ParsingResult parsingResult = new MessageParser().retrieveAttachments(getFullContent());
+            ImmutableList<MessageAttachmentMetadata> result = parsingResult
+                .getAttachments()
                 .stream()
                 .map(Throwing.<ParsedAttachment, MessageAttachmentMetadata>function(
                     attachmentMetadata -> attachmentMetadata.asMessageAttachment(generateFixedAttachmentId(counter.incrementAndGet()), getMessageId()))
                     .sneakyThrow())
                 .collect(ImmutableList.toImmutableList());
+            parsingResult.dispose();
+            return result;
         } catch (IOException e) {
             throw new RuntimeException(e);
         }
diff --git a/mailbox/store/src/main/java/org/apache/james/mailbox/store/MessageStorer.java b/mailbox/store/src/main/java/org/apache/james/mailbox/store/MessageStorer.java
index b612de7b45..bebe032181 100644
--- a/mailbox/store/src/main/java/org/apache/james/mailbox/store/MessageStorer.java
+++ b/mailbox/store/src/main/java/org/apache/james/mailbox/store/MessageStorer.java
@@ -119,25 +119,28 @@ public interface MessageStorer {
         }
 
         private Mono<List<MessageAttachmentMetadata>> storeAttachments(MessageId messageId, Content messageContent, Optional<Message> maybeMessage, MailboxSession session) {
-            List<ParsedAttachment> attachments = extractAttachments(messageContent, maybeMessage);
+            MessageParser.ParsingResult attachments = extractAttachments(messageContent, maybeMessage);
             return attachmentMapperFactory.getAttachmentMapper(session)
-                .storeAttachmentsReactive(attachments, messageId);
+                .storeAttachmentsReactive(attachments.getAttachments(), messageId)
+                .doFinally(any -> attachments.dispose());
         }
 
-        private List<ParsedAttachment> extractAttachments(Content contentIn, Optional<Message> maybeMessage) {
+        private MessageParser.ParsingResult extractAttachments(Content contentIn, Optional<Message> maybeMessage) {
             return maybeMessage.map(message -> {
                 try {
-                    return messageParser.retrieveAttachments(message);
+                    return new MessageParser.ParsingResult(messageParser.retrieveAttachments(message), () -> {
+
+                    });
                 } catch (Exception e) {
                     LOGGER.warn("Error while parsing mail's attachments: {}", e.getMessage(), e);
-                    return ImmutableList.<ParsedAttachment>of();
+                    return MessageParser.ParsingResult.EMPTY;
                 }
             }).orElseGet(() -> {
                 try (InputStream inputStream = contentIn.getInputStream()) {
                     return messageParser.retrieveAttachments(inputStream);
                 } catch (Exception e) {
                     LOGGER.warn("Error while parsing mail's attachments: {}", e.getMessage(), e);
-                    return ImmutableList.of();
+                    return MessageParser.ParsingResult.EMPTY;
                 }
             });
         }
diff --git a/mailbox/store/src/main/java/org/apache/james/mailbox/store/mail/model/impl/MessageParser.java b/mailbox/store/src/main/java/org/apache/james/mailbox/store/mail/model/impl/MessageParser.java
index 482685905b..9488adc510 100644
--- a/mailbox/store/src/main/java/org/apache/james/mailbox/store/mail/model/impl/MessageParser.java
+++ b/mailbox/store/src/main/java/org/apache/james/mailbox/store/mail/model/impl/MessageParser.java
@@ -54,6 +54,27 @@ import com.google.common.collect.ImmutableList;
 import com.google.common.io.ByteSource;
 
 public class MessageParser {
+    public static class ParsingResult {
+        public static final ParsingResult EMPTY = new ParsingResult(ImmutableList.of(), () -> {
+
+        });
+
+        private final List<ParsedAttachment> attachments;
+        private final Runnable dispose;
+
+        public ParsingResult(List<ParsedAttachment> attachments, Runnable dispose) {
+            this.attachments = attachments;
+            this.dispose = dispose;
+        }
+
+        public List<ParsedAttachment> getAttachments() {
+            return attachments;
+        }
+
+        public void dispose() {
+            dispose.run();
+        }
+    }
 
     private static final String TEXT_MEDIA_TYPE = "text";
     private static final String CONTENT_TYPE = "Content-Type";
@@ -81,12 +102,12 @@ public class MessageParser {
             .unwrap();
     }
 
-    public List<ParsedAttachment> retrieveAttachments(InputStream fullContent) throws IOException {
+    public ParsingResult retrieveAttachments(InputStream fullContent) throws IOException {
         DefaultMessageBuilder defaultMessageBuilder = new DefaultMessageBuilder();
         defaultMessageBuilder.setMimeEntityConfig(MimeConfig.PERMISSIVE);
         defaultMessageBuilder.setDecodeMonitor(DecodeMonitor.SILENT);
         Message message = defaultMessageBuilder.parseMessage(fullContent);
-        return retrieveAttachments(message);
+        return new ParsingResult(retrieveAttachments(message), message::dispose);
     }
 
     public List<ParsedAttachment> retrieveAttachments(Message message) throws IOException {
diff --git a/mailbox/store/src/test/java/org/apache/james/mailbox/store/mail/model/impl/MessageParserTest.java b/mailbox/store/src/test/java/org/apache/james/mailbox/store/mail/model/impl/MessageParserTest.java
index e4af546c26..eff94b64a0 100644
--- a/mailbox/store/src/test/java/org/apache/james/mailbox/store/mail/model/impl/MessageParserTest.java
+++ b/mailbox/store/src/test/java/org/apache/james/mailbox/store/mail/model/impl/MessageParserTest.java
@@ -50,120 +50,120 @@ class MessageParserTest {
 
     @Test
     void getAttachmentsShouldBeEmptyWhenNoAttachment() throws Exception {
-        List<ParsedAttachment> attachments = testee.retrieveAttachments(ClassLoader.getSystemResourceAsStream("eml/noAttachment.eml"));
+        MessageParser.ParsingResult attachments = testee.retrieveAttachments(ClassLoader.getSystemResourceAsStream("eml/noAttachment.eml"));
 
-        assertThat(attachments).isEmpty();
+        assertThat(attachments.getAttachments()).isEmpty();
     }
 
     @Test
     void getAttachmentsShouldIgnoreInlineWhenMixedMultipart() throws Exception {
-        List<ParsedAttachment> attachments = testee.retrieveAttachments(ClassLoader.getSystemResourceAsStream("eml/inlined-mixed.eml"));
+        MessageParser.ParsingResult attachments = testee.retrieveAttachments(ClassLoader.getSystemResourceAsStream("eml/inlined-mixed.eml"));
 
-        assertThat(attachments).hasSize(2);
+        assertThat(attachments.getAttachments()).hasSize(2);
     }
 
     @Test
     void getAttachmentsShouldRetrieveAttachmentsWhenOneAttachment() throws Exception {
-        List<ParsedAttachment> attachments = testee.retrieveAttachments(ClassLoader.getSystemResourceAsStream("eml/oneAttachmentAndSomeTextInlined.eml"));
+        MessageParser.ParsingResult attachments = testee.retrieveAttachments(ClassLoader.getSystemResourceAsStream("eml/oneAttachmentAndSomeTextInlined.eml"));
 
-        assertThat(attachments).hasSize(1);
+        assertThat(attachments.getAttachments()).hasSize(1);
     }
 
     @Test
     void getAttachmentsShouldRetrieveAttachmentNameWhenOne() throws Exception {
-        List<ParsedAttachment> attachments = testee.retrieveAttachments(ClassLoader.getSystemResourceAsStream("eml/oneAttachmentAndSomeTextInlined.eml"));
+        MessageParser.ParsingResult attachments = testee.retrieveAttachments(ClassLoader.getSystemResourceAsStream("eml/oneAttachmentAndSomeTextInlined.eml"));
 
-        assertThat(attachments).hasSize(1);
+        assertThat(attachments.getAttachments()).hasSize(1);
         Optional<String> expectedName = Optional.of("exploits_of_a_mom.png");
-        assertThat(attachments.get(0).getName()).isEqualTo(expectedName);
+        assertThat(attachments.getAttachments().get(0).getName()).isEqualTo(expectedName);
     }
 
     @Test
     void getAttachmentsShouldRetrieveAttachmentNameWhenOneContainingNonASCIICharacters() throws Exception {
-        List<ParsedAttachment> attachments = testee.retrieveAttachments(ClassLoader.getSystemResourceAsStream("eml/messageWithNonASCIIFilenameAttachment.eml"));
-        assertThat(attachments).hasSize(1);
-        assertThat(attachments.get(0).getName()).contains("ديناصور.odt");
+        MessageParser.ParsingResult attachments = testee.retrieveAttachments(ClassLoader.getSystemResourceAsStream("eml/messageWithNonASCIIFilenameAttachment.eml"));
+        assertThat(attachments.getAttachments()).hasSize(1);
+        assertThat(attachments.getAttachments().get(0).getName()).contains("ديناصور.odt");
     }
 
     @Test
     void getAttachmentsShouldRetrieveEmptyNameWhenNone() throws Exception {
-        List<ParsedAttachment> attachments = testee.retrieveAttachments(ClassLoader.getSystemResourceAsStream("eml/oneAttachmentWithoutName.eml"));
+        MessageParser.ParsingResult attachments = testee.retrieveAttachments(ClassLoader.getSystemResourceAsStream("eml/oneAttachmentWithoutName.eml"));
 
-        assertThat(attachments).hasSize(1);
-        assertThat(attachments.get(0).getName()).isEqualTo(Optional.empty());
+        assertThat(attachments.getAttachments()).hasSize(1);
+        assertThat(attachments.getAttachments().get(0).getName()).isEqualTo(Optional.empty());
     }
 
     @Test
     void getAttachmentsShouldNotFailWhenContentTypeIsNotHere() throws Exception {
-        List<ParsedAttachment> attachments = testee.retrieveAttachments(ClassLoader.getSystemResourceAsStream("eml/oneAttachmentWithoutContentType.eml"));
+        MessageParser.ParsingResult attachments = testee.retrieveAttachments(ClassLoader.getSystemResourceAsStream("eml/oneAttachmentWithoutContentType.eml"));
 
-        assertThat(attachments).hasSize(1);
-        assertThat(attachments.get(0).getContentType())
+        assertThat(attachments.getAttachments()).hasSize(1);
+        assertThat(attachments.getAttachments().get(0).getContentType())
             .isEqualTo(ContentType.of("application/octet-stream"));
     }
 
     @Test
     void getAttachmentsShouldNotFailWhenContentTypeIsEmpty() throws Exception {
-        List<ParsedAttachment> attachments = testee.retrieveAttachments(ClassLoader.getSystemResourceAsStream("eml/oneAttachmentWithEmptyContentType.eml"));
+        MessageParser.ParsingResult attachments = testee.retrieveAttachments(ClassLoader.getSystemResourceAsStream("eml/oneAttachmentWithEmptyContentType.eml"));
 
-        assertThat(attachments).hasSize(1);
-        assertThat(attachments.get(0).getContentType())
+        assertThat(attachments.getAttachments()).hasSize(1);
+        assertThat(attachments.getAttachments().get(0).getContentType())
             .isEqualTo(ContentType.of("application/octet-stream"));
     }
 
     @Test
     void getAttachmentsShouldRetrieveTheAttachmentContentTypeWhenOneAttachment() throws Exception {
-        List<ParsedAttachment> attachments = testee.retrieveAttachments(ClassLoader.getSystemResourceAsStream("eml/oneAttachmentAndSomeTextInlined.eml"));
+        MessageParser.ParsingResult attachments = testee.retrieveAttachments(ClassLoader.getSystemResourceAsStream("eml/oneAttachmentAndSomeTextInlined.eml"));
 
-        assertThat(attachments).hasSize(1);
-        assertThat(attachments.get(0).getContentType())
+        assertThat(attachments.getAttachments()).hasSize(1);
+        assertThat(attachments.getAttachments().get(0).getContentType())
             .isEqualTo(ContentType.of("application/octet-stream;\tname=\"exploits_of_a_mom.png\""));
     }
 
     @Test
     void retrieveAttachmentsShouldNotFailOnMessagesWithManyHeaders() throws Exception {
-        List<ParsedAttachment> messageAttachments = testee.retrieveAttachments(ClassLoader.getSystemResourceAsStream("eml/mailWithManyHeaders.eml"));
+        MessageParser.ParsingResult attachments = testee.retrieveAttachments(ClassLoader.getSystemResourceAsStream("eml/mailWithManyHeaders.eml"));
 
-        assertThat(messageAttachments).hasSize(1);
+        assertThat(attachments.getAttachments()).hasSize(1);
     }
 
     @Test
     void retrieveAttachmentsShouldNotFailOnMessagesWithLongHeaders() throws Exception {
-        List<ParsedAttachment> messageAttachments = testee.retrieveAttachments(ClassLoader.getSystemResourceAsStream("eml/mailWithLongHeaders.eml"));
+        MessageParser.ParsingResult attachments = testee.retrieveAttachments(ClassLoader.getSystemResourceAsStream("eml/mailWithLongHeaders.eml"));
 
-        assertThat(messageAttachments).hasSize(1);
+        assertThat(attachments.getAttachments()).hasSize(1);
     }
 
     @Test
     void getAttachmentsShouldRetrieveTheAttachmentContentTypeWhenOneAttachmentWithSimpleContentType() throws Exception {
-        List<ParsedAttachment> attachments = testee.retrieveAttachments(ClassLoader.getSystemResourceAsStream("eml/oneAttachmentWithSimpleContentType.eml"));
+        MessageParser.ParsingResult attachments = testee.retrieveAttachments(ClassLoader.getSystemResourceAsStream("eml/oneAttachmentWithSimpleContentType.eml"));
 
-        assertThat(attachments).hasSize(1);
-        assertThat(attachments.get(0).getContentType())
+        assertThat(attachments.getAttachments()).hasSize(1);
+        assertThat(attachments.getAttachments().get(0).getContentType())
             .isEqualTo(ContentType.of("application/octet-stream"));
     }
 
     @Test
     void getAttachmentsShouldReturnTheExpectedAttachment() throws Exception {
-        List<ParsedAttachment> attachments = testee.retrieveAttachments(ClassLoader.getSystemResourceAsStream("eml/oneAttachmentAndSomeTextInlined.eml"));
+        MessageParser.ParsingResult attachments = testee.retrieveAttachments(ClassLoader.getSystemResourceAsStream("eml/oneAttachmentAndSomeTextInlined.eml"));
 
-        ParsedAttachment attachment = attachments.get(0);
+        ParsedAttachment attachment = attachments.getAttachments().get(0);
         assertThat(attachment.getContent().openStream())
             .hasSameContentAs(ClassLoader.getSystemResourceAsStream("eml/gimp.png"));
     }
 
     @Test
     void getAttachmentsShouldRetrieveAttachmentsWhenTwo() throws Exception {
-        List<ParsedAttachment> attachments = testee.retrieveAttachments(ClassLoader.getSystemResourceAsStream("eml/twoAttachments.eml"));
+        MessageParser.ParsingResult attachments = testee.retrieveAttachments(ClassLoader.getSystemResourceAsStream("eml/twoAttachments.eml"));
 
-        assertThat(attachments).hasSize(2);
+        assertThat(attachments.getAttachments()).hasSize(2);
     }
 
     @Test
     void retrieveAttachmentShouldUseFilenameAsNameWhenNoName() throws Exception {
-        List<ParsedAttachment> attachments = testee.retrieveAttachments(ClassLoader.getSystemResourceAsStream("eml/filenameOnly.eml"));
+        MessageParser.ParsingResult attachments = testee.retrieveAttachments(ClassLoader.getSystemResourceAsStream("eml/filenameOnly.eml"));
 
-        assertThat(attachments).hasSize(1)
+        assertThat(attachments.getAttachments()).hasSize(1)
             .extracting(ParsedAttachment::getName)
             .allMatch(Optional::isPresent)
             .extracting(Optional::get)
@@ -172,9 +172,9 @@ class MessageParserTest {
 
     @Test
     void retrieveAttachmentShouldUseNameWhenBothNameAndFilename() throws Exception {
-        List<ParsedAttachment> attachments = testee.retrieveAttachments(ClassLoader.getSystemResourceAsStream("eml/filenameAndName.eml"));
+        MessageParser.ParsingResult attachments = testee.retrieveAttachments(ClassLoader.getSystemResourceAsStream("eml/filenameAndName.eml"));
 
-        assertThat(attachments).hasSize(1)
+        assertThat(attachments.getAttachments()).hasSize(1)
             .extracting(ParsedAttachment::getName)
             .allMatch(Optional::isPresent)
             .extracting(Optional::get)
@@ -183,104 +183,104 @@ class MessageParserTest {
 
     @Test
     void getAttachmentsShouldRetrieveEmbeddedAttachmentsWhenSome() throws Exception {
-        List<ParsedAttachment> attachments = testee.retrieveAttachments(ClassLoader.getSystemResourceAsStream("eml/embeddedAttachmentWithInline.eml"));
+        MessageParser.ParsingResult attachments = testee.retrieveAttachments(ClassLoader.getSystemResourceAsStream("eml/embeddedAttachmentWithInline.eml"));
 
-        assertThat(attachments).hasSize(1);
+        assertThat(attachments.getAttachments()).hasSize(1);
     }
 
     @Test
     void getAttachmentsShouldRetrieveInlineAttachmentsWhenSome() throws Exception {
-        List<ParsedAttachment> attachments = testee.retrieveAttachments(ClassLoader.getSystemResourceAsStream("eml/embeddedAttachmentWithAttachment.eml"));
+        MessageParser.ParsingResult attachments = testee.retrieveAttachments(ClassLoader.getSystemResourceAsStream("eml/embeddedAttachmentWithAttachment.eml"));
 
-        assertThat(attachments).hasSize(1);
+        assertThat(attachments.getAttachments()).hasSize(1);
     }
 
     @Test
     void getAttachmentsShouldRetrieveTheAttachmentCIDWhenOne() throws Exception {
-        List<ParsedAttachment> attachments = testee.retrieveAttachments(ClassLoader.getSystemResourceAsStream("eml/oneInlinedAttachment.eml"));
+        MessageParser.ParsingResult attachments = testee.retrieveAttachments(ClassLoader.getSystemResourceAsStream("eml/oneInlinedAttachment.eml"));
 
-        assertThat(attachments).hasSize(1);
-        assertThat(attachments.get(0).getCid()).isEqualTo(Optional.of(Cid.from("part1.37A15C92.A7C3488D@linagora.com")));
+        assertThat(attachments.getAttachments()).hasSize(1);
+        assertThat(attachments.getAttachments().get(0).getCid()).isEqualTo(Optional.of(Cid.from("part1.37A15C92.A7C3488D@linagora.com")));
     }
 
     @Test
     void getAttachmentsShouldSetInlineWhenOneInlinedAttachment() throws Exception {
-        List<ParsedAttachment> attachments = testee.retrieveAttachments(ClassLoader.getSystemResourceAsStream("eml/oneInlinedAttachment.eml"));
+        MessageParser.ParsingResult attachments = testee.retrieveAttachments(ClassLoader.getSystemResourceAsStream("eml/oneInlinedAttachment.eml"));
 
-        assertThat(attachments).hasSize(1);
-        assertThat(attachments.get(0).isInline()).isTrue();
+        assertThat(attachments.getAttachments()).hasSize(1);
+        assertThat(attachments.getAttachments().get(0).isInline()).isTrue();
     }
 
     @Test
     void getAttachementsShouldRetrieveHtmlAttachementsWhenSome() throws Exception {
-        List<ParsedAttachment> attachments = testee.retrieveAttachments(ClassLoader.getSystemResourceAsStream("eml/oneHtmlAttachmentAndSomeTextInlined.eml"));
+        MessageParser.ParsingResult attachments = testee.retrieveAttachments(ClassLoader.getSystemResourceAsStream("eml/oneHtmlAttachmentAndSomeTextInlined.eml"));
 
-        assertThat(attachments).hasSize(1);
+        assertThat(attachments.getAttachments()).hasSize(1);
     }
 
     @Test
     void getAttachementsShouldRetrieveAttachmentsWhenSomeAreInTheMultipartAlternative() throws Exception {
-        List<ParsedAttachment> attachments = testee.retrieveAttachments(ClassLoader.getSystemResourceAsStream("eml/invitationEmailFromOP.eml"));
+        MessageParser.ParsingResult attachments = testee.retrieveAttachments(ClassLoader.getSystemResourceAsStream("eml/invitationEmailFromOP.eml"));
         
-        assertThat(attachments).hasSize(6);
+        assertThat(attachments.getAttachments()).hasSize(6);
     }
 
     @Test
     void getAttachmentsShouldNotConsiderUnknownContentDispositionAsAttachments() throws Exception {
-        List<ParsedAttachment> attachments = testee.retrieveAttachments(ClassLoader.getSystemResourceAsStream("eml/unknownDisposition.eml"));
+        MessageParser.ParsingResult attachments = testee.retrieveAttachments(ClassLoader.getSystemResourceAsStream("eml/unknownDisposition.eml"));
 
-        assertThat(attachments).hasSize(0);
+        assertThat(attachments.getAttachments()).hasSize(0);
     }
 
     @Test
     void getAttachmentsShouldConsiderNoContentDispositionAsAttachmentsWhenCID() throws Exception {
-        List<ParsedAttachment> attachments = testee.retrieveAttachments(ClassLoader.getSystemResourceAsStream("eml/noContentDispositionWithCID.eml"));
+        MessageParser.ParsingResult attachments = testee.retrieveAttachments(ClassLoader.getSystemResourceAsStream("eml/noContentDispositionWithCID.eml"));
 
-        assertThat(attachments).hasSize(1);
+        assertThat(attachments.getAttachments()).hasSize(1);
     }
 
     @Test
     void getAttachmentsShouldRetrieveAttachmentsWhenNoCidForInlined() throws Exception {
-        List<ParsedAttachment> attachments = testee.retrieveAttachments(ClassLoader.getSystemResourceAsStream("eml/oneInlinedAttachmentWithNoCid.eml"));
+        MessageParser.ParsingResult attachments = testee.retrieveAttachments(ClassLoader.getSystemResourceAsStream("eml/oneInlinedAttachmentWithNoCid.eml"));
 
-        assertThat(attachments).hasSize(1);
+        assertThat(attachments.getAttachments()).hasSize(1);
     }
 
     @Test
     void getAttachmentsShouldRetrieveAttachmentsWhenEmptyCidForInlined() throws Exception {
-        List<ParsedAttachment> attachments = testee.retrieveAttachments(ClassLoader.getSystemResourceAsStream("eml/oneInlinedAttachmentWithEmptyCid.eml"));
+        MessageParser.ParsingResult attachments = testee.retrieveAttachments(ClassLoader.getSystemResourceAsStream("eml/oneInlinedAttachmentWithEmptyCid.eml"));
 
-        assertThat(attachments).hasSize(1);
+        assertThat(attachments.getAttachments()).hasSize(1);
     }
 
     @Test
     void getAttachmentsShouldRetrieveAttachmentsWhenBlankCidForInlined() throws Exception {
-        List<ParsedAttachment> attachments = testee.retrieveAttachments(ClassLoader.getSystemResourceAsStream("eml/oneInlinedAttachmentWithBlankCid.eml"));
+        MessageParser.ParsingResult attachments = testee.retrieveAttachments(ClassLoader.getSystemResourceAsStream("eml/oneInlinedAttachmentWithBlankCid.eml"));
 
-        assertThat(attachments).hasSize(1);
+        assertThat(attachments.getAttachments()).hasSize(1);
     }
 
     @Test
     void getAttachmentsShouldRetrieveAttachmentsWhenOneFailOnWrongContentDisposition() throws Exception {
-        List<ParsedAttachment> attachments = testee.retrieveAttachments(ClassLoader.getSystemResourceAsStream("eml/multiAttachmentsWithOneWrongContentDisposition.eml"));
+        MessageParser.ParsingResult attachments = testee.retrieveAttachments(ClassLoader.getSystemResourceAsStream("eml/multiAttachmentsWithOneWrongContentDisposition.eml"));
 
-        assertThat(attachments).hasSize(2);
+        assertThat(attachments.getAttachments()).hasSize(2);
     }
 
     @Test
     void getAttachmentsShouldRetrieveOneAttachmentWhenMessageWithAttachmentContentDisposition() throws Exception {
-        List<ParsedAttachment> attachments = testee.retrieveAttachments(
+        MessageParser.ParsingResult attachments = testee.retrieveAttachments(
             ClassLoader.getSystemResourceAsStream("eml/emailWithOnlyAttachment.eml"));
 
-        assertThat(attachments).hasSize(1);
+        assertThat(attachments.getAttachments()).hasSize(1);
     }
 
     @Test
     void getAttachmentsShouldRetrieveCharset() throws Exception {
-        List<ParsedAttachment> attachments = testee.retrieveAttachments(
+        MessageParser.ParsingResult attachments = testee.retrieveAttachments(
             ClassLoader.getSystemResourceAsStream("eml/charset.eml"));
 
-        assertThat(attachments).hasSize(1)
+        assertThat(attachments.getAttachments()).hasSize(1)
             .first()
             .satisfies(attachment -> assertThat(attachment.getContentType())
                 .isEqualTo(ContentType.of("text/calendar; charset=\"iso-8859-1\"; method=COUNTER")));
@@ -288,10 +288,10 @@ class MessageParserTest {
 
     @Test
     void getAttachmentsShouldRetrieveAllPartsCharset() throws Exception {
-        List<ParsedAttachment> attachments = testee.retrieveAttachments(
+        MessageParser.ParsingResult attachments = testee.retrieveAttachments(
             ClassLoader.getSystemResourceAsStream("eml/charset2.eml"));
 
-        assertThat(attachments).hasSize(2)
+        assertThat(attachments.getAttachments()).hasSize(2)
             .extracting(ParsedAttachment::getContentType)
             .containsOnly(ContentType.of("text/calendar; charset=\"iso-8859-1\"; method=COUNTER"),
                 ContentType.of("text/calendar; charset=\"iso-4444-5\"; method=COUNTER"));
@@ -299,19 +299,19 @@ class MessageParserTest {
 
     @Test
     void getAttachmentsShouldNotConsiderTextCalendarAsAttachmentsByDefault() throws Exception {
-        List<ParsedAttachment> attachments = testee.retrieveAttachments(
+        MessageParser.ParsingResult attachments = testee.retrieveAttachments(
             ClassLoader.getSystemResourceAsStream("eml/calendar.eml"));
 
-        assertThat(attachments)
+        assertThat(attachments.getAttachments())
             .isEmpty();
     }
 
     @Test
     void getAttachmentsShouldConsiderTextCalendarAsAttachments() throws Exception {
-        List<ParsedAttachment> attachments = testee.retrieveAttachments(
+        MessageParser.ParsingResult attachments = testee.retrieveAttachments(
             ClassLoader.getSystemResourceAsStream("eml/calendar2.eml"));
 
-        assertThat(attachments)
+        assertThat(attachments.getAttachments())
             .hasSize(1)
             .extracting(ParsedAttachment::getContentType)
             .containsExactly(ContentType.of("text/calendar; charset=\"utf-8\"; method=COUNTER"));
@@ -319,10 +319,10 @@ class MessageParserTest {
 
     @Test
     void gpgSignatureShouldBeConsideredAsAnAttachment() throws Exception {
-        List<ParsedAttachment> attachments = testee.retrieveAttachments(
+        MessageParser.ParsingResult attachments = testee.retrieveAttachments(
             ClassLoader.getSystemResourceAsStream("eml/signedMessage.eml"));
 
-        assertThat(attachments).hasSize(2)
+        assertThat(attachments.getAttachments()).hasSize(2)
             .extracting(ParsedAttachment::getName)
             .allMatch(Optional::isPresent)
             .extracting(Optional::get)
@@ -348,7 +348,8 @@ class MessageParserTest {
             .asMime4JMessageBuilder()
             .build();
 
-        List<ParsedAttachment> result = testee.retrieveAttachments(new ByteArrayInputStream(DefaultMessageWriter.asBytes(message)));
+        List<ParsedAttachment> result = testee.retrieveAttachments(new ByteArrayInputStream(DefaultMessageWriter.asBytes(message)))
+            .getAttachments();
         assertThat(result).hasSize(1)
             .allMatch(attachment -> attachment.getContentType().equals(ContentType.of("message/disposition-notification; charset=UTF-8")));
     }


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


[james-project] 02/09: [REFACTORING] Remove unused method

Posted by bt...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

btellier pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/james-project.git

commit f85fc5815be08d8eaa50e442a33d19fa68bc1ec8
Author: Benoit Tellier <bt...@linagora.com>
AuthorDate: Wed Jan 11 15:37:09 2023 +0700

    [REFACTORING] Remove unused method
---
 .../james/mailbox/store/search/MessageSearches.java    | 18 ------------------
 1 file changed, 18 deletions(-)

diff --git a/mailbox/store/src/main/java/org/apache/james/mailbox/store/search/MessageSearches.java b/mailbox/store/src/main/java/org/apache/james/mailbox/store/search/MessageSearches.java
index 435be54147..4d59dfcb73 100644
--- a/mailbox/store/src/main/java/org/apache/james/mailbox/store/search/MessageSearches.java
+++ b/mailbox/store/src/main/java/org/apache/james/mailbox/store/search/MessageSearches.java
@@ -54,8 +54,6 @@ import org.apache.james.mailbox.store.ResultUtils;
 import org.apache.james.mailbox.store.mail.model.MailboxMessage;
 import org.apache.james.mailbox.store.search.comparator.CombinedComparator;
 import org.apache.james.mime4j.MimeException;
-import org.apache.james.mime4j.MimeIOException;
-import org.apache.james.mime4j.dom.Message;
 import org.apache.james.mime4j.dom.address.Address;
 import org.apache.james.mime4j.dom.address.AddressList;
 import org.apache.james.mime4j.dom.address.Group;
@@ -67,9 +65,7 @@ import org.apache.james.mime4j.field.address.AddressFormatter;
 import org.apache.james.mime4j.field.address.LenientAddressParser;
 import org.apache.james.mime4j.field.datetime.parser.DateTimeParser;
 import org.apache.james.mime4j.field.datetime.parser.ParseException;
-import org.apache.james.mime4j.message.DefaultMessageBuilder;
 import org.apache.james.mime4j.message.HeaderImpl;
-import org.apache.james.mime4j.stream.MimeConfig;
 import org.apache.james.mime4j.util.MimeUtil;
 import org.apache.james.mime4j.utils.search.MessageMatcher;
 import org.slf4j.Logger;
@@ -275,20 +271,6 @@ public class MessageSearches implements Iterable<SimpleMessageSearchIndex.Search
         }
     }
 
-    private HeaderImpl buildTextHeaders(MailboxMessage message) throws IOException, MimeIOException {
-        DefaultMessageBuilder defaultMessageBuilder = new DefaultMessageBuilder();
-        defaultMessageBuilder.setMimeEntityConfig(MimeConfig.PERMISSIVE);
-        Message headersMessage = defaultMessageBuilder
-            .parseMessage(message.getHeaderContent());
-        HeaderImpl headerImpl = new HeaderImpl();
-        addFrom(headerImpl, headersMessage.getFrom());
-        addAddressList(headerImpl, headersMessage.getTo());
-        addAddressList(headerImpl, headersMessage.getCc());
-        addAddressList(headerImpl, headersMessage.getBcc());
-        headerImpl.addField(Fields.subject(headersMessage.getSubject()));
-        return headerImpl;
-    }
-
     private void addFrom(HeaderImpl headerImpl, MailboxList from) {
         if (from != null) {
             headerImpl.addField(Fields.from(Lists.newArrayList(from.iterator())));


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


[james-project] 06/09: [UPGRADE] Mime4J 0.8.9: dispose messages

Posted by bt...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

btellier pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/james-project.git

commit efa99fb41110f0c9f631a889a102248d650acd00
Author: Benoit Tellier <bt...@linagora.com>
AuthorDate: Thu Jan 12 10:36:37 2023 +0700

    [UPGRADE] Mime4J 0.8.9: dispose messages
---
 .../src/main/java/org/apache/james/vault/DeletedMessageConverter.java | 4 +++-
 .../src/main/java/org/apache/james/mailbox/store/MessageStorer.java   | 1 -
 2 files changed, 3 insertions(+), 2 deletions(-)

diff --git a/mailbox/plugin/deleted-messages-vault/src/main/java/org/apache/james/vault/DeletedMessageConverter.java b/mailbox/plugin/deleted-messages-vault/src/main/java/org/apache/james/vault/DeletedMessageConverter.java
index d12c61c10a..655cd9b54c 100644
--- a/mailbox/plugin/deleted-messages-vault/src/main/java/org/apache/james/vault/DeletedMessageConverter.java
+++ b/mailbox/plugin/deleted-messages-vault/src/main/java/org/apache/james/vault/DeletedMessageConverter.java
@@ -52,7 +52,7 @@ class DeletedMessageConverter {
 
         Optional<Message> mimeMessage = parseMessage(message);
 
-        return DeletedMessage.builder()
+        DeletedMessage deletedMessage = DeletedMessage.builder()
             .messageId(deletedMessageMailboxContext.getMessageId())
             .originMailboxes(deletedMessageMailboxContext.getOwnerMailboxes())
             .user(retrieveOwner(deletedMessageMailboxContext))
@@ -64,6 +64,8 @@ class DeletedMessageConverter {
             .size(message.getFullContentOctets())
             .subject(mimeMessage.map(Message::getSubject))
             .build();
+        mimeMessage.ifPresent(Message::dispose);
+        return deletedMessage;
     }
 
     private Optional<Message> parseMessage(org.apache.james.mailbox.store.mail.model.Message message) throws IOException {
diff --git a/mailbox/store/src/main/java/org/apache/james/mailbox/store/MessageStorer.java b/mailbox/store/src/main/java/org/apache/james/mailbox/store/MessageStorer.java
index bebe032181..7b63a6b5bc 100644
--- a/mailbox/store/src/main/java/org/apache/james/mailbox/store/MessageStorer.java
+++ b/mailbox/store/src/main/java/org/apache/james/mailbox/store/MessageStorer.java
@@ -35,7 +35,6 @@ import org.apache.james.mailbox.model.Mailbox;
 import org.apache.james.mailbox.model.MessageAttachmentMetadata;
 import org.apache.james.mailbox.model.MessageId;
 import org.apache.james.mailbox.model.MessageMetaData;
-import org.apache.james.mailbox.model.ParsedAttachment;
 import org.apache.james.mailbox.model.ThreadId;
 import org.apache.james.mailbox.store.mail.AttachmentMapperFactory;
 import org.apache.james.mailbox.store.mail.MessageMapper;


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


[james-project] 04/09: [UPGRADE] Mime4J 0.8.9: dispose messages

Posted by bt...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

btellier pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/james-project.git

commit d4a3b1d6d89263373330ebb693a536d8d3b97766
Author: Benoit Tellier <bt...@linagora.com>
AuthorDate: Wed Jan 11 15:46:21 2023 +0700

    [UPGRADE] Mime4J 0.8.9: dispose messages
---
 .../src/main/java/org/apache/james/jmap/api/model/Preview.java    | 7 ++++++-
 .../org/apache/james/jmap/draft/methods/MIMEMessageConverter.java | 5 ++++-
 .../java/org/apache/james/jmap/draft/methods/MessageAppender.java | 1 +
 .../org/apache/james/jmap/draft/methods/SendMDNProcessor.java     | 1 +
 .../apache/james/jmap/mailet/ExtractMDNOriginalJMAPMessageId.java | 1 +
 .../apache/james/webadmin/data/jmap/EmailQueryViewPopulator.java  | 1 +
 .../src/main/java/org/apache/james/webadmin/dto/MailDto.java      | 8 ++++++--
 7 files changed, 20 insertions(+), 4 deletions(-)

diff --git a/server/data/data-jmap/src/main/java/org/apache/james/jmap/api/model/Preview.java b/server/data/data-jmap/src/main/java/org/apache/james/jmap/api/model/Preview.java
index 12e7ef34c9..5474b6211c 100644
--- a/server/data/data-jmap/src/main/java/org/apache/james/jmap/api/model/Preview.java
+++ b/server/data/data-jmap/src/main/java/org/apache/james/jmap/api/model/Preview.java
@@ -63,7 +63,12 @@ public class Preview {
         }
 
         public Preview fromInputStream(InputStream inputStream) throws IOException {
-            return fromMime4JMessage(parse(inputStream));
+            Message message = parse(inputStream);
+            try {
+                return fromMime4JMessage(message);
+            } finally {
+                message.dispose();
+            }
         }
 
         public Preview fromMime4JMessage(Message mimeMessage) throws IOException {
diff --git a/server/protocols/jmap-draft/src/main/java/org/apache/james/jmap/draft/methods/MIMEMessageConverter.java b/server/protocols/jmap-draft/src/main/java/org/apache/james/jmap/draft/methods/MIMEMessageConverter.java
index 5f499047ff..be44fd574c 100644
--- a/server/protocols/jmap-draft/src/main/java/org/apache/james/jmap/draft/methods/MIMEMessageConverter.java
+++ b/server/protocols/jmap-draft/src/main/java/org/apache/james/jmap/draft/methods/MIMEMessageConverter.java
@@ -111,7 +111,10 @@ public class MIMEMessageConverter {
     }
 
     public byte[] convert(ValueWithId.CreationMessageEntry creationMessageEntry, ImmutableList<Attachment.WithBlob> messageAttachments) {
-        return asBytes(convertToMime(creationMessageEntry, messageAttachments));
+        Message message = convertToMime(creationMessageEntry, messageAttachments);
+        byte[] result = asBytes(message);
+        message.dispose();
+        return result;
     }
 
     public byte[] asBytes(Message message) {
diff --git a/server/protocols/jmap-draft/src/main/java/org/apache/james/jmap/draft/methods/MessageAppender.java b/server/protocols/jmap-draft/src/main/java/org/apache/james/jmap/draft/methods/MessageAppender.java
index f114ae7525..4ab1e381cf 100644
--- a/server/protocols/jmap-draft/src/main/java/org/apache/james/jmap/draft/methods/MessageAppender.java
+++ b/server/protocols/jmap-draft/src/main/java/org/apache/james/jmap/draft/methods/MessageAppender.java
@@ -124,6 +124,7 @@ public class MessageAppender {
                         }
                         return Mono.just(appendResult);
                     })
+                    .doFinally(any -> newMessage.message.dispose())
                     .map(appendResult -> MetaDataWithContent.builder()
                         .uid(appendResult.getId().getUid())
                         .keywords(createdEntry.getValue().getKeywords())
diff --git a/server/protocols/jmap-draft/src/main/java/org/apache/james/jmap/draft/methods/SendMDNProcessor.java b/server/protocols/jmap-draft/src/main/java/org/apache/james/jmap/draft/methods/SendMDNProcessor.java
index 030a5775e8..0ce526408b 100644
--- a/server/protocols/jmap-draft/src/main/java/org/apache/james/jmap/draft/methods/SendMDNProcessor.java
+++ b/server/protocols/jmap-draft/src/main/java/org/apache/james/jmap/draft/methods/SendMDNProcessor.java
@@ -145,6 +145,7 @@ public class SendMDNProcessor implements SetMessagesProcessor {
         Message originalMessage = retrieveOriginalMessage(mdn, mailboxSession);
 
         Message mdnAnswer = mdn.generateMDNMessage(originalMessage, mailboxSession);
+        originalMessage.dispose();
 
         Flags seen = new Flags(Flags.Flag.SEEN);
         MetaDataWithContent metaDataWithContent = messageAppender.appendMessageInMailbox(mdnAnswer,
diff --git a/server/protocols/jmap-draft/src/main/java/org/apache/james/jmap/mailet/ExtractMDNOriginalJMAPMessageId.java b/server/protocols/jmap-draft/src/main/java/org/apache/james/jmap/mailet/ExtractMDNOriginalJMAPMessageId.java
index a8a6baf399..a908a2ce1e 100644
--- a/server/protocols/jmap-draft/src/main/java/org/apache/james/jmap/mailet/ExtractMDNOriginalJMAPMessageId.java
+++ b/server/protocols/jmap-draft/src/main/java/org/apache/james/jmap/mailet/ExtractMDNOriginalJMAPMessageId.java
@@ -82,6 +82,7 @@ public class ExtractMDNOriginalJMAPMessageId extends GenericMailet {
                 .map(OriginalMessageId::getOriginalMessageId)
                 .flatMap(messageId -> findMessageIdForRFC822MessageId(messageId, recipient))
                 .ifPresent(messageId -> setJmapMessageIdAsHeader(mimeMessage, messageId));
+            message.dispose();
         } catch (Exception e) {
             throw new MessagingException("MDN can't be parse", e);
         }
diff --git a/server/protocols/webadmin/webadmin-jmap/src/main/java/org/apache/james/webadmin/data/jmap/EmailQueryViewPopulator.java b/server/protocols/webadmin/webadmin-jmap/src/main/java/org/apache/james/webadmin/data/jmap/EmailQueryViewPopulator.java
index fc1a4f800d..51cacd8b46 100644
--- a/server/protocols/webadmin/webadmin-jmap/src/main/java/org/apache/james/webadmin/data/jmap/EmailQueryViewPopulator.java
+++ b/server/protocols/webadmin/webadmin-jmap/src/main/java/org/apache/james/webadmin/data/jmap/EmailQueryViewPopulator.java
@@ -155,6 +155,7 @@ public class EmailQueryViewPopulator {
             Message mime4JMessage = parseMessage(messageResult);
             Date sentAtDate = Optional.ofNullable(mime4JMessage.getDate()).orElse(messageResult.getInternalDate());
             ZonedDateTime sentAt = ZonedDateTime.ofInstant(sentAtDate.toInstant(), ZoneOffset.UTC);
+            mime4JMessage.dispose();
 
             return new EmailQueryView.Entry(mailboxId, messageId, sentAt, receivedAt);
         })
diff --git a/server/protocols/webadmin/webadmin-mailrepository/src/main/java/org/apache/james/webadmin/dto/MailDto.java b/server/protocols/webadmin/webadmin-mailrepository/src/main/java/org/apache/james/webadmin/dto/MailDto.java
index 5d48341c97..0a13c69cc7 100644
--- a/server/protocols/webadmin/webadmin-mailrepository/src/main/java/org/apache/james/webadmin/dto/MailDto.java
+++ b/server/protocols/webadmin/webadmin-mailrepository/src/main/java/org/apache/james/webadmin/dto/MailDto.java
@@ -103,8 +103,12 @@ public class MailDto {
         try {
             MessageContentExtractor extractor = new MessageContentExtractor();
             return Optional.ofNullable(mail.getMessage())
-                    .map(Throwing.function(MailDto::convertMessage).sneakyThrow())
-                    .map(Throwing.function(extractor::extract).sneakyThrow());
+                .map(Throwing.<MimeMessage, MessageContent>function(message -> {
+                    Message mimeMessage = MailDto.convertMessage(message);
+                    MessageContent result = extractor.extract(mimeMessage);
+                    mimeMessage.dispose();
+                    return result;
+                }).sneakyThrow());
         } catch (MessagingException e) {
             if (additionalFields.contains(AdditionalField.TEXT_BODY)) {
                 throw new InaccessibleFieldException(AdditionalField.TEXT_BODY, e);


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


[james-project] 07/09: [UPGRADE] Mime4J 0.8.9: use TextBody::getCharset

Posted by bt...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

btellier pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/james-project.git

commit 0be6921d5ca8e565c2c7cc81a1ebc4391d1bf663
Author: Benoit Tellier <bt...@linagora.com>
AuthorDate: Thu Jan 12 10:38:43 2023 +0700

    [UPGRADE] Mime4J 0.8.9: use TextBody::getCharset
---
 .../org/apache/james/util/mime/MessageContentExtractor.java   | 11 +++--------
 1 file changed, 3 insertions(+), 8 deletions(-)

diff --git a/server/container/util/src/main/java/org/apache/james/util/mime/MessageContentExtractor.java b/server/container/util/src/main/java/org/apache/james/util/mime/MessageContentExtractor.java
index 7685f548d1..4be95b89a2 100644
--- a/server/container/util/src/main/java/org/apache/james/util/mime/MessageContentExtractor.java
+++ b/server/container/util/src/main/java/org/apache/james/util/mime/MessageContentExtractor.java
@@ -20,7 +20,6 @@
 package org.apache.james.util.mime;
 
 import java.io.IOException;
-import java.nio.charset.Charset;
 import java.util.Objects;
 import java.util.Optional;
 import java.util.function.Function;
@@ -94,13 +93,9 @@ public class MessageContentExtractor {
     }
 
     private Optional<String> asString(TextBody textBody) throws IOException {
-        return Optional.ofNullable(IOUtils.toString(textBody.getInputStream(), charset(Optional.ofNullable(textBody.getMimeCharset()))));
-    }
-
-    private Charset charset(Optional<String> charset) {
-        return charset
-                .map(Charset::forName)
-                .orElse(org.apache.james.mime4j.Charsets.DEFAULT_CHARSET);
+        return Optional.ofNullable(IOUtils.toString(textBody.getInputStream(),
+            Optional.ofNullable(textBody.getCharset())
+                .orElse(org.apache.james.mime4j.Charsets.DEFAULT_CHARSET)));
     }
 
     private MessageContent retrieveHtmlAndPlainTextContent(Multipart multipart) throws IOException {


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


[james-project] 01/09: [UPGRADE] MIME4J 0.8.7 -> 0.8.9

Posted by bt...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

btellier pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/james-project.git

commit 22a1d2ff5f8e8668187fea01aa022efa93a52fed
Author: Benoit Tellier <bt...@linagora.com>
AuthorDate: Mon Jan 9 10:21:26 2023 +0700

    [UPGRADE] MIME4J 0.8.7 -> 0.8.9
---
 .../mailbox/store/mail/model/impl/MessageParser.java | 20 ++++++++------------
 pom.xml                                              |  2 +-
 .../jmap/draft/methods/MIMEMessageConverterTest.java | 14 ++++++++------
 3 files changed, 17 insertions(+), 19 deletions(-)

diff --git a/mailbox/store/src/main/java/org/apache/james/mailbox/store/mail/model/impl/MessageParser.java b/mailbox/store/src/main/java/org/apache/james/mailbox/store/mail/model/impl/MessageParser.java
index b1d2166904..482685905b 100644
--- a/mailbox/store/src/main/java/org/apache/james/mailbox/store/mail/model/impl/MessageParser.java
+++ b/mailbox/store/src/main/java/org/apache/james/mailbox/store/mail/model/impl/MessageParser.java
@@ -91,19 +91,15 @@ public class MessageParser {
 
     public List<ParsedAttachment> retrieveAttachments(Message message) throws IOException {
         Body body = message.getBody();
-        try {
-            if (body instanceof Multipart) {
-                Multipart multipartBody = (Multipart) body;
-                return listAttachments(multipartBody, Context.fromSubType(multipartBody.getSubType()))
-                    .collect(ImmutableList.toImmutableList());
-            } else {
-                if (isAttachment(message, Context.BODY)) {
-                    return ImmutableList.of(retrieveAttachment(message));
-                }
-                return ImmutableList.of();
+        if (body instanceof Multipart) {
+            Multipart multipartBody = (Multipart) body;
+            return listAttachments(multipartBody, Context.fromSubType(multipartBody.getSubType()))
+                .collect(ImmutableList.toImmutableList());
+        } else {
+            if (isAttachment(message, Context.BODY)) {
+                return ImmutableList.of(retrieveAttachment(message));
             }
-        } finally {
-            body.dispose();
+            return ImmutableList.of();
         }
     }
 
diff --git a/pom.xml b/pom.xml
index 4c7ac572b4..1e1031f309 100644
--- a/pom.xml
+++ b/pom.xml
@@ -598,7 +598,7 @@
         <james.groupId>org.apache.james</james.groupId>
         <james.protocols.groupId>${james.groupId}.protocols</james.protocols.groupId>
         <activemq.version>5.17.3</activemq.version>
-        <apache-mime4j.version>0.8.7</apache-mime4j.version>
+        <apache-mime4j.version>0.8.9</apache-mime4j.version>
         <apache.openjpa.version>3.2.0</apache.openjpa.version>
         <derby.version>10.14.2.0</derby.version>
         <log4j2.version>2.19.0</log4j2.version>
diff --git a/server/protocols/jmap-draft/src/test/java/org/apache/james/jmap/draft/methods/MIMEMessageConverterTest.java b/server/protocols/jmap-draft/src/test/java/org/apache/james/jmap/draft/methods/MIMEMessageConverterTest.java
index 4c79709dbe..24feb19418 100644
--- a/server/protocols/jmap-draft/src/test/java/org/apache/james/jmap/draft/methods/MIMEMessageConverterTest.java
+++ b/server/protocols/jmap-draft/src/test/java/org/apache/james/jmap/draft/methods/MIMEMessageConverterTest.java
@@ -46,6 +46,7 @@ import org.apache.james.mime4j.codec.EncoderUtil.Usage;
 import org.apache.james.mime4j.dom.Entity;
 import org.apache.james.mime4j.dom.Message;
 import org.apache.james.mime4j.dom.Multipart;
+import org.apache.james.mime4j.dom.SingleBody;
 import org.apache.james.mime4j.dom.TextBody;
 import org.apache.james.mime4j.dom.address.Mailbox;
 import org.apache.james.mime4j.dom.field.ContentTypeField;
@@ -56,6 +57,7 @@ import org.junit.jupiter.api.BeforeEach;
 import org.junit.jupiter.api.Nested;
 import org.junit.jupiter.api.Test;
 
+import com.github.fge.lambdas.Throwing;
 import com.google.common.collect.ImmutableList;
 import com.google.common.collect.ImmutableMap;
 
@@ -741,16 +743,16 @@ class MIMEMessageConverterTest {
                 .hasSize(1)
                 .extracting(entity -> (Multipart) entity.getBody())
                 .flatExtracting(Multipart::getBodyParts)
-                .satisfies(part -> {
+                .satisfies(Throwing.consumer(part -> {
                     assertThat(part.getBody()).isInstanceOf(Multipart.class);
                     assertThat(part.isMultipart()).isTrue();
                     assertThat(part.getMimeType()).isEqualTo("multipart/alternative");
                     assertThat(((Multipart)part.getBody()).getBodyParts()).hasSize(2);
-                    Entity textPart = ((Multipart)part.getBody()).getBodyParts().get(0);
-                    Entity htmlPart = ((Multipart)part.getBody()).getBodyParts().get(1);
-                    assertThat(textPart.getBody()).isEqualToComparingOnlyGivenFields(expectedTextBody, "content");
-                    assertThat(htmlPart.getBody()).isEqualToComparingOnlyGivenFields(expectedHtmlBody, "content");
-                }, Index.atIndex(0))
+                    SingleBody textPart = (SingleBody) ((Multipart)part.getBody()).getBodyParts().get(0).getBody();
+                    SingleBody htmlPart = (SingleBody) ((Multipart)part.getBody()).getBodyParts().get(1).getBody();
+                    assertThat(textPart.getInputStream()).hasBinaryContent("Hello all!".getBytes());
+                    assertThat(htmlPart.getInputStream()).hasBinaryContent("Hello <b>all<b>!".getBytes());
+                }), Index.atIndex(0))
                 .satisfies(part -> {
                     assertThat(part.getBody()).isEqualToComparingOnlyGivenFields(expectedAttachmentBody, "content");
                     assertThat(part.getDispositionType()).isEqualTo("inline");


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


[james-project] 09/09: [UPGRADE] Mime4J 0.8.9: use TextBody::getCharset

Posted by bt...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

btellier pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/james-project.git

commit 2238ea23771c23a1ad278a9bd2d64d9993452094
Author: Benoit Tellier <bt...@linagora.com>
AuthorDate: Thu Jan 12 10:46:56 2023 +0700

    [UPGRADE] Mime4J 0.8.9: use TextBody::getCharset
---
 .../src/main/scala/org/apache/james/jmap/mail/EmailBodyPart.scala  | 7 ++-----
 1 file changed, 2 insertions(+), 5 deletions(-)

diff --git a/server/protocols/jmap-rfc-8621/src/main/scala/org/apache/james/jmap/mail/EmailBodyPart.scala b/server/protocols/jmap-rfc-8621/src/main/scala/org/apache/james/jmap/mail/EmailBodyPart.scala
index 52adbba120..d53005f3f7 100644
--- a/server/protocols/jmap-rfc-8621/src/main/scala/org/apache/james/jmap/mail/EmailBodyPart.scala
+++ b/server/protocols/jmap-rfc-8621/src/main/scala/org/apache/james/jmap/mail/EmailBodyPart.scala
@@ -35,6 +35,7 @@ import org.apache.james.jmap.core.Properties
 import org.apache.james.jmap.mail.EmailBodyPart.{FILENAME_PREFIX, MULTIPART_ALTERNATIVE, TEXT_HTML, TEXT_PLAIN}
 import org.apache.james.jmap.mail.PartId.PartIdValue
 import org.apache.james.mailbox.model.{Cid, MessageAttachmentMetadata, MessageId, MessageResult}
+import org.apache.james.mime4j.Charsets.DEFAULT_CHARSET
 import org.apache.james.mime4j.codec.{DecodeMonitor, DecoderUtil}
 import org.apache.james.mime4j.dom.field.{ContentDispositionField, ContentLanguageField, ContentTypeField, FieldName}
 import org.apache.james.mime4j.dom.{Entity, Message, Multipart, SingleBody, TextBody => Mime4JTextBody}
@@ -275,7 +276,7 @@ case class EmailBodyPart(partId: PartId,
   def bodyContent: Try[Option[EmailBodyValue]] = entity.getBody match {
     case textBody: Mime4JTextBody =>
       for {
-        value <- Try(IOUtils.toString(textBody.getInputStream, charset(Option(textBody.getMimeCharset))))
+        value <- Try(IOUtils.toString(textBody.getInputStream, Option(textBody.getCharset).getOrElse(DEFAULT_CHARSET)))
       } yield {
         Some(EmailBodyValue(value = value,
           isEncodingProblem = IsEncodingProblem(false),
@@ -292,10 +293,6 @@ case class EmailBodyPart(partId: PartId,
     case _ => bodyContent
   }
 
-  private def charset(charset: Option[String]): java.nio.charset.Charset = charset
-    .map(java.nio.charset.Charset.forName)
-    .getOrElse(org.apache.james.mime4j.Charsets.DEFAULT_CHARSET)
-
   def textBody: List[EmailBodyPart] = selfBody ++ textBodyOfMultipart
 
   def htmlBody: List[EmailBodyPart] = selfBody ++ htmlBodyOfMultipart


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