summaryrefslogtreecommitdiff
path: root/pdf-over-signer/pdf-over-sigpdfas3/src/main/java/at/asit/pdfover/signer/pdfas/PDFASSigner.java
diff options
context:
space:
mode:
Diffstat (limited to 'pdf-over-signer/pdf-over-sigpdfas3/src/main/java/at/asit/pdfover/signer/pdfas/PDFASSigner.java')
-rw-r--r--pdf-over-signer/pdf-over-sigpdfas3/src/main/java/at/asit/pdfover/signer/pdfas/PDFASSigner.java190
1 files changed, 190 insertions, 0 deletions
diff --git a/pdf-over-signer/pdf-over-sigpdfas3/src/main/java/at/asit/pdfover/signer/pdfas/PDFASSigner.java b/pdf-over-signer/pdf-over-sigpdfas3/src/main/java/at/asit/pdfover/signer/pdfas/PDFASSigner.java
new file mode 100644
index 00000000..6fa1c094
--- /dev/null
+++ b/pdf-over-signer/pdf-over-sigpdfas3/src/main/java/at/asit/pdfover/signer/pdfas/PDFASSigner.java
@@ -0,0 +1,190 @@
+package at.asit.pdfover.signer.pdfas;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import at.asit.pdfover.signator.BKUs;
+import at.asit.pdfover.signator.ByteArrayDocumentSource;
+import at.asit.pdfover.signator.SLResponse;
+import at.asit.pdfover.signator.SignResult;
+import at.asit.pdfover.signator.SignResultImpl;
+import at.asit.pdfover.signator.SignatureException;
+import at.asit.pdfover.signator.SignatureParameter;
+import at.asit.pdfover.signator.SignaturePosition;
+import at.asit.pdfover.signator.Signer;
+import at.asit.pdfover.signator.SigningState;
+import at.asit.pdfover.signer.pdfas.exceptions.PDFASSLRequestException;
+import at.gv.egiz.pdfas.api.PdfAs;
+import at.gv.egiz.pdfas.api.commons.Constants;
+import at.gv.egiz.pdfas.api.exceptions.PdfAsException;
+import at.gv.egiz.pdfas.api.internal.LocalBKUParams;
+import at.gv.egiz.pdfas.api.internal.PdfAsInternal;
+import at.gv.egiz.pdfas.api.sign.SignParameters;
+import at.gv.egiz.pdfas.api.sign.SignatureDetailInformation;
+import at.gv.egiz.pdfas.io.ByteArrayDataSink;
+
+/**
+ * PDF AS Signer Implementation
+ */
+public class PDFASSigner implements Signer {
+
+ /**
+ * SLF4J Logger instance
+ **/
+ static final Logger log = LoggerFactory.getLogger(PDFASSigner.class);
+
+ /**
+ * The template URL
+ */
+ protected static final String URL_TEMPLATE = "http://pdfover.4.gv.at/template";
+
+ /**
+ * Location reference string
+ */
+ protected static final String LOC_REF = "<sl:LocRefContent>" + URL_TEMPLATE
+ + "</sl:LocRefContent>";
+
+ @Override
+ public SigningState prepare(SignatureParameter parameter)
+ throws SignatureException {
+ try {
+ PdfAsSignatureParameter sign_para = null;
+
+ if (PdfAsSignatureParameter.class.isInstance(parameter)) {
+ sign_para = PdfAsSignatureParameter.class.cast(parameter);
+ }
+
+ if (sign_para == null) {
+ throw new SignatureException("Incorrect SignatureParameter!");
+ }
+
+ PdfAs pdfas = PDFASHelper.getPdfAs();
+
+ PDFASSigningState state = new PDFASSigningState();
+
+ SignParameters params = new SignParameters();
+ params.setSignaturePositioning(sign_para.getPDFASPositioning());
+
+ if (parameter.getSignatureDevice() == BKUs.LOCAL) {
+ params.setSignatureDevice(Constants.SIGNATURE_DEVICE_BKU);
+ } else if (parameter.getSignatureDevice() == BKUs.MOBILE) {
+ params.setSignatureDevice(Constants.SIGNATURE_DEVICE_MOBILE);
+ // params.setSignatureDevice(Constants.SIGNATURE_DEVICE_MOBILETEST);
+ }
+ params.setSignatureType(Constants.SIGNATURE_TYPE_BINARY);
+
+ params.setSignatureProfileId(sign_para.getSignatureProfileID());
+
+ params.setOutput(new ByteArrayDataSink());
+ if (parameter.getEmblem() != null) {
+ params.setProfileOverrideValue("SIG_LABEL", parameter
+ .getEmblem().getFileName());
+ }
+
+ if(parameter.getProperty("SIG_NOTE") != null) {
+ params.setProfileOverrideValue("SIG_NOTE", parameter.getProperty("SIG_NOTE"));
+ }
+
+ // Prepare Output sink
+ state.setOutput(new ByteArrayDataSink());
+ params.setOutput(state.getOutput());
+
+ params.setDocument(sign_para.getPDFASDataSource());
+
+ state.setSignParameters(params);
+
+ PdfAsInternal pdfasInternal = PDFASHelper.getPdfAsInternal();
+
+ // Prepares the document
+ SignatureDetailInformation sdi = pdfas.prepareSign(params);
+
+ state.setSignatureDetailInformation(sdi);
+
+ // Retrieve the SL Request
+ String slRequest = pdfasInternal.prepareLocalSignRequest(params,
+ false, URL_TEMPLATE, sdi);
+
+ at.gv.egiz.pdfas.api.io.DataSource sig_data = sdi
+ .getSignatureData();
+
+ PDFASSLRequest request = new PDFASSLRequest(slRequest,
+ sig_data.getAsByteArray());
+
+ state.setSignatureRequest(request);
+
+ return state;
+ } catch (PDFASSLRequestException e) {
+ throw new SignatureException(e);
+ } catch (PdfAsException e) {
+ throw new SignatureException(e);
+ } catch (Throwable t) {
+ throw new SignatureException(t);
+ }
+ }
+
+ @Override
+ public SignResult sign(SigningState state) throws SignatureException {
+ try {
+ PDFASSigningState sstate = null;
+
+ if (PDFASSigningState.class.isInstance(state)) {
+ sstate = PDFASSigningState.class.cast(state);
+ }
+
+ if (sstate == null) {
+ throw new SignatureException("Incorrect SigningState!");
+ }
+
+ // Retrieve objects
+ PdfAs pdfas = PDFASHelper.getPdfAs();
+
+ PdfAsInternal pdfasInternal = PDFASHelper.getPdfAsInternal();
+
+ SignParameters params = sstate.getSignParameters();
+
+ SignatureDetailInformation sdi = sstate
+ .getSignatureDetailInformation();
+
+ SLResponse slResponse = sstate.getSignatureResponse();
+
+ LocalBKUParams bkuParams = new LocalBKUParams(
+ slResponse.getServer(), slResponse.getUserAgent(),
+ slResponse.getSignaturLayout());
+
+ // Perform signature
+ at.gv.egiz.pdfas.api.sign.SignResult signResult = pdfasInternal
+ .finishLocalSign(pdfas, params, sdi, bkuParams, false,
+ slResponse.getSLRespone());
+
+ // Preparing Result Response
+ SignResultImpl result = new SignResultImpl();
+
+ // Set Signer Certificate
+ result.setSignerCertificate(signResult.getSignerCertificate());
+ at.gv.egiz.pdfas.api.sign.pos.SignaturePosition pdfasPos = signResult
+ .getSignaturePosition();
+
+ // Set Signature position
+ SignaturePosition pos = new SignaturePosition(pdfasPos.getX(),
+ pdfasPos.getY(), pdfasPos.getPage());
+ /*
+ * pos.SetAuto(sstate.getPDFAsSignatureParameter()
+ * .getSignaturePosition().useAutoPositioning());
+ */
+ result.setSignaturePosition(pos);
+
+ // Set signed Document
+ result.setSignedDocument(new ByteArrayDocumentSource(
+ ((ByteArrayDataSink) sstate.getOutput()).getData()));
+
+ return result;
+ } catch (PdfAsException e) {
+ throw new SignatureException(e);
+ }
+ }
+
+ @Override
+ public SignatureParameter newParameter() {
+ return new PdfAsSignatureParameter();
+ }
+}