[CalendarServer-changes] [5588] CalendarServer/trunk/twistedcaldav/sharing.py

source_changes at macosforge.org source_changes at macosforge.org
Mon May 10 18:34:29 PDT 2010


Revision: 5588
          http://trac.macosforge.org/projects/calendarserver/changeset/5588
Author:   cdaboo at apple.com
Date:     2010-05-10 18:34:27 -0700 (Mon, 10 May 2010)
Log Message:
-----------
Do a complete fail for invalid invites rather than a partial failure.

Modified Paths:
--------------
    CalendarServer/trunk/twistedcaldav/sharing.py

Modified: CalendarServer/trunk/twistedcaldav/sharing.py
===================================================================
--- CalendarServer/trunk/twistedcaldav/sharing.py	2010-05-10 21:01:45 UTC (rev 5587)
+++ CalendarServer/trunk/twistedcaldav/sharing.py	2010-05-11 01:34:27 UTC (rev 5588)
@@ -543,33 +543,41 @@
             @inlineCallbacks
             def _processInviteDoc(_, request):
                 setDict, removeDict, updateinviteDict = {}, {}, {}
+                okusers = set()
+                badusers = set()
                 for item in invitedoc.children:
                     if isinstance(item, customxml.InviteSet):
                         userid, cn, access, summary = _handleInviteSet(item)
                         setDict[userid] = (cn, access, summary)
+                    
+                        # Validate each userid on add only
+                        (okusers if self.validUserIDForShare(userid) else badusers).add(userid)
                     elif isinstance(item, customxml.InviteRemove):
                         userid, access = _handleInviteRemove(item)
                         removeDict[userid] = access
+                        
+                        # Treat removed userids as valid as we will fail invalid ones silently
+                        okusers.add(userid)
 
-                # Special case removing and adding the same user and treat that as an add
-                okusers = set()
-                badusers = set()
-                sameUseridInRemoveAndSet = [u for u in removeDict.keys() if u in setDict]
-                for u in sameUseridInRemoveAndSet:
-                    removeACL = removeDict[u]
-                    cn, newACL, summary = setDict[u]
-                    updateinviteDict[u] = (cn, removeACL, newACL, summary)
-                    del removeDict[u]
-                    del setDict[u]
-                for userid, access in removeDict.iteritems():
-                    result = (yield self.uninviteUserToShare(userid, access, request))
-                    (okusers if result else badusers).add(userid)
-                for userid, (cn, access, summary) in setDict.iteritems():
-                    result = (yield self.inviteUserToShare(userid, cn, access, summary, request))
-                    (okusers if result else badusers).add(userid)
-                for userid, (cn, removeACL, newACL, summary) in updateinviteDict.iteritems():
-                    result = (yield self.inviteUserUpdateToShare(userid, cn, removeACL, newACL, summary, request))
-                    (okusers if result else badusers).add(userid)
+                # Only make changes if all OK
+                if len(badusers) == 0:
+                    # Special case removing and adding the same user and treat that as an add
+                    sameUseridInRemoveAndSet = [u for u in removeDict.keys() if u in setDict]
+                    for u in sameUseridInRemoveAndSet:
+                        removeACL = removeDict[u]
+                        cn, newACL, summary = setDict[u]
+                        updateinviteDict[u] = (cn, removeACL, newACL, summary)
+                        del removeDict[u]
+                        del setDict[u]
+                    for userid, access in removeDict.iteritems():
+                        result = (yield self.uninviteUserToShare(userid, access, request))
+                        (okusers if result else badusers).add(userid)
+                    for userid, (cn, access, summary) in setDict.iteritems():
+                        result = (yield self.inviteUserToShare(userid, cn, access, summary, request))
+                        (okusers if result else badusers).add(userid)
+                    for userid, (cn, removeACL, newACL, summary) in updateinviteDict.iteritems():
+                        result = (yield self.inviteUserUpdateToShare(userid, cn, removeACL, newACL, summary, request))
+                        (okusers if result else badusers).add(userid)
 
                 # Do a final validation of the entire set of invites
                 self.validateInvites()
@@ -578,7 +586,7 @@
                 if badusers:
                     xml_responses = []
                     xml_responses.extend([
-                        davxml.StatusResponse(davxml.HRef(userid), davxml.Status.fromResponseCode(responsecode.OK))
+                        davxml.StatusResponse(davxml.HRef(userid), davxml.Status.fromResponseCode(responsecode.FAILED_DEPENDENCY))
                         for userid in sorted(okusers)
                     ])
                     xml_responses.extend([
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.macosforge.org/pipermail/calendarserver-changes/attachments/20100510/be64327e/attachment.html>


More information about the calendarserver-changes mailing list