[CalendarServer-changes] [13846] CalendarServer/trunk

source_changes at macosforge.org source_changes at macosforge.org
Thu Aug 7 00:41:08 PDT 2014


Revision: 13846
          http://trac.calendarserver.org//changeset/13846
Author:   gaya at apple.com
Date:     2014-08-07 00:41:08 -0700 (Thu, 07 Aug 2014)
Log Message:
-----------
fix invite and access privs for group sharees

Modified Paths:
--------------
    CalendarServer/trunk/twistedcaldav/sharing.py
    CalendarServer/trunk/txdav/caldav/datastore/sql.py
    CalendarServer/trunk/txdav/common/datastore/sql.py

Modified: CalendarServer/trunk/twistedcaldav/sharing.py
===================================================================
--- CalendarServer/trunk/twistedcaldav/sharing.py	2014-08-07 05:32:02 UTC (rev 13845)
+++ CalendarServer/trunk/twistedcaldav/sharing.py	2014-08-07 07:41:08 UTC (rev 13846)
@@ -25,29 +25,30 @@
     "SharedHomeMixin",
 ]
 
-from txweb2 import responsecode
-from txweb2.http import HTTPError, Response, XMLResponse
-from txweb2.dav.http import ErrorResponse, MultiStatusResponse
-from txweb2.dav.resource import TwistedACLInheritable
-from txweb2.dav.util import allDataFromStream, joinURL
+from twext.who.idirectory import RecordType
 
-from txdav.common.datastore.sql_tables import _BIND_MODE_OWN, \
-    _BIND_MODE_READ, _BIND_MODE_WRITE, _BIND_STATUS_INVITED, \
-    _BIND_STATUS_ACCEPTED, _BIND_STATUS_DECLINED, \
-    _BIND_STATUS_INVALID, _ABO_KIND_GROUP, _BIND_STATUS_DELETED, \
-    _BIND_MODE_DIRECT, _BIND_MODE_INDIRECT
-from txdav.xml import element
-
 from twisted.internet.defer import succeed, inlineCallbacks, DeferredList, \
     returnValue
 
 from twistedcaldav import customxml, caldavxml
 from twistedcaldav.config import config
 from twistedcaldav.customxml import calendarserver_namespace
-from txdav.who.wiki import RecordType as WikiRecordType, WikiAccessLevel
 from twistedcaldav.linkresource import LinkFollowerMixIn
 
+from txdav.common.datastore.sql_tables import _ABO_KIND_GROUP, \
+    _BIND_MODE_DIRECT, _BIND_MODE_INDIRECT, _BIND_MODE_OWN, _BIND_MODE_READ, \
+    _BIND_MODE_WRITE, _BIND_STATUS_ACCEPTED, _BIND_STATUS_DECLINED, \
+    _BIND_STATUS_DELETED, _BIND_STATUS_INVALID, _BIND_STATUS_INVITED
+from txdav.xml import element
+from txdav.who.wiki import RecordType as WikiRecordType, WikiAccessLevel
 
+from txweb2 import responsecode
+from txweb2.dav.http import ErrorResponse, MultiStatusResponse
+from txweb2.dav.resource import TwistedACLInheritable
+from txweb2.dav.util import allDataFromStream, joinURL
+from txweb2.http import HTTPError, Response, XMLResponse
+
+
 class SharedResourceMixin(object):
     """
     A mix-in for calendar/addressbook resources that implements sharing-related
@@ -434,6 +435,28 @@
 
 
     @inlineCallbacks
+    def principalForCalendarGroupAddress(self, groupid):
+        """
+        Get principal for group address if extant
+        """
+
+        if (
+            config.Sharing.Enabled and
+            config.Sharing.Calendars.Enabled and
+            config.Sharing.Calendars.Groups.Enabled
+        ):
+            # see if group
+            for principalCollection in self.principalCollections():
+                record = yield principalCollection.directory.recordWithCalendarUserAddress(groupid)
+                if record is not None and record.recordType == RecordType.group:
+                    groupPrincipal = yield principalCollection.principalForRecord(record)
+                    if groupPrincipal is not None:
+                        returnValue(groupPrincipal)
+
+        returnValue(None)
+
+
+    @inlineCallbacks
     def validateInvites(self, request, invitations=None):
         """
         Make sure each userid in an invite is valid - if not re-write status.
@@ -447,6 +470,14 @@
                 if not (yield self.validUserIDForShare("urn:x-uid:" + invitation.shareeUID, request)):
                     self.log.error("Invalid sharee detected: {uid}", uid=invitation.shareeUID)
                     invitation = invitation._replace(status=_BIND_STATUS_INVALID)
+
+            invitation = invitation._replace(
+                mode=(
+                    yield self._newStoreObject._effectiveShareMode(
+                        invitation.mode, invitation.shareeUID, self._newStoreObject._txn
+                    )
+                )
+            )
             adjusted_invitations.append(invitation)
 
         returnValue(adjusted_invitations)
@@ -513,8 +544,10 @@
 
         # We currently only handle local users
         sharee = yield self.principalForCalendarUserAddress(userid)
-        if not sharee:
-            returnValue(False)
+        if sharee is None:
+            sharee = yield self.principalForCalendarGroupAddress(userid)
+            if sharee is None:
+                returnValue(False)
 
         result = (yield self._newStoreObject.inviteUIDToShare(
             sharee.principalUID(),
@@ -640,7 +673,9 @@
 
                 # Validate each userid on add only
                 uid = (yield self.validUserIDForShare(userid, request))
-                (okusers if uid is not None else badusers).add(userid)
+                if uid is None:
+                    uid = yield self.principalForCalendarGroupAddress(userid)
+                (badusers if uid is None else okusers).add(userid)
             elif isinstance(item, customxml.InviteRemove):
                 userid, access = _handleInviteRemove(item)
                 removeDict[userid] = access

Modified: CalendarServer/trunk/txdav/caldav/datastore/sql.py
===================================================================
--- CalendarServer/trunk/txdav/caldav/datastore/sql.py	2014-08-07 05:32:02 UTC (rev 13845)
+++ CalendarServer/trunk/txdav/caldav/datastore/sql.py	2014-08-07 07:41:08 UTC (rev 13846)
@@ -1950,11 +1950,15 @@
         returnValue(changed)
 
 
+    @classmethod
     @inlineCallbacks
-    def effectiveShareMode(self):
-        if self._bindMode == _BIND_MODE_GROUP_WRITE:
+    def _effectiveShareMode(cls, bindMode, viewerUID, txn):
+        """
+        Get the effective share mode without a calendar object
+        """
+        if bindMode == _BIND_MODE_GROUP_WRITE:
             returnValue(_BIND_MODE_WRITE)
-        elif self._bindMode in (_BIND_MODE_GROUP, _BIND_MODE_GROUP_READ):
+        elif bindMode in (_BIND_MODE_GROUP, _BIND_MODE_GROUP_READ):
             gs = schema.GROUP_SHAREE
             gm = schema.GROUP_MEMBERSHIP
             rows = yield Select(
@@ -1971,12 +1975,19 @@
                         )
                     )
                 )
-            ).on(self._txn, uid=self.viewerHome().uid())
+            ).on(txn, uid=viewerUID)
             returnValue(rows[0][0])
         else:
-            returnValue(self._bindMode)
+            returnValue(bindMode)
 
 
+    def effectiveShareMode(self):
+        """
+        Get the high level sharemode for calendars shared to users or groups
+        """
+        return self._effectiveShareMode(self._bindMode, self.viewerHome().uid(), self._txn)
+
+
     #
     # Higher level API
     #

Modified: CalendarServer/trunk/txdav/common/datastore/sql.py
===================================================================
--- CalendarServer/trunk/txdav/common/datastore/sql.py	2014-08-07 05:32:02 UTC (rev 13845)
+++ CalendarServer/trunk/txdav/common/datastore/sql.py	2014-08-07 07:41:08 UTC (rev 13846)
@@ -5282,6 +5282,14 @@
         return self._bindMode
 
 
+    @classmethod
+    def _effectiveShareMode(cls, bindMode, viewerUID, txn):
+        """
+        Get the effective share mode without a calendar object
+        """
+        return bindMode
+
+
     def effectiveShareMode(self):
         """
         @see: L{ICalendar.shareMode}
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.macosforge.org/pipermail/calendarserver-changes/attachments/20140807/9e017690/attachment.html>


More information about the calendarserver-changes mailing list