/*
* Copyright 2010-2017 Norwegian Agency for Public Management and eGovernment (Difi)
*
* Licensed under the EUPL, Version 1.1 or – as soon they
* will be approved by the European Commission - subsequent
* versions of the EUPL (the "Licence");
*
* You may not use this work except in compliance with the Licence.
*
* You may obtain a copy of the Licence at:
*
* https://joinup.ec.europa.eu/community/eupl/og_page/eupl
*
* Unless required by applicable law or agreed to in
* writing, software distributed under the Licence is
* distributed on an "AS IS" basis,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
* express or implied.
* See the Licence for the specific language governing
* permissions and limitations under the Licence.
*/
package no.difi.oxalis.as2.inbound;
import com.google.inject.Inject;
import no.difi.oxalis.api.lang.OxalisTransmissionException;
import no.difi.oxalis.api.model.Direction;
import no.difi.oxalis.api.statistics.StatisticsService;
import no.difi.oxalis.api.timestamp.Timestamp;
import no.difi.oxalis.api.timestamp.TimestampProvider;
import no.difi.oxalis.as2.code.As2Header;
import no.difi.oxalis.as2.util.MimeMessageHelper;
import no.difi.oxalis.as2.util.SMimeDigestMethod;
import no.difi.oxalis.as2.util.SMimeMessageFactory;
import no.difi.oxalis.commons.guice.GuiceModuleLoader;
import no.difi.oxalis.commons.persist.NoopPersister;
import no.difi.oxalis.commons.security.CertificateUtils;
import no.difi.oxalis.commons.transmission.DefaultTransmissionVerifier;
import no.difi.vefa.peppol.security.util.EmptyCertificateValidator;
import org.mockito.Mockito;
import org.testng.annotations.BeforeClass;
import org.testng.annotations.Guice;
import org.testng.annotations.Test;
import javax.mail.MessagingException;
import javax.mail.internet.InternetHeaders;
import javax.mail.internet.MimeBodyPart;
import javax.mail.internet.MimeMessage;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.security.PrivateKey;
import java.security.cert.X509Certificate;
import java.util.Date;
import static org.testng.Assert.assertNotNull;
/**
* Verifies that the As2InboundHandler works as expected.
*
* @author steinar
* Date: 08.12.2015
* Time: 15.21
*/
@Guice(modules = GuiceModuleLoader.class)
public class As2InboundHandlerTest {
private InternetHeaders headers;
private String ourCommonName;
private TimestampProvider mockTimestampProvider;
@Inject
private X509Certificate certificate;
@Inject
private PrivateKey privateKey;
@Inject
private SMimeMessageFactory sMimeMessageFactory;
@BeforeClass
public void setUp() throws Exception {
mockTimestampProvider = Mockito.mock(TimestampProvider.class);
Mockito.doReturn(new Timestamp(new Date(), null)).when(mockTimestampProvider)
.generate(Mockito.any(), Mockito.any(Direction.class));
Mockito.doReturn(new Timestamp(new Date(), null)).when(mockTimestampProvider)
.generate(Mockito.any(), Mockito.any(Direction.class), Mockito.any());
ourCommonName = CertificateUtils.extractCommonName(certificate);
headers = new InternetHeaders();
headers.addHeader(As2Header.DISPOSITION_NOTIFICATION_OPTIONS, "Disposition-Notification-Options: signed-receipt-protocol=required, pkcs7-signature; signed-receipt-micalg=required,sha1");
headers.addHeader(As2Header.AS2_TO, ourCommonName);
headers.addHeader(As2Header.AS2_FROM, ourCommonName);
headers.addHeader(As2Header.MESSAGE_ID, "42");
headers.addHeader(As2Header.AS2_VERSION, As2Header.VERSION);
headers.addHeader(As2Header.SUBJECT, "An AS2 message");
headers.addHeader(As2Header.DATE, "Mon Oct 21 22:01:48 CEST 2013");
}
@Test(enabled = false)
public void testReceive() throws Exception {
InputStream inputStream = loadSampleMimeMessage();
As2InboundHandler as2InboundHandler = new As2InboundHandler(Mockito.mock(StatisticsService.class),
mockTimestampProvider, EmptyCertificateValidator.INSTANCE, new NoopPersister(),
new DefaultTransmissionVerifier(), sMimeMessageFactory);
MimeMessage mimeMessage = MimeMessageHelper.createMimeMessageAssistedByHeaders(inputStream, headers);
as2InboundHandler.receive(headers, mimeMessage);
}
/**
* Creates a fake S/MIME message, to mimic the data being posted in an http POST request.
*
* @return
*/
InputStream loadSampleMimeMessage() {
InputStream resourceAsStream = this.getClass().getClassLoader().getResourceAsStream("sbdh-asic.xml");
assertNotNull(resourceAsStream);
try {
MimeBodyPart mimeBodyPart = MimeMessageHelper.createMimeBodyPart(resourceAsStream, "application/xml");
SMimeMessageFactory sMimeMessageFactory = new SMimeMessageFactory(privateKey, certificate);
MimeMessage signedMimeMessage = sMimeMessageFactory
.createSignedMimeMessage(mimeBodyPart, SMimeDigestMethod.sha1);
ByteArrayOutputStream os = new ByteArrayOutputStream();
signedMimeMessage.writeTo(os);
return new ByteArrayInputStream(os.toByteArray());
} catch (MessagingException | IOException | OxalisTransmissionException e) {
throw new IllegalStateException("Unable to write S/MIME message to byte array outputstream " + e.getMessage(), e);
}
}
}