summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorColin Watson <cjwatson@debian.org>2022-03-10 10:49:08 +0000
committerColin Watson <cjwatson@debian.org>2022-03-10 10:49:08 +0000
commit779c5db040759de3fb51e80f90f9805d1e093e1c (patch)
treec980498248b0d9dc7dc0c59fe0412355f921e070 /src
parentfca22bb84b4eaf11875a7a7207fb0c1d9be36d39 (diff)
downloadzope-security-779c5db040759de3fb51e80f90f9805d1e093e1c.tar.gz
Fix default checker for method-wrapper on Python 3
The default checker for `method-wrapper` objects such as `().__repr__` and `{}.__repr__` was previously set by setting the default checker `type(().__getslice__)`, which only worked on Python 2. Use a different exemplar for this type which works on both Python 2 and 3. Fixes #75.
Diffstat (limited to 'src')
-rw-r--r--src/zope/security/checker.py3
-rw-r--r--src/zope/security/tests/test_proxy.py5
2 files changed, 7 insertions, 1 deletions
diff --git a/src/zope/security/checker.py b/src/zope/security/checker.py
index fe570d1..534e8bb 100644
--- a/src/zope/security/checker.py
+++ b/src/zope/security/checker.py
@@ -882,6 +882,8 @@ _default_checkers = {
types.MethodType: _callableChecker,
types.BuiltinFunctionType: _callableChecker,
types.BuiltinMethodType: _callableChecker,
+ # method-wrapper
+ type(().__repr__): _callableChecker,
type: _typeChecker,
types.ModuleType: lambda module: _checkers.get(module, _namedChecker),
type(iter([])): _iteratorChecker, # Same types in Python 2.2.1,
@@ -912,7 +914,6 @@ if PYTHON2: # pragma: no cover
_default_checkers[types.ClassType] = _typeChecker
_default_checkers[types.InstanceType] = _instanceChecker
# slot description
- _default_checkers[type(().__getslice__)] = _callableChecker
_default_checkers[type({}.iteritems())] = _iteratorChecker
_default_checkers[type({}.iterkeys())] = _iteratorChecker
_default_checkers[type({}.itervalues())] = _iteratorChecker
diff --git a/src/zope/security/tests/test_proxy.py b/src/zope/security/tests/test_proxy.py
index adbb4f2..d646f54 100644
--- a/src/zope/security/tests/test_proxy.py
+++ b/src/zope/security/tests/test_proxy.py
@@ -2171,6 +2171,11 @@ class ProxyFactoryTests(unittest.TestCase):
self.assertEqual(list(IFoo), ['x'])
self.assertEqual(list(proxy), list(IFoo))
+ def test_method_wrapper(self):
+ from zope.security.proxy import ProxyFactory
+
+ self.assertEqual(ProxyFactory({}).__repr__(), '{}')
+
def test_using_mapping_slots_hack():
"""The security proxy will use mapping slots, on the checker to go faster