diff options
Diffstat (limited to 'pdf-as-tests/src/test/java/at/gv/egiz/param_tests/SignatureTest.java')
-rw-r--r-- | pdf-as-tests/src/test/java/at/gv/egiz/param_tests/SignatureTest.java | 176 |
1 files changed, 176 insertions, 0 deletions
diff --git a/pdf-as-tests/src/test/java/at/gv/egiz/param_tests/SignatureTest.java b/pdf-as-tests/src/test/java/at/gv/egiz/param_tests/SignatureTest.java new file mode 100644 index 00000000..97e7e819 --- /dev/null +++ b/pdf-as-tests/src/test/java/at/gv/egiz/param_tests/SignatureTest.java @@ -0,0 +1,176 @@ +package at.gv.egiz.param_tests; + +import static org.junit.Assert.assertNotNull; + +import java.io.File; +import java.io.FileInputStream; +import java.io.FileNotFoundException; +import java.io.FileOutputStream; +import java.io.IOException; +import java.security.cert.CertificateException; +import java.util.Map; +import java.util.UUID; + +import org.apache.commons.io.IOUtils; +import org.junit.Rule; +import org.junit.rules.TestRule; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import at.gv.egiz.param_tests.provider.BaseSignatureDataProvider; +import at.gv.egiz.param_tests.provider.BaseSignatureTestData; +import at.gv.egiz.pdfas.common.exceptions.PdfAsException; +import at.gv.egiz.pdfas.common.utils.StreamUtils; +import at.gv.egiz.pdfas.lib.api.ByteArrayDataSink; +import at.gv.egiz.pdfas.lib.api.ByteArrayDataSource; +import at.gv.egiz.pdfas.lib.api.Configuration; +import at.gv.egiz.pdfas.lib.api.DataSource; +import at.gv.egiz.pdfas.lib.api.PdfAs; +import at.gv.egiz.pdfas.lib.api.PdfAsFactory; +import at.gv.egiz.pdfas.lib.api.sign.IPlainSigner; +import at.gv.egiz.pdfas.lib.api.sign.SignParameter; +import at.gv.egiz.pdfas.sigs.pades.PAdESSigner; +import at.gv.egiz.pdfas.sigs.pades.PAdESSignerKeystore; +import at.gv.egiz.sl.util.BKUSLConnector; +import at.gv.egiz.sl.util.MOAConnector; + +/** + * Base class for parameterized signature tests, which provides fields and + * methods common to all parameterized signature test. + * + * @author mtappler + * + */ +public class SignatureTest { + + /** + * test data common to all test types, like connector type + */ + protected BaseSignatureTestData baseTestData; + /** + * positioning string which specifies the position of the signature block + */ + protected String positionString; + /** + * logger for this class + */ + private static final Logger logger = LoggerFactory + .getLogger(PDFASignatureTest.class); + + /** + * a JUnit TestWatcher, this object gets notified several times a + * subclass of this class is run as test + */ + @Rule + public TestRule watchman = new SignatureTestWatcher(); + + /** + * PdfAs used for signing and creating a configuration + */ + protected PdfAs pdfAs; + /** + * the sign parameter used for signing in the test + */ + protected SignParameter signParameter; + /** + * the connector used for signing in the test + */ + protected IPlainSigner slConnector; + + /** + * This method signs a file, all parameter like input file name are specified + * through fields of this class. + * + * @return the signed file File-object + * @throws IOException + * @throws FileNotFoundException + * @throws CertificateException + * @throws PdfAsException + */ + protected File signPDFFile() throws IOException, FileNotFoundException, + CertificateException, PdfAsException { + File inputFile = new File(baseTestData.getPdfFile()); + File outputPdfFile = new File(baseTestData.getOutputFile()); + DataSource dataSource = new ByteArrayDataSource( + StreamUtils.inputStreamToByteArray(new FileInputStream( + inputFile))); + ByteArrayDataSink dataSink = new ByteArrayDataSink(); + pdfAs = null; + + pdfAs = PdfAsFactory.createPdfAs(new File(baseTestData + .getConfigurationFile())); + Configuration configuration = pdfAs.getConfiguration(); + + signParameter = PdfAsFactory.createSignParameter(configuration, + dataSource); + + String id = UUID.randomUUID().toString(); + signParameter.setTransactionId(id); + logger.debug("Transaction: " + id); + + slConnector = null; + + if (baseTestData.getConnectorData() != null) { + if (baseTestData.getConnectorData().getConnectorType() + .equals("bku")) { + slConnector = new PAdESSigner(new BKUSLConnector(configuration)); + } else if (baseTestData.getConnectorData().getConnectorType() + .equals("moa")) { + slConnector = new PAdESSigner(new MOAConnector(configuration)); + } else if (baseTestData.getConnectorData().getConnectorType() + .equals("ks")) { + Map<String, String> params = baseTestData.getConnectorData() + .getConnectorParameters(); + String keystoreFilename = params + .get(BaseSignatureDataProvider.KS_FILE_NAME); + String keystoreAlias = params + .get(BaseSignatureDataProvider.KS_ALIAS); + String keystoreType = params + .get(BaseSignatureDataProvider.KS_TYPE); + String keystoreStorepass = params + .get(BaseSignatureDataProvider.KS_PASS); + String keystoreKeypass = params + .get(BaseSignatureDataProvider.KS_KEY_PASS); + + assertNotNull( + "You need to provide a keystore file if using ks connector", + keystoreFilename); + assertNotNull( + "You need to provide a key alias if using ks connector", + keystoreAlias); + + slConnector = new PAdESSignerKeystore(keystoreFilename, + keystoreAlias, keystoreStorepass, keystoreKeypass, + keystoreType); + } + } + if (slConnector == null) { + slConnector = new PAdESSigner(new BKUSLConnector(configuration)); + } + + signParameter.setOutput(dataSink); + signParameter.setPlainSigner(slConnector); + signParameter.setDataSource(dataSource); + // this is not needed for PDF-A test + if (positionString != null) + signParameter.setSignaturePosition(positionString); + signParameter.setSignatureProfileId(baseTestData.getProfilID()); + logger.debug("Starting signature for " + baseTestData.getPdfFile()); + logger.debug("Selected signature Profile " + baseTestData.getProfilID()); + /* SignResult result = */pdfAs.sign(signParameter); + FileOutputStream fos = null; + try { + fos = new FileOutputStream(outputPdfFile, false); + fos.write(dataSink.getData()); + fos.close(); + } catch (IOException e) { + logger.debug("IO exception occured while writing PDF output file", + e); + throw e; + } finally { + IOUtils.closeQuietly(fos); + } + + return outputPdfFile; + } +} |