diff --git a/config b/config index 9c7b8a9..7af788c 100644 --- a/config +++ b/config @@ -46,6 +46,10 @@ request = utf-8 # Encoding for storing local collections stock = utf-8 +[well-known] +caldav = '/%(user)s/caldav/' +carddav = '/%(user)s/carddav/' + [auth] # Authentication method diff --git a/radicale/__init__.py b/radicale/__init__.py index 9067631..dc56019 100644 --- a/radicale/__init__.py +++ b/radicale/__init__.py @@ -36,6 +36,7 @@ import posixpath import socket import ssl import wsgiref.simple_server +import re # Manage Python2/3 different modules # pylint: disable=F0401,E0611 try: @@ -55,6 +56,7 @@ VERSION = "0.9" # Standard "not allowed" response that is returned when an authenticated user # tries to access information they don't have rights to NOT_ALLOWED = (client.FORBIDDEN, {}, None) +WELLKNOWNRE = re.compile(r'/.well-known/(carddav|caldav)/?') class HTTPServer(wsgiref.simple_server.WSGIServer, object): @@ -277,6 +279,25 @@ class Application(object): user = environ.get("REMOTE_USER") password = None + wkfragment = WELLKNOWNRE.match(path) + if wkfragment: + if not user: del user + redirect = config.get("well-known", wkfragment.group(1)) + try: + redirect = redirect % locals() + status = client.SEE_OTHER + log.LOGGER.info("/.well-known/ redirection to: %s" % redirect) + headers = {"Location": redirect.encode('utf8')} + except KeyError: + status = client.UNAUTHORIZED + headers = { + "WWW-Authenticate": + "Basic realm=\"%s\"" % config.get("server", "realm")} + log.LOGGER.info("refused /.well-known/ redirection to anonymous user") + status = "%i %s" % (status, client.responses.get(status, "Unknown")) + start_response(status, headers.items()) + return [] + is_authenticated = auth.is_authenticated(user, password) is_valid_user = is_authenticated or not user diff --git a/radicale/config.py b/radicale/config.py index 3ba983e..5d2b799 100644 --- a/radicale/config.py +++ b/radicale/config.py @@ -51,6 +51,9 @@ INITIAL_CONFIG = { "base_prefix": "/", "can_skip_base_prefix": "False", "realm": "Radicale - Password Required"}, + "well-known": { + "caldav": "/%(user)s/caldav/", + "carddav": "/%(user)s/carddav/"}, "encoding": { "request": "utf-8", "stock": "utf-8"},