improved detection of broken vcards
This commit is contained in:
parent
18181374e1
commit
af5c1582dc
@ -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":
|
||||||
|
@ -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,12 +524,14 @@ 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)
|
||||||
|
if response:
|
||||||
multistatus.append(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)
|
||||||
|
if response:
|
||||||
multistatus.append(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"):
|
||||||
|
try:
|
||||||
element.text = item.etag
|
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"):
|
||||||
|
Loading…
Reference in New Issue
Block a user