def http_POST(self, request): """ The CalDAV POST method. This uses a generator function yielding either L{waitForDeferred} objects or L{Response} objects. This allows for code that follows a 'linear' execution pattern rather than having to use nested L{Deferred} callbacks. The logic is easier to follow this way plus we don't run into deep nesting issues which the other approach would have with large numbers of recipients. """ # Check authentication and access controls yield self.authorize(request, (caldavxml.ScheduleSend(), )) calendar, format = (yield self.loadCalendarFromRequest(request)) originator = (yield self.loadOriginatorFromRequestDetails(request)) recipients = self.loadRecipientsFromCalendarData(calendar) # Log extended item if not hasattr(request, "extendedLogItems"): request.extendedLogItems = {} # This is a local CALDAV scheduling operation. scheduler = CalDAVScheduler(self._associatedTransaction, self.parent._newStoreHome.uid(), logItems=request.extendedLogItems) # Do the POST processing treating result = (yield scheduler.doSchedulingViaPOST(originator, recipients, calendar)) returnValue(result.response(format=format))
def _schedulePrivilegeSet(deliver): edited = False top_supported_privileges = [] for supported_privilege in davPrivilegeSet.childrenOfType(davxml.SupportedPrivilege): all_privilege = supported_privilege.childOfType(davxml.Privilege) if isinstance(all_privilege.children[0], davxml.All): all_description = supported_privilege.childOfType(davxml.Description) all_supported_privileges = list(supported_privilege.childrenOfType(davxml.SupportedPrivilege)) all_supported_privileges.append( davxml.SupportedPrivilege( davxml.Privilege(caldavxml.ScheduleDeliver() if deliver else caldavxml.ScheduleSend()), davxml.Description("schedule privileges for current principal", **{"xml:lang": "en"}), ), ) if config.Scheduling.CalDAV.OldDraftCompatibility: all_supported_privileges.append( davxml.SupportedPrivilege( davxml.Privilege(caldavxml.Schedule()), davxml.Description("old-style schedule privileges for current principal", **{"xml:lang": "en"}), ), ) top_supported_privileges.append( davxml.SupportedPrivilege(all_privilege, all_description, *all_supported_privileges) ) edited = True else: top_supported_privileges.append(supported_privilege) assert edited, "Structure of davPrivilegeSet changed in a way that I don't know how to extend for schedulePrivilegeSet" return davxml.SupportedPrivilegeSet(*top_supported_privileges)
def defaultAccessControlList(self): if config.EnableProxyPrincipals: myPrincipal = yield self.parent.principalForRecord() privs = (davxml.Privilege(caldavxml.ScheduleSend()), ) if config.Scheduling.CalDAV.OldDraftCompatibility: privs += (davxml.Privilege(caldavxml.Schedule()), ) returnValue( davxml.ACL( # CalDAV:schedule for associated write proxies davxml.ACE( davxml.Principal( davxml.HRef( joinURL(myPrincipal.principalURL(), "calendar-proxy-write"))), davxml.Grant(*privs), davxml.Protected(), ), )) else: returnValue( super(ScheduleOutboxResource, self).defaultAccessControlList())