From 42e68c8f3e53b34663d2fe9c434b0b034ff9ddf0 Mon Sep 17 00:00:00 2001
From: Thomas <>
Date: Wed, 11 Jan 2023 23:23:30 +0100
Subject: feat(web):  add bulk-light functionality into PDF-AS-Web

---
 .../at/gv/egiz/pdfas/web/ws/PDFASSigningImpl.java  | 647 +++++++++++++++------
 1 file changed, 464 insertions(+), 183 deletions(-)

(limited to 'pdf-as-web/src/main/java/at/gv/egiz/pdfas/web/ws')

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 531abdf1..2c248059 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
@@ -3,19 +3,19 @@
  * PDF-AS has been contracted by the E-Government Innovation Center EGIZ, a
  * joint initiative of the Federal Chancellery Austria and Graz University of
  * Technology.
- * 
+ *
  * Licensed under the EUPL, Version 1.1 or - as soon they will be approved by
  * the European Commission - subsequent versions of the EUPL (the "Licence");
  * You may not use this work except in compliance with the Licence.
  * You may obtain a copy of the Licence at:
  * http://www.osor.eu/eupl/
- * 
+ *
  * Unless required by applicable law or agreed to in writing, software
  * distributed under the Licence is distributed on an "AS IS" basis,
  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  * See the Licence for the specific language governing permissions and
  * limitations under the Licence.
- * 
+ *
  * This product combines work with different licenses. See the "NOTICE" text
  * file for details on the various modules and licenses.
  * The "NOTICE" text file is part of the distribution. Any derivative works
@@ -26,20 +26,29 @@ package at.gv.egiz.pdfas.web.ws;
 import java.util.ArrayList;
 import java.util.List;
 import java.util.Map;
+import java.util.stream.Collectors;
 
 import javax.jws.WebService;
 import javax.xml.ws.WebServiceException;
 import javax.xml.ws.soap.MTOM;
 
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
+import org.apache.commons.lang3.StringUtils;
 
+import at.gv.egiz.pdfas.api.processing.CoreSignParams;
+import at.gv.egiz.pdfas.api.processing.DocumentToSign;
+import at.gv.egiz.pdfas.api.processing.PdfasSignRequest;
+import at.gv.egiz.pdfas.api.processing.PdfasSignResponse;
+import at.gv.egiz.pdfas.api.processing.SignedDocument;
 import at.gv.egiz.pdfas.api.ws.PDFASBulkSignRequest;
 import at.gv.egiz.pdfas.api.ws.PDFASBulkSignResponse;
 import at.gv.egiz.pdfas.api.ws.PDFASSignParameters.Connector;
 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.PdfasGetMultipleRequest;
+import at.gv.egiz.pdfas.api.ws.PdfasSignMultipleRequest;
+import at.gv.egiz.pdfas.api.ws.PdfasSignMultipleResponse;
+import at.gv.egiz.pdfas.api.ws.PdfasSignedDocument;
 import at.gv.egiz.pdfas.api.ws.VerificationLevel;
 import at.gv.egiz.pdfas.common.exceptions.PDFASError;
 import at.gv.egiz.pdfas.lib.api.verify.VerifyParameter.SignatureVerificationLevel;
@@ -53,188 +62,460 @@ import at.gv.egiz.pdfas.web.stats.StatisticEvent.Source;
 import at.gv.egiz.pdfas.web.stats.StatisticEvent.Status;
 import at.gv.egiz.pdfas.web.stats.StatisticFrontend;
 import at.gv.egiz.pdfas.web.store.RequestStore;
+import lombok.SneakyThrows;
+import lombok.extern.slf4j.Slf4j;
 
+@Slf4j
 @MTOM
 @WebService(endpointInterface = "at.gv.egiz.pdfas.api.ws.PDFASSigning")
 public class PDFASSigningImpl implements PDFASSigning {
 
-	private static final Logger logger = LoggerFactory
-			.getLogger(PDFASSigningImpl.class);
-
-	/*
-	 * public byte[] signPDFDokument(byte[] inputDocument, PDFASSignParameters
-	 * parameters) { checkSoapSignEnabled(); try { return
-	 * PdfAsHelper.synchornousServerSignature(inputDocument, parameters); }
-	 * catch (Throwable e) { logger.error("Server Signature failed.", e); if
-	 * (WebConfiguration.isShowErrorDetails()) { throw new
-	 * WebServiceException("Server Signature failed.", e); } else { throw new
-	 * WebServiceException("Server Signature failed."); } } }
-	 */
-
-	public PDFASSignResponse signPDFDokument(PDFASSignRequest request) {
-		logger.debug("Starting SOAP Sign Request");
-		checkSoapSignEnabled();
-		if (request == null) {
-			logger.warn("SOAP Sign Request is null!");
-			return null;
-		}
-		
-		StatisticEvent statisticEvent = new StatisticEvent();
-		statisticEvent.setSource(Source.SOAP);
-		statisticEvent.setOperation(Operation.SIGN);
-		statisticEvent.setUserAgent(UserAgentFilter.getUserAgent());
-		statisticEvent.setStartNow();
-		PDFASSignResponse response = new PDFASSignResponse();
-		try {
-			if(request.getParameters().getConnector() == null) {
-				throw new WebServiceException(
-						"Invalid connector value!");
-			}
-			
-			statisticEvent.setFilesize(request.getInputData().length);
-			statisticEvent.setProfileId(request.getParameters().getProfile());
-			statisticEvent.setDevice(request.getParameters().getConnector().toString());
-			
-			Map<String, String> preProcessor = null;
-			if(request.getParameters().getPreprocessor() != null) {
-				preProcessor = request.getParameters().getPreprocessor().getMap();
-			}
-			
-			if (request.getParameters().getConnector().equals(Connector.MOA)
-					|| request.getParameters().getConnector()
-							.equals(Connector.JKS)) {
-				// Plain server based signatures!!
-				response = PdfAsHelper.synchronousServerSignature(
-						request.getInputData(), request.getParameters(), request.getSignatureBlockParameters());
-
-
-				VerifyResult verifyResult = null;
-				if (request.getVerificationLevel() != null && 
-						request.getVerificationLevel().equals(
-						VerificationLevel.FULL_CERT_PATH)) {
-					List<VerifyResult> verResults = PdfAsHelper
-							.synchronousVerify(
-									response.getSignedPDF(),
-									-1,
-									SignatureVerificationLevel.FULL_VERIFICATION, 
-									preProcessor);
-
-					if (verResults.size() < 1) {
-						throw new WebServiceException(
-								"Document verification failed! " + verResults.size());
-					}
-					verifyResult = verResults.get(verResults.size() - 1);
-				} else {
-					List<VerifyResult> verResults = PdfAsHelper
-							.synchronousVerify(
-									response.getSignedPDF(),
-									-1,
-									SignatureVerificationLevel.INTEGRITY_ONLY_VERIFICATION, 
-									preProcessor);
-
-					if (verResults.size() < 1) {
-						throw new WebServiceException(
-								"Document verification failed! " + verResults.size());
-					}
-					verifyResult = verResults.get(verResults.size() - 1);
-				}
-
-				if(verifyResult.getValueCheckCode().getCode() == 0) {
-					statisticEvent.setStatus(Status.OK);
-					statisticEvent.setEndNow();
-					statisticEvent.setTimestampNow();
-					StatisticFrontend.getInstance().storeEvent(statisticEvent);
-					statisticEvent.setLogged(true);
-				} else {
-					statisticEvent.setStatus(Status.ERROR);
-					statisticEvent.setErrorCode(verifyResult.getValueCheckCode().getCode());
-					statisticEvent.setEndNow();
-					statisticEvent.setTimestampNow();
-					StatisticFrontend.getInstance().storeEvent(statisticEvent);
-					statisticEvent.setLogged(true);
-				}
-				
-				response.getVerificationResponse().setCertificateCode(
-						verifyResult.getCertificateCheck().getCode());
-				response.getVerificationResponse().setValueCode(
-						verifyResult.getValueCheckCode().getCode());
-
-			} else {
-				// Signatures with user interaction!!
-				String id = RequestStore.getInstance().createNewStoreEntry(
-						request, statisticEvent);
-
-				if (id == null) {
-					throw new WebServiceException("Failed to store 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) {
-			
-			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);
-			
-			logger.warn("Error in Soap Service", e);
-			if (e.getCause() != null) {
-				response.setError(e.getCause().getMessage());
-			} else {
-				response.setError(e.getMessage());
-			}
-		} finally {
-			logger.debug("Done SOAP Sign Request");
-		}
-		response.setRequestID(request.getRequestID());
-		return response;
-	}
-
-	public PDFASBulkSignResponse signPDFDokument(PDFASBulkSignRequest request) {
-		logger.debug("Starting SOAP BulkSign Request");
-		checkSoapSignEnabled();
-		List<PDFASSignResponse> responses = new ArrayList<PDFASSignResponse>();
-		if (request.getSignRequests() != null) {
-			for (int i = 0; i < request.getSignRequests().size(); i++) {
-				PDFASSignResponse response = signPDFDokument(request
-						.getSignRequests().get(i));
-				if (response != null) {
-					responses.add(response);
-				}
-			}
-			PDFASBulkSignResponse response = new PDFASBulkSignResponse();
-			response.setSignResponses(responses);
-			logger.debug("Done SOAP Sign Request");
-			return response;
-		}
-		logger.warn("Server Signature failed. [PDFASBulkSignRequest is NULL]");
-		
-		if (WebConfiguration.isShowErrorDetails()) {
-			throw new WebServiceException("PDFASBulkSignRequest is NULL");
-		} else {
-			throw new WebServiceException("Server Signature failed.");
-		}
-	}
-
-	private void checkSoapSignEnabled() {
-		if (!WebConfiguration.getSoapSignEnabled()) {
-			throw new WebServiceException("Service disabled!");
-		}
-	}
+  /*
+   * public byte[] signPDFDokument(byte[] inputDocument, PDFASSignParameters
+   * parameters) { checkSoapSignEnabled(); try { return
+   * PdfAsHelper.synchornousServerSignature(inputDocument, parameters); } catch
+   * (Throwable e) { logger.error("Server Signature failed.", e); if
+   * (WebConfiguration.isShowErrorDetails()) { throw new
+   * WebServiceException("Server Signature failed.", e); } else { throw new
+   * WebServiceException("Server Signature failed."); } } }
+   */
 
+  @Override
+  public PDFASSignResponse signPDFDokument(PDFASSignRequest request) {
+    log.debug("Starting SOAP Sign Request");
+    checkSoapSignEnabled();
+    if (request == null) {
+      log.warn("SOAP Sign Request is null!");
+      return null;
+    }
+
+    // map request into internal data-structure
+    final PdfasSignRequest internalReq = buildOperationRequest(request);
+
+    final StatisticEvent statisticEvent = new StatisticEvent();
+    statisticEvent.setSource(Source.SOAP);
+    statisticEvent.setOperation(Operation.SIGN);
+    statisticEvent.setUserAgent(UserAgentFilter.getUserAgent());
+    statisticEvent.setProfileId(request.getParameters().getProfile());
+    statisticEvent.setDevice(request.getParameters().getConnector().toString());
+    statisticEvent.setStartNow();
+
+    PDFASSignResponse response = new PDFASSignResponse();
+    try {
+      if (request.getParameters().getConnector() == null) {
+        throw new WebServiceException(
+            "Invalid connector value!");
+      }
+
+      if (request.getParameters().getConnector().equals(Connector.MOA)
+          || request.getParameters().getConnector()
+              .equals(Connector.JKS)) {
+
+        // perform technical signing process
+        final PdfasSignResponse internalResp = PdfAsHelper.synchronousServerSignature(internalReq);
+
+        // validate signatures
+        internalResp.getSignedPdfs().forEach(el -> validatePdfSignature(el, internalReq, statisticEvent));
+
+        // must be done later, because we should verify signed documents before
+        response = buildResponseFromInternalResult(internalResp, internalReq.getRequestID());
+
+      } else {
+        // Signatures with user interaction!!
+        final String id = RequestStore.getInstance().createNewStoreEntry(internalReq, statisticEvent);
+
+        if (id == null) {
+          throw new WebServiceException("Failed to store request");
+        }
+
+        final String userEntryURL = PdfAsHelper.generateUserEntryURL(id);
+
+        log.debug("Generated request store: " + id);
+        log.debug("Generated UI URL: " + userEntryURL);
+
+        if (userEntryURL == null) {
+          throw new WebServiceException(
+              "Failed to generate User Entry URL");
+        }
+
+        response.setRedirectUrl(userEntryURL);
+      }
+    } catch (final Throwable 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);
+
+      log.warn("Error in Soap Service", e);
+      if (e.getCause() != null) {
+        response.setError(e.getCause().getMessage());
+
+      } else {
+        response.setError(e.getMessage());
+
+      }
+
+    } finally {
+      log.debug("Done SOAP Sign Request");
+
+    }
+
+    response.setRequestID(request.getRequestID());
+    return response;
+
+  }
+
+  @Override
+  public PDFASBulkSignResponse signPDFDokument(PDFASBulkSignRequest request) {
+    log.debug("Starting SOAP BulkSign Request");
+    checkSoapSignEnabled();
+    final List<PDFASSignResponse> responses = new ArrayList<>();
+    if (request.getSignRequests() != null) {
+      for (int i = 0; i < request.getSignRequests().size(); i++) {
+        final PDFASSignResponse response = signPDFDokument(request
+            .getSignRequests().get(i));
+        if (response != null) {
+          responses.add(response);
+        }
+      }
+      final PDFASBulkSignResponse response = new PDFASBulkSignResponse();
+      response.setSignResponses(responses);
+      log.debug("Done SOAP Sign Request");
+      return response;
+    }
+    log.warn("Server Signature failed. [PDFASBulkSignRequest is NULL]");
+
+    if (WebConfiguration.isShowErrorDetails()) {
+      throw new WebServiceException("PDFASBulkSignRequest is NULL");
+    } else {
+      throw new WebServiceException("Server Signature failed.");
+    }
+  }
+
+  @Override
+  public PdfasSignMultipleResponse signPDFDokument(PdfasSignMultipleRequest request) {
+
+    log.debug("Starting SOAP Bulk-Sign Request");
+    checkSoapSignEnabled();
+    if (request == null) {
+      log.warn("SOAP Sign Request is null!");
+      return null;
+    }
+
+    // map request into internal data-structure
+    final PdfasSignRequest internalReq = buildOperationRequest(request);
+
+    final StatisticEvent statisticEvent = new StatisticEvent();
+    statisticEvent.setSource(Source.SOAP);
+    statisticEvent.setOperation(Operation.SIGNBULK);
+    statisticEvent.setUserAgent(UserAgentFilter.getUserAgent());
+    statisticEvent.setDevice(internalReq.getCoreParams().getConnector().toString());
+    statisticEvent.setStartNow();
+
+    PdfasSignMultipleResponse response = new PdfasSignMultipleResponse();
+    try {
+      if (internalReq.getCoreParams().getConnector() == null) {
+        throw new WebServiceException(
+            "Invalid connector value!");
+      }
+
+      if (internalReq.getCoreParams().getConnector().equals(Connector.MOA)
+          || internalReq.getCoreParams().getConnector()
+              .equals(Connector.JKS)) {
+
+        // perform technical signing process
+        final PdfasSignResponse internalResp = PdfAsHelper.synchronousServerSignature(internalReq);
+
+        // validate signatures
+        internalResp.getSignedPdfs().forEach(el -> validatePdfSignature(el, internalReq, statisticEvent));
+
+        // must be done later, because we should verify signed documents before
+        response = buildMultiResponseFromInternalResult(internalResp, internalReq.getRequestID(), internalReq
+            .getCoreParams().getTransactionId());
+
+      } else {
+        // Signatures with user interaction!!
+        final String id = RequestStore.getInstance().createNewStoreEntry(internalReq, statisticEvent);
+
+        if (id == null) {
+          throw new WebServiceException("Failed to store request");
+        }
+
+        final String userEntryURL = PdfAsHelper.generateUserEntryURL(id);
+
+        log.debug("Generated request store: " + id);
+        log.debug("Generated UI URL: " + userEntryURL);
+
+        if (userEntryURL == null) {
+          throw new WebServiceException(
+              "Failed to generate User Entry URL");
+        }
+
+        response.setRedirectUrl(userEntryURL);
+        response.setRequestID(request.getRequestID());
+
+      }
+    } catch (final Throwable 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);
+
+      log.warn("Error in Soap Service", e);
+      if (e.getCause() != null) {
+        response.setError(e.getCause().getMessage());
+
+      } else {
+        response.setError(e.getMessage());
+
+      }
+
+    } finally {
+      log.debug("Done SOAP Sign Request");
+
+    }
+
+    return response;
+
+  }
+
+  @Override
+  public PdfasSignMultipleResponse getSignedDokument(PdfasGetMultipleRequest request) {
+    log.debug("Starting SOAP Get-Signed Request");
+    checkSoapSignEnabled();
+    if (request == null) {
+      log.warn("SOAP Get-Signed Request is null!");
+      return null;
+      
+    }
+
+    final PdfasSignMultipleResponse response = new PdfasSignMultipleResponse();
+    
+    try {
+      if (StringUtils.isEmpty(request.getToken())) {
+        log.warn("SOAP Get-Signed Request contains NO token");
+        throw new WebServiceException("SOAP Get-Signed Request contains NO token");
+        
+      }
+      
+      final PdfasSignResponse result = RequestStore.getInstance().fetchStoreResponse(request.getToken());
+      if (result != null) {  
+        response.setRequestID(result.getRequestId());
+        response.setTransactionId(result.getTransactionId());
+        response.setOutput(result.getSignedPdfs().stream()
+            .map(el -> {
+              PdfasSignedDocument out = new PdfasSignedDocument();
+              out.setFileName(el.getFileName());
+              out.setOutputData(el.getOutputData());
+              out.setVerificationResponse(el.getVerificationResponse());
+              return out;
+              
+            })
+            .collect(Collectors.toList()));
+                            
+      } else {
+        log.warn("SOAP Get-Signed Request token is unknown or expired");
+        throw new WebServiceException("SOAP Get-Signed Request token is unknown or expired");
+        
+      }
+            
+    } catch (final Throwable e) {
+
+      log.warn("Error in Soap Service", e);
+      if (e.getCause() != null) {
+        response.setError(e.getCause().getMessage());
+
+      } else {
+        response.setError(e.getMessage());
+
+      }
+
+    } finally {
+      log.debug("Done SOAP Sign Request");
+
+    }
+    
+    return response;
+
+  }
+
+  private PdfasSignRequest buildOperationRequest(PdfasSignMultipleRequest request) {
+    final PdfasSignRequest data = new PdfasSignRequest();
+    data.setRequestID(request.getRequestID());
+    data.setVerificationLevel(request.getVerificationLevel());
+
+    final CoreSignParams coreParams = new CoreSignParams();
+    coreParams.setSignatureBlockParameters(request.getSignatureBlockParameters());
+    coreParams.setConnector(request.getConnector());
+    coreParams.setKeyIdentifier(request.getKeyIdentifier());
+    coreParams.setOverrides(
+        request.getOverrides() != null ? request.getOverrides().getMap() : null);
+    coreParams.setPreprocessor(
+        request.getPreprocessor() != null ? request.getPreprocessor().getMap() : null);
+    coreParams.setInvokeErrorUrl(request.getInvokeErrorUrl());
+    coreParams.setInvokeTarget(request.getInvokeTarget());
+    coreParams.setInvokeUrl(request.getInvokeUrl());
+    coreParams.setTransactionId(request.getTransactionId());
+    data.setCoreParams(coreParams);
+
+    request.getInput().forEach(el -> {
+      final DocumentToSign document = new DocumentToSign();
+      document.setInputData(el.getInputData());
+      document.setPosition(el.getPosition());
+      document.setProfile(el.getProfile());
+      document.setQrCodeContent(el.getQrCodeContent());
+      document.setFileName(el.getFileName());
+      data.addDocumentToSign(document);
+
+    });
+
+    return data;
+
+  }
+
+  private PdfasSignMultipleResponse buildMultiResponseFromInternalResult(PdfasSignResponse internalResp,
+      String reqId, String transactionId) {
+    final PdfasSignMultipleResponse resp = new PdfasSignMultipleResponse();
+    resp.setRequestID(reqId);
+    resp.setTransactionId(transactionId);
+    resp.setOutput(
+        internalResp.getSignedPdfs().stream()
+            .map(el -> {
+              final PdfasSignedDocument out = new PdfasSignedDocument();
+              out.setFileName(el.getFileName());
+              out.setOutputData(el.getOutputData());
+              out.setVerificationResponse(el.getVerificationResponse());
+              return out;
+            })
+            .collect(Collectors.toList()));
+
+    return resp;
+
+  }
+
+  private void checkSoapSignEnabled() {
+    if (!WebConfiguration.getSoapSignEnabled()) {
+      throw new WebServiceException("Service disabled!");
+    }
+  }
+
+  private PdfasSignRequest buildOperationRequest(PDFASSignRequest request) {
+    final PdfasSignRequest data = new PdfasSignRequest();
+    data.setRequestID(request.getRequestID());
+    data.setVerificationLevel(request.getVerificationLevel());
+
+    final CoreSignParams coreParams = new CoreSignParams();
+    coreParams.setSignatureBlockParameters(request.getSignatureBlockParameters());
+    coreParams.setConnector(request.getParameters().getConnector());
+    coreParams.setKeyIdentifier(request.getParameters().getKeyIdentifier());
+    coreParams.setOverrides(
+        request.getParameters().getOverrides() != null ? request.getParameters().getOverrides().getMap()
+            : null);
+    coreParams.setPreprocessor(
+        request.getParameters().getPreprocessor() != null ? request.getParameters().getPreprocessor().getMap()
+            : null);
+    coreParams.setInvokeErrorUrl(request.getParameters().getInvokeErrorURL());
+    coreParams.setInvokeTarget(request.getParameters().getInvokeTarget());
+    coreParams.setInvokeUrl(request.getParameters().getInvokeURL());
+    coreParams.setTransactionId(request.getParameters().getTransactionId());
+    data.setCoreParams(coreParams);
+
+    final DocumentToSign document = new DocumentToSign();
+    document.setInputData(request.getInputData());
+    document.setPosition(request.getParameters().getPosition());
+    document.setProfile(request.getParameters().getProfile());
+    document.setQrCodeContent(request.getParameters().getQRCodeContent());
+    data.addDocumentToSign(document);
+
+    return data;
+
+  }
+
+  private PDFASSignResponse buildResponseFromInternalResult(PdfasSignResponse internalResp, String reqId) {
+    final PDFASSignResponse resp = new PDFASSignResponse();
+    resp.setRequestID(reqId);
+    resp.setSignedPDF(internalResp.getSignedPdfs().get(0).getOutputData());
+    resp.setVerificationResponse(internalResp.getSignedPdfs().get(0).getVerificationResponse());
+    return resp;
+
+  }
+
+  @SneakyThrows
+  private void validatePdfSignature(SignedDocument el, PdfasSignRequest request,
+      StatisticEvent statisticEvent) {
+
+    Map<String, String> preProcessor = null;
+    if (request.getCoreParams().getPreprocessor() != null) {
+      preProcessor = request.getCoreParams().getPreprocessor();
+
+    }
+
+    VerifyResult verifyResult = null;
+    if (request.getVerificationLevel() != null &&
+        request.getVerificationLevel().equals(
+            VerificationLevel.FULL_CERT_PATH)) {
+      final List<VerifyResult> verResults = PdfAsHelper
+          .synchronousVerify(
+              el.getOutputData(),
+              -1,
+              SignatureVerificationLevel.FULL_VERIFICATION,
+              preProcessor);
+
+      if (verResults.size() < 1) {
+        throw new WebServiceException(
+            "Document verification failed! " + verResults.size());
+      }
+      verifyResult = verResults.get(verResults.size() - 1);
+    } else {
+      final List<VerifyResult> verResults = PdfAsHelper
+          .synchronousVerify(
+              el.getOutputData(),
+              -1,
+              SignatureVerificationLevel.INTEGRITY_ONLY_VERIFICATION,
+              preProcessor);
+
+      if (verResults.size() < 1) {
+        throw new WebServiceException(
+            "Document verification failed! " + verResults.size());
+      }
+
+      verifyResult = verResults.get(verResults.size() - 1);
+
+    }
+
+    if (verifyResult.getValueCheckCode().getCode() == 0) {
+      statisticEvent.setStatus(Status.OK);
+      statisticEvent.setEndNow();
+      statisticEvent.setTimestampNow();
+      statisticEvent.setFilesize(el.getOutputData().length);
+      StatisticFrontend.getInstance().storeEvent(statisticEvent);
+      statisticEvent.setLogged(true);
+    } else {
+      statisticEvent.setStatus(Status.ERROR);
+      statisticEvent.setErrorCode(verifyResult.getValueCheckCode().getCode());
+      statisticEvent.setEndNow();
+      statisticEvent.setTimestampNow();
+      statisticEvent.setFilesize(el.getOutputData().length);
+      StatisticFrontend.getInstance().storeEvent(statisticEvent);
+      statisticEvent.setLogged(true);
+    }
+
+    el.getVerificationResponse().setCertificateCode(
+        verifyResult.getCertificateCheck().getCode());
+    el.getVerificationResponse().setValueCode(
+        verifyResult.getValueCheckCode().getCode());
+
+  }
 }
-- 
cgit v1.2.3