[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