[Checkins] SVN: grok/trunk/ Fix permission registration order problems.

Martijn Faassen faassen at infrae.com
Wed Apr 16 13:04:45 EDT 2008


Log message for revision 85441:
  Fix permission registration order problems.
  

Changed:
  U   grok/trunk/CHANGES.txt
  U   grok/trunk/src/grok/meta.py
  A   grok/trunk/src/grok/tests/security/missing_permission_json3.py
  U   grok/trunk/src/grok/tests/security/missing_permission_xmlrpc3.py

-=-
Modified: grok/trunk/CHANGES.txt
===================================================================
--- grok/trunk/CHANGES.txt	2008-04-16 15:13:30 UTC (rev 85440)
+++ grok/trunk/CHANGES.txt	2008-04-16 17:04:44 UTC (rev 85441)
@@ -89,6 +89,11 @@
 * Fix https://bugs.launchpad.net/grok/+bug/187590 where config action
   discriminators for permission and role registrations were incorrect.
 
+* Permission definitions received the wrong, too high, configure
+  action priority (not to be confused with grokker priority). In some
+  cases this caused permissions to be defined later than they were
+  used. Use a low action priority instead for permissions.
+
 Restructuring
 -------------
 

Modified: grok/trunk/src/grok/meta.py
===================================================================
--- grok/trunk/src/grok/meta.py	2008-04-16 15:13:30 UTC (rev 85440)
+++ grok/trunk/src/grok/meta.py	2008-04-16 17:04:44 UTC (rev 85441)
@@ -50,7 +50,8 @@
 
 import grok
 from grok import components, formlib, templatereg
-from grok.util import check_adapts, get_default_permission, make_checker
+from grok.util import check_adapts, get_default_permission
+from grok.util import check_permission, make_checker
 from grok.util import check_module_component, determine_module_component
 from grok.util import determine_class_component
 from grok.util import determine_class_directive, public_methods_from_class
@@ -154,7 +155,6 @@
             )
         return True
 
-
 class XMLRPCGrokker(martian.ClassGrokker):
     component_class = grok.XMLRPC
 
@@ -164,7 +164,16 @@
         methods = public_methods_from_class(factory)
 
         default_permission = get_default_permission(factory)
-
+        
+        # make sure we issue an action to check whether this permission
+        # exists. That's the only thing that action does
+        if default_permission is not None:
+            config.action(
+                discriminator=None,
+                callable=check_permission,
+                args=(factory, default_permission)
+                ) 
+        
         for method in methods:
             name = method.__name__
 
@@ -204,7 +213,15 @@
         methods = public_methods_from_class(factory)
 
         default_permission = get_default_permission(factory)
-
+        # make sure we issue an action to check whether this permission
+        # exists. That's the only thing that action does
+        if default_permission is not None:
+            config.action(
+                discriminator=None,
+                callable=check_permission,
+                args=(factory, default_permission)
+                ) 
+ 
         # grab layer from class or module
         view_layer = determine_class_directive('grok.layer', factory,
                                                module_info,
@@ -323,6 +340,14 @@
         methods = public_methods_from_class(factory)
 
         default_permission = get_default_permission(factory)
+        # make sure we issue an action to check whether this permission
+        # exists. That's the only thing that action does
+        if default_permission is not None:
+            config.action(
+                discriminator=None,
+                callable=check_permission,
+                args=(factory, default_permission)
+                ) 
 
         for method in methods:
             # The grok.JSON component inherits methods from its baseclass
@@ -696,7 +721,7 @@
             discriminator=('utility', IPermission, id),
             callable=component.provideUtility,
             args=(permission, IPermission, id),
-            order=self.priority
+            order=0 # need to do this early in the process
             )
         return True
 

Added: grok/trunk/src/grok/tests/security/missing_permission_json3.py
===================================================================
--- grok/trunk/src/grok/tests/security/missing_permission_json3.py	                        (rev 0)
+++ grok/trunk/src/grok/tests/security/missing_permission_json3.py	2008-04-16 17:04:44 UTC (rev 85441)
@@ -0,0 +1,27 @@
+"""
+Make sure we get an error for a missing permission even if that permission
+isn't actually used (as there are more specific permissions)::
+
+  >>> grok.testing.grok(__name__)
+  Traceback (most recent call last):
+    ...
+  ConfigurationExecutionError: martian.error.GrokError: Undefined permission
+  'doesnt.exist' in ...
+
+"""
+
+import grok
+import zope.interface
+
+class Permission(grok.Permission):
+    grok.name('json.exists')
+
+class MissingPermission(grok.JSON):
+    grok.context(zope.interface.Interface)
+
+    grok.require('doesnt.exist')
+    
+    @grok.require('json.exists')
+    def foo(self):
+        pass
+

Modified: grok/trunk/src/grok/tests/security/missing_permission_xmlrpc3.py
===================================================================
--- grok/trunk/src/grok/tests/security/missing_permission_xmlrpc3.py	2008-04-16 15:13:30 UTC (rev 85440)
+++ grok/trunk/src/grok/tests/security/missing_permission_xmlrpc3.py	2008-04-16 17:04:44 UTC (rev 85441)
@@ -6,7 +6,7 @@
   >>> grok.testing.grok(__name__)
   Traceback (most recent call last):
    ...
-  ConfigurationExecutionError: martian.error.GrokError: Undefined permission 'foo' in <class 'grok.tests.security.missing_permission_xmlrpc3.MissingPermission'>. Use grok.Permission first.
+  ConfigurationExecutionError: martian.error.GrokError: Undefined permission 'doesnt.exist' in <class 'grok.tests.security.missing_permission_xmlrpc3.MissingPermission'>. Use grok.Permission first.
   ...
 
 """



More information about the Checkins mailing list