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