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 4c25836aa75d4b38f8df53bd736132bf82bff241
Author: Tran Tien Duc <[email protected]>
AuthorDate: Wed Jan 22 13:37:43 2020 +0700

    JAMES-3016 Broken DKIMSign + RemoteDelivery integration tests
---
 .../mailets/RemoteDeliveryDKIMIntegrationTest.java | 438 +++++++++++++++++++++
 .../test/resources/eml/message-multipart-7bit.eml  | 142 +++++++
 .../test/resources/eml/message-multipart-8bit.eml  | 128 ++++++
 .../test/resources/eml/message-text-only-7bit.eml  |  27 ++
 .../test/resources/eml/message-text-only-8bit.eml  |  28 ++
 5 files changed, 763 insertions(+)

diff --git 
a/server/mailet/integration-testing/src/test/java/org/apache/james/mailets/RemoteDeliveryDKIMIntegrationTest.java
 
b/server/mailet/integration-testing/src/test/java/org/apache/james/mailets/RemoteDeliveryDKIMIntegrationTest.java
new file mode 100644
index 0000000..3a991b0
--- /dev/null
+++ 
b/server/mailet/integration-testing/src/test/java/org/apache/james/mailets/RemoteDeliveryDKIMIntegrationTest.java
@@ -0,0 +1,438 @@
+/****************************************************************
+ * Licensed to the Apache Software Foundation (ASF) under one   *
+ * or more contributor license agreements.  See the NOTICE file *
+ * distributed with this work for additional information        *
+ * regarding copyright ownership.  The ASF licenses this file   *
+ * to you under the Apache License, Version 2.0 (the            *
+ * "License"); you may not use this file except in compliance   *
+ * with the License.  You may obtain a copy of the License at   *
+ *                                                              *
+ *   http://www.apache.org/licenses/LICENSE-2.0                 *
+ *                                                              *
+ * Unless required by applicable law or agreed to in writing,   *
+ * software distributed under the License is distributed on an  *
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY       *
+ * KIND, either express or implied.  See the License for the    *
+ * specific language governing permissions and limitations      *
+ * under the License.                                           *
+ ****************************************************************/
+
+package org.apache.james.mailets;
+
+import static org.apache.james.MemoryJamesServerMain.SMTP_ONLY_MODULE;
+import static org.apache.james.mailets.configuration.Constants.DEFAULT_DOMAIN;
+import static org.apache.james.mailets.configuration.Constants.LOCALHOST_IP;
+import static org.apache.james.mailets.configuration.Constants.PASSWORD;
+import static 
org.apache.james.mailets.configuration.Constants.awaitAtMostOneMinute;
+import static org.apache.james.util.docker.Images.MOCK_SMTP_SERVER;
+import static org.assertj.core.api.Assertions.assertThat;
+
+import java.util.Optional;
+
+import javax.mail.MessagingException;
+import javax.mail.internet.MimeMessage;
+
+import org.apache.james.core.MailAddress;
+import org.apache.james.dnsservice.api.DNSService;
+import org.apache.james.dnsservice.api.InMemoryDNSService;
+import org.apache.james.jdkim.api.PublicKeyRecordRetriever;
+import org.apache.james.jdkim.mailets.ConvertTo7Bit;
+import org.apache.james.jdkim.mailets.DKIMSign;
+import org.apache.james.jdkim.mailets.DKIMVerifier;
+import org.apache.james.jdkim.mailets.MockPublicKeyRecordRetriever;
+import org.apache.james.mailets.configuration.CommonProcessors;
+import org.apache.james.mailets.configuration.MailetConfiguration;
+import org.apache.james.mailets.configuration.ProcessorConfiguration;
+import org.apache.james.mock.smtp.server.ConfigurationClient;
+import org.apache.james.mock.smtp.server.model.Mail;
+import org.apache.james.modules.protocols.SmtpGuiceProbe;
+import org.apache.james.probe.DataProbe;
+import org.apache.james.transport.matchers.All;
+import org.apache.james.util.Host;
+import org.apache.james.util.MimeMessageUtil;
+import org.apache.james.util.docker.DockerContainer;
+import org.apache.james.utils.DataProbeImpl;
+import org.apache.james.utils.IMAPMessageReader;
+import org.apache.james.utils.SMTPMessageSender;
+import org.apache.mailet.base.test.FakeMail;
+import org.junit.After;
+import org.junit.Before;
+import org.junit.ClassRule;
+import org.junit.Ignore;
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.rules.TemporaryFolder;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class RemoteDeliveryDKIMIntegrationTest {
+
+    private static final Logger LOGGER = 
LoggerFactory.getLogger(RemoteDeliveryDKIMIntegrationTest.class);
+
+    private static final String JAMES_ANOTHER_DOMAIN = "james.com";
+    private static final String FROM = "from@" + DEFAULT_DOMAIN;
+    private static final String RECIPIENT = "touser@" + JAMES_ANOTHER_DOMAIN;
+
+    private static final String TESTING_PEM = "-----BEGIN RSA PRIVATE 
KEY-----\r\n" +
+        "MIICXAIBAAKBgQDYDaYKXzwVYwqWbLhmuJ66aTAN8wmDR+rfHE8HfnkSOax0oIoT\r\n" 
+
+        "M5zquZrTLo30870YMfYzxwfB6j/Nz3QdwrUD/t0YMYJiUKyWJnCKfZXHJBJ+yfRH\r\n" 
+
+        "r7oW+UW3cVo9CG2bBfIxsInwYe175g9UjyntJpWueqdEIo1c2bhv9Mp66QIDAQAB\r\n" 
+
+        "AoGBAI8XcwnZi0Sq5N89wF+gFNhnREFo3rsJDaCY8iqHdA5DDlnr3abb/yhipw0I\r\n" 
+
+        "/1HlgC6fIG2oexXOXFWl+USgqRt1kTt9jXhVFExg8mNko2UelAwFtsl8CRjVcYQO\r\n" 
+
+        "cedeH/WM/mXjg2wUqqZenBmlKlD6vNb70jFJeVaDJ/7n7j8BAkEA9NkH2D4Zgj/I\r\n" 
+
+        "OAVYccZYH74+VgO0e7VkUjQk9wtJ2j6cGqJ6Pfj0roVIMUWzoBb8YfErR8l6JnVQ\r\n" 
+
+        "bfy83gJeiQJBAOHk3ow7JjAn8XuOyZx24KcTaYWKUkAQfRWYDFFOYQF4KV9xLSEt\r\n" 
+
+        "ycY0kjsdxGKDudWcsATllFzXDCQF6DTNIWECQEA52ePwTjKrVnLTfCLEG4OgHKvl\r\n" 
+
+        "Zud4amthwDyJWoMEH2ChNB2je1N4JLrABOE+hk+OuoKnKAKEjWd8f3Jg/rkCQHj8\r\n" 
+
+        "mQmogHqYWikgP/FSZl518jV48Tao3iXbqvU9Mo2T6yzYNCCqIoDLFWseNVnCTZ0Q\r\n" 
+
+        "b+IfiEf1UeZVV5o4J+ECQDatNnS3V9qYUKjj/krNRD/U0+7eh8S2ylLqD3RlSn9K\r\n" 
+
+        "tYGRMgAtUXtiOEizBH6bd/orzI9V9sw8yBz+ZqIH25Q=\r\n" +
+        "-----END RSA PRIVATE KEY-----\r\n";
+    private static final MailetConfiguration DKIMSIGN_MAILET = 
MailetConfiguration.builder()
+        .matcher(All.class)
+        .mailet(DKIMSign.class)
+        .addProperty(
+            "signatureTemplate",
+            "v=1; s=selector; d=example.com; h=from:to:received:received; 
a=rsa-sha256; bh=; b=;")
+        .addProperty("privateKey", TESTING_PEM)
+        .build();
+    private static final MailetConfiguration CONVERT_TO_7BIT_MAILET = 
MailetConfiguration.builder()
+        .matcher(All.class)
+        .mailet(ConvertTo7Bit.class)
+        .build();
+    private static final PublicKeyRecordRetriever 
MOCK_PUBLIC_KEY_RECORD_RETRIEVER = new MockPublicKeyRecordRetriever(
+        "v=DKIM1; k=rsa; 
p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDYDaYKXzwVYwqWbLhmuJ66aTAN8wmDR+rfHE8HfnkSOax0oIoTM5zquZrTLo30870YMfYzxwfB6j/Nz3QdwrUD/t0YMYJiUKyWJnCKfZXHJBJ+yfRHr7oW+UW3cVo9CG2bBfIxsInwYe175g9UjyntJpWueqdEIo1c2bhv9Mp66QIDAQAB;",
+        "selector", "example.com");
+
+    @ClassRule
+    public static DockerContainer mockSmtp = 
DockerContainer.fromName(MOCK_SMTP_SERVER)
+        .withLogConsumer(outputFrame -> LOGGER.debug("MockSMTP: " + 
outputFrame.getUtf8String()));
+    @Rule
+    public TemporaryFolder temporaryFolder = new TemporaryFolder();
+    @Rule
+    public IMAPMessageReader imapMessageReader = new IMAPMessageReader();
+    @Rule
+    public SMTPMessageSender messageSender = new 
SMTPMessageSender(DEFAULT_DOMAIN);
+
+    private TemporaryJamesServer jamesServer;
+    private ConfigurationClient mockSMTPConfiguration;
+    private DataProbe dataProbe;
+    private DKIMVerifier dkimVerifier;
+
+    @Before
+    public void setUp() {
+        mockSMTPConfiguration = configurationClient(mockSmtp);
+        dkimVerifier = new DKIMVerifier(MOCK_PUBLIC_KEY_RECORD_RETRIEVER);
+    }
+
+    @After
+    public void tearDown() {
+        mockSMTPConfiguration.cleanServer();
+        if (jamesServer != null) {
+            jamesServer.shutdown();
+        }
+    }
+
+    @Ignore("assertion failed:" +
+        "org.apache.james.jdkim.exceptions.PermFailException: Computed 
bodyhash is different from the expected one")
+    @Test
+    public void 
remoteDeliveryShouldNotBreakDKIMSignWhen7BitMessageAndAllowing8BitMime() throws 
Exception {
+        InMemoryDNSService inMemoryDNSService = new InMemoryDNSService()
+            .registerMxRecord(JAMES_ANOTHER_DOMAIN, mockSmtp.getContainerIp());
+
+        jamesServer = TemporaryJamesServer.builder()
+            .withBase(SMTP_ONLY_MODULE)
+            .withOverrides(binder -> 
binder.bind(DNSService.class).toInstance(inMemoryDNSService))
+            
.withMailetContainer(TemporaryJamesServer.SIMPLE_MAILET_CONTAINER_CONFIGURATION
+                
.putProcessor(directResolutionTransport(MailetConfiguration.remoteDeliveryBuilder()))
+                .putProcessor(CommonProcessors.bounces()))
+            .build(temporaryFolder.newFolder());
+
+        dataProbe = jamesServer.getProbe(DataProbeImpl.class);
+        dataProbe.addDomain(DEFAULT_DOMAIN);
+        dataProbe.addUser(FROM, PASSWORD);
+
+        FakeMail mail = FakeMail.builder()
+            .name("a-mail-with-7bit-encoding")
+            .sender(new MailAddress(FROM))
+            .recipient(new MailAddress(RECIPIENT))
+            .mimeMessage(MimeMessageUtil.mimeMessageFromStream(
+                
ClassLoader.getSystemResourceAsStream(("eml/message-text-only-7bit.eml"))))
+            .build();
+        messageSender.connect(LOCALHOST_IP, 
jamesServer.getProbe(SmtpGuiceProbe.class).getSmtpPort())
+            .sendMessage(mail);
+
+        MimeMessage sendMessage = toMimeMessage(getFirstRecivedMail());
+
+        assertThat(dkimVerifier.verifyUsingCRLF(sendMessage))
+            .isNotEmpty();
+    }
+
+    @Test
+    public void 
remoteDeliveryShouldNotBreakDKIMSignWhen7BitAndBase64MessageAndAllowing8BitMime()
 throws Exception {
+        InMemoryDNSService inMemoryDNSService = new InMemoryDNSService()
+            .registerMxRecord(JAMES_ANOTHER_DOMAIN, mockSmtp.getContainerIp());
+
+        jamesServer = TemporaryJamesServer.builder()
+            .withBase(SMTP_ONLY_MODULE)
+            .withOverrides(binder -> 
binder.bind(DNSService.class).toInstance(inMemoryDNSService))
+            
.withMailetContainer(TemporaryJamesServer.SIMPLE_MAILET_CONTAINER_CONFIGURATION
+                
.putProcessor(directResolutionTransport(MailetConfiguration.remoteDeliveryBuilder()))
+                .putProcessor(CommonProcessors.bounces()))
+            .build(temporaryFolder.newFolder());
+
+        dataProbe = jamesServer.getProbe(DataProbeImpl.class);
+        dataProbe.addDomain(DEFAULT_DOMAIN);
+        dataProbe.addUser(FROM, PASSWORD);
+
+        FakeMail mail = FakeMail.builder()
+            .name("a-mail-with-7bit-base64-encoding")
+            .sender(new MailAddress(FROM))
+            .recipient(new MailAddress(RECIPIENT))
+            .mimeMessage(MimeMessageUtil.mimeMessageFromStream(
+                
ClassLoader.getSystemResourceAsStream(("eml/message-multipart-7bit.eml"))))
+            .build();
+        messageSender.connect(LOCALHOST_IP, 
jamesServer.getProbe(SmtpGuiceProbe.class).getSmtpPort())
+            .sendMessage(mail);
+
+        MimeMessage sendMessage = toMimeMessage(getFirstRecivedMail());
+
+        assertThat(dkimVerifier.verifyUsingCRLF(sendMessage))
+            .isNotEmpty();
+    }
+
+    @Test
+    public void 
remoteDeliveryShouldNotBreakDKIMSignWhen7BitMessageAndDisable8BitMime() throws 
Exception {
+        InMemoryDNSService inMemoryDNSService = new InMemoryDNSService()
+            .registerMxRecord(JAMES_ANOTHER_DOMAIN, mockSmtp.getContainerIp());
+
+        jamesServer = TemporaryJamesServer.builder()
+            .withBase(SMTP_ONLY_MODULE)
+            .withOverrides(binder -> 
binder.bind(DNSService.class).toInstance(inMemoryDNSService))
+            
.withMailetContainer(TemporaryJamesServer.SIMPLE_MAILET_CONTAINER_CONFIGURATION
+                
.putProcessor(directResolutionTransport(MailetConfiguration.remoteDeliveryBuilder()
+                    .addProperty("mail.smtp.allow8bitmime", "false")))
+                .putProcessor(CommonProcessors.bounces()))
+            .build(temporaryFolder.newFolder());
+
+        dataProbe = jamesServer.getProbe(DataProbeImpl.class);
+        dataProbe.addDomain(DEFAULT_DOMAIN);
+        dataProbe.addUser(FROM, PASSWORD);
+
+        FakeMail mail = FakeMail.builder()
+            .name("a-mail-with-7bit-encoding")
+            .sender(new MailAddress(FROM))
+            .recipient(new MailAddress(RECIPIENT))
+            .mimeMessage(MimeMessageUtil.mimeMessageFromStream(
+                
ClassLoader.getSystemResourceAsStream(("eml/message-text-only-7bit.eml"))))
+            .build();
+        messageSender.connect(LOCALHOST_IP, 
jamesServer.getProbe(SmtpGuiceProbe.class).getSmtpPort())
+            .sendMessage(mail);
+
+        MimeMessage sendMessage = toMimeMessage(getFirstRecivedMail());
+
+        assertThat(dkimVerifier.verifyUsingCRLF(sendMessage))
+            .isNotEmpty();
+    }
+
+    @Test
+    public void 
remoteDeliveryShouldNotBreakDKIMSignWhen7BitAndBase64MessageAndDisable8BitMime()
 throws Exception {
+        InMemoryDNSService inMemoryDNSService = new InMemoryDNSService()
+            .registerMxRecord(JAMES_ANOTHER_DOMAIN, mockSmtp.getContainerIp());
+
+        jamesServer = TemporaryJamesServer.builder()
+            .withBase(SMTP_ONLY_MODULE)
+            .withOverrides(binder -> 
binder.bind(DNSService.class).toInstance(inMemoryDNSService))
+            
.withMailetContainer(TemporaryJamesServer.SIMPLE_MAILET_CONTAINER_CONFIGURATION
+                
.putProcessor(directResolutionTransport(MailetConfiguration.remoteDeliveryBuilder()
+                    .addProperty("mail.smtp.allow8bitmime", "false")))
+                .putProcessor(CommonProcessors.bounces()))
+            .build(temporaryFolder.newFolder());
+
+        dataProbe = jamesServer.getProbe(DataProbeImpl.class);
+        dataProbe.addDomain(DEFAULT_DOMAIN);
+        dataProbe.addUser(FROM, PASSWORD);
+
+        FakeMail mail = FakeMail.builder()
+            .name("a-mail-with-7bit-base64-encoding")
+            .sender(new MailAddress(FROM))
+            .recipient(new MailAddress(RECIPIENT))
+            .mimeMessage(MimeMessageUtil.mimeMessageFromStream(
+                
ClassLoader.getSystemResourceAsStream(("eml/message-multipart-7bit.eml"))))
+            .build();
+        messageSender.connect(LOCALHOST_IP, 
jamesServer.getProbe(SmtpGuiceProbe.class).getSmtpPort())
+            .sendMessage(mail);
+
+        MimeMessage sendMessage = toMimeMessage(getFirstRecivedMail());
+
+        assertThat(dkimVerifier.verifyUsingCRLF(sendMessage))
+            .isNotEmpty();
+    }
+
+    @Ignore("assertion failed:" +
+        "org.apache.james.jdkim.exceptions.PermFailException: Computed 
bodyhash is different from the expected one")
+    @Test
+    public void 
remoteDeliveryShouldNotBreakDKIMSignWhen8BitMessageAndAllowing8BitMime() throws 
Exception {
+        InMemoryDNSService inMemoryDNSService = new InMemoryDNSService()
+            .registerMxRecord(JAMES_ANOTHER_DOMAIN, mockSmtp.getContainerIp());
+
+        jamesServer = TemporaryJamesServer.builder()
+            .withBase(SMTP_ONLY_MODULE)
+            .withOverrides(binder -> 
binder.bind(DNSService.class).toInstance(inMemoryDNSService))
+            
.withMailetContainer(TemporaryJamesServer.SIMPLE_MAILET_CONTAINER_CONFIGURATION
+                
.putProcessor(directResolutionTransport(MailetConfiguration.remoteDeliveryBuilder()))
+                .putProcessor(CommonProcessors.bounces()))
+            .build(temporaryFolder.newFolder());
+
+        dataProbe = jamesServer.getProbe(DataProbeImpl.class);
+        dataProbe.addDomain(DEFAULT_DOMAIN);
+        dataProbe.addUser(FROM, PASSWORD);
+
+        FakeMail mail = FakeMail.builder()
+            .name("a-mail-with-8bit-encoding")
+            .sender(new MailAddress(FROM))
+            .recipient(new MailAddress(RECIPIENT))
+            .mimeMessage(MimeMessageUtil.mimeMessageFromStream(
+                
ClassLoader.getSystemResourceAsStream(("eml/message-text-only-7bit.eml"))))
+            .build();
+        messageSender.connect(LOCALHOST_IP, 
jamesServer.getProbe(SmtpGuiceProbe.class).getSmtpPort())
+            .sendMessage(mail);
+
+        MimeMessage sendMessage = toMimeMessage(getFirstRecivedMail());
+
+        assertThat(dkimVerifier.verifyUsingCRLF(sendMessage))
+            .isNotEmpty();
+    }
+
+    @Test
+    public void 
remoteDeliveryShouldNotBreakDKIMSignWhen8BitAndBase64MessageAndAllowing8BitMime()
 throws Exception {
+        InMemoryDNSService inMemoryDNSService = new InMemoryDNSService()
+            .registerMxRecord(JAMES_ANOTHER_DOMAIN, mockSmtp.getContainerIp());
+
+        jamesServer = TemporaryJamesServer.builder()
+            .withBase(SMTP_ONLY_MODULE)
+            .withOverrides(binder -> 
binder.bind(DNSService.class).toInstance(inMemoryDNSService))
+            
.withMailetContainer(TemporaryJamesServer.SIMPLE_MAILET_CONTAINER_CONFIGURATION
+                
.putProcessor(directResolutionTransport(MailetConfiguration.remoteDeliveryBuilder()))
+                .putProcessor(CommonProcessors.bounces()))
+            .build(temporaryFolder.newFolder());
+
+        dataProbe = jamesServer.getProbe(DataProbeImpl.class);
+        dataProbe.addDomain(DEFAULT_DOMAIN);
+        dataProbe.addUser(FROM, PASSWORD);
+
+        FakeMail mail = FakeMail.builder()
+            .name("a-mail-with-8bit-base64-encoding")
+            .sender(new MailAddress(FROM))
+            .recipient(new MailAddress(RECIPIENT))
+            .mimeMessage(MimeMessageUtil.mimeMessageFromStream(
+                
ClassLoader.getSystemResourceAsStream(("eml/message-multipart-8bit.eml"))))
+            .build();
+        messageSender.connect(LOCALHOST_IP, 
jamesServer.getProbe(SmtpGuiceProbe.class).getSmtpPort())
+            .sendMessage(mail);
+
+        MimeMessage sendMessage = toMimeMessage(getFirstRecivedMail());
+
+        assertThat(dkimVerifier.verifyUsingCRLF(sendMessage))
+            .isNotEmpty();
+    }
+
+    @Test
+    public void 
remoteDeliveryShouldNotBreakDKIMSignWhen8BitMessageAndDisable8BitMime() throws 
Exception {
+        InMemoryDNSService inMemoryDNSService = new InMemoryDNSService()
+            .registerMxRecord(JAMES_ANOTHER_DOMAIN, mockSmtp.getContainerIp());
+
+        jamesServer = TemporaryJamesServer.builder()
+            .withBase(SMTP_ONLY_MODULE)
+            .withOverrides(binder -> 
binder.bind(DNSService.class).toInstance(inMemoryDNSService))
+            
.withMailetContainer(TemporaryJamesServer.SIMPLE_MAILET_CONTAINER_CONFIGURATION
+                
.putProcessor(directResolutionTransport(MailetConfiguration.remoteDeliveryBuilder()
+                    .addProperty("mail.smtp.allow8bitmime", "false")))
+                .putProcessor(CommonProcessors.bounces()))
+            .build(temporaryFolder.newFolder());
+
+        dataProbe = jamesServer.getProbe(DataProbeImpl.class);
+        dataProbe.addDomain(DEFAULT_DOMAIN);
+        dataProbe.addUser(FROM, PASSWORD);
+
+        FakeMail mail = FakeMail.builder()
+            .name("a-mail-with-8bit-encoding")
+            .sender(new MailAddress(FROM))
+            .recipient(new MailAddress(RECIPIENT))
+            .mimeMessage(MimeMessageUtil.mimeMessageFromStream(
+                
ClassLoader.getSystemResourceAsStream(("eml/message-text-only-8bit.eml"))))
+            .build();
+        messageSender.connect(LOCALHOST_IP, 
jamesServer.getProbe(SmtpGuiceProbe.class).getSmtpPort())
+            .sendMessage(mail);
+
+        MimeMessage sendMessage = toMimeMessage(getFirstRecivedMail());
+
+        assertThat(dkimVerifier.verifyUsingCRLF(sendMessage))
+            .isNotEmpty();
+    }
+
+    @Test
+    public void 
remoteDeliveryShouldNotBreakDKIMSignWhen8BitAndBase64MessageAndDisable8BitMime()
 throws Exception {
+        InMemoryDNSService inMemoryDNSService = new InMemoryDNSService()
+            .registerMxRecord(JAMES_ANOTHER_DOMAIN, mockSmtp.getContainerIp());
+
+        jamesServer = TemporaryJamesServer.builder()
+            .withBase(SMTP_ONLY_MODULE)
+            .withOverrides(binder -> 
binder.bind(DNSService.class).toInstance(inMemoryDNSService))
+            
.withMailetContainer(TemporaryJamesServer.SIMPLE_MAILET_CONTAINER_CONFIGURATION
+                
.putProcessor(directResolutionTransport(MailetConfiguration.remoteDeliveryBuilder()
+                    .addProperty("mail.smtp.allow8bitmime", "false")))
+                .putProcessor(CommonProcessors.bounces()))
+            .build(temporaryFolder.newFolder());
+
+        dataProbe = jamesServer.getProbe(DataProbeImpl.class);
+        dataProbe.addDomain(DEFAULT_DOMAIN);
+        dataProbe.addUser(FROM, PASSWORD);
+
+        FakeMail mail = FakeMail.builder()
+            .name("a-mail-with-8bit-base64-encoding")
+            .sender(new MailAddress(FROM))
+            .recipient(new MailAddress(RECIPIENT))
+            .mimeMessage(MimeMessageUtil.mimeMessageFromStream(
+                
ClassLoader.getSystemResourceAsStream(("eml/message-multipart-8bit.eml"))))
+            .build();
+        messageSender.connect(LOCALHOST_IP, 
jamesServer.getProbe(SmtpGuiceProbe.class).getSmtpPort())
+            .sendMessage(mail);
+
+        MimeMessage sendMessage = toMimeMessage(getFirstRecivedMail());
+
+        assertThat(dkimVerifier.verifyUsingCRLF(sendMessage))
+            .isNotEmpty();
+    }
+
+    private MimeMessage toMimeMessage(Mail mail) {
+        try {
+            return MimeMessageUtil.mimeMessageFromString(mail.getMessage());
+        } catch (MessagingException e) {
+            throw new RuntimeException(e);
+        }
+    }
+
+    private Mail getFirstRecivedMail() {
+        return awaitAtMostOneMinute
+            .until(() -> mockSMTPConfiguration.listMails()
+                .stream()
+                .findFirst(), Optional::isPresent)
+            .get();
+    }
+
+    private ProcessorConfiguration.Builder 
directResolutionTransport(MailetConfiguration.Builder 
remoteDeliveryConfiguration) {
+        return ProcessorConfiguration.transport()
+            .addMailet(MailetConfiguration.BCC_STRIPPER)
+            .addMailet(CONVERT_TO_7BIT_MAILET)
+            .addMailet(DKIMSIGN_MAILET)
+            .addMailet(remoteDeliveryConfiguration
+                .matcher(All.class));
+    }
+
+    private ConfigurationClient configurationClient(DockerContainer mockSmtp) {
+        return ConfigurationClient.from(
+            Host.from(mockSmtp.getHostIp(),
+                mockSmtp.getMappedPort(8000)));
+    }
+}
diff --git 
a/server/mailet/integration-testing/src/test/resources/eml/message-multipart-7bit.eml
 
b/server/mailet/integration-testing/src/test/resources/eml/message-multipart-7bit.eml
new file mode 100644
index 0000000..ca97347
--- /dev/null
+++ 
b/server/mailet/integration-testing/src/test/resources/eml/message-multipart-7bit.eml
@@ -0,0 +1,142 @@
+Return-Path: <[email protected]>
+MIME-Version: 1.0
+Delivered-To: [email protected]
+Received: from 10.233.68.83 (EHLO incoming.james.org) ([10.233.68.83])
+          by james-0 (JAMES SMTP Server ) with ESMTP ID -973333758
+          for <[email protected]>;
+          Wed, 22 Jan 2020 03:47:32 +0000 (UTC)
+Received: from smtp.james.org (unknown [10.233.65.0])
+       by incoming.james.org (Postfix) with ESMTPS id 8151D43
+       for <[email protected]>; Wed, 22 Jan 2020 03:47:32 +0000 (UTC)
+Received: from [10.116.29.102] (unknown [1.54.162.156])
+       (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits))
+       (No client certificate requested)
+       by smtp.james.org (Postfix) with ESMTPSA id D6C653F38C
+       for <[email protected]>; Wed, 22 Jan 2020 04:47:31 +0100 (CET)
+To: [email protected]
+X-LINAGORA-Copy-Delivery-Done: 1
+From: Uncle Bob <[email protected]>
+Subject: multipart
+Message-ID: <[email protected]>
+Date: Wed, 22 Jan 2020 10:47:17 +0700
+User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:60.0) Gecko/20100101
+ Thunderbird/60.2.1
+Content-Type: multipart/mixed;
+ boundary="------------C3FD44EAF9B6A93E163D9176"
+Content-Language: en-US
+
+This is a multi-part message in MIME format.
+--------------C3FD44EAF9B6A93E163D9176
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: quoted-printable
+
+A quoted-printable encoded body with =E2=82=ACuro symbol.
+
+
+
+--------------C3FD44EAF9B6A93E163D9176
+Content-Type: image/png;
+ name="james-logo.png"
+Content-Transfer-Encoding: base64
+Content-Disposition: attachment;
+ filename="james-logo.png"
+
+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
+RK5CYII=
+--------------C3FD44EAF9B6A93E163D9176--
diff --git 
a/server/mailet/integration-testing/src/test/resources/eml/message-multipart-8bit.eml
 
b/server/mailet/integration-testing/src/test/resources/eml/message-multipart-8bit.eml
new file mode 100644
index 0000000..3c8c8f4
--- /dev/null
+++ 
b/server/mailet/integration-testing/src/test/resources/eml/message-multipart-8bit.eml
@@ -0,0 +1,128 @@
+Return-Path: <[email protected]>
+MIME-Version: 1.0
+Delivered-To: [email protected]
+Received: from 10.233.68.83 (EHLO incoming.james.org) ([10.233.68.83])
+          by james-0 (JAMES SMTP Server ) with ESMTP ID 926590876
+          for <[email protected]>;
+          Tue, 21 Jan 2020 07:12:56 +0000 (UTC)
+Received: from smtp.james.org (unknown [10.233.68.1])
+       by incoming.james.org (Postfix) with ESMTPS id B39A643
+       for <[email protected]>; Tue, 21 Jan 2020 07:12:56 +0000 (UTC)
+Received: from duc-HP-ProBook-450-G4 (unknown [1.54.162.156])
+       (using TLSv1.2 with cipher ECDHE-RSA-AES256-SHA384 (256/256 bits))
+       (No client certificate requested)
+       by smtp.james.org (Postfix) with ESMTPSA id F11B13F386
+       for <[email protected]>; Tue, 21 Jan 2020 08:12:55 +0100 (CET)
+Date: Tue, 21 Jan 2020 14:12:39 +0700 (ICT)
+X-LINAGORA-Copy-Delivery-Done: 1
+From: [email protected]
+To: [email protected]
+Message-ID: <423733503.3.1579590775567@duc-HP-ProBook-450-G4>
+Subject: UTF-8 8bit multipart
+Content-Type: multipart/mixed; 
+       boundary="----=_Part_0_238762799.1579590759052"
+
+------=_Part_0_238762799.1579590759052
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+A 8bit encoded body with €uro symbol.
+------=_Part_0_238762799.1579590759052
+Content-Type: application/octet-stream; name=james-logo.png
+Content-Transfer-Encoding: base64
+Content-Disposition: attachment; filename=james-logo.png
+
+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
+
+------=_Part_0_238762799.1579590759052--
diff --git 
a/server/mailet/integration-testing/src/test/resources/eml/message-text-only-7bit.eml
 
b/server/mailet/integration-testing/src/test/resources/eml/message-text-only-7bit.eml
new file mode 100644
index 0000000..7e010ba
--- /dev/null
+++ 
b/server/mailet/integration-testing/src/test/resources/eml/message-text-only-7bit.eml
@@ -0,0 +1,27 @@
+Return-Path: <[email protected]>
+MIME-Version: 1.0
+Delivered-To: [email protected]
+Received: from 10.233.68.83 (EHLO incoming.james.org) ([10.233.68.83])
+          by james-0 (JAMES SMTP Server ) with ESMTP ID -1705393842
+          for <[email protected]>;
+          Wed, 22 Jan 2020 04:11:54 +0000 (UTC)
+Received: from smtp.james.org (unknown [10.233.65.0])
+       by incoming.james.org (Postfix) with ESMTPS id CCCA943
+       for <[email protected]>; Wed, 22 Jan 2020 04:11:54 +0000 (UTC)
+Received: from [10.116.29.102] (unknown [1.54.162.156])
+       (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits))
+       (No client certificate requested)
+       by smtp.james.org (Postfix) with ESMTPSA id 2B7D13F393
+       for <[email protected]>; Wed, 22 Jan 2020 05:11:53 +0100 (CET)
+To: [email protected]
+X-LINAGORA-Copy-Delivery-Done: 1
+From: Uncle Bob <[email protected]>
+Subject: quoted
+Message-ID: <[email protected]>
+Date: Wed, 22 Jan 2020 11:11:38 +0700
+User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:60.0) Gecko/20100101
+ Thunderbird/60.2.1
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: quoted-printable
+
+A quoted-printable encoded body with =E2=82=ACuro symbol.
\ No newline at end of file
diff --git 
a/server/mailet/integration-testing/src/test/resources/eml/message-text-only-8bit.eml
 
b/server/mailet/integration-testing/src/test/resources/eml/message-text-only-8bit.eml
new file mode 100644
index 0000000..96ed638
--- /dev/null
+++ 
b/server/mailet/integration-testing/src/test/resources/eml/message-text-only-8bit.eml
@@ -0,0 +1,28 @@
+Return-Path: <[email protected]>
+MIME-Version: 1.0
+Delivered-To: [email protected]
+Received: from 10.233.68.83 (EHLO incoming.james.org) ([10.233.68.83])
+          by james-0 (JAMES SMTP Server ) with ESMTP ID -1705393842
+          for <[email protected]>;
+          Wed, 22 Jan 2020 04:11:54 +0000 (UTC)
+Received: from smtp.james.org (unknown [10.233.65.0])
+       by incoming.james.org (Postfix) with ESMTPS id CCCA943
+       for <[email protected]>; Wed, 22 Jan 2020 04:11:54 +0000 (UTC)
+Received: from [10.116.29.102] (unknown [1.54.162.156])
+       (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits))
+       (No client certificate requested)
+       by smtp.james.org (Postfix) with ESMTPSA id 2B7D13F393
+       for <[email protected]>; Wed, 22 Jan 2020 05:11:53 +0100 (CET)
+To: [email protected]
+X-LINAGORA-Copy-Delivery-Done: 1
+From: Uncle Bob <[email protected]>
+Subject: quoted
+Message-ID: <[email protected]>
+Date: Wed, 22 Jan 2020 11:11:38 +0700
+User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:60.0) Gecko/20100101
+ Thunderbird/60.2.1
+Content-Type: text/plain; charset=utf-8; format=flowed
+Content-Transfer-Encoding: 8bit
+Content-Language: en-US
+
+A 8bit encoded body with €uro symbol.
\ No newline at end of file


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to