diff --git a/iped-app/resources/config/profiles/forensic/conf/ParserConfig.xml b/iped-app/resources/config/profiles/forensic/conf/ParserConfig.xml
new file mode 100644
index 0000000000..584a4cbc23
--- /dev/null
+++ b/iped-app/resources/config/profiles/forensic/conf/ParserConfig.xml
@@ -0,0 +1,14 @@
+
+
+
+
+
+
+
+
+ true
+
+
+
+
+
\ No newline at end of file
diff --git a/iped-app/resources/config/profiles/pedo/conf/ParserConfig.xml b/iped-app/resources/config/profiles/pedo/conf/ParserConfig.xml
new file mode 100644
index 0000000000..584a4cbc23
--- /dev/null
+++ b/iped-app/resources/config/profiles/pedo/conf/ParserConfig.xml
@@ -0,0 +1,14 @@
+
+
+
+
+
+
+
+
+ true
+
+
+
+
+
\ No newline at end of file
diff --git a/iped-engine/src/main/java/iped/engine/config/ParsersConfig.java b/iped-engine/src/main/java/iped/engine/config/ParsersConfig.java
index b3f14e8ebf..7c5b34b333 100644
--- a/iped-engine/src/main/java/iped/engine/config/ParsersConfig.java
+++ b/iped-engine/src/main/java/iped/engine/config/ParsersConfig.java
@@ -2,11 +2,34 @@
import java.io.File;
import java.io.IOException;
+import java.io.StringReader;
+import java.io.StringWriter;
import java.nio.charset.StandardCharsets;
import java.nio.file.DirectoryStream.Filter;
import java.nio.file.Files;
import java.nio.file.Path;
+import javax.xml.parsers.DocumentBuilder;
+import javax.xml.parsers.DocumentBuilderFactory;
+import javax.xml.parsers.ParserConfigurationException;
+import javax.xml.transform.OutputKeys;
+import javax.xml.transform.Transformer;
+import javax.xml.transform.TransformerException;
+import javax.xml.transform.TransformerFactory;
+import javax.xml.transform.dom.DOMSource;
+import javax.xml.transform.stream.StreamResult;
+import javax.xml.xpath.XPath;
+import javax.xml.xpath.XPathConstants;
+import javax.xml.xpath.XPathExpressionException;
+import javax.xml.xpath.XPathFactory;
+
+import org.w3c.dom.Document;
+import org.w3c.dom.Element;
+import org.w3c.dom.Node;
+import org.w3c.dom.NodeList;
+import org.xml.sax.InputSource;
+import org.xml.sax.SAXException;
+
import iped.configuration.Configurable;
public class ParsersConfig implements Configurable {
@@ -18,6 +41,8 @@ public class ParsersConfig implements Configurable {
private static final String PARSER_CONFIG = "ParserConfig.xml"; //$NON-NLS-1$
+ public static final String PARSER_DISABLED_ATTR = "iped:disabled";
+
private String parserConfigXml;
private transient Path tmp;
@@ -33,7 +58,53 @@ public boolean accept(Path entry) throws IOException {
@Override
public void processConfig(Path resource) throws IOException {
- parserConfigXml = new String(Files.readAllBytes(resource), StandardCharsets.UTF_8);
+ if (parserConfigXml == null) {
+ parserConfigXml = new String(Files.readAllBytes(resource), StandardCharsets.UTF_8);
+ parserConfigXml = parserConfigXml.trim().replaceFirst("^([\\W]+)<", "<");
+ } else {
+ DocumentBuilderFactory dbf = DocumentBuilderFactory.newDefaultInstance();
+ dbf.setNamespaceAware(false);
+ DocumentBuilder db;
+ try {
+ db = dbf.newDocumentBuilder();
+ Document doc = db.parse(new InputSource(new StringReader(parserConfigXml)));
+ Document changedDoc = db.parse(resource.toFile());
+
+ Element root = changedDoc.getDocumentElement();
+ NodeList rootNl = root.getElementsByTagName("parsers").item(0).getChildNodes();
+ for (int i = 0; i < rootNl.getLength(); i++) {
+ Node child = rootNl.item(i);
+ if (child instanceof Element) {
+ Element element = (Element) child;
+ if (element.getTagName().equals("parser")) {
+ String className = element.getAttribute("class");
+ XPath xPath = XPathFactory.newInstance().newXPath();
+ String expression = "/properties/parsers/parser[@class='" + className + "']";
+ NodeList nlParser = (NodeList) xPath.compile(expression).evaluate(doc, XPathConstants.NODESET);
+
+ expression = "/properties/parsers";
+ NodeList nlParsers = (NodeList) xPath.compile(expression).evaluate(doc, XPathConstants.NODESET);
+ Node newnode = doc.importNode(element, true);
+ for (int j = 0; j < nlParsers.getLength(); j++) {
+ for (int k = 0; k < nlParser.getLength(); k++) {
+ nlParsers.item(j).removeChild(nlParser.item(k));
+ }
+ nlParsers.item(j).appendChild(newnode);
+ }
+ }
+ }
+ }
+
+ TransformerFactory tf = TransformerFactory.newInstance();
+ Transformer transformer = tf.newTransformer();
+ transformer.setOutputProperty(OutputKeys.OMIT_XML_DECLARATION, "yes");
+ StringWriter writer = new StringWriter();
+ transformer.transform(new DOMSource(doc), new StreamResult(writer));
+ parserConfigXml = writer.getBuffer().toString();
+ } catch (ParserConfigurationException | SAXException | XPathExpressionException | TransformerException e) {
+ throw new RuntimeException(e);
+ }
+ }
}
@Override
@@ -46,11 +117,34 @@ public void setConfiguration(String config) {
parserConfigXml = config;
}
+ public String removeDisabledParsers(String parserConfigXml) {
+ String[] slices = parserConfigXml.split(PARSER_DISABLED_ATTR + "=\"true\"");
+ StringBuffer result = new StringBuffer();
+ for (int i = 0; i < slices.length; i++) {
+ String part = slices[i];
+ if (i > 0) {
+ int disabledParserEndIndex = part.indexOf(">");
+ if (disabledParserEndIndex == 0 || part.charAt(disabledParserEndIndex - 1) != '/') {
+ disabledParserEndIndex = part.indexOf("");
+ }
+ part = part.substring(disabledParserEndIndex + 1);
+ }
+ if (i < slices.length - 1) {
+ int disabledParserIndex = part.lastIndexOf("