/* * Copyright 2003 Federal Chancellery Austria * MOA-SPSS has been developed in a cooperation between BRZ, the Federal * Chancellery Austria - ICT staff unit, 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 * that you distribute must include a readable copy of the "NOTICE" text file. */ package at.gv.egovernment.moa.spss.api.xmlbind; import java.io.InputStream; import java.math.BigDecimal; import java.util.ArrayList; import java.util.Date; import java.util.List; import java.util.StringTokenizer; import org.w3c.dom.Element; import at.gv.egovernment.moa.spss.MOAApplicationException; import at.gv.egovernment.moa.spss.api.SPSSFactory; import at.gv.egovernment.moa.spss.api.cmsverify.CMSContent; 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.common.MetaInfo; import at.gv.egovernment.moaspss.logging.Logger; import at.gv.egovernment.moaspss.util.Base64Utils; import at.gv.egovernment.moaspss.util.CollectionUtils; import at.gv.egovernment.moaspss.util.Constants; import at.gv.egovernment.moaspss.util.DOMUtils; import at.gv.egovernment.moaspss.util.XPathUtils; /** * A parser to parse VerifyCMSSignatureRequest DOM trees into * VerifyCMSSignatureRequest API objects. * * @author Patrick Peck * @version $Id$ */ public class VerifyCMSSignatureRequestParser { // // XPath expressions for selecting parts of the DOM message // private static final String MOA = Constants.MOA_PREFIX + ":"; private static final String DATE_TIME_XPATH = MOA + "DateTime"; private static final String EXTENDED_VALIDATION_XPATH = MOA + "ExtendedValidation"; private static final String CMS_SIGNATURE_XPATH = MOA + "CMSSignature"; private static final String PDF_SIGNATURE_XPATH = MOA + "PDFSignature"; private static final String TRUST_PROFILE_ID_XPATH = MOA + "TrustProfileID"; private static final String DATA_OBJECT_XPATH = MOA + "DataObject"; private static final String META_INFO_XPATH = MOA + "MetaInfo"; private static final String CONTENT_XPATH = MOA + "Content"; private static final String BASE64_CONTENT_XPATH = MOA + "Base64Content"; private static final String EXCLUDEBYTERANGE_FROM_XPATH = MOA + "ExcludedByteRange/" + MOA + "From"; private static final String EXCLUDEBYTERANGE_TO_XPATH = MOA + "ExcludedByteRange/" + MOA + "To"; /** The SPSSFactory for creating new API objects. */ private SPSSFactory factory = SPSSFactory.getInstance(); /** * Parse a VerifyCMSSignatureRequest DOM element, as defined * by the MOA schema. * * @param requestElem The VerifyCMSSignatureRequest to parse. The * request must have been successfully parsed against the schema for this * method to succeed. * @return A VerifyCMSSignatureRequest API objects containing * the data from the DOM element. * @throws MOAApplicationException An error occurred parsing the request. */ public VerifyCMSSignatureRequest parsePDF(Element requestElem) throws MOAApplicationException { int[] signatories = parseSignatories(requestElem); Date dateTime = RequestParserUtils.parseDateTime(requestElem, DATE_TIME_XPATH); boolean extendedValidation = RequestParserUtils.parseExtendedValidation(requestElem, EXTENDED_VALIDATION_XPATH, false); String cmsSignatureStr = XPathUtils.getElementValue(requestElem, PDF_SIGNATURE_XPATH, ""); CMSDataObject dataObject = parseDataObject(requestElem); String trustProfileID = XPathUtils.getElementValue(requestElem, TRUST_PROFILE_ID_XPATH, null); //Logger.info("CMSSignature: " + cmsSignatureStr); InputStream cmsSignature = Base64Utils.decodeToStream(cmsSignatureStr, true); return factory.createVerifyCMSSignatureRequest( signatories, dateTime, cmsSignature, dataObject, trustProfileID, true, extendedValidation); } /** * Parse a VerifyCMSSignatureRequest DOM element, as defined * by the MOA schema. * * @param requestElem The VerifyCMSSignatureRequest to parse. The * request must have been successfully parsed against the schema for this * method to succeed. * @return A VerifyCMSSignatureRequest API objects containing * the data from the DOM element. * @throws MOAApplicationException An error occurred parsing the request. */ public VerifyCMSSignatureRequest parse(Element requestElem) throws MOAApplicationException { int[] signatories = parseSignatories(requestElem); Date dateTime = RequestParserUtils.parseDateTime(requestElem, DATE_TIME_XPATH); boolean extendedValidation = RequestParserUtils.parseExtendedValidation(requestElem, EXTENDED_VALIDATION_XPATH, false); String cmsSignatureStr = XPathUtils.getElementValue(requestElem, CMS_SIGNATURE_XPATH, ""); CMSDataObject dataObject = parseDataObject(requestElem); String trustProfileID = XPathUtils.getElementValue(requestElem, TRUST_PROFILE_ID_XPATH, null); InputStream cmsSignature = Base64Utils.decodeToStream(cmsSignatureStr, true); return factory.createVerifyCMSSignatureRequest( signatories, dateTime, cmsSignature, dataObject, trustProfileID, false, extendedValidation); } /** * 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(Element requestElem) { String signatoriesStr = requestElem.getAttribute("Signatories"); if ("all".equals(signatoriesStr)) { return VerifyCMSSignatureRequest.ALL_SIGNATORIES; } else { StringTokenizer tokenizer = new StringTokenizer(signatoriesStr); List signatoriesList = new ArrayList(); int[] signatories; // 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; } } /** * Parse a the DataObject DOM element contained in a given * VerifyCMSSignatureRequest DOM element. * * @param requestElem The VerifyCMSSignatureRequest DOM element * to parse. * @return The CMSDataObject API object containing the data * from the DataObject DOM element. */ private CMSDataObject parseDataObject(Element requestElem) { Element dataObjectElem = (Element) XPathUtils.selectSingleNode(requestElem, DATA_OBJECT_XPATH); if (dataObjectElem != null) { Element metaInfoElem = (Element) XPathUtils.selectSingleNode(dataObjectElem, META_INFO_XPATH); MetaInfo metaInfo = null; Element contentElem = (Element) XPathUtils.selectSingleNode(dataObjectElem, CONTENT_XPATH); CMSContent content = parseContent(contentElem); if (metaInfoElem != null) { metaInfo = RequestParserUtils.parseMetaInfo(metaInfoElem); } String excludeByteRangeFromStr = XPathUtils.getElementValue(dataObjectElem, EXCLUDEBYTERANGE_FROM_XPATH, null); String excludeByteRangeToStr = XPathUtils.getElementValue(dataObjectElem, EXCLUDEBYTERANGE_TO_XPATH, null); BigDecimal excludeByteRangeFrom = null; BigDecimal excludeByteRangeTo = null; if (excludeByteRangeFromStr != null) excludeByteRangeFrom = new BigDecimal(excludeByteRangeFromStr); if (excludeByteRangeToStr != null) excludeByteRangeTo = new BigDecimal(excludeByteRangeToStr); return factory.createCMSDataObject(metaInfo, content, excludeByteRangeFrom, excludeByteRangeTo); } else { return null; } } /** * Parse the content contained in a CMSContentBaseType kind of * DOM element. * * @param contentElem The CMSContentBaseType kind of element to * parse. * @return A CMSDataObject API object containing the data * from the given DOM element. */ private CMSContent parseContent(Element contentElem) { Element base64ContentElem = (Element) XPathUtils.selectSingleNode(contentElem, BASE64_CONTENT_XPATH); if (base64ContentElem != null) { String base64Str = DOMUtils.getText(base64ContentElem); InputStream binaryContent = Base64Utils.decodeToStream(base64Str, true); return factory.createCMSContent(binaryContent); } else { return factory.createCMSContent( contentElem.getAttribute("Reference")); } } }