This commit is contained in:
Mathieu Dupuy 2014-07-24 18:56:00 +02:00 committed by Mathieu Dupuy
parent 6854cd0ee3
commit a94984b653
2 changed files with 57 additions and 80 deletions

View File

@ -305,7 +305,7 @@ class Application(object):
status, headers, answer = NOT_ALLOWED
if ((status, headers, answer) == NOT_ALLOWED and
not is_authenticated and
not auth.is_authenticated(user, password) and
config.get("auth", "type") != "None"):
# Unknown or unauthorized user
log.LOGGER.info("%s refused" % (user or "Anonymous user"))

View File

@ -227,20 +227,15 @@ def propfind(path, xml_request, collections, user=None):
_tag("D", "displayname"),
_tag("D", "owner"),
_tag("D", "getetag"),
_tag("D", "current-user-principal"),
_tag("A", "calendar-color"),
_tag("CS", "getctag")]
# Writing answer
multistatus = ET.Element(_tag("D", "multistatus"))
if collections:
for collection in collections:
response = _propfind_response(path, collection, props, user)
multistatus.append(response)
else:
response = _propfind_response(path, None, props, user)
multistatus.append(response)
return _pretty_xml(multistatus)
@ -255,11 +250,8 @@ def _propfind_response(path, item, props, user):
response = ET.Element(_tag("D", "response"))
href = ET.Element(_tag("D", "href"))
if item:
uri = item.url if is_collection else "%s/%s" % (path, item.name)
href.text = _href(uri.replace("//", "/"))
else:
href.text = _href(path)
response.append(href)
propstat404 = ET.Element(_tag("D", "propstat"))
@ -275,28 +267,16 @@ def _propfind_response(path, item, props, user):
for tag in props:
element = ET.Element(tag)
is404 = False
if tag in (_tag("D", "principal-URL"),
_tag("D", "current-user-principal")):
if user:
tag = ET.Element(_tag("D", "href"))
tag.text = _href("%s/" % user)
else:
is404 = True
tag = ET.Element(_tag("D", "unauthenticated"))
element.append(tag)
elif tag == _tag("D", "principal-collection-set"):
tag = ET.Element(_tag("D", "href"))
tag.text = _href("/")
element.append(tag)
elif tag in (_tag("C", "calendar-home-set"),
_tag("CR", "addressbook-home-set")):
if user and path == "/%s/" % user:
if tag == _tag("D", "getetag"):
element.text = item.etag
elif tag == _tag("D", "principal-URL"):
tag = ET.Element(_tag("D", "href"))
tag.text = _href(path)
element.append(tag)
else:
is404 = True
elif tag == _tag("C", "calendar-user-address-set"):
elif tag in (_tag("D", "principal-collection-set"),
_tag("C", "calendar-user-address-set"),
_tag("CR", "addressbook-home-set"),
_tag("C", "calendar-home-set")):
tag = ET.Element(_tag("D", "href"))
tag.text = _href(path)
element.append(tag)
@ -314,6 +294,13 @@ def _propfind_response(path, item, props, user):
comp.set("name", component)
element.append(comp)
# pylint: enable=W0511
elif tag == _tag("D", "current-user-principal") and user:
tag = ET.Element(_tag("D", "href"))
if item.resource_type == "addressbook":
tag.text = _href("/%s/addressbook.vcf/" % user)
else:
tag.text = _href("/%s/calendar.ics/" % user)
element.append(tag)
elif tag == _tag("D", "current-user-privilege-set"):
privilege = ET.Element(_tag("D", "privilege"))
privilege.append(ET.Element(_tag("D", "all")))
@ -331,10 +318,6 @@ def _propfind_response(path, item, props, user):
report_tag.text = report_name
supported.append(report_tag)
element.append(supported)
# item related properties
elif item:
if tag == _tag("D", "getetag"):
element.text = item.etag
elif is_collection:
if tag == _tag("D", "getcontenttype"):
element.text = item.mimetype
@ -379,12 +362,6 @@ def _propfind_response(path, item, props, user):
pass
else:
is404 = True
# Not for items
elif tag == _tag("D", "resourcetype"):
# resourcetype must be returned empty for non-collection elements
pass
else:
is404 = True
if is404:
prop404.append(element)