PyObject *xmlsec_NodeSetContains(PyObject *self, PyObject *args) { PyObject *nset_obj, *node_obj, *parent_obj; xmlSecNodeSetPtr nset; xmlNodePtr node; xmlNodePtr parent; if (CheckArgs(args, "OOO:nodeSetContains")) { if (!PyArg_ParseTuple(args, "OOO:nodeSetContains", &nset_obj, &node_obj, &parent_obj)) return NULL; } else return NULL; nset = xmlSecNodeSetPtr_get(nset_obj); node = xmlNodePtr_get(node_obj); parent = xmlNodePtr_get(parent_obj); return (wrap_int(xmlSecNodeSetContains(nset, node, parent))); }
static int xmlSecNodeSetWalkRecursive(xmlSecNodeSetPtr nset, xmlSecNodeSetWalkCallback walkFunc, void* data, xmlNodePtr cur, xmlNodePtr parent) { int ret; xmlSecAssert2(nset != NULL, -1); xmlSecAssert2(cur != NULL, -1); xmlSecAssert2(walkFunc != NULL, -1); /* the node itself */ if(xmlSecNodeSetContains(nset, cur, parent)) { ret = walkFunc(nset, cur, parent, data); if(ret < 0) { return(ret); } } /* element node has attributes, namespaces */ if(cur->type == XML_ELEMENT_NODE) { xmlAttrPtr attr; xmlNodePtr node; xmlNsPtr ns, tmp; attr = (xmlAttrPtr)cur->properties; while(attr != NULL) { if(xmlSecNodeSetContains(nset, (xmlNodePtr)attr, cur)) { ret = walkFunc(nset, (xmlNodePtr)attr, cur, data); if(ret < 0) { return(ret); } } attr = attr->next; } node = cur; while(node != NULL) { ns = node->nsDef; while(ns != NULL) { tmp = xmlSearchNs(nset->doc, cur, ns->prefix); if((tmp == ns) && xmlSecNodeSetContains(nset, (xmlNodePtr)ns, cur)) { ret = walkFunc(nset, (xmlNodePtr)ns, cur, data); if(ret < 0) { return(ret); } } ns = ns->next; } node = node->parent; } } /* element and document nodes have children */ if((cur->type == XML_ELEMENT_NODE) || (cur->type == XML_DOCUMENT_NODE)) { xmlNodePtr node; node = cur->children; while(node != NULL) { ret = xmlSecNodeSetWalkRecursive(nset, walkFunc, data, node, cur); if(ret < 0) { return(ret); } node = node->next; } } return(0); }
static int xmlSecNodeSetOneContains(xmlSecNodeSetPtr nset, xmlNodePtr node, xmlNodePtr parent) { int in_nodes_set = 1; xmlSecAssert2(nset != NULL, 0); xmlSecAssert2(node != NULL, 0); /* special cases: */ switch(nset->type) { case xmlSecNodeSetTreeWithoutComments: case xmlSecNodeSetTreeWithoutCommentsInvert: if(node->type == XML_COMMENT_NODE) { return(0); } break; case xmlSecNodeSetList: return(xmlSecNodeSetContains(nset->children, node, parent)); default: break; } if(nset->nodes != NULL) { if(node->type != XML_NAMESPACE_DECL) { in_nodes_set = xmlXPathNodeSetContains(nset->nodes, node); } else { xmlNs ns; memcpy(&ns, node, sizeof(ns)); if((parent != NULL) && (parent->type == XML_ATTRIBUTE_NODE)) { ns.next = (xmlNsPtr)parent->parent; } else { ns.next = (xmlNsPtr)parent; } /* * If the input is an XPath node-set, then the node-set must explicitly * contain every node to be rendered to the canonical form. */ in_nodes_set = (xmlXPathNodeSetContains(nset->nodes, (xmlNodePtr)&ns)); } } switch(nset->type) { case xmlSecNodeSetNormal: return(in_nodes_set); case xmlSecNodeSetInvert: return(!in_nodes_set); case xmlSecNodeSetTree: case xmlSecNodeSetTreeWithoutComments: if(in_nodes_set) { return(1); } if((parent != NULL) && (parent->type == XML_ELEMENT_NODE)) { return(xmlSecNodeSetOneContains(nset, parent, parent->parent)); } return(0); case xmlSecNodeSetTreeInvert: case xmlSecNodeSetTreeWithoutCommentsInvert: if(in_nodes_set) { return(0); } if((parent != NULL) && (parent->type == XML_ELEMENT_NODE)) { return(xmlSecNodeSetOneContains(nset, parent, parent->parent)); } return(1); default: xmlSecError(XMLSEC_ERRORS_HERE, NULL, NULL, XMLSEC_ERRORS_R_INVALID_TYPE, "type=%d", nset->type); } return(0); }