/** * ************************************************************************** * * Contributor(s): * C. Heazel (WiSC): Added Fortify adjudication changes * *************************************************************************** */ package com.occamlab.te.config; import java.io.File; import java.util.ArrayList; import java.util.List; import javax.xml.namespace.QName; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import org.w3c.dom.Document; import org.w3c.dom.Element; import org.w3c.dom.Node; import org.w3c.dom.NodeList; public final class ConfigEntry { public String organization = null; public String standard = null; public String version = null; public String revision = null; public QName suite = null; public String title = null; public String description = null; public String link = null; public String dataLink = null; public List<QName> profiles = new ArrayList<QName>(); public List<String> profileTitles = new ArrayList<String>(); public List<String> profileDescriptions = new ArrayList<String>(); public List<File> sources = new ArrayList<File>(); public File resources; public String webdir; ConfigEntry(File file) throws Exception { readConfigFile(file); } void readConfigFile(File file) throws Exception { // Fortify Mod: prevent external entity injection DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); dbf.setExpandEntityReferences(false); DocumentBuilder db = dbf.newDocumentBuilder(); //DocumentBuilder db = DocumentBuilderFactory.newInstance().newDocumentBuilder(); Document doc = db.parse(file); Element config = doc.getDocumentElement(); Element organizationEl = getElementByTagName(config, "organization"); if (organizationEl != null) { organization = getElementByTagName(organizationEl, "name") .getTextContent(); } Element standardEl = getElementByTagName(config, "standard"); if (standardEl != null) { standard = getElementByTagName(standardEl, "name").getTextContent(); } Element versionEl = getElementByTagName(config, "version"); if (versionEl != null) { version = getElementByTagName(versionEl, "name").getTextContent(); } Element revisionEl = getElementByTagName(config, "revision"); if (revisionEl != null) { revision = getElementByTagName(revisionEl, "name").getTextContent(); } Element suiteEl = getElementByTagName(config, "suite"); if (suiteEl != null) { String localName = getElementByTagName(suiteEl, "local-name") .getTextContent(); String namespaceUri = getElementByTagName(suiteEl, "namespace-uri") .getTextContent(); String prefix = getElementByTagName(suiteEl, "prefix") .getTextContent(); suite = new QName(namespaceUri, localName, prefix); Element titleEl = getElementByTagName(suiteEl, "title"); if (titleEl != null) { title = titleEl.getTextContent(); } Element descriptionEl = getElementByTagName(suiteEl, "description"); if (descriptionEl != null) { description = descriptionEl.getTextContent(); } NodeList linkNodes = suiteEl.getElementsByTagName("link"); for (int i = 0; i < linkNodes.getLength(); i++) { Element linkEl = (Element) linkNodes.item(i); String value = linkEl.getTextContent(); if ("data".equals(linkEl.getAttribute("linkType"))) { dataLink = file.getParentFile().getName() + "/" + value; } else if (value.startsWith("data/")) { dataLink = file.getParentFile().getName() + "/" + value; } else { link = value; } } } NodeList profileNodes = config.getElementsByTagName("profile"); for (int i = 0; i < profileNodes.getLength(); i++) { Element profileEl = (Element) profileNodes.item(i); String localName = getElementByTagName(profileEl, "local-name") .getTextContent(); String namespaceUri = getElementByTagName(profileEl, "namespace-uri").getTextContent(); String prefix = getElementByTagName(profileEl, "prefix") .getTextContent(); profiles.add(new QName(namespaceUri, localName, prefix)); Element titleEl = getElementByTagName(profileEl, "title"); profileTitles.add(titleEl == null ? "" : titleEl.getTextContent()); Element descriptionEl = getElementByTagName(profileEl, "description"); profileDescriptions.add(descriptionEl == null ? "" : descriptionEl .getTextContent()); } NodeList sourceNodes = config.getElementsByTagName("source"); for (int i = 0; i < sourceNodes.getLength(); i++) { Element sourceEl = (Element) sourceNodes.item(i); sources.add(new File(file.getParentFile(), sourceEl .getTextContent())); } Element resourcesEl = getElementByTagName(config, "resources"); if (resourcesEl != null) { resources = new File(file.getParentFile(), resourcesEl.getTextContent()); } webdir = file.getParentFile().getName(); Element webEl = getElementByTagName(config, "web"); if (webEl != null) { String dirname = webEl.getAttribute("dirname"); if (dirname.length() > 0) { webdir = dirname; } } } void add(ConfigEntry config) { profiles.addAll(config.profiles); profileTitles.addAll(config.profileTitles); profileDescriptions.addAll(config.profileDescriptions); sources.addAll(config.sources); } Element getElementByTagName(Node node, String tagname) { NodeList nl; if (node.getNodeType() == Node.DOCUMENT_NODE) { nl = ((Document) node).getElementsByTagName(tagname); } else if (node.getNodeType() == Node.ELEMENT_NODE) { nl = ((Element) node).getElementsByTagName(tagname); } else { return null; } if (nl.getLength() >= 0) { return (Element) nl.item(0); } else { return null; } } }