Coverage for /var/srv/projects/api.amasfac.comuna18.com/tmp/venv/lib/python3.9/site-packages/defusedxml/common.py: 44%
57 statements
« prev ^ index » next coverage.py v6.4.4, created at 2023-07-17 14:22 -0600
« prev ^ index » next coverage.py v6.4.4, created at 2023-07-17 14:22 -0600
1# defusedxml
2#
3# Copyright (c) 2013 by Christian Heimes <christian@python.org>
4# Licensed to PSF under a Contributor Agreement.
5# See https://www.python.org/psf/license for licensing details.
6"""Common constants, exceptions and helpe functions
7"""
8import sys
9import xml.parsers.expat
11PY3 = sys.version_info[0] == 3
13# Fail early when pyexpat is not installed correctly
14if not hasattr(xml.parsers.expat, "ParserCreate"): 14 ↛ 15line 14 didn't jump to line 15, because the condition on line 14 was never true
15 raise ImportError("pyexpat") # pragma: no cover
18class DefusedXmlException(ValueError):
19 """Base exception"""
21 def __repr__(self):
22 return str(self)
25class DTDForbidden(DefusedXmlException):
26 """Document type definition is forbidden"""
28 def __init__(self, name, sysid, pubid):
29 super(DTDForbidden, self).__init__()
30 self.name = name
31 self.sysid = sysid
32 self.pubid = pubid
34 def __str__(self):
35 tpl = "DTDForbidden(name='{}', system_id={!r}, public_id={!r})"
36 return tpl.format(self.name, self.sysid, self.pubid)
39class EntitiesForbidden(DefusedXmlException):
40 """Entity definition is forbidden"""
42 def __init__(self, name, value, base, sysid, pubid, notation_name):
43 super(EntitiesForbidden, self).__init__()
44 self.name = name
45 self.value = value
46 self.base = base
47 self.sysid = sysid
48 self.pubid = pubid
49 self.notation_name = notation_name
51 def __str__(self):
52 tpl = "EntitiesForbidden(name='{}', system_id={!r}, public_id={!r})"
53 return tpl.format(self.name, self.sysid, self.pubid)
56class ExternalReferenceForbidden(DefusedXmlException):
57 """Resolving an external reference is forbidden"""
59 def __init__(self, context, base, sysid, pubid):
60 super(ExternalReferenceForbidden, self).__init__()
61 self.context = context
62 self.base = base
63 self.sysid = sysid
64 self.pubid = pubid
66 def __str__(self):
67 tpl = "ExternalReferenceForbidden(system_id='{}', public_id={})"
68 return tpl.format(self.sysid, self.pubid)
71class NotSupportedError(DefusedXmlException):
72 """The operation is not supported"""
75def _apply_defusing(defused_mod):
76 assert defused_mod is sys.modules[defused_mod.__name__]
77 stdlib_name = defused_mod.__origin__
78 __import__(stdlib_name, {}, {}, ["*"])
79 stdlib_mod = sys.modules[stdlib_name]
80 stdlib_names = set(dir(stdlib_mod))
81 for name, obj in vars(defused_mod).items():
82 if name.startswith("_") or name not in stdlib_names:
83 continue
84 setattr(stdlib_mod, name, obj)
85 return stdlib_mod
88def _generate_etree_functions(DefusedXMLParser, _TreeBuilder, _parse, _iterparse):
89 """Factory for functions needed by etree, dependent on whether
90 cElementTree or ElementTree is used."""
92 def parse(source, parser=None, forbid_dtd=False, forbid_entities=True, forbid_external=True):
93 if parser is None:
94 parser = DefusedXMLParser(
95 target=_TreeBuilder(),
96 forbid_dtd=forbid_dtd,
97 forbid_entities=forbid_entities,
98 forbid_external=forbid_external,
99 )
100 return _parse(source, parser)
102 def iterparse(
103 source,
104 events=None,
105 parser=None,
106 forbid_dtd=False,
107 forbid_entities=True,
108 forbid_external=True,
109 ):
110 if parser is None:
111 parser = DefusedXMLParser(
112 target=_TreeBuilder(),
113 forbid_dtd=forbid_dtd,
114 forbid_entities=forbid_entities,
115 forbid_external=forbid_external,
116 )
117 return _iterparse(source, events, parser)
119 def fromstring(text, forbid_dtd=False, forbid_entities=True, forbid_external=True):
120 parser = DefusedXMLParser(
121 target=_TreeBuilder(),
122 forbid_dtd=forbid_dtd,
123 forbid_entities=forbid_entities,
124 forbid_external=forbid_external,
125 )
126 parser.feed(text)
127 return parser.close()
129 return parse, iterparse, fromstring