From d4bdc36550ab75f38aba9de377acc6705f38f4c4 Mon Sep 17 00:00:00 2001 From: Guillaume Ayoub Date: Tue, 13 Apr 2010 00:25:01 +0200 Subject: [PATCH] Report item modification to users in various cases. --- NEWS | 1 + radicale/__init__.py | 10 +++++++--- 2 files changed, 8 insertions(+), 3 deletions(-) diff --git a/NEWS b/NEWS index 3dee09f..000dac1 100644 --- a/NEWS +++ b/NEWS @@ -17,6 +17,7 @@ * Twisted dependency removed * Python 3 support * Real URLs for PUT and DELETE +* Concurrent modification reported to users * Many bugs fixed by Roger Wenham diff --git a/radicale/__init__.py b/radicale/__init__.py index 89bc468..b1125eb 100644 --- a/radicale/__init__.py +++ b/radicale/__init__.py @@ -188,15 +188,19 @@ class CalendarHTTPHandler(server.BaseHTTPRequestHandler): def do_PUT(self): """Manage PUT request.""" item = self._calendar.get_item(xmlutils.name_from_path(self.path)) - if not item or self.headers.get("If-Match", item.etag) == item.etag: - # No item, no ETag precondition or precondition verified, put item + if (not item and not self.headers.get("If-Match")) or \ + (item and self.headers.get("If-Match", item.etag) == item.etag): + # PUT allowed in 3 cases + # Case 1: No item and no ETag precondition: Add new item + # Case 2: Item and ETag precondition verified: Modify item + # Case 3: Item and no Etag precondition: Force modifying item ical_request = self._decode( self.rfile.read(int(self.headers["Content-Length"]))) xmlutils.put(self.path, ical_request, self._calendar) self.send_response(client.CREATED) else: - # ETag precondition not verified, do not put item + # PUT rejected in all other cases self.send_response(client.PRECONDITION_FAILED) @check_rights