[Zope-Checkins] CVS: Zope3/lib/python/Zope/App/ContentDirective - ContentDirective.py:1.3 meta.zcml:1.2

Jim Fulton jim@zope.com
Thu, 20 Jun 2002 11:55:17 -0400


Update of /cvs-repository/Zope3/lib/python/Zope/App/ContentDirective
In directory cvs.zope.org:/tmp/cvs-serv15462/lib/python/Zope/App/ContentDirective

Modified Files:
	ContentDirective.py meta.zcml 
Log Message:
implemented:

http://dev.zope.org/Wikis/DevSite/Projects/ComponentArchitecture/MergeSecurityIntoZopeNamespace

While I was at it, I couldn't resist implementing a variation of:

http://dev.zope.org/Wikis/DevSite/Projects/ComponentArchitecture/SecurityPackageReorg

which was a lot more work. 



=== Zope3/lib/python/Zope/App/ContentDirective/ContentDirective.py 1.2 => 1.3 ===
 from Zope.Configuration.ConfigurationDirectiveInterfaces \
      import INonEmptyDirective
+from Zope.Configuration.Exceptions import ConfigurationError
 from Zope.Configuration.Action import Action
 import Interface
 
@@ -56,28 +57,37 @@
             ]
 
     def require(self, _context,
-                permission, attributes=None, interface=None):
+                permission=None, attributes=None, interface=None,
+                like_class=None):
         """Require a the permission to access a specific aspect"""
 
-        r = []
+        if like_class:
+            r = self.__mimic(_context, like_class)
+        else:
+            r = []
 
         if not (interface or attributes):
-            # XXX: perhaps raise an error here, as no interface or attributes
-            #      were given
-            return r
+            if r:
+                return r
+            raise ConfigurationError("Nothing required")
+
+        if not permission:
+            raise ConfigurationError("No permission specified")
+            
 
         if interface:
             self.__protectByInterface(interface, permission, r)
         if attributes:
             self.__protectNames(attributes, permission, r)
 
+
         return r
         
-    def mimic(self, _context, class_):
+    def __mimic(self, _context, class_):
         """Base security requirements on those of the given class"""
         class_to_mimic = _context.resolve(class_)
         return [
-            Action(discriminator=('security:mimic', self.__class, object()),
+            Action(discriminator=('mimic', self.__class, object()),
                    callable=protectLikeUnto,
                    args=(self.__class, class_to_mimic),
                    )
@@ -128,7 +138,7 @@
     def __protectName(self, name, permission_id, r):
         "Set a permission on a particular name."
         r.append((
-            ('security:protectName', self.__class, name),
+            ('protectName', self.__class, name),
             protectName, (self.__class, name, permission_id)))
             
     def __protectNames(self, names, permission_id, r):


=== Zope3/lib/python/Zope/App/ContentDirective/meta.zcml 1.1 => 1.2 ===
       <subdirective name="implements"
                     attributes="interface" />
-      <subdirective namespace="http://namespaces.zope.org/security"
-                    name="require"
-                    attributes="permission attributes interface" />
-      <subdirective namespace="http://namespaces.zope.org/security"
-                    name="allow"
+      <subdirective name="require"
+                    attributes="permission attributes interface like_class" />
+      <subdirective name="allow"
                     attributes="attributes interface" />
-      <subdirective namespace="http://namespaces.zope.org/security"
-                    name="mimic"
-                    attributes="class" />
       <subdirective namespace="http://namespaces.zope.org/zmi"
                     name="factory"
                     attributes="id permission title description