diff options
Diffstat (limited to 'moaSig/moa-sig-lib/src/main/java/at/gv/egovernment/moa/spss/api/xmlbind/VerifyXMLSignatureResponseBuilder.java')
-rw-r--r-- | moaSig/moa-sig-lib/src/main/java/at/gv/egovernment/moa/spss/api/xmlbind/VerifyXMLSignatureResponseBuilder.java | 612 |
1 files changed, 302 insertions, 310 deletions
diff --git a/moaSig/moa-sig-lib/src/main/java/at/gv/egovernment/moa/spss/api/xmlbind/VerifyXMLSignatureResponseBuilder.java b/moaSig/moa-sig-lib/src/main/java/at/gv/egovernment/moa/spss/api/xmlbind/VerifyXMLSignatureResponseBuilder.java index 0b73442..48206c9 100644 --- a/moaSig/moa-sig-lib/src/main/java/at/gv/egovernment/moa/spss/api/xmlbind/VerifyXMLSignatureResponseBuilder.java +++ b/moaSig/moa-sig-lib/src/main/java/at/gv/egovernment/moa/spss/api/xmlbind/VerifyXMLSignatureResponseBuilder.java @@ -32,10 +32,6 @@ import org.w3c.dom.DocumentFragment; import org.w3c.dom.Element; import org.w3c.dom.NodeList; -import at.gv.egovernment.moaspss.logging.Logger; -import at.gv.egovernment.moaspss.util.Base64Utils; -import at.gv.egovernment.moaspss.util.Constants; -import at.gv.egovernment.moaspss.util.MiscUtil; import at.gv.egovernment.moa.spss.MOAApplicationException; import at.gv.egovernment.moa.spss.MOASystemException; import at.gv.egovernment.moa.spss.api.common.Content; @@ -46,319 +42,315 @@ import at.gv.egovernment.moa.spss.api.xmlverify.AdESFormResults; import at.gv.egovernment.moa.spss.api.xmlverify.ManifestRefsCheckResult; import at.gv.egovernment.moa.spss.api.xmlverify.ReferencesCheckResult; import at.gv.egovernment.moa.spss.api.xmlverify.VerifyXMLSignatureResponse; -import at.gv.egovernment.moa.spss.server.config.ConfigurationException; -import at.gv.egovernment.moa.spss.server.config.ConfigurationProvider; +import at.gv.egovernment.moaspss.util.Base64Utils; +import at.gv.egovernment.moaspss.util.Constants; +import at.gv.egovernment.moaspss.util.MiscUtil; /** * Convert a <code>VerifyXMLSignatureResponse</code> API object into its XML * representation, according to the MOA XML schema. - * + * * @author Patrick Peck * @version $Id$ */ public class VerifyXMLSignatureResponseBuilder { - private static final String MOA_NS_URI = Constants.MOA_NS_URI; - - /** The XML document containing the response element. */ - private Document responseDoc; - /** The response <code>VerifyXMLSignatureResponse</code> DOM element. */ - private Element responseElem; - - private boolean includeSigningTime = false; - /** - * Create a new <code>VerifyXMLSignatureResponseBuilder</code>: - * - * @throws MOASystemException - * An error occurred setting up the resulting XML document. - */ - public VerifyXMLSignatureResponseBuilder() throws MOASystemException { - responseDoc = ResponseBuilderUtils.createResponse("VerifyXMLSignatureResponse"); - responseElem = responseDoc.getDocumentElement(); - } - - public VerifyXMLSignatureResponseBuilder(boolean includeSigningTime) throws MOASystemException { - responseDoc = ResponseBuilderUtils.createResponse("VerifyXMLSignatureResponse"); - responseElem = responseDoc.getDocumentElement(); - this.includeSigningTime = includeSigningTime; - } - - public VerifyXMLSignatureResponseBuilder(Document responseDoc, String name, boolean includeSigningTime) throws MOASystemException { - this.responseDoc = responseDoc; - responseElem = responseDoc.createElementNS(MOA_NS_URI, name); - this.includeSigningTime = includeSigningTime; - } - - public Element buildElement(VerifyXMLSignatureResponse response) throws MOAApplicationException { - this.build(response); - return responseElem; - } - - /** - * Build a document containing a <code>VerifyXMLSignatureResponse</code> DOM - * element being the XML representation of the given - * <code>VerifyXMLSignatureResponse</code> API object. - * - * @param response - * The <code>VerifyXMLSignatureResponse</code> to convert to XML. - * @return A document containing the <code>VerifyXMLSignatureResponse</code> - * DOM element. - * @throws MOAApplicationException - * An error occurred building the response. - */ - public Document build(VerifyXMLSignatureResponse response) throws MOAApplicationException { - - Iterator iter; - List responseData; - - // add the SignerInfo - ResponseBuilderUtils.addSignerInfo(responseDoc, responseElem, response.getSignerInfo().getSignerCertificate(), - response.getSignerInfo().isQualifiedCertificate(), response.getSignerInfo().getQCSource(), - response.getSignerInfo().isPublicAuthority(), response.getSignerInfo().getPublicAuhtorityID(), - response.getSignerInfo().isSSCD(), response.getSignerInfo().getSSCDSource(), - response.getSignerInfo().getIssuerCountryCode(), - response.getSignerInfo().getTslInfos()); - - if(this.includeSigningTime) { - ResponseBuilderUtils.addSigningTime(responseDoc, - responseElem, response.getSignerInfo().getSigningTime()); - } - - // add HashInputData elements - responseData = response.getHashInputDatas(); - if (responseData != null && !responseData.isEmpty()) { - for (iter = responseData.iterator(); iter.hasNext();) { - InputData inputData = (InputData) iter.next(); - addContent("HashInputData", inputData); - } - } - - // add ReferenceInputData elements - responseData = response.getReferenceInputDatas(); - if (responseData != null && !responseData.isEmpty()) { - for (iter = responseData.iterator(); iter.hasNext();) { - InputData inputData = (InputData) iter.next(); - addContent("ReferenceInputData", inputData); - } - } - - //add hash algorithm - ResponseBuilderUtils.addSignatureAlgorithm(responseDoc, responseElem, response.getSignatureAlgorithm()); - - // add the SignatureCheck - addReferencesCheckResult("SignatureCheck", response.getSignatureCheck()); - - // add the SignatureManifestCheck - if (response.getSignatureManifestCheck() != null) { - addReferencesCheckResult("SignatureManifestCheck", response.getSignatureManifestCheck()); - } - - // add the XMLDsigManifestChecks - responseData = response.getXMLDsigManifestChecks(); - if (responseData != null && !responseData.isEmpty()) { - for (iter = responseData.iterator(); iter.hasNext();) { - ManifestRefsCheckResult checkResult = (ManifestRefsCheckResult) iter.next(); - addManifestRefsCheckResult("XMLDSIGManifestCheck", checkResult); - } - } - - // add the CertificateCheck - ResponseBuilderUtils.addCodeInfoElement(responseDoc, responseElem, "CertificateCheck", - response.getCertificateCheck().getCode(), response.getCertificateCheck().getInfo()); - - if (response.getAdESFormResults() != null) { - - Iterator formIterator = response.getAdESFormResults().iterator(); - - while (formIterator.hasNext()) { - AdESFormResults adESFormResult = (AdESFormResults) formIterator.next(); - // add the CertificateCheck - ResponseBuilderUtils.addFormCheckElement(responseDoc, responseElem, "FormCheckResult", - adESFormResult.getCode().intValue(), adESFormResult.getName()); - - } - } - - if(response.getExtendedCertificateCheck() != null) { - ResponseBuilderUtils.addExtendendResult(responseDoc, responseElem, response.getExtendedCertificateCheck()); - } - - return responseDoc; - } - - /** - * Add an element of type <code>ContentBaseType</code> to the response. - * - * @param elementName - * The name of the element. - * - * @param inputData - * The <code>InputData</code> to add. Based on the type of - * - * the <code>InputData</code>, either a - * <code>Base64Content</code> element or a - * <code>XMLContent</code> subelement will be added. An <code> - * InputDataBinaryImpl</code> will be added as a <code>Base64Content</code> - * child element. An<code>InputDataXMLImpl</code> will be added - * as <code> - * XMLContent</code> child element. - * - * @throws MOAApplicationException - * An error occurred adding the content. - */ - private void addContent(String elementName, InputData inputData) throws MOAApplicationException { - - Element contentElem = responseDoc.createElementNS(MOA_NS_URI, elementName); - - contentElem.setAttributeNS(null, "PartOf", inputData.getPartOf()); - if (inputData.getReferringReferenceNumber() != InputData.REFERER_NONE_) - contentElem.setAttributeNS(null, "ReferringSigReference", - Integer.toString(inputData.getReferringReferenceNumber())); - - if (MiscUtil.isNotEmpty(inputData.getHashAlgorithm())) { - contentElem.setAttribute("HashAlgorithm", inputData.getHashAlgorithm()); - - } - - switch (inputData.getContentType()) { - case Content.XML_CONTENT: - ContentXML contentXml = (ContentXML) inputData; - NodeList nodes = contentXml.getXMLContent(); - Element xmlElem; - int i; - - xmlElem = responseDoc.createElementNS(MOA_NS_URI, "XMLContent"); - // xmlElem.setAttributeNS(XML_NS_URI, "xml:space", "preserve"); - xmlElem.setAttribute("xml:space", "preserve"); - - for (i = 0; i < nodes.getLength(); i++) { - xmlElem.appendChild(responseDoc.importNode(nodes.item(i), true)); - } - contentElem.appendChild(xmlElem); - responseElem.appendChild(contentElem); - break; - case Content.BINARY_CONTENT: - Element binaryElem = responseDoc.createElementNS(MOA_NS_URI, "Base64Content"); - ContentBinary contentBinary = (ContentBinary) inputData; - String base64Str; - - try { - base64Str = Base64Utils.encode(contentBinary.getBinaryContent()); - } catch (IOException e) { - throw new MOAApplicationException("2200", null, e); - } - binaryElem.appendChild(responseDoc.createTextNode(base64Str)); - contentElem.appendChild(binaryElem); - responseElem.appendChild(contentElem); - break; - } - - } - - /** - * Add a <code>ReferencesCheckResult</code> to the response. - * - * @param elementName - * The DOM element name to use. - * @param checkResult - * The <code>ReferencesCheckResult</code> to add. - */ - private void addReferencesCheckResult(String elementName, ReferencesCheckResult checkResult) { - - NodeList info = null; - - if (checkResult.getInfo() != null) { - DocumentFragment fragment = responseDoc.createDocumentFragment(); - NodeList anyOtherInfo = checkResult.getInfo().getAnyOtherInfo(); - int[] failedReferences = checkResult.getInfo().getFailedReferences(); - - if (anyOtherInfo != null) { - addAnyOtherInfo(fragment, checkResult.getInfo().getAnyOtherInfo()); - } - - if (failedReferences != null) { - addFailedReferences(fragment, failedReferences); - } - - info = fragment.getChildNodes(); - } - - ResponseBuilderUtils.addCodeInfoElement(responseDoc, responseElem, elementName, checkResult.getCode(), info); - - } - - /** - * Add a <code>ManifestRefsCheckResult</code> to the response. - * - * @param elementName - * The DOM element name to use. - * @param checkResult - * The <code>ManifestRefsCheckResult</code> to add. - */ - private void addManifestRefsCheckResult(String elementName, ManifestRefsCheckResult checkResult) { - - DocumentFragment fragment = responseDoc.createDocumentFragment(); - NodeList anyOtherInfo = checkResult.getInfo().getAnyOtherInfo(); - int[] failedReferences = checkResult.getInfo().getFailedReferences(); - Element referringSigRefElem; - String referringSigRefStr; - - // add any other elements - if (anyOtherInfo != null) { - addAnyOtherInfo(fragment, checkResult.getInfo().getAnyOtherInfo()); - } - - // add the failed references - if (failedReferences != null) { - addFailedReferences(fragment, failedReferences); - } - - // add the ReferringSigReference - referringSigRefElem = responseDoc.createElementNS(MOA_NS_URI, "ReferringSigReference"); - referringSigRefStr = Integer.toString(checkResult.getInfo().getReferringSignatureReference()); - referringSigRefElem.appendChild(responseDoc.createTextNode(referringSigRefStr)); - fragment.appendChild(referringSigRefElem); - - // add XMLDSIGManifestCheckResult to the response - ResponseBuilderUtils.addCodeInfoElement(responseDoc, responseElem, elementName, checkResult.getCode(), - fragment.getChildNodes()); - } - - /** - * Add arbitrary XML content to a DOM <code>DocumentFragment</code>. - * - * @param fragment - * The fragment to add the XML content to. - * @param anyOtherInfo - * The XML content to add. - */ - private void addAnyOtherInfo(DocumentFragment fragment, NodeList anyOtherInfo) { - - int i; - - for (i = 0; i < anyOtherInfo.getLength(); i++) { - fragment.appendChild(responseDoc.importNode(anyOtherInfo.item(i), true)); - } - } - - /** - * Add the failed references as <code>FailedReference</code> DOM elements to - * the fragment. - * - * @param fragment - * The DOM document fragment to add the - * <code>FailedReference</code> elements to. - * @param failedReferences - * The indexes of the failed references. - */ - private void addFailedReferences(DocumentFragment fragment, int[] failedReferences) { - Element failedReferenceElem; - int i; - - for (i = 0; i < failedReferences.length; i++) { - failedReferenceElem = responseDoc.createElementNS(MOA_NS_URI, "FailedReference"); - failedReferenceElem.appendChild(responseDoc.createTextNode(Integer.toString(failedReferences[i]))); - fragment.appendChild(failedReferenceElem); - } - } + private static final String MOA_NS_URI = Constants.MOA_NS_URI; + + /** The XML document containing the response element. */ + private final Document responseDoc; + /** The response <code>VerifyXMLSignatureResponse</code> DOM element. */ + private final Element responseElem; + + private boolean includeSigningTime = false; + + /** + * Create a new <code>VerifyXMLSignatureResponseBuilder</code>: + * + * @throws MOASystemException An error occurred setting up the resulting XML + * document. + */ + public VerifyXMLSignatureResponseBuilder() throws MOASystemException { + responseDoc = ResponseBuilderUtils.createResponse("VerifyXMLSignatureResponse"); + responseElem = responseDoc.getDocumentElement(); + } + + public VerifyXMLSignatureResponseBuilder(boolean includeSigningTime) throws MOASystemException { + responseDoc = ResponseBuilderUtils.createResponse("VerifyXMLSignatureResponse"); + responseElem = responseDoc.getDocumentElement(); + this.includeSigningTime = includeSigningTime; + } + + public VerifyXMLSignatureResponseBuilder(Document responseDoc, String name, boolean includeSigningTime) + throws MOASystemException { + this.responseDoc = responseDoc; + responseElem = responseDoc.createElementNS(MOA_NS_URI, name); + this.includeSigningTime = includeSigningTime; + } + + public Element buildElement(VerifyXMLSignatureResponse response) throws MOAApplicationException { + this.build(response); + return responseElem; + } + + /** + * Build a document containing a <code>VerifyXMLSignatureResponse</code> DOM + * element being the XML representation of the given + * <code>VerifyXMLSignatureResponse</code> API object. + * + * @param response The <code>VerifyXMLSignatureResponse</code> to convert to + * XML. + * @return A document containing the <code>VerifyXMLSignatureResponse</code> DOM + * element. + * @throws MOAApplicationException An error occurred building the response. + */ + public Document build(VerifyXMLSignatureResponse response) throws MOAApplicationException { + + Iterator iter; + List responseData; + + // add the SignerInfo + ResponseBuilderUtils.addSignerInfo(responseDoc, responseElem, response.getSignerInfo() + .getSignerCertificate(), + response.getSignerInfo().isQualifiedCertificate(), response.getSignerInfo().getQCSource(), + response.getSignerInfo().isPublicAuthority(), response.getSignerInfo().getPublicAuhtorityID(), + response.getSignerInfo().isSSCD(), response.getSignerInfo().getSSCDSource(), + response.getSignerInfo().getIssuerCountryCode(), + response.getSignerInfo().getTslInfos()); + + if (this.includeSigningTime) { + ResponseBuilderUtils.addSigningTime(responseDoc, + responseElem, response.getSignerInfo().getSigningTime()); + } + + // add HashInputData elements + responseData = response.getHashInputDatas(); + if (responseData != null && !responseData.isEmpty()) { + for (iter = responseData.iterator(); iter.hasNext();) { + final InputData inputData = (InputData) iter.next(); + addContent("HashInputData", inputData); + } + } + + // add ReferenceInputData elements + responseData = response.getReferenceInputDatas(); + if (responseData != null && !responseData.isEmpty()) { + for (iter = responseData.iterator(); iter.hasNext();) { + final InputData inputData = (InputData) iter.next(); + addContent("ReferenceInputData", inputData); + } + } + + // add hash algorithm + ResponseBuilderUtils.addSignatureAlgorithm(responseDoc, responseElem, response.getSignatureAlgorithm()); + + // add the SignatureCheck + addReferencesCheckResult("SignatureCheck", response.getSignatureCheck()); + + // add the SignatureManifestCheck + if (response.getSignatureManifestCheck() != null) { + addReferencesCheckResult("SignatureManifestCheck", response.getSignatureManifestCheck()); + } + + // add the XMLDsigManifestChecks + responseData = response.getXMLDsigManifestChecks(); + if (responseData != null && !responseData.isEmpty()) { + for (iter = responseData.iterator(); iter.hasNext();) { + final ManifestRefsCheckResult checkResult = (ManifestRefsCheckResult) iter.next(); + addManifestRefsCheckResult("XMLDSIGManifestCheck", checkResult); + } + } + + // add the CertificateCheck + ResponseBuilderUtils.addCodeInfoElement(responseDoc, responseElem, "CertificateCheck", + response.getCertificateCheck().getCode(), response.getCertificateCheck().getInfo()); + + if (response.getAdESFormResults() != null) { + + final Iterator formIterator = response.getAdESFormResults().iterator(); + + while (formIterator.hasNext()) { + final AdESFormResults adESFormResult = (AdESFormResults) formIterator.next(); + // add the CertificateCheck + ResponseBuilderUtils.addFormCheckElement(responseDoc, responseElem, "FormCheckResult", + adESFormResult.getCode().intValue(), adESFormResult.getName()); + + } + } + + if (response.getExtendedCertificateCheck() != null) { + ResponseBuilderUtils.addExtendendResult(responseDoc, responseElem, response + .getExtendedCertificateCheck()); + } + + return responseDoc; + } + + /** + * Add an element of type <code>ContentBaseType</code> to the response. + * + * @param elementName The name of the element. + * + * @param inputData The <code>InputData</code> to add. Based on the type of + * + * the <code>InputData</code>, either a + * <code>Base64Content</code> element or a + * <code>XMLContent</code> subelement will be added. An + * <code> + * InputDataBinaryImpl</code> will be added as a <code>Base64Content</code> + * child element. An<code>InputDataXMLImpl</code> will be + * added as <code> + * XMLContent</code> child element. + * + * @throws MOAApplicationException An error occurred adding the content. + */ + private void addContent(String elementName, InputData inputData) throws MOAApplicationException { + + final Element contentElem = responseDoc.createElementNS(MOA_NS_URI, elementName); + + contentElem.setAttributeNS(null, "PartOf", inputData.getPartOf()); + if (inputData.getReferringReferenceNumber() != InputData.REFERER_NONE_) { + contentElem.setAttributeNS(null, "ReferringSigReference", + Integer.toString(inputData.getReferringReferenceNumber())); + } + + if (MiscUtil.isNotEmpty(inputData.getHashAlgorithm())) { + contentElem.setAttribute("HashAlgorithm", inputData.getHashAlgorithm()); + + } + + switch (inputData.getContentType()) { + case Content.XML_CONTENT: + final ContentXML contentXml = (ContentXML) inputData; + final NodeList nodes = contentXml.getXMLContent(); + Element xmlElem; + int i; + + xmlElem = responseDoc.createElementNS(MOA_NS_URI, "XMLContent"); + // xmlElem.setAttributeNS(XML_NS_URI, "xml:space", "preserve"); + xmlElem.setAttribute("xml:space", "preserve"); + + for (i = 0; i < nodes.getLength(); i++) { + xmlElem.appendChild(responseDoc.importNode(nodes.item(i), true)); + } + contentElem.appendChild(xmlElem); + responseElem.appendChild(contentElem); + break; + case Content.BINARY_CONTENT: + final Element binaryElem = responseDoc.createElementNS(MOA_NS_URI, "Base64Content"); + final ContentBinary contentBinary = (ContentBinary) inputData; + String base64Str; + + try { + base64Str = Base64Utils.encode(contentBinary.getBinaryContent()); + } catch (final IOException e) { + throw new MOAApplicationException("2200", null, e); + } + binaryElem.appendChild(responseDoc.createTextNode(base64Str)); + contentElem.appendChild(binaryElem); + responseElem.appendChild(contentElem); + break; + } + + } + + /** + * Add a <code>ReferencesCheckResult</code> to the response. + * + * @param elementName The DOM element name to use. + * @param checkResult The <code>ReferencesCheckResult</code> to add. + */ + private void addReferencesCheckResult(String elementName, ReferencesCheckResult checkResult) { + + NodeList info = null; + + if (checkResult.getInfo() != null) { + final DocumentFragment fragment = responseDoc.createDocumentFragment(); + final NodeList anyOtherInfo = checkResult.getInfo().getAnyOtherInfo(); + final int[] failedReferences = checkResult.getInfo().getFailedReferences(); + + if (anyOtherInfo != null) { + addAnyOtherInfo(fragment, checkResult.getInfo().getAnyOtherInfo()); + } + + if (failedReferences != null) { + addFailedReferences(fragment, failedReferences); + } + + info = fragment.getChildNodes(); + } + + ResponseBuilderUtils.addCodeInfoElement(responseDoc, responseElem, elementName, checkResult.getCode(), + info); + + } + + /** + * Add a <code>ManifestRefsCheckResult</code> to the response. + * + * @param elementName The DOM element name to use. + * @param checkResult The <code>ManifestRefsCheckResult</code> to add. + */ + private void addManifestRefsCheckResult(String elementName, ManifestRefsCheckResult checkResult) { + + final DocumentFragment fragment = responseDoc.createDocumentFragment(); + final NodeList anyOtherInfo = checkResult.getInfo().getAnyOtherInfo(); + final int[] failedReferences = checkResult.getInfo().getFailedReferences(); + Element referringSigRefElem; + String referringSigRefStr; + + // add any other elements + if (anyOtherInfo != null) { + addAnyOtherInfo(fragment, checkResult.getInfo().getAnyOtherInfo()); + } + + // add the failed references + if (failedReferences != null) { + addFailedReferences(fragment, failedReferences); + } + + // add the ReferringSigReference + referringSigRefElem = responseDoc.createElementNS(MOA_NS_URI, "ReferringSigReference"); + referringSigRefStr = Integer.toString(checkResult.getInfo().getReferringSignatureReference()); + referringSigRefElem.appendChild(responseDoc.createTextNode(referringSigRefStr)); + fragment.appendChild(referringSigRefElem); + + // add XMLDSIGManifestCheckResult to the response + ResponseBuilderUtils.addCodeInfoElement(responseDoc, responseElem, elementName, checkResult.getCode(), + fragment.getChildNodes()); + } + + /** + * Add arbitrary XML content to a DOM <code>DocumentFragment</code>. + * + * @param fragment The fragment to add the XML content to. + * @param anyOtherInfo The XML content to add. + */ + private void addAnyOtherInfo(DocumentFragment fragment, NodeList anyOtherInfo) { + + int i; + + for (i = 0; i < anyOtherInfo.getLength(); i++) { + fragment.appendChild(responseDoc.importNode(anyOtherInfo.item(i), true)); + } + } + + /** + * Add the failed references as <code>FailedReference</code> DOM elements to the + * fragment. + * + * @param fragment The DOM document fragment to add the + * <code>FailedReference</code> elements to. + * @param failedReferences The indexes of the failed references. + */ + private void addFailedReferences(DocumentFragment fragment, int[] failedReferences) { + Element failedReferenceElem; + int i; + + for (i = 0; i < failedReferences.length; i++) { + failedReferenceElem = responseDoc.createElementNS(MOA_NS_URI, "FailedReference"); + failedReferenceElem.appendChild(responseDoc.createTextNode(Integer.toString(failedReferences[i]))); + fragment.appendChild(failedReferenceElem); + } + } } |