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.moaspss.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;
}
}