diff options
author | Jens Vagelpohl <jens@netz.ooo> | 2021-03-17 14:10:18 +0100 |
---|---|---|
committer | Jens Vagelpohl <jens@netz.ooo> | 2021-03-17 14:10:18 +0100 |
commit | eccb8da2f8d1dddb34a49f266d9403c82b7daab4 (patch) | |
tree | d9ba73dd62e6466ba8afed037ab5bfa54fd6f5b2 | |
parent | 72d06642b39087450d30b55238d46ac7aaa8e293 (diff) | |
download | zope-component-eccb8da2f8d1dddb34a49f266d9403c82b7daab4.tar.gz |
- respect permission value for utility factory registrations
-rw-r--r-- | CHANGES.rst | 3 | ||||
-rw-r--r-- | src/zope/component/tests/test_zcml.py | 37 | ||||
-rw-r--r-- | src/zope/component/zcml.py | 6 |
3 files changed, 44 insertions, 2 deletions
diff --git a/CHANGES.rst b/CHANGES.rst index b440708..ea25e7f 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -5,7 +5,8 @@ 4.6.3 (unreleased) ================== -- Nothing changed yet. +- Respect permission value for utility factory registrations + (`#54 <https://github.com/zopefoundation/zope.component/issues/54>`_) 4.6.2 (2020-07-03) diff --git a/src/zope/component/tests/test_zcml.py b/src/zope/component/tests/test_zcml.py index 42de3e7..bb92da4 100644 --- a/src/zope/component/tests/test_zcml.py +++ b/src/zope/component/tests/test_zcml.py @@ -801,6 +801,43 @@ class Test_utility(unittest.TestCase): self.assertEqual(action['discriminator'], None) self.assertEqual(action['args'], ('', IFoo)) + @skipIfNoSecurity + def test_w_factory_w_provides_w_permission(self): + from zope.interface import Interface + from zope.component.interface import provideInterface + from zope.component.zcml import handler + class IFoo(Interface): + pass + class Foo(object): + pass + _cfg_ctx = _makeConfigContext() + self._callFUT(_cfg_ctx, factory=Foo, + provides=IFoo, permission='testing') + self.assertEqual(len(_cfg_ctx._actions), 2) + self.assertEqual(_cfg_ctx._actions[0][0], ()) + # Register the utility + action =_cfg_ctx._actions[0][1] + self.assertEqual(action['callable'], handler) + self.assertEqual(action['discriminator'], ('utility', IFoo, '')) + self.assertEqual(action['args'][0], 'registerUtility') + self.assertEqual(action['args'][1], None) + self.assertEqual(action['args'][2], IFoo) + self.assertEqual(action['args'][3], '') + self.assertEqual(action['args'][4], 'TESTING') + fctry = action['kw']['factory'] + # Factory is wrapped + self.assertNotEqual(fctry, Foo) + self.assertEqual(fctry.factory, Foo) + secured = fctry() + self.assertIsInstance(secured, Foo) + # Register the provided interface + self.assertEqual(_cfg_ctx._actions[1][0], ()) + action =_cfg_ctx._actions[1][1] + self.assertEqual(action['callable'], provideInterface) + self.assertEqual(action['discriminator'], None) + self.assertEqual(action['args'], ('', IFoo)) + + class Test_interface(unittest.TestCase): def _callFUT(self, *args, **kw): diff --git a/src/zope/component/zcml.py b/src/zope/component/zcml.py index bfaab20..7f9d999 100644 --- a/src/zope/component/zcml.py +++ b/src/zope/component/zcml.py @@ -392,7 +392,11 @@ def utility(_context, provides=None, component=None, factory=None, name = getName(component) if permission is not None: - component = proxify(component, provides=provides, permission=permission) + if component: + component = proxify(component, provides=provides, + permission=permission) + if factory: + factory = protectedFactory(factory, provides, permission) _context.action( discriminator = ('utility', provides, name), |