[CalendarServer-changes] [11773]

source_changes at macosforge.org source_changes at macosforge.org
Tue Oct 1 12:11:51 PDT 2013


Revision: 11773
          http://trac.calendarserver.org//changeset/11773
Author:   gaya at apple.com
Date:     2013-10-01 12:11:51 -0700 (Tue, 01 Oct 2013)
Log Message:
-----------
sync-report: fix reporting of group changes

Modified Paths:
--------------
    CalDAVTester/branches/users/gaya/sharedgroupfixestester/scripts/tests/CardDAV/sharing-sync.xml
    CalendarServer/branches/users/gaya/sharedgroupfixes/txdav/carddav/datastore/sql.py

Modified: CalDAVTester/branches/users/gaya/sharedgroupfixestester/scripts/tests/CardDAV/sharing-sync.xml
===================================================================
--- CalDAVTester/branches/users/gaya/sharedgroupfixestester/scripts/tests/CardDAV/sharing-sync.xml	2013-10-01 16:17:59 UTC (rev 11772)
+++ CalDAVTester/branches/users/gaya/sharedgroupfixestester/scripts/tests/CardDAV/sharing-sync.xml	2013-10-01 19:11:51 UTC (rev 11773)
@@ -1210,6 +1210,7 @@
 						<name>okhrefs</name>
 						<value>$addressbook:/</value>
 						<value>$addressbook:/1.vcf</value>
+						<value>$addressbook:/3.vcf</value>
 					</arg>
 				</verify>
 				<grabelement>
@@ -1231,6 +1232,7 @@
 					<arg>
 						<name>okhrefs</name>
 						<value>1.vcf</value>
+						<value>3.vcf</value>
 					</arg>
 				</verify>
 				<grabelement>
@@ -1419,7 +1421,6 @@
 						<name>okhrefs</name>
 						<value>$userguid1:/</value>
 						<value>$userguid1:/1.vcf</value>
-						<value>$userguid1:/3.vcf</value>
 					</arg>
 				</verify>
 				<grabelement>
@@ -1441,7 +1442,6 @@
 					<arg>
 						<name>okhrefs</name>
 						<value>1.vcf</value>
-						<value>3.vcf</value>
 					</arg>
 				</verify>
 				<grabelement>
@@ -1911,6 +1911,7 @@
 					<arg>
 						<name>okhrefs</name>
 						<value>$addressbook:/</value>
+						<value>$addressbook:/3.vcf</value>
 					</arg>
 					<arg>
 						<name>badhrefs</name>
@@ -1934,6 +1935,10 @@
 				<verify>
 					<callback>multistatusItems</callback>
 					<arg>
+						<name>okhrefs</name>
+						<value>3.vcf</value>
+					</arg>
+					<arg>
 						<name>badhrefs</name>
 						<value>1.vcf</value>
 					</arg>

Modified: CalendarServer/branches/users/gaya/sharedgroupfixes/txdav/carddav/datastore/sql.py
===================================================================
--- CalendarServer/branches/users/gaya/sharedgroupfixes/txdav/carddav/datastore/sql.py	2013-10-01 16:17:59 UTC (rev 11772)
+++ CalendarServer/branches/users/gaya/sharedgroupfixes/txdav/carddav/datastore/sql.py	2013-10-01 19:11:51 UTC (rev 11773)
@@ -608,28 +608,12 @@
         changed = set()
         deleted = set()
         acceptedGroupIDs = set([groupBindRow[2] for groupBindRow in groupBindRows])
-        memberIDToAcceptedGroupIDsMap = {}
-        allowedObjectIDs = set()
-        for acceptedGroupID in acceptedGroupIDs:
-            memberIDs = set((yield self.expandGroupIDs(self._txn, [acceptedGroupID])))
-            allowedObjectIDs |= memberIDs
-            for memberID in memberIDs:
-                current = memberIDToAcceptedGroupIDsMap.get(memberID, set())
-                current.add(acceptedGroupID)
-                memberIDToAcceptedGroupIDsMap[memberID] = current
 
-        oldAllowedObjectIDs = set()
-        for acceptedGroupID in acceptedGroupIDs:
-            memberIDs = set((yield self.expandGroupIDs(self._txn, [acceptedGroupID], revision)))
-            oldAllowedObjectIDs |= memberIDs
-            for memberID in memberIDs:
-                current = memberIDToAcceptedGroupIDsMap.get(memberID, set())
-                current.add(acceptedGroupID)
-                memberIDToAcceptedGroupIDsMap[memberID] = current
+        allowedObjectIDs = set((yield self.expandGroupIDs(self._txn, acceptedGroupIDs)))
+        oldAllowedObjectIDs = set((yield self.expandGroupIDs(self._txn, acceptedGroupIDs, revision)))
+        addedObjectIDs = allowedObjectIDs - oldAllowedObjectIDs
+        removedObjectIDs = oldAllowedObjectIDs - allowedObjectIDs
 
-        addedObjectIds = allowedObjectIDs - oldAllowedObjectIDs
-        removedObjectIds = oldAllowedObjectIDs - allowedObjectIDs
-
         # get revision table changes
         rev = self._revisionsSchema
         results = [(
@@ -648,14 +632,14 @@
         idToNameMap = dict([(id, name) for name, id, wasdeleted in results if wasdeleted])
 
         # now get other names of existing objects
-        missingNameIds = (allowedObjectIDs | oldAllowedObjectIDs) - set(idToNameMap.keys())
-        if missingNameIds:
+        missingNameIDs = (allowedObjectIDs | oldAllowedObjectIDs) - set(idToNameMap.keys())
+        if missingNameIDs:
             abo = schema.ADDRESSBOOK_OBJECT
             memberIDNameRows = (
                 yield AddressBookObject._columnsWithResourceIDsQuery(
                     [abo.RESOURCE_ID, abo.RESOURCE_NAME],
-                    missingNameIds
-                ).on(self._txn, resourceIDs=missingNameIds)
+                    missingNameIDs
+                ).on(self._txn, resourceIDs=missingNameIDs)
             )
             idToNameMap = dict(dict(idToNameMap), **dict(memberIDNameRows))
 
@@ -663,27 +647,19 @@
         if revision:
 
             # handled added or removed objects
-            if removedObjectIds or addedObjectIds:
+            if removedObjectIDs or addedObjectIDs:
                 changed.add("%s/" % (path,))
 
             if depth != "1":
-                for removedObjectId in removedObjectIds:
-                    deleted.add("%s/%s" % (path, idToNameMap[removedObjectId],))
+                for removedObjectID in removedObjectIDs:
+                    deleted.add("%s/%s" % (path, idToNameMap[removedObjectID],))
 
-                for addedObjectId in addedObjectIds:
-                    changed.add("%s/%s" % (path, idToNameMap[addedObjectId],))
+                for addedObjectID in addedObjectIDs:
+                    changed.add("%s/%s" % (path, idToNameMap[addedObjectID],))
 
-                # remove shared groups as changed too
-                for memberID in removedObjectIds or addedObjectIds:
-                    for acceptedGroupID in memberIDToAcceptedGroupIDsMap[memberID]:
-                        changed.add("%s/%s" % (path, idToNameMap[acceptedGroupID],))
-
             # use revisions to handle changed objects
-            changedNames = [name for name, id, wasdeleted in results if not wasdeleted and name in idToNameMap.values()]
-            if changedNames:
-                nametoIDMap = dict((v, k) for k, v in idToNameMap.iteritems())
-
-                for name in changedNames:
+            for name, id, wasdeleted in results:
+                if not wasdeleted and name in idToNameMap.values():
                     # Always report collection as changed
                     changed.add("%s/" % (path,))
 
@@ -693,15 +669,11 @@
                         if item not in deleted:
                             changed.add("%s/%s" % (path, name,))
 
-                        # remove shared groups as changed too
-                        for acceptedGroupID in memberIDToAcceptedGroupIDsMap[nametoIDMap[name]]:
-                            changed.add("%s/%s" % (path, idToNameMap[acceptedGroupID],))
-
         else:
             changed.add("%s/" % (path,))
             if depth != "1":
-                for addedObjectId in allowedObjectIDs:
-                    changed.add("%s/%s" % (path, idToNameMap[addedObjectId],))
+                for addedObjectID in allowedObjectIDs:
+                    changed.add("%s/%s" % (path, idToNameMap[addedObjectID],))
 
         returnValue((changed, deleted))
 
@@ -1324,44 +1296,44 @@
 
 
     @inlineCallbacks
-    def accessControlGroupIDs(self):
+    def _objectAccessSets(self):
         if self.owned():
             returnValue(([], []))
         else:
             groupBindRows = yield AddressBookObject._acceptedBindForHomeIDAndAddressBookID.on(
                     self._txn, homeID=self._home._resourceID, addressbookID=self._resourceID
             )
-            readWriteGroupIDs = []
-            readOnlyGroupIDs = []
+            readWriteObjectIDs = []
+            readOnlyObjectIDs = []
             for groupBindRow in groupBindRows:
                 bindMode, homeID, resourceID, bindName, bindStatus, bindRevision, bindMessage = groupBindRow[:AddressBookObject.bindColumnCount] #@UnusedVariable
                 if bindMode == _BIND_MODE_WRITE:
-                    readWriteGroupIDs.append(resourceID)
+                    readWriteObjectIDs.append(resourceID)
                 else:
-                    readOnlyGroupIDs.append(resourceID)
+                    readOnlyObjectIDs.append(resourceID)
 
-            if readOnlyGroupIDs and readWriteGroupIDs:
+            if readOnlyObjectIDs and readWriteObjectIDs:
                 # expand read-write groups and remove any subgroups from read-only group list
-                allWriteableIDs = yield self.expandGroupIDs(self._txn, readWriteGroupIDs)
-                adjustedReadOnlyGroupIDs = set(readOnlyGroupIDs) - set(allWriteableIDs)
-                adjustedReadWriteGroupIDs = set(readWriteGroupIDs) | (set(readOnlyGroupIDs) - adjustedReadOnlyGroupIDs)
+                allWriteableIDs = yield self.expandGroupIDs(self._txn, readWriteObjectIDs)
+                adjustedReadOnlyGroupIDs = set(readOnlyObjectIDs) - set(allWriteableIDs)
+                adjustedReadWriteGroupIDs = set(readWriteObjectIDs) | (set(readOnlyObjectIDs) - adjustedReadOnlyGroupIDs)
             else:
-                adjustedReadOnlyGroupIDs = readOnlyGroupIDs
-                adjustedReadWriteGroupIDs = readWriteGroupIDs
+                adjustedReadOnlyGroupIDs = readOnlyObjectIDs
+                adjustedReadWriteGroupIDs = readWriteObjectIDs
             returnValue((tuple(adjustedReadOnlyGroupIDs), tuple(adjustedReadWriteGroupIDs)))
 
 
     # FIXME: Unused
     @inlineCallbacks
-    def readOnlyGroupIDs(self):
-        returnValue((yield self.accessControlGroupIDs())[0])
+    def readOnlyObjectIDs(self):
+        returnValue((yield self._objectAccessSets())[0])
 
 
     @inlineCallbacks
-    def readWriteGroupIDs(self):
-        returnValue((yield self.accessControlGroupIDs())[1])
+    def readWriteObjectIDs(self):
+        returnValue((yield self._objectAccessSets())[1])
 
-
+    '''
     # FIXME: Unused:  Use for caching access
     @inlineCallbacks
     def accessControlObjectIDs(self):
@@ -1379,19 +1351,19 @@
         groupBindRows = yield AddressBookObject._acceptedBindForHomeIDAndAddressBookID.on(
                 self._txn, homeID=self._home._resourceID, addressbookID=self._resourceID
         )
-        readWriteGroupIDs = []
-        readOnlyGroupIDs = []
+        readWriteObjectIDs = []
+        readOnlyObjectIDs = []
         for groupBindRow in groupBindRows:
             bindMode, homeID, resourceID, bindName, bindStatus, bindRevision, bindMessage = groupBindRow[:AddressBookObject.bindColumnCount] #@UnusedVariable
             if bindMode == _BIND_MODE_WRITE:
-                readWriteGroupIDs.append(resourceID)
+                readWriteObjectIDs.append(resourceID)
             else:
-                readOnlyGroupIDs.append(resourceID)
+                readOnlyObjectIDs.append(resourceID)
 
-        if readOnlyGroupIDs:
-            readOnlyIDs |= set((yield self.expandGroupIDs(self._txn, readOnlyGroupIDs)))
-        if readWriteGroupIDs:
-            readWriteIDs |= set((yield self.expandGroupIDs(self._txn, readWriteGroupIDs)))
+        if readOnlyObjectIDs:
+            readOnlyIDs |= set((yield self.expandGroupIDs(self._txn, readOnlyObjectIDs)))
+        if readWriteObjectIDs:
+            readWriteIDs |= set((yield self.expandGroupIDs(self._txn, readWriteObjectIDs)))
         readOnlyIDs -= readWriteIDs
         returnValue(tuple(readOnlyIDs), tuple(readWriteIDs))
 
@@ -1413,8 +1385,8 @@
     def allObjectIDs(self):
         readOnlyIDs, readWriteIDs = yield self.accessControlObjectIDs()
         returnValue((readOnlyIDs + readWriteIDs))
+    '''
 
-
     @inlineCallbacks
     def updateShare(self, shareeView, mode=None, status=None, message=None):
         """
@@ -1631,19 +1603,30 @@
                 raise HTTPError(FORBIDDEN)
 
         if not self.owned() and not self.addressbook().fullyShared():
-            readWriteGroupIDs = yield self.addressbook().readWriteGroupIDs()
+            readWriteObjectIDs = yield self.addressbook().readWriteObjectIDs()
             readWriteObjectIDs = (
-                set((yield self.addressbook().expandGroupIDs(self._txn, readWriteGroupIDs)))
-                    if readWriteGroupIDs else set()
+                set((yield self.addressbook().expandGroupIDs(self._txn, readWriteObjectIDs)))
+                    if readWriteObjectIDs else set()
             )
 
             # can't delete item in read-only shared group, even if user has addressbook unbind
             if self._resourceID not in readWriteObjectIDs:
                 raise HTTPError(FORBIDDEN)
 
-        # get sync token for delete now
-        yield self.addressbook()._deleteRevision(self.name(), self._resourceID)
+            # get sync token for delete now
+            yield self.addressbook()._deleteRevision(self.name(), self._resourceID)
 
+            readWriteGroupIDs = set()
+            for readWriteObjectID in readWriteObjectIDs:
+                abObject = yield self.addressbook().objectResourceWithID(readWriteObjectID)
+                if abObject.kind() == _ABO_KIND_GROUP:
+                    readWriteGroupIDs.add(readWriteObjectID)
+                    yield self.addressbook()._updateRevision(abObject.name())
+
+        else:
+            # get sync token for delete now
+            yield self.addressbook()._deleteRevision(self.name(), self._resourceID)
+
         # get groups where this object was once a member and version info
         aboMembers = schema.ABO_MEMBERS
         groupRows = yield Select([aboMembers.GROUP_ID, aboMembers.MEMBER_ID, aboMembers.REMOVED, aboMembers.REVISION],
@@ -1665,8 +1648,8 @@
         ])
 
         if not self.owned() and not self.addressbook().fullyShared():
-            groupIDsToRemoveFrom = readWriteObjectIDs | groupIDs
-            groupIDs -= readWriteObjectIDs
+            groupIDsToRemoveFrom = readWriteGroupIDs | groupIDs
+            groupIDs -= readWriteGroupIDs
         else:
             groupIDsToRemoveFrom = groupIDs
 
@@ -1725,8 +1708,8 @@
             returnValue(True)
 
         #otherwise, must be in a read-write group
-        readWriteGroupIDs = yield self.addressbook().readWriteGroupIDs()
-        readWriteIDs = yield self.addressbook().expandGroupIDs(self._txn, readWriteGroupIDs)
+        readWriteObjectIDs = yield self.addressbook().readWriteObjectIDs()
+        readWriteIDs = yield self.addressbook().expandGroupIDs(self._txn, readWriteObjectIDs)
         returnValue(self._resourceID in readWriteIDs)
 
 
@@ -2216,10 +2199,15 @@
             groupIDs = set([groupIDRow[0] for groupIDRow in groupIDRows])
 
             if not self.owned() and not self.addressbook().fullyShared():
-                readWriteGroupIDs = yield self.addressbook().readWriteGroupIDs()
-                assert readWriteGroupIDs, "no access"
-                groupIDs |= set(readWriteGroupIDs)
+                readWriteObjectIDs = yield self.addressbook().readWriteObjectIDs()
+                assert readWriteObjectIDs, "no access"
 
+                for readWriteObjectID in readWriteObjectIDs:
+                    abObject = yield self.addressbook().objectResourceWithID(readWriteObjectID)
+                    if abObject.kind() == _ABO_KIND_GROUP:
+                        groupIDs.add(readWriteObjectID)
+                        yield self.addressbook()._updateRevision(abObject.name())
+
             # add to member table rows
             for groupID in groupIDs:
                 yield self._insertMemberIDQuery.on(self._txn,
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.macosforge.org/pipermail/calendarserver-changes/attachments/20131001/aa954041/attachment-0001.html>


More information about the calendarserver-changes mailing list