[z3-checkins] r5210 - in z3/Five/trunk: . handlers

faassen at codespeak.net faassen at codespeak.net
Mon Jun 21 19:49:39 MEST 2004


Author: faassen
Date: Mon Jun 21 19:49:38 2004
New Revision: 5210

Removed:
   z3/Five/trunk/handlers/
Modified:
   z3/Five/trunk/fiveconfigure.py
   z3/Five/trunk/meta.zcml
   z3/Five/trunk/metaconfigure.py
Log:
Move stuff in handlers into metaconfigure.


Modified: z3/Five/trunk/fiveconfigure.py
==============================================================================
--- z3/Five/trunk/fiveconfigure.py	(original)
+++ z3/Five/trunk/fiveconfigure.py	Mon Jun 21 19:49:38 2004
@@ -22,7 +22,7 @@
 from api import BrowserView
 from metaclass import makeClass
 from security.permission import getSecurityInfo, CheckerPublic
-from handlers.content import protectName, initializeClass
+from metaconfigure import protectName, initializeClass
 
 #def handler(serviceName, methodName, *args, **kwargs):
 #    method=getattr(getService(serviceName), methodName)

Modified: z3/Five/trunk/meta.zcml
==============================================================================
--- z3/Five/trunk/meta.zcml	(original)
+++ z3/Five/trunk/meta.zcml	Mon Jun 21 19:49:38 2004
@@ -42,7 +42,7 @@
     <meta:complexDirective
         name="content"
         schema="zope.app.component.metadirectives.IClassDirective"
-        handler=".handlers.content.ContentDirective"
+        handler=".metaconfigure.ContentDirective"
         >
 
       <meta:subdirective

Modified: z3/Five/trunk/metaconfigure.py
==============================================================================
--- z3/Five/trunk/metaconfigure.py	(original)
+++ z3/Five/trunk/metaconfigure.py	Mon Jun 21 19:49:38 2004
@@ -20,6 +20,18 @@
 from provideinterface import provideInterface
 from zope.app.security.permission import Permission
 from zope.app.security.interfaces import IPermission
+from types import ModuleType
+from zope.interface import classImplements
+from zope.configuration.exceptions import ConfigurationError
+from zope.component import getUtility
+from zope.app.security.interfaces import IPermission
+
+# Zope 2 stuff
+from AccessControl import ClassSecurityInfo
+from Globals import InitializeClass
+
+CheckerPublic = 'zope.Public'
+CheckerPrivate = 'zope.Private'
 
 def handler(serviceName, methodName, *args, **kwargs):
     method=getattr(getService(serviceName), methodName)
@@ -133,3 +145,91 @@
     permission = Permission(id, title, description)
     utility(_context, IPermission, permission, name=id)
 
+class ContentDirective:
+
+    def __init__(self, _context, class_):
+        self.__class = class_
+        if isinstance(self.__class, ModuleType):
+            raise ConfigurationError('Content class attribute must be a class')
+        self.__context = _context
+
+    def implements(self, _context, interface):
+        for interface in interface:
+            _context.action(
+                discriminator = (
+                'five::directive:content', self.__class, object()),
+                callable = classImplements,
+                args = (self.__class, interface),
+                )
+            interface(_context, interface)
+
+    def require(self, _context, permission=None,
+                attributes=None, interface=None):
+        """Require a the permission to access a specific aspect"""
+
+        if not (interface or attributes):
+            raise ConfigurationError("Nothing required")
+
+        if interface:
+            for i in interface:
+                if i:
+                    self.__protectByInterface(i, permission)
+        if attributes:
+            self.__protectNames(attributes, permission)
+
+    def allow(self, _context, attributes=None, interface=None):
+        """Like require, but with permission_id zope.Public"""
+        return self.require(_context, CheckerPublic, attributes, interface)
+
+    def __protectByInterface(self, interface, permission_id):
+        "Set a permission on names in an interface."
+        for n, d in interface.namesAndDescriptions(1):
+            self.__protectName(n, permission_id)
+        interface(self.__context, interface)
+
+    def __protectName(self, name, permission_id):
+        "Set a permission on a particular name."
+        self.__context.action(
+            discriminator = ('five:protectName', self.__class, name),
+            callable = protectName,
+            args = (self.__class, name, permission_id)
+            )
+
+    def __protectNames(self, names, permission_id):
+        "Set a permission on a bunch of names."
+        for name in names:
+            self.__protectName(name, permission_id)
+
+    def __call__(self):
+        "Handle empty/simple declaration."
+        return self.__context.action(
+            discriminator = ('five:initialize:class', self.__class),
+            callable = initializeClass,
+            args = (self.__class,)
+            )
+
+def initializeClass(klass):
+    InitializeClass(klass)
+
+def _getSecurity(klass):
+    info = vars(klass)
+    for k, v in info.items():
+        if hasattr(v, '__security_info__'):
+            return v
+    security = ClassSecurityInfo()
+    setattr(klass, '__security__', security)
+    return security
+
+def protectName(klass, name, permission_id):
+    security = _getSecurity(klass)
+    # Zope 2 uses string, not unicode yet
+    name = str(name)
+    if permission_id == CheckerPublic:
+        security.declarePublic(name)
+    elif permission_id == CheckerPrivate:
+        security.declarePrivate(name)
+    else:
+        permission = getUtility(IPermission, name=permission_id)
+        # Zope 2 uses string, not unicode yet
+        perm = str(permission.title)
+        security.declareProtected(perm, name)


More information about the z3-checkins mailing list