[Checkins] SVN: AccessControl/branches/2.13/ Backport `rolesForPermissionOn` fix from trunk
Hano Schlichting
cvs-admin at zope.org
Thu Aug 23 14:17:12 UTC 2012
Log message for revision 127553:
Backport `rolesForPermissionOn` fix from trunk
Changed:
U AccessControl/branches/2.13/CHANGES.txt
U AccessControl/branches/2.13/src/AccessControl/ZopeSecurityPolicy.py
U AccessControl/branches/2.13/src/AccessControl/tests/testZopeSecurityPolicy.py
-=-
Modified: AccessControl/branches/2.13/CHANGES.txt
===================================================================
--- AccessControl/branches/2.13/CHANGES.txt 2012-08-23 14:07:16 UTC (rev 127552)
+++ AccessControl/branches/2.13/CHANGES.txt 2012-08-23 14:17:08 UTC (rev 127553)
@@ -4,6 +4,8 @@
2.13.9 (unreleased)
-------------------
+- Fix a bug in ZopeSecurityPolicy.py. Global variable `rolesForPermissionOn`
+ could be overridden if `__role__` had custom rolesForPermissionOn.
2.13.8 (2012-06-22)
-------------------
Modified: AccessControl/branches/2.13/src/AccessControl/ZopeSecurityPolicy.py
===================================================================
--- AccessControl/branches/2.13/src/AccessControl/ZopeSecurityPolicy.py 2012-08-23 14:07:16 UTC (rev 127552)
+++ AccessControl/branches/2.13/src/AccessControl/ZopeSecurityPolicy.py 2012-08-23 14:17:08 UTC (rev 127553)
@@ -51,9 +51,10 @@
if roles is None or isinstance(roles, tuple_or_list):
return roles
-
- rolesForPermissionOn = getattr(roles, 'rolesForPermissionOn', None)
- if rolesForPermissionOn is not None:
- roles = rolesForPermissionOn(value)
+ # Do not override global variable `rolesForPermissionOn`.
+ roles_rolesForPermissionOn = getattr(roles, 'rolesForPermissionOn', None)
+ if roles_rolesForPermissionOn is not None:
+ roles = roles_rolesForPermissionOn(value)
+
return roles
Modified: AccessControl/branches/2.13/src/AccessControl/tests/testZopeSecurityPolicy.py
===================================================================
--- AccessControl/branches/2.13/src/AccessControl/tests/testZopeSecurityPolicy.py 2012-08-23 14:07:16 UTC (rev 127552)
+++ AccessControl/branches/2.13/src/AccessControl/tests/testZopeSecurityPolicy.py 2012-08-23 14:17:08 UTC (rev 127553)
@@ -10,10 +10,9 @@
# FOR A PARTICULAR PURPOSE
#
##############################################################################
-"""Tests of ZopeSecurityPolicy
-"""
import sys
+import thread
import unittest
from Acquisition import Implicit, Explicit
@@ -570,9 +569,58 @@
from doctest import DocTestSuite
+class GetRolesWithMultiThreadTest(unittest.TestCase):
+
+ def setUp(self):
+ self._original_check_interval = sys.getcheckinterval()
+ sys.setcheckinterval(1)
+
+ def tearDown(self):
+ sys.setcheckinterval(self._original_check_interval)
+
+ def testGetRolesWithMultiThread(self):
+ from AccessControl.ZopeSecurityPolicy import getRoles
+
+ class C(object):
+ pass
+
+ class V1(object):
+ class __roles__(object):
+ @staticmethod
+ def rolesForPermissionOn(ob):
+ return ['Member']
+
+ class V2(object):
+ class __roles__(object):
+ @staticmethod
+ def rolesForPermissionOn(ob):
+ return ['User']
+
+ c = C()
+ c.v1 = V1()
+ c.v2 = V2()
+
+ self.assertEqual(getRoles(c, None, c.v1, 42), ['Member'])
+ self.assertEqual(getRoles(c, None, c.v2, 42), ['User'])
+ mark = []
+
+ def loop():
+ while 1:
+ getRoles(c, None, c.v2, 42)
+ if len(mark) > 0:
+ return
+ thread.start_new_thread(loop, ())
+ try:
+ for i in range(1000):
+ self.assertEqual(getRoles(c, None, c.v1, 42), ['Member'])
+ finally:
+ mark.append(None)
+
+
def test_suite():
suite = unittest.TestSuite()
suite.addTest(unittest.makeSuite(Python_ZSPTests, 'test'))
suite.addTest(unittest.makeSuite(C_ZSPTests, 'test'))
suite.addTest(DocTestSuite())
+ suite.addTest(unittest.makeSuite(GetRolesWithMultiThreadTest))
return suite
More information about the checkins
mailing list