From b863e8390e06c9dc4d27b519fcec125edca89e3d Mon Sep 17 00:00:00 2001 From: deronnax Date: Mon, 20 Oct 2014 17:03:23 +0200 Subject: [PATCH] add ".well-known" addresses feature (closes #126) --- config | 4 ++++ radicale/__init__.py | 19 +++++++++++++++++++ radicale/config.py | 3 +++ 3 files changed, 26 insertions(+) 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"},