mirror of
https://github.com/samsonjs/vdirsyncer.git
synced 2026-04-27 14:57:41 +00:00
Remove DAV header check
iCloud doesn't return anything useful while working fine otherwise.
This commit is contained in:
parent
3b6a2f3664
commit
25aff68b50
1 changed files with 16 additions and 30 deletions
|
|
@ -38,6 +38,14 @@ def _normalize_href(base, href, decoding_rounds=1):
|
||||||
return x
|
return x
|
||||||
|
|
||||||
|
|
||||||
|
def _parse_xml(content):
|
||||||
|
try:
|
||||||
|
return etree.XML(content)
|
||||||
|
except etree.Error as e:
|
||||||
|
raise ValueError('Invalid XML encountered: {}\n'
|
||||||
|
'Double-check the URLs in your config.'.format(e))
|
||||||
|
|
||||||
|
|
||||||
class Discover(object):
|
class Discover(object):
|
||||||
_resourcetype = None
|
_resourcetype = None
|
||||||
_homeset_xml = None
|
_homeset_xml = None
|
||||||
|
|
@ -71,7 +79,7 @@ class Discover(object):
|
||||||
"""
|
"""
|
||||||
response = self.session.request('PROPFIND', '', headers=headers,
|
response = self.session.request('PROPFIND', '', headers=headers,
|
||||||
data=body)
|
data=body)
|
||||||
root = etree.XML(response.content)
|
root = _parse_xml(response.content)
|
||||||
|
|
||||||
for element in root.iter('{*}current-user-principal'):
|
for element in root.iter('{*}current-user-principal'):
|
||||||
for principal in element.iter(): # should be only one
|
for principal in element.iter(): # should be only one
|
||||||
|
|
@ -118,7 +126,7 @@ class Discover(object):
|
||||||
response = self.session.request('PROPFIND', home, headers=headers,
|
response = self.session.request('PROPFIND', home, headers=headers,
|
||||||
data=self._collection_xml,
|
data=self._collection_xml,
|
||||||
is_subpath=False)
|
is_subpath=False)
|
||||||
root = etree.XML(response.content)
|
root = _parse_xml(response.content)
|
||||||
for response in root.iter('{*}response'):
|
for response in root.iter('{*}response'):
|
||||||
prop = response.find('{*}propstat/{*}prop')
|
prop = response.find('{*}propstat/{*}prop')
|
||||||
if prop.find('{*}resourcetype/{*}' + self._resourcetype) is None:
|
if prop.find('{*}resourcetype/{*}' + self._resourcetype) is None:
|
||||||
|
|
@ -163,8 +171,7 @@ class DavSession(object):
|
||||||
'''
|
'''
|
||||||
|
|
||||||
def __init__(self, url, username='', password='', verify=True, auth=None,
|
def __init__(self, url, username='', password='', verify=True, auth=None,
|
||||||
useragent=USERAGENT, verify_fingerprint=None,
|
useragent=USERAGENT, verify_fingerprint=None):
|
||||||
dav_header=None):
|
|
||||||
if username and not password:
|
if username and not password:
|
||||||
password = utils.get_password(username, url)
|
password = utils.get_password(username, url)
|
||||||
|
|
||||||
|
|
@ -176,7 +183,6 @@ class DavSession(object):
|
||||||
self.useragent = useragent
|
self.useragent = useragent
|
||||||
self.url = url.rstrip('/') + '/'
|
self.url = url.rstrip('/') + '/'
|
||||||
self.parsed_url = utils.urlparse.urlparse(self.url)
|
self.parsed_url = utils.urlparse.urlparse(self.url)
|
||||||
self.dav_header = dav_header
|
|
||||||
self._session = None
|
self._session = None
|
||||||
|
|
||||||
def request(self, method, path, data=None, headers=None,
|
def request(self, method, path, data=None, headers=None,
|
||||||
|
|
@ -187,23 +193,9 @@ class DavSession(object):
|
||||||
assert url.startswith(self.url) or not is_subpath
|
assert url.startswith(self.url) or not is_subpath
|
||||||
if self._session is None:
|
if self._session is None:
|
||||||
self._session = requests_session()
|
self._session = requests_session()
|
||||||
self._check_dav_header()
|
|
||||||
return utils.request(method, url, data=data, headers=headers,
|
return utils.request(method, url, data=data, headers=headers,
|
||||||
session=self._session, **self._settings)
|
session=self._session, **self._settings)
|
||||||
|
|
||||||
def _check_dav_header(self):
|
|
||||||
if self.dav_header is None:
|
|
||||||
return
|
|
||||||
headers = self.get_default_headers()
|
|
||||||
headers['Depth'] = 1
|
|
||||||
response = self.request(
|
|
||||||
'OPTIONS',
|
|
||||||
'',
|
|
||||||
headers=headers
|
|
||||||
)
|
|
||||||
if self.dav_header not in response.headers.get('DAV', ''):
|
|
||||||
raise ValueError('URL is not a collection')
|
|
||||||
|
|
||||||
def get_default_headers(self):
|
def get_default_headers(self):
|
||||||
return {
|
return {
|
||||||
'User-Agent': self.useragent,
|
'User-Agent': self.useragent,
|
||||||
|
|
@ -239,8 +231,6 @@ class DavStorage(Storage):
|
||||||
fileext = None
|
fileext = None
|
||||||
# mimetype of items
|
# mimetype of items
|
||||||
item_mimetype = None
|
item_mimetype = None
|
||||||
# The expected header for resource validation.
|
|
||||||
dav_header = None
|
|
||||||
# XML to use when fetching multiple hrefs.
|
# XML to use when fetching multiple hrefs.
|
||||||
get_multi_template = None
|
get_multi_template = None
|
||||||
# The LXML query for extracting results in get_multi
|
# The LXML query for extracting results in get_multi
|
||||||
|
|
@ -261,8 +251,7 @@ class DavStorage(Storage):
|
||||||
if collection is not None:
|
if collection is not None:
|
||||||
url = utils.urlparse.urljoin(url, collection)
|
url = utils.urlparse.urljoin(url, collection)
|
||||||
self.session = DavSession(url, username, password, verify, auth,
|
self.session = DavSession(url, username, password, verify, auth,
|
||||||
useragent, verify_fingerprint,
|
useragent, verify_fingerprint)
|
||||||
dav_header=self.dav_header)
|
|
||||||
self.unsafe_href_chars = unsafe_href_chars
|
self.unsafe_href_chars = unsafe_href_chars
|
||||||
|
|
||||||
# defined for _repr_attributes
|
# defined for _repr_attributes
|
||||||
|
|
@ -277,8 +266,7 @@ class DavStorage(Storage):
|
||||||
'username', 'password', 'verify', 'auth', 'useragent',
|
'username', 'password', 'verify', 'auth', 'useragent',
|
||||||
'verify_fingerprint',
|
'verify_fingerprint',
|
||||||
))
|
))
|
||||||
d = cls.discovery_class(DavSession(
|
d = cls.discovery_class(DavSession(url=url, **discover_args))
|
||||||
url=url, dav_header=cls.dav_header, **discover_args))
|
|
||||||
for c in d.discover():
|
for c in d.discover():
|
||||||
base, collection = c['href'].rstrip('/').rsplit('/', 1)
|
base, collection = c['href'].rstrip('/').rsplit('/', 1)
|
||||||
s = cls(url=base, collection=collection, **kwargs)
|
s = cls(url=base, collection=collection, **kwargs)
|
||||||
|
|
@ -316,7 +304,7 @@ class DavStorage(Storage):
|
||||||
data=data,
|
data=data,
|
||||||
headers=self.session.get_default_headers()
|
headers=self.session.get_default_headers()
|
||||||
)
|
)
|
||||||
root = etree.XML(response.content) # etree only can handle bytes
|
root = _parse_xml(response.content) # etree only can handle bytes
|
||||||
rv = []
|
rv = []
|
||||||
hrefs_left = set(hrefs)
|
hrefs_left = set(hrefs)
|
||||||
for element in root.iter('{DAV:}response'):
|
for element in root.iter('{DAV:}response'):
|
||||||
|
|
@ -414,7 +402,7 @@ class DavStorage(Storage):
|
||||||
data=xml,
|
data=xml,
|
||||||
headers=headers
|
headers=headers
|
||||||
)
|
)
|
||||||
root = etree.XML(response.content)
|
root = _parse_xml(response.content)
|
||||||
for element in root.iter('{DAV:}response'):
|
for element in root.iter('{DAV:}response'):
|
||||||
propstat = element.find('{DAV:}propstat')
|
propstat = element.find('{DAV:}propstat')
|
||||||
prop = propstat.find('{DAV:}prop')
|
prop = propstat.find('{DAV:}prop')
|
||||||
|
|
@ -467,7 +455,6 @@ class CaldavStorage(DavStorage):
|
||||||
storage_name = 'caldav'
|
storage_name = 'caldav'
|
||||||
fileext = '.ics'
|
fileext = '.ics'
|
||||||
item_mimetype = 'text/calendar'
|
item_mimetype = 'text/calendar'
|
||||||
dav_header = 'calendar-access'
|
|
||||||
discovery_class = CalDiscover
|
discovery_class = CalDiscover
|
||||||
|
|
||||||
start_date = None
|
start_date = None
|
||||||
|
|
@ -587,7 +574,6 @@ class CarddavStorage(DavStorage):
|
||||||
storage_name = 'carddav'
|
storage_name = 'carddav'
|
||||||
fileext = '.vcf'
|
fileext = '.vcf'
|
||||||
item_mimetype = 'text/vcard'
|
item_mimetype = 'text/vcard'
|
||||||
dav_header = 'addressbook'
|
|
||||||
discovery_class = CardDiscover
|
discovery_class = CardDiscover
|
||||||
|
|
||||||
get_multi_template = '''<?xml version="1.0" encoding="utf-8" ?>
|
get_multi_template = '''<?xml version="1.0" encoding="utf-8" ?>
|
||||||
|
|
@ -621,7 +607,7 @@ class CarddavStorage(DavStorage):
|
||||||
response = self.session.request('PROPFIND', '', data=data,
|
response = self.session.request('PROPFIND', '', data=data,
|
||||||
headers=headers)
|
headers=headers)
|
||||||
|
|
||||||
root = etree.XML(response.content)
|
root = _parse_xml(response.content)
|
||||||
hrefs = set()
|
hrefs = set()
|
||||||
for element in root.iter('{DAV:}response'):
|
for element in root.iter('{DAV:}response'):
|
||||||
prop = element.find('{DAV:}propstat').find('{DAV:}prop')
|
prop = element.find('{DAV:}propstat').find('{DAV:}prop')
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue