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

coheigea pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/camel.git


The following commit(s) were added to refs/heads/master by this push:
     new 67589ec  Disallow doctypes in a few more places
67589ec is described below

commit 67589ec0aafb643424c8dcd2d1cc448fc50c01fd
Author: Colm O hEigeartaigh <cohei...@apache.org>
AuthorDate: Wed Jul 3 18:20:51 2019 +0100

    Disallow doctypes in a few more places
---
 .../apache/camel/catalog/DefaultCamelCatalog.java  |  1 +
 .../api/LinkedInExceptionResponseFilter.java       | 24 ++++++++++++++++---
 .../internal/client/DefaultBulkApiClient.java      | 27 ++++++++++++++++++----
 3 files changed, 45 insertions(+), 7 deletions(-)

diff --git 
a/catalog/camel-catalog/src/main/java/org/apache/camel/catalog/DefaultCamelCatalog.java
 
b/catalog/camel-catalog/src/main/java/org/apache/camel/catalog/DefaultCamelCatalog.java
index 67f155b..52d68ca 100644
--- 
a/catalog/camel-catalog/src/main/java/org/apache/camel/catalog/DefaultCamelCatalog.java
+++ 
b/catalog/camel-catalog/src/main/java/org/apache/camel/catalog/DefaultCamelCatalog.java
@@ -1384,6 +1384,7 @@ public class DefaultCamelCatalog extends 
AbstractCamelCatalog implements CamelCa
 
                 DocumentBuilderFactory dbf = 
DocumentBuilderFactory.newInstance();
                 dbf.setFeature(XMLConstants.FEATURE_SECURE_PROCESSING, 
Boolean.TRUE);
+                
dbf.setFeature("http://apache.org/xml/features/disallow-doctype-decl";, 
Boolean.TRUE);
                 Document dom = dbf.newDocumentBuilder().parse(new 
ByteArrayInputStream(xml.getBytes()));
                 Object val = 
XPathFactory.newInstance().newXPath().evaluate("count(/archetype-catalog/archetypes/archetype)",
 dom, XPathConstants.NUMBER);
                 double num = (double) val;
diff --git 
a/components/camel-linkedin/camel-linkedin-api/src/main/java/org/apache/camel/component/linkedin/api/LinkedInExceptionResponseFilter.java
 
b/components/camel-linkedin/camel-linkedin-api/src/main/java/org/apache/camel/component/linkedin/api/LinkedInExceptionResponseFilter.java
index 5e22d8f..49cc116 100644
--- 
a/components/camel-linkedin/camel-linkedin-api/src/main/java/org/apache/camel/component/linkedin/api/LinkedInExceptionResponseFilter.java
+++ 
b/components/camel-linkedin/camel-linkedin-api/src/main/java/org/apache/camel/component/linkedin/api/LinkedInExceptionResponseFilter.java
@@ -30,7 +30,12 @@ import javax.ws.rs.ext.Provider;
 import javax.xml.bind.JAXBContext;
 import javax.xml.bind.JAXBException;
 import javax.xml.bind.Unmarshaller;
-
+import javax.xml.parsers.ParserConfigurationException;
+import javax.xml.parsers.SAXParserFactory;
+import javax.xml.transform.Source;
+import javax.xml.transform.sax.SAXSource;
+import org.xml.sax.InputSource;
+import org.xml.sax.SAXException;
 import org.apache.camel.component.linkedin.api.model.Error;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -59,7 +64,20 @@ public class LinkedInExceptionResponseFilter implements 
ClientResponseFilter {
         if (responseContext.getStatus() != Response.Status.OK.getStatusCode() 
&& responseContext.hasEntity()) {
             try {
                 final Unmarshaller unmarshaller = 
jaxbContext.createUnmarshaller();
-                final Error error = (Error) 
unmarshaller.unmarshal(responseContext.getEntityStream());
+
+                // Disable XXE
+                SAXParserFactory spf = SAXParserFactory.newInstance();
+                try {
+                    
spf.setFeature(javax.xml.XMLConstants.FEATURE_SECURE_PROCESSING, Boolean.TRUE);
+                    
spf.setFeature("http://xml.org/sax/features/external-general-entities";, false);
+                    
spf.setFeature("http://xml.org/sax/features/external-parameter-entities";, 
false);
+                    
spf.setFeature("http://apache.org/xml/features/nonvalidating/load-external-dtd";,
 false);
+                } catch (ParserConfigurationException | SAXException ex) {
+                    LOG.debug("Error setting feature on parser: " + 
ex.getMessage());
+                }
+                Source xmlSource =
+                    new SAXSource(spf.newSAXParser().getXMLReader(), new 
InputSource(responseContext.getEntityStream()));
+                final Error error = (Error) unmarshaller.unmarshal(xmlSource);
 
                 final Response.ResponseBuilder builder = 
Response.status(responseContext.getStatusInfo());
                 builder.entity(error);
@@ -69,7 +87,7 @@ public class LinkedInExceptionResponseFilter implements 
ClientResponseFilter {
                 }
 
                 throw new LinkedInException(error, builder.build());
-            } catch (JAXBException e) {
+            } catch (JAXBException | ParserConfigurationException | 
SAXException e) {
                 // log and ignore
                 LOG.warn("Unable to parse LinkedIn error: {}", e.getMessage(), 
e);
             }
diff --git 
a/components/camel-salesforce/camel-salesforce-component/src/main/java/org/apache/camel/component/salesforce/internal/client/DefaultBulkApiClient.java
 
b/components/camel-salesforce/camel-salesforce-component/src/main/java/org/apache/camel/component/salesforce/internal/client/DefaultBulkApiClient.java
index 55bdb05..da64180 100644
--- 
a/components/camel-salesforce/camel-salesforce-component/src/main/java/org/apache/camel/component/salesforce/internal/client/DefaultBulkApiClient.java
+++ 
b/components/camel-salesforce/camel-salesforce-component/src/main/java/org/apache/camel/component/salesforce/internal/client/DefaultBulkApiClient.java
@@ -29,7 +29,10 @@ import javax.xml.bind.JAXBElement;
 import javax.xml.bind.JAXBException;
 import javax.xml.bind.Marshaller;
 import javax.xml.bind.Unmarshaller;
-import javax.xml.transform.stream.StreamSource;
+import javax.xml.parsers.ParserConfigurationException;
+import javax.xml.parsers.SAXParserFactory;
+import javax.xml.transform.Source;
+import javax.xml.transform.sax.SAXSource;
 
 import org.apache.camel.component.salesforce.SalesforceHttpClient;
 import org.apache.camel.component.salesforce.api.SalesforceException;
@@ -50,6 +53,8 @@ import 
org.eclipse.jetty.client.util.InputStreamContentProvider;
 import org.eclipse.jetty.http.HttpHeader;
 import org.eclipse.jetty.http.HttpMethod;
 import org.eclipse.jetty.util.StringUtil;
+import org.xml.sax.InputSource;
+import org.xml.sax.SAXException;
 
 public class DefaultBulkApiClient extends AbstractClientBase implements 
BulkApiClient {
 
@@ -201,7 +206,7 @@ public class DefaultBulkApiClient extends 
AbstractClientBase implements BulkApiC
     }
 
     @Override
-    public void createBatch(InputStream batchStream, String jobId, ContentType 
contentTypeEnum, 
+    public void createBatch(InputStream batchStream, String jobId, ContentType 
contentTypeEnum,
         Map<String, List<String>> headers, final BatchInfoResponseCallback 
callback) {
         final Request post = getRequest(HttpMethod.POST, batchUrl(jobId, 
null), headers);
         post.content(new InputStreamContentProvider(batchStream));
@@ -419,9 +424,23 @@ public class DefaultBulkApiClient extends 
AbstractClientBase implements BulkApiC
         throws SalesforceException {
         try {
             Unmarshaller unmarshaller = context.createUnmarshaller();
-            JAXBElement<T> result = unmarshaller.unmarshal(new 
StreamSource(response), resultClass);
+
+            // Disable XXE
+            SAXParserFactory spf = SAXParserFactory.newInstance();
+            try {
+                
spf.setFeature(javax.xml.XMLConstants.FEATURE_SECURE_PROCESSING, Boolean.TRUE);
+                
spf.setFeature("http://xml.org/sax/features/external-general-entities";, false);
+                
spf.setFeature("http://xml.org/sax/features/external-parameter-entities";, 
false);
+                
spf.setFeature("http://apache.org/xml/features/nonvalidating/load-external-dtd";,
 false);
+            } catch (ParserConfigurationException | SAXException ex) {
+                // LOG.debug("Error setting feature on parser: " + 
ex.getMessage());
+            }
+            Source xmlSource =
+                new SAXSource(spf.newSAXParser().getXMLReader(), new 
InputSource(response));
+
+            JAXBElement<T> result = unmarshaller.unmarshal(xmlSource, 
resultClass);
             return result.getValue();
-        } catch (JAXBException e) {
+        } catch (JAXBException | SAXException | ParserConfigurationException 
e) {
             throw new SalesforceException(
                     String.format("Error unmarshaling response {%s:%s} : %s",
                             request.getMethod(), request.getURI(), 
e.getMessage()),

Reply via email to