summaryrefslogtreecommitdiff
path: root/pdf-over-signer/src/main/java/at/asit/pdfover/signer/pdfas/PdfAs4Signer.java
diff options
context:
space:
mode:
Diffstat (limited to 'pdf-over-signer/src/main/java/at/asit/pdfover/signer/pdfas/PdfAs4Signer.java')
-rw-r--r--pdf-over-signer/src/main/java/at/asit/pdfover/signer/pdfas/PdfAs4Signer.java164
1 files changed, 164 insertions, 0 deletions
diff --git a/pdf-over-signer/src/main/java/at/asit/pdfover/signer/pdfas/PdfAs4Signer.java b/pdf-over-signer/src/main/java/at/asit/pdfover/signer/pdfas/PdfAs4Signer.java
new file mode 100644
index 00000000..9943ec0e
--- /dev/null
+++ b/pdf-over-signer/src/main/java/at/asit/pdfover/signer/pdfas/PdfAs4Signer.java
@@ -0,0 +1,164 @@
+package at.asit.pdfover.signer.pdfas;
+
+import java.io.ByteArrayOutputStream;
+import java.util.UUID;
+
+import javax.activation.DataSource;
+
+import at.asit.pdfover.commons.Profile;
+import at.asit.pdfover.signator.ByteArrayDocumentSource;
+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.gv.egiz.pdfas.common.exceptions.PDFASError;
+import at.gv.egiz.pdfas.common.exceptions.PdfAsException;
+import at.gv.egiz.pdfas.lib.api.ByteArrayDataSource;
+import at.gv.egiz.pdfas.lib.api.Configuration;
+import at.gv.egiz.pdfas.lib.api.IConfigurationConstants;
+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.sl.util.ISLConnector;
+import at.knowcenter.wag.egov.egiz.pdf.TablePos;
+
+/**
+ * PDF AS Signer Implementation
+ */
+public class PdfAs4Signer implements Signer {
+
+
+
+
+ /**
+ * 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 {
+ PdfAs4SignatureParameter sign_para = null;
+
+ if (PdfAs4SignatureParameter.class.isInstance(parameter)) {
+ sign_para = PdfAs4SignatureParameter.class.cast(parameter);
+ }
+
+ if (sign_para == null) {
+ throw new SignatureException("Incorrect SignatureParameter!");
+ }
+
+ String sigProfile = sign_para.getPdfAsSignatureProfileId();
+ String sigEmblem = (sign_para.getEmblem() == null ? null : sign_para.getEmblem().getFileName());
+ String sigNote = sign_para.getProperty("SIG_NOTE");
+ String sigPos = null;
+ if (sign_para.getSignaturePosition() != null) {
+ sigPos = sign_para.getPdfAsSignaturePosition();
+ }
+ PdfAs pdfas = PdfAs4Helper.getPdfAs();
+ Configuration config = pdfas.getConfiguration();
+ if (sigEmblem != null && !sigEmblem.trim().isEmpty()) {
+ config.setValue("sig_obj." + sigProfile + ".value.SIG_LABEL", sigEmblem);
+ }
+
+ if(sigNote != null) {
+ config.setValue("sig_obj." + sigProfile + ".value.SIG_NOTE", sigNote);
+ }
+
+ PdfAs4SigningState state = new PdfAs4SigningState();
+ ByteArrayOutputStream output = new ByteArrayOutputStream();
+ DataSource input = new ByteArrayDataSource(parameter.getInputDocument().getByteArray());
+ SignParameter param = PdfAsFactory.createSignParameter(config, input, output);
+ if (sigPos != null) {
+ param.setSignaturePosition(sigPos);
+ }
+ param.setSignatureProfileId(sigProfile);
+ String id = UUID.randomUUID().toString();
+ param.setTransactionId(id);
+
+ if (parameter.isSearchForPlaceholderSignatures()) {
+ param.getConfiguration().setValue(IConfigurationConstants.PLACEHOLDER_MODE, "1");
+ param.getConfiguration().setValue(IConfigurationConstants.PLACEHOLDER_SEARCH_ENABLED, IConfigurationConstants.TRUE);
+ }
+
+ state.setSignParameter(param);
+ state.setOutput(output);
+ return state;
+ }
+
+ @Override
+ public SignResult sign(SigningState state) throws SignatureException {
+ try {
+ PdfAs4SigningState sstate = null;
+
+ if (PdfAs4SigningState.class.isInstance(state)) {
+ sstate = PdfAs4SigningState.class.cast(state);
+ }
+
+ if (sstate == null) {
+ throw new SignatureException("Incorrect SigningState!");
+ }
+
+ // Retrieve objects
+ PdfAs pdfas = PdfAs4Helper.getPdfAs();
+
+ SignParameter param = sstate.getSignParameter();
+
+ Configuration config = param.getConfiguration();
+ config.setValue(IConfigurationConstants.SL_REQUEST_TYPE,
+ sstate.getUseBase64Request() ?
+ IConfigurationConstants.SL_REQUEST_TYPE_BASE64 :
+ IConfigurationConstants.SL_REQUEST_TYPE_UPLOAD);
+
+ IPlainSigner signer;
+ if (sstate.hasBKUConnector()) {
+ ISLConnector connector = new PdfAs4BKUSLConnector(sstate.getBKUConnector());
+ signer = new PAdESSigner(connector);
+ } else if (sstate.hasKSSigner()) {
+ signer = sstate.getKSSigner();
+ } else {
+ throw new SignatureException("SigningState doesn't have a signer");
+ }
+ param.setPlainSigner(signer);
+
+ pdfas.sign(param);
+
+ SignResultImpl result = new SignResultImpl();
+
+ if (param.getSignaturePosition() != null) {
+ TablePos tp = new TablePos(param.getSignaturePosition());
+ SignaturePosition sp;
+ if (tp.isXauto() && tp.isYauto())
+ sp = new SignaturePosition();
+ else if (tp.isPauto())
+ sp = new SignaturePosition(tp.getPosX(), tp.getPosY());
+ else if (param.getSignatureProfileId().contains(Profile.AMTSSIGNATURBLOCK.name()))
+ sp = new SignaturePosition();
+ else
+ sp = new SignaturePosition(tp.getPosX(), tp.getPosY(), tp.getPage());
+ result.setSignaturePosition(sp);
+ }
+
+ result.setSignedDocument(new ByteArrayDocumentSource(sstate.getOutput().toByteArray()));
+ return result;
+ } catch (PdfAsException | PDFASError e) {
+ throw new SignatureException(e);
+ }
+ }
+
+ @Override
+ public SignatureParameter newParameter() {
+ return new PdfAs4SignatureParameter();
+ }
+}