示例#1
0
    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
示例#2
0
文件: base.py 项目: tboulogne/davvy
    # 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)
示例#3
0
        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)
示例#4
0
    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)
示例#5
0
    # 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,
示例#6
0
    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)
示例#7
0

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)
示例#8
0
    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