summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJens Vagelpohl <jens@netz.ooo>2021-03-18 14:17:21 +0100
committerGitHub <noreply@github.com>2021-03-18 14:17:21 +0100
commit41cafd34b01555bc5c8bb7fe1b6181a7acf32fe7 (patch)
tree6f377e206f636a2b939d14aa40c5d261ce9e383e
parenta4f0c3e86a794fa510923352d1fdbc54e0f314e5 (diff)
parent2ad449196bceb8b937cb11a561b9a5f436d1b35a (diff)
downloadzope-component-41cafd34b01555bc5c8bb7fe1b6181a7acf32fe7.tar.gz
Merge pull request #55 from zopefoundation/dataflake/issue_54
Respect permission value for utility factory registrations
-rw-r--r--CHANGES.rst5
-rw-r--r--setup.py2
-rw-r--r--src/zope/component/tests/test_zcml.py37
-rw-r--r--src/zope/component/zcml.py6
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
diff --git a/setup.py b/setup.py
index a6a1520..8a5c877 100644
--- a/setup.py
+++ b/setup.py
@@ -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),