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 2824efd..32237c3 100644 --- a/radicale/__init__.py +++ b/radicale/__init__.py @@ -286,6 +286,25 @@ class Application(object): user = environ.get("REMOTE_USER") password = None + if path.startswith('/.well-known/'): + fragment = path.rstrip("/").rsplit('/', 1)[-1] + redirect = config.get("well-known", fragment) + if redirect: + if not user and "%(user)s" in redirect: + status = client.UNAUTHORIZED + headers = { + "WWW-Authenticate": + "Basic realm=\"%s\"" % config.get("server", "realm")} + log.LOGGER.info("refused /.well-known/ redirection to anonymous user") + else: + redirect = redirect % locals() + status = client.SEE_OTHER + log.LOGGER.info("/.well-known/ redirection to: %s" % redirect) + headers = {"Location": redirect.encode('utf8')} + 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"},