[CalendarServer-changes] [5744] CalendarServer/trunk/twistedcaldav

source_changes at macosforge.org source_changes at macosforge.org
Tue Jun 15 15:38:47 PDT 2010


Revision: 5744
          http://trac.macosforge.org/projects/calendarserver/changeset/5744
Author:   cdaboo at apple.com
Date:     2010-06-15 15:38:45 -0700 (Tue, 15 Jun 2010)
Log Message:
-----------
No longer re-writing the sharing DAV:href.

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

Modified: CalendarServer/trunk/twistedcaldav/sharing.py
===================================================================
--- CalendarServer/trunk/twistedcaldav/sharing.py	2010-06-15 22:38:03 UTC (rev 5743)
+++ CalendarServer/trunk/twistedcaldav/sharing.py	2010-06-15 22:38:45 UTC (rev 5744)
@@ -90,8 +90,8 @@
         self.writeDeadProperty(rtype)
         
         # Remove all invitees
-        records = self.invitesDB().allRecords()
-        yield self.uninviteUserToShare([record.userid for record in records], None, request)
+        for record in self.invitesDB().allRecords():
+            yield self.uninviteRecordFromShare(record, request)
 
         # Remove invites database
         self.invitesDB().remove()
@@ -106,7 +106,7 @@
         return succeed(True)
 
     @inlineCallbacks
-    def changeUserInviteState(self, request, inviteUID, userid, state, summary=None):
+    def changeUserInviteState(self, request, inviteUID, principalURL, state, summary=None):
         
         shared = (yield self.isShared(request))
         if not shared:
@@ -117,7 +117,7 @@
             ))
             
         record = self.invitesDB().recordForInviteUID(inviteUID)
-        if record is None or record.userid != userid:
+        if record is None or record.principalURL != principalURL:
             raise HTTPError(ErrorResponse(
                 responsecode.FORBIDDEN,
                 (customxml.calendarserver_namespace, "valid-request"),
@@ -364,14 +364,14 @@
         # First try to resolve as a principal
         principal = self.principalForCalendarUserAddress(userid)
         if principal:
-            return principal.principalURL(), principal.displayName()
+            return userid, principal.principalURL(), principal.displayName()
         
         # TODO: we do not support external users right now so this is being hard-coded
         # off in spite of the config option.
         #elif config.Sharing.AllowExternalUsers:
-        #    return userid, cn
+        #    return userid, None, cn
         else:
-            return None, None
+            return None, None, None
 
     def validateInvites(self):
         """
@@ -390,19 +390,23 @@
             @param ace: Must be one of customxml.ReadWriteAccess or customxml.ReadAccess
         """
         
-        # Check for valid userid first
-        userid, cn = self.validUserIDWithCommonNameForShare(userid, cn)
-        if userid is None:
-            return succeed(False)
-
         # TODO: Check if this collection is shared, and error out if it isn't
+        resultIsList = True
         if type(userid) is not list:
             userid = [userid]
+            resultIsList = False
         if type(cn) is not list:
             cn = [cn]
             
+        def _defer(resultset):
+            results = [result if success else False for success, result in resultset]
+            if resultIsList:
+                return results
+            else:
+                return results[0]
+
         dl = [self.inviteSingleUserToShare(user, cn, ace, summary, request) for user, cn in zip(userid, cn)]
-        return DeferredList(dl).addCallback(lambda _:True)
+        return DeferredList(dl).addCallback(_defer)
 
     def uninviteUserToShare(self, userid, ace, request):
         """ Send out in uninvite first, and then remove this user from the share list."""
@@ -418,29 +422,41 @@
 
     def inviteUserUpdateToShare(self, userid, cn, aceOLD, aceNEW, summary, request):
 
-        # Check for valid userid first
-        userid, cn = self.validUserIDWithCommonNameForShare(userid, cn)
-        if userid is None:
-            return succeed(False)
-
+        resultIsList = True
         if type(userid) is not list:
             userid = [userid]
+            resultIsList = False
         if type(cn) is not list:
             cn = [cn]
+            
+        def _defer(resultset):
+            results = [result if success else False for success, result in resultset]
+            if resultIsList:
+                return results
+            else:
+                return results[0]
+
         dl = [self.inviteSingleUserUpdateToShare(user, cn, aceOLD, aceNEW, summary, request) for user, cn in zip(userid, cn)]
-        return DeferredList(dl).addCallback(lambda _:True)
+        return DeferredList(dl).addCallback(_defer)
 
     @inlineCallbacks
     def inviteSingleUserToShare(self, userid, cn, ace, summary, request):
         
+        # Validate userid and cn
+        userid, principalURL, cn = self.validUserIDWithCommonNameForShare(userid, cn)
+        
+        # We currently only handle local users
+        if principalURL is None:
+            returnValue(False)
+
         # Look for existing invite and update its fields or create new one
-        record = self.invitesDB().recordForUserID(userid)
+        record = self.invitesDB().recordForPrincipalURL(principalURL)
         if record:
             record.name = cn
             record.access = inviteAccessMapFromXML[type(ace)]
             record.summary = summary
         else:
-            record = Invite(str(uuid4()), userid, cn, inviteAccessMapFromXML[type(ace)], "NEEDS-ACTION", summary)
+            record = Invite(str(uuid4()), userid, principalURL, cn, inviteAccessMapFromXML[type(ace)], "NEEDS-ACTION", summary)
         
         # Send invite
         yield self.sendInvite(record, request)
@@ -450,16 +466,15 @@
         
         returnValue(True)            
 
-    @inlineCallbacks
     def uninviteSingleUserFromShare(self, userid, aces, request):
         
-        newuserid = self.validUserIDForShare(userid)
-        if newuserid:
-            userid = newuserid
-
-        # Cancel invites
+        # Cancel invites - we'll just use whatever userid we are given
         record = self.invitesDB().recordForUserID(userid)
+        return self.uninviteRecordFromShare(record, request) if record else succeed(True)
         
+    @inlineCallbacks
+    def uninviteRecordFromShare(self, record, request):
+        
         # Remove any shared calendar or address book
         sharee = self.principalForCalendarUserAddress(record.userid)
         if sharee:
@@ -478,7 +493,7 @@
                 yield self.sendInvite(record, request)
     
         # Remove from database
-        self.invitesDB().removeRecordForUserID(userid)
+        self.invitesDB().removeRecordForUserID(record.userid)
         
         returnValue(True)            
 
@@ -745,9 +760,10 @@
 
 class Invite(object):
     
-    def __init__(self, inviteuid, userid, common_name, access, state, summary):
+    def __init__(self, inviteuid, userid, principalURL, common_name, access, state, summary):
         self.inviteuid = inviteuid
         self.userid = userid
+        self.principalURL = principalURL
         self.name = common_name
         self.access = access
         self.state = state
@@ -794,6 +810,11 @@
         row = self._db_execute("select * from INVITE where USERID = :1", userid)
         return self._makeRecord(row[0]) if row else None
     
+    def recordForPrincipalURL(self, principalURL):
+        
+        row = self._db_execute("select * from INVITE where PRINCIPALURL = :1", principalURL)
+        return self._makeRecord(row[0]) if row else None
+    
     def recordForInviteUID(self, inviteUID):
 
         row = self._db_execute("select * from INVITE where INVITEUID = :1", inviteUID)
@@ -801,15 +822,19 @@
     
     def addOrUpdateRecord(self, record):
 
-        self._db_execute("""insert or replace into INVITE (INVITEUID, USERID, NAME, ACCESS, STATE, SUMMARY)
-            values (:1, :2, :3, :4, :5, :6)
-            """, record.inviteuid, record.userid, record.name, record.access, record.state, record.summary,
+        self._db_execute("""insert or replace into INVITE (INVITEUID, USERID, PRINCIPALURL, NAME, ACCESS, STATE, SUMMARY)
+            values (:1, :2, :3, :4, :5, :6, :7)
+            """, record.inviteuid, record.userid, record.principalURL, record.name, record.access, record.state, record.summary,
         )
     
     def removeRecordForUserID(self, userid):
 
         self._db_execute("delete from INVITE where USERID = :1", userid)
     
+    def removeRecordForPrincipalURL(self, principalURL):
+
+        self._db_execute("delete from INVITE where PRINCIPALURL = :1", principalURL)
+    
     def removeRecordForInviteUID(self, inviteUID):
 
         self._db_execute("delete from INVITE where INVITEUID = :1", inviteUID)
@@ -840,6 +865,7 @@
         # INVITE table is the primary table
         #   INVITEUID: UID for this invite
         #   USERID: identifier of invitee
+        #   PRINCIPALURL: principal-URL of invitee
         #   NAME: common name of invitee
         #   ACCESS: Access mode for share
         #   STATE: Invite response status
@@ -850,6 +876,7 @@
             create table INVITE (
                 INVITEUID      text unique,
                 USERID         text unique,
+                PRINCIPALURL   text unique,
                 NAME           text,
                 ACCESS         text,
                 STATE          text,
@@ -865,6 +892,11 @@
         )
         q.execute(
             """
+            create index PRINCIPALURL on INVITE (PRINCIPALURL)
+            """
+        )
+        q.execute(
+            """
             create index INVITEUID on INVITE (INVITEUID)
             """
         )
@@ -978,7 +1010,7 @@
     @inlineCallbacks
     def declineShare(self, request, hostUrl, inviteUID):
 
-        # Remove it if its in the DB
+        # Remove it if it is in the DB
         yield self.removeShareByUID(request, inviteUID)
 
         yield self._changeShare(request, "DECLINED", hostUrl, inviteUID)

Modified: CalendarServer/trunk/twistedcaldav/test/test_sharing.py
===================================================================
--- CalendarServer/trunk/twistedcaldav/test/test_sharing.py	2010-06-15 22:38:03 UTC (rev 5743)
+++ CalendarServer/trunk/twistedcaldav/test/test_sharing.py	2010-06-15 22:38:45 UTC (rev 5744)
@@ -74,12 +74,12 @@
             return userid
         if userid.endswith("@example.com"):
             principal = SharingTests.FakePrincipal(userid)
-            return principal.path if len(args) == 0 else (principal.path, principal.displayname,)
+            return principal.path if len(args) == 0 else (userid, principal.path, principal.displayname,)
         else:
-            return None if len(args) == 0 else (None, None,)
+            return None if len(args) == 0 else (None, None, None,)
 
     def _fakeInvalidUserID(self, userid, *args):
-        return None if len(args) == 0 else (None, None,)
+        return None if len(args) == 0 else (None, None, None,)
 
     @inlineCallbacks
     def _doPOST(self, body, resultcode = responsecode.OK):
@@ -183,7 +183,7 @@
         self.assertEquals(self._clearUIDElementValue(propInvite), customxml.Invite(
             customxml.InviteUser(
                 customxml.UID.fromString(""),
-                davxml.HRef.fromString("/principals/__uids__/user02"),
+                davxml.HRef.fromString("mailto:user02 at example.com"),
                 customxml.CommonName.fromString("USER02"),
                 customxml.InviteAccess(customxml.ReadWriteAccess()),
                 customxml.InviteStatusNoResponse(),
@@ -213,7 +213,7 @@
         self.assertEquals(self._clearUIDElementValue(propInvite), customxml.Invite(
             customxml.InviteUser(
                 customxml.UID.fromString(""),
-                davxml.HRef.fromString("/principals/__uids__/user02"),
+                davxml.HRef.fromString("mailto:user02 at example.com"),
                 customxml.CommonName.fromString("USER02"),
                 customxml.InviteAccess(customxml.ReadWriteAccess()),
                 customxml.InviteStatusNoResponse(),
@@ -254,7 +254,7 @@
         self.assertEquals(self._clearUIDElementValue(propInvite), customxml.Invite(
             customxml.InviteUser(
                 customxml.UID.fromString(""),
-                davxml.HRef.fromString("/principals/__uids__/user02"),
+                davxml.HRef.fromString("mailto:user02 at example.com"),
                 customxml.CommonName.fromString("USER02"),
                 customxml.InviteAccess(customxml.ReadAccess()),
                 customxml.InviteStatusNoResponse(),
@@ -320,21 +320,21 @@
         self.assertEquals(self._clearUIDElementValue(propInvite), customxml.Invite(
             customxml.InviteUser(
                 customxml.UID.fromString(""),
-                davxml.HRef.fromString("/principals/__uids__/user02"),
+                davxml.HRef.fromString("mailto:user02 at example.com"),
                 customxml.CommonName.fromString("USER02"),
                 customxml.InviteAccess(customxml.ReadWriteAccess()),
                 customxml.InviteStatusNoResponse(),
             ),
             customxml.InviteUser(
                 customxml.UID.fromString(""),
-                davxml.HRef.fromString("/principals/__uids__/user03"),
+                davxml.HRef.fromString("mailto:user03 at example.com"),
                 customxml.CommonName.fromString("USER03"),
                 customxml.InviteAccess(customxml.ReadWriteAccess()),
                 customxml.InviteStatusNoResponse(),
             ),
             customxml.InviteUser(
                 customxml.UID.fromString(""),
-                davxml.HRef.fromString("/principals/__uids__/user04"),
+                davxml.HRef.fromString("mailto:user04 at example.com"),
                 customxml.CommonName.fromString("USER04"),
                 customxml.InviteAccess(customxml.ReadWriteAccess()),
                 customxml.InviteStatusNoResponse(),
@@ -377,14 +377,14 @@
         self.assertEquals(self._clearUIDElementValue(propInvite), customxml.Invite(
             customxml.InviteUser(
                 customxml.UID.fromString(""),
-                davxml.HRef.fromString("/principals/__uids__/user02"),
+                davxml.HRef.fromString("mailto:user02 at example.com"),
                 customxml.CommonName.fromString("USER02"),
                 customxml.InviteAccess(customxml.ReadWriteAccess()),
                 customxml.InviteStatusNoResponse(),
             ),
             customxml.InviteUser(
                 customxml.UID.fromString(""),
-                davxml.HRef.fromString("/principals/__uids__/user04"),
+                davxml.HRef.fromString("mailto:user04 at example.com"),
                 customxml.CommonName.fromString("USER04"),
                 customxml.InviteAccess(customxml.ReadWriteAccess()),
                 customxml.InviteStatusNoResponse(),
@@ -427,14 +427,14 @@
         self.assertEquals(self._clearUIDElementValue(propInvite), customxml.Invite(
             customxml.InviteUser(
                 customxml.UID.fromString(""),
-                davxml.HRef.fromString("/principals/__uids__/user02"),
+                davxml.HRef.fromString("mailto:user02 at example.com"),
                 customxml.CommonName.fromString("USER02"),
                 customxml.InviteAccess(customxml.ReadWriteAccess()),
                 customxml.InviteStatusNoResponse(),
             ),
             customxml.InviteUser(
                 customxml.UID.fromString(""),
-                davxml.HRef.fromString("/principals/__uids__/user03"),
+                davxml.HRef.fromString("mailto:user03 at example.com"),
                 customxml.CommonName.fromString("USER03"),
                 customxml.InviteAccess(customxml.ReadAccess()),
                 customxml.InviteStatusNoResponse(),
@@ -491,7 +491,7 @@
         self.assertEquals(self._clearUIDElementValue(propInvite), customxml.Invite(
             customxml.InviteUser(
                 customxml.UID.fromString(""),
-                davxml.HRef.fromString("/principals/__uids__/user01"),
+                davxml.HRef.fromString("mailto:user01 at example.com"),
                 customxml.CommonName.fromString("USER01"),
                 customxml.InviteAccess(customxml.ReadWriteAccess()),
                 customxml.InviteStatusNoResponse(),
@@ -506,7 +506,7 @@
         self.assertEquals(self._clearUIDElementValue(propInvite), customxml.Invite(
             customxml.InviteUser(
                 customxml.UID.fromString(""),
-                davxml.HRef.fromString("/principals/__uids__/user01"),
+                davxml.HRef.fromString("mailto:user01 at example.com"),
                 customxml.CommonName.fromString("USER01"),
                 customxml.InviteAccess(customxml.ReadWriteAccess()),
                 customxml.InviteStatusInvalid(),
@@ -516,7 +516,7 @@
         yield self._doPOST("""<?xml version="1.0" encoding="utf-8" ?>
 <CS:share xmlns:D="DAV:" xmlns:CS="http://calendarserver.org/ns/">
     <CS:remove>
-        <D:href>/principals/__uids__/user01</D:href>
+        <D:href>mailto:user01 at example.com</D:href>
     </CS:remove>
 </CS:share>
 """)
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.macosforge.org/pipermail/calendarserver-changes/attachments/20100615/f4a08e0f/attachment-0001.html>


More information about the calendarserver-changes mailing list