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]
