Skip to content

Commit

Permalink
#967 : Security: GN vulnerable to XML bombs
Browse files Browse the repository at this point in the history
  • Loading branch information
heikkidoeleman committed Jun 26, 2012
1 parent 712bebb commit 7096569
Show file tree
Hide file tree
Showing 6 changed files with 158 additions and 28 deletions.
2 changes: 1 addition & 1 deletion docs
Submodule docs updated 328 files
2 changes: 1 addition & 1 deletion gast
Submodule gast updated 38 files
+4 −0 .gitignore
+ setup/sample-data/dublin-core.mef
+ setup/sample-data/fgdc.mef
+ setup/sample-data/iso-19115.mef
+ setup/sample-data/iso-19139-basins-in-africa.mef
+ setup/sample-data/iso-19139-physiographic.mef
+ setup/sample-data/locality_polygons_comprehensive.mef
+ setup/sample-data/photographic_session.mef
+0 −44 src/main/java/org/fao/gast/cli/createdb/CreateDB.java
+0 −87 src/main/java/org/fao/gast/cli/sampledata/SampleData.java
+0 −63 src/main/java/org/fao/gast/cli/setup/Setup.java
+0 −115 src/main/java/org/fao/gast/gui/panels/config/dbms/EmbeddedPanel.java
+0 −114 src/main/java/org/fao/gast/gui/panels/config/siteid/MainPanel.java
+0 −124 src/main/java/org/fao/gast/gui/panels/database/sample/MainPanel.java
+0 −166 src/main/java/org/fao/gast/gui/panels/database/sample/Worker.java
+0 −78 src/main/java/org/fao/gast/gui/panels/database/setup/MainPanel.java
+0 −128 src/main/java/org/fao/gast/gui/panels/database/setup/Worker.java
+0 −93 src/main/java/org/fao/gast/gui/panels/manag/conversion/MainPanel.java
+0 −186 src/main/java/org/fao/gast/gui/panels/manag/conversion/Worker.java
+0 −104 src/main/java/org/fao/gast/gui/panels/manag/mdsync/MainPanel.java
+0 −160 src/main/java/org/fao/gast/gui/panels/manag/mefexport/MainPanel.java
+0 −233 src/main/java/org/fao/gast/gui/panels/manag/mefexport/SearchPanel.java
+0 −270 src/main/java/org/fao/gast/gui/panels/manag/mefexport/Worker.java
+0 −139 src/main/java/org/fao/gast/gui/panels/manag/mefimport/MainPanel.java
+0 −169 src/main/java/org/fao/gast/gui/panels/manag/mefimport/Worker.java
+0 −68 src/main/java/org/fao/gast/gui/panels/migration/oldinst/GNSource.java
+0 −190 src/main/java/org/fao/gast/gui/panels/migration/oldinst/MainPanel.java
+0 −137 src/main/java/org/fao/gast/gui/panels/migration/oldinst/OldConfigLib.java
+0 −190 src/main/java/org/fao/gast/gui/panels/migration/oldinst/UserDialog.java
+0 −1,149 src/main/java/org/fao/gast/gui/panels/migration/oldinst/Worker.java
+0 −629 src/main/java/org/fao/gast/lib/DatabaseLib.java
+0 −345 src/main/java/org/fao/gast/lib/MefLib.java
+0 −409 src/main/java/org/fao/gast/lib/MetadataLib.java
+0 −153 src/main/java/org/fao/gast/lib/Resource.java
+0 −87 src/main/java/org/fao/gast/lib/ServiceLib.java
+0 −95 src/main/java/org/fao/gast/lib/SiteLib.java
+0 −114 src/main/resources/org/fao/gast/localization/messages_el.properties
+0 −117 src/main/resources/org/fao/gast/localization/messages_tr.properties
2 changes: 1 addition & 1 deletion installer
176 changes: 153 additions & 23 deletions jeeves/src/main/java/jeeves/utils/Xml.java
Original file line number Diff line number Diff line change
Expand Up @@ -83,6 +83,19 @@ public class Xml
//---
//--------------------------------------------------------------------------

private static SAXBuilder getSAXBuilderWithoutXMLResolver(boolean validate) {
SAXBuilder builder = new SAXBuilder(validate);
builder.setFeature(XMLConstants.FEATURE_SECURE_PROCESSING, true);
return builder;
}

/**
*
* @param file
* @return
* @throws IOException
* @throws JDOMException
*/
public static Element loadFile(String file) throws IOException, JDOMException
{
return loadFile(new File(file));
Expand All @@ -93,7 +106,7 @@ public static Element loadFile(String file) throws IOException, JDOMException

public static Element loadFile(URL url) throws IOException, JDOMException
{
SAXBuilder builder = new SAXBuilder();
SAXBuilder builder = getSAXBuilderWithoutXMLResolver(false);//new SAXBuilder();
Document jdoc = builder.build(url);

return (Element) jdoc.getRootElement().detach();
Expand All @@ -116,7 +129,7 @@ public static Element loadFile(URL url, Element xmlQuery) throws IOException, JD
out.print(getString(xmlQuery));
out.close();

SAXBuilder builder = new SAXBuilder();
SAXBuilder builder = getSAXBuilderWithoutXMLResolver(false);//new SAXBuilder();
Document jdoc = builder.build(connection.getInputStream());

result = (Element)jdoc.getRootElement().detach();
Expand All @@ -133,7 +146,7 @@ public static Element loadFile(URL url, Element xmlQuery) throws IOException, JD

public static Element loadFile(File file) throws IOException, JDOMException
{
SAXBuilder builder = new SAXBuilder();
SAXBuilder builder = getSAXBuilderWithoutXMLResolver(false);//new SAXBuilder();
Document jdoc = builder.build(file);

return (Element) jdoc.getRootElement().detach();
Expand All @@ -145,7 +158,7 @@ public static Element loadFile(File file) throws IOException, JDOMException
public static Element loadString(String data, boolean validate)
throws IOException, JDOMException
{
SAXBuilder builder = new SAXBuilder(validate);
SAXBuilder builder = getSAXBuilderWithoutXMLResolver(validate);//new SAXBuilder(validate);
Document jdoc = builder.build(new StringReader(data));

return (Element) jdoc.getRootElement().detach();
Expand All @@ -156,7 +169,7 @@ public static Element loadString(String data, boolean validate)

public static Element loadStream(InputStream input) throws IOException, JDOMException
{
SAXBuilder builder = new SAXBuilder();
SAXBuilder builder = getSAXBuilderWithoutXMLResolver(false);//new SAXBuilder();
builder.setFeature("http://apache.org/xml/features/validation/schema",false);
builder.setFeature("http://apache.org/xml/features/nonvalidating/load-external-dtd",false);
Document jdoc = builder.build(input);
Expand Down Expand Up @@ -358,17 +371,27 @@ public static String transformFOP(String uploadDir, Element xml, String styleShe
//---
//--------------------------------------------------------------------------

/** Writes an xml element to a stream */

/**
* Writes an xml element to a stream.
*
* @param doc
* @param out
* @throws IOException
*/
public static void writeResponse(Document doc, OutputStream out) throws IOException
{
XMLOutputter outputter = new XMLOutputter(Format.getPrettyFormat());
outputter.output(doc, out);
}

//---------------------------------------------------------------------------
/** Converts an xml element to a string */

/**
* Converts an xml element to a string.
*
* @param data
* @return
*/
public static String getString(Element data)
{
XMLOutputter outputter = new XMLOutputter(Format.getPrettyFormat());
Expand Down Expand Up @@ -398,7 +421,16 @@ private static XPath prepareXPath(Element xml, String xpath, List<Namespace> the
}

//---------------------------------------------------------------------------
/** Retrieves a single XML element given a simple xpath (like "a/b/c") */

/**
* Retrieves a single XML element given a simple xpath (like "a/b/c").
*
* @param xml
* @param xpath
* @param theNSs
* @return
* @throws JDOMException
*/
public static Object selectSingle(Element xml, String xpath, List<Namespace> theNSs) throws JDOMException {

XPath xp = prepareXPath(xml, xpath, theNSs);
Expand All @@ -407,13 +439,30 @@ public static Object selectSingle(Element xml, String xpath, List<Namespace> the
}

//---------------------------------------------------------------------------
/** Retrieves a single XML element as a JDOM element given a simple xpath */

/**
* Retrieves a single XML element as a JDOM element given a simple xpath.
*
* @param xml
* @param xpath
* @return
* @throws JDOMException
*/
public static Element selectElement(Element xml, String xpath) throws JDOMException {
return selectElement(xml, xpath, new ArrayList<Namespace>());
}

//---------------------------------------------------------------------------
/** Retrieves a single XML element as a JDOM element given a simple xpath */

/**
* Retrieves a single XML element as a JDOM element given a simple xpath.
*
* @param xml
* @param xpath
* @param theNSs
* @return
* @throws JDOMException
*/
public static Element selectElement(Element xml, String xpath, List<Namespace> theNSs) throws JDOMException {
Object result = selectSingle(xml, xpath, theNSs);
if (result == null) {
Expand All @@ -428,26 +477,59 @@ public static Element selectElement(Element xml, String xpath, List<Namespace> t
}

//---------------------------------------------------------------------------
/** Evaluates an XPath expression on an element and returns Elements */
public static List selectNodes(Element xml, String xpath, List<Namespace> theNSs) throws JDOMException {

/**
* Evaluates an XPath expression on an element and returns Elements.
*
* @param xml
* @param xpath
* @param theNSs
* @return
* @throws JDOMException
*/
public static List<?> selectNodes(Element xml, String xpath, List<Namespace> theNSs) throws JDOMException {
XPath xp = prepareXPath(xml, xpath, theNSs);
return xp.selectNodes(xml);
}

//---------------------------------------------------------------------------
/** Evaluates an XPath expression on an element and returns Elements */
public static List selectNodes(Element xml, String xpath) throws JDOMException {

/**
* Evaluates an XPath expression on an element and returns Elements.
* @param xml
* @param xpath
* @return
* @throws JDOMException
*/
public static List<?> selectNodes(Element xml, String xpath) throws JDOMException {
return selectNodes(xml, xpath, new ArrayList<Namespace>());
}

//---------------------------------------------------------------------------
/** Evaluates an XPath expression on an element and returns string result */

/**
* Evaluates an XPath expression on an element and returns string result.
*
* @param xml
* @param xpath
* @return
* @throws JDOMException
*/
public static String selectString(Element xml, String xpath) throws JDOMException {
return selectString(xml, xpath, new ArrayList<Namespace>());
}

//---------------------------------------------------------------------------
/** Evaluates an XPath expression on an element and returns string result */

/**
* Evaluates an XPath expression on an element and returns string result.
*
* @param xml
* @param xpath
* @param theNSs
* @return
* @throws JDOMException
*/
public static String selectString(Element xml, String xpath, List<Namespace> theNSs) throws JDOMException {

XPath xp = prepareXPath(xml, xpath, theNSs);
Expand All @@ -456,14 +538,31 @@ public static String selectString(Element xml, String xpath, List<Namespace> the
}

//---------------------------------------------------------------------------
/** Evaluates an XPath expression on an element and returns true/false */

/**
* Evaluates an XPath expression on an element and returns true/false.
*
* @param xml
* @param xpath
* @return
* @throws JDOMException
*/
public static boolean selectBoolean(Element xml, String xpath) throws JDOMException {
String result = selectString(xml, xpath, new ArrayList<Namespace>());
return result.length() > 0;
}

//---------------------------------------------------------------------------
/** Evaluates an XPath expression on an element and returns true/false */

/**
* Evaluates an XPath expression on an element and returns true/false.
*
* @param xml
* @param xpath
* @param theNSs
* @return
* @throws JDOMException
*/
public static boolean selectBoolean(Element xml, String xpath, List<Namespace> theNSs) throws JDOMException {
return selectString(xml, xpath, theNSs).length() > 0;
}
Expand All @@ -484,8 +583,11 @@ public static Number selectNumber(Element xml, String xpath, List<Namespace> the
}

//---------------------------------------------------------------------------
/** Error handler that collects up validation errors */

/**
* Error handler that collects up validation errors.
*
*/
public static class ErrorHandler extends DefaultHandler {

private int errorCount = 0;
Expand Down Expand Up @@ -599,6 +701,16 @@ public static void validate(Element xml) throws Exception
validateRealGuts(schema, xml, eh);
}

//---------------------------------------------------------------------------

/**
* Validates an xml document with respect to an xml schema described by .xsd file path.
*
* @param schemaPath
* @param xml
* @return
* @throws Exception
*/
public static Element validateInfo(String schemaPath, Element xml) throws Exception
{
ErrorHandler eh = new ErrorHandler();
Expand All @@ -610,6 +722,17 @@ public static Element validateInfo(String schemaPath, Element xml) throws Except
}
}

//---------------------------------------------------------------------------

/**
* Validates an xml document with respect to an xml schema described by .xsd file path using supplied error handler.
*
* @param schemaPath
* @param xml
* @param eh
* @return
* @throws Exception
*/
public static Element validateInfo(String schemaPath, Element xml, ErrorHandler eh)
throws Exception {
validateGuts(schemaPath, xml, eh);
Expand All @@ -620,6 +743,16 @@ public static Element validateInfo(String schemaPath, Element xml, ErrorHandler
}
}

//---------------------------------------------------------------------------

/**
* Called by validation methods that supply an xml schema described by .xsd file path.
*
* @param schemaPath
* @param xml
* @param eh
* @throws Exception
*/
private static void validateGuts(String schemaPath, Element xml, ErrorHandler eh) throws Exception {
StreamSource schemaFile = new StreamSource(new File(schemaPath));
Schema schema = factory().newSchema(schemaFile);
Expand All @@ -640,6 +773,3 @@ private static SchemaFactory factory() {


}

//=============================================================================

2 changes: 1 addition & 1 deletion release
Submodule release updated 282 files

0 comments on commit 7096569

Please sign in to comment.