[CalendarServer-changes] [5372] CalendarServer/trunk

source_changes at macosforge.org source_changes at macosforge.org
Sat Mar 20 11:36:41 PDT 2010


Revision: 5372
          http://trac.macosforge.org/projects/calendarserver/changeset/5372
Author:   wsanchez at apple.com
Date:     2010-03-20 11:36:39 -0700 (Sat, 20 Mar 2010)
Log Message:
-----------
Merge matchPrincipal in extentions.py up to the main class.

Modified Paths:
--------------
    CalendarServer/trunk/twext/web2/dav/resource.py
    CalendarServer/trunk/twistedcaldav/extensions.py

Modified: CalendarServer/trunk/twext/web2/dav/resource.py
===================================================================
--- CalendarServer/trunk/twext/web2/dav/resource.py	2010-03-20 18:22:29 UTC (rev 5371)
+++ CalendarServer/trunk/twext/web2/dav/resource.py	2010-03-20 18:36:39 UTC (rev 5372)
@@ -1638,48 +1638,65 @@
         """
         # See RFC 3744, section 5.5.1
 
-        principals = (principal1, principal2)
-
         # The interesting part of a principal is it's one child
-        principal1, principal2 = [p.children[0] for p in principals]
+        principal1 = principal1.children[0]
+        principal2 = principal2.children[0]
 
-        if isinstance(principal2, davxml.All):
-            return succeed(True)
+        if not hasattr(request, "matchPrincipals"):
+            request.matchPrincipals = {}
 
-        elif isinstance(principal2, davxml.Authenticated):
-            if isinstance(principal1, davxml.Unauthenticated):
-                return succeed(False)
-            elif isinstance(principal1, davxml.All):
-                return succeed(False)
-            else:
+        cache_key = (str(principal1), str(principal2))
+
+        match = request.matchPrincipals.get(cache_key, None)
+        if match is not None:
+            return succeed(match)
+
+        def doMatch():
+            if isinstance(principal2, davxml.All):
                 return succeed(True)
 
-        elif isinstance(principal2, davxml.Unauthenticated):
-            if isinstance(principal1, davxml.Unauthenticated):
-                return succeed(True)
-            else:
+            elif isinstance(principal2, davxml.Authenticated):
+                if isinstance(principal1, davxml.Unauthenticated):
+                    return succeed(False)
+                elif isinstance(principal1, davxml.All):
+                    return succeed(False)
+                else:
+                    return succeed(True)
+
+            elif isinstance(principal2, davxml.Unauthenticated):
+                if isinstance(principal1, davxml.Unauthenticated):
+                    return succeed(True)
+                else:
+                    return succeed(False)
+
+            elif isinstance(principal1, davxml.Unauthenticated):
                 return succeed(False)
 
-        elif isinstance(principal1, davxml.Unauthenticated):
-            return succeed(False)
+            assert isinstance(principal1, davxml.HRef), (
+                "Not an HRef: %r" % (principal1,)
+            )
 
-        assert isinstance(principal1, davxml.HRef), (
-            "Not an HRef: %r" % (principal1,)
-        )
+            def resolved(principal2):
+                assert principal2 is not None, "principal2 is None"
 
-        def resolved(principal2):
-            assert principal2 is not None, "principal2 is None"
+                # Compare two HRefs and do group membership test as well
+                if principal1 == principal2:
+                    return True
 
-            # Compare two HRefs and do group membership test as well
-            if principal1 == principal2:
-                return True
+                return self.principalIsGroupMember(
+                    str(principal1), str(principal2), request
+                )
 
-            return self.principalIsGroupMember(
-                str(principal1), str(principal2), request
-            )
+            d = self.resolvePrincipal(principal2, request)
+            d.addCallback(resolved)
+            return d
 
-        d = self.resolvePrincipal(principal2, request)
-        d.addCallback(resolved)
+        def cache(match):
+            request.matchPrincipals[cache_key] = match
+            return match
+
+        d = doMatch()
+        d.addCallback(cache)
         return d
 
     def principalIsGroupMember(self, principal1, principal2, request):

Modified: CalendarServer/trunk/twistedcaldav/extensions.py
===================================================================
--- CalendarServer/trunk/twistedcaldav/extensions.py	2010-03-20 18:22:29 UTC (rev 5371)
+++ CalendarServer/trunk/twistedcaldav/extensions.py	2010-03-20 18:36:39 UTC (rev 5372)
@@ -448,29 +448,6 @@
     http_REPORT = http_REPORT
 
 
-    @inlineCallbacks
-    def matchPrincipal(self, principal1, principal2, request):
-        """
-        Implementation of DAVResource.matchPrincipal that caches the principal match
-        for the duration of a request. This avoids having to do repeated group membership
-        tests when privileges on multiple resources are determined.
-        """
-        
-        if not hasattr(request, "matchPrincipalCache"):
-            request.matchPrincipalCache = {}
-
-        # The interesting part of a principal is it's one child
-        principals = (principal1, principal2)
-        cache_key = tuple([str(p.children[0]) for p in principals])
-
-        match = request.matchPrincipalCache.get(cache_key, None)
-        if match is None:
-            match = (yield super(DAVResource, self).matchPrincipal(principal1, principal2, request))
-            request.matchPrincipalCache[cache_key] = match
-            
-        returnValue(match)
-
-
 class DAVPrincipalResource (DirectoryPrincipalPropertySearchMixIn, SuperDAVPrincipalResource, LoggingMixIn):
     """
     Extended L{twext.web2.dav.static.DAVFile} implementation.
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.macosforge.org/pipermail/calendarserver-changes/attachments/20100320/49bfafe0/attachment.html>


More information about the calendarserver-changes mailing list