diff options
author | Andreas Fitzek <andreas.fitzek@iaik.tugraz.at> | 2015-07-14 13:27:56 +0200 |
---|---|---|
committer | Andreas Fitzek <andreas.fitzek@iaik.tugraz.at> | 2015-07-14 13:27:56 +0200 |
commit | 030ad8ea8455922ad59c095d3a9ecbfc462ff69f (patch) | |
tree | 3fb0ab24b8432dae25efab6ef3e3b77bd623b1d5 /pdf-as-web/src/main/java/at/gv/egiz/pdfas/web/servlets | |
parent | 38a852e11c1edd313ab0882ac7bda00a82546fbb (diff) | |
download | pdf-as-4-030ad8ea8455922ad59c095d3a9ecbfc462ff69f.tar.gz pdf-as-4-030ad8ea8455922ad59c095d3a9ecbfc462ff69f.tar.bz2 pdf-as-4-030ad8ea8455922ad59c095d3a9ecbfc462ff69f.zip |
many fixes for html5 js viewer integration
Diffstat (limited to 'pdf-as-web/src/main/java/at/gv/egiz/pdfas/web/servlets')
3 files changed, 326 insertions, 8 deletions
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 9e217058..a06177e3 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 @@ -26,6 +26,7 @@ package at.gv.egiz.pdfas.web.servlets; import java.io.File; import java.io.IOException; import java.util.List; +import java.util.Map; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; @@ -289,8 +290,10 @@ public class ExternSignServlet extends HttpServlet { HttpServletResponse response, byte[] pdfData, StatisticEvent statisticEvent) throws Exception { // Get Connector String connector = PdfAsParameterExtractor.getConnector(request); + PdfAsHelper.setConnector(request, connector); String transactionId = PdfAsParameterExtractor.getTransactionId(request); + PdfAsHelper.setTransactionid(request, transactionId); statisticEvent.setFilesize(pdfData.length); statisticEvent.setProfileId(null); @@ -329,8 +332,25 @@ public class ExternSignServlet extends HttpServlet { PdfAsHelper.setSignatureDataHash(request, pdfDataHash); logger.debug("Storing signatures data hash: " + pdfDataHash); + boolean manualPositioning = PdfAsParameterExtractor.isUserPositioning(request); + logger.debug("Starting signature creation with: " + connector); + String sigType = PdfAsParameterExtractor + .getSigType(request); + PdfAsHelper.setSignatureType(request, sigType); + + Map<String, String> preProcessorMap = PdfAsParameterExtractor.getPreProcessorMap(request); + PdfAsHelper.setPreProcessorMap(request, preProcessorMap); + + Map<String, String> overwriteMap = PdfAsParameterExtractor.getOverwriteMap(request); + PdfAsHelper.setOverwriteMap(request, overwriteMap); + + String keyIdentifier = PdfAsParameterExtractor.getKeyIdentifier(request); + PdfAsHelper.setKeyIdentifier(request, keyIdentifier); + + PdfAsHelper.setStatisticEvent(request, response, statisticEvent); + //IPlainSigner signer; if (connector.equals("bku") || connector.equals("onlinebku") || connector.equals("mobilebku")) { // start asynchronous signature creation @@ -351,21 +371,33 @@ public class ExternSignServlet extends HttpServlet { if(WebConfiguration.getLocalBKUURL() == null) { throw new PdfAsWebException("Invalid connector mobilebku is not supported"); } - } + } - PdfAsHelper.setStatisticEvent(request, response, statisticEvent); + if(manualPositioning) { + // store pdf data + // redirect to viewer html + String token = PdfAsHelper.storePdfData(pdfData, request); + + String pdfDataUrl = PdfAsHelper.generatePositioningURL(token, request, response); + + if(pdfDataUrl != null) { + response.sendRedirect(response.encodeRedirectURL(pdfDataUrl)); + return; + } else { + // remove Pdf data form session again! + PdfAsHelper.getPdfData(token, request); + } + } PdfAsHelper.startSignature(request, response, getServletContext(), pdfData, connector, - PdfAsHelper.buildPosString(request, response), transactionId, PdfAsParameterExtractor - .getSigType(request), PdfAsParameterExtractor.getPreProcessorMap(request), - PdfAsParameterExtractor.getOverwriteMap(request)); + PdfAsHelper.buildPosString(request, response), transactionId, sigType, + preProcessorMap, + overwriteMap); return; } else if (connector.equals("jks") || connector.equals("moa")) { // start synchronous siganture creation if(connector.equals("jks")) { - - String keyIdentifier = PdfAsParameterExtractor.getKeyIdentifier(request); boolean ksEnabled = false; @@ -390,7 +422,21 @@ public class ExternSignServlet extends HttpServlet { } } - + if(manualPositioning) { + // store pdf data + // redirect to viewer html + String token = PdfAsHelper.storePdfData(pdfData, request); + + String pdfDataUrl = PdfAsHelper.generatePositioningURL(token, request, response); + + if(pdfDataUrl != null) { + response.sendRedirect(response.encodeRedirectURL(pdfDataUrl)); + return; + } else { + // remove Pdf data form session again! + PdfAsHelper.getPdfData(token, request); + } + } byte[] pdfSignedData = PdfAsHelper.synchornousSignature(request, response, pdfData); diff --git a/pdf-as-web/src/main/java/at/gv/egiz/pdfas/web/servlets/PDFPositioningDataServlet.java b/pdf-as-web/src/main/java/at/gv/egiz/pdfas/web/servlets/PDFPositioningDataServlet.java new file mode 100644 index 00000000..95307c9c --- /dev/null +++ b/pdf-as-web/src/main/java/at/gv/egiz/pdfas/web/servlets/PDFPositioningDataServlet.java @@ -0,0 +1,70 @@ +package at.gv.egiz.pdfas.web.servlets; + +import java.io.IOException; +import java.io.OutputStream; + +import javax.servlet.ServletException; +import javax.servlet.http.HttpServlet; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import at.gv.egiz.pdfas.common.exceptions.PdfAsException; +import at.gv.egiz.pdfas.web.helper.PdfAsHelper; + +public class PDFPositioningDataServlet extends HttpServlet { + + /** + * + */ + private static final long serialVersionUID = -8729046942909293640L; + + public static final String PARAM_TOKEN = "token"; + + private static final Logger logger = LoggerFactory + .getLogger(PDFPositioningDataServlet.class); + + /** + * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse + * response) + */ + protected void doGet(HttpServletRequest request, + HttpServletResponse response) throws ServletException, IOException { + this.process(request, response); + } + + protected void process(HttpServletRequest request, + HttpServletResponse response) throws ServletException, IOException { + try { + logger.debug("Access to pdf data"); + String token = request.getParameter(PARAM_TOKEN); + + if (token == null) { + logger.warn("No access token provided"); + throw new PdfAsException("No access token provided"); + } + + logger.debug("Access to pdf data with token: {}", token); + + byte[] pdfData = PdfAsHelper.getPdfData(request); + + if(pdfData == null) { + logger.warn("No PDF Data available or token does not match"); + throw new PdfAsException("No PDF Data available"); + } + + response.setContentType("application/pdf"); + OutputStream os = response.getOutputStream(); + os.write(pdfData); + os.close(); + } catch (Throwable e) { + PdfAsHelper.clearPdfData(request); + logger.error("Failed to access pdf data for positioning!"); + PdfAsHelper.setSessionException(request, response, e.getMessage(), + e); + PdfAsHelper.gotoError(getServletContext(), request, response); + } + } +} diff --git a/pdf-as-web/src/main/java/at/gv/egiz/pdfas/web/servlets/SignNowServlet.java b/pdf-as-web/src/main/java/at/gv/egiz/pdfas/web/servlets/SignNowServlet.java new file mode 100644 index 00000000..58ce0167 --- /dev/null +++ b/pdf-as-web/src/main/java/at/gv/egiz/pdfas/web/servlets/SignNowServlet.java @@ -0,0 +1,202 @@ +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.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import at.gv.egiz.pdfas.common.exceptions.PDFASError; +import at.gv.egiz.pdfas.web.config.WebConfiguration; +import at.gv.egiz.pdfas.web.exception.PdfAsWebException; +import at.gv.egiz.pdfas.web.helper.PdfAsHelper; +import at.gv.egiz.pdfas.web.helper.PdfAsParameterExtractor; +import at.gv.egiz.pdfas.web.stats.StatisticEvent; +import at.gv.egiz.pdfas.web.stats.StatisticFrontend; +import at.gv.egiz.pdfas.web.stats.StatisticEvent.Status; + +public class SignNowServlet extends HttpServlet { + + /** + * + */ + private static final long serialVersionUID = -8729046942909293640L; + + private static final Logger logger = LoggerFactory + .getLogger(SignNowServlet.class); + + /** + * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse + * response) + */ + protected void doGet(HttpServletRequest request, + HttpServletResponse response) throws ServletException, IOException { + logger.debug("Get signing request"); + + StatisticEvent statisticEvent = PdfAsHelper.getStatisticEvent(request, + response); + + try { + this.process(request, response, statisticEvent); + } catch (Exception e) { + + statisticEvent.setStatus(Status.ERROR); + statisticEvent.setException(e); + if (e instanceof PDFASError) { + statisticEvent.setErrorCode(((PDFASError) e).getCode()); + } + statisticEvent.setEndNow(); + statisticEvent.setTimestampNow(); + StatisticFrontend.getInstance().storeEvent(statisticEvent); + statisticEvent.setLogged(true); + + PdfAsHelper.setSessionException(request, response, e.getMessage(), + e); + PdfAsHelper.gotoError(getServletContext(), request, response); + } + } + + protected void doPost(HttpServletRequest request, + HttpServletResponse response) throws ServletException, IOException { + logger.debug("Get signing request"); + + StatisticEvent statisticEvent = PdfAsHelper.getStatisticEvent(request, + response); + + try { + this.process(request, response, statisticEvent); + } catch (Exception e) { + + statisticEvent.setStatus(Status.ERROR); + statisticEvent.setException(e); + if (e instanceof PDFASError) { + statisticEvent.setErrorCode(((PDFASError) e).getCode()); + } + statisticEvent.setEndNow(); + statisticEvent.setTimestampNow(); + StatisticFrontend.getInstance().storeEvent(statisticEvent); + statisticEvent.setLogged(true); + + PdfAsHelper.setSessionException(request, response, e.getMessage(), + e); + PdfAsHelper.gotoError(getServletContext(), request, response); + } + } + + protected void process(HttpServletRequest request, + HttpServletResponse response, StatisticEvent statisticEvent) throws Exception { + + String connector = PdfAsHelper.getConnector(request); + + if (connector == null) { + connector = PdfAsParameterExtractor.getConnector(request); + } + + if (connector == null) { + throw new PdfAsWebException("No connector defined signature"); + } + + String transactionId = PdfAsHelper.getTransactionid(request); + + byte[] pdfData = PdfAsHelper.getPdfData(request); + + if (pdfData == null) { + throw new PdfAsWebException("No pdf data available"); + } + + PdfAsHelper.clearPdfData(request); + + String positioningString = PdfAsHelper.buildPosString(request, response); + logger.debug("Build position string: {}", positioningString); + + // IPlainSigner signer; + if (connector.equals("bku") || connector.equals("onlinebku") + || connector.equals("mobilebku")) { + // start asynchronous signature creation + + if (connector.equals("bku")) { + if (WebConfiguration.getLocalBKUURL() == null) { + throw new PdfAsWebException( + "Invalid connector bku is not supported"); + } + } + + if (connector.equals("onlinebku")) { + if (WebConfiguration.getLocalBKUURL() == null) { + throw new PdfAsWebException( + "Invalid connector onlinebku is not supported"); + } + } + + if (connector.equals("mobilebku")) { + if (WebConfiguration.getLocalBKUURL() == null) { + throw new PdfAsWebException( + "Invalid connector mobilebku is not supported"); + } + } + + PdfAsHelper.setStatisticEvent(request, response, statisticEvent); + + PdfAsHelper.startSignature(request, response, getServletContext(), + pdfData, connector, + positioningString, + transactionId, PdfAsHelper.getSignatureType(request), + PdfAsHelper.getPreProcessorMap(request), + PdfAsHelper.getOverwriteMap(request)); + return; + } else if (connector.equals("jks") || connector.equals("moa")) { + // start synchronous siganture creation + + if (connector.equals("jks")) { + + String keyIdentifier = PdfAsHelper.getKeyIdentifier(request); + + boolean ksEnabled = false; + + if (keyIdentifier != null) { + ksEnabled = WebConfiguration + .getKeystoreEnabled(keyIdentifier); + } else { + ksEnabled = WebConfiguration.getKeystoreDefaultEnabled(); + } + + if (!ksEnabled) { + if (keyIdentifier != null) { + throw new PdfAsWebException("JKS connector [" + + keyIdentifier + "] disabled or not existing."); + } else { + throw new PdfAsWebException( + "DEFAULT JKS connector disabled."); + } + } + } + + if (connector.equals("moa")) { + if (!WebConfiguration.getMOASSEnabled()) { + throw new PdfAsWebException( + "Invalid connector moa is not supported"); + } + } + + byte[] pdfSignedData = PdfAsHelper.synchornousSignature(request, + response, pdfData); + PdfAsHelper.setSignedPdf(request, response, pdfSignedData); + + statisticEvent.setStatus(Status.OK); + statisticEvent.setEndNow(); + statisticEvent.setTimestampNow(); + StatisticFrontend.getInstance().storeEvent(statisticEvent); + statisticEvent.setLogged(true); + + PdfAsHelper.gotoProvidePdf(getServletContext(), request, response); + return; + } else { + throw new PdfAsWebException("Invalid connector (bku | moa | jks)"); + } + + } +} |