This is an automated email from the ASF dual-hosted git repository.

ashishvijaywargiya pushed a commit to branch trunk
in repository https://gitbox.apache.org/repos/asf/ofbiz-framework.git


The following commit(s) were added to refs/heads/trunk by this push:
     new 3160607a42 Improved: Build an explicit DocumentBuilder for XML-typed 
content rendering in ContentWorker (#1731)
3160607a42 is described below

commit 3160607a42d835a813061866a32316bbbb1897b0
Author: Krishna Uprit <[email protected]>
AuthorDate: Tue Aug 25 17:22:35 2026 +0530

    Improved: Build an explicit DocumentBuilder for XML-typed content rendering 
in ContentWorker (#1731)
    
    - Parse XML-typed DataResource content in
    ContentWorker.renderContentAsText with a DocumentBuilder that is built
    and configured directly here, instead of relying on FreeMarker's default
    NodeModel.parse setup.
    
    - Hand the resulting Document to NodeModel.wrap.
    
    - Aligns the XML parser configuration used for stored content with the
    explicit parser setup already used elsewhere in the codebase
    (EntitySaxReader, UtilXml).
    
    Thank you Krishna Uprit for the contribution.
    
    Co-authored-by: Krishnauprit18 <[email protected]>
---
 .../ofbiz/content/content/ContentWorker.java       | 22 +++++++++++++++++++++-
 1 file changed, 21 insertions(+), 1 deletion(-)

diff --git 
a/applications/content/src/main/java/org/apache/ofbiz/content/content/ContentWorker.java
 
b/applications/content/src/main/java/org/apache/ofbiz/content/content/ContentWorker.java
index 3309d90528..f7895cb53a 100644
--- 
a/applications/content/src/main/java/org/apache/ofbiz/content/content/ContentWorker.java
+++ 
b/applications/content/src/main/java/org/apache/ofbiz/content/content/ContentWorker.java
@@ -29,6 +29,8 @@ import java.util.List;
 import java.util.Locale;
 import java.util.Map;
 
+import javax.xml.XMLConstants;
+import javax.xml.parsers.DocumentBuilderFactory;
 import javax.xml.parsers.ParserConfigurationException;
 
 import org.apache.ofbiz.base.util.Debug;
@@ -59,6 +61,7 @@ import org.apache.ofbiz.service.GenericServiceException;
 import org.apache.ofbiz.service.LocalDispatcher;
 import org.apache.ofbiz.service.ModelService;
 import org.apache.ofbiz.service.ServiceUtil;
+import org.w3c.dom.Document;
 import org.xml.sax.InputSource;
 import org.xml.sax.SAXException;
 
@@ -317,7 +320,24 @@ public class ContentWorker implements 
org.apache.ofbiz.widget.content.ContentWor
                         if 
("FTL".equals(templateDataResource.getString("dataTemplateTypeId"))) {
                             StringReader sr = new StringReader(textData);
                             try {
-                                NodeModel nodeModel = NodeModel.parse(new 
InputSource(sr));
+                                // NodeModel.parse(InputSource) uses 
FreeMarker's default, unhardened
+                                // DocumentBuilderFactory, which resolves 
external entities/DTDs (XXE, CWE-611).
+                                // Parse with a hardened factory ourselves and 
wrap the resulting DOM instead,
+                                // matching the entity-resolution lockdown 
already used by EntitySaxReader.
+                                // 
namespaceAware/ignoringElementContentWhitespace are kept identical to
+                                // FreeMarker's own NodeModel default factory 
to preserve existing template
+                                // behavior for namespaced or 
whitespace-sensitive XML content.
+                                DocumentBuilderFactory factory = 
DocumentBuilderFactory.newInstance();
+                                factory.setNamespaceAware(true);
+                                
factory.setIgnoringElementContentWhitespace(true);
+                                
factory.setFeature(XMLConstants.FEATURE_SECURE_PROCESSING, true);
+                                
factory.setFeature("http://xml.org/sax/features/external-general-entities";, 
false);
+                                
factory.setFeature("http://xml.org/sax/features/external-parameter-entities";, 
false);
+                                
factory.setFeature("http://apache.org/xml/features/nonvalidating/load-external-dtd";,
 false);
+                                factory.setXIncludeAware(false);
+                                factory.setExpandEntityReferences(false);
+                                Document document = 
factory.newDocumentBuilder().parse(new InputSource(sr));
+                                NodeModel nodeModel = NodeModel.wrap(document);
                                 templateContext.put("doc", nodeModel);
                             } catch (SAXException | 
ParserConfigurationException e) {
                                 throw new GeneralException(e.getMessage());

Reply via email to