github.com/munnerz/test-infra@v0.0.0-20190108210205-ce3d181dc989/gubernator/third_party/defusedxml/ElementTree.py (about) 1 # defusedxml 2 # 3 # Copyright (c) 2013 by Christian Heimes <christian@python.org> 4 # Licensed to PSF under a Contributor Agreement. 5 # See http://www.python.org/psf/license for licensing details. 6 """Defused xml.etree.ElementTree facade 7 """ 8 from __future__ import print_function, absolute_import 9 10 import sys 11 from .common import PY3, PY26, PY31 12 if PY3: 13 import importlib 14 else: 15 from xml.etree.ElementTree import XMLParser as _XMLParser 16 from xml.etree.ElementTree import iterparse as _iterparse 17 if PY26: 18 from xml.parsers.expat import ExpatError as ParseError 19 else: 20 from xml.etree.ElementTree import ParseError 21 _IterParseIterator = None 22 from xml.etree.ElementTree import TreeBuilder as _TreeBuilder 23 from xml.etree.ElementTree import parse as _parse 24 from xml.etree.ElementTree import tostring 25 26 from .common import (DTDForbidden, EntitiesForbidden, 27 ExternalReferenceForbidden, _generate_etree_functions) 28 29 __origin__ = "xml.etree.ElementTree" 30 31 def _get_py3_cls(): 32 """Python 3.3 hides the pure Python code but defusedxml requires it. 33 34 The code is based on test.support.import_fresh_module(). 35 """ 36 pymodname = "xml.etree.ElementTree" 37 cmodname = "_elementtree" 38 39 pymod = sys.modules.pop(pymodname, None) 40 cmod = sys.modules.pop(cmodname, None) 41 42 sys.modules[cmodname] = None 43 pure_pymod = importlib.import_module(pymodname) 44 if cmod is not None: 45 sys.modules[cmodname] = cmod 46 else: 47 sys.modules.pop(cmodname) 48 sys.modules[pymodname] = pymod 49 50 _XMLParser = pure_pymod.XMLParser 51 _iterparse = pure_pymod.iterparse 52 if PY31: 53 _IterParseIterator = None 54 from xml.parsers.expat import ExpatError as ParseError 55 else: 56 _IterParseIterator = pure_pymod._IterParseIterator 57 ParseError = pure_pymod.ParseError 58 59 return _XMLParser, _iterparse, _IterParseIterator, ParseError 60 61 if PY3: 62 _XMLParser, _iterparse, _IterParseIterator, ParseError = _get_py3_cls() 63 64 65 class DefusedXMLParser(_XMLParser): 66 def __init__(self, html=0, target=None, encoding=None, 67 forbid_dtd=False, forbid_entities=True, 68 forbid_external=True): 69 if PY26 or PY31: 70 _XMLParser.__init__(self, html, target) 71 else: 72 # Python 2.x old style class 73 _XMLParser.__init__(self, html, target, encoding) 74 self.forbid_dtd = forbid_dtd 75 self.forbid_entities = forbid_entities 76 self.forbid_external = forbid_external 77 if PY3 and not PY31: 78 parser = self.parser 79 else: 80 parser = self._parser 81 if self.forbid_dtd: 82 parser.StartDoctypeDeclHandler = self.defused_start_doctype_decl 83 if self.forbid_entities: 84 parser.EntityDeclHandler = self.defused_entity_decl 85 parser.UnparsedEntityDeclHandler = self.defused_unparsed_entity_decl 86 if self.forbid_external: 87 parser.ExternalEntityRefHandler = self.defused_external_entity_ref_handler 88 89 def defused_start_doctype_decl(self, name, sysid, pubid, 90 has_internal_subset): 91 raise DTDForbidden(name, sysid, pubid) 92 93 def defused_entity_decl(self, name, is_parameter_entity, value, base, 94 sysid, pubid, notation_name): 95 raise EntitiesForbidden(name, value, base, sysid, pubid, notation_name) 96 97 def defused_unparsed_entity_decl(self, name, base, sysid, pubid, 98 notation_name): 99 # expat 1.2 100 raise EntitiesForbidden(name, None, base, sysid, pubid, notation_name) 101 102 def defused_external_entity_ref_handler(self, context, base, sysid, 103 pubid): 104 raise ExternalReferenceForbidden(context, base, sysid, pubid) 105 106 107 # aliases 108 XMLTreeBuilder = XMLParse = DefusedXMLParser 109 110 parse, iterparse, fromstring = _generate_etree_functions(DefusedXMLParser, 111 _TreeBuilder, _IterParseIterator, _parse, _iterparse) 112 XML = fromstring