reportbuilder/java/org/libreoffice/report/pentaho/output/OfficeDocumentReportTarget.java
| 1
scripting/java/com/sun/star/script/framework/container/XMLParserFactory.java
| 25 ++++++-
xmerge/source/xmerge/java/org/openoffice/xmerge/converter/dom/DOMDocument.java
| 30 ++++++++
xmerge/source/xmerge/java/org/openoffice/xmerge/converter/xml/EmbeddedXMLObject.java
| 4 -
xmerge/source/xmerge/java/org/openoffice/xmerge/converter/xml/OfficeDocument.java
| 32 ++++++++-
xmerge/source/xmerge/java/org/openoffice/xmerge/converter/xml/xslt/DocumentDeserializerImpl.java
| 32 ++++++++-
xmerge/source/xmerge/java/org/openoffice/xmerge/converter/xml/xslt/DocumentSerializerImpl.java
| 35 +++++++++-
xmerge/source/xmerge/java/org/openoffice/xmerge/util/registry/ConverterInfoReader.java
| 30 ++++++++
8 files changed, 175 insertions(+), 14 deletions(-)
New commits:
commit b5e2dc736700b5b626006e16a9726e9be391f34d
Author: Caolán McNamara <[email protected]>
AuthorDate: Sun Aug 4 14:57:37 2024 +0100
Commit: Caolán McNamara <[email protected]>
CommitDate: Sun Aug 4 20:05:02 2024 +0200
cid#1608462 XML external entity processing enabled
and
cid#1608334 XML external entity processing enabled
cid#1608302 XML external entity processing enabled
cid#1608234 XML external entity processing enabled
cid#1608094 XML external entity processing enabled
cid#1607973 XML external entity processing enabled
cid#1607890 XML external entity processing enabled
cid#1607706 XML external entity processing enabled
cid#1607366 XML external entity processing enabled
cid#1607026 XML external entity processing enabled
cid#1606764 XML external entity processing enabled
Change-Id: I7894d335f244ed3ddbbe43d9bdbc2818065830f3
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/171461
Tested-by: Jenkins
Reviewed-by: Caolán McNamara <[email protected]>
diff --git
a/reportbuilder/java/org/libreoffice/report/pentaho/output/OfficeDocumentReportTarget.java
b/reportbuilder/java/org/libreoffice/report/pentaho/output/OfficeDocumentReportTarget.java
index b73b5781b3a3..7d69f3b5887c 100644
---
a/reportbuilder/java/org/libreoffice/report/pentaho/output/OfficeDocumentReportTarget.java
+++
b/reportbuilder/java/org/libreoffice/report/pentaho/output/OfficeDocumentReportTarget.java
@@ -1020,6 +1020,7 @@ public abstract class OfficeDocumentReportTarget extends
AbstractReportTarget
{
inputStream =
getInputRepository().createInputStream("meta.xml");
DocumentBuilderFactory dbFactory =
DocumentBuilderFactory.newInstance();
+
dbFactory.setFeature("http://apache.org/xml/features/disallow-doctype-decl",
true);
DocumentBuilder dBuilder = dbFactory.newDocumentBuilder();
Document document = dBuilder.parse(new
InputSource(inputStream));
diff --git
a/scripting/java/com/sun/star/script/framework/container/XMLParserFactory.java
b/scripting/java/com/sun/star/script/framework/container/XMLParserFactory.java
index 02c9e6c34244..dec4fc440415 100644
---
a/scripting/java/com/sun/star/script/framework/container/XMLParserFactory.java
+++
b/scripting/java/com/sun/star/script/framework/container/XMLParserFactory.java
@@ -18,6 +18,8 @@
package com.sun.star.script.framework.container;
+import com.sun.star.script.framework.log.LogUtils;
+
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
@@ -29,6 +31,7 @@ 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.XMLConstants;
import org.w3c.dom.Document;
@@ -60,6 +63,26 @@ public class XMLParserFactory {
public DefaultParser() {
factory = DocumentBuilderFactory.newInstance();
+
+ String[] featuresToDisable = {
+ "http://xml.org/sax/features/external-general-entities",
+ "http://xml.org/sax/features/external-parameter-entities",
+
"http://apache.org/xml/features/nonvalidating/load-external-dtd"
+ };
+
+ for (String feature : featuresToDisable) {
+ try {
+ factory.setFeature(feature, false);
+ } catch (ParserConfigurationException e) {
+ LogUtils.DEBUG(LogUtils.getTrace(e));
+ }
+ }
+
+ try {
+ factory.setFeature(XMLConstants.FEATURE_SECURE_PROCESSING,
true);
+ } catch (ParserConfigurationException e) {
+ LogUtils.DEBUG(LogUtils.getTrace(e));
+ }
}
public Document parse(InputStream inputStream) throws IOException {
@@ -103,4 +126,4 @@ public class XMLParserFactory {
}
}
}
-}
\ No newline at end of file
+}
diff --git
a/xmerge/source/xmerge/java/org/openoffice/xmerge/converter/dom/DOMDocument.java
b/xmerge/source/xmerge/java/org/openoffice/xmerge/converter/dom/DOMDocument.java
index fc21398383c6..5877b99d3de9 100644
---
a/xmerge/source/xmerge/java/org/openoffice/xmerge/converter/dom/DOMDocument.java
+++
b/xmerge/source/xmerge/java/org/openoffice/xmerge/converter/dom/DOMDocument.java
@@ -31,6 +31,7 @@ import javax.xml.transform.TransformerFactory;
import javax.xml.transform.Transformer;
import javax.xml.transform.stream.StreamResult;
import javax.xml.transform.dom.DOMSource;
+import javax.xml.XMLConstants;
import org.w3c.dom.Node;
import org.w3c.dom.Document;
@@ -43,9 +44,34 @@ import org.openoffice.xmerge.util.Debug;
public class DOMDocument
implements org.openoffice.xmerge.Document {
+ private static DocumentBuilderFactory makeFactory() {
+ DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
+
+ String[] featuresToDisable = {
+ "http://xml.org/sax/features/external-general-entities",
+ "http://xml.org/sax/features/external-parameter-entities",
+ "http://apache.org/xml/features/nonvalidating/load-external-dtd"
+ };
+
+ for (String feature : featuresToDisable) {
+ try {
+ factory.setFeature(feature, false);
+ } catch (ParserConfigurationException e) {
+ Debug.log(Debug.ERROR, "Exception when calling setFeature: ",
e);
+ }
+ }
+
+ try {
+ factory.setFeature(XMLConstants.FEATURE_SECURE_PROCESSING, true);
+ } catch (ParserConfigurationException e) {
+ Debug.log(Debug.ERROR, "Exception when calling setFeature: ", e);
+ }
+
+ return factory;
+ }
+
/** Factory for {@code DocumentBuilder} objects. */
- private static DocumentBuilderFactory factory =
- DocumentBuilderFactory.newInstance();
+ private static DocumentBuilderFactory factory = makeFactory();
/** DOM {@code Document} of content.xml. */
private Document contentDoc = null;
diff --git
a/xmerge/source/xmerge/java/org/openoffice/xmerge/converter/xml/EmbeddedXMLObject.java
b/xmerge/source/xmerge/java/org/openoffice/xmerge/converter/xml/EmbeddedXMLObject.java
index b081d6fa13aa..8f8ac1bf7cf7 100644
---
a/xmerge/source/xmerge/java/org/openoffice/xmerge/converter/xml/EmbeddedXMLObject.java
+++
b/xmerge/source/xmerge/java/org/openoffice/xmerge/converter/xml/EmbeddedXMLObject.java
@@ -193,7 +193,7 @@ public class EmbeddedXMLObject extends EmbeddedObject {
try {
if (builder == null) {
DocumentBuilderFactory factory =
DocumentBuilderFactory.newInstance();
-
+
factory.setFeature("http://apache.org/xml/features/disallow-doctype-decl",
true);
factory.setValidating(false);
builder = factory.newDocumentBuilder();
}
@@ -277,4 +277,4 @@ public class EmbeddedXMLObject extends EmbeddedObject {
root.appendChild(objectNode);
}
-}
\ No newline at end of file
+}
diff --git
a/xmerge/source/xmerge/java/org/openoffice/xmerge/converter/xml/OfficeDocument.java
b/xmerge/source/xmerge/java/org/openoffice/xmerge/converter/xml/OfficeDocument.java
index 7fb3efe2b853..49695e173da3 100644
---
a/xmerge/source/xmerge/java/org/openoffice/xmerge/converter/xml/OfficeDocument.java
+++
b/xmerge/source/xmerge/java/org/openoffice/xmerge/converter/xml/OfficeDocument.java
@@ -35,6 +35,7 @@ import java.util.HashMap;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.ParserConfigurationException;
+import javax.xml.XMLConstants;
import org.w3c.dom.Node;
import org.w3c.dom.Element;
@@ -58,9 +59,34 @@ import org.openoffice.xmerge.util.Debug;
public abstract class OfficeDocument
implements org.openoffice.xmerge.Document, OfficeConstants {
+ private static DocumentBuilderFactory makeFactory() {
+ DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
+
+ String[] featuresToDisable = {
+ "http://xml.org/sax/features/external-general-entities",
+ "http://xml.org/sax/features/external-parameter-entities",
+ "http://apache.org/xml/features/nonvalidating/load-external-dtd"
+ };
+
+ for (String feature : featuresToDisable) {
+ try {
+ factory.setFeature(feature, false);
+ } catch (ParserConfigurationException e) {
+ Debug.log(Debug.ERROR, "Exception when calling setFeature: ",
e);
+ }
+ }
+
+ try {
+ factory.setFeature(XMLConstants.FEATURE_SECURE_PROCESSING, true);
+ } catch (ParserConfigurationException e) {
+ Debug.log(Debug.ERROR, "Exception when calling setFeature: ", e);
+ }
+
+ return factory;
+ }
+
/** Factory for {@code DocumentBuilder} objects. */
- private static DocumentBuilderFactory factory =
- DocumentBuilderFactory.newInstance();
+ private static DocumentBuilderFactory factory = makeFactory();
/** DOM {@code Document} of content.xml. */
private Document contentDoc = null;
@@ -642,7 +668,7 @@ public abstract class OfficeDocument
write(os);
} else {
try {
- DocumentBuilderFactory builderFactory =
DocumentBuilderFactory.newInstance();
+ DocumentBuilderFactory builderFactory = makeFactory();
DocumentBuilder builder= builderFactory.newDocumentBuilder();
DOMImplementation domImpl = builder.getDOMImplementation();
domImpl.createDocumentType("office:document","-//OpenOffice.org//DTD
OfficeDocument 1.0//EN",null);
diff --git
a/xmerge/source/xmerge/java/org/openoffice/xmerge/converter/xml/xslt/DocumentDeserializerImpl.java
b/xmerge/source/xmerge/java/org/openoffice/xmerge/converter/xml/xslt/DocumentDeserializerImpl.java
index c8eb43fdfd8b..d88d1f35c10b 100644
---
a/xmerge/source/xmerge/java/org/openoffice/xmerge/converter/xml/xslt/DocumentDeserializerImpl.java
+++
b/xmerge/source/xmerge/java/org/openoffice/xmerge/converter/xml/xslt/DocumentDeserializerImpl.java
@@ -25,6 +25,7 @@ import java.util.Iterator;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
+import javax.xml.parsers.ParserConfigurationException;
import javax.xml.transform.Source;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerException;
@@ -33,6 +34,7 @@ import javax.xml.transform.URIResolver;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;
import javax.xml.transform.stream.StreamSource;
+import javax.xml.XMLConstants;
import org.openoffice.xmerge.ConvertData;
import org.openoffice.xmerge.ConvertException;
@@ -57,6 +59,32 @@ public final class DocumentDeserializerImpl
private final ConvertData cd;
private final PluginFactoryImpl pluginFactory;
+ private static DocumentBuilderFactory makeFactory() {
+ DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
+
+ String[] featuresToDisable = {
+ "http://xml.org/sax/features/external-general-entities",
+ "http://xml.org/sax/features/external-parameter-entities",
+ "http://apache.org/xml/features/nonvalidating/load-external-dtd"
+ };
+
+ for (String feature : featuresToDisable) {
+ try {
+ factory.setFeature(feature, false);
+ } catch (ParserConfigurationException e) {
+ Debug.log(Debug.ERROR, "Exception when calling setFeature: ",
e);
+ }
+ }
+
+ try {
+ factory.setFeature(XMLConstants.FEATURE_SECURE_PROCESSING, true);
+ } catch (ParserConfigurationException e) {
+ Debug.log(Debug.ERROR, "Exception when calling setFeature: ", e);
+ }
+
+ return factory;
+ }
+
/**
* Constructor that assigns the given {@code ConvertData} to this object.
*
@@ -93,7 +121,7 @@ public final class DocumentDeserializerImpl
domDoc = docOut.getContentDOM();
baos = transform(domDoc);
sxwDoc.initContentDOM();
- DocumentBuilderFactory dFactory =
DocumentBuilderFactory.newInstance();
+ DocumentBuilderFactory dFactory = makeFactory();
dFactory.setNamespaceAware(true);
DocumentBuilder dBuilder = dFactory.newDocumentBuilder();
sxwDoc.setContentDOM(dBuilder.parse(new
ByteArrayInputStream(baos.toByteArray())));
@@ -135,7 +163,7 @@ public final class DocumentDeserializerImpl
ConverterInfo ci = pluginFactory.getConverterInfo();
ByteArrayOutputStream baos= new ByteArrayOutputStream();
try{
- DocumentBuilderFactory dFactory =
DocumentBuilderFactory.newInstance();
+ DocumentBuilderFactory dFactory = makeFactory();
dFactory.setNamespaceAware(true);
DocumentBuilder dBuilder = dFactory.newDocumentBuilder();
diff --git
a/xmerge/source/xmerge/java/org/openoffice/xmerge/converter/xml/xslt/DocumentSerializerImpl.java
b/xmerge/source/xmerge/java/org/openoffice/xmerge/converter/xml/xslt/DocumentSerializerImpl.java
index 0d1e8d7ba4d8..4d7e42b655fa 100644
---
a/xmerge/source/xmerge/java/org/openoffice/xmerge/converter/xml/xslt/DocumentSerializerImpl.java
+++
b/xmerge/source/xmerge/java/org/openoffice/xmerge/converter/xml/xslt/DocumentSerializerImpl.java
@@ -32,6 +32,7 @@ import org.openoffice.xmerge.ConvertData;
import org.openoffice.xmerge.ConvertException;
import org.openoffice.xmerge.DocumentSerializer;
import org.openoffice.xmerge.converter.dom.DOMDocument;
+import org.openoffice.xmerge.util.Debug;
import org.openoffice.xmerge.util.registry.ConverterInfo;
import org.openoffice.xmerge.converter.xml.OfficeConstants;
@@ -47,6 +48,9 @@ import javax.xml.transform.Source;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
+import javax.xml.parsers.ParserConfigurationException;
+
+import javax.xml.XMLConstants;
/**
* Xslt implementation of {@code org.openoffice.xmerge.DocumentSerializer}
@@ -65,6 +69,32 @@ public final class DocumentSerializerImpl
private final PluginFactoryImpl pluginFactory;
+ private static DocumentBuilderFactory makeFactory() {
+ DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
+
+ String[] featuresToDisable = {
+ "http://xml.org/sax/features/external-general-entities",
+ "http://xml.org/sax/features/external-parameter-entities",
+ "http://apache.org/xml/features/nonvalidating/load-external-dtd"
+ };
+
+ for (String feature : featuresToDisable) {
+ try {
+ factory.setFeature(feature, false);
+ } catch (ParserConfigurationException e) {
+ Debug.log(Debug.ERROR, "Exception when calling setFeature: ",
e);
+ }
+ }
+
+ try {
+ factory.setFeature(XMLConstants.FEATURE_SECURE_PROCESSING, true);
+ } catch (ParserConfigurationException e) {
+ Debug.log(Debug.ERROR, "Exception when calling setFeature: ", e);
+ }
+
+ return factory;
+ }
+
/**
* Constructor.
*
@@ -97,8 +127,7 @@ public final class DocumentSerializerImpl
Node offnode = domDoc.getDocumentElement();
if (!(offnode.getNodeName()).equals("office:document")) {
try {
- DocumentBuilderFactory builderFactory = DocumentBuilderFactory
- .newInstance();
+ DocumentBuilderFactory builderFactory = makeFactory();
DocumentBuilder builder = builderFactory.newDocumentBuilder();
DOMImplementation domImpl = builder.getDOMImplementation();
DocumentType docType = domImpl.createDocumentType(
@@ -231,7 +260,7 @@ public final class DocumentSerializerImpl
ByteArrayOutputStream baos = new ByteArrayOutputStream();
try {
- DocumentBuilderFactory dFactory =
DocumentBuilderFactory.newInstance();
+ DocumentBuilderFactory dFactory = makeFactory();
dFactory.setNamespaceAware(true);
DocumentBuilder dBuilder = dFactory.newDocumentBuilder();
diff --git
a/xmerge/source/xmerge/java/org/openoffice/xmerge/util/registry/ConverterInfoReader.java
b/xmerge/source/xmerge/java/org/openoffice/xmerge/util/registry/ConverterInfoReader.java
index 21831a69173f..baf71820bd51 100644
---
a/xmerge/source/xmerge/java/org/openoffice/xmerge/util/registry/ConverterInfoReader.java
+++
b/xmerge/source/xmerge/java/org/openoffice/xmerge/util/registry/ConverterInfoReader.java
@@ -21,9 +21,11 @@ package org.openoffice.xmerge.util.registry;
import java.io.*;
import java.util.*;
import java.util.jar.*;
+import org.openoffice.xmerge.util.Debug;
import org.xml.sax.*;
import org.w3c.dom.*;
import javax.xml.parsers.*;
+import javax.xml.XMLConstants;
import java.net.URL;
import java.net.JarURLConnection;
@@ -49,6 +51,32 @@ public class ConverterInfoReader {
private final Document document;
private final ArrayList<ConverterInfo> converterInfoList;
+ private static DocumentBuilderFactory makeFactory() {
+ DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
+
+ String[] featuresToDisable = {
+ "http://xml.org/sax/features/external-general-entities",
+ "http://xml.org/sax/features/external-parameter-entities",
+ "http://apache.org/xml/features/nonvalidating/load-external-dtd"
+ };
+
+ for (String feature : featuresToDisable) {
+ try {
+ factory.setFeature(feature, false);
+ } catch (ParserConfigurationException e) {
+ Debug.log(Debug.ERROR, "Exception when calling setFeature: ",
e);
+ }
+ }
+
+ try {
+ factory.setFeature(XMLConstants.FEATURE_SECURE_PROCESSING, true);
+ } catch (ParserConfigurationException e) {
+ Debug.log(Debug.ERROR, "Exception when calling setFeature: ", e);
+ }
+
+ return factory;
+ }
+
/**
* Constructor.
*
@@ -92,7 +120,7 @@ public class ConverterInfoReader {
// Get the DOM builder and build the document.
- DocumentBuilderFactory builderFactory =
DocumentBuilderFactory.newInstance();
+ DocumentBuilderFactory builderFactory = makeFactory();
//DTD validation