Respond to all authenticated PROPFIND requests
This commit is contained in:
parent
2ddec14535
commit
83db27303f
@ -283,10 +283,14 @@ class Application(object):
|
|||||||
read_allowed_items, write_allowed_items = \
|
read_allowed_items, write_allowed_items = \
|
||||||
self.collect_allowed_items(items, user)
|
self.collect_allowed_items(items, user)
|
||||||
|
|
||||||
|
is_authenticated = auth.is_authenticated(user, password)
|
||||||
|
|
||||||
if ((read_allowed_items or write_allowed_items)
|
if ((read_allowed_items or write_allowed_items)
|
||||||
and (not user or auth.is_authenticated(user, password))) or \
|
and (not user or is_authenticated)) or \
|
||||||
|
(is_authenticated and function == self.propfind) or \
|
||||||
function == self.options or not items:
|
function == self.options or not items:
|
||||||
# Collections found, or OPTIONS request, or no items at all
|
# Collections found, or authenticated PROPFIND request,
|
||||||
|
# or OPTIONS request, or no items at all
|
||||||
status, headers, answer = function(
|
status, headers, answer = function(
|
||||||
environ, read_allowed_items, write_allowed_items, content,
|
environ, read_allowed_items, write_allowed_items, content,
|
||||||
user)
|
user)
|
||||||
@ -294,7 +298,7 @@ class Application(object):
|
|||||||
status, headers, answer = NOT_ALLOWED
|
status, headers, answer = NOT_ALLOWED
|
||||||
|
|
||||||
if ((status, headers, answer) == NOT_ALLOWED and
|
if ((status, headers, answer) == NOT_ALLOWED and
|
||||||
not auth.is_authenticated(user, password) and
|
not is_authenticated and
|
||||||
config.get("auth", "type") != "None"):
|
config.get("auth", "type") != "None"):
|
||||||
# Unknown or unauthorized user
|
# Unknown or unauthorized user
|
||||||
log.LOGGER.info("%s refused" % (user or "Anonymous user"))
|
log.LOGGER.info("%s refused" % (user or "Anonymous user"))
|
||||||
|
@ -234,8 +234,12 @@ def propfind(path, xml_request, collections, user=None):
|
|||||||
# Writing answer
|
# Writing answer
|
||||||
multistatus = ET.Element(_tag("D", "multistatus"))
|
multistatus = ET.Element(_tag("D", "multistatus"))
|
||||||
|
|
||||||
for collection in collections:
|
if collections:
|
||||||
response = _propfind_response(path, collection, props, user)
|
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)
|
multistatus.append(response)
|
||||||
|
|
||||||
return _pretty_xml(multistatus)
|
return _pretty_xml(multistatus)
|
||||||
@ -251,8 +255,11 @@ def _propfind_response(path, item, props, user):
|
|||||||
response = ET.Element(_tag("D", "response"))
|
response = ET.Element(_tag("D", "response"))
|
||||||
|
|
||||||
href = ET.Element(_tag("D", "href"))
|
href = ET.Element(_tag("D", "href"))
|
||||||
uri = item.url if is_collection else "%s/%s" % (path, item.name)
|
if item:
|
||||||
href.text = _href(uri.replace("//", "/"))
|
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)
|
response.append(href)
|
||||||
|
|
||||||
propstat404 = ET.Element(_tag("D", "propstat"))
|
propstat404 = ET.Element(_tag("D", "propstat"))
|
||||||
@ -268,10 +275,8 @@ def _propfind_response(path, item, props, user):
|
|||||||
for tag in props:
|
for tag in props:
|
||||||
element = ET.Element(tag)
|
element = ET.Element(tag)
|
||||||
is404 = False
|
is404 = False
|
||||||
if tag == _tag("D", "getetag"):
|
if tag in (_tag("D", "principal-URL"),
|
||||||
element.text = item.etag
|
_tag("D", "current-user-principal")):
|
||||||
elif tag in (_tag("D", "principal-URL"),
|
|
||||||
_tag("D", "current-user-principal")):
|
|
||||||
if user:
|
if user:
|
||||||
tag = ET.Element(_tag("D", "href"))
|
tag = ET.Element(_tag("D", "href"))
|
||||||
tag.text = _href("%s/" % user)
|
tag.text = _href("%s/" % user)
|
||||||
@ -317,45 +322,55 @@ def _propfind_response(path, item, props, user):
|
|||||||
report_tag.text = report_name
|
report_tag.text = report_name
|
||||||
supported.append(report_tag)
|
supported.append(report_tag)
|
||||||
element.append(supported)
|
element.append(supported)
|
||||||
elif is_collection:
|
# item related properties
|
||||||
if tag == _tag("D", "getcontenttype"):
|
elif item:
|
||||||
element.text = item.mimetype
|
if tag == _tag("D", "getetag"):
|
||||||
elif tag == _tag("D", "resourcetype"):
|
|
||||||
if item.is_principal:
|
|
||||||
tag = ET.Element(_tag("D", "principal"))
|
|
||||||
element.append(tag)
|
|
||||||
if item.is_leaf(item.path) or (
|
|
||||||
not item.exists and item.resource_type):
|
|
||||||
# 2nd case happens when the collection is not stored yet,
|
|
||||||
# but the resource type is guessed
|
|
||||||
if item.resource_type == "addressbook":
|
|
||||||
tag = ET.Element(_tag("CR", item.resource_type))
|
|
||||||
else:
|
|
||||||
tag = ET.Element(_tag("C", item.resource_type))
|
|
||||||
element.append(tag)
|
|
||||||
tag = ET.Element(_tag("D", "collection"))
|
|
||||||
element.append(tag)
|
|
||||||
elif tag == _tag("D", "owner") and item.owner_url:
|
|
||||||
element.text = item.owner_url
|
|
||||||
elif tag == _tag("CS", "getctag"):
|
|
||||||
element.text = item.etag
|
element.text = item.etag
|
||||||
elif tag == _tag("C", "calendar-timezone"):
|
elif is_collection:
|
||||||
element.text = ical.serialize(
|
if tag == _tag("D", "getcontenttype"):
|
||||||
item.tag, item.headers, item.timezones)
|
element.text = item.mimetype
|
||||||
elif tag == _tag("D", "displayname"):
|
elif tag == _tag("D", "resourcetype"):
|
||||||
element.text = item.name
|
if item.is_principal:
|
||||||
elif tag == _tag("A", "calendar-color"):
|
tag = ET.Element(_tag("D", "principal"))
|
||||||
element.text = item.color
|
element.append(tag)
|
||||||
else:
|
if item.is_leaf(item.path) or (
|
||||||
human_tag = _tag_from_clark(tag)
|
not item.exists and item.resource_type):
|
||||||
if human_tag in collection_props:
|
# 2nd case happens when the collection is not stored yet,
|
||||||
element.text = collection_props[human_tag]
|
# but the resource type is guessed
|
||||||
|
if item.resource_type == "addressbook":
|
||||||
|
tag = ET.Element(_tag("CR", item.resource_type))
|
||||||
|
else:
|
||||||
|
tag = ET.Element(_tag("C", item.resource_type))
|
||||||
|
element.append(tag)
|
||||||
|
tag = ET.Element(_tag("D", "collection"))
|
||||||
|
element.append(tag)
|
||||||
|
elif tag == _tag("D", "owner") and item.owner_url:
|
||||||
|
element.text = item.owner_url
|
||||||
|
elif tag == _tag("CS", "getctag"):
|
||||||
|
element.text = item.etag
|
||||||
|
elif tag == _tag("C", "calendar-timezone"):
|
||||||
|
element.text = ical.serialize(
|
||||||
|
item.tag, item.headers, item.timezones)
|
||||||
|
elif tag == _tag("D", "displayname"):
|
||||||
|
element.text = item.name
|
||||||
|
elif tag == _tag("A", "calendar-color"):
|
||||||
|
element.text = item.color
|
||||||
else:
|
else:
|
||||||
is404 = True
|
human_tag = _tag_from_clark(tag)
|
||||||
# Not for collections
|
if human_tag in collection_props:
|
||||||
elif tag == _tag("D", "getcontenttype"):
|
element.text = collection_props[human_tag]
|
||||||
element.text = "%s; component=%s" % (
|
else:
|
||||||
item.mimetype, item.tag.lower())
|
is404 = True
|
||||||
|
# Not for collections
|
||||||
|
elif tag == _tag("D", "getcontenttype"):
|
||||||
|
element.text = "%s; component=%s" % (
|
||||||
|
item.mimetype, item.tag.lower())
|
||||||
|
elif tag == _tag("D", "resourcetype"):
|
||||||
|
# resourcetype must be returned empty for non-collection elements
|
||||||
|
pass
|
||||||
|
else:
|
||||||
|
is404 = True
|
||||||
|
# Not for items
|
||||||
elif tag == _tag("D", "resourcetype"):
|
elif tag == _tag("D", "resourcetype"):
|
||||||
# resourcetype must be returned empty for non-collection elements
|
# resourcetype must be returned empty for non-collection elements
|
||||||
pass
|
pass
|
||||||
|
Loading…
Reference in New Issue
Block a user