This is an automated email from the ASF dual-hosted git repository. rcordier pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/james-project.git
commit c861ab308caca59e83722182091c1345d4d63683 Author: Tran Tien Duc <[email protected]> AuthorDate: Thu Jan 30 13:24:31 2020 +0700 JAMES-3016 Extract 7Bit converter to a common class To be used in ConvertTo7Bit mailet and MailDeliverToHost --- .../org/apache/mailet/base}/Converter7Bit.java | 16 ++- .../org/apache/mailet/base/Converter7BitTest.java | 134 +++++++++------------ .../eml/multipart-7bit-attachment-content.txt | 0 .../src/test/resources/eml/multipart-7bit.eml | 0 .../eml/multipart-8bit-attachment-content.txt | 0 .../src/test/resources/eml/multipart-8bit.eml | 0 .../src/test/resources/eml/text-only-7bit.eml | 0 .../src/test/resources/eml/text-only-8bit.eml | 0 .../apache/james/jdkim/mailets/ConvertTo7Bit.java | 45 ++----- .../remote/delivery/MailDelivrerToHost.java | 1 + 10 files changed, 77 insertions(+), 119 deletions(-) diff --git a/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/remote/delivery/Converter7Bit.java b/mailet/base/src/main/java/org/apache/mailet/base/Converter7Bit.java similarity index 85% rename from server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/remote/delivery/Converter7Bit.java rename to mailet/base/src/main/java/org/apache/mailet/base/Converter7Bit.java index 2eb44f4..095608f 100644 --- a/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/remote/delivery/Converter7Bit.java +++ b/mailet/base/src/main/java/org/apache/mailet/base/Converter7Bit.java @@ -17,13 +17,14 @@ * under the License. * ****************************************************************/ -package org.apache.james.transport.mailets.remote.delivery; +package org.apache.mailet.base; import java.io.IOException; import java.util.List; import javax.mail.BodyPart; import javax.mail.MessagingException; +import javax.mail.internet.MimeMessage; import javax.mail.internet.MimeMultipart; import javax.mail.internet.MimePart; @@ -38,11 +39,16 @@ public class Converter7Bit { this.mailetContext = mailetContext; } - public MimePart convertTo7Bit(MimePart part) throws MessagingException, IOException { + public void convertTo7Bit(MimeMessage mimeMessage) throws MessagingException, IOException { + convertPart(mimeMessage); + mimeMessage.saveChanges(); + } + + private void convertPart(MimePart part) throws MessagingException, IOException { if (part.isMimeType("multipart/*")) { List<BodyPart> bodyParts = MultipartUtil.retrieveBodyParts((MimeMultipart) part.getContent()); for (BodyPart bodyPart : bodyParts) { - convertTo7Bit((MimePart) bodyPart); + convertPart((MimePart) bodyPart); } } else if ("8bit".equals(part.getEncoding())) { // The content may already be in encoded the form (likely with mail @@ -59,9 +65,9 @@ public class Converter7Bit { String contentTransferEncoding = part.isMimeType("text/*") ? "quoted-printable" : "base64"; part.setContent(part.getContent(), part.getContentType()); part.setHeader("Content-Transfer-Encoding", contentTransferEncoding); - part.addHeader("X-MIME-Autoconverted", "from 8bit to " + contentTransferEncoding + " by " + mailetContext.getServerInfo()); + part.addHeader("X-MIME-Autoconverted", "from 8bit to " + + contentTransferEncoding + " by " + mailetContext.getServerInfo()); } - return part; } } diff --git a/server/mailet/dkim/src/test/java/org/apache/james/jdkim/mailets/ConvertTo7BitTest.java b/mailet/base/src/test/java/org/apache/mailet/base/Converter7BitTest.java similarity index 56% rename from server/mailet/dkim/src/test/java/org/apache/james/jdkim/mailets/ConvertTo7BitTest.java rename to mailet/base/src/test/java/org/apache/mailet/base/Converter7BitTest.java index bbee42b..d08b156 100644 --- a/server/mailet/dkim/src/test/java/org/apache/james/jdkim/mailets/ConvertTo7BitTest.java +++ b/mailet/base/src/test/java/org/apache/mailet/base/Converter7BitTest.java @@ -17,7 +17,7 @@ * under the License. * ****************************************************************/ -package org.apache.james.jdkim.mailets; +package org.apache.mailet.base; import static org.assertj.core.api.Assertions.assertThat; @@ -25,12 +25,11 @@ import java.io.IOException; import java.nio.charset.StandardCharsets; import javax.mail.BodyPart; +import javax.mail.internet.MimeMessage; import javax.mail.internet.MimeMultipart; import org.apache.commons.io.IOUtils; import org.apache.james.util.MimeMessageUtil; -import org.apache.mailet.Mail; -import org.apache.mailet.base.test.FakeMail; import org.apache.mailet.base.test.FakeMailetConfig; import org.assertj.core.api.SoftAssertions; import org.junit.jupiter.api.BeforeEach; @@ -39,7 +38,7 @@ import org.junit.jupiter.api.Test; import com.github.fge.lambdas.Throwing; -class ConvertTo7BitTest { +class Converter7BitTest { private static final String CONTENT_TRANSFER_ENCODING = "Content-Transfer-Encoding"; private static final String X_MIME_AUTOCONVERTED = "X-MIME-Autoconverted"; @@ -48,13 +47,13 @@ class ConvertTo7BitTest { private static final String MESSAGE_BODY_QUOTED_PRINTABLE = "A 8bit encoded body with =E2=82=ACuro symbol."; private static final String BASE64 = "base64"; - private ConvertTo7Bit testee; + private Converter7Bit testee; @BeforeEach - void setUp() throws Exception { - testee = new ConvertTo7Bit(); - testee.init(FakeMailetConfig.builder() - .build()); + void setUp() { + testee = new Converter7Bit(FakeMailetConfig.builder() + .build() + .getMailetContext()); } @Nested @@ -62,19 +61,15 @@ class ConvertTo7BitTest { @Nested class WhenTextContent { @Test - void serviceShouldKeepMessageContentUnTouch() throws Exception { - Mail mail = FakeMail.builder() - .name("a-mail-with-quoted-printable-encoding") - .mimeMessage(MimeMessageUtil.mimeMessageFromString( - fileContent("eml/text-only-7bit.eml"))) - .build(); - - testee.service(mail); + void convertTo7BitShouldKeepMessageContentUnTouched() throws Exception { + MimeMessage mimeMessage = MimeMessageUtil.mimeMessageFromString( + fileContent("eml/text-only-7bit.eml")); + testee.convertTo7Bit(mimeMessage); SoftAssertions.assertSoftly(Throwing.consumer(softly -> { - softly.assertThat(mail.getMessage().getEncoding()) + softly.assertThat(mimeMessage.getEncoding()) .isEqualTo(QUOTED_PRINTABLE); - softly.assertThat(MimeMessageUtil.asString(mail.getMessage())) + softly.assertThat(MimeMessageUtil.asString(mimeMessage)) .contains(MESSAGE_BODY_QUOTED_PRINTABLE); })); } @@ -83,35 +78,29 @@ class ConvertTo7BitTest { @Nested class WhenMultipart { @Test - void serviceShouldKeepMessageTextContentUnTouch() throws Exception { - Mail mail = FakeMail.builder() - .name("a-mail-with-7bit-encoding") - .mimeMessage(MimeMessageUtil.mimeMessageFromString( - fileContent("eml/multipart-7bit.eml"))) - .build(); + void convertTo7BitShouldKeepMessageTextContentUnTouched() throws Exception { + MimeMessage mimeMessage = MimeMessageUtil.mimeMessageFromString( + fileContent("eml/multipart-7bit.eml")); - testee.service(mail); - MimeMultipart multipart = (MimeMultipart) mail.getMessage().getContent(); + testee.convertTo7Bit(mimeMessage); + MimeMultipart multipart = (MimeMultipart) mimeMessage.getContent(); SoftAssertions.assertSoftly(Throwing.consumer(softly -> { softly.assertThat(multipart.getBodyPart(0).getHeader(CONTENT_TRANSFER_ENCODING)) .containsOnly(QUOTED_PRINTABLE); - softly.assertThat(MimeMessageUtil.asString(mail.getMessage())) + softly.assertThat(MimeMessageUtil.asString(mimeMessage)) .contains(MESSAGE_BODY_QUOTED_PRINTABLE); })); } @Test - void serviceShouldKeepMessageAttachmentsContentUnTouch() throws Exception { - Mail mail = FakeMail.builder() - .name("a-mail-with-7bit-encoding") - .mimeMessage(MimeMessageUtil.mimeMessageFromString( - fileContent("eml/multipart-7bit.eml"))) - .build(); + void convertTo7BitShouldKeepMessageAttachmentsContentUnTouched() throws Exception { + MimeMessage mimeMessage = MimeMessageUtil.mimeMessageFromString( + fileContent("eml/multipart-7bit.eml")); - testee.service(mail); - MimeMultipart multipart = (MimeMultipart) mail.getMessage().getContent(); - String messageAsString = MimeMessageUtil.asString(mail.getMessage()); + testee.convertTo7Bit(mimeMessage); + MimeMultipart multipart = (MimeMultipart) mimeMessage.getContent(); + String messageAsString = MimeMessageUtil.asString(mimeMessage); SoftAssertions.assertSoftly(Throwing.consumer(softly -> { softly.assertThat(multipart.getBodyPart(1).getHeader(CONTENT_TRANSFER_ENCODING)) @@ -128,32 +117,26 @@ class ConvertTo7BitTest { @Nested class WhenTextContent { @Test - void serviceShouldAlertHeaders() throws Exception { - Mail mail = FakeMail.builder() - .name("a-mail-with-8bit-encoding") - .mimeMessage(MimeMessageUtil.mimeMessageFromString( - fileContent("eml/text-only-8bit.eml"))) - .build(); - testee.service(mail); + void convertTo7BitShouldAlertHeaders() throws Exception { + MimeMessage mimeMessage = MimeMessageUtil.mimeMessageFromString( + fileContent("eml/text-only-8bit.eml")); + testee.convertTo7Bit(mimeMessage); SoftAssertions.assertSoftly(Throwing.consumer(softly -> { - assertThat(mail.getMessage().getHeader(CONTENT_TRANSFER_ENCODING)) + assertThat(mimeMessage.getHeader(CONTENT_TRANSFER_ENCODING)) .containsOnly(QUOTED_PRINTABLE); - assertThat(mail.getMessage().getHeader(X_MIME_AUTOCONVERTED)) + assertThat(mimeMessage.getHeader(X_MIME_AUTOCONVERTED)) .containsOnly("from 8bit to quoted-printable by Mock Server"); })); } @Test - void serviceShouldConvertContentToQuotedPrintable() throws Exception { - Mail mail = FakeMail.builder() - .name("a-mail-with-8bit-encoding") - .mimeMessage(MimeMessageUtil.mimeMessageFromString( - fileContent("eml/text-only-8bit.eml"))) - .build(); - testee.service(mail); - - assertThat(MimeMessageUtil.asString(mail.getMessage())) + void convertTo7BitShouldConvertContentToQuotedPrintable() throws Exception { + MimeMessage mimeMessage = MimeMessageUtil.mimeMessageFromString( + fileContent("eml/text-only-8bit.eml")); + testee.convertTo7Bit(mimeMessage); + + assertThat(MimeMessageUtil.asString(mimeMessage)) .contains(MESSAGE_BODY_QUOTED_PRINTABLE) .doesNotContain(MESSAGE_BODY_8BIT); } @@ -163,16 +146,13 @@ class ConvertTo7BitTest { class WhenMultipart { @Test - void serviceShouldAlertTextPartHeaders() throws Exception { - Mail mail = FakeMail.builder() - .name("a-mail-with-8bit-encoding") - .mimeMessage(MimeMessageUtil.mimeMessageFromString( - fileContent("eml/multipart-8bit.eml"))) - .build(); + void convertTo7BitShouldAlertTextPartHeaders() throws Exception { + MimeMessage mimeMessage = MimeMessageUtil.mimeMessageFromString( + fileContent("eml/multipart-8bit.eml")); - testee.service(mail); + testee.convertTo7Bit(mimeMessage); - BodyPart textPart = ((MimeMultipart) mail.getMessage().getContent()) + BodyPart textPart = ((MimeMultipart) mimeMessage.getContent()) .getBodyPart(0); SoftAssertions.assertSoftly(Throwing.consumer(softly -> { @@ -184,32 +164,26 @@ class ConvertTo7BitTest { } @Test - void serviceShouldConvertTextPartContentToQuotedPrintable() throws Exception { - Mail mail = FakeMail.builder() - .name("a-mail-with-8bit-encoding") - .mimeMessage(MimeMessageUtil.mimeMessageFromString( - fileContent("eml/multipart-8bit.eml"))) - .build(); + void convertTo7BitShouldConvertTextPartContentToQuotedPrintable() throws Exception { + MimeMessage mimeMessage = MimeMessageUtil.mimeMessageFromString( + fileContent("eml/multipart-8bit.eml")); - testee.service(mail); + testee.convertTo7Bit(mimeMessage); - assertThat(MimeMessageUtil.asString(mail.getMessage())) + assertThat(MimeMessageUtil.asString(mimeMessage)) .contains(MESSAGE_BODY_QUOTED_PRINTABLE) .doesNotContain(MESSAGE_BODY_8BIT); } @Test - void serviceShouldKeepAttachmentPartUnTouchWhenBase64Encoding() throws Exception { - Mail mail = FakeMail.builder() - .name("a-mail-with-8bit-encoding") - .mimeMessage(MimeMessageUtil.mimeMessageFromString( - fileContent("eml/multipart-8bit.eml"))) - .build(); + void convertTo7BitShouldKeepAttachmentPartUnTouchedWhenBase64Encoding() throws Exception { + MimeMessage mimeMessage = MimeMessageUtil.mimeMessageFromString( + fileContent("eml/multipart-8bit.eml")); - testee.service(mail); + testee.convertTo7Bit(mimeMessage); - MimeMultipart multipart = (MimeMultipart) mail.getMessage().getContent(); - String messageAsString = MimeMessageUtil.asString(mail.getMessage()); + MimeMultipart multipart = (MimeMultipart) mimeMessage.getContent(); + String messageAsString = MimeMessageUtil.asString(mimeMessage); SoftAssertions.assertSoftly(Throwing.consumer(softly -> { softly.assertThat(multipart.getBodyPart(1).getHeader(CONTENT_TRANSFER_ENCODING)) diff --git a/server/mailet/dkim/src/test/resources/eml/multipart-7bit-attachment-content.txt b/mailet/base/src/test/resources/eml/multipart-7bit-attachment-content.txt similarity index 100% rename from server/mailet/dkim/src/test/resources/eml/multipart-7bit-attachment-content.txt rename to mailet/base/src/test/resources/eml/multipart-7bit-attachment-content.txt diff --git a/server/mailet/dkim/src/test/resources/eml/multipart-7bit.eml b/mailet/base/src/test/resources/eml/multipart-7bit.eml similarity index 100% rename from server/mailet/dkim/src/test/resources/eml/multipart-7bit.eml rename to mailet/base/src/test/resources/eml/multipart-7bit.eml diff --git a/server/mailet/dkim/src/test/resources/eml/multipart-8bit-attachment-content.txt b/mailet/base/src/test/resources/eml/multipart-8bit-attachment-content.txt similarity index 100% rename from server/mailet/dkim/src/test/resources/eml/multipart-8bit-attachment-content.txt rename to mailet/base/src/test/resources/eml/multipart-8bit-attachment-content.txt diff --git a/server/mailet/dkim/src/test/resources/eml/multipart-8bit.eml b/mailet/base/src/test/resources/eml/multipart-8bit.eml similarity index 100% rename from server/mailet/dkim/src/test/resources/eml/multipart-8bit.eml rename to mailet/base/src/test/resources/eml/multipart-8bit.eml diff --git a/server/mailet/dkim/src/test/resources/eml/text-only-7bit.eml b/mailet/base/src/test/resources/eml/text-only-7bit.eml similarity index 100% rename from server/mailet/dkim/src/test/resources/eml/text-only-7bit.eml rename to mailet/base/src/test/resources/eml/text-only-7bit.eml diff --git a/server/mailet/dkim/src/test/resources/eml/text-only-8bit.eml b/mailet/base/src/test/resources/eml/text-only-8bit.eml similarity index 100% rename from server/mailet/dkim/src/test/resources/eml/text-only-8bit.eml rename to mailet/base/src/test/resources/eml/text-only-8bit.eml diff --git a/server/mailet/dkim/src/main/java/org/apache/james/jdkim/mailets/ConvertTo7Bit.java b/server/mailet/dkim/src/main/java/org/apache/james/jdkim/mailets/ConvertTo7Bit.java index 53a4e01..bc6b266 100644 --- a/server/mailet/dkim/src/main/java/org/apache/james/jdkim/mailets/ConvertTo7Bit.java +++ b/server/mailet/dkim/src/main/java/org/apache/james/jdkim/mailets/ConvertTo7Bit.java @@ -23,10 +23,10 @@ import java.io.IOException; import javax.mail.MessagingException; import javax.mail.internet.MimeMessage; -import javax.mail.internet.MimeMultipart; -import javax.mail.internet.MimePart; import org.apache.mailet.Mail; +import org.apache.mailet.MailetConfig; +import org.apache.mailet.base.Converter7Bit; import org.apache.mailet.base.GenericMailet; /** @@ -35,43 +35,20 @@ import org.apache.mailet.base.GenericMailet; */ public class ConvertTo7Bit extends GenericMailet { + private Converter7Bit converter7Bit; + + @Override + public void init(MailetConfig newConfig) throws MessagingException { + super.init(newConfig); + this.converter7Bit = new Converter7Bit(getMailetContext()); + } + public void service(Mail mail) throws MessagingException { MimeMessage message = mail.getMessage(); try { - convertTo7Bit(message); - message.saveChanges(); + converter7Bit.convertTo7Bit(message); } catch (IOException e) { throw new MessagingException("IOException converting message to 7bit: " + e.getMessage(), e); } } - - /** - * Converts a message to 7 bit. - */ - private void convertTo7Bit(MimePart part) throws MessagingException, IOException { - if (part.isMimeType("multipart/*")) { - MimeMultipart parts = (MimeMultipart) part.getContent(); - int count = parts.getCount(); - for (int i = 0; i < count; i++) { - convertTo7Bit((MimePart) parts.getBodyPart(i)); - } - } else if ("8bit".equals(part.getEncoding())) { - // The content may already be in encoded the form (likely with mail - // created from a stream). In that case, just changing the encoding - // to quoted-printable will mangle the result when this is - // transmitted. - // We must first convert the content into its native format, set it - // back, and only THEN set the transfer encoding to force the - // content to be encoded appropriately. - - // if the part doesn't contain text it will be base64 encoded. - String contentTransferEncoding = part.isMimeType("text/*") ? "quoted-printable" : "base64"; - part.setContent(part.getContent(), part.getContentType()); - part.setHeader("Content-Transfer-Encoding", contentTransferEncoding); - part.addHeader("X-MIME-Autoconverted", "from 8bit to " - + contentTransferEncoding + " by " - + getMailetContext().getServerInfo()); - } - } - } diff --git a/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/remote/delivery/MailDelivrerToHost.java b/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/remote/delivery/MailDelivrerToHost.java index d51af6c..b414ab5 100644 --- a/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/remote/delivery/MailDelivrerToHost.java +++ b/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/remote/delivery/MailDelivrerToHost.java @@ -31,6 +31,7 @@ import javax.mail.internet.MimeMessage; import org.apache.mailet.HostAddress; import org.apache.mailet.Mail; import org.apache.mailet.MailetContext; +import org.apache.mailet.base.Converter7Bit; import org.slf4j.Logger; import org.slf4j.LoggerFactory; --------------------------------------------------------------------- To unsubscribe, e-mail: [email protected] For additional commands, e-mail: [email protected]
