diff options
author | Adam Groszer <agroszer@gmail.com> | 2019-01-03 10:55:06 +0100 |
---|---|---|
committer | Adam Groszer <agroszer@gmail.com> | 2019-01-03 14:18:42 +0100 |
commit | 0660cf005e88e677228b8096c0f78148885016d8 (patch) | |
tree | af4e6cb05702bab16bd1617ed03897360db79c0d | |
parent | 6846c5f352d35771101a7dfedcc2fbe38707bac5 (diff) | |
download | zope-security-adamg-truediv-missing.tar.gz |
Decimal checker: __truediv__ was missing, also added tests, did some cleanupadamg-truediv-missing
-rw-r--r-- | CHANGES.rst | 3 | ||||
-rw-r--r-- | src/zope/security/checker.py | 27 | ||||
-rw-r--r-- | src/zope/security/tests/test_checker.py | 42 |
3 files changed, 61 insertions, 11 deletions
diff --git a/CHANGES.rst b/CHANGES.rst index ec15291..618802e 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -5,7 +5,8 @@ 4.3.1 (unreleased) ================== -- Nothing changed yet. +- Fix the decimal.Decimal checker, ``__truediv__`` was missing causing + ``ForbiddenAttribute`` on a ``ProxyFactory(Decimal('1')) / 1`` operation 4.3.0 (2018-08-24) diff --git a/src/zope/security/checker.py b/src/zope/security/checker.py index 79975d4..818ee72 100644 --- a/src/zope/security/checker.py +++ b/src/zope/security/checker.py @@ -816,20 +816,27 @@ _default_checkers = { '__add__', '__radd__', ]), set: _setChecker, frozenset: _setChecker, + # XXX: actually decimal.Decimal has more methods, which are unlisted here + # so expect ForbiddenAttribute on such decimal.Decimal: NamesChecker(['__nonzero__', '__cmp__', '__eq__', - '__ne__', 'compare', '__hash__', - 'as_tuple', '__str__', 'to_eng_string', + '__ne__', '__hash__', + '__str__', '__neg__', '__pos__', '__abs__', - '__add__', '__radd__', '__sub__', - '__rsub__', '__mul__', '__rmul__', - '__div__', '__rdiv__', '__rtruediv__', - '__divmod__', '__rdivmod__', '__mod__', - '__rmod__', 'remainder_near', + '__add__', '__radd__', + '__sub__', '__rsub__', + '__mul__', '__rmul__', + '__div__', '__truediv__', + '__rdiv__', '__rtruediv__', + '__divmod__', '__rdivmod__', + '__mod__', '__rmod__', '__floordiv__', '__rfloordiv__', '__float__', '__int__', '__long__', - '__pow__', '__rpow__', 'normalize', - 'quantize', 'same_quantum', 'to_integral', - 'sqrt', 'max', 'min', 'adjusted']), + '__pow__', '__rpow__', + 'adjusted', 'as_tuple', 'compare', + 'max', 'min', 'normalize', + 'quantize', 'remainder_near', + 'same_quantum', 'sqrt', + 'to_eng_string', 'to_integral' ]), # YAGNI: () a rock tuple: NamesChecker(['__getitem__', '__getslice__', '__add__', '__radd__', diff --git a/src/zope/security/tests/test_checker.py b/src/zope/security/tests/test_checker.py index 14f6002..3473886 100644 --- a/src/zope/security/tests/test_checker.py +++ b/src/zope/security/tests/test_checker.py @@ -389,6 +389,48 @@ class CheckerTestsBase(QuietWatchingChecker): finally: _clear() + def test_Decimal_operations(self): + from zope.security.proxy import Proxy + from zope.security.checker import _default_checkers + from decimal import Decimal + from decimal import DecimalTuple + + checker = _default_checkers[Decimal] + + value = Decimal('1.1') + proxy = Proxy(value, checker) + + self.assertTrue(proxy) + self.assertTrue(proxy < Decimal('2')) + self.assertTrue(proxy == Decimal('1.1')) + self.assertTrue(proxy > Decimal('1')) + self.assertTrue(proxy != Decimal('1')) + self.assertEqual(-proxy, Decimal('-1.1')) + self.assertEqual(proxy + Decimal('1.1'), Decimal('2.2')) + self.assertEqual(Decimal('1.1') + proxy, Decimal('2.2')) + self.assertEqual(proxy - Decimal('1'), Decimal('0.1')) + self.assertEqual(Decimal('2.1') - proxy, Decimal('1')) + self.assertEqual(proxy * 1, Decimal('1.1')) + self.assertEqual(1 * proxy, Decimal('1.1')) + self.assertEqual(proxy * Decimal('1.1'), Decimal('1.21')) + self.assertEqual(Decimal('1.1') * proxy, Decimal('1.21')) + self.assertEqual(proxy / 1, Decimal('1.1')) + self.assertEqual(proxy / Decimal('1'), Decimal('1.1')) + self.assertEqual(proxy // 1, Decimal('1')) + self.assertEqual(proxy // Decimal('1'), Decimal('1')) + self.assertEqual(float(proxy), 1.1) + self.assertEqual(int(proxy), 1) + if PY2: + self.assertEqual(long(proxy), 1) + self.assertEqual(proxy ** 2, Decimal('1.21')) + self.assertEqual(1 ** proxy, Decimal('1')) + self.assertEqual(proxy.adjusted(), 0) + self.assertEqual( + proxy.as_tuple(), DecimalTuple(sign=0, digits=(1, 1), exponent=-1)) + self.assertEqual(proxy.compare(Decimal('1.1')), Decimal('0')) + self.assertEqual(proxy.normalize(), Decimal('1.1')) + self.assertEqual(proxy.quantize(Decimal('1.10')), Decimal('1.10')) + def _check_iteration_of_dict_like(self, dict_like): from zope.security.proxy import Proxy from zope.security.checker import _default_checkers |