aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndreas Fitzek <andreas.fitzek@iaik.tugraz.at>2014-06-05 10:46:34 +0200
committerAndreas Fitzek <andreas.fitzek@iaik.tugraz.at>2014-06-05 10:46:34 +0200
commit6ea2c1db26260c1f36e01c58fc6f8ef0220e577e (patch)
tree79fc40a581daa9269d9cd140bebef24fac475b56
parent531124af765490a63c3a1121ba81fed21c6d7ab4 (diff)
downloadpdf-as-4-6ea2c1db26260c1f36e01c58fc6f8ef0220e577e.tar.gz
pdf-as-4-6ea2c1db26260c1f36e01c58fc6f8ef0220e577e.tar.bz2
pdf-as-4-6ea2c1db26260c1f36e01c58fc6f8ef0220e577e.zip
SOAP Service for backend upload + transaction ID fixes
-rw-r--r--pdf-as-common/src/main/java/at/gv/egiz/pdfas/api/ws/PDFASSignParameters.java49
-rw-r--r--pdf-as-common/src/main/java/at/gv/egiz/pdfas/api/ws/PDFASSignResponse.java9
-rw-r--r--pdf-as-common/src/main/java/at/gv/egiz/pdfas/api/ws/PDFASSigning.java6
-rw-r--r--pdf-as-lib/src/main/java/at/gv/egiz/pdfas/lib/api/StatusRequest.java4
-rw-r--r--pdf-as-lib/src/main/java/at/gv/egiz/pdfas/lib/impl/StatusRequestImpl.java7
-rw-r--r--pdf-as-web-client/src/main/java/at/gv/egiz/pdfas/web/client/RemotePDFSigner.java5
-rw-r--r--pdf-as-web-client/src/test/java/at/gv/egiz/pdfas/web/client/test/SimpleTest.java10
-rw-r--r--pdf-as-web/src/main/java/at/gv/egiz/pdfas/web/config/WebConfiguration.java13
-rw-r--r--pdf-as-web/src/main/java/at/gv/egiz/pdfas/web/exception/PdfAsStoreException.java17
-rw-r--r--pdf-as-web/src/main/java/at/gv/egiz/pdfas/web/helper/PdfAsHelper.java44
-rw-r--r--pdf-as-web/src/main/java/at/gv/egiz/pdfas/web/helper/PdfAsParameterExtractor.java6
-rw-r--r--pdf-as-web/src/main/java/at/gv/egiz/pdfas/web/servlets/ExternSignServlet.java4
-rw-r--r--pdf-as-web/src/main/java/at/gv/egiz/pdfas/web/servlets/UIEntryPointServlet.java117
-rw-r--r--pdf-as-web/src/main/java/at/gv/egiz/pdfas/web/store/IRequestStore.java8
-rw-r--r--pdf-as-web/src/main/java/at/gv/egiz/pdfas/web/store/InMemoryRequestStore.java31
-rw-r--r--pdf-as-web/src/main/java/at/gv/egiz/pdfas/web/store/RequestStore.java35
-rw-r--r--pdf-as-web/src/main/java/at/gv/egiz/pdfas/web/ws/PDFASSigningImpl.java22
-rw-r--r--pdf-as-web/src/main/resources/template_sl.html1
-rw-r--r--pdf-as-web/src/main/webapp/WEB-INF/web.xml10
19 files changed, 374 insertions, 24 deletions
diff --git a/pdf-as-common/src/main/java/at/gv/egiz/pdfas/api/ws/PDFASSignParameters.java b/pdf-as-common/src/main/java/at/gv/egiz/pdfas/api/ws/PDFASSignParameters.java
index 4f626e17..ad17a236 100644
--- a/pdf-as-common/src/main/java/at/gv/egiz/pdfas/api/ws/PDFASSignParameters.java
+++ b/pdf-as-common/src/main/java/at/gv/egiz/pdfas/api/ws/PDFASSignParameters.java
@@ -15,8 +15,26 @@ public class PDFASSignParameters implements Serializable {
@XmlType(name="Connector")
public enum Connector {
- JKS,
- MOA
+ JKS("jks"),
+ MOA("moa"),
+ BKU("bku"),
+ MOBILEBKU("mobilebku"),
+ ONLINEBKU("onlinebku");
+
+
+ private final String name;
+
+ private Connector(String s) {
+ name = s;
+ }
+
+ public boolean equalsName(String otherName){
+ return (otherName == null)? false:name.equals(otherName);
+ }
+
+ public String toString(){
+ return name;
+ }
}
@@ -24,8 +42,9 @@ public class PDFASSignParameters implements Serializable {
String position;
-
-
+ String invokeUrl;
+ String invokeErrorUrl;
+ String transactionId;
String profile;
@XmlElement(required = true, nillable = false, name="connector")
@@ -53,6 +72,28 @@ public class PDFASSignParameters implements Serializable {
this.profile = profile;
}
+ @XmlElement(required = false, nillable = true, name="invoke-url")
+ public String getInvokeURL() {
+ return invokeUrl;
+ }
+ public void setInvokeURL(String invokeUrl) {
+ this.invokeUrl = invokeUrl;
+ }
+
+ @XmlElement(required = false, nillable = true, name="invoke-error-url")
+ public String getInvokeErrorURL() {
+ return invokeErrorUrl;
+ }
+ public void setInvokeErrorURL(String invokeErrorUrl) {
+ this.invokeErrorUrl = invokeErrorUrl;
+ }
+ @XmlElement(required = false, nillable = true, name="transactionId")
+ public String getTransactionId() {
+ return transactionId;
+ }
+ public void setTransactionId(String transactionId) {
+ this.transactionId = transactionId;
+ }
}
diff --git a/pdf-as-common/src/main/java/at/gv/egiz/pdfas/api/ws/PDFASSignResponse.java b/pdf-as-common/src/main/java/at/gv/egiz/pdfas/api/ws/PDFASSignResponse.java
index 1da4fa98..a43272f1 100644
--- a/pdf-as-common/src/main/java/at/gv/egiz/pdfas/api/ws/PDFASSignResponse.java
+++ b/pdf-as-common/src/main/java/at/gv/egiz/pdfas/api/ws/PDFASSignResponse.java
@@ -16,6 +16,7 @@ public class PDFASSignResponse implements Serializable {
String requestID;
String error;
byte[] signedPDF;
+ String redirectUrl;
@XmlElement(required = true, nillable = false, name="requestID")
public String getRequestID() {
@@ -40,4 +41,12 @@ public class PDFASSignResponse implements Serializable {
public void setError(String error) {
this.error = error;
}
+
+ @XmlElement(required = false, name="redirectUrl")
+ public String getRedirectUrl() {
+ return redirectUrl;
+ }
+ public void setRedirectUrl(String redirectUrl) {
+ this.redirectUrl = redirectUrl;
+ }
}
diff --git a/pdf-as-common/src/main/java/at/gv/egiz/pdfas/api/ws/PDFASSigning.java b/pdf-as-common/src/main/java/at/gv/egiz/pdfas/api/ws/PDFASSigning.java
index 63049bc5..698a2845 100644
--- a/pdf-as-common/src/main/java/at/gv/egiz/pdfas/api/ws/PDFASSigning.java
+++ b/pdf-as-common/src/main/java/at/gv/egiz/pdfas/api/ws/PDFASSigning.java
@@ -10,9 +10,9 @@ import javax.jws.soap.SOAPBinding.Style;
@WebService
@SOAPBinding(style = Style.RPC)
public interface PDFASSigning {
- @WebMethod(operationName = "sign")
- @WebResult(name="signedPDF")
- public byte[] signPDFDokument(@WebParam(name = "pdfDocument")byte[] inputDocument, @WebParam(name = "parameters")PDFASSignParameters parameters);
+ //@WebMethod(operationName = "sign")
+ //@WebResult(name="signedPDF")
+ //public byte[] signPDFDokument(@WebParam(name = "pdfDocument")byte[] inputDocument, @WebParam(name = "parameters")PDFASSignParameters parameters);
@WebMethod(operationName = "signSingle")
@WebResult(name="signResponse")
diff --git a/pdf-as-lib/src/main/java/at/gv/egiz/pdfas/lib/api/StatusRequest.java b/pdf-as-lib/src/main/java/at/gv/egiz/pdfas/lib/api/StatusRequest.java
index 42bd79c6..df397733 100644
--- a/pdf-as-lib/src/main/java/at/gv/egiz/pdfas/lib/api/StatusRequest.java
+++ b/pdf-as-lib/src/main/java/at/gv/egiz/pdfas/lib/api/StatusRequest.java
@@ -25,6 +25,8 @@ package at.gv.egiz.pdfas.lib.api;
import java.security.cert.CertificateException;
+import at.gv.egiz.pdfas.lib.api.sign.SignParameter;
+
/**
* Status of a signture process
*/
@@ -78,5 +80,7 @@ public interface StatusRequest {
* @param signatureValue
*/
public void setSigature(byte[] signatureValue) ;
+
+ public SignParameter getSignParameter();
}
diff --git a/pdf-as-lib/src/main/java/at/gv/egiz/pdfas/lib/impl/StatusRequestImpl.java b/pdf-as-lib/src/main/java/at/gv/egiz/pdfas/lib/impl/StatusRequestImpl.java
index 86b8325e..49b78659 100644
--- a/pdf-as-lib/src/main/java/at/gv/egiz/pdfas/lib/impl/StatusRequestImpl.java
+++ b/pdf-as-lib/src/main/java/at/gv/egiz/pdfas/lib/impl/StatusRequestImpl.java
@@ -28,6 +28,7 @@ import iaik.x509.X509Certificate;
import java.security.cert.CertificateException;
import at.gv.egiz.pdfas.lib.api.StatusRequest;
+import at.gv.egiz.pdfas.lib.api.sign.SignParameter;
import at.gv.egiz.pdfas.lib.impl.status.OperationStatus;
public class StatusRequestImpl implements StatusRequest {
@@ -105,4 +106,10 @@ public class StatusRequestImpl implements StatusRequest {
public void setSigature(byte[] signatureValue) {
this.encodedSignature = signatureValue;
}
+
+ public SignParameter getSignParameter() {
+ return this.status.getSignParamter();
+ }
+
+
}
diff --git a/pdf-as-web-client/src/main/java/at/gv/egiz/pdfas/web/client/RemotePDFSigner.java b/pdf-as-web-client/src/main/java/at/gv/egiz/pdfas/web/client/RemotePDFSigner.java
index 456a3aaa..7fd6a189 100644
--- a/pdf-as-web-client/src/main/java/at/gv/egiz/pdfas/web/client/RemotePDFSigner.java
+++ b/pdf-as-web-client/src/main/java/at/gv/egiz/pdfas/web/client/RemotePDFSigner.java
@@ -34,11 +34,6 @@ public class RemotePDFSigner implements PDFASSigning {
binding.setMTOMEnabled(useMTOM);
}
- public byte[] signPDFDokument(byte[] inputDocument,
- PDFASSignParameters parameters) {
- return proxy.signPDFDokument(inputDocument, parameters);
- }
-
public PDFASSignResponse signPDFDokument(PDFASSignRequest request) {
return proxy.signPDFDokument(request);
}
diff --git a/pdf-as-web-client/src/test/java/at/gv/egiz/pdfas/web/client/test/SimpleTest.java b/pdf-as-web-client/src/test/java/at/gv/egiz/pdfas/web/client/test/SimpleTest.java
index 8573b224..32c6dbad 100644
--- a/pdf-as-web-client/src/test/java/at/gv/egiz/pdfas/web/client/test/SimpleTest.java
+++ b/pdf-as-web-client/src/test/java/at/gv/egiz/pdfas/web/client/test/SimpleTest.java
@@ -24,7 +24,7 @@ public class SimpleTest {
byte[] inputData = IOUtils.readFully(fis, -1, true);
PDFASSignParameters signParameters = new PDFASSignParameters();
- signParameters.setConnector(Connector.JKS);
+ signParameters.setConnector(Connector.BKU);
signParameters.setPosition(null);
signParameters.setProfile("SIGNATURBLOCK_DE");
@@ -42,8 +42,14 @@ public class SimpleTest {
RemotePDFSigner signer = new RemotePDFSigner(endpoint, false);
+ PDFASSignRequest signrequest = new PDFASSignRequest();
+ signrequest.setInputData(inputData);
+ signrequest.setParameters(signParameters);
+ signParameters.setTransactionId("MYID ....");
System.out.println("Simple Request:");
- byte[] outputFile = signer.signPDFDokument(inputData, signParameters);
+ PDFASSignResponse response = signer.signPDFDokument(signrequest);
+
+ System.out.println("User URL: " + response.getRedirectUrl());
/*
* System.out.println("Simple Request:"); byte[] outputFile =
diff --git a/pdf-as-web/src/main/java/at/gv/egiz/pdfas/web/config/WebConfiguration.java b/pdf-as-web/src/main/java/at/gv/egiz/pdfas/web/config/WebConfiguration.java
index 4555d6a1..299c166f 100644
--- a/pdf-as-web/src/main/java/at/gv/egiz/pdfas/web/config/WebConfiguration.java
+++ b/pdf-as-web/src/main/java/at/gv/egiz/pdfas/web/config/WebConfiguration.java
@@ -56,6 +56,9 @@ public class WebConfiguration {
public static final String WHITELIST_ENABLED = "whitelist.enabled";
public static final String WHITELIST_VALUE_PRE = "whitelist.url.";
+ public static final String REQUEST_STORE = "request.store";
+ public static final String REQUEST_STORE_INMEM = "at.gv.egiz.pdfas.web.store.InMemoryRequestStore";
+
private static Properties properties = new Properties();
private static final Logger logger = LoggerFactory
@@ -211,4 +214,14 @@ public class WebConfiguration {
}
return true;
}
+
+ public static String getStoreClass() {
+ String cls = properties.getProperty(REQUEST_STORE);
+
+ if(cls != null) {
+ return cls;
+ }
+
+ return REQUEST_STORE_INMEM;
+ }
}
diff --git a/pdf-as-web/src/main/java/at/gv/egiz/pdfas/web/exception/PdfAsStoreException.java b/pdf-as-web/src/main/java/at/gv/egiz/pdfas/web/exception/PdfAsStoreException.java
new file mode 100644
index 00000000..f4c70278
--- /dev/null
+++ b/pdf-as-web/src/main/java/at/gv/egiz/pdfas/web/exception/PdfAsStoreException.java
@@ -0,0 +1,17 @@
+package at.gv.egiz.pdfas.web.exception;
+
+public class PdfAsStoreException extends Exception {
+
+ /**
+ *
+ */
+ private static final long serialVersionUID = -6704586769888839023L;
+
+ public PdfAsStoreException(String message) {
+ super(message);
+ }
+
+ public PdfAsStoreException(String message, Throwable e) {
+ super(message, e);
+ }
+}
diff --git a/pdf-as-web/src/main/java/at/gv/egiz/pdfas/web/helper/PdfAsHelper.java b/pdf-as-web/src/main/java/at/gv/egiz/pdfas/web/helper/PdfAsHelper.java
index ee67985b..421edff4 100644
--- a/pdf-as-web/src/main/java/at/gv/egiz/pdfas/web/helper/PdfAsHelper.java
+++ b/pdf-as-web/src/main/java/at/gv/egiz/pdfas/web/helper/PdfAsHelper.java
@@ -25,6 +25,8 @@ package at.gv.egiz.pdfas.web.helper;
import java.io.File;
import java.io.IOException;
+import java.io.UnsupportedEncodingException;
+import java.net.URLEncoder;
import java.util.Iterator;
import java.util.List;
@@ -57,9 +59,9 @@ import at.gv.egiz.pdfas.lib.api.verify.VerifyParameter;
import at.gv.egiz.pdfas.lib.api.verify.VerifyResult;
import at.gv.egiz.pdfas.sigs.pades.PAdESSigner;
import at.gv.egiz.pdfas.sigs.pades.PAdESSignerKeystore;
-import at.gv.egiz.pdfas.sigs.pkcs7detached.PKCS7DetachedSigner;
import at.gv.egiz.pdfas.web.config.WebConfiguration;
import at.gv.egiz.pdfas.web.exception.PdfAsWebException;
+import at.gv.egiz.pdfas.web.servlets.UIEntryPointServlet;
import at.gv.egiz.sl.schema.CreateCMSSignatureResponseType;
import at.gv.egiz.sl.schema.InfoboxAssocArrayPairType;
import at.gv.egiz.sl.schema.InfoboxReadRequestType;
@@ -84,6 +86,7 @@ public class PdfAsHelper {
private static final String PDF_PROVIDE_PAGE = "/ProvidePDF";
private static final String PDF_PDFDATA_PAGE = "/PDFData";
private static final String PDF_DATAURL_PAGE = "/DataURL";
+ private static final String PDF_USERENTRY_PAGE = "/userentry";
private static final String PDF_ERR_URL = "PDF_ERR_URL";
private static final String PDF_FILE_NAME = "PDF_FILE_NAME";
private static final String PDF_INVOKE_URL = "PDF_INVOKE_URL";
@@ -384,7 +387,8 @@ public class PdfAsHelper {
}
public static void startSignature(HttpServletRequest request,
- HttpServletResponse response, ServletContext context, byte[] pdfData)
+ HttpServletResponse response, ServletContext context, byte[] pdfData,
+ String connector, String transactionId)
throws Exception {
// TODO: Protect session so that only one PDF can be signed during one
@@ -409,9 +413,10 @@ public class PdfAsHelper {
SignParameter signParameter = PdfAsFactory.createSignParameter(config,
new ByteArrayDataSource(pdfData));
- // Get Connector
- String connector = PdfAsParameterExtractor.getConnector(request);
-
+ logger.info("Setting TransactionID: " + transactionId);
+
+ signParameter.setTransactionId(transactionId);
+
IPlainSigner signer;
if (connector.equals("bku") || connector.equals("onlinebku")
|| connector.equals("mobilebku")) {
@@ -535,7 +540,7 @@ public class PdfAsHelper {
logger.debug("Needing Certificate from BKU");
// build SL Request to read certificate
InfoboxReadRequestType readCertificateRequest = bkuSLConnector
- .createInfoboxReadRequest();
+ .createInfoboxReadRequest(statusRequest.getSignParameter());
JAXBElement<InfoboxReadRequestType> readRequest = of
.createInfoboxReadRequest(readCertificateRequest);
@@ -548,6 +553,14 @@ public class PdfAsHelper {
template = template.replace("##XMLRequest##",
StringEscapeUtils.escapeHtml4(slRequest));
template = template.replace("##DataURL##", url);
+
+ if(statusRequest.getSignParameter().getTransactionId() != null) {
+ template = template.replace("##ADDITIONAL##", "<input type=\"hidden\" name=\"TransactionId_\" value=\"" +
+ StringEscapeUtils.escapeHtml4(statusRequest.getSignParameter().getTransactionId()) + "\">");
+ } else {
+ template = template.replace("##ADDITIONAL##", "");
+ }
+
response.getWriter().write(template);
//TODO: set content type of response!!
response.setContentType("text/html");
@@ -557,7 +570,8 @@ public class PdfAsHelper {
// build SL Request for cms signature
RequestPackage pack = bkuSLConnector
.createCMSRequest(statusRequest.getSignatureData(),
- statusRequest.getSignatureDataByteRange());
+ statusRequest.getSignatureDataByteRange(),
+ statusRequest.getSignParameter());
String slRequest = SLMarschaller
.marshalToString(of
@@ -775,6 +789,22 @@ public class PdfAsHelper {
HttpServletResponse response) {
return generateURL(request, response, PDF_PDFDATA_PAGE);
}
+
+ public static String generateUserEntryURL(String storeId) {
+ String publicURL = WebConfiguration.getPublicURL();
+ if(publicURL == null) {
+ logger.error("To use this functionality " + WebConfiguration.PUBLIC_URL + " has to be configured in the web configuration");
+ return null;
+ }
+
+ String baseURL = publicURL + PDF_USERENTRY_PAGE;
+ try {
+ return baseURL + "?" + UIEntryPointServlet.REQUEST_ID_PARAM + "=" + URLEncoder.encode(storeId, "UTF-8");
+ } catch(UnsupportedEncodingException e) {
+ logger.warn("Encoding not supported for URL encoding", e);
+ }
+ return baseURL + "?" + UIEntryPointServlet.REQUEST_ID_PARAM + "=" + storeId;
+ }
public static String generateBKUURL(String connector) {
if (connector.equals("bku")) {
diff --git a/pdf-as-web/src/main/java/at/gv/egiz/pdfas/web/helper/PdfAsParameterExtractor.java b/pdf-as-web/src/main/java/at/gv/egiz/pdfas/web/helper/PdfAsParameterExtractor.java
index 730fe9ad..126b10ce 100644
--- a/pdf-as-web/src/main/java/at/gv/egiz/pdfas/web/helper/PdfAsParameterExtractor.java
+++ b/pdf-as-web/src/main/java/at/gv/egiz/pdfas/web/helper/PdfAsParameterExtractor.java
@@ -28,6 +28,7 @@ import javax.servlet.http.HttpServletRequest;
public class PdfAsParameterExtractor {
public static final String PARAM_CONNECTOR = "connector";
+ public static final String PARAM_TRANSACTION_ID = "transactionId";
public static final String PARAM_CONNECTOR_DEFAULT = "bku";
@@ -53,6 +54,11 @@ public class PdfAsParameterExtractor {
return PARAM_CONNECTOR_DEFAULT;
}
+ public static String getTransactionId(HttpServletRequest request) {
+ String transactionId = (String)request.getAttribute(PARAM_TRANSACTION_ID);
+ return transactionId;
+ }
+
public static String getInvokeURL(HttpServletRequest request) {
return (String)request.getAttribute(PARAM_INVOKE_URL);
}
diff --git a/pdf-as-web/src/main/java/at/gv/egiz/pdfas/web/servlets/ExternSignServlet.java b/pdf-as-web/src/main/java/at/gv/egiz/pdfas/web/servlets/ExternSignServlet.java
index 153a69fe..a7d82c3e 100644
--- a/pdf-as-web/src/main/java/at/gv/egiz/pdfas/web/servlets/ExternSignServlet.java
+++ b/pdf-as-web/src/main/java/at/gv/egiz/pdfas/web/servlets/ExternSignServlet.java
@@ -238,6 +238,8 @@ public class ExternSignServlet extends HttpServlet {
HttpServletResponse response, byte[] pdfData) throws Exception {
// Get Connector
String connector = PdfAsParameterExtractor.getConnector(request);
+
+ String transactionId = PdfAsParameterExtractor.getTransactionId(request);
String invokeUrl = PdfAsParameterExtractor.getInvokeURL(request);
PdfAsHelper.setInvokeURL(request, response, invokeUrl);
@@ -278,7 +280,7 @@ public class ExternSignServlet extends HttpServlet {
}
}
- PdfAsHelper.startSignature(request, response, getServletContext(), pdfData);
+ PdfAsHelper.startSignature(request, response, getServletContext(), pdfData, connector, transactionId);
} else if (connector.equals("jks") || connector.equals("moa")) {
// start synchronous siganture creation
diff --git a/pdf-as-web/src/main/java/at/gv/egiz/pdfas/web/servlets/UIEntryPointServlet.java b/pdf-as-web/src/main/java/at/gv/egiz/pdfas/web/servlets/UIEntryPointServlet.java
new file mode 100644
index 00000000..3aad5abb
--- /dev/null
+++ b/pdf-as-web/src/main/java/at/gv/egiz/pdfas/web/servlets/UIEntryPointServlet.java
@@ -0,0 +1,117 @@
+package at.gv.egiz.pdfas.web.servlets;
+
+import java.io.IOException;
+
+import javax.servlet.ServletException;
+import javax.servlet.http.HttpServlet;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+import org.apache.http.HttpStatus;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import at.gv.egiz.pdfas.api.ws.PDFASSignRequest;
+import at.gv.egiz.pdfas.api.ws.PDFASSignParameters.Connector;
+import at.gv.egiz.pdfas.common.exceptions.PdfAsException;
+import at.gv.egiz.pdfas.web.config.WebConfiguration;
+import at.gv.egiz.pdfas.web.exception.PdfAsStoreException;
+import at.gv.egiz.pdfas.web.exception.PdfAsWebException;
+import at.gv.egiz.pdfas.web.helper.DigestHelper;
+import at.gv.egiz.pdfas.web.helper.PdfAsHelper;
+import at.gv.egiz.pdfas.web.helper.PdfAsParameterExtractor;
+import at.gv.egiz.pdfas.web.store.RequestStore;
+
+public class UIEntryPointServlet extends HttpServlet {
+ private static final long serialVersionUID = 1L;
+
+ public static final String REQUEST_ID_PARAM = "reqId";
+
+ private static final Logger logger = LoggerFactory
+ .getLogger(UIEntryPointServlet.class);
+
+ public UIEntryPointServlet() {
+ }
+
+ @Override
+ protected void doGet(HttpServletRequest req, HttpServletResponse resp)
+ throws ServletException, IOException {
+ doProcess(req, resp);
+ }
+
+ @Override
+ protected void doPost(HttpServletRequest req, HttpServletResponse resp)
+ throws ServletException, IOException {
+ doProcess(req, resp);
+ }
+
+ protected void doProcess(HttpServletRequest req, HttpServletResponse resp)
+ throws ServletException, IOException {
+ try {
+ String storeId = req.getParameter(REQUEST_ID_PARAM);
+
+ if (storeId == null) {
+ throw new PdfAsStoreException("Wrong Parameters");
+ }
+
+ PDFASSignRequest pdfAsRequest = RequestStore.getInstance()
+ .fetchStoreEntry(storeId);
+
+ if(pdfAsRequest == null) {
+ throw new PdfAsStoreException("Invalid " + REQUEST_ID_PARAM + " value");
+ }
+
+ Connector connector = pdfAsRequest.getParameters().getConnector();
+
+ String invokeUrl = pdfAsRequest.getParameters().getInvokeURL();
+ PdfAsHelper.setInvokeURL(req, resp, invokeUrl);
+
+ String errorUrl = pdfAsRequest.getParameters().getInvokeErrorURL();
+ PdfAsHelper.setErrorURL(req, resp, errorUrl);
+
+ if(pdfAsRequest.getInputData() == null) {
+ throw new PdfAsException("No Signature data available");
+ }
+
+ String pdfDataHash = DigestHelper.getHexEncodedHash(pdfAsRequest.getInputData());
+
+ PdfAsHelper.setSignatureDataHash(req, pdfDataHash);
+ logger.debug("Storing signatures data hash: " + pdfDataHash);
+
+ logger.debug("Starting signature creation with: " + connector);
+
+ //IPlainSigner signer;
+ if (connector.equals(Connector.BKU) || connector.equals(Connector.ONLINEBKU) || connector.equals(Connector.MOBILEBKU)) {
+ // start asynchronous signature creation
+
+ if(connector.equals(Connector.BKU)) {
+ if(WebConfiguration.getLocalBKUURL() == null) {
+ throw new PdfAsWebException("Invalid connector bku is not supported");
+ }
+ }
+
+ if(connector.equals(Connector.ONLINEBKU)) {
+ if(WebConfiguration.getLocalBKUURL() == null) {
+ throw new PdfAsWebException("Invalid connector onlinebku is not supported");
+ }
+ }
+
+ if(connector.equals(Connector.MOBILEBKU)) {
+ if(WebConfiguration.getLocalBKUURL() == null) {
+ throw new PdfAsWebException("Invalid connector mobilebku is not supported");
+ }
+ }
+
+ PdfAsHelper.startSignature(req, resp, getServletContext(), pdfAsRequest.getInputData(),
+ connector.toString(), pdfAsRequest.getParameters().getTransactionId());
+ } else {
+ throw new PdfAsWebException("Invalid connector (" + Connector.BKU + " | " + Connector.ONLINEBKU + " | " + Connector.MOBILEBKU + ")");
+ }
+
+
+ } catch (Throwable e) {
+ PdfAsHelper.setSessionException(req, resp, e.getMessage(), e);
+ PdfAsHelper.gotoError(getServletContext(), req, resp);
+ }
+ }
+}
diff --git a/pdf-as-web/src/main/java/at/gv/egiz/pdfas/web/store/IRequestStore.java b/pdf-as-web/src/main/java/at/gv/egiz/pdfas/web/store/IRequestStore.java
new file mode 100644
index 00000000..6623004b
--- /dev/null
+++ b/pdf-as-web/src/main/java/at/gv/egiz/pdfas/web/store/IRequestStore.java
@@ -0,0 +1,8 @@
+package at.gv.egiz.pdfas.web.store;
+
+import at.gv.egiz.pdfas.api.ws.PDFASSignRequest;
+
+public interface IRequestStore {
+ public String createNewStoreEntry(PDFASSignRequest request);
+ public PDFASSignRequest fetchStoreEntry(String id);
+}
diff --git a/pdf-as-web/src/main/java/at/gv/egiz/pdfas/web/store/InMemoryRequestStore.java b/pdf-as-web/src/main/java/at/gv/egiz/pdfas/web/store/InMemoryRequestStore.java
new file mode 100644
index 00000000..df9ab676
--- /dev/null
+++ b/pdf-as-web/src/main/java/at/gv/egiz/pdfas/web/store/InMemoryRequestStore.java
@@ -0,0 +1,31 @@
+package at.gv.egiz.pdfas.web.store;
+
+import java.util.HashMap;
+import java.util.UUID;
+
+import at.gv.egiz.pdfas.api.ws.PDFASSignRequest;
+
+public class InMemoryRequestStore implements IRequestStore {
+
+ public InMemoryRequestStore() {
+ }
+
+ private HashMap<String, PDFASSignRequest> store = new HashMap<String, PDFASSignRequest>();
+
+ public String createNewStoreEntry(PDFASSignRequest request) {
+ UUID id = UUID.randomUUID();
+ String sid = id.toString();
+ this.store.put(sid, request);
+ return sid;
+ }
+
+ public PDFASSignRequest fetchStoreEntry(String id) {
+ if(store.containsKey(id)) {
+ PDFASSignRequest request = store.get(id);
+ store.remove(id);
+ return request;
+ }
+ return null;
+ }
+
+}
diff --git a/pdf-as-web/src/main/java/at/gv/egiz/pdfas/web/store/RequestStore.java b/pdf-as-web/src/main/java/at/gv/egiz/pdfas/web/store/RequestStore.java
new file mode 100644
index 00000000..a4eba2e6
--- /dev/null
+++ b/pdf-as-web/src/main/java/at/gv/egiz/pdfas/web/store/RequestStore.java
@@ -0,0 +1,35 @@
+package at.gv.egiz.pdfas.web.store;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import at.gv.egiz.pdfas.web.config.WebConfiguration;
+import at.gv.egiz.pdfas.web.exception.PdfAsStoreException;
+
+public class RequestStore {
+ private static IRequestStore instance = null;
+
+ private static final Logger logger = LoggerFactory
+ .getLogger(RequestStore.class);
+
+ public synchronized static IRequestStore getInstance() throws PdfAsStoreException {
+ if (instance == null) {
+ try {
+ String storeClass = WebConfiguration.getStoreClass();
+ logger.info("Using Request Store: " + storeClass);
+
+ Class<?> clazz = Class.forName(storeClass);
+ Object store = clazz.newInstance();
+ if(store instanceof IRequestStore) {
+ instance = (IRequestStore)store;
+ } else {
+ throw new PdfAsStoreException("Failed to instanciate Request Store from " + storeClass);
+ }
+ } catch (Throwable e) {
+ e.printStackTrace();
+ throw new PdfAsStoreException("Failed to instanciate Request Store", e);
+ }
+ }
+ return instance;
+ }
+}
diff --git a/pdf-as-web/src/main/java/at/gv/egiz/pdfas/web/ws/PDFASSigningImpl.java b/pdf-as-web/src/main/java/at/gv/egiz/pdfas/web/ws/PDFASSigningImpl.java
index 07ffd7c4..5304f918 100644
--- a/pdf-as-web/src/main/java/at/gv/egiz/pdfas/web/ws/PDFASSigningImpl.java
+++ b/pdf-as-web/src/main/java/at/gv/egiz/pdfas/web/ws/PDFASSigningImpl.java
@@ -16,8 +16,10 @@ import at.gv.egiz.pdfas.api.ws.PDFASSignParameters;
import at.gv.egiz.pdfas.api.ws.PDFASSignRequest;
import at.gv.egiz.pdfas.api.ws.PDFASSignResponse;
import at.gv.egiz.pdfas.api.ws.PDFASSigning;
+import at.gv.egiz.pdfas.api.ws.PDFASSignParameters.Connector;
import at.gv.egiz.pdfas.web.config.WebConfiguration;
import at.gv.egiz.pdfas.web.helper.PdfAsHelper;
+import at.gv.egiz.pdfas.web.store.RequestStore;
@MTOM
@WebService(endpointInterface = "at.gv.egiz.pdfas.api.ws.PDFASSigning")
@@ -25,7 +27,7 @@ public class PDFASSigningImpl implements PDFASSigning {
private static final Logger logger = LoggerFactory
.getLogger(PDFASSigningImpl.class);
-
+
public byte[] signPDFDokument(byte[] inputDocument,
PDFASSignParameters parameters) {
checkSoapSignEnabled();
@@ -50,8 +52,24 @@ public class PDFASSigningImpl implements PDFASSigning {
}
PDFASSignResponse response = new PDFASSignResponse();
try {
- response.setSignedPDF(signPDFDokument(request.getInputData(),
+ if(request.getParameters().getConnector().equals(Connector.MOA) ||
+ request.getParameters().getConnector().equals(Connector.JKS)) {
+ // Plain server based signatures!!
+ response.setSignedPDF(signPDFDokument(request.getInputData(),
request.getParameters()));
+ } else {
+ // Signatures with user interaction!!
+ String id = RequestStore.getInstance().createNewStoreEntry(request);
+ String userEntryURL = PdfAsHelper.generateUserEntryURL(id);
+ logger.debug("Generated request store: " + id);
+ logger.debug("Generated UI URL: " + userEntryURL);
+
+ if(userEntryURL == null) {
+ throw new WebServiceException("Failed to generate User Entry URL");
+ }
+
+ response.setRedirectUrl(userEntryURL);
+ }
} catch (Throwable e) {
if (e.getCause() != null) {
response.setError(e.getCause().getMessage());
diff --git a/pdf-as-web/src/main/resources/template_sl.html b/pdf-as-web/src/main/resources/template_sl.html
index e53652e5..b8ea4df7 100644
--- a/pdf-as-web/src/main/resources/template_sl.html
+++ b/pdf-as-web/src/main/resources/template_sl.html
@@ -50,6 +50,7 @@ div.content {
name="Senden"> <input type="hidden"
name="XMLRequest" value="##XMLRequest##"> <input
type="hidden" name="DataURL" value="##DataURL##">
+ ##ADDITIONAL##
</form>
<span id="spin" style="display:block;
width:100px;
diff --git a/pdf-as-web/src/main/webapp/WEB-INF/web.xml b/pdf-as-web/src/main/webapp/WEB-INF/web.xml
index 85811ff0..8373c195 100644
--- a/pdf-as-web/src/main/webapp/WEB-INF/web.xml
+++ b/pdf-as-web/src/main/webapp/WEB-INF/web.xml
@@ -88,6 +88,12 @@
<description></description>
<servlet-class>at.gv.egiz.pdfas.web.servlets.PDFSignatureCertificateData</servlet-class>
</servlet>
+ <servlet>
+ <servlet-name>UIEntryPointServlet</servlet-name>
+ <display-name>UIEntryPointServlet</display-name>
+ <description></description>
+ <servlet-class>at.gv.egiz.pdfas.web.servlets.UIEntryPointServlet</servlet-class>
+ </servlet>
<!-- Define mappings that are used by the servlet container to translate
a particular request URI (context-relative) to a particular servlet. The
@@ -134,6 +140,10 @@
<servlet-name>PDFVerifyCert</servlet-name>
<url-pattern>/signCert</url-pattern>
</servlet-mapping>
+ <servlet-mapping>
+ <servlet-name>UIEntryPointServlet</servlet-name>
+ <url-pattern>/userentry</url-pattern>
+ </servlet-mapping>
<!-- Define the default session timeout for your application, in minutes.
From a servlet or JSP page, you can modify the timeout for a particular session