improved detection of broken vcards

This commit is contained in:
Peter Bieringer 2016-09-18 19:23:24 +02:00
parent 18181374e1
commit af5c1582dc
2 changed files with 24 additions and 4 deletions

View File

@ -715,9 +715,21 @@ class Collection(BaseCollection):
self.logger.debug("Read object: %s", path) self.logger.debug("Read object: %s", path)
with open(path, encoding=self.encoding, newline="") as fd: with open(path, encoding=self.encoding, newline="") as fd:
try: try:
items.append(vobject.readOne(fd.read())) # check whether vobject liks the item
item = vobject.readOne(fd.read())
except: except:
self.logger.exception("Object broken (skip 'list'): %s", path) self.logger.exception("Object broken (skip 'list'): %s", path)
continue
if self.get_meta("tag") == "VADDRESSBOOK":
try:
# check whether vobject liks the VCARD item
item.serialize()
except:
self.logger.exception("Object broken (skip 'read'): %s", path)
self.logger.error("Broken VCARD content: %s", item)
continue
items.append(item)
time_end = datetime.datetime.now() time_end = datetime.datetime.now()
self.logger.info("Collection read %d items in %s sec from %s", len(items),(time_end - time_begin).total_seconds(), self._filesystem_path) self.logger.info("Collection read %d items in %s sec from %s", len(items),(time_end - time_begin).total_seconds(), self._filesystem_path)
if self.get_meta("tag") == "VCALENDAR": if self.get_meta("tag") == "VCALENDAR":

View File

@ -28,6 +28,7 @@ in them for XML requests (all but PUT).
import posixpath import posixpath
import re import re
import xml.etree.ElementTree as ET import xml.etree.ElementTree as ET
from pprint import pprint
from collections import OrderedDict from collections import OrderedDict
from datetime import datetime, timedelta, timezone from datetime import datetime, timedelta, timezone
from http import client from http import client
@ -523,13 +524,15 @@ def propfind(path, xml_request, read_collections, write_collections, user):
collections.append(collection) collections.append(collection)
response = _propfind_response( response = _propfind_response(
path, collection, props, user, write=True) path, collection, props, user, write=True)
multistatus.append(response) if response:
multistatus.append(response)
for collection in read_collections: for collection in read_collections:
if collection in collections: if collection in collections:
continue continue
response = _propfind_response( response = _propfind_response(
path, collection, props, user, write=False) path, collection, props, user, write=False)
multistatus.append(response) if response:
multistatus.append(response)
return client.MULTI_STATUS, _pretty_xml(multistatus) return client.MULTI_STATUS, _pretty_xml(multistatus)
@ -569,7 +572,12 @@ def _propfind_response(path, item, props, user, write=False):
element = ET.Element(tag) element = ET.Element(tag)
is404 = False is404 = False
if tag == _tag("D", "getetag"): if tag == _tag("D", "getetag"):
element.text = item.etag try:
element.text = item.etag
except:
print("Object broken (skip)")
pprint(vars(item))
return None
elif tag == _tag("D", "getlastmodified"): elif tag == _tag("D", "getlastmodified"):
element.text = item.last_modified element.text = item.last_modified
elif tag == _tag("D", "principal-collection-set"): elif tag == _tag("D", "principal-collection-set"):