From: Michael D. <svn...@pl...> - 2008-07-16 23:20:54
|
Author: dunlapm Date: Wed Jul 16 23:21:02 2008 New Revision: 21697 Modified: ResourceRegistries/trunk/Products/ResourceRegistries/doc/HISTORY.txt ResourceRegistries/trunk/Products/ResourceRegistries/tests/testBaseRegistry.py ResourceRegistries/trunk/Products/ResourceRegistries/tools/BaseRegistry.py Log: Fixed error where non-traversable resources could be registered. This closes #8153. Modified: ResourceRegistries/trunk/Products/ResourceRegistries/doc/HISTORY.txt ============================================================================== --- ResourceRegistries/trunk/Products/ResourceRegistries/doc/HISTORY.txt (original) +++ ResourceRegistries/trunk/Products/ResourceRegistries/doc/HISTORY.txt Wed Jul 16 23:21:02 2008 @@ -1,6 +1,10 @@ 1.4.3 (SVN/unreleased) ====================== + * Fixed error where non-traversable resources could be registered. This closes + http://dev.plone.org/plone/ticket/8153 + [dunlapm] + * Ensure that resources can be removed in xml. [maurits] Modified: ResourceRegistries/trunk/Products/ResourceRegistries/tests/testBaseRegistry.py ============================================================================== --- ResourceRegistries/trunk/Products/ResourceRegistries/tests/testBaseRegistry.py (original) +++ ResourceRegistries/trunk/Products/ResourceRegistries/tests/testBaseRegistry.py Wed Jul 16 23:21:02 2008 @@ -1,5 +1,5 @@ import unittest -from Products.ResourceRegistries.tools.BaseRegistry import BaseRegistryTool +from Products.ResourceRegistries.tools.BaseRegistry import BaseRegistryTool, Resource class BaseRegistryTestCase(unittest.TestCase): def __init__(self): @@ -11,9 +11,27 @@ def testGenerateId(self): self.failIf('++' in self.registry.generateId('++resource++foobar.css')) self.failIf('/' in self.registry.generateId('++resource++foo/bar.css')) + + #Resources with double //'s in them aren't traversable. The page templates + # assume that no resource will have a '/' at the start or end, and won't + # have a '//' anywhere inside. A single '/' inside is fine. + def testTraversableResourceID(self): + ids = {'/bar.res': False, #expected to fail + 'bar.res' : True, #expected to pass + 'bar.//res' : False, #expected to fail + 'bar.res/' : False, #expected to fail + 'foo/bar.res' : True, #perfectly fine + } + for id in ids: + if ids[id]: #This shouldn't error + res = Resource(id) + else: #This should throw a ValueError + self.failUnlessRaises(ValueError,Resource,id) + self.assertRaises(ValueError,Resource,id) def runTest(self): self.testGenerateId() + self.testTraversableResourceID() def test_suite(): suite = unittest.TestSuite() Modified: ResourceRegistries/trunk/Products/ResourceRegistries/tools/BaseRegistry.py ============================================================================== --- ResourceRegistries/trunk/Products/ResourceRegistries/tools/BaseRegistry.py (original) +++ ResourceRegistries/trunk/Products/ResourceRegistries/tools/BaseRegistry.py Wed Jul 16 23:21:02 2008 @@ -71,6 +71,8 @@ def __init__(self, id, **kwargs): self._data = PersistentMapping() + if id.startswith('/') or id.endswith('/') or '//' in id: + raise ValueError, "Invalid Resource ID: %s" %id self._data['id'] = id self._data['expression'] = kwargs.get('expression', '') self._data['enabled'] = kwargs.get('enabled', True) |