diff options
author | Jens Vagelpohl <jens@netz.ooo> | 2021-03-18 14:17:21 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2021-03-18 14:17:21 +0100 |
commit | 41cafd34b01555bc5c8bb7fe1b6181a7acf32fe7 (patch) | |
tree | 6f377e206f636a2b939d14aa40c5d261ce9e383e | |
parent | a4f0c3e86a794fa510923352d1fdbc54e0f314e5 (diff) | |
parent | 2ad449196bceb8b937cb11a561b9a5f436d1b35a (diff) | |
download | zope-component-41cafd34b01555bc5c8bb7fe1b6181a7acf32fe7.tar.gz |
Merge pull request #55 from zopefoundation/dataflake/issue_54
Respect permission value for utility factory registrations
-rw-r--r-- | CHANGES.rst | 5 | ||||
-rw-r--r-- | setup.py | 2 | ||||
-rw-r--r-- | src/zope/component/tests/test_zcml.py | 37 | ||||
-rw-r--r-- | src/zope/component/zcml.py | 6 |
4 files changed, 47 insertions, 3 deletions
diff --git a/CHANGES.rst b/CHANGES.rst index f586db3..84a0faa 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -2,9 +2,12 @@ Changes ========= -4.7.0 (unreleased) +5.0.0 (unreleased) ================== +- Respect permission value for utility factory registrations + (`#54 <https://github.com/zopefoundation/zope.component/issues/54>`_) + - Add support for Python 3.9 @@ -62,7 +62,7 @@ def read(*rnames): setup( name='zope.component', - version='4.7.0.dev0', + version='5.0.0.dev0', url='https://github.com/zopefoundation/zope.component', project_urls={ 'Documentation': 'https://zopecomponent.readthedocs.io/', 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..e3d040b 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), |