summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJens Vagelpohl <jens@netz.ooo>2021-03-17 14:10:18 +0100
committerJens Vagelpohl <jens@netz.ooo>2021-03-17 14:10:18 +0100
commiteccb8da2f8d1dddb34a49f266d9403c82b7daab4 (patch)
treed9ba73dd62e6466ba8afed037ab5bfa54fd6f5b2
parent72d06642b39087450d30b55238d46ac7aaa8e293 (diff)
downloadzope-component-eccb8da2f8d1dddb34a49f266d9403c82b7daab4.tar.gz
- respect permission value for utility factory registrations
-rw-r--r--CHANGES.rst3
-rw-r--r--src/zope/component/tests/test_zcml.py37
-rw-r--r--src/zope/component/zcml.py6
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),