[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