[CMF-checkins] SVN: CMF/trunk/C Forward-port fix for #380 from 2.0 branch.

Tres Seaver tseaver at palladion.com
Mon Sep 4 17:18:42 EDT 2006


Log message for revision 69962:
  Forward-port fix for #380 from 2.0 branch.

Changed:
  U   CMF/trunk/CHANGES.txt
  U   CMF/trunk/CMFCore/CatalogTool.py
  U   CMF/trunk/CMFCore/tests/test_CatalogTool.py

-=-
Modified: CMF/trunk/CHANGES.txt
===================================================================
--- CMF/trunk/CHANGES.txt	2006-09-04 21:15:57 UTC (rev 69961)
+++ CMF/trunk/CHANGES.txt	2006-09-04 21:18:41 UTC (rev 69962)
@@ -15,7 +15,9 @@
 
   Bug Fixes
 
-    -
+    - CMFCore.CatalogTool: Use current executable's proxy roles, if any,
+      in place of user's roles when computing 'allowedRolesAndUsers' for
+      a query.
 
   Others
 

Modified: CMF/trunk/CMFCore/CatalogTool.py
===================================================================
--- CMF/trunk/CMFCore/CatalogTool.py	2006-09-04 21:15:57 UTC (rev 69961)
+++ CMF/trunk/CMFCore/CatalogTool.py	2006-09-04 21:18:41 UTC (rev 69962)
@@ -16,6 +16,7 @@
 """
 
 from AccessControl import ClassSecurityInfo
+from AccessControl import getSecurityManager
 from AccessControl.PermissionRole import rolesForPermissionOn
 from Acquisition import aq_base
 from DateTime import DateTime
@@ -143,7 +144,14 @@
     #
 
     def _listAllowedRolesAndUsers(self, user):
-        result = list( user.getRoles() )
+        effective_roles = user.getRoles()
+        sm = getSecurityManager()
+        if sm.calledByExecutable():
+            eo = sm._context.stack[-1]
+            proxy_roles = getattr(eo, '_proxy_roles', None)
+            if proxy_roles is not None:
+                effective_roles = proxy_roles
+        result = list( effective_roles )
         result.append( 'Anonymous' )
         result.append( 'user:%s' % user.getId() )
         return result

Modified: CMF/trunk/CMFCore/tests/test_CatalogTool.py
===================================================================
--- CMF/trunk/CMFCore/tests/test_CatalogTool.py	2006-09-04 21:15:57 UTC (rev 69961)
+++ CMF/trunk/CMFCore/tests/test_CatalogTool.py	2006-09-04 21:18:41 UTC (rev 69962)
@@ -19,6 +19,7 @@
 import Testing
 
 from AccessControl.SecurityManagement import newSecurityManager
+from AccessControl.SecurityManagement import noSecurityManager
 from DateTime import DateTime
 
 from Products.CMFCore.tests.base.dummy import DummyContent
@@ -127,6 +128,13 @@
         user = OmnipotentUser().__of__(self.root)
         newSecurityManager(None, user)
 
+    def setupProxyRoles(self, *proxy_roles):
+        from AccessControl import getSecurityManager
+        class FauxExecutable:
+            _proxy_roles = proxy_roles
+        sm = getSecurityManager()
+        sm.addContext(FauxExecutable())
+
     def test_processActions(self):
         """
             Tracker #405:  CatalogTool doesn't accept optional third
@@ -148,6 +156,56 @@
         self.assertEqual(1, len(catalog._catalog.searchResults()))
         self.assertEqual(0, len(catalog.searchResults()))
 
+    def test_search_member_with_valid_roles(self):
+        catalog = self._makeOne()
+        catalog.addIndex('allowedRolesAndUsers', 'KeywordIndex')
+        dummy = DummyContent(catalog=1)
+        dummy._View_Permission = ('Blob',)
+        catalog.catalog_object(dummy, '/dummy')
+
+        self.loginWithRoles('Blob')
+
+        self.assertEqual(1, len(catalog._catalog.searchResults()))
+        self.assertEqual(1, len(catalog.searchResults()))
+
+    def test_search_member_with_valid_roles_but_proxy_roles_limit(self):
+        catalog = self._makeOne()
+        catalog.addIndex('allowedRolesAndUsers', 'KeywordIndex')
+        dummy = DummyContent(catalog=1)
+        dummy._View_Permission = ('Blob',)
+        catalog.catalog_object(dummy, '/dummy')
+
+        self.loginWithRoles('Blob')
+        self.setupProxyRoles('Waggle')
+
+        self.assertEqual(1, len(catalog._catalog.searchResults()))
+        self.assertEqual(0, len(catalog.searchResults()))
+
+    def test_search_member_wo_valid_roles(self):
+        catalog = self._makeOne()
+        catalog.addIndex('allowedRolesAndUsers', 'KeywordIndex')
+        dummy = DummyContent(catalog=1)
+        dummy._View_Permission = ('Blob',)
+        catalog.catalog_object(dummy, '/dummy')
+
+        self.loginWithRoles('Waggle')
+
+        self.assertEqual(1, len(catalog._catalog.searchResults()))
+        self.assertEqual(0, len(catalog.searchResults()))
+
+    def test_search_member_wo_valid_roles_but_proxy_roles_allow(self):
+        catalog = self._makeOne()
+        catalog.addIndex('allowedRolesAndUsers', 'KeywordIndex')
+        dummy = DummyContent(catalog=1)
+        dummy._View_Permission = ('Blob',)
+        catalog.catalog_object(dummy, '/dummy')
+
+        self.loginWithRoles('Waggle')
+        self.setupProxyRoles('Blob')
+
+        self.assertEqual(1, len(catalog._catalog.searchResults()))
+        self.assertEqual(1, len(catalog.searchResults()))
+
     def test_search_inactive(self):
         catalog = self._makeOne()
         catalog.addIndex('allowedRolesAndUsers', 'KeywordIndex')



More information about the CMF-checkins mailing list