[CalendarServer-changes] [3425] CalendarServer/branches/users/sagen/expandedgroupmemberset-3421

source_changes at macosforge.org source_changes at macosforge.org
Mon Dec 1 18:03:04 PST 2008


Revision: 3425
          http://trac.macosforge.org/projects/calendarserver/changeset/3425
Author:   sagen at apple.com
Date:     2008-12-01 18:03:03 -0800 (Mon, 01 Dec 2008)
Log Message:
-----------
Adds expanded-group-member-set property, changes group-member-set to *not* expand

Modified Paths:
--------------
    CalendarServer/branches/users/sagen/expandedgroupmemberset-3421/conf/auth/accounts-test.xml
    CalendarServer/branches/users/sagen/expandedgroupmemberset-3421/twistedcaldav/customxml.py
    CalendarServer/branches/users/sagen/expandedgroupmemberset-3421/twistedcaldav/directory/principal.py

Modified: CalendarServer/branches/users/sagen/expandedgroupmemberset-3421/conf/auth/accounts-test.xml
===================================================================
--- CalendarServer/branches/users/sagen/expandedgroupmemberset-3421/conf/auth/accounts-test.xml	2008-12-01 22:14:28 UTC (rev 3424)
+++ CalendarServer/branches/users/sagen/expandedgroupmemberset-3421/conf/auth/accounts-test.xml	2008-12-02 02:03:03 UTC (rev 3425)
@@ -92,4 +92,35 @@
     </members>
     <disable-calendar/>
   </group>
+  <group>
+    <uid>subgroup1</uid>
+    <guid>subgroup1</guid>
+    <password>subgroup1</password>
+    <name>Sub Group 1</name>
+    <members>
+      <member type="users">user10</member>
+      <member type="users">user11</member>
+    </members>
+  </group>
+  <group>
+    <uid>subgroup2</uid>
+    <guid>subgroup2</guid>
+    <password>subgroup2</password>
+    <name>Sub Group 2</name>
+    <members>
+      <member type="users">user12</member>
+      <member type="users">user13</member>
+    </members>
+  </group>
+  <group>
+    <uid>toplevelgroup</uid>
+    <guid>toplevelgroup</guid>
+    <password>toplevelgroup</password>
+    <name>Top Level Group</name>
+    <members>
+      <member type="groups">subgroup1</member>
+      <member type="groups">subgroup2</member>
+      <member type="users">user14</member>
+    </members>
+  </group>
 </accounts>

Modified: CalendarServer/branches/users/sagen/expandedgroupmemberset-3421/twistedcaldav/customxml.py
===================================================================
--- CalendarServer/branches/users/sagen/expandedgroupmemberset-3421/twistedcaldav/customxml.py	2008-12-01 22:14:28 UTC (rev 3424)
+++ CalendarServer/branches/users/sagen/expandedgroupmemberset-3421/twistedcaldav/customxml.py	2008-12-02 02:03:03 UTC (rev 3425)
@@ -350,6 +350,17 @@
 
     allowed_children = { (calendarserver_namespace, "email-address"): (0, None) }
 
+class ExpandedGroupMemberSet (davxml.WebDAVElement):
+    """
+    The expanded list of members of a (group) principal
+    """
+    namespace = calendarserver_namespace
+    name = "expanded-group-member-set"
+    protected = True
+    hidden = True
+
+    allowed_children = { (dav_namespace, "href"): (0, None) }
+
 class IScheduleInbox (davxml.WebDAVEmptyElement):
     """
     Denotes the resourcetype of a iSchedule Inbox.

Modified: CalendarServer/branches/users/sagen/expandedgroupmemberset-3421/twistedcaldav/directory/principal.py
===================================================================
--- CalendarServer/branches/users/sagen/expandedgroupmemberset-3421/twistedcaldav/directory/principal.py	2008-12-01 22:14:28 UTC (rev 3424)
+++ CalendarServer/branches/users/sagen/expandedgroupmemberset-3421/twistedcaldav/directory/principal.py	2008-12-02 02:03:03 UTC (rev 3425)
@@ -525,6 +525,31 @@
         else:
             return self.record.shortName
 
+    liveProperties = CalendarPrincipalResource.liveProperties + (
+        (customxml.calendarserver_namespace, "expanded-group-member-set"),
+    )
+
+    @inlineCallbacks
+    def readProperty(self, property, request):
+        if type(property) is tuple:
+            qname = property
+        else:
+            qname = property.qname()
+
+        namespace, name = qname
+
+        if namespace == customxml.calendarserver_namespace:
+            if name == "expanded-group-member-set":
+                principals = (yield self.expandedGroupMembers())
+                returnValue(
+                    customxml.ExpandedGroupMemberSet(
+                        *[davxml.HRef(p.principalURL()) for p in principals]
+                    )
+                )
+
+        result = (yield super(DirectoryPrincipalResource, self).readProperty(property, request))
+        returnValue(result)
+
     ##
     # ACL
     ##
@@ -554,7 +579,7 @@
     def url(self):
         return self.principalURL()
 
-    def _getRelatives(self, method, record=None, relatives=None, records=None, proxy=None):
+    def _getRelatives(self, method, record=None, relatives=None, records=None, proxy=None, infinity=False):
         if record is None:
             record = self.record
         if relatives is None:
@@ -577,21 +602,26 @@
                                 found = found.getChild("calendar-proxy-read")
                         relatives.add(found)
 
-                    self._getRelatives(method, relative, relatives, records)
+                    if infinity:
+                        self._getRelatives(method, relative, relatives, records,
+                            infinity=infinity)
 
         return relatives
 
     def groupMembers(self):
         return succeed(self._getRelatives("members"))
 
+    def expandedGroupMembers(self):
+        return succeed(self._getRelatives("members", infinity=True))
+
     @inlineCallbacks
     def groupMemberships(self):
-        groups = self._getRelatives("groups")
+        groups = self._getRelatives("groups", infinity=True)
 
         if config.EnableProxyPrincipals:
             # Get any directory specified proxies
-            groups.update(self._getRelatives("proxyFor", proxy='read-write'))
-            groups.update(self._getRelatives("readOnlyProxyFor", proxy='read-only'))
+            groups.update(self._getRelatives("proxyFor", proxy='read-write', infinity=True))
+            groups.update(self._getRelatives("readOnlyProxyFor", proxy='read-only', infinity=True))
 
             # Get proxy group UIDs and map to principal resources
             proxies = []
@@ -610,7 +640,7 @@
         proxyFors = set()
 
         if resolve_memberships:
-            memberships = self._getRelatives("groups")
+            memberships = self._getRelatives("groups", infinity=True)
             for membership in memberships:
                 results = (yield membership.proxyFor(read_write, False))
                 proxyFors.update(results)
@@ -618,9 +648,9 @@
         if config.EnableProxyPrincipals:
             # Get any directory specified proxies
             if read_write:
-                directoryProxies = self._getRelatives("proxyFor", proxy='read-write')
+                directoryProxies = self._getRelatives("proxyFor", proxy='read-write', infinity=True)
             else:
-                directoryProxies = self._getRelatives("readOnlyProxyFor", proxy='read-only')
+                directoryProxies = self._getRelatives("readOnlyProxyFor", proxy='read-only', infinity=True)
             proxyFors.update([subprincipal.parent for subprincipal in directoryProxies])
 
             # Get proxy group UIDs and map to principal resources
@@ -750,10 +780,10 @@
             return False
 
     def proxies(self):
-        return self._getRelatives("proxies")
+        return self._getRelatives("proxies", infinity=True)
 
     def readOnlyProxies(self):
-        return self._getRelatives("readOnlyProxies")
+        return self._getRelatives("readOnlyProxies", infinity=True)
 
     def hasEditableProxyMembership(self):
         return self.record.hasEditableProxyMembership()
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.macosforge.org/pipermail/calendarserver-changes/attachments/20081201/349e2c4a/attachment.html>


More information about the calendarserver-changes mailing list