Просмотр исходного кода

Check that vobject_item have a UID

Unrud 8 лет назад
Родитель
Сommit
2860c664d0

+ 2 - 0
radicale/__init__.py

@@ -788,6 +788,8 @@ class Application:
 
 
             try:
             try:
                 items = list(vobject.readComponents(content or ""))
                 items = list(vobject.readComponents(content or ""))
+                for item in items:
+                    storage.check_item(item)
             except Exception as e:
             except Exception as e:
                 self.logger.warning(
                 self.logger.warning(
                     "Bad PUT request on %r: %s", path, e, exc_info=True)
                     "Bad PUT request on %r: %s", path, e, exc_info=True)

+ 21 - 2
radicale/storage.py

@@ -114,6 +114,20 @@ def load(configuration, logger):
     return CollectionCopy
     return CollectionCopy
 
 
 
 
+def check_item(vobject_item):
+    """Check vobject items for common errors."""
+    if vobject_item.name == "VCALENDAR":
+        for component in vobject_item.components():
+            if (component.name in ("VTODO", "VEVENT", "VJOURNAL") and
+                    not get_uid(component)):
+                raise ValueError("UID in %s is missing" % component.name)
+    elif vobject_item.name == "VCARD":
+        if not get_uid(vobject_item):
+            raise ValueError("UID in VCARD is missing")
+    else:
+        raise ValueError("Unknown item type: %r" % vobject_item.name)
+
+
 def scandir(path, only_dirs=False, only_files=False):
 def scandir(path, only_dirs=False, only_files=False):
     """Iterator for directory elements. (For compatibility with Python < 3.5)
     """Iterator for directory elements. (For compatibility with Python < 3.5)
 
 
@@ -986,8 +1000,13 @@ class Collection(BaseCollection):
             cinput_hash = cetag = ctext = ctag = cstart = cend = None
             cinput_hash = cetag = ctext = ctag = cstart = cend = None
         vobject_item = None
         vobject_item = None
         if input_hash != cinput_hash:
         if input_hash != cinput_hash:
-            vobject_item = Item(self, href=href,
-                                text=btext.decode(self.encoding)).item
+            try:
+                vobject_item = Item(self, href=href,
+                                    text=btext.decode(self.encoding)).item
+                check_item(vobject_item)
+            except Exception as e:
+                raise RuntimeError("Failed to parse item %r from %r: %s" %
+                                   (href, self.path, e)) from e
             # Serialize the object again, to normalize the text representation.
             # Serialize the object again, to normalize the text representation.
             # The storage may have been edited externally.
             # The storage may have been edited externally.
             ctext = vobject_item.serialize()
             ctext = vobject_item.serialize()

+ 1 - 0
radicale/tests/static/todo2.ics

@@ -23,5 +23,6 @@ BEGIN:VTODO
 DTSTART;TZID=Europe/Paris:20130901T180000
 DTSTART;TZID=Europe/Paris:20130901T180000
 DUE;TZID=Europe/Paris:20130903T180000
 DUE;TZID=Europe/Paris:20130903T180000
 RRULE:FREQ=MONTHLY
 RRULE:FREQ=MONTHLY
+UID:todo2
 END:VTODO
 END:VTODO
 END:VCALENDAR
 END:VCALENDAR

+ 1 - 0
radicale/tests/static/todo3.ics

@@ -21,5 +21,6 @@ END:STANDARD
 END:VTIMEZONE
 END:VTIMEZONE
 BEGIN:VTODO
 BEGIN:VTODO
 DTSTART;TZID=Europe/Paris:20130901T180000
 DTSTART;TZID=Europe/Paris:20130901T180000
+UID:todo3
 END:VTODO
 END:VTODO
 END:VCALENDAR
 END:VCALENDAR

+ 1 - 0
radicale/tests/static/todo4.ics

@@ -21,5 +21,6 @@ END:STANDARD
 END:VTIMEZONE
 END:VTIMEZONE
 BEGIN:VTODO
 BEGIN:VTODO
 DUE;TZID=Europe/Paris:20130901T180000
 DUE;TZID=Europe/Paris:20130901T180000
+UID:todo4
 END:VTODO
 END:VTODO
 END:VCALENDAR
 END:VCALENDAR

+ 1 - 0
radicale/tests/static/todo5.ics

@@ -22,5 +22,6 @@ END:VTIMEZONE
 BEGIN:VTODO
 BEGIN:VTODO
 CREATED;TZID=Europe/Paris:20130903T180000
 CREATED;TZID=Europe/Paris:20130903T180000
 COMPLETED;TZID=Europe/Paris:20130920T180000
 COMPLETED;TZID=Europe/Paris:20130920T180000
+UID:todo5
 END:VTODO
 END:VTODO
 END:VCALENDAR
 END:VCALENDAR

+ 1 - 0
radicale/tests/static/todo6.ics

@@ -21,5 +21,6 @@ END:STANDARD
 END:VTIMEZONE
 END:VTIMEZONE
 BEGIN:VTODO
 BEGIN:VTODO
 COMPLETED;TZID=Europe/Paris:20130920T180000
 COMPLETED;TZID=Europe/Paris:20130920T180000
+UID:todo6
 END:VTODO
 END:VTODO
 END:VCALENDAR
 END:VCALENDAR

+ 1 - 0
radicale/tests/static/todo7.ics

@@ -21,5 +21,6 @@ END:STANDARD
 END:VTIMEZONE
 END:VTIMEZONE
 BEGIN:VTODO
 BEGIN:VTODO
 CREATED;TZID=Europe/Paris:20130803T180000
 CREATED;TZID=Europe/Paris:20130803T180000
+UID:todo7
 END:VTODO
 END:VTODO
 END:VCALENDAR
 END:VCALENDAR

+ 1 - 1
radicale/tests/static/todo8.ics

@@ -20,6 +20,6 @@ RRULE:FREQ=YEARLY;BYDAY=-1SU;BYMONTH=10
 END:STANDARD
 END:STANDARD
 END:VTIMEZONE
 END:VTIMEZONE
 BEGIN:VTODO
 BEGIN:VTODO
-
+UID:todo8
 END:VTODO
 END:VTODO
 END:VCALENDAR
 END:VCALENDAR