From 291ed4fb3f9b6cc7697c7ac8c0c70ecdc5e245e2 Mon Sep 17 00:00:00 2001 From: "Andrew M. Kuchling" Date: Sun, 31 Dec 2000 03:50:23 +0000 Subject: [PATCH] Patch #102485 ] Check for legal children when adding children to a DOM node --- Lib/xml/dom/minidom.py | 36 ++++++++++++++++++++++++++++++------ 1 file changed, 30 insertions(+), 6 deletions(-) diff --git a/Lib/xml/dom/minidom.py b/Lib/xml/dom/minidom.py index 98a75b99f19..74c9664dfb0 100644 --- a/Lib/xml/dom/minidom.py +++ b/Lib/xml/dom/minidom.py @@ -18,6 +18,8 @@ _string = string del string +from xml.dom import HierarchyRequestErr + # localize the types, and allow support for Unicode values if available: import types _TupleType = types.TupleType @@ -37,7 +39,8 @@ class Node(_Node): _debug = 0 _makeParentNodes = 1 debug = None - + childNodeTypes = () + def __init__(self): self.childNodes = [] self.parentNode = None @@ -99,6 +102,9 @@ def _get_lastChild(self): return self.childNodes[-1] def insertBefore(self, newChild, refChild): + if newChild.nodeType not in self.childNodeTypes: + raise HierarchyRequestErr, \ + "%s cannot be child of %s" % (repr(newChild), repr(self) ) if newChild.parentNode is not None: newChild.parentNode.removeChild(newChild) if refChild is None: @@ -119,6 +125,9 @@ def insertBefore(self, newChild, refChild): return newChild def appendChild(self, node): + if node.nodeType not in self.childNodeTypes: + raise HierarchyRequestErr, \ + "%s cannot be child of %s" % (repr(node), repr(self) ) if node.parentNode is not None: node.parentNode.removeChild(node) if self.childNodes: @@ -134,6 +143,9 @@ def appendChild(self, node): return node def replaceChild(self, newChild, oldChild): + if newChild.nodeType not in self.childNodeTypes: + raise HierarchyRequestErr, \ + "%s cannot be child of %s" % (repr(newChild), repr(self) ) if newChild.parentNode is not None: newChild.parentNode.removeChild(newChild) if newChild is oldChild: @@ -250,7 +262,8 @@ class Attr(Node): nodeType = Node.ATTRIBUTE_NODE attributes = None ownerElement = None - + childNodeTypes = (Node.TEXT_NODE, Node.ENTITY_REFERENCE_NODE) + def __init__(self, qName, namespaceURI="", localName=None, prefix=None): # skip setattr for performance d = self.__dict__ @@ -374,7 +387,10 @@ class Element(Node): nodeType = Node.ELEMENT_NODE nextSibling = None previousSibling = None - + childNodeTypes = (Node.ELEMENT_NODE, Node.PROCESSING_INSTRUCTION_NODE, + Node.COMMENT_NODE, Node.TEXT_NODE, + Node.CDATA_SECTION_NODE, Node.ENTITY_REFERENCE_NODE) + def __init__(self, tagName, namespaceURI="", prefix="", localName=None): Node.__init__(self) @@ -508,7 +524,8 @@ class Comment(Node): nodeType = Node.COMMENT_NODE nodeName = "#comment" attributes = None - + childNodeTypes = () + def __init__(self, data): Node.__init__(self) self.data = self.nodeValue = data @@ -519,7 +536,8 @@ def writexml(self, writer): class ProcessingInstruction(Node): nodeType = Node.PROCESSING_INSTRUCTION_NODE attributes = None - + childNodeTypes = () + def __init__(self, target, data): Node.__init__(self) self.target = self.nodeName = target @@ -532,7 +550,8 @@ class Text(Node): nodeType = Node.TEXT_NODE nodeName = "#text" attributes = None - + childNodeTypes = () + def __init__(self, data): Node.__init__(self) self.data = self.nodeValue = data @@ -627,8 +646,13 @@ class Document(Node): parentNode = None implementation = DOMImplementation() + childNodeTypes = (Node.ELEMENT_NODE, Node.PROCESSING_INSTRUCTION_NODE, + Node.COMMENT_NODE, Node.DOCUMENT_TYPE_NODE) def appendChild(self, node): + if node.nodeType not in self.childNodeTypes: + raise HierarchyRequestErr, \ + "%s cannot be child of %s" % (repr(node), repr(self) ) if node.parentNode is not None: node.parentNode.removeChild(node)