From e5316db083e46c8ae9e4b07bff57812d9314200b Mon Sep 17 00:00:00 2001 From: Andreas Fitzek Date: Thu, 12 Dec 2013 17:00:00 +0100 Subject: MOA SS integration OK --- .../java/at/gv/egiz/pdfas/lib/impl/PdfAsImpl.java | 13 ++- .../main/java/at/gv/egiz/sl/util/MOAConnector.java | 102 +++++++++++++++++---- 2 files changed, 96 insertions(+), 19 deletions(-) (limited to 'pdf-as-lib/src/main/java/at/gv/egiz') diff --git a/pdf-as-lib/src/main/java/at/gv/egiz/pdfas/lib/impl/PdfAsImpl.java b/pdf-as-lib/src/main/java/at/gv/egiz/pdfas/lib/impl/PdfAsImpl.java index 5f9d2b03..48d15b4d 100644 --- a/pdf-as-lib/src/main/java/at/gv/egiz/pdfas/lib/impl/PdfAsImpl.java +++ b/pdf-as-lib/src/main/java/at/gv/egiz/pdfas/lib/impl/PdfAsImpl.java @@ -139,11 +139,12 @@ public class PdfAsImpl implements PdfAs, IConfigurationConstants { public List verify(VerifyParameter parameter) throws PdfAsException { + PDDocument doc = null; try { List result = new ArrayList(); ISettings settings = (ISettings) parameter.getConfiguration(); VerifierDispatcher verifier = new VerifierDispatcher(settings); - PDDocument doc = PDDocument.load(new ByteArrayInputStream(parameter + doc = PDDocument.load(new ByteArrayInputStream(parameter .getDataSource().getByteData())); COSDictionary trailer = doc.getDocument().getTrailer(); @@ -210,6 +211,14 @@ public class PdfAsImpl implements PdfAs, IConfigurationConstants { } catch (PdfAsException e) { logger.error("Failed to verify document", e); throw new PdfAsException("error.pdf.verify.02", e); + } finally { + if(doc != null) { + try { + doc.close(); + } catch (IOException e) { + logger.info("Failed to close doc"); + } + } } } @@ -236,7 +245,7 @@ public class PdfAsImpl implements PdfAs, IConfigurationConstants { status); status.setRequestedSignature(requestedSignature); - + request.setStatus(status); request.setNeedCertificate(true); diff --git a/pdf-as-lib/src/main/java/at/gv/egiz/sl/util/MOAConnector.java b/pdf-as-lib/src/main/java/at/gv/egiz/sl/util/MOAConnector.java index d46f34a3..61b11d29 100644 --- a/pdf-as-lib/src/main/java/at/gv/egiz/sl/util/MOAConnector.java +++ b/pdf-as-lib/src/main/java/at/gv/egiz/sl/util/MOAConnector.java @@ -9,9 +9,13 @@ import java.io.FileNotFoundException; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; +import java.io.StringReader; import java.security.cert.CertificateException; import javax.activation.DataHandler; +import javax.xml.parsers.DocumentBuilder; +import javax.xml.parsers.DocumentBuilderFactory; +import javax.xml.parsers.ParserConfigurationException; import org.apache.axis2.databinding.types.Token; import org.apache.commons.codec.binary.Base64; @@ -24,6 +28,11 @@ import org.apache.http.impl.client.CloseableHttpClient; import org.apache.http.impl.client.HttpClientBuilder; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import org.w3c.dom.Document; +import org.w3c.dom.Node; +import org.w3c.dom.NodeList; +import org.xml.sax.InputSource; +import org.xml.sax.SAXException; import at.gv.egiz.moa.ByteArrayDataSource; import at.gv.egiz.moa.SignatureCreationServiceStub; @@ -39,6 +48,7 @@ import at.gv.egiz.moa.SignatureCreationServiceStub.MimeTypeType; import at.gv.egiz.moa.SignatureCreationServiceStub.SingleSignatureInfo_type1; import at.gv.egiz.moa.SignatureCreationServiceStub.Structure_type1; import at.gv.egiz.pdfas.common.exceptions.PdfAsException; +import at.gv.egiz.pdfas.common.exceptions.PdfAsMOAException; import at.gv.egiz.pdfas.common.utils.StreamUtils; import at.gv.egiz.pdfas.lib.api.Configuration; @@ -46,6 +56,8 @@ public class MOAConnector implements ISignatureConnector { private static final Logger logger = LoggerFactory .getLogger(MOAConnector.class); + + private static final Logger moalogger = LoggerFactory.getLogger("at.knowcenter.wag.egov.egiz.sig.connectors.MOASSRepsonseLogger"); public static final String MOA_SIGN_URL = "moa.sign.url"; public static final String MOA_SIGN_KEY_ID = "moa.sign.KeyIdentifier"; @@ -54,6 +66,12 @@ public class MOAConnector implements ISignatureConnector { public static final String KEY_ID_PATTERN = "##KEYID##"; public static final String CONTENT_PATTERN = "##CONTENT##"; + public static final String FAULTCODE = "faultcode"; + public static final String FAULTSTRING = "faultstring"; + public static final String ERRORRESPONSE = "ErrorResponse"; + public static final String ERRORCODE = "ErrorCode"; + public static final String CMSSIGNATURE = "CMSSignature"; + public static final String CMS_REQUEST = "" + "" + KEY_ID_PATTERN @@ -72,6 +90,7 @@ public class MOAConnector implements ISignatureConnector { public MOAConnector(Configuration config) throws CertificateException, FileNotFoundException, IOException { + logger.info("Loading certificate: " + config.getValue(MOA_SIGN_CERTIFICATE)); this.certificate = new X509Certificate(new FileInputStream(new File( config.getValue(MOA_SIGN_CERTIFICATE)))); this.moaEndpoint = config.getValue(MOA_SIGN_URL); @@ -104,20 +123,18 @@ public class MOAConnector implements ISignatureConnector { request = request .replace(KEY_ID_PATTERN, this.keyIdentifier.trim()); - //SOAPAction: "urn:CreateCMSSignatureAction" + // SOAPAction: "urn:CreateCMSSignatureAction" post.setHeader("SOAPAction", "urn:CreateCMSSignatureAction"); - + EntityBuilder entityBuilder = EntityBuilder.create(); - + entityBuilder.setContentType(ContentType.TEXT_XML); entityBuilder.setContentEncoding("UTF-8"); entityBuilder.setText(request); - - post.setEntity(entityBuilder.build()); + post.setEntity(entityBuilder.build()); + moalogger.debug(">>> " + request); HttpResponse response = client.execute(post); - logger.debug("Response Code : " - + response.getStatusLine().getStatusCode()); BufferedReader rd = new BufferedReader(new InputStreamReader( response.getEntity().getContent())); @@ -128,27 +145,78 @@ public class MOAConnector implements ISignatureConnector { result.append(line); } - logger.trace(result.toString()); - return new byte[] {}; + moalogger.debug("<<< " + result.toString()); + + DocumentBuilderFactory dbFactory = DocumentBuilderFactory + .newInstance(); + DocumentBuilder dBuilder = dbFactory.newDocumentBuilder(); + Document doc = dBuilder.parse(new InputSource(new StringReader( + result.toString()))); + doc.getDocumentElement().normalize(); + + if (response.getStatusLine().getStatusCode() != 200) { + String faultCode = ""; + String faultString = ""; + String errorResponse = ""; + String errorCode = ""; + NodeList nodeList = doc.getElementsByTagName("*"); + for (int i = 0; i < nodeList.getLength(); i++) { + Node node = nodeList.item(i); + if (node.getNodeType() == Node.ELEMENT_NODE) { + if (node.getNodeName().equals(FAULTCODE)) { + faultCode = node.getTextContent(); + } else if (node.getNodeName().equals(FAULTSTRING)) { + faultString = node.getTextContent(); + } else if (node.getNodeName().equals(ERRORCODE)) { + errorCode = node.getTextContent(); + } else if (node.getNodeName().equals(ERRORRESPONSE)) { + errorResponse = node.getTextContent(); + } + } + } + throw new PdfAsMOAException(faultCode, faultString, + errorResponse, errorCode); + } else { + String cmsSignature = null; + NodeList nodeList = doc.getElementsByTagName("*"); + for (int i = 0; i < nodeList.getLength(); i++) { + Node node = nodeList.item(i); + if (node.getNodeType() == Node.ELEMENT_NODE) { + if (node.getNodeName().equals(CMSSIGNATURE)) { + cmsSignature = node.getTextContent(); + break; + } + } + } + + if (cmsSignature != null) { + try { + return base64.decode(cmsSignature); + } catch(Exception e) { + throw new PdfAsException("error.pdf.io.07", e); + } + } else { + throw new PdfAsException("error.pdf.io.07"); + } + } } catch (IllegalStateException e) { - // TODO Auto-generated catch block - e.printStackTrace(); + throw new PdfAsException("error.pdf.io.08", e); } catch (IOException e) { - // TODO Auto-generated catch block - e.printStackTrace(); + throw new PdfAsException("error.pdf.io.08", e); + } catch (SAXException e) { + throw new PdfAsException("error.pdf.io.08", e); + } catch (ParserConfigurationException e) { + throw new PdfAsException("error.pdf.io.08", e); } finally { if (client != null) { try { client.close(); } catch (IOException e) { - // TODO Auto-generated catch block - e.printStackTrace(); + logger.warn("Failed to close client", e); } } } - return new byte[] {}; } - /* * public byte[] sign(byte[] input, int[] byteRange) throws PdfAsException { * try { -- cgit v1.2.3