/* DigiDoc4J library
*
* This software is released under either the GNU Library General Public
* License (see LICENSE.LGPL).
*
* Note that the only valid version of the LGPL license as far as this
* project is concerned is the original GNU Library General Public License
* Version 2.1, February 1999
*/
package org.digidoc4j;
import static org.digidoc4j.ContainerBuilder.BDOC_CONTAINER_TYPE;
import static org.digidoc4j.SignatureProfile.B_EPES;
import static org.digidoc4j.SignatureProfile.LT_TM;
import static org.digidoc4j.testutils.TestDataBuilder.createContainerWithFile;
import static org.digidoc4j.testutils.TestDataBuilder.open;
import static org.junit.Assert.assertTrue;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import org.apache.commons.io.FileUtils;
import org.digidoc4j.impl.DigiDoc4JTestHelper;
import org.digidoc4j.impl.ddoc.ConfigManagerInitializer;
import org.digidoc4j.signers.PKCS12SignatureToken;
import org.digidoc4j.testutils.TestDataBuilder;
import org.junit.Before;
import org.junit.Rule;
import org.junit.Test;
import org.junit.rules.TemporaryFolder;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import ee.sk.digidoc.DigiDocException;
import ee.sk.digidoc.factory.DigiDocFactory;
import ee.sk.utils.ConfigManager;
public class LibraryInteroperabilityTest extends DigiDoc4JTestHelper {
private final static Logger logger = LoggerFactory.getLogger(LibraryInteroperabilityTest.class);
private static final Configuration TEST_CONF = new Configuration(Configuration.Mode.TEST);
private static final Configuration PROD_CONF = new Configuration(Configuration.Mode.PROD);
private static final ConfigManagerInitializer configManagerInitializer = new ConfigManagerInitializer();
@Rule
public TemporaryFolder testFolder = new TemporaryFolder();
private String tempFilePath;
private PKCS12SignatureToken signatureToken;
@Before
public void setUp() throws Exception {
signatureToken = new PKCS12SignatureToken("testFiles/signout.p12", "test".toCharArray());
tempFilePath = testFolder.newFile("test.bdoc").getPath();
configManagerInitializer.initConfigManager(TEST_CONF);
}
@Test
public void verifyWithJDigidoc() throws Exception {
createSignedContainerWithDigiDoc4j(tempFilePath);
validateContainerWithJDigiDoc(tempFilePath);
}
@Test
public void verifyLibdigidocTS_SignatureWithDigiDoc4j() {
Container container = ContainerBuilder.
aContainer(BDOC_CONTAINER_TYPE).
fromExistingFile("testFiles/Libdigidoc_created_tsa_signature_TS.bdoc").
withConfiguration(PROD_CONF).
build();
validateContainer(container);
}
@Test
public void verifyAddingSignatureToJDigiDocContainer() throws Exception {
Container container = ContainerBuilder.
aContainer(BDOC_CONTAINER_TYPE).
fromExistingFile("testFiles/DigiDocService_spec_est.pdf-TM-j.bdoc").
withConfiguration(TEST_CONF).
build();
TestDataBuilder.signContainer(container);
validateContainer(container);
container.saveAsFile(tempFilePath);
container = TestDataBuilder.open(tempFilePath);
validateContainer(container);
validateContainerWithJDigiDoc(tempFilePath);
}
@Test
public void verifyAddingMobileIdSignature_extractedByjDigidoc_shouldBeValid() throws Exception {
Container container = ContainerBuilder.
aContainer(BDOC_CONTAINER_TYPE).
withConfiguration(PROD_CONF).
withDataFile(new FileInputStream("testFiles/special-char-files/pdf-containing-xml.pdf"), "Sularaha sissemakse.pdf", "application/octet-stream").
build();
Signature signature = openSignature(container, "testFiles/xades/bdoc-tm-jdigidoc-mobile-id.xml");
container.addSignature(signature);
assertTrue(container.validate().isValid());
container.saveAsFile(tempFilePath);
validateContainerWithJDigiDoc(tempFilePath);
}
@Test
public void extendEpesToLtTm_validateWithJdigidoc() throws Exception {
Container container = createContainerWithFile("testFiles/test.txt", "text/plain");
TestDataBuilder.signContainer(container, B_EPES);
container.saveAsFile(tempFilePath);
container = open(tempFilePath);
container.extendSignatureProfile(LT_TM);
String extendedContainerPath = testFolder.newFile("extended.bdoc").getPath();
container.saveAsFile(extendedContainerPath);
validateContainerWithJDigiDoc(extendedContainerPath);
}
private void createSignedContainerWithDigiDoc4j(String containerFilePath) {
Container container = ContainerBuilder.
aContainer(BDOC_CONTAINER_TYPE).
withConfiguration(TEST_CONF).
withDataFile("testFiles/test.txt", "text/plain").
build();
signContainer(container, signatureToken);
signContainer(container, signatureToken);
logger.debug("Saving test file temporarily to " + containerFilePath);
container.saveAsFile(containerFilePath);
}
private void signContainer(Container container, PKCS12SignatureToken signatureToken) {
Signature signature = SignatureBuilder.
aSignature(container).
withSignatureProfile(SignatureProfile.LT_TM).
withSignatureToken(signatureToken).
invokeSigning();
container.addSignature(signature);
}
private void validateContainerWithJDigiDoc(String containerFilePath) throws DigiDocException {
boolean isBdoc = true;
List errors = new ArrayList();
DigiDocFactory digFac = ConfigManager.instance().getDigiDocFactory();
digFac.readSignedDocOfType(containerFilePath, isBdoc, errors);
assertTrue(getJDigiDocErrorMessage(errors), errors.isEmpty());
}
protected void validateContainer(Container container) {
ValidationResult result = container.validate();
assertTrue(result.isValid());
}
private String getJDigiDocErrorMessage(List errors) {
String msg = "";
for(Object error : errors) {
msg += error.toString() + "; ";
}
return msg;
}
private Signature openSignature(Container container, String pathname) throws IOException {
byte[] signatureBytes = FileUtils.readFileToByteArray(new File(pathname));
Signature signature = SignatureBuilder.
aSignature(container).
openAdESSignature(signatureBytes);
return signature;
}
}