[CalendarServer-changes] [3800] CalendarServer/trunk/lib-patches/Twisted
source_changes at macosforge.org
source_changes at macosforge.org
Mon Mar 9 14:36:25 PDT 2009
Revision: 3800
http://trac.macosforge.org/projects/calendarserver/changeset/3800
Author: cdaboo at apple.com
Date: 2009-03-09 14:36:24 -0700 (Mon, 09 Mar 2009)
Log Message:
-----------
Make sure quota adjustment result is sane (not less than zero).
Modified Paths:
--------------
CalendarServer/trunk/lib-patches/Twisted/twisted.web2.dav.resource.patch
Added Paths:
-----------
CalendarServer/trunk/lib-patches/Twisted/twisted.web2.dav.test.data.quota_100.patch
CalendarServer/trunk/lib-patches/Twisted/twisted.web2.dav.test.test_quota.patch
CalendarServer/trunk/lib-patches/Twisted/twisted.web2.dav.test.util.patch
Modified: CalendarServer/trunk/lib-patches/Twisted/twisted.web2.dav.resource.patch
===================================================================
--- CalendarServer/trunk/lib-patches/Twisted/twisted.web2.dav.resource.patch 2009-03-06 03:40:42 UTC (rev 3799)
+++ CalendarServer/trunk/lib-patches/Twisted/twisted.web2.dav.resource.patch 2009-03-09 21:36:24 UTC (rev 3800)
@@ -789,7 +789,7 @@
"Not a meta-principal: %r" % (principal,)
)
-@@ -1517,6 +1589,270 @@
+@@ -1517,6 +1589,280 @@
return None
##
@@ -998,6 +998,8 @@
+ d = waitForDeferred(self.updateQuotaUse(request, adjust))
+ yield d
+ d.getResult()
++ yield None
++ return
+
+ # Check the next parent
+ url = request.urlForResource(self)
@@ -1050,7 +1052,15 @@
+ # Get current value
+ def _defer(size):
+ size += adjust
-+ self.writeDeadProperty(TwistedQuotaUsedProperty(str(size)))
++
++ # Sanity check the resulting size
++ if size > 0:
++ self.writeDeadProperty(TwistedQuotaUsedProperty(str(size)))
++ else:
++ # Remove the dead property and re-read to do brute force quota calc
++ log.msg("Attempt to set quota used to a negative value: %s (adjustment: %s)" % (size, adjust,))
++ self.removeDeadProperty(TwistedQuotaUsedProperty)
++ return self.currentQuotaUse(request)
+
+ d = self.currentQuotaUse(request)
+ d.addCallback(_defer)
@@ -1060,7 +1070,7 @@
# HTTP
##
-@@ -1525,15 +1861,11 @@
+@@ -1525,15 +1871,11 @@
#litmus = request.headers.getRawHeaders("x-litmus")
#if litmus: log.msg("*** Litmus test: %s ***" % (litmus,))
@@ -1078,7 +1088,7 @@
def setHeaders(response):
response = IResponse(response)
-@@ -1567,7 +1899,7 @@
+@@ -1567,7 +1909,7 @@
def findChildren(self, depth, request, callback, privileges=None, inherited_aces=None):
return succeed(None)
@@ -1087,7 +1097,7 @@
"""
Resource representing a WebDAV principal. (RFC 3744, section 2)
"""
-@@ -1577,7 +1909,7 @@
+@@ -1577,7 +1919,7 @@
# WebDAV
##
@@ -1096,7 +1106,7 @@
(dav_namespace, "alternate-URI-set"),
(dav_namespace, "principal-URL" ),
(dav_namespace, "group-member-set" ),
-@@ -1585,14 +1917,11 @@
+@@ -1585,14 +1927,11 @@
)
def davComplianceClasses(self):
@@ -1112,7 +1122,7 @@
def readProperty(self, property, request):
def defer():
if type(property) is tuple:
-@@ -1610,10 +1939,20 @@
+@@ -1610,10 +1949,20 @@
return davxml.PrincipalURL(davxml.HRef(self.principalURL()))
if name == "group-member-set":
@@ -1135,7 +1145,7 @@
if name == "resourcetype":
if self.isCollection():
-@@ -1655,7 +1994,7 @@
+@@ -1655,7 +2004,7 @@
principals. Subclasses should override this method to provide member
URLs for this resource if appropriate.
"""
@@ -1144,7 +1154,7 @@
def groupMemberships(self):
"""
-@@ -1666,6 +2005,7 @@
+@@ -1666,6 +2015,7 @@
"""
unimplemented(self)
@@ -1152,7 +1162,7 @@
def principalMatch(self, href):
"""
Check whether the supplied principal matches this principal or is a
-@@ -1675,10 +2015,33 @@
+@@ -1675,10 +2025,33 @@
"""
uri = str(href)
if self.principalURL() == uri:
@@ -1188,7 +1198,7 @@
class AccessDeniedError(Exception):
def __init__(self, errors):
"""
-@@ -1718,6 +2081,37 @@
+@@ -1718,6 +2091,37 @@
davxml.registerElement(TwistedACLInheritable)
davxml.ACE.allowed_children[(twisted_dav_namespace, "inheritable")] = (0, 1)
Added: CalendarServer/trunk/lib-patches/Twisted/twisted.web2.dav.test.data.quota_100.patch
===================================================================
--- CalendarServer/trunk/lib-patches/Twisted/twisted.web2.dav.test.data.quota_100.patch (rev 0)
+++ CalendarServer/trunk/lib-patches/Twisted/twisted.web2.dav.test.data.quota_100.patch 2009-03-09 21:36:24 UTC (rev 3800)
@@ -0,0 +1,15 @@
+Index: twisted/web2/dav/test/data/quota_100.txt
+===================================================================
+--- twisted/web2/dav/test/data/quota_100.txt (revision 0)
++++ twisted/web2/dav/test/data/quota_100.txt (revision 0)
+@@ -0,0 +1,10 @@
++123456789
++123456789
++123456789
++123456789
++123456789
++123456789
++123456789
++123456789
++123456789
++123456789
Added: CalendarServer/trunk/lib-patches/Twisted/twisted.web2.dav.test.test_quota.patch
===================================================================
--- CalendarServer/trunk/lib-patches/Twisted/twisted.web2.dav.test.test_quota.patch (rev 0)
+++ CalendarServer/trunk/lib-patches/Twisted/twisted.web2.dav.test.test_quota.patch 2009-03-09 21:36:24 UTC (rev 3800)
@@ -0,0 +1,206 @@
+Index: twisted/web2/dav/test/test_quota.py
+===================================================================
+--- twisted/web2/dav/test/test_quota.py (revision 0)
++++ twisted/web2/dav/test/test_quota.py (revision 0)
+@@ -0,0 +1,201 @@
++##
++# Copyright (c) 2005 Apple Computer, Inc. All rights reserved.
++#
++# Permission is hereby granted, free of charge, to any person obtaining a copy
++# of this software and associated documentation files (the "Software"), to deal
++# in the Software without restriction, including without limitation the rights
++# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
++# copies of the Software, and to permit persons to whom the Software is
++# furnished to do so, subject to the following conditions:
++#
++# The above copyright notice and this permission notice shall be included in all
++# copies or substantial portions of the Software.
++#
++# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
++# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
++# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
++# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
++# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
++# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
++# SOFTWARE.
++#
++# DRI: Wilfredo Sanchez, wsanchez at apple.com
++##
++
++from twisted.web2 import responsecode
++from twisted.web2.iweb import IResponse
++from twisted.web2.stream import FileStream
++
++import twisted.web2.dav.test.util
++from twisted.web2.test.test_server import SimpleRequest
++from twisted.web2.dav.test.util import Site
++from twisted.web2.dav import davxml
++import os
++
++class QuotaBase(twisted.web2.dav.test.util.TestCase):
++
++ def setUp(self):
++
++ #super(Quota, self).setUp()
++ self.docroot = self.mktemp()
++ os.mkdir(self.docroot)
++ rootresource = self.resource_class(self.docroot)
++ rootresource.setAccessControlList(self.grantInherit(davxml.All()))
++ self.site = Site(rootresource)
++ self.site.resource.setQuotaRoot(None, 100000)
++
++ def checkQuota(self, value):
++ def _defer(quota):
++ self.assertEqual(quota, value)
++
++ d = self.site.resource.currentQuotaUse(None)
++ d.addCallback(_defer)
++ return d
++
++class QuotaEmpty(QuotaBase):
++
++ def test_Empty_Quota(self):
++
++ return self.checkQuota(0)
++
++class QuotaPUT(QuotaBase):
++
++ def test_Quota_PUT(self):
++ """
++ Quota change on PUT
++ """
++ dst_uri = "/dst"
++
++ def checkResult(response):
++ response = IResponse(response)
++
++ if response.code != responsecode.CREATED:
++ self.fail("Incorrect response code for PUT (%s != %s)"
++ % (response.code, responsecode.CREATED))
++
++ return self.checkQuota(100)
++
++ request = SimpleRequest(self.site, "PUT", dst_uri)
++ request.stream = FileStream(file(os.path.join(os.path.dirname(__file__), "data", "quota_100.txt"), "rb"))
++ return self.send(request, checkResult)
++
++class QuotaDELETE(QuotaBase):
++
++ def test_Quota_DELETE(self):
++ """
++ Quota change on DELETE
++ """
++ dst_uri = "/dst"
++
++ def checkPUTResult(response):
++ response = IResponse(response)
++
++ if response.code != responsecode.CREATED:
++ self.fail("Incorrect response code for PUT (%s != %s)"
++ % (response.code, responsecode.CREATED))
++
++ def doDelete(_ignore):
++ def checkDELETEResult(response):
++ response = IResponse(response)
++
++ if response.code != responsecode.NO_CONTENT:
++ self.fail("Incorrect response code for PUT (%s != %s)"
++ % (response.code, responsecode.NO_CONTENT))
++
++ return self.checkQuota(0)
++
++ request = SimpleRequest(self.site, "DELETE", dst_uri)
++ return self.send(request, checkDELETEResult)
++
++ d = self.checkQuota(100)
++ d.addCallback(doDelete)
++ return d
++
++ request = SimpleRequest(self.site, "PUT", dst_uri)
++ request.stream = FileStream(file(os.path.join(os.path.dirname(__file__), "data", "quota_100.txt"), "rb"))
++ return self.send(request, checkPUTResult)
++
++class OverQuotaPUT(QuotaBase):
++
++ def test_Quota_PUT(self):
++ """
++ Quota change on PUT
++ """
++ dst_uri = "/dst"
++
++ self.site.resource.setQuotaRoot(None, 90)
++
++ def checkResult(response):
++ response = IResponse(response)
++
++ if response.code != responsecode.INSUFFICIENT_STORAGE_SPACE:
++ self.fail("Incorrect response code for PUT (%s != %s)"
++ % (response.code, responsecode.INSUFFICIENT_STORAGE_SPACE))
++
++ return self.checkQuota(0)
++
++ request = SimpleRequest(self.site, "PUT", dst_uri)
++ request.stream = FileStream(file(os.path.join(os.path.dirname(__file__), "data", "quota_100.txt"), "rb"))
++ return self.send(request, checkResult)
++
++class QuotaOKAdjustment(QuotaBase):
++
++ def test_Quota_OK_Adjustment(self):
++ """
++ Quota adjustment OK
++ """
++ dst_uri = "/dst"
++
++ def checkPUTResult(response):
++ response = IResponse(response)
++
++ if response.code != responsecode.CREATED:
++ self.fail("Incorrect response code for PUT (%s != %s)"
++ % (response.code, responsecode.CREATED))
++
++ def doOKAdjustment(_ignore):
++ def checkAdjustmentResult(_ignore):
++ return self.checkQuota(10)
++
++ d = self.site.resource.quotaSizeAdjust(None, -90)
++ d.addCallback(checkAdjustmentResult)
++ return d
++
++ d = self.checkQuota(100)
++ d.addCallback(doOKAdjustment)
++ return d
++
++ request = SimpleRequest(self.site, "PUT", dst_uri)
++ request.stream = FileStream(file(os.path.join(os.path.dirname(__file__), "data", "quota_100.txt"), "rb"))
++ return self.send(request, checkPUTResult)
++
++class QuotaBadAdjustment(QuotaBase):
++
++ def test_Quota_Bad_Adjustment(self):
++ """
++ Quota adjustment too much
++ """
++ dst_uri = "/dst"
++
++ def checkPUTResult(response):
++ response = IResponse(response)
++
++ if response.code != responsecode.CREATED:
++ self.fail("Incorrect response code for PUT (%s != %s)"
++ % (response.code, responsecode.CREATED))
++
++ def doBadAdjustment(_ignore):
++ def checkAdjustmentResult(_ignore):
++ return self.checkQuota(100)
++
++ d = self.site.resource.quotaSizeAdjust(None, -200)
++ d.addCallback(checkAdjustmentResult)
++ return d
++
++ d = self.checkQuota(100)
++ d.addCallback(doBadAdjustment)
++ return d
++
++ request = SimpleRequest(self.site, "PUT", dst_uri)
++ request.stream = FileStream(file(os.path.join(os.path.dirname(__file__), "data", "quota_100.txt"), "rb"))
++ return self.send(request, checkPUTResult)
Added: CalendarServer/trunk/lib-patches/Twisted/twisted.web2.dav.test.util.patch
===================================================================
--- CalendarServer/trunk/lib-patches/Twisted/twisted.web2.dav.test.util.patch (rev 0)
+++ CalendarServer/trunk/lib-patches/Twisted/twisted.web2.dav.test.util.patch 2009-03-09 21:36:24 UTC (rev 3800)
@@ -0,0 +1,20 @@
+Index: twisted/web2/dav/test/util.py
+===================================================================
+--- twisted/web2/dav/test/util.py (revision 19773)
++++ twisted/web2/dav/test/util.py (working copy)
+@@ -184,10 +184,11 @@
+ d.addCallback(lambda resource: resource.renderHTTP(request))
+ d.addCallback(request._cbFinishRender)
+
+- if type(callback) is tuple:
+- d.addCallbacks(*callback)
+- else:
+- d.addCallback(callback)
++ if callback:
++ if type(callback) is tuple:
++ d.addCallbacks(*callback)
++ else:
++ d.addCallback(callback)
+
+ return d
+
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.macosforge.org/pipermail/calendarserver-changes/attachments/20090309/ba4b522f/attachment-0001.html>
More information about the calendarserver-changes
mailing list