package at.gv.egovernment.moa.spss.server.webservice.binding; import java.io.ByteArrayInputStream; import java.io.InputStream; import java.math.BigInteger; import java.util.ArrayList; import java.util.Date; import java.util.Iterator; import java.util.List; import java.util.StringTokenizer; import at.gv.egiz.moasig.FormResultType; import at.gv.egiz.moasig.ObjectFactory; import at.gv.egiz.moasig.PDFSignatureResultType; import at.gv.egiz.moasig.VerifyCMSSignatureResponseType; import at.gv.egiz.moasig.VerifyPDFSignatureRequest; import at.gv.egiz.moasig.VerifyPDFSignatureResponseType; import at.gv.egovernment.moa.spss.MOAApplicationException; import at.gv.egovernment.moa.spss.api.SPSSFactory; import at.gv.egovernment.moa.spss.api.cmsverify.CMSDataObject; import at.gv.egovernment.moa.spss.api.cmsverify.VerifyCMSSignatureRequest; import at.gv.egovernment.moa.spss.api.cmsverify.VerifyCMSSignatureResponse; import at.gv.egovernment.moa.spss.api.cmsverify.VerifyCMSSignatureResponseElement; import at.gv.egovernment.moa.spss.api.common.CheckResult; import at.gv.egovernment.moa.spss.api.common.SignerInfo; import at.gv.egovernment.moa.spss.api.xmlverify.AdESFormResults; import at.gv.egovernment.moa.spss.server.webservice.CMSVerifySignatureBinding; import at.gv.egovernment.moa.util.CollectionUtils; public class CMSVerifySignatureBindingImpl implements CMSVerifySignatureBinding { private TransformerUtils transformerUtils = new TransformerUtils(); /** The factory to create API objects. */ private SPSSFactory factory = SPSSFactory.getInstance(); @Override public VerifyCMSSignatureRequest buildCMSRequest( at.gv.egiz.moasig.VerifyCMSSignatureRequest verifyCMSSignatureRequest) throws MOAApplicationException { Date dateTime = null; if (verifyCMSSignatureRequest.getDateTime() != null) { dateTime = verifyCMSSignatureRequest.getDateTime().toGregorianCalendar().getTime(); } int[] signatories = parseSignatories(verifyCMSSignatureRequest); CMSDataObject dataObject = this.transformerUtils.parseDataObject(verifyCMSSignatureRequest.getDataObject()); String trustProfileID = null; if (verifyCMSSignatureRequest.getTrustProfileID() != null) { trustProfileID = verifyCMSSignatureRequest.getTrustProfileID(); } InputStream cmsSignature = new ByteArrayInputStream(verifyCMSSignatureRequest.getCMSSignature()); return factory.createVerifyCMSSignatureRequest(signatories, dateTime, cmsSignature, dataObject, trustProfileID, false); } /** * Parse the Signatories attribute contained in the * VerifyCMSSignatureRequest DOM element. * * @param requestElem * The VerifyCMSSignatureRequest DOM element. * @return The signatories contained in the given * VerifyCMSSignatureRequest DOM element. */ private int[] parseSignatories(at.gv.egiz.moasig.VerifyCMSSignatureRequest verifyCMSSignatureRequest) { if(verifyCMSSignatureRequest.getSignatories().isEmpty()) { return VerifyCMSSignatureRequest.ALL_SIGNATORIES; } Iterator signatoriesIterator = verifyCMSSignatureRequest.getSignatories().iterator(); List signatoriesList = new ArrayList(); int[] signatories; while (signatoriesIterator.hasNext()) { String signatorie = signatoriesIterator.next(); if ("all".equals(signatorie)) { return VerifyCMSSignatureRequest.ALL_SIGNATORIES; } else { StringTokenizer tokenizer = new StringTokenizer(signatorie); // put the signatories into a List while (tokenizer.hasMoreTokens()) { try { signatoriesList.add(new Integer(tokenizer.nextToken())); } catch (NumberFormatException e) { // this cannot occur if the request has been validated } } } } // convert the List into an int array signatories = CollectionUtils.toIntArray(signatoriesList); return signatories; } @Override public VerifyCMSSignatureResponseType buildCMSResponse(VerifyCMSSignatureResponse response) throws MOAApplicationException { VerifyCMSSignatureResponseType verifyCMSSignatureResponseType = new VerifyCMSSignatureResponseType(); Iterator iter; for (iter = response.getResponseElements().iterator(); iter.hasNext();) { VerifyCMSSignatureResponseElement responseElement = (VerifyCMSSignatureResponseElement) iter.next(); addResponseElement(verifyCMSSignatureResponseType, responseElement); } return verifyCMSSignatureResponseType; } /** * Add an element to the response. * * @param responseElement * The element to add to the response. * @throws MOAApplicationException * An error occurred adding the element. */ private void addResponseElement(VerifyCMSSignatureResponseType verifyCMSSignatureResponseType, VerifyCMSSignatureResponseElement responseElement) throws MOAApplicationException { ObjectFactory of = new ObjectFactory(); SignerInfo signerInfo = responseElement.getSignerInfo(); CheckResult signatureCheck = responseElement.getSignatureCheck(); CheckResult certCheck = responseElement.getCertificateCheck(); verifyCMSSignatureResponseType.getSignerInfoAndSignatureCheckAndCertificateCheck().add( of.createVerifyCMSSignatureResponseTypeSignerInfo(this.transformerUtils.buildSignerInfo(signerInfo))); verifyCMSSignatureResponseType.getSignerInfoAndSignatureCheckAndCertificateCheck() .add(of.createVerifyCMSSignatureResponseTypeSignatureCheck( this.transformerUtils.buildCheckResult(signatureCheck))); verifyCMSSignatureResponseType.getSignerInfoAndSignatureCheckAndCertificateCheck() .add(of.createVerifyCMSSignatureResponseTypeCertificateCheck( this.transformerUtils.buildCheckResult(certCheck))); if (responseElement.getAdESFormResults() != null) { Iterator adesIterator = responseElement.getAdESFormResults().iterator(); while (adesIterator.hasNext()) { AdESFormResults adesResult = (AdESFormResults) adesIterator.next(); FormResultType formResultType = new FormResultType(); formResultType.setCode(BigInteger.valueOf(adesResult.getCode())); formResultType.setName(adesResult.getName()); verifyCMSSignatureResponseType.getSignerInfoAndSignatureCheckAndCertificateCheck().add( of.createVerifyCMSSignatureResponseTypeFormCheckResult(formResultType)); } } } /** * Add an element to the response. * * @param responseElement * The element to add to the response. * @throws MOAApplicationException * An error occurred adding the element. */ private void addResponseElement(VerifyPDFSignatureResponseType verifyPDFSignatureResponseType, VerifyCMSSignatureResponseElement responseElement) throws MOAApplicationException { SignerInfo signerInfo = responseElement.getSignerInfo(); CheckResult signatureCheck = responseElement.getSignatureCheck(); CheckResult certCheck = responseElement.getCertificateCheck(); PDFSignatureResultType resultType = new PDFSignatureResultType(); if (responseElement.getAdESFormResults() != null) { Iterator adesIterator = responseElement.getAdESFormResults().iterator(); while (adesIterator.hasNext()) { AdESFormResults adesResult = (AdESFormResults) adesIterator.next(); FormResultType formResultType = new FormResultType(); formResultType.setCode(BigInteger.valueOf(adesResult.getCode())); formResultType.setName(adesResult.getName()); resultType.getFormCheckResult().add(formResultType); } } resultType.setSignerInfo(this.transformerUtils.buildSignerInfo(signerInfo)); resultType.setSignatureCheck(this.transformerUtils.buildCheckResult(signatureCheck)); resultType.setCertificateCheck(this.transformerUtils.buildCheckResult(certCheck)); verifyPDFSignatureResponseType.getSignatureResult().add(resultType); } /** * Parse the Signatories attribute contained in the * VerifyCMSSignatureRequest DOM element. * * @param requestElem * The VerifyCMSSignatureRequest DOM element. * @return The signatories contained in the given * VerifyCMSSignatureRequest DOM element. */ private int[] parseSignatories(VerifyPDFSignatureRequest verifyPDFSignatureRequest) { return VerifyCMSSignatureRequest.ALL_SIGNATORIES; } @Override public VerifyCMSSignatureRequest buildPDFRequest(VerifyPDFSignatureRequest verifyPDFSignatureRequest) throws MOAApplicationException { Date dateTime = null; if (verifyPDFSignatureRequest.getDateTime() == null) { dateTime = verifyPDFSignatureRequest.getDateTime().toGregorianCalendar().getTime(); } int[] signatories = parseSignatories(verifyPDFSignatureRequest); String trustProfileID = null; if (verifyPDFSignatureRequest.getTrustProfileID() != null) { trustProfileID = verifyPDFSignatureRequest.getTrustProfileID(); } InputStream cmsSignature = new ByteArrayInputStream(verifyPDFSignatureRequest.getPDFSignature()); return factory.createVerifyCMSSignatureRequest(signatories, dateTime, cmsSignature, null, trustProfileID, true); } @Override public VerifyPDFSignatureResponseType buildPDFResponse(VerifyCMSSignatureResponse response) throws MOAApplicationException { VerifyPDFSignatureResponseType verifyPDFSignatureResponseType = new VerifyPDFSignatureResponseType(); Iterator iter; for (iter = response.getResponseElements().iterator(); iter.hasNext();) { VerifyCMSSignatureResponseElement responseElement = (VerifyCMSSignatureResponseElement) iter.next(); addResponseElement(verifyPDFSignatureResponseType, responseElement); } return verifyPDFSignatureResponseType; } }