/** * Creates a new <code>Header</code> from the specified * <code>Header</code>. The <code>Header</code> instance is initialized * with a copy of the list of {@link Field}s of the specified * <code>Header</code>. The <code>Field</code> objects are not copied * because they are immutable and can safely be shared between headers. * * @param other * header to copy. */ public AbstractHeader(Header other) { for (Field otherField : other.getFields()) { addField(otherField); } }
private Optional<Mailbox> getAddressForHeader(Message originalMessage, String fieldName) { return Optional.ofNullable(originalMessage.getHeader() .getFields(fieldName)) .orElse(ImmutableList.of()) .stream() .map(field -> AddressListFieldLenientImpl.PARSER.parse(field, new DecodeMonitor())) .findFirst() .map(AddressListField::getAddressList) .map(AddressList::flatten) .map(MailboxList::stream) .orElse(Stream.of()) .findFirst(); }
/** * @see org.apache.james.jdkim.api.Headers#getFields(java.lang.String) */ public List<String> getFields(final String name) { return convertFields(message.getHeader().getFields(name)); }
/** * @see org.apache.james.jdkim.api.Headers#getFields() */ public List<String> getFields() { List<Field> res = message.getHeader().getFields(); return convertFields(res); }
/** * Creates a new <code>Header</code> from the specified * <code>Header</code>. The <code>Header</code> instance is initialized * with a copy of the list of {@link Field}s of the specified * <code>Header</code>. The <code>Field</code> objects are not copied * because they are immutable and can safely be shared between headers. * * @param other * header to copy. */ public Header copy(Header other) { HeaderImpl copy = new HeaderImpl(); for (Field otherField : other.getFields()) { copy.addField(otherField); } return copy; }
/** * Create a node given a Multipart body. * Add the Preamble, all Body parts and the Epilogue to the node. * * @return the root node of the tree. */ private DefaultMutableTreeNode createNode(Header header) { DefaultMutableTreeNode node = new DefaultMutableTreeNode( new ObjectWrapper("Header", header)); for (Field field : header.getFields()) { String name = field.getName(); node.add(new DefaultMutableTreeNode(new ObjectWrapper(name, field))); } return node; }
/** Process a multipart body part */ private boolean processMultipart(JCas jCas, Multipart mp, String sourceUri) throws IOException { boolean doneBody = false; for (Entity e : mp.getBodyParts()) { if (e.getFilename() != null) { // Part has a filename, and is therefore an attachment String extension = FilenameUtils.getExtension(e.getFilename()).toLowerCase(); if (ignoreExtensionsList.contains(extension)) { getMonitor().info("Skipping attachment {}", e.getFilename()); continue; } attachments.put(sourceUri + "/" + e.getFilename(), e.getBody()); } else if (!doneBody) { // Part has no filename, and we've not already processed a part to use as a body processBody(jCas, e.getBody(), sourceUri); // Add metadata for (Field f : e.getParent().getHeader().getFields()) { addMetadata(jCas, f.getName(), f.getBody()); } doneBody = true; } } return doneBody; }
/** Process a multipart body part */ private boolean processMultipart(JCas jCas, Multipart mp, String sourceUri) throws IOException { boolean doneBody = false; for (Entity e : mp.getBodyParts()) { if (e.getFilename() != null) { // Part has a filename, and is therefore an attachment String extension = FilenameUtils.getExtension(e.getFilename()).toLowerCase(); if (ignoreExtensionsList.contains(extension)) { getMonitor().info("Skipping attachment {}", e.getFilename()); continue; } attachments.put(sourceUri + "/" + e.getFilename(), e.getBody()); } else if (!doneBody) { // Part has no filename, and we've not already processed a part to use as a body processBody(jCas, e.getBody(), sourceUri); // Add metadata for (Field f : e.getParent().getHeader().getFields()) { addMetadata(jCas, f.getName(), f.getBody()); } doneBody = true; } } return doneBody; }
@Test public void convertToMimeShouldGenerateMessageIdContainingSenderDomain() { // Given MIMEMessageConverter sut = new MIMEMessageConverter(); CreationMessage message = CreationMessage.builder() .from(DraftEmailer.builder().email("email@domain.com").build()) .mailboxIds(ImmutableList.of("dead-beef-1337")) .subject("subject") .build(); // When Message result = sut.convertToMime(new ValueWithId.CreationMessageEntry( CreationMessageId.of("user|mailbox|1"), message), ImmutableList.of()); // Then assertThat(result.getHeader().getFields("Message-ID")).hasSize(1); assertThat(result.getHeader().getFields("Message-ID").get(0).getBody()) .contains("@domain.com"); }
@Test public void convertToMimeShouldFilterWhiteSpacesOnlyHeaderNames() { // Given MIMEMessageConverter sut = new MIMEMessageConverter(); CreationMessage messageHavingInReplyTo = CreationMessage.builder() .from(DraftEmailer.builder().name("joe").build()) .headers(ImmutableMap.of(" ", "only spaces header name values")) .mailboxIds(ImmutableList.of("dead-beef-1337")) .subject("subject") .build(); // When Message result = sut.convertToMime(new ValueWithId.CreationMessageEntry( CreationMessageId.of("user|mailbox|1"), messageHavingInReplyTo), ImmutableList.of()); // Then assertThat(result.getHeader().getFields(" ")).isEmpty(); assertThat(result.getHeader().getFields("")).isEmpty(); }
@Test public void convertToMimeShouldFilterEmptyHeaderNames() { // Given MIMEMessageConverter sut = new MIMEMessageConverter(); CreationMessage messageHavingInReplyTo = CreationMessage.builder() .from(DraftEmailer.builder().name("joe").build()) .headers(ImmutableMap.of("", "empty header name value")) .mailboxIds(ImmutableList.of("dead-beef-1337")) .subject("subject") .build(); // When Message result = sut.convertToMime(new ValueWithId.CreationMessageEntry( CreationMessageId.of("user|mailbox|1"), messageHavingInReplyTo), ImmutableList.of()); // Then assertThat(result.getHeader().getFields("")).isEmpty(); }
@Test public void convertToMimeShouldGenerateMessageId() { // Given MIMEMessageConverter sut = new MIMEMessageConverter(); CreationMessage message = CreationMessage.builder() .mailboxIds(ImmutableList.of("dead-beef-1337")) .subject("subject") .build(); // When Message result = sut.convertToMime(new ValueWithId.CreationMessageEntry( CreationMessageId.of("user|mailbox|1"), message), ImmutableList.of()); // Then assertThat(result.getHeader().getFields("Message-ID")).extracting(Field::getBody) .isNotNull(); }
public Builder copy(Message other) { if (other == null) { return this; } clearFields(); final Header otherHeader = other.getHeader(); if (otherHeader != null) { final List<Field> otherFields = otherHeader.getFields(); for (Field field: otherFields) { addField(field); } } Body body = null; Body otherBody = other.getBody(); if (otherBody instanceof Message) { body = Builder.of((Message) otherBody).build(); } else if (otherBody instanceof Multipart) { body = MultipartBuilder.createCopy((Multipart) otherBody).build(); } else if (otherBody instanceof SingleBody) { body = ((SingleBody) otherBody).copy(); } setBody(body); return this; }
@Test public void convertToMimeShouldAddHeadersWhenProvided() { // Given MIMEMessageConverter sut = new MIMEMessageConverter(); CreationMessage messageHavingInReplyTo = CreationMessage.builder() .from(DraftEmailer.builder().name("sender").build()) .headers(ImmutableMap.of("FIRST", "first value", "SECOND", "second value")) .mailboxIds(ImmutableList.of("dead-beef-1337")) .subject("subject") .build(); // When Message result = sut.convertToMime(new ValueWithId.CreationMessageEntry( CreationMessageId.of("user|mailbox|1"), messageHavingInReplyTo), ImmutableList.of()); // Then assertThat(result.getHeader().getFields("FIRST")).extracting(Field::getBody) .containsOnly("first value"); assertThat(result.getHeader().getFields("SECOND")).extracting(Field::getBody) .containsOnly("second value"); }
@Test public void convertToMimeShouldFilterGeneratedHeadersWhenProvided() { // Given MIMEMessageConverter sut = new MIMEMessageConverter(); String joesEmail = "joe@example.com"; CreationMessage messageHavingInReplyTo = CreationMessage.builder() .from(DraftEmailer.builder().email(joesEmail).name("joe").build()) .headers(ImmutableMap.of("From", "hacker@example.com", "VALID", "valid header value")) .mailboxIds(ImmutableList.of("dead-beef-1337")) .subject("subject") .build(); // When Message result = sut.convertToMime(new ValueWithId.CreationMessageEntry( CreationMessageId.of("user|mailbox|1"), messageHavingInReplyTo), ImmutableList.of()); // Then assertThat(result.getFrom()).extracting(Mailbox::getAddress) .allMatch(f -> f.equals(joesEmail)); assertThat(result.getHeader().getFields("VALID")).extracting(Field::getBody) .containsOnly("valid header value"); assertThat(result.getHeader().getFields("From")).extracting(Field::getBody) .containsOnly("joe <joe@example.com>"); }
@Test public void convertToMimeShouldFilterGeneratedHeadersRegardlessOfCaseWhenProvided() { // Given MIMEMessageConverter sut = new MIMEMessageConverter(); String joesEmail = "joe@example.com"; CreationMessage messageHavingInReplyTo = CreationMessage.builder() .from(DraftEmailer.builder().email(joesEmail).name("joe").build()) .headers(ImmutableMap.of("frOM", "hacker@example.com", "VALID", "valid header value")) .mailboxIds(ImmutableList.of("dead-beef-1337")) .subject("subject") .build(); // When Message result = sut.convertToMime(new ValueWithId.CreationMessageEntry( CreationMessageId.of("user|mailbox|1"), messageHavingInReplyTo), ImmutableList.of()); // Then assertThat(result.getFrom()).extracting(Mailbox::getAddress) .allMatch(f -> f.equals(joesEmail)); assertThat(result.getHeader().getFields("VALID")).extracting(Field::getBody) .containsOnly("valid header value"); assertThat(result.getHeader().getFields("From")).extracting(Field::getBody) .containsOnly("joe <joe@example.com>"); }
@Test public void convertToMimeShouldAddMultivaluedHeadersWhenProvided() { // Given MIMEMessageConverter sut = new MIMEMessageConverter(); CreationMessage messageHavingInReplyTo = CreationMessage.builder() .from(DraftEmailer.builder().name("sender").build()) .headers(ImmutableMap.of("FIRST", "first value\nsecond value")) .mailboxIds(ImmutableList.of("dead-beef-1337")) .subject("subject") .build(); // When Message result = sut.convertToMime(new ValueWithId.CreationMessageEntry( CreationMessageId.of("user|mailbox|1"), messageHavingInReplyTo), ImmutableList.of()); // Then assertThat(result.getHeader().getFields("FIRST")).extracting(Field::getBody) .containsOnly("first value", "second value"); }
@Test public void convertToMimeShouldAddHeaderWhenProvided() { // Given MIMEMessageConverter sut = new MIMEMessageConverter(); CreationMessage messageHavingInReplyTo = CreationMessage.builder() .from(DraftEmailer.builder().name("sender").build()) .headers(ImmutableMap.of("FIRST", "first value")) .mailboxIds(ImmutableList.of("dead-beef-1337")) .subject("subject") .build(); // When Message result = sut.convertToMime(new ValueWithId.CreationMessageEntry( CreationMessageId.of("user|mailbox|1"), messageHavingInReplyTo), ImmutableList.of()); // Then assertThat(result.getHeader().getFields("FIRST")).extracting(Field::getBody) .containsOnly("first value"); }
@Test public void convertToMimeShouldGenerateMessageIdWhenSenderWithoutDomain() { // Given MIMEMessageConverter sut = new MIMEMessageConverter(); CreationMessage message = CreationMessage.builder() .from(DraftEmailer.builder().email("sender").build()) .mailboxIds(ImmutableList.of("dead-beef-1337")) .subject("subject") .build(); // When Message result = sut.convertToMime(new ValueWithId.CreationMessageEntry( CreationMessageId.of("user|mailbox|1"), message), ImmutableList.of()); // Then assertThat(result.getHeader().getFields("Message-ID")).extracting(Field::getBody) .isNotNull(); }
@Test public void convertToMimeShouldAddInReplyToHeaderWhenProvided() { // Given MIMEMessageConverter sut = new MIMEMessageConverter(); String matchingMessageId = "unique-message-id"; CreationMessage messageHavingInReplyTo = CreationMessage.builder() .from(DraftEmailer.builder().name("sender").build()) .inReplyToMessageId(matchingMessageId) .mailboxIds(ImmutableList.of("dead-beef-1337")) .subject("subject") .build(); // When Message result = sut.convertToMime(new ValueWithId.CreationMessageEntry( CreationMessageId.of("user|mailbox|1"), messageHavingInReplyTo), ImmutableList.of()); // Then assertThat(result.getHeader().getFields("In-Reply-To")).extracting(Field::getBody) .containsOnly(matchingMessageId); }