super-productivity: CalDAV integration not working

Summary

I cannot get CalDAV integration for a project working using the Radicale 2 CalDAV server. It’s unclear whether I should use the display name of the calendar or the UUID when configuring CalDAV integration, but neither work, and both fail in different ways.

Version:

pakku -Qi superproductivity-bin Name : superproductivity-bin Version : 6.5.2-1

uname -a Linux hydra 5.11.16-2-MANJARO #1 SMP PREEMPT Thu Apr 22 09:53:11 UTC 2021 x86_64 GNU/Linux

Steps to reproduce:

I’ve tried to configure CalDAV integration with a project as follows:

Config screenshot

image

However, this doesn’t work. super-productivity reports an error: CalDav: Calendar <resource name> not found instead of downloading the two existing tasks.

The calendar definitely exists and is accessible via a CalDAV client. The resource name matches that on the server’s calendar management page:

View from Radicale configuration page

image

And the tasks are viewable in Korganizer configured to the same CalDAV server.

On the Radicale server with -D enabled, I get the follow response (with some of the response elided for brevity, as they are many other calendars)

Radicale debug log
[7fc35177b740] INFO: Starting Radicale
[7fc35177b740] INFO: Authentication type is 'none'
[7fc35177b740] INFO: Storage type is 'multifilesystem'
[7fc35177b740] INFO: Rights type is 'None'
[7fc35177b740] INFO: Web type is 'internal'
[7fc35177b740] INFO: Listening to 'localhost.localdomain' on port 5232
[7fc35177b740] INFO: Radicale server ready
[7fc350233640] INFO: PROPFIND request for '/*******/' with depth '1' received from '*********' (forwarded by 127.0.0.1) using 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) superProductivity/6.5.2 Chrome/85.0.4183.121 Electron/10.3.1 Safari/537.36'
[7fc350233640] DEBUG: Request headers:
{'CONTENT_LENGTH': '4983',
 'CONTENT_TYPE': 'application/xml; charset=UTF-8',
 'GATEWAY_INTERFACE': 'CGI/1.1',
 'HTTP_ACCEPT': '*/*',
 'HTTP_ACCEPT_ENCODING': 'gzip, deflate, br',
 'HTTP_ACCEPT_LANGUAGE': 'en-US',
 'HTTP_AUTHORIZATION': 'Basic **masked**',
 'HTTP_CONNECTION': 'close',
 'HTTP_DEPTH': '1',
 'HTTP_HOST': '127.0.0.1:5232',
 'HTTP_SEC_FETCH_DEST': 'empty',
 'HTTP_SEC_FETCH_MODE': 'cors',
 'HTTP_SEC_FETCH_SITE': 'cross-site',
 'HTTP_USER_AGENT': 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 '
                    '(KHTML, like Gecko) superProductivity/6.5.2 '
                    'Chrome/85.0.4183.121 Electron/10.3.1 Safari/537.36',
 'HTTP_X_FORWARDED_FOR': '*********',
 'HTTP_X_REQUESTED_WITH': 'SuperProductivity',
 'PATH_INFO': '/*******/',
 'QUERY_STRING': '',
 'REMOTE_ADDR': '127.0.0.1',
 'REMOTE_HOST': '',
 'REQUEST_METHOD': 'PROPFIND',
 'SCRIPT_NAME': '',
 'SERVER_NAME': 'localhost.localdomain',
 'SERVER_PORT': '5232',
 'SERVER_PROTOCOL': 'HTTP/1.0',
 'SERVER_SOFTWARE': 'WSGIServer/0.2',
 'wsgi.errors': <_io.StringIO object at 0x7fc35037f4c0>,
 'wsgi.file_wrapper': <class 'wsgiref.util.FileWrapper'>,
 'wsgi.input': <_io.BufferedReader name=6>,
 'wsgi.multiprocess': False,
 'wsgi.multithread': False,
 'wsgi.run_once': False,
 'wsgi.url_scheme': 'http',
 'wsgi.version': (1, 0)}
[7fc350233640] DEBUG: Sanitized script name: ''
[7fc350233640] DEBUG: Sanitized path: '/*******/'
[7fc350233640] INFO: Successful login: '*******'
[7fc350233640] DEBUG: Request content:
<?xml version="1.0"?>
<propfind xmlns="DAV:" xmlns:C="urn:ietf:params:xml:ns:caldav" xmlns:CS="http://calendarserver.org/ns/" xmlns:ICAL="http://apple.com/ns/ical/" xmlns:ns1="http://owncloud.org/ns" xmlns:ns5="http://nextcloud.com/ns">
  <prop>
    <getcontenttype />
    <getetag />
    <resourcetype />
    <displayname />
    <owner />
    <resourcetype />
    <sync-token />
    <current-user-privilege-set />
    <displayname />
    <owner />
    <resourcetype />
    <sync-token />
    <current-user-privilege-set />
    <ns1:invite />
    <CS:allowed-sharing-modes />
    <CS:publish-url />
    <ICAL:calendar-order />
    <ICAL:calendar-color />
    <CS:getctag />
    <C:calendar-description />
    <C:calendar-timezone />
    <C:supported-calendar-component-set />
    <C:supported-calendar-data />
    <C:max-resource-size />
    <C:min-date-time />
    <C:max-date-time />
    <C:max-instances />
    <C:max-attendees-per-instance />
    <C:supported-collation-set />
    <C:calendar-free-busy-set />
    <C:schedule-calendar-transp />
    <C:schedule-default-calendar-URL />
    <ns1:calendar-enabled />
    <ns5:owner-displayname />
    <displayname />
    <owner />
    <resourcetype />
    <sync-token />
    <current-user-privilege-set />
    <ns1:invite />
    <CS:allowed-sharing-modes />
    <CS:publish-url />
    <ICAL:calendar-order />
    <ICAL:calendar-color />
    <CS:getctag />
    <C:calendar-description />
    <C:calendar-timezone />
    <C:supported-calendar-component-set />
    <C:supported-calendar-data />
    <C:max-resource-size />
    <C:min-date-time />
    <C:max-date-time />
    <C:max-instances />
    <C:max-attendees-per-instance />
    <C:supported-collation-set />
    <C:calendar-free-busy-set />
    <C:schedule-calendar-transp />
    <C:schedule-default-calendar-URL />
    <ns1:calendar-enabled />
    <ns5:owner-displayname />
    <CS:source />
    <ICAL:refreshrate />
    <CS:subscribed-strip-todos />
    <CS:subscribed-strip-alarms />
    <CS:subscribed-strip-attachments />
    <displayname />
    <owner />
    <resourcetype />
    <sync-token />
    <current-user-privilege-set />
    <ns1:invite />
    <CS:allowed-sharing-modes />
    <CS:publish-url />
    <ICAL:calendar-order />
    <ICAL:calendar-color />
    <CS:getctag />
    <C:calendar-description />
    <C:calendar-timezone />
    <C:supported-calendar-component-set />
    <C:supported-calendar-data />
    <C:max-resource-size />
    <C:min-date-time />
    <C:max-date-time />
    <C:max-instances />
    <C:max-attendees-per-instance />
    <C:supported-collation-set />
    <C:calendar-free-busy-set />
    <C:schedule-calendar-transp />
    <C:schedule-default-calendar-URL />
    <ns1:calendar-enabled />
    <ns5:owner-displayname />
    <C:calendar-availability />
    <displayname />
    <owner />
    <resourcetype />
    <sync-token />
    <current-user-privilege-set />
  </prop>
</propfind>

[7fc350233640] DEBUG: '*******' has read and write access to collection '*******'
...
[7fc350233640] DEBUG: '*******' has read and write access to collection '*******/aa*****************df'
[7fc350233640] DEBUG: Response content:
...
  <response>
    <href>/*******/aa**********df/</href>
    <propstat>
      <prop>
        <getcontenttype>text/calendar</getcontenttype>
        <getetag>"4f54e9740a4e9ff4eab182e6a7c47b61"</getetag>
        <resourcetype>
          <C:calendar />
          <collection />
        </resourcetype>
        <displayname>Test</displayname>
        <owner>
          <href>/*******/</href>
        </owner>
        <resourcetype>
          <C:calendar />
          <collection />
        </resourcetype>
        <sync-token>http://radicale.org/ns/sync/0695b67b4c32dbf82333fe8aaeb8a3c4</sync-token>
        <current-user-privilege-set>
          <privilege>
            <read />
          </privilege>
          <privilege>
            <all />
          </privilege>
          <privilege>
            <write />
          </privilege>
          <privilege>
            <write-properties />
          </privilege>
          <privilege>
            <write-content />
          </privilege>
        </current-user-privilege-set>
        <displayname>Test</displayname>
        <owner>
          <href>/*******/</href>
        </owner>
        <resourcetype>
          <C:calendar />
          <collection />
        </resourcetype>
        <sync-token>http://radicale.org/ns/sync/0695b67b4c32dbf82333fe8aaeb8a3c4</sync-token>
        <current-user-privilege-set>
          <privilege>
            <read />
          </privilege>
          <privilege>
            <all />
          </privilege>
          <privilege>
            <write />
          </privilege>
          <privilege>
            <write-properties />
          </privilege>
          <privilege>
            <write-content />
          </privilege>
        </current-user-privilege-set>
        <ICAL:calendar-order>0</ICAL:calendar-order>
        <ICAL:calendar-color>#5b617aff</ICAL:calendar-color>
        <CS:getctag>"4f54e9740a4e9ff4eab182e6a7c47b61"</CS:getctag>
        <C:supported-calendar-component-set>
          <C:comp name="VEVENT" />
          <C:comp name="VJOURNAL" />
          <C:comp name="VTODO" />
        </C:supported-calendar-component-set>
        <displayname>Test</displayname>
        <owner>
          <href>/*******/</href>
        </owner>
        <resourcetype>
          <C:calendar />
          <collection />
        </resourcetype>
        <sync-token>http://radicale.org/ns/sync/0695b67b4c32dbf82333fe8aaeb8a3c4</sync-token>
        <current-user-privilege-set>
          <privilege>
            <read />
          </privilege>
          <privilege>
            <all />
          </privilege>
          <privilege>
            <write />
          </privilege>
          <privilege>
            <write-properties />
          </privilege>
          <privilege>
            <write-content />
          </privilege>
        </current-user-privilege-set>
        <ICAL:calendar-order>0</ICAL:calendar-order>
        <ICAL:calendar-color>#5b617aff</ICAL:calendar-color>
        <CS:getctag>"4f54e9740a4e9ff4eab182e6a7c47b61"</CS:getctag>
        <C:supported-calendar-component-set>
          <C:comp name="VEVENT" />
          <C:comp name="VJOURNAL" />
          <C:comp name="VTODO" />
        </C:supported-calendar-component-set>
        <displayname>Test</displayname>
        <owner>
          <href>/*******/</href>
        </owner>
        <resourcetype>
          <C:calendar />
          <collection />
        </resourcetype>
        <sync-token>http://radicale.org/ns/sync/0695b67b4c32dbf82333fe8aaeb8a3c4</sync-token>
        <current-user-privilege-set>
          <privilege>
            <read />
          </privilege>
          <privilege>
            <all />
          </privilege>
          <privilege>
            <write />
          </privilege>
          <privilege>
            <write-properties />
          </privilege>
          <privilege>
            <write-content />
          </privilege>
        </current-user-privilege-set>
        <ICAL:calendar-order>0</ICAL:calendar-order>
        <ICAL:calendar-color>#5b617aff</ICAL:calendar-color>
        <CS:getctag>"4f54e9740a4e9ff4eab182e6a7c47b61"</CS:getctag>
        <C:supported-calendar-component-set>
          <C:comp name="VEVENT" />
          <C:comp name="VJOURNAL" />
          <C:comp name="VTODO" />
        </C:supported-calendar-component-set>
        <displayname>Test</displayname>
        <owner>
          <href>/*******/</href>
        </owner>
        <resourcetype>
          <C:calendar />
          <collection />
        </resourcetype>
        <sync-token>http://radicale.org/ns/sync/0695b67b4c32dbf82333fe8aaeb8a3c4</sync-token>
        <current-user-privilege-set>
          <privilege>
            <read />
          </privilege>
          <privilege>
            <all />
          </privilege>
          <privilege>
            <write />
          </privilege>
          <privilege>
            <write-properties />
          </privilege>
          <privilege>
            <write-content />
          </privilege>
        </current-user-privilege-set>
      </prop>
      <status>HTTP/1.1 200 OK</status>
    </propstat>
    <propstat>
      <prop>
        <ns1:invite />
        <CS:allowed-sharing-modes />
        <CS:publish-url />
        <C:calendar-description />
        <C:calendar-timezone />
        <C:supported-calendar-data />
        <C:max-resource-size />
        <C:min-date-time />
        <C:max-date-time />
        <C:max-instances />
        <C:max-attendees-per-instance />
        <C:supported-collation-set />
        <C:calendar-free-busy-set />
        <C:schedule-calendar-transp />
        <C:schedule-default-calendar-URL />
        <ns1:calendar-enabled />
        <ns5:owner-displayname />
        <ns1:invite />
        <CS:allowed-sharing-modes />
        <CS:publish-url />
        <C:calendar-description />
        <C:calendar-timezone />
        <C:supported-calendar-data />
        <C:max-resource-size />
        <C:min-date-time />
        <C:max-date-time />
        <C:max-instances />
        <C:max-attendees-per-instance />
        <C:supported-collation-set />
        <C:calendar-free-busy-set />
        <C:schedule-calendar-transp />
        <C:schedule-default-calendar-URL />
        <ns1:calendar-enabled />
        <ns5:owner-displayname />
        <CS:source />
        <ICAL:refreshrate />
        <CS:subscribed-strip-todos />
        <CS:subscribed-strip-alarms />
        <CS:subscribed-strip-attachments />
        <ns1:invite />
        <CS:allowed-sharing-modes />
        <CS:publish-url />
        <C:calendar-description />
        <C:calendar-timezone />
        <C:supported-calendar-data />
        <C:max-resource-size />
        <C:min-date-time />
        <C:max-date-time />
        <C:max-instances />
        <C:max-attendees-per-instance />
        <C:supported-collation-set />
        <C:calendar-free-busy-set />
        <C:schedule-calendar-transp />
        <C:schedule-default-calendar-URL />
        <ns1:calendar-enabled />
        <ns5:owner-displayname />
        <C:calendar-availability />
      </prop>
      <status>HTTP/1.1 404 Not Found</status>
    </propstat>
  </response>
</multistatus>

[7fc350233640] INFO: PROPFIND response status for '/*******/' with depth '1' in 3.375 seconds: 207 Multi-Status

When I use the display name instead of the resource UUID, I get a different error: CalDav: Request failed because of a client side network error. I also get different behaviour in the Radicale debug log:

Radicale debug log
> sudo -u radicale -g radicale radicale -D
[7f81ecca0740] INFO: Starting Radicale
[7f81ecca0740] INFO: Authentication type is 'none'
[7f81ecca0740] INFO: Storage type is 'multifilesystem'
[7f81ecca0740] INFO: Rights type is 'None'
[7f81ecca0740] INFO: Web type is 'internal'
[7f81ecca0740] INFO: Listening to 'localhost.localdomain' on port 5232
[7f81ecca0740] INFO: Radicale server ready
[7f81eb758640] INFO: REPORT request for '/********/aa*****df/' with depth '1' received from '****' (forwarded by 127.0.0.1) using 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) superProductivity/6.5.2 Chrome/85.0.4183.121 Electron/10.3.1 Safari/537.36'
[7f81eb758640] DEBUG: Request headers:
{'CONTENT_LENGTH': '519',
 'CONTENT_TYPE': 'application/xml; charset=UTF-8',
 'GATEWAY_INTERFACE': 'CGI/1.1',
 'HTTP_ACCEPT': '*/*',
 'HTTP_ACCEPT_ENCODING': 'gzip, deflate, br',
 'HTTP_ACCEPT_LANGUAGE': 'en-US',
 'HTTP_AUTHORIZATION': 'Basic **masked**',
 'HTTP_CONNECTION': 'close',
 'HTTP_DEPTH': '1',
 'HTTP_HOST': '127.0.0.1:5232',
 'HTTP_SEC_FETCH_DEST': 'empty',
 'HTTP_SEC_FETCH_MODE': 'cors',
 'HTTP_SEC_FETCH_SITE': 'cross-site',
 'HTTP_USER_AGENT': 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 '
                    '(KHTML, like Gecko) superProductivity/6.5.2 '
                    'Chrome/85.0.4183.121 Electron/10.3.1 Safari/537.36',
 'HTTP_X_FORWARDED_FOR': '******'
 'HTTP_X_REQUESTED_WITH': 'SuperProductivity',
 'PATH_INFO': '/*******/aa**********df/',
 'QUERY_STRING': '',
 'REMOTE_ADDR': '127.0.0.1',
 'REMOTE_HOST': '',
 'REQUEST_METHOD': 'REPORT',
 'SCRIPT_NAME': '',
 'SERVER_NAME': 'localhost.localdomain',
 'SERVER_PORT': '5232',
 'SERVER_PROTOCOL': 'HTTP/1.0',
 'SERVER_SOFTWARE': 'WSGIServer/0.2',
 'wsgi.errors': <_io.StringIO object at 0x7f81eb8a44c0>,
 'wsgi.file_wrapper': <class 'wsgiref.util.FileWrapper'>,
 'wsgi.input': <_io.BufferedReader name=6>,
 'wsgi.multiprocess': False,
 'wsgi.multithread': False,
 'wsgi.run_once': False,
 'wsgi.url_scheme': 'http',
 'wsgi.version': (1, 0)}
[7f81eb758640] DEBUG: Sanitized script name: ''
[7f81eb758640] DEBUG: Sanitized path: '/*******/aa**********df/'
[7f81eb758640] INFO: Successful login: '*******'
[7f81eb758640] DEBUG: Request content:
<?xml version="1.0"?>
<C:calendar-query xmlns="DAV:" xmlns:C="urn:ietf:params:xml:ns:caldav">
  <prop>
    <getcontenttype />
    <getetag />
    <resourcetype />
    <displayname />
    <owner />
    <resourcetype />
    <sync-token />
    <current-user-privilege-set />
    <getcontenttype />
    <getetag />
    <resourcetype />
    <C:calendar-data />
  </prop>
  <C:filter>
    <C:comp-filter name="VCALENDAR">
      <C:comp-filter name="VTODO">
        <C:prop-filter name="completed">
          <C:is-not-defined />
        </C:prop-filter>
      </C:comp-filter>
    </C:comp-filter>
  </C:filter>
</C:calendar-query>

[7f81eb758640] DEBUG: Response content:
<?xml version="1.0"?>
<multistatus xmlns="DAV:" xmlns:C="urn:ietf:params:xml:ns:caldav">
  <response>
    <href>/*******/aa**********df/1620409259.R512.ics</href>
    <propstat>
      <prop>
        <getcontenttype>text/calendar;charset=utf-8;component=VTODO</getcontenttype>
        <getetag>"9ccd15cc006d763e5c5f244e6005e8fa"</getetag>
        <getcontenttype>text/calendar;charset=utf-8;component=VTODO</getcontenttype>
        <getetag>"9ccd15cc006d763e5c5f244e6005e8fa"</getetag>
        <C:calendar-data>BEGIN:VCALENDAR
VERSION:2.0
PRODID:-//K Desktop Environment//NONSGML libkcal 4.3//EN
X-KDE-ICAL-IMPLEMENTATION-VERSION:1.0
BEGIN:VTODO
CLASS:PRIVATE
CREATED:20190604T070127Z
DTSTAMP:20210507T174058Z
LAST-MODIFIED:20210507T174058Z
PERCENT-COMPLETE:0
SEQUENCE:4
STATUS:NEEDS-ACTION
SUMMARY:Use examples in blog post
UID:E7CE2FA9-FD0D-4888-B5C7-7693C8B2C607
BEGIN:VALARM
ACTION:DISPLAY
DESCRIPTION:Reminder
TRIGGER;VALUE=DATE-TIME:20190906T190000Z
X-KDE-KCALCORE-ENABLED:TRUE
X-WR-ALARMUID:29640889-4D8C-467B-9311-4CCAC25A1DEF
END:VALARM
BEGIN:VALARM
ACTION:DISPLAY
DESCRIPTION:Reminder
TRIGGER;VALUE=DATE-TIME:20190813T190000Z
X-KDE-KCALCORE-ENABLED:TRUE
X-WR-ALARMUID:821DEC02-B2EA-410A-AEB9-E95AF2083BDF
END:VALARM
X-APPLE-SORT-ORDER:2155
END:VTODO
END:VCALENDAR
</C:calendar-data>
      </prop>
      <status>HTTP/1.1 200 OK</status>
    </propstat>
    <propstat>
      <prop>
        <resourcetype />
        <displayname />
        <owner />
        <resourcetype />
        <sync-token />
        <current-user-privilege-set />
        <resourcetype />
      </prop>
      <status>HTTP/1.1 404 Not Found</status>
    </propstat>
  </response>
  <response>
    <href>/*******/aa**********df/1620409273.R103.ics</href>
    <propstat>
      <prop>
        <getcontenttype>text/calendar;charset=utf-8;component=VTODO</getcontenttype>
        <getetag>"649f002f72d50f9902bbf6cc0dfbb7b6"</getetag>
        <getcontenttype>text/calendar;charset=utf-8;component=VTODO</getcontenttype>
        <getetag>"649f002f72d50f9902bbf6cc0dfbb7b6"</getetag>
        <C:calendar-data>BEGIN:VCALENDAR
VERSION:2.0
PRODID:-//K Desktop Environment//NONSGML libkcal 4.3//EN
X-KDE-ICAL-IMPLEMENTATION-VERSION:1.0
BEGIN:VTODO
CATEGORIES:Blog
CLASS:PRIVATE
CREATED:20200624T043045Z
DTSTAMP:20210507T174113Z
LAST-MODIFIED:20210507T174113Z
PERCENT-COMPLETE:0
SEQUENCE:2
STATUS:NEEDS-ACTION
SUMMARY:Write a blog post on WSL
UID:98B0010C-561A-44D0-A2BE-B3AC034D3CD2
BEGIN:VALARM
ACTION:DISPLAY
DESCRIPTION:Reminder
TRIGGER;VALUE=DATE-TIME:20200627T190000Z
X-KDE-KCALCORE-ENABLED:TRUE
X-WR-ALARMUID:B2F9EA04-9161-4F9D-9A23-1335EE81848E
END:VALARM
X-APPLE-SORT-ORDER:613359222
END:VTODO
END:VCALENDAR
</C:calendar-data>
      </prop>
      <status>HTTP/1.1 200 OK</status>
    </propstat>
    <propstat>
      <prop>
        <resourcetype />
        <displayname />
        <owner />
        <resourcetype />
        <sync-token />
        <current-user-privilege-set />
        <resourcetype />
      </prop>
      <status>HTTP/1.1 404 Not Found</status>
    </propstat>
  </response>
</multistatus>

[7f81eb758640] INFO: REPORT response status for '/*******/aa**********df/' with depth '1' in 0.008 seconds: 207 Multi-Status

About this issue

  • Original URL
  • State: closed
  • Created 3 years ago
  • Comments: 15 (9 by maintainers)

Commits related to this issue

Most upvoted comments

I saw the note about whitelisting on the syncing option. I missed that in the global settings initially.

All is working for me now. Sorry about that, but thanks for the assist.

I don’t know it is because of an update of either Nextcloud (19.0.12) or SuperProductivity (7.0.1) or that I did something genious, but finally I got the CalDav sync without errors. It doesn’t matter if I add a / or no one at the end of the baseUrl in the sync settings. This issue seems to be solved. For me at least.

I’ve implemented this feature very much with Nextcloud in mind. This was my testcase and I used their client library for interacting with the server. It seems that caldav as a standard is not as interoperable as it semems…

From my installation, the caldav base url is https://my.host.name/remote.php/dav. The URL to an actual calendar is then e.g. https://my.host.name/remote.php/dav/calendars/jan/work. So I put in as base url https://my.host.name/remote.php/dav and as resource name just “work”.

The library then uses the base-url to “discover” all available “collections” (calendars) and matches their name or display-name against the given resource-name (both are tried). For posteo I found this: https://posteo.de/en/help/synchronising-contacts-and-calendar-entries-with-the-address-book-and-calendar-using-davdroid-android but I haven’t tried it.