From bd5b34501757e6db5437718604e7fbb95de9f18a Mon Sep 17 00:00:00 2001 From: Guillaume Ayoub Date: Sat, 3 Jul 2010 16:27:48 +0200 Subject: [PATCH] Add support for personal calendars, available only for owner. --- radicale/__init__.py | 8 ++++---- radicale/acl/htpasswd.py | 5 +++-- radicale/config.py | 1 + 3 files changed, 8 insertions(+), 6 deletions(-) diff --git a/radicale/__init__.py b/radicale/__init__.py index f5aabcb8..cbc7b601 100644 --- a/radicale/__init__.py +++ b/radicale/__init__.py @@ -53,18 +53,17 @@ VERSION = "git" def _check(request, function): """Check if user has sufficient rights for performing ``request``.""" + # ``_check`` decorator can access ``request`` protected functions + # pylint: disable=W0212 authorization = request.headers.get("Authorization", None) if authorization: challenge = authorization.lstrip("Basic").strip().encode("ascii") - # ``_check`` decorator can access ``request`` protected functions - # pylint: disable=W0212 plain = request._decode(base64.b64decode(challenge)) - # pylint: enable=W0212 user, password = plain.split(":") else: user = password = None - if request.server.acl.has_right(user, password): + if request.server.acl.has_right(request._calendar.owner, user, password): function(request) else: request.send_response(client.UNAUTHORIZED) @@ -72,6 +71,7 @@ def _check(request, function): "WWW-Authenticate", "Basic realm=\"Radicale Server - Password Required\"") request.end_headers() + # pylint: enable=W0212 class HTTPServer(server.HTTPServer): diff --git a/radicale/acl/htpasswd.py b/radicale/acl/htpasswd.py index 0933e30d..bb2f26bc 100644 --- a/radicale/acl/htpasswd.py +++ b/radicale/acl/htpasswd.py @@ -54,15 +54,16 @@ def _sha1(hash_value, password): return sha1.digest() == base64.b64decode(hash_value) -def has_right(user, password): +def has_right(owner, user, password): """Check if ``user``/``password`` couple is valid.""" for line in open(FILENAME).readlines(): if line.strip(): login, hash_value = line.strip().split(":") - if login == user: + if login == user and (not PERSONAL or user == owner): return CHECK_PASSWORD(hash_value, password) return False FILENAME = config.get("acl", "filename") +PERSONAL = config.getboolean("acl", "personal") CHECK_PASSWORD = locals()["_%s" % config.get("acl", "encryption")] diff --git a/radicale/config.py b/radicale/config.py index 020733f3..1cf9dd67 100644 --- a/radicale/config.py +++ b/radicale/config.py @@ -52,6 +52,7 @@ INITIAL_CONFIG = { "stock": "utf-8"}, "acl": { "type": "fake", + "personal": "False", "filename": "/etc/radicale/users", "encryption": "crypt"}, "storage": {