/*
* 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.AccessPointIdentifier;
import no.difi.oxalis.api.model.Direction;
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.statistics.NoopStatisticsService;
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.BeforeMethod;
import org.testng.annotations.Guice;
import org.testng.annotations.Test;
import javax.activation.MimeType;
import javax.activation.MimeTypeParseException;
import javax.mail.MessagingException;
import javax.mail.internet.InternetHeaders;
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;
/**
* Simulates reception of a an AS2 Message, which is validated etc. and finally produces an MDN.
*
* @author steinar
* @author thore
*/
@Test(groups = {"integration"})
@Guice(modules = {GuiceModuleLoader.class})
public class As2InboundHandlerIT {
private ByteArrayInputStream inputStream;
private InternetHeaders headers;
private TimestampProvider mockTimestampProvider;
@Inject
private PrivateKey privateKey;
@Inject
private X509Certificate certificate;
@Inject
private AccessPointIdentifier accessPointIdentifier;
@Inject
private SMimeMessageFactory sMimeMessageFactory;
@BeforeClass
public void beforeClass() 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());
}
@BeforeMethod
public void createHeaders() {
headers = new InternetHeaders();
headers.addHeader(As2Header.DISPOSITION_NOTIFICATION_OPTIONS,
"signed-receipt-protocol=required, pkcs7-signature; signed-receipt-micalg=required,sha1");
headers.addHeader(As2Header.AS2_TO, accessPointIdentifier.toString());
headers.addHeader(As2Header.AS2_FROM, accessPointIdentifier.toString());
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");
}
@BeforeMethod
public void createInputStream() throws MimeTypeParseException, IOException, MessagingException,
OxalisTransmissionException {
SMimeMessageFactory SMimeMessageFactory = new SMimeMessageFactory(privateKey, certificate);
// Fetch input stream for data
InputStream resourceAsStream = getClass().getResourceAsStream("/as2-peppol-bis-invoice-sbdh.xml");
assertNotNull(resourceAsStream);
// Creates the signed message
MimeMessage signedMimeMessage = SMimeMessageFactory
.createSignedMimeMessage(resourceAsStream, new MimeType("application", "xml"), SMimeDigestMethod.sha1);
assertNotNull(signedMimeMessage);
ByteArrayOutputStream baos = new ByteArrayOutputStream();
signedMimeMessage.writeTo(baos);
inputStream = new ByteArrayInputStream(baos.toByteArray());
signedMimeMessage.writeTo(System.out);
}
public void loadAndReceiveTestMessageOK() throws Exception {
As2InboundHandler as2InboundHandler = new As2InboundHandler(
new NoopStatisticsService(), mockTimestampProvider, EmptyCertificateValidator.INSTANCE,
new NoopPersister(), new DefaultTransmissionVerifier(), sMimeMessageFactory);
MimeMessage mimeMessage = MimeMessageHelper.createMimeMessageAssistedByHeaders(inputStream, headers);
MimeMessage mdn = as2InboundHandler.receive(headers, mimeMessage);
// ResponseData responseData = as2InboundHandler.receive(headers, inputStream);
// assertEquals(responseData.getMdnData().getAs2Disposition().getDispositionType(),
// As2Disposition.DispositionType.PROCESSED);
// assertNotNull(responseData.getMdnData().getMic());
}
/**
* Specifies an invalid MIC algorithm (MD5), which should cause reception to fail.
*/
@Test(enabled = false)
public void receiveMessageWithInvalidDispositionRequest() throws Exception {
headers.setHeader(As2Header.DISPOSITION_NOTIFICATION_OPTIONS, "Disposition-Notification-Options: signed-receipt-protocol=required, pkcs7-signature; signed-receipt-micalg=required,md5");
As2InboundHandler as2InboundHandler = new As2InboundHandler(new NoopStatisticsService(),
mockTimestampProvider, EmptyCertificateValidator.INSTANCE, new NoopPersister(),
new DefaultTransmissionVerifier(), sMimeMessageFactory);
MimeMessage mimeMessage = MimeMessageHelper.createMimeMessageAssistedByHeaders(inputStream, headers);
MimeMessage mdn = as2InboundHandler.receive(headers, mimeMessage);
// assertEquals(responseData.getMdnData().getAs2Disposition().getDispositionType(),
// As2Disposition.DispositionType.FAILED);
// assertEquals(responseData.getMdnData().getSubject(), MdnData.SUBJECT);
}
}