# HG changeset patch
# User aspex-yhudobin
# Date 1507281140 -21600
#      Fri Oct 06 15:12:20 2017 +0600
# Branch XML-LIBS
# Node ID 1b6eb74c196c5b8ad7ffe4a2c6749a60dea296a8
# Parent  b43d4b749d8b9160ccde8020f06dbedae7bb8129
Patch for XPath/XpathFilter namespace resolving (add namespaces from ascending branch).

diff -r b43d4b749d8b -r 1b6eb74c196c xml-security-c/src/dsig/DSIGTransformXPath.cpp
--- a/xml-security-c/src/dsig/DSIGTransformXPath.cpp	Mon Jun 12 18:03:26 2017 +0700
+++ b/xml-security-c/src/dsig/DSIGTransformXPath.cpp	Fri Oct 06 15:12:20 2017 +0600
@@ -149,6 +149,8 @@
 		// Check for attributes - in particular any namespaces
 
 		mp_NSMap = mp_xpathNode->getAttributes();
+
+		gatherNamespacesFromAcsendingBranch(mp_xpathNode->getParentNode());
 		
 		// Find the text node
 		mp_exprTextNode = findFirstChildOfType(mp_xpathNode, DOMNode::TEXT_NODE);
@@ -236,3 +238,43 @@
 
 }
 
+void DSIGTransformXPath::gatherNamespacesFromAcsendingBranch(XERCES_CPP_NAMESPACE_QUALIFIER DOMNode * pCurrentNode)
+{
+	if(!pCurrentNode)
+		return;
+
+	XERCES_CPP_NAMESPACE_QUALIFIER DOMNamedNodeMap * attrs = pCurrentNode->getAttributes();
+
+	if(NULL == attrs)
+		return;
+
+	XMLSize_t size = attrs->getLength();
+
+	for (XMLSize_t i = 0; i < size; ++i) {
+
+		XERCES_CPP_NAMESPACE_QUALIFIER DOMNode * attr = attrs->item(i);
+
+		if(DOMNode::ATTRIBUTE_NODE != attr->getNodeType())
+			continue;
+
+		if (!strEquals(attr->getPrefix(), "xmlns"))
+			continue;
+
+		XERCES_CPP_NAMESPACE_QUALIFIER DOMNode * alreadyPresent = mp_NSMap->getNamedItem(attr->getNodeName());
+		if(NULL != alreadyPresent)
+			continue;
+
+		// add namespace
+		DOMElement *x;
+		x = static_cast <DOMElement *> (mp_xpathNode);
+		x->setAttributeNS(DSIGConstants::s_unicodeStrURIXMLNS,
+			attr->getNodeName(),
+			attr->getNodeValue());
+
+		// update 
+		mp_NSMap = mp_xpathNode->getAttributes();
+
+	}
+
+	gatherNamespacesFromAcsendingBranch(pCurrentNode->getParentNode());
+}
\ No newline at end of file
diff -r b43d4b749d8b -r 1b6eb74c196c xml-security-c/src/dsig/DSIGTransformXPath.hpp
--- a/xml-security-c/src/dsig/DSIGTransformXPath.hpp	Mon Jun 12 18:03:26 2017 +0700
+++ b/xml-security-c/src/dsig/DSIGTransformXPath.hpp	Fri Oct 06 15:12:20 2017 +0600
@@ -208,7 +208,11 @@
 	void deleteNamespace(const char * prefix);
 
 	//@}
-	
+
+protected:
+
+		void gatherNamespacesFromAcsendingBranch(XERCES_CPP_NAMESPACE_QUALIFIER DOMNode * pNode);
+
 private:
 
 	DSIGTransformXPath();
diff -r b43d4b749d8b -r 1b6eb74c196c xml-security-c/src/dsig/DSIGXPathFilterExpr.cpp
--- a/xml-security-c/src/dsig/DSIGXPathFilterExpr.cpp	Mon Jun 12 18:03:26 2017 +0700
+++ b/xml-security-c/src/dsig/DSIGXPathFilterExpr.cpp	Fri Oct 06 15:12:20 2017 +0600
@@ -103,6 +103,8 @@
 
 	mp_NSMap = mp_xpathFilterNode->getAttributes();
 
+	gatherNamespacesFromAcsendingBranch(mp_xpathFilterNode->getParentNode());
+
 	// Find the filter type
 	DOMNode * a;
 	if (mp_NSMap == NULL ||
@@ -292,6 +294,37 @@
 }
 
 
+void DSIGXPathFilterExpr::gatherNamespacesFromAcsendingBranch(XERCES_CPP_NAMESPACE_QUALIFIER DOMNode * pCurrentNode)
+{
+	if(!pCurrentNode)
+		return;
+
+	XERCES_CPP_NAMESPACE_QUALIFIER DOMNamedNodeMap * attrs = pCurrentNode->getAttributes();
+
+	if(NULL == attrs)
+		return;
+
+	XMLSize_t size = attrs->getLength();
+
+	for (XMLSize_t i = 0; i < size; ++i) {
+
+		XERCES_CPP_NAMESPACE_QUALIFIER DOMNode * attr = attrs->item(i);
+
+		if(DOMNode::ATTRIBUTE_NODE != attr->getNodeType())
+			continue;
+
+		if (!strEquals(attr->getPrefix(), "xmlns"))
+			continue;
+		
+		XERCES_CPP_NAMESPACE_QUALIFIER DOMNode * alreadyPresent = mp_NSMap->getNamedItem(attr->getNodeName());
+		if(NULL != alreadyPresent)
+			continue;
+
+		setNamespace(attr->getLocalName(), attr->getNodeValue());
+	}
+
+	gatherNamespacesFromAcsendingBranch(pCurrentNode->getParentNode());
+}
 
 	/**
 	 * \brief Add a new namespace to the list to be used
diff -r b43d4b749d8b -r 1b6eb74c196c xml-security-c/src/dsig/DSIGXPathFilterExpr.hpp
--- a/xml-security-c/src/dsig/DSIGXPathFilterExpr.hpp	Mon Jun 12 18:03:26 2017 +0700
+++ b/xml-security-c/src/dsig/DSIGXPathFilterExpr.hpp	Fri Oct 06 15:12:20 2017 +0600
@@ -178,6 +178,10 @@
 
 	//@}
 	
+protected:
+
+	void gatherNamespacesFromAcsendingBranch(XERCES_CPP_NAMESPACE_QUALIFIER DOMNode * pNode);
+
 private:
 
 	// Just let the TXFM read directly
