[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