This is an automated email from the ASF dual-hosted git repository. joshtynjala pushed a commit to branch security-updates in repository https://gitbox.apache.org/repos/asf/flex-blazeds.git
commit b3a8e23f162308333a84c9a79098a4c6b4272b81 Author: Josh Tynjala <joshtynj...@bowlerhat.dev> AuthorDate: Mon Jan 9 09:40:09 2023 -0800 remove xalan dependency that was used for Java 1.4 and older only --- common/pom.xml | 5 -- .../ApacheXPathClientConfigurationParser.java | 70 ----------------- .../messaging/config/ServicesDependencies.java | 14 ---- .../ApacheXPathServerConfigurationParser.java | 72 ----------------- .../messaging/config/FlexConfigurationManager.java | 15 ---- .../messaging/config/ConfigurationParserTest.java | 2 +- .../flex/messaging/io/amf/MessageGenerator.java | 90 ++++++++++++---------- .../io/amfx/DeserializationConfirmation.java | 24 +++--- pom.xml | 6 -- 9 files changed, 63 insertions(+), 235 deletions(-) diff --git a/common/pom.xml b/common/pom.xml index f9bf841..8db4822 100755 --- a/common/pom.xml +++ b/common/pom.xml @@ -29,11 +29,6 @@ limitations under the License. <artifactId>flex-messaging-common</artifactId> <dependencies> - <dependency> - <groupId>xalan</groupId> - <artifactId>xalan</artifactId> - </dependency> - <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> diff --git a/common/src/main/java/flex/messaging/config/ApacheXPathClientConfigurationParser.java b/common/src/main/java/flex/messaging/config/ApacheXPathClientConfigurationParser.java deleted file mode 100644 index 64a7ecf..0000000 --- a/common/src/main/java/flex/messaging/config/ApacheXPathClientConfigurationParser.java +++ /dev/null @@ -1,70 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package flex.messaging.config; - -import org.apache.xpath.CachedXPathAPI; -import org.w3c.dom.Node; -import org.w3c.dom.NodeList; - -import javax.xml.transform.TransformerException; - -/** - * Uses Apache XPath on a DOM representation of a messaging configuration - * file. - * <p> - * NOTE: Since reference ids are used between elements, certain - * sections of the document need to be parsed first. - * </p> - */ -public class ApacheXPathClientConfigurationParser extends ClientConfigurationParser { - private CachedXPathAPI xpath; - - protected void initializeExpressionQuery() { - this.xpath = new CachedXPathAPI(); - } - - protected Node selectSingleNode(Node source, String expression) { - try { - return xpath.selectSingleNode(source, expression); - } catch (TransformerException transformerException) { - throw wrapException(transformerException); - } - } - - protected NodeList selectNodeList(Node source, String expression) { - try { - return xpath.selectNodeList(source, expression); - } catch (TransformerException transformerException) { - throw wrapException(transformerException); - } - } - - protected Object evaluateExpression(Node source, String expression) { - try { - return xpath.eval(source, expression); - } catch (TransformerException transformerException) { - throw wrapException(transformerException); - } - } - - private ConfigurationException wrapException(TransformerException exception) { - ConfigurationException result = new ConfigurationException(); - result.setDetails(PARSER_INTERNAL_ERROR); - result.setRootCause(exception); - return result; - } -} diff --git a/common/src/main/java/flex/messaging/config/ServicesDependencies.java b/common/src/main/java/flex/messaging/config/ServicesDependencies.java index 33d9808..6912e44 100644 --- a/common/src/main/java/flex/messaging/config/ServicesDependencies.java +++ b/common/src/main/java/flex/messaging/config/ServicesDependencies.java @@ -191,20 +191,6 @@ public class ServicesDependencies { } } - // Try Sun JRE 1.4 / Apache Xalan Based Implementation - if (parser == null) { - try { - Class.forName("org.apache.xpath.CachedXPathAPI"); - className = "flex.messaging.config.ApacheXPathClientConfigurationParser"; - parserClass = Class.forName(className); - parser = (ConfigurationParser) parserClass.newInstance(); - } catch (Throwable t) { - if (traceConfig) { - System.out.println("Could not load configuration parser as: " + className); - } - } - } - // Try Sun JRE 1.5 Based Implementation if (parser == null) { try { diff --git a/core/src/main/java/flex/messaging/config/ApacheXPathServerConfigurationParser.java b/core/src/main/java/flex/messaging/config/ApacheXPathServerConfigurationParser.java deleted file mode 100644 index 5150725..0000000 --- a/core/src/main/java/flex/messaging/config/ApacheXPathServerConfigurationParser.java +++ /dev/null @@ -1,72 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package flex.messaging.config; - -import org.apache.xpath.CachedXPathAPI; -import org.w3c.dom.Node; -import org.w3c.dom.NodeList; - -import javax.xml.transform.TransformerException; - -/** - * Uses Apache XPath on a DOM representation of a messaging configuration - * file. - * <p> - * Note: Since reference ids are used between elements, certain - * sections of the document need to be parsed first. - * </p> - */ -public class ApacheXPathServerConfigurationParser extends ServerConfigurationParser { - private CachedXPathAPI xpath; - - protected void initializeExpressionQuery() { - this.xpath = new CachedXPathAPI(); - } - - protected Node selectSingleNode(Node source, String expression) { - try { - return xpath.selectSingleNode(source, expression); - } catch (TransformerException transformerException) { - throw wrapException(transformerException); - } - } - - protected NodeList selectNodeList(Node source, String expression) { - try { - return xpath.selectNodeList(source, expression); - } catch (TransformerException transformerException) { - throw wrapException(transformerException); - } - } - - protected Object evaluateExpression(Node source, String expression) { - try { - return xpath.eval(source, expression); - } catch (TransformerException transformerException) { - throw wrapException(transformerException); - } - } - - private ConfigurationException wrapException(TransformerException exception) { - ConfigurationException result = new ConfigurationException(); - result.setDetails(PARSER_INTERNAL_ERROR); - result.setRootCause(exception); - return result; - } - - -} diff --git a/core/src/main/java/flex/messaging/config/FlexConfigurationManager.java b/core/src/main/java/flex/messaging/config/FlexConfigurationManager.java index be1e769..fc69fbf 100644 --- a/core/src/main/java/flex/messaging/config/FlexConfigurationManager.java +++ b/core/src/main/java/flex/messaging/config/FlexConfigurationManager.java @@ -102,21 +102,6 @@ public class FlexConfigurationManager implements ConfigurationManager { } } - // Always try Sun JRE 1.4 / Apache Xalan Based Implementation first to - // avoid performance problems with Sun JRE 1.5 Based Implementation - if (parser == null) { - try { - ClassUtil.createClass("org.apache.xpath.CachedXPathAPI"); - className = "flex.messaging.config.ApacheXPathServerConfigurationParser"; - parserClass = ClassUtil.createClass(className); - parser = (ConfigurationParser) parserClass.newInstance(); - } catch (Throwable t) { - if (Trace.config) { - Trace.trace("Could not load configuration parser as: " + className); - } - } - } - // Try Sun JRE 1.5 Based Implementation if (parser == null) { try { diff --git a/core/src/test/java/flex/messaging/config/ConfigurationParserTest.java b/core/src/test/java/flex/messaging/config/ConfigurationParserTest.java index f2d07c9..26e6bbb 100644 --- a/core/src/test/java/flex/messaging/config/ConfigurationParserTest.java +++ b/core/src/test/java/flex/messaging/config/ConfigurationParserTest.java @@ -94,7 +94,7 @@ public class ConfigurationParserTest { private void processRequest(String filename, String testName, String resourcePath) throws IOException { MessagingConfiguration config = new MessagingConfiguration(); - ConfigurationParser parser = new ApacheXPathServerConfigurationParser(); + ConfigurationParser parser = new XPathServerConfigurationParser(); try { parser.parse(filename, new LocalFileResolver(), config); diff --git a/core/src/test/java/flex/messaging/io/amf/MessageGenerator.java b/core/src/test/java/flex/messaging/io/amf/MessageGenerator.java index 21f0308..da1b0ae 100644 --- a/core/src/test/java/flex/messaging/io/amf/MessageGenerator.java +++ b/core/src/test/java/flex/messaging/io/amf/MessageGenerator.java @@ -18,7 +18,6 @@ package flex.messaging.io.amf; import flex.messaging.io.SerializationContext; -import org.apache.xpath.CachedXPathAPI; import org.w3c.dom.Document; import org.w3c.dom.Node; import org.w3c.dom.NodeList; @@ -28,6 +27,11 @@ import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import javax.xml.parsers.ParserConfigurationException; import javax.xml.transform.TransformerException; +import javax.xml.xpath.XPath; +import javax.xml.xpath.XPathConstants; +import javax.xml.xpath.XPathExpressionException; +import javax.xml.xpath.XPathFactory; + import java.io.File; import java.io.IOException; import java.util.ArrayList; @@ -67,6 +71,8 @@ public class MessageGenerator extends Amf0Output { Document doc = docBuilder.parse(file); doc.getDocumentElement().normalize(); parseAmf(doc); + } catch(XPathExpressionException ex) { + throw new RuntimeException(ex); } catch (TransformerException ex) { throw new RuntimeException(ex); } catch (SAXException ex) { @@ -77,13 +83,13 @@ public class MessageGenerator extends Amf0Output { } - private void parseAmf(Document doc) throws TransformerException, IOException { - CachedXPathAPI xpath = new CachedXPathAPI(); - Node root = xpath.selectSingleNode(doc, "/amf-request"); + private void parseAmf(Document doc) throws TransformerException, IOException, XPathExpressionException { + XPath xpath = XPathFactory.newInstance().newXPath(); + Node root = (Node) xpath.evaluate("/amf-request", doc, XPathConstants.NODE); if (root != null) { // messages - NodeList list = xpath.selectNodeList(root, "message"); + NodeList list = (NodeList) xpath.evaluate("message", root, XPathConstants.NODESET); for (int i = 0; i < list.getLength(); i++) { Node message = list.item(i); message(xpath, message); @@ -91,16 +97,16 @@ public class MessageGenerator extends Amf0Output { } } - private void message(CachedXPathAPI xpath, Node message) throws TransformerException, IOException { - int version = (int) xpath.eval(message, "version").num(); + private void message(XPath xpath, Node message) throws TransformerException, IOException, XPathExpressionException { + int version = ((Double) xpath.evaluate("version", message, XPathConstants.NUMBER)).intValue(); out.writeShort(version); // Headers - Node headers = xpath.selectSingleNode(message, "headers"); - int headerCount = (int) xpath.eval(headers, "@count").num(); + Node headers = (Node) xpath.evaluate("headers", message, XPathConstants.NODE); + int headerCount = ((Double) xpath.evaluate("@count", headers, XPathConstants.NUMBER)).intValue(); out.writeShort(headerCount); - NodeList list = xpath.selectNodeList(headers, "header"); + NodeList list = (NodeList) xpath.evaluate("header", headers, XPathConstants.NODESET); for (int i = 0; i < headerCount; i++) { Node header = list.item(i); if (header != null) { @@ -111,11 +117,11 @@ public class MessageGenerator extends Amf0Output { } // Bodies - Node bodies = xpath.selectSingleNode(message, "bodies"); - int bodyCount = (int) xpath.eval(bodies, "@count").num(); + Node bodies = (Node) xpath.evaluate("bodies", message, XPathConstants.NODE); + int bodyCount = ((Double) xpath.evaluate("@count", bodies, XPathConstants.NUMBER)).intValue(); out.writeShort(bodyCount); - list = xpath.selectNodeList(bodies, "body"); + list = (NodeList) xpath.evaluate("body", bodies, XPathConstants.NODESET); for (int i = 0; i < bodyCount; i++) { Node body = list.item(i); if (body != null) { @@ -126,9 +132,9 @@ public class MessageGenerator extends Amf0Output { } } - private void header(CachedXPathAPI xpath, Node header, int i) throws TransformerException, IOException { - String name = xpath.eval(header, "@name").toString(); - boolean mustUnderstand = xpath.eval(header, "@mustUnderstand").bool(); + private void header(XPath xpath, Node header, int i) throws TransformerException, IOException, XPathExpressionException { + String name = xpath.evaluate("@name", header); + boolean mustUnderstand = (Boolean) xpath.evaluate("@mustUnderstand", header, XPathConstants.BOOLEAN); if (isDebug) trace.startHeader(name, mustUnderstand, i); @@ -136,12 +142,12 @@ public class MessageGenerator extends Amf0Output { out.writeUTF(name); out.writeBoolean(mustUnderstand); - //int length = (int)xpath.eval(body, "@length").num(); + //int length = ((Double) xpath.evaluate("@length", body, XPathConstants.NUMBER)).intValue(); out.writeInt(-1); //Specify unknown content length reset(); - Node data = xpath.selectSingleNode(header, "*"); // Only one data item can be sent as the body... + Node data = (Node) xpath.evaluate("*", header, XPathConstants.NODE); // Only one data item can be sent as the body... Object value = value(xpath, data); writeObject(value); @@ -149,9 +155,9 @@ public class MessageGenerator extends Amf0Output { trace.endHeader(); } - private void body(CachedXPathAPI xpath, Node body, int i) throws TransformerException, IOException { - String targetUri = xpath.eval(body, "@targetUri").toString(); - String responseUri = xpath.eval(body, "@responseUri").toString(); + private void body(XPath xpath, Node body, int i) throws TransformerException, IOException, XPathExpressionException { + String targetUri = xpath.evaluate("@targetUri", body); + String responseUri = xpath.evaluate("@responseUri", body); if (isDebug) trace.startMessage(targetUri, responseUri, i); @@ -159,12 +165,12 @@ public class MessageGenerator extends Amf0Output { out.writeUTF(targetUri); out.writeUTF(responseUri); - //int length = (int)xpath.eval(body, "@length").num(); + //int length = ((Double) xpath.evaluate("@length", body, XPathConstants.NUMBER)).intValue(); out.writeInt(-1); //Specify unknown content length reset(); - Node data = xpath.selectSingleNode(body, "*"); // Only one data item can be sent as the body... + Node data = (Node) xpath.evaluate("*", body, XPathConstants.NODE); // Only one data item can be sent as the body... Object value = value(xpath, data); writeObject(value); @@ -172,9 +178,9 @@ public class MessageGenerator extends Amf0Output { trace.endMessage(); } - private Object value(CachedXPathAPI xpath, Node node) throws TransformerException, IOException { + private Object value(XPath xpath, Node node) throws TransformerException, IOException, XPathExpressionException { String type = node.getNodeName(); - String value = xpath.eval(node, ".").toString(); + String value = xpath.evaluate(".", node); if (value == null) { return null; @@ -192,9 +198,9 @@ public class MessageGenerator extends Amf0Output { } else if ("array".equals(type)) { List<Object> array = new ArrayList<Object>(); - int count = (int) xpath.eval(node, "@count").num(); + int count = ((Double) xpath.evaluate("@count", node, XPathConstants.NUMBER)).intValue(); - NodeList list = xpath.selectNodeList(node, "*"); + NodeList list = (NodeList) xpath.evaluate("*", node, XPathConstants.NODESET); for (int i = 0; i < count; i++) { Node item = list.item(i); if (item != null) { @@ -208,7 +214,7 @@ public class MessageGenerator extends Amf0Output { } else if ("object".equals(type)) { ASObject object = new ASObject(); - NodeList list = xpath.selectNodeList(node, "*[not(self::property)]"); + NodeList list = (NodeList) xpath.evaluate("*[not(self::property)]", node, XPathConstants.NODESET); List<Object> traitProperties = null; @@ -217,9 +223,9 @@ public class MessageGenerator extends Amf0Output { if (i == 0) { Node traits = list.item(i); - String className = xpath.eval(traits, "@classname").toString().trim(); - int count = (int) xpath.eval(traits, "@count").num(); - // boolean dynamic = xpath.eval(traits, "@dynamic").bool(); + String className = xpath.evaluate("@classname", traits).trim(); + int count = ((Double) xpath.evaluate("@count", traits, XPathConstants.NUMBER)).intValue(); + // boolean dynamic = (Boolean) xpath.evaluate("@dynamic", traits, XPathConstants.BOOLEAN); traitProperties = new ArrayList<Object>(count); @@ -227,11 +233,11 @@ public class MessageGenerator extends Amf0Output { object.setType(className); } - NodeList propList = xpath.selectNodeList(traits, "property"); + NodeList propList = (NodeList) xpath.evaluate("property", traits, XPathConstants.NODESET); for (int p = 0; p < count; p++) { Node prop = propList.item(p); if (prop != null) { - String propName = xpath.eval(prop, "@name").toString().trim(); + String propName = xpath.evaluate("@name", prop).trim(); traitProperties.add(propName); } else { throw new RuntimeException("Missing trait property(ies). Specified " + count + ", found " + (p - 1)); @@ -245,11 +251,11 @@ public class MessageGenerator extends Amf0Output { } // DYNAMIC PROPERTIES - list = xpath.selectNodeList(node, "property"); + list = (NodeList) xpath.evaluate("property", node, XPathConstants.NODESET); for (int i = 0; i < list.getLength(); i++) { Node prop = list.item(i); - String propName = xpath.eval(prop, "@name").toString(); - Node propValue = xpath.selectSingleNode(prop, "*"); + String propName = xpath.evaluate("@name", prop); + Node propValue = (Node) xpath.evaluate("*", prop, XPathConstants.NODE); object.put(propName, value(xpath, propValue)); } @@ -261,7 +267,7 @@ public class MessageGenerator extends Amf0Output { } else { if ("avmplus".equals(type)) { setAvmPlus(true); - Node data = xpath.selectSingleNode(node, "*"); // Only one data item can be sent as the body... + Node data = (Node) xpath.evaluate("*", node, XPathConstants.NODE); // Only one data item can be sent as the body... return value(xpath, data); } else if ("string".equals(type)) { return value; @@ -272,9 +278,9 @@ public class MessageGenerator extends Amf0Output { } else if ("array".equals(type)) { List<Object> array = new ArrayList<Object>(); - int count = (int) xpath.eval(node, "@count").num(); + int count = ((Double) xpath.evaluate("@count", node, XPathConstants.NUMBER)).intValue(); - NodeList list = xpath.selectNodeList(node, "*"); + NodeList list = (NodeList) xpath.evaluate("*", node, XPathConstants.NODESET); for (int i = 0; i < count; i++) { Node item = list.item(i); if (item != null) { @@ -287,16 +293,16 @@ public class MessageGenerator extends Amf0Output { return array; } else if ("object".equals(type)) { ASObject object = new ASObject(); - String className = xpath.eval(node, "@classname").toString().trim(); + String className = xpath.evaluate("@classname", node).trim(); if (className.length() > 0) { object.setType(className); } - NodeList list = xpath.selectNodeList(node, "property"); + NodeList list = (NodeList) xpath.evaluate("property", node, XPathConstants.NODESET); for (int i = 0; i < list.getLength(); i++) { Node prop = list.item(i); - String propName = xpath.eval(prop, "@name").toString().trim(); + String propName = xpath.evaluate("@name", prop).trim(); object.put(propName, value(xpath, prop)); } diff --git a/core/src/test/java/flex/messaging/io/amfx/DeserializationConfirmation.java b/core/src/test/java/flex/messaging/io/amfx/DeserializationConfirmation.java index c5d244a..d3db63b 100644 --- a/core/src/test/java/flex/messaging/io/amfx/DeserializationConfirmation.java +++ b/core/src/test/java/flex/messaging/io/amfx/DeserializationConfirmation.java @@ -28,13 +28,17 @@ import java.util.IdentityHashMap; import java.util.Iterator; import java.util.List; import java.util.Map; + +import javax.xml.xpath.XPath; +import javax.xml.xpath.XPathConstants; +import javax.xml.xpath.XPathFactory; + import java.util.ArrayList; import java.lang.reflect.Array; import org.w3c.dom.Document; import org.w3c.dom.Node; import org.w3c.dom.NodeList; -import org.apache.xpath.CachedXPathAPI; /** * Verifies that a deserialized ActionMessage @@ -224,10 +228,10 @@ public abstract class DeserializationConfirmation { boolean match = false; try { - CachedXPathAPI xpath1 = new CachedXPathAPI(); - CachedXPathAPI xpath2 = new CachedXPathAPI(); - Node root1 = xpath1.selectSingleNode(doc1, "/"); - Node root2 = xpath2.selectSingleNode(doc2, "/"); + XPath xpath1 = XPathFactory.newInstance().newXPath(); + XPath xpath2 = XPathFactory.newInstance().newXPath(); + Node root1 = (Node) xpath1.evaluate("/", doc1, XPathConstants.NODE); + Node root2 = (Node) xpath2.evaluate("/", doc2, XPathConstants.NODE); if (!nodesMatch(xpath1, root1, xpath2, root2)) { return false; @@ -242,20 +246,20 @@ public abstract class DeserializationConfirmation { } - protected boolean nodesMatch(CachedXPathAPI xpath1, Node node1, CachedXPathAPI xpath2, Node node2) { + protected boolean nodesMatch(XPath xpath1, Node node1, XPath xpath2, Node node2) { boolean match = false; try { - NodeList list1 = xpath1.selectNodeList(node1, "*"); - NodeList list2 = xpath2.selectNodeList(node2, "*"); + NodeList list1 = (NodeList) xpath1.evaluate("*", node1, XPathConstants.NODESET); + NodeList list2 = (NodeList) xpath2.evaluate("*", node2, XPathConstants.NODESET); if (list1.getLength() == list2.getLength()) { for (int i = 0; i < list1.getLength(); i++) { Node n1 = list1.item(i); Node n2 = list2.item(i); - NodeList attributes1 = xpath1.selectNodeList(n1, "@*"); - NodeList attributes2 = xpath2.selectNodeList(n2, "@*"); + NodeList attributes1 = (NodeList) xpath1.evaluate("@*", n1, XPathConstants.NODESET); + NodeList attributes2 = (NodeList) xpath2.evaluate("@*", n2, XPathConstants.NODESET); if (!attributesMatch(attributes1, attributes2)) { return false; diff --git a/pom.xml b/pom.xml index 57fdcce..788f605 100755 --- a/pom.xml +++ b/pom.xml @@ -322,12 +322,6 @@ <dependencyManagement> <dependencies> - <dependency> - <groupId>xalan</groupId> - <artifactId>xalan</artifactId> - <version>2.7.2</version> - </dependency> - <!-- TODO: This is the latest version of commons-httpclient, however there are CVEs reported for this, the replacement is org.apache.httpcomponents:httpclient however changing to this requires quite some refactoring of the code --> <dependency> <groupId>commons-httpclient</groupId>