[Zope-Checkins] SVN: Zope/branches/2.9/doc/CHANGES.txt Hmm, this never made it in. No matter, just set the SVN record straigt for future releases
Log message for revision 73720: Hmm, this never made it in. No matter, just set the SVN record straigt for future releases Changed: U Zope/branches/2.9/doc/CHANGES.txt -=- Modified: Zope/branches/2.9/doc/CHANGES.txt === --- Zope/branches/2.9/doc/CHANGES.txt 2007-03-27 12:32:02 UTC (rev 73719) +++ Zope/branches/2.9/doc/CHANGES.txt 2007-03-27 12:38:13 UTC (rev 73720) @@ -8,6 +8,10 @@ Bugs fixed + - Protected various security mutators with a new postonly decorator. +The decorator limits method publishing to POST requests only, and +is a backport from Zope 2.11's requestmethod decorator factory. + - Collector #2298: webdav.Resource.COPY and webdav.Resource.MOVE did not send the expected copy/move events. ___ Zope-Checkins maillist - Zope-Checkins@zope.org http://mail.zope.org/mailman/listinfo/zope-checkins
[Zope-Checkins] SVN: Zope/branches/2.9/ Collector #2300: delimit *all* headers with CRLF; accumulated_headers and appendHeader use \n for delimeters and never get corrected on output
Log message for revision 73721: Collector #2300: delimit *all* headers with CRLF; accumulated_headers and appendHeader use \n for delimeters and never get corrected on output Changed: U Zope/branches/2.9/doc/CHANGES.txt U Zope/branches/2.9/lib/python/ZServer/HTTPResponse.py U Zope/branches/2.9/lib/python/ZServer/tests/test_responses.py -=- Modified: Zope/branches/2.9/doc/CHANGES.txt === --- Zope/branches/2.9/doc/CHANGES.txt 2007-03-27 12:38:13 UTC (rev 73720) +++ Zope/branches/2.9/doc/CHANGES.txt 2007-03-27 12:43:31 UTC (rev 73721) @@ -4,6 +4,12 @@ Change information for previous versions of Zope can be found in the file HISTORY.txt. + Zope 2.9.8 (unreleased) + + Bugs fixed + + - Collector #2300: delimit *all* HTTP Response headers with CRLF. + Zope 2.9.7 (2007/03/25) Bugs fixed Modified: Zope/branches/2.9/lib/python/ZServer/HTTPResponse.py === --- Zope/branches/2.9/lib/python/ZServer/HTTPResponse.py2007-03-27 12:38:13 UTC (rev 73720) +++ Zope/branches/2.9/lib/python/ZServer/HTTPResponse.py2007-03-27 12:43:31 UTC (rev 73721) @@ -114,8 +114,15 @@ self._chunking=1 else: self.setHeader('Connection','close') + +headers = headers.items() +for line in self.accumulated_headers.splitlines(): +if line[0] == '\t': +headers[-1][1] += '\n' + line +continue +headers.append(line.split(': ', 1)) -for key, val in headers.items(): +for key, val in headers: if key.lower()==key: # only change non-literal header names key=%s%s % (key[:1].upper(), key[1:]) @@ -125,10 +132,13 @@ key=%s-%s%s % (key[:l],key[l+1:l+2].upper(),key[l+2:]) start=l+1 l=key.find('-',start) +val = val.replace('\n\t', '\r\n\t') append(%s: %s % (key, val)) if self.cookies: -headersl=headersl+self._cookie_list() -headersl[len(headersl):]=[self.accumulated_headers, body] +headersl.extend(self._cookie_list()) + +append('') +append(body) return \r\n.join(headersl) _tempfile=None @@ -151,6 +161,7 @@ + if type(data) != type(''): raise TypeError('Value must be a string') Modified: Zope/branches/2.9/lib/python/ZServer/tests/test_responses.py === --- Zope/branches/2.9/lib/python/ZServer/tests/test_responses.py 2007-03-27 12:38:13 UTC (rev 73720) +++ Zope/branches/2.9/lib/python/ZServer/tests/test_responses.py 2007-03-27 12:43:31 UTC (rev 73721) @@ -56,7 +56,7 @@ one = ZServerHTTPResponse(stdout=DummyChannel()) self.assertRaises(AssertionError, one.setBody, test_streamiterator()) - + class DummyChannel: def __init__(self): self.out = StringIO() @@ -92,8 +92,46 @@ return self.data raise StopIteration +class ZServerHTTPResponseTestCase(unittest.TestCase): +Test ZServer HTTPResponse object + +def _makeOne(self): +return ZServerHTTPResponse() + +def testToString(self): +response = self._makeOne() +response.headers = { +'content-type': 'text/plain', +'all-lower-case': 'foo', +'Title-Cased': 'bar', +'mixed-CasED': 'spam', +'multilined': 'eggs\n\tham'} +response.accumulated_headers = 'foo-bar: bar\n\tbaz\nFoo-bar: monty\n' +response.cookies = dict(foo=dict(value='bar')) +response.body = 'A body\nwith multiple lines\n' + +result = str(response) +headers, body = result.rsplit('\r\n\r\n') + +self.assertEqual(body, response.body) + +self.assertTrue(headers.startswith('HTTP/1.0 200 OK\r\n')) + +# 15 header lines all delimited by \r\n +self.assertEqual( +['\n' in line for line in headers.split('\r\n')], +15 * [False]) + +self.assertTrue('Multilined: eggs\r\n\tham\r\n' in headers) +self.assertTrue('Foo-Bar: bar\r\n\tbaz\r\n' in headers) + def test_suite(): -return unittest.makeSuite(ZServerResponseTestCase) +suite = unittest.TestSuite() +suite.addTests(( +unittest.makeSuite(ZServerResponseTestCase), +unittest.makeSuite(ZServerHTTPResponseTestCase) +)) +return suite if __name__ == __main__: unittest.main(defaultTest=test_suite) ___ Zope-Checkins maillist - Zope-Checkins@zope.org http://mail.zope.org/mailman/listinfo/zope-checkins
[Zope-Checkins] SVN: Zope/trunk/ Mark ZCatalog catalog brains with an interface
Log message for revision 73762: Mark ZCatalog catalog brains with an interface Changed: U Zope/trunk/doc/CHANGES.txt U Zope/trunk/lib/python/Products/ZCatalog/CatalogBrains.py U Zope/trunk/lib/python/Products/ZCatalog/interfaces.py -=- Modified: Zope/trunk/doc/CHANGES.txt === --- Zope/trunk/doc/CHANGES.txt 2007-03-27 14:34:19 UTC (rev 73761) +++ Zope/trunk/doc/CHANGES.txt 2007-03-27 14:36:38 UTC (rev 73762) @@ -51,6 +51,9 @@ Features added + - ZCatalog result objects (catalog brains) now have an interface, +ZCatalog.interfaces.ICatalogBrain. + - A new module, AccessControl.requestmethod, provides a decorator factory that limits decorated methods to one request method only. For example, marking a method with @requestmethod('POST') limits Modified: Zope/trunk/lib/python/Products/ZCatalog/CatalogBrains.py === --- Zope/trunk/lib/python/Products/ZCatalog/CatalogBrains.py2007-03-27 14:34:19 UTC (rev 73761) +++ Zope/trunk/lib/python/Products/ZCatalog/CatalogBrains.py2007-03-27 14:36:38 UTC (rev 73762) @@ -13,9 +13,13 @@ __version__ = $Revision$[11:-2] +from zope.interface import implements + import Acquisition, Record from ZODB.POSException import ConflictError +from interfaces import ICatalogBrain + # Switch for new behavior, raise exception instead of returning None. # Use 'catalog-getObject-raises off' in zope.conf to restore old behavior. GETOBJECT_RAISES = True @@ -25,6 +29,8 @@ required, and provides just enough smarts to let us get the URL, path, and cataloged object without having to ask the catalog directly. +implements(ICatalogBrain) + def has_key(self, key): return self.__record_schema__.has_key(key) Modified: Zope/trunk/lib/python/Products/ZCatalog/interfaces.py === --- Zope/trunk/lib/python/Products/ZCatalog/interfaces.py 2007-03-27 14:34:19 UTC (rev 73761) +++ Zope/trunk/lib/python/Products/ZCatalog/interfaces.py 2007-03-27 14:36:38 UTC (rev 73762) @@ -246,3 +246,37 @@ pghandler -- optional Progresshandler as defined in ProgressHandler.py (see also README.txt) + +# XXX This should inherit from an IRecord interface, if there ever is one. +class ICatalogBrain(Interface): +Catalog brain that handles looking up attributes as +required, and provides just enough smarts to let us get the URL, path, +and cataloged object without having to ask the catalog directly. + +def has_key(key): +Record has this field + +def getPath(): +Get the physical path for this record + +def getURL(relative=0): +Generate a URL for this record + +def _unrestrictedGetObject(): +Return the object for this record + +Same as getObject, but does not do security checks. + + +def getObject(): +Return the object for this record + +Will return None if the object cannot be found via its cataloged path +(i.e., it was deleted or moved without recataloging), or if the user is +not authorized to access the object. + + + +def getRID(): +Return the record ID for this object. + ___ Zope-Checkins maillist - Zope-Checkins@zope.org http://mail.zope.org/mailman/listinfo/zope-checkins
[Zope-Checkins] SVN: Zope/trunk/lib/python/Products/Five/browser/ Fix Collector #2264: browser:view should set __name__
Log message for revision 73766: Fix Collector #2264: browser:view should set __name__ Changed: U Zope/trunk/lib/python/Products/Five/browser/metaconfigure.py U Zope/trunk/lib/python/Products/Five/browser/tests/pages.txt U Zope/trunk/lib/python/Products/Five/browser/tests/pages.zcml -=- Modified: Zope/trunk/lib/python/Products/Five/browser/metaconfigure.py === --- Zope/trunk/lib/python/Products/Five/browser/metaconfigure.py 2007-03-27 14:57:27 UTC (rev 73765) +++ Zope/trunk/lib/python/Products/Five/browser/metaconfigure.py 2007-03-27 14:57:27 UTC (rev 73766) @@ -251,6 +251,7 @@ except: cname = GeneratedClass +cdict['__name__'] = name newclass = makeClass(cname, bases, cdict) _handle_for(_context, for_) Modified: Zope/trunk/lib/python/Products/Five/browser/tests/pages.txt === --- Zope/trunk/lib/python/Products/Five/browser/tests/pages.txt 2007-03-27 14:57:27 UTC (rev 73765) +++ Zope/trunk/lib/python/Products/Five/browser/tests/pages.txt 2007-03-27 14:57:27 UTC (rev 73766) @@ -85,8 +85,18 @@ self.folder.unrestrictedTraverse('testoid/@@new_style_class2') Products.Five.metaclass.NewStyleClass ... + +Both browser:view and browser:page are ILocation providers, so make sure they +have a __name__ attribute: + page = self.folder.unrestrictedTraverse('testoid/eagle.txt') + page.__name__ + u'eagle.txt' + view = self.folder.unrestrictedTraverse('testoid/named_view') + view.__name__ + u'named_view' + ZPT-based browser pages --- Modified: Zope/trunk/lib/python/Products/Five/browser/tests/pages.zcml === --- Zope/trunk/lib/python/Products/Five/browser/tests/pages.zcml 2007-03-27 14:57:27 UTC (rev 73765) +++ Zope/trunk/lib/python/Products/Five/browser/tests/pages.zcml 2007-03-27 14:57:27 UTC (rev 73766) @@ -218,6 +218,14 @@ permission=zope2.Public / + !-- A named view -- + browser:view + name=named_view + for=Products.Five.tests.testing.simplecontent.ISimpleContent + class=.pages.SimpleView + permission=zope2.Public + / + !-- XXX this should really be in Five.form.tests -- !-- protected edit form for permission check -- ___ Zope-Checkins maillist - Zope-Checkins@zope.org http://mail.zope.org/mailman/listinfo/zope-checkins
[Zope-Checkins] SVN: Products.Five/branches/1.3/browser/ Merge Collector #2264 fix from Zope trunk: browser:view should set __name__
Log message for revision 73768: Merge Collector #2264 fix from Zope trunk: browser:view should set __name__ Changed: U Products.Five/branches/1.3/browser/metaconfigure.py U Products.Five/branches/1.3/browser/tests/pages.txt U Products.Five/branches/1.3/browser/tests/pages.zcml -=- Modified: Products.Five/branches/1.3/browser/metaconfigure.py === --- Products.Five/branches/1.3/browser/metaconfigure.py 2007-03-27 14:58:44 UTC (rev 73767) +++ Products.Five/branches/1.3/browser/metaconfigure.py 2007-03-27 14:59:16 UTC (rev 73768) @@ -247,6 +247,7 @@ except: cname = GeneratedClass +cdict['__name__'] = name newclass = makeClass(cname, bases, cdict) _handle_for(_context, for_) Modified: Products.Five/branches/1.3/browser/tests/pages.txt === --- Products.Five/branches/1.3/browser/tests/pages.txt 2007-03-27 14:58:44 UTC (rev 73767) +++ Products.Five/branches/1.3/browser/tests/pages.txt 2007-03-27 14:59:16 UTC (rev 73768) @@ -85,8 +85,18 @@ self.folder.unrestrictedTraverse('testoid/@@new_style_class2') Products.Five.metaclass.NewStyleClass ... + +Both browser:view and browser:page are ILocation providers, so make sure they +have a __name__ attribute: + page = self.folder.unrestrictedTraverse('testoid/eagle.txt') + page.__name__ + u'eagle.txt' + view = self.folder.unrestrictedTraverse('testoid/named_view') + view.__name__ + u'named_view' + ZPT-based browser pages --- Modified: Products.Five/branches/1.3/browser/tests/pages.zcml === --- Products.Five/branches/1.3/browser/tests/pages.zcml 2007-03-27 14:58:44 UTC (rev 73767) +++ Products.Five/branches/1.3/browser/tests/pages.zcml 2007-03-27 14:59:16 UTC (rev 73768) @@ -218,6 +218,14 @@ permission=zope2.Public / + !-- A named view -- + browser:view + name=named_view + for=Products.Five.tests.testing.simplecontent.ISimpleContent + class=.pages.SimpleView + permission=zope2.Public + / + !-- XXX this should really be in Five.form.tests -- !-- protected edit form for permission check -- ___ Zope-Checkins maillist - Zope-Checkins@zope.org http://mail.zope.org/mailman/listinfo/zope-checkins