[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