webdav: allow propfind depth:inf on files (closes #1437);

some webdav-clients (webdav4) sends Depth: infinite also for files,
assume Depth: 0 in this case
This commit is contained in:
ed 2026-04-16 10:01:22 +00:00
parent 745d82faf8
commit e00f2b46eb

View file

@ -1800,7 +1800,11 @@ class HttpCli(object):
topdir = {"vp": "", "st": st} topdir = {"vp": "", "st": st}
fgen: Iterable[dict[str, Any]] = [] fgen: Iterable[dict[str, Any]] = []
if stat.S_ISDIR(st.st_mode):
depth = self.headers.get("depth", "infinity").lower() depth = self.headers.get("depth", "infinity").lower()
else:
depth = "0"
if depth == "infinity": if depth == "infinity":
# allow depth:0 from unmapped root, but require read-axs otherwise # allow depth:0 from unmapped root, but require read-axs otherwise
if not self.can_read and (self.vpath or self.asrv.vfs.realpath): if not self.can_read and (self.vpath or self.asrv.vfs.realpath):
@ -1809,12 +1813,6 @@ class HttpCli(object):
self.log(t, 3) self.log(t, 3)
raise Pebkac(401, t) raise Pebkac(401, t)
if not stat.S_ISDIR(topdir["st"].st_mode):
t = "depth:infinity can only be used on folders; %r is 0o%o"
t = t % ("/" + self.vpath, topdir["st"])
self.log(t, 3)
raise Pebkac(400, t)
if not self.args.dav_inf: if not self.args.dav_inf:
self.log("client wants --dav-inf", 3) self.log("client wants --dav-inf", 3)
zb = b'<?xml version="1.0" encoding="utf-8"?>\n<D:error xmlns:D="DAV:"><D:propfind-finite-depth/></D:error>' zb = b'<?xml version="1.0" encoding="utf-8"?>\n<D:error xmlns:D="DAV:"><D:propfind-finite-depth/></D:error>'
@ -1835,7 +1833,7 @@ class HttpCli(object):
wrap=False, wrap=False,
) )
elif depth == "0" or not stat.S_ISDIR(st.st_mode): elif depth == "0":
if depth == "0" and not self.vpath and not vn.realpath: if depth == "0" and not self.vpath and not vn.realpath:
# rootless server; give dummy listing # rootless server; give dummy listing
self.can_read = True self.can_read = True