def dispatch(self, request, *args, **kwargs): user = None if 'REMOTE_USER' in request.META: user = User.objects.get(username=request.META['REMOTE_USER']) elif 'HTTP_AUTHORIZATION' in request.META: auth = request.META['HTTP_AUTHORIZATION'].split() if len(auth) == 2: if auth[0].lower() == "basic": uname, passwd = base64.b64decode(auth[1]).split(':') user = authenticate(username=uname, password=passwd) if (user and user.is_active): login(request, user) request.user = user # choose the correct current-user-principal handler (calendars/addressbooks) if self.root == "calendars": from davvy.calendar import prop_dav_calendar_home_set as prop_dav_resource_home_set elif self.root == "addressbook001": from davvy.addressbook import prop_dav_addressbook_home_set as prop_dav_resource_home_set else: from davvy.base import prop_dav_current_user_principal as prop_dav_resource_home_set old_cup_prop = None if prop_dav_resource_home_set: # let's backup current-user-principal handler cup = '{DAV:}current-user-principal' old_cup_prop = davvy.retrieve_prop(cup) # let's modify it davvy.register_prop(cup, prop_dav_resource_home_set, davvy.exceptions.Forbidden) try: response = super(WebDAV, self).dispatch(request, user.username, "/", *args, **kwargs) dav_base = ['1'] dav_base += getattr(settings, 'DAVVY_EXTENSIONS', []) response['Dav'] = ','.join(dav_base + self.dav_extensions) except Exception as e: logger.debug(e) code, phrase = e.status.split(' ', 1) response = HttpResponse(phrase, content_type='text/plain') response.status_code = int(code) response.reason_phrase = phrase finally: if old_cup_prop: # restore current-user-principal davvy.register_prop(*old_cup_prop) else: response = HttpResponse('Unathorized', content_type='text/plain') response.status_code = 401 response['WWW-Authenticate'] = 'Basic realm="davvy"' return response
# for principal in principals: # ace_principal.append(principal) ace.append(ace_principal) grant = davvy.xml_node('{DAV:}grant') privilege = davvy.xml_node('{DAV:}privilege') privilege.append(davvy.xml_node('{DAV:}write')) grant.append(privilege) ace.append(grant) return ace def prop_dav_owner(dav, request, resource): return prop_dav_current_user_principal(dav, request, resource) davvy.register_prop('{DAV:}resourcetype', prop_dav_resourcetype, davvy.exceptions.Forbidden) davvy.register_prop('{DAV:}getcontentlength', prop_dav_getcontentlength, davvy.exceptions.Forbidden) davvy.register_prop('{DAV:}getetag', prop_dav_getetag, davvy.exceptions.Forbidden) davvy.register_prop('{DAV:}getcontenttype', prop_dav_getcontenttype, davvy.exceptions.Forbidden) davvy.register_prop('{DAV:}getlastmodified', prop_dav_getlastmodified, davvy.exceptions.Forbidden) davvy.register_prop('{DAV:}creationdate', prop_dav_creationdate, davvy.exceptions.Forbidden)
else: yield davvy.xml_node( '{DAV:}href', current_user_principal.rstrip('/') + '/' + request.user.username + '/') def prop_dav_calendar_getctag(dav, request, resource): max_value = int(resource.updated_at.strftime('%s')) if resource.collection: for child in resource.resource_set.all(): new_value = int(child.updated_at.strftime('%s')) if new_value > max_value: max_value = new_value return str(max_value) def prop_dav_calendar_user_address_set(dav, request, resource): yield davvy.xml_node('{DAV:}href', 'mailto:' + request.user.email) davvy.register_prop('{urn:ietf:params:xml:ns:caldav}calendar-home-set', prop_dav_calendar_home_set, davvy.exceptions.Forbidden) davvy.register_prop('{http://calendarserver.org/ns/}getctag', prop_dav_calendar_getctag, davvy.exceptions.Forbidden) davvy.register_prop('{urn:ietf:params:xml:ns:caldav}calendar-user-address-set', prop_dav_calendar_user_address_set, davvy.exceptions.Forbidden)
supported_report = davvy.xml_node('{DAV:}supported-report') report = davvy.xml_node('{DAV:}report') supported_report.append(report) calendar_query = davvy.xml_node( '{urn:ietf:params:xml:ns:caldav}calendar-query') report.append(calendar_query) supported_reports.append(supported_report) supported_report = davvy.xml_node('{DAV:}supported-report') report = davvy.xml_node('{DAV:}report') supported_report.append(report) calendar_multiget = davvy.xml_node( '{urn:ietf:params:xml:ns:caldav}calendar-multiget') report.append(calendar_multiget) supported_reports.append(supported_report) supported_report = davvy.xml_node('{DAV:}supported-report') report = davvy.xml_node('{DAV:}report') supported_report.append(report) sync_collection = davvy.xml_node('{DAV:}sync-collection') report.append(sync_collection) supported_reports.append(supported_report) return supported_reports davvy.register_prop('{urn:ietf:params:xml:ns:carddav}addressbook-home-set', prop_dav_addressbook_home_set, davvy.exceptions.Forbidden) davvy.register_prop('{DAV:}supported-report-set', prop_dav_supported_report_set, davvy.exceptions.Forbidden)
# for principal in principals: # ace_principal.append(principal) ace.append(ace_principal) grant = davvy.xml_node('{DAV:}grant') privilege = davvy.xml_node('{DAV:}privilege') privilege.append(davvy.xml_node('{DAV:}write')) grant.append(privilege) ace.append(grant) return ace def prop_dav_owner(dav, request, resource): return prop_dav_current_user_principal(dav, request, resource) davvy.register_prop( '{DAV:}resourcetype', prop_dav_resourcetype, davvy.exceptions.Forbidden) davvy.register_prop( '{DAV:}getcontentlength', prop_dav_getcontentlength, davvy.exceptions.Forbidden) davvy.register_prop( '{DAV:}getetag', prop_dav_getetag, davvy.exceptions.Forbidden) davvy.register_prop( '{DAV:}getcontenttype', prop_dav_getcontenttype,
def prop_dav_calendar_getctag(dav, request, resource): max_value = int(resource.updated_at.strftime('%s')) if resource.collection: for child in resource.resource_set.all(): new_value = int(child.updated_at.strftime('%s')) if new_value > max_value: max_value = new_value return str(max_value) def prop_dav_calendar_user_address_set(dav, request, resource): yield davvy.xml_node('{DAV:}href', 'mailto:' + request.user.email) davvy.register_prop( '{urn:ietf:params:xml:ns:caldav}calendar-home-set', prop_dav_calendar_home_set, davvy.exceptions.Forbidden) davvy.register_prop( '{http://calendarserver.org/ns/}getctag', prop_dav_calendar_getctag, davvy.exceptions.Forbidden) davvy.register_prop( '{urn:ietf:params:xml:ns:caldav}calendar-user-address-set', prop_dav_calendar_user_address_set, davvy.exceptions.Forbidden)
def dispatch(self, request, *args, **kwargs): user = None if 'REMOTE_USER' in request.META: user = User.objects.get(username=request.META['REMOTE_USER']) elif 'HTTP_AUTHORIZATION' in request.META: auth = request.META['HTTP_AUTHORIZATION'].split() if len(auth) == 2: if auth[0].lower() == "basic": uname, passwd = base64.b64decode(auth[1]).split(':') user = authenticate(username=uname, password=passwd) if (user and user.is_active): login(request, user) request.user = user # choose the correct current-user-principal handler (calendars/addressbooks) if self.root == "calendars": from davvy.calendar import prop_dav_calendar_home_set as prop_dav_resource_home_set elif self.root == "addressbook001": from davvy.addressbook import prop_dav_addressbook_home_set as prop_dav_resource_home_set else: from davvy.base import prop_dav_current_user_principal as prop_dav_resource_home_set old_cup_prop = None if prop_dav_resource_home_set: # let's backup current-user-principal handler cup = '{DAV:}current-user-principal' old_cup_prop = davvy.retrieve_prop( cup ) # let's modify it davvy.register_prop( cup, prop_dav_resource_home_set, davvy.exceptions.Forbidden) try: response = super(WebDAV, self).dispatch( request, user.username, "/", *args, **kwargs ) dav_base = ['1'] dav_base += getattr(settings, 'DAVVY_EXTENSIONS', []) response['Dav'] = ','.join(dav_base + self.dav_extensions) except Exception as e: logger.debug(e) code, phrase = e.status.split(' ', 1) response = HttpResponse(phrase, content_type='text/plain') response.status_code = int(code) response.reason_phrase = phrase finally: if old_cup_prop: # restore current-user-principal davvy.register_prop( *old_cup_prop ) else: response = HttpResponse('Unathorized', content_type='text/plain') response.status_code = 401 response['WWW-Authenticate'] = 'Basic realm="davvy"' return response