Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -518,12 +518,16 @@ public String toString() {
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);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -52,7 +52,7 @@ DeletedMessage convert(DeletedMessageVaultHook.DeletedMessageMailboxContext dele

Optional<Message> mimeMessage = parseMessage(message);

return DeletedMessage.builder()
DeletedMessage deletedMessage = DeletedMessage.builder()
.messageId(deletedMessageMailboxContext.getMessageId())
.originMailboxes(deletedMessageMailboxContext.getOwnerMailboxes())
.user(retrieveOwner(deletedMessageMailboxContext))
Expand All @@ -64,6 +64,8 @@ DeletedMessage convert(DeletedMessageVaultHook.DeletedMessageMailboxContext dele
.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 {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,6 @@
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;
Expand Down Expand Up @@ -115,25 +114,28 @@ public Mono<Pair<MessageMetaData, Optional<List<MessageAttachmentMetadata>>>> ap
}

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;
}
});
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -54,6 +54,27 @@
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";
Expand Down Expand Up @@ -81,29 +102,25 @@ public 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 {
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();
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -54,8 +54,6 @@
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;
Expand All @@ -67,9 +65,7 @@
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;
Expand Down Expand Up @@ -270,20 +266,6 @@ private Stream<String> toAttachmentContent(AttachmentMetadata attachment, Mailbo
}
}

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())));
Expand Down
Loading