В Caldav, как сообщить временной диапазон старше 1 года - PullRequest
0 голосов
/ 29 апреля 2020

Я пытаюсь сообщить etag события в фильтрации caldav по временному диапазону. Все работают нормально ожидаемо для временного диапазона старше 1 года. Я всегда получаю сообщение: значение временного диапазона слишком далеко в прошлом. Должен быть включен или позже 20190430

Вот запрос:

<c:calendar-query xmlns:A='DAV:' xmlns:c='urn:ietf:params:xml:ns:caldav'>
    <A:prop>
        <A:getetag/>
    </A:prop>
    <c:filter>
        <c:comp-filter name='VCALENDAR'>
            <c:comp-filter name='VEVENT'>
                    <c:time-range start='20190424T184806Z' end='20190425T184806Z'/>
            </c:comp-filter>
        </c:comp-filter>
    </c:filter>
</c:calendar-query>";

и ответ:

HTTP/1.1 403 Forbidden Date: Wed, 29 Apr 2020 16:48:06 GMT Server: Twisted/13.2.0 TwistedWeb/9.0.0 Content-Length: 289 Strict-Transport-Security: max-age=604800 Content-Type: text/xml DAV: 1, access-control, calendar-access, calendar-schedule, calendar-auto-schedule, calendar-availability, inbox-availability, calendar-proxy, calendarserver-private-events, calendarserver-private-comments, calendarserver-sharing, calendarserver-sharing-no-scheduling, calendar-query-extended, calendar-default-alarms, calendar-managed-attachments, calendarserver-partstat-changes, calendar-no-timezone, calendarserver-recurrence-split, extended-mkcol, calendarserver-principal-property-search, calendarserver-principal-search, calendarserver-home-sync MS-Author-Via: DAV Vary: User-Agent Connection: close Time-range value too far in the past. Must be on or after 20190430. 

Как я могу сообщить о событии старше 1 года?

1 Ответ

0 голосов
/ 02 мая 2020

Итак, из того, что я собрал, я вижу, что ваш сервер caldav использует какой-то сервер Twisted Caldav (никогда не использовал его, никогда даже не использовал встроенный сервер MacOS caldav). Я нашел это архивное хранилище того, что, по-видимому, является реализацией для этого сервера Caldav. В этом репо я нашел Exception, который вы предоставили, здесь :

except TimeRangeLowerLimit, e:
    raise HTTPError(ErrorResponse(
        responsecode.FORBIDDEN,
        caldavxml.MinDateTime(),
        "Time-range value too far in the past. Must be on or after %s." % (str(e.limit),)(str(e.limit),)

Глядя на реализацию TimeRangeLowerLimit Exception здесь :

class TimeRangeLowerLimit(Exception):
    """
    A request for time-range information too far in the past cannot be satisfied.
    """

    def __init__(self, lowerLimit):
        self.limit = lowerLimit

Кажется, что на самом деле установлен лимит. Копаем глубже до MinDateTime класс здесь :

class MinDateTime (CalDAVTextElement):
    """
    Specifies restrictions on a calendar collection.
    (CalDAV-access, RFC 4791 section 5.2.6)
    """
    name = "min-date-time"
    hidden = True
    protected = True

Указывает на секцию 5.2.6 в РФ C 4791 , которая гласит:

Имя: min-date-time

Пространство имен: urn: ietf: params: xml: ns: caldav

Назначение: Предоставляет значение DATE-TIME, указывающее самые ранние дата и время (в UT C), которые сервер готов принять для любого значения DATE или DATE-TIME в ресурсе объекта календаря, хранящемся в коллекции календаря.

Я всегда думал об этом как о пределе ввода, а не о поиске (отчете), что меня сильно смущает. Возвращаясь к реализации, исключение выдается из здесь :

# Determine if the start date is too early for the restricted range we
# are applying. If it is today or later we don't need to worry about truncation
# in the past.
minDate, _ignore_isEndDate = filter.getmintimerange()
if minDate >= today:
    minDate = None
if minDate is not None and config.FreeBusyIndexLowerLimitDays:
    truncateLowerLimit = today - Duration(days=config.FreeBusyIndexLowerLimitDays)
    if minDate < truncateLowerLimit:
        raise TimeRangeLowerLimit(truncateLowerLimit)

Глядя на условие if minDate is not None and config.FreeBusyIndexLowerLimitDays:, как вы хотите использовать minDate (иначе начало time-range), похоже, что единственное возможное решение - установить в конфигурации другое значение FreeBusyIndexLowerLimitDays.

Я никогда не видел этой проблемы с другими реализациями caldav (я в основном использую Sabre), поэтому я к сожалению, больше не могу вам помочь.

...