diff options
author | Christian Heimes <christian@python.org> | 2017-01-28 11:19:17 +0100 |
---|---|---|
committer | Christian Heimes <christian@python.org> | 2017-01-28 14:51:01 +0100 |
commit | ef6c918260b4bd3b58ac2000a1222b34b96f222d (patch) | |
tree | 62fbd9d7300fafeb68dadb652a43cc6449dad137 | |
parent | 0fe313449369ae399ae318c07298d45ea1ae5f0d (diff) | |
download | defusedxml-git-ef6c918260b4bd3b58ac2000a1222b34b96f222d.tar.gz |
Fix flake8 violations
-rw-r--r-- | defusedxml/ElementTree.py | 20 | ||||
-rw-r--r-- | defusedxml/__init__.py | 5 | ||||
-rw-r--r-- | defusedxml/cElementTree.py | 7 | ||||
-rw-r--r-- | defusedxml/common.py | 8 | ||||
-rw-r--r-- | defusedxml/expatbuilder.py | 2 | ||||
-rw-r--r-- | defusedxml/lxml.py | 14 | ||||
-rw-r--r-- | defusedxml/minidom.py | 12 | ||||
-rw-r--r-- | defusedxml/sax.py | 2 | ||||
-rw-r--r-- | defusedxml/xmlrpc.py | 18 | ||||
-rw-r--r-- | setup.py | 6 | ||||
-rw-r--r-- | tests.py | 25 |
11 files changed, 79 insertions, 40 deletions
diff --git a/defusedxml/ElementTree.py b/defusedxml/ElementTree.py index b35962d..41b2ea8 100644 --- a/defusedxml/ElementTree.py +++ b/defusedxml/ElementTree.py @@ -8,22 +8,27 @@ from __future__ import print_function, absolute_import import sys +from xml.etree.ElementTree import TreeBuilder as _TreeBuilder +from xml.etree.ElementTree import parse as _parse +from xml.etree.ElementTree import tostring + from .common import PY3 + + if PY3: import importlib else: from xml.etree.ElementTree import XMLParser as _XMLParser from xml.etree.ElementTree import iterparse as _iterparse from xml.etree.ElementTree import ParseError -from xml.etree.ElementTree import TreeBuilder as _TreeBuilder -from xml.etree.ElementTree import parse as _parse -from xml.etree.ElementTree import tostring + from .common import (DTDForbidden, EntitiesForbidden, ExternalReferenceForbidden, _generate_etree_functions) __origin__ = "xml.etree.ElementTree" + def _get_py3_cls(): """Python 3.3 hides the pure Python code but defusedxml requires it. @@ -49,11 +54,13 @@ def _get_py3_cls(): return _XMLParser, _iterparse, ParseError + if PY3: _XMLParser, _iterparse, ParseError = _get_py3_cls() class DefusedXMLParser(_XMLParser): + def __init__(self, html=0, target=None, encoding=None, forbid_dtd=False, forbid_entities=True, forbid_external=True): @@ -96,5 +103,10 @@ class DefusedXMLParser(_XMLParser): XMLTreeBuilder = XMLParse = DefusedXMLParser parse, iterparse, fromstring = _generate_etree_functions(DefusedXMLParser, - _TreeBuilder, _parse, _iterparse) + _TreeBuilder, _parse, + _iterparse) XML = fromstring + + +__all__ = ['XML', 'XMLParse', 'XMLTreeBuilder', 'fromstring', 'iterparse', + 'parse', 'tostring'] diff --git a/defusedxml/__init__.py b/defusedxml/__init__.py index 98a7f14..590a5a9 100644 --- a/defusedxml/__init__.py +++ b/defusedxml/__init__.py @@ -11,6 +11,7 @@ from .common import (DefusedXmlException, DTDForbidden, EntitiesForbidden, ExternalReferenceForbidden, NotSupportedError, _apply_defusing) + def defuse_stdlib(): """Monkey patch and defuse all stdlib packages @@ -38,5 +39,7 @@ def defuse_stdlib(): return defused -__version__ = "0.4.1" +__version__ = "0.5.0" +__all__ = ['DefusedXmlException', 'DTDForbidden', 'EntitiesForbidden', + 'ExternalReferenceForbidden', 'NotSupportedError'] diff --git a/defusedxml/cElementTree.py b/defusedxml/cElementTree.py index 0c8779c..cc13689 100644 --- a/defusedxml/cElementTree.py +++ b/defusedxml/cElementTree.py @@ -18,8 +18,13 @@ from .common import _generate_etree_functions __origin__ = "xml.etree.cElementTree" + XMLTreeBuilder = XMLParse = DefusedXMLParser parse, iterparse, fromstring = _generate_etree_functions(DefusedXMLParser, - _TreeBuilder, _parse, _iterparse) + _TreeBuilder, _parse, + _iterparse) XML = fromstring + +__all__ = ['XML', 'XMLParse', 'XMLTreeBuilder', 'fromstring', 'iterparse', + 'parse', 'tostring'] diff --git a/defusedxml/common.py b/defusedxml/common.py index 85a2d9c..668b609 100644 --- a/defusedxml/common.py +++ b/defusedxml/common.py @@ -6,7 +6,6 @@ """Common constants, exceptions and helpe functions """ import sys -from types import MethodType PY3 = sys.version_info[0] == 3 @@ -14,6 +13,7 @@ PY3 = sys.version_info[0] == 3 class DefusedXmlException(ValueError): """Base exception """ + def __repr__(self): return str(self) @@ -21,6 +21,7 @@ class DefusedXmlException(ValueError): class DTDForbidden(DefusedXmlException): """Document type definition is forbidden """ + def __init__(self, name, sysid, pubid): super(DTDForbidden, self).__init__() self.name = name @@ -35,6 +36,7 @@ class DTDForbidden(DefusedXmlException): class EntitiesForbidden(DefusedXmlException): """Entity definition is forbidden """ + def __init__(self, name, value, base, sysid, pubid, notation_name): super(EntitiesForbidden, self).__init__() self.name = name @@ -52,6 +54,7 @@ class EntitiesForbidden(DefusedXmlException): class ExternalReferenceForbidden(DefusedXmlException): """Resolving an external reference is forbidden """ + def __init__(self, context, base, sysid, pubid): super(ExternalReferenceForbidden, self).__init__() self.context = context @@ -83,7 +86,7 @@ def _apply_defusing(defused_mod): def _generate_etree_functions(DefusedXMLParser, _TreeBuilder, - _parse, _iterparse): + _parse, _iterparse): """Factory for functions needed by etree, dependent on whether cElementTree or ElementTree is used.""" @@ -114,5 +117,4 @@ def _generate_etree_functions(DefusedXMLParser, _TreeBuilder, parser.feed(text) return parser.close() - return parse, iterparse, fromstring diff --git a/defusedxml/expatbuilder.py b/defusedxml/expatbuilder.py index d81fd2f..0eb6b91 100644 --- a/defusedxml/expatbuilder.py +++ b/defusedxml/expatbuilder.py @@ -49,7 +49,7 @@ class DefusedExpatBuilder(_ExpatBuilder): if self.forbid_dtd: parser.StartDoctypeDeclHandler = self.defused_start_doctype_decl if self.forbid_entities: - #if self._options.entities: + # if self._options.entities: parser.EntityDeclHandler = self.defused_entity_decl parser.UnparsedEntityDeclHandler = self.defused_unparsed_entity_decl if self.forbid_external: diff --git a/defusedxml/lxml.py b/defusedxml/lxml.py index 94b497c..7f3ee0b 100644 --- a/defusedxml/lxml.py +++ b/defusedxml/lxml.py @@ -40,7 +40,8 @@ class RestrictedElement(_etree.ElementBase): return self._filter(iterator) def iterchildren(self, tag=None, reversed=False): - iterator = super(RestrictedElement, self).iterchildren(tag=tag, reversed=reversed) + iterator = super(RestrictedElement, self).iterchildren( + tag=tag, reversed=reversed) return self._filter(iterator) def iter(self, tag=None, *tags): @@ -48,11 +49,13 @@ class RestrictedElement(_etree.ElementBase): return self._filter(iterator) def iterdescendants(self, tag=None, *tags): - iterator = super(RestrictedElement, self).iterdescendants(tag=tag, *tags) + iterator = super(RestrictedElement, + self).iterdescendants(tag=tag, *tags) return self._filter(iterator) def itersiblings(self, tag=None, preceding=False): - iterator = super(RestrictedElement, self).itersiblings(tag=tag, preceding=preceding) + iterator = super(RestrictedElement, self).itersiblings( + tag=tag, preceding=preceding) return self._filter(iterator) def getchildren(self): @@ -69,8 +72,8 @@ class GlobalParserTLS(threading.local): """ parser_config = { 'resolve_entities': False, - #'remove_comments': True, - #'remove_pis': True, + # 'remove_comments': True, + # 'remove_pis': True, } element_class = RestrictedElement @@ -142,6 +145,7 @@ def fromstring(text, parser=None, base_url=None, forbid_dtd=False, check_docinfo(elementtree, forbid_dtd, forbid_entities) return rootelement + XML = fromstring diff --git a/defusedxml/minidom.py b/defusedxml/minidom.py index 1ce6946..0fd8684 100644 --- a/defusedxml/minidom.py +++ b/defusedxml/minidom.py @@ -13,6 +13,7 @@ from . import pulldom as _pulldom __origin__ = "xml.dom.minidom" + def parse(file, parser=None, bufsize=None, forbid_dtd=False, forbid_entities=True, forbid_external=True): """Parse a file into a DOM by filename or file object.""" @@ -22,17 +23,18 @@ def parse(file, parser=None, bufsize=None, forbid_dtd=False, forbid_external=forbid_external) else: return _do_pulldom_parse(_pulldom.parse, (file,), - {'parser': parser, 'bufsize': bufsize, - 'forbid_dtd': forbid_dtd, 'forbid_entities': forbid_entities, - 'forbid_external': forbid_external}) + {'parser': parser, 'bufsize': bufsize, + 'forbid_dtd': forbid_dtd, 'forbid_entities': forbid_entities, + 'forbid_external': forbid_external}) + def parseString(string, parser=None, forbid_dtd=False, forbid_entities=True, forbid_external=True): """Parse a file into a DOM from a string.""" if parser is None: return _expatbuilder.parseString(string, forbid_dtd=forbid_dtd, - forbid_entities=forbid_entities, - forbid_external=forbid_external) + forbid_entities=forbid_entities, + forbid_external=forbid_external) else: return _do_pulldom_parse(_pulldom.parseString, (string,), {'parser': parser, 'forbid_dtd': forbid_dtd, diff --git a/defusedxml/sax.py b/defusedxml/sax.py index 4305df0..534d0ca 100644 --- a/defusedxml/sax.py +++ b/defusedxml/sax.py @@ -14,6 +14,7 @@ from . import expatreader __origin__ = "xml.sax" + def parse(source, handler, errorHandler=_ErrorHandler(), forbid_dtd=False, forbid_entities=True, forbid_external=True): parser = make_parser() @@ -43,5 +44,6 @@ def parseString(string, handler, errorHandler=_ErrorHandler(), inpsrc.setByteStream(BytesIO(string)) parser.parse(inpsrc) + def make_parser(parser_list=[]): return expatreader.create_parser() diff --git a/defusedxml/xmlrpc.py b/defusedxml/xmlrpc.py index 7160d3c..2a456e6 100644 --- a/defusedxml/xmlrpc.py +++ b/defusedxml/xmlrpc.py @@ -20,14 +20,14 @@ if PY3: from xmlrpc import client as xmlrpc_client from xmlrpc import server as xmlrpc_server from xmlrpc.client import gzip_decode as _orig_gzip_decode - from xmlrpc.client import GzipDecodedResponse as _OrigGzipDecodedResponse + from xmlrpc.client import GzipDecodedResponse as _OrigGzipDecodedResponse else: __origin__ = "xmlrpclib" from xmlrpclib import ExpatParser import xmlrpclib as xmlrpc_client xmlrpc_server = None from xmlrpclib import gzip_decode as _orig_gzip_decode - from xmlrpclib import GzipDecodedResponse as _OrigGzipDecodedResponse + from xmlrpclib import GzipDecodedResponse as _OrigGzipDecodedResponse try: import gzip @@ -39,7 +39,8 @@ except ImportError: # Also used to limit maximum amount of gzip decoded data in order to prevent # decompression bombs # A value of -1 or smaller disables the limit -MAX_DATA = 30 * 1024 * 1024 # 30 MB +MAX_DATA = 30 * 1024 * 1024 # 30 MB + def defused_gzip_decode(data, limit=None): """gzip encoded data -> unencoded data @@ -53,7 +54,7 @@ def defused_gzip_decode(data, limit=None): f = io.BytesIO(data) gzf = gzip.GzipFile(mode="rb", fileobj=f) try: - if limit < 0: # no limit + if limit < 0: # no limit decoded = gzf.read() else: decoded = gzf.read(limit + 1) @@ -70,13 +71,14 @@ class DefusedGzipDecodedResponse(gzip.GzipFile if gzip else object): """a file-like object to decode a response encoded with the gzip method, as described in RFC 1952. """ + def __init__(self, response, limit=None): - #response doesn't support tell() and read(), required by - #GzipFile + # response doesn't support tell() and read(), required by + # GzipFile if not gzip: raise NotImplementedError self.limit = limit = limit if limit is not None else MAX_DATA - if limit < 0: # no limit + if limit < 0: # no limit data = response.read() self.readlength = None else: @@ -105,6 +107,7 @@ class DefusedGzipDecodedResponse(gzip.GzipFile if gzip else object): class DefusedExpatParser(ExpatParser): + def __init__(self, target, forbid_dtd=False, forbid_entities=True, forbid_external=True): ExpatParser.__init__(self, target) @@ -145,6 +148,7 @@ def monkey_patch(): if xmlrpc_server: xmlrpc_server.gzip_decode = defused_gzip_decode + def unmonkey_patch(): xmlrpc_client.FastParser = None xmlrpc_client.GzipDecodedResponse = _OrigGzipDecodedResponse @@ -8,12 +8,16 @@ from setuptools import setup import defusedxml + class PyTest(Command): user_options = [] + def initialize_options(self): pass + def finalize_options(self): pass + def run(self): errno = subprocess.call([sys.executable, "tests.py"]) raise SystemExit(errno) @@ -25,6 +29,7 @@ with open("README.txt") as f: with open("CHANGES.txt") as f: long_description.append(f.read()) + setup( name="defusedxml", version=defusedxml.__version__, @@ -56,4 +61,3 @@ setup( "Topic :: Text Processing :: Markup :: XML", ], ) - @@ -3,7 +3,6 @@ import os import sys import unittest import io -import re from xml.sax.saxutils import XMLGenerator from xml.sax import SAXParseException @@ -11,7 +10,7 @@ from pyexpat import ExpatError from defusedxml import cElementTree, ElementTree, minidom, pulldom, sax, xmlrpc from defusedxml import defuse_stdlib -from defusedxml import (DefusedXmlException, DTDForbidden, EntitiesForbidden, +from defusedxml import (DTDForbidden, EntitiesForbidden, ExternalReferenceForbidden, NotSupportedError) from defusedxml.common import PY3 @@ -141,7 +140,6 @@ class BaseTests(DefusedTestCase): self.assertRaises(DTDForbidden, self.iterparse, self.xml_dtd, forbid_dtd=True) - def test_dtd_with_external_ref(self): if self.dtd_external_ref: self.assertRaises(self.external_ref_exception, self.parse, @@ -172,9 +170,8 @@ class BaseTests(DefusedTestCase): class TestDefusedElementTree(BaseTests): module = ElementTree - - ## etree doesn't do external ref lookup - #external_ref_exception = ElementTree.ParseError + # etree doesn't do external ref lookup + # external_ref_exception = ElementTree.ParseError cyclic_error = ElementTree.ParseError @@ -199,7 +196,6 @@ class TestDefusedMinidom(BaseTests): cyclic_error = ExpatError - iterparse = None def parse(self, xmlfile, **kwargs): @@ -376,6 +372,7 @@ class TestDefusedLxml(BaseTests): class XmlRpcTarget(object): + def __init__(self): self._data = [] @@ -394,8 +391,10 @@ class XmlRpcTarget(object): def end(self, tag): self._data.append("</%s>" % tag) + class TestXmlRpc(DefusedTestCase): module = xmlrpc + def parse(self, xmlfile, **kwargs): target = XmlRpcTarget() parser = self.module.DefusedExpatParser(target, **kwargs) @@ -419,7 +418,7 @@ class TestXmlRpc(DefusedTestCase): self.assertRaises(DTDForbidden, self.parse, self.xml_dtd, forbid_dtd=True) - #def test_xmlrpc_unpatched(self): + # def test_xmlrpc_unpatched(self): # for fname in (self.xml_external, self.xml_dtd): # print(self.parse_unpatched(fname)) @@ -431,6 +430,7 @@ class TestXmlRpc(DefusedTestCase): class TestDefusedGzip(DefusedTestCase): + def get_gzipped(self, length): f = io.BytesIO() gzf = gzip.GzipFile(mode="wb", fileobj=f) @@ -452,11 +452,11 @@ class TestDefusedGzip(DefusedTestCase): def test_defused_gzip_decode(self): data = self.get_gzipped(4096).getvalue() result = xmlrpc.defused_gzip_decode(data) - self.assertEqual(result, b"d" *4096) + self.assertEqual(result, b"d" * 4096) result = xmlrpc.defused_gzip_decode(data, -1) - self.assertEqual(result, b"d" *4096) + self.assertEqual(result, b"d" * 4096) result = xmlrpc.defused_gzip_decode(data, 4096) - self.assertEqual(result, b"d" *4096) + self.assertEqual(result, b"d" * 4096) with self.assertRaises(ValueError): result = xmlrpc.defused_gzip_decode(data, 4095) with self.assertRaises(ValueError): @@ -467,7 +467,7 @@ class TestDefusedGzip(DefusedTestCase): response = self.get_gzipped(4096) data = self.decode_response(response) - self.assertEqual(data, b"d" *4096) + self.assertEqual(data, b"d" * 4096) with self.assertRaises(ValueError): response = self.get_gzipped(4096) @@ -496,6 +496,7 @@ def test_main(): suite.addTests(unittest.makeSuite(TestDefusedGzip)) return suite + if __name__ == "__main__": suite = test_main() result = unittest.TextTestRunner(verbosity=1).run(suite) |