Kozea / Radicale

A simple CalDAV (calendar) and CardDAV (contact) server.
https://radicale.org
GNU General Public License v3.0
3.3k stars 429 forks source link

Reminders in macOS #1094

Open iandundas opened 4 years ago

iandundas commented 4 years ago

Hi,

I've got Radicale working with macOS Calendar, I can add events and if I disable/re-enable the account the added events disappear and appear again in Calendar (indicating that they're not just somehow available locally only)

image

However, even though I ticked the "use with Reminders" box, and I created a calendar in Radicale that supports "[calendar, journal and tasks]", actually no available task list shows up in the Reminders app (it just shows the hostname but without any lists inside). The Calendar app shows the hostname and the available calendars beneath.

Radicale:

image

macOS Calendars, showing the radicale calendar:

image

macOS reminders, showing the header but no reminder lists visible:

image

I will provide more info, but before that can I just check if anyone can confirm that they know Radicale does support MacOS Reminders?

As I said, the calendars work great, so I feel like I'm almost there getting it configured 😀/😩

Radicale version 3.0.4

Thanks!

iandundas commented 4 years ago

p.s. I'm using the macOS 11.0 Beta (20A5323l), so it's vaguely possible that that is the issue here, also. But if anyone can just give me a "yeah it should work fine" or "nope it's well known not to work", that would be handy. Thanks again

iandundas commented 4 years ago

If I manually add a Reminders list to the Radicale account, it seems to only exist locally, because it doesn't show up on the Radicale web page, and doesn't survive disabling/enabling the account in macOS

iandundas commented 4 years ago

I found some information here that indicated that auto-discovery requires Radicale to not be run from a subpath.

So I tweaked my nginx file to make it reachable from the root directory:

server {
   ... (removed)

    location / { # The trailing / is important!
        proxy_pass        http://localhost:5232/; # The / is important!
        proxy_set_header  X-Script-Name /;
        proxy_set_header  X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header  Host $http_host;
        proxy_pass_header Authorization;
    }
}
image

hurrah it seems to work now

tieugene commented 3 years ago

I'm using radicale as WSGI app behind Apache. As I found Reminder works OK if radicale is root of web-server. But in virtual dir (e.g. '/radicale/') - Contacts and Calendar OK, but Reminder oops. My investigation show (via HTTPS, because Apple not works with HTTP):

Good dialog (/):

Last PROPFIND payload:

<?xml version="1.0"?>
<propfind xmlns="DAV:">
  <prop>
    <current-user-principal />
    <principal-URL />
    <resourcetype />
  </prop>
</propfind>

Response payload:

<?xml version="1.0"?>
<multistatus xmlns="DAV:">
  <response>
    <href>/</href>
    <propstat>
      <prop>
        <current-user-principal>
          <href>/username/</href>
        </current-user-principal>
        <resourcetype>
          <collection />
        </resourcetype>
      </prop>
      <status>HTTP/1.1 200 OK</status>
    </propstat>
    <propstat>
      <prop>
        <principal-URL />
      </prop>
      <status>HTTP/1.1 404 Not Found</status>
    </propstat>
  </response>
</multistatus>

Bad dialog (/radicale/):

After this reminder tries /principals/, /calendar/dav/username/user/ and many other strange things.

Seems best solution is to rewrite (or redirect?) PROPFIND / (and only this) request into /radicale/. Not tested yet (have no enough skills in Apache).

luckydonald commented 2 years ago

In a different software (monica, and with in that case the Contacts app), they figured out that for reverse proxies you'd need the .well-know/caldav directory to properly be routed as well. For the contacts it would be .well-know/carddav.

This can be confirmed by running curl -v https://radicale.example.com/.well-known/carddav and having a proper Location header in the response, confirming the redirect.


Radicale should do that redirect for you, as of version 3.1.3 or later, around February, 2022.

alqu commented 2 years ago

In my Nginx-Config this looks like the following:

    location = /.well-known/caldav  { return 302 /radicale/; }
    location = /.well-known/carddav { return 302 /radicale/; }

    location /radicale/ {       # The trailing / is important.
        proxy_pass              http://127.0.0.1:5232/;
        proxy_set_header        X-Script-Name /radicale;
        proxy_set_header        X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header        X-Remote-User $remote_user;
        proxy_set_header        Host $http_host;
        proxy_buffering         on;
        auth_basic              "Restricted Content";
        auth_basic_user_file    /etc/nginx/conf.d/radicale.htpasswd;
    }
davidtakac commented 3 months ago

@iandundas Have you tried your solution on iOS by any chance? With your solution, Calendar pulls all the calendars correctly, but Reminders still does not see any calendars (be they a combination of [calendar, journal and tasks] or just [tasks]).

Here's my nginx config. The location / directive is the exact same as yours. Additionally:

server {
    listen 443 ssl;
    server_name 10.7.0.1;

    ssl_certificate /etc/nginx/ssl/self-signed.crt;
    ssl_certificate_key /etc/nginx/ssl/self-signed.key;

    location = /.well-known/caldav  { return 301 /; }
    location = /.well-known/carddav { return 301 /; }

    location / { # The trailing / is important!
        proxy_pass        http://localhost:5232/; # The / is important!
        proxy_set_header  X-Script-Name /;
        proxy_set_header  X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header  Host $http_host;
        proxy_pass_header Authorization;
    }
}

I'm adding the account in iOS settings with the URL https://10.7.0.1/ and the username and password of my Radicale user. When I save the changes, in Advanced settings I see the URL gets rewritten to https://10.7.0.1/myusername/.