mirror of
https://github.com/9001/copyparty.git
synced 2025-08-18 09:22:31 -06:00
avoid pointless recursion + show scan summary
This commit is contained in:
parent
6bcf330ae0
commit
2fb46551a2
|
@ -411,7 +411,7 @@ class VFS(object):
|
||||||
|
|
||||||
return [abspath, real, virt_vis]
|
return [abspath, real, virt_vis]
|
||||||
|
|
||||||
def walk(self, rel, rem, seen, uname, permsets, dots, scandir, lstat):
|
def walk(self, rel, rem, seen, uname, permsets, dots, scandir, lstat, subvols=True):
|
||||||
"""
|
"""
|
||||||
recursively yields from ./rem;
|
recursively yields from ./rem;
|
||||||
rel is a unix-style user-defined vpath (not vfs-related)
|
rel is a unix-style user-defined vpath (not vfs-related)
|
||||||
|
@ -444,9 +444,14 @@ class VFS(object):
|
||||||
|
|
||||||
wrel = (rel + "/" + rdir).lstrip("/")
|
wrel = (rel + "/" + rdir).lstrip("/")
|
||||||
wrem = (rem + "/" + rdir).lstrip("/")
|
wrem = (rem + "/" + rdir).lstrip("/")
|
||||||
for x in self.walk(wrel, wrem, seen, uname, permsets, dots, scandir, lstat):
|
for x in self.walk(
|
||||||
|
wrel, wrem, seen, uname, permsets, dots, scandir, lstat, subvols
|
||||||
|
):
|
||||||
yield x
|
yield x
|
||||||
|
|
||||||
|
if not subvols:
|
||||||
|
return
|
||||||
|
|
||||||
for n, vfs in sorted(vfs_virt.items()):
|
for n, vfs in sorted(vfs_virt.items()):
|
||||||
if not dots and n.startswith("."):
|
if not dots and n.startswith("."):
|
||||||
continue
|
continue
|
||||||
|
@ -1107,7 +1112,7 @@ class AuthSrv(object):
|
||||||
flag_p = "p" in flags
|
flag_p = "p" in flags
|
||||||
flag_r = "r" in flags
|
flag_r = "r" in flags
|
||||||
|
|
||||||
n_bads = 0
|
bads = []
|
||||||
for v in vols:
|
for v in vols:
|
||||||
v = v[1:]
|
v = v[1:]
|
||||||
vtop = "/{}/".format(v) if v else "/"
|
vtop = "/{}/".format(v) if v else "/"
|
||||||
|
@ -1119,10 +1124,19 @@ class AuthSrv(object):
|
||||||
continue
|
continue
|
||||||
|
|
||||||
atop = vn.realpath
|
atop = vn.realpath
|
||||||
|
safeabs = atop + os.sep
|
||||||
g = vn.walk(
|
g = vn.walk(
|
||||||
vn.vpath, "", [], u, [[True]], True, not self.args.no_scandir, False
|
vn.vpath,
|
||||||
|
"",
|
||||||
|
[],
|
||||||
|
u,
|
||||||
|
[[True]],
|
||||||
|
True,
|
||||||
|
not self.args.no_scandir,
|
||||||
|
False,
|
||||||
|
False,
|
||||||
)
|
)
|
||||||
for _, _, vpath, apath, files, _, _ in g:
|
for _, _, vpath, apath, files, dirs, _ in g:
|
||||||
fnames = [n[0] for n in files]
|
fnames = [n[0] for n in files]
|
||||||
vpaths = [vpath + "/" + n for n in fnames] if vpath else fnames
|
vpaths = [vpath + "/" + n for n in fnames] if vpath else fnames
|
||||||
vpaths = [vtop + x for x in vpaths]
|
vpaths = [vtop + x for x in vpaths]
|
||||||
|
@ -1130,8 +1144,10 @@ class AuthSrv(object):
|
||||||
files = [[vpath + "/", apath + os.sep]] + list(zip(vpaths, apaths))
|
files = [[vpath + "/", apath + os.sep]] + list(zip(vpaths, apaths))
|
||||||
|
|
||||||
if flag_ln:
|
if flag_ln:
|
||||||
files = [x for x in files if not x[1].startswith(atop + os.sep)]
|
files = [x for x in files if not x[1].startswith(safeabs)]
|
||||||
n_bads += len(files)
|
if files:
|
||||||
|
dirs[:] = [] # stop recursion
|
||||||
|
bads.append(files[0][0])
|
||||||
|
|
||||||
if not files:
|
if not files:
|
||||||
continue
|
continue
|
||||||
|
@ -1141,12 +1157,15 @@ class AuthSrv(object):
|
||||||
for vp, ap in files
|
for vp, ap in files
|
||||||
]
|
]
|
||||||
else:
|
else:
|
||||||
msg = ["user {}: {} =>".format(u, files[0][0])]
|
msg = ["user {}, vol {}: {} =>".format(u, vtop, files[0][0])]
|
||||||
msg += [x[1] for x in files]
|
msg += [x[1] for x in files]
|
||||||
|
|
||||||
self.log("\n".join(msg))
|
self.log("\n".join(msg))
|
||||||
|
|
||||||
if n_bads and flag_p:
|
if bads:
|
||||||
|
self.log("\n ".join(["found symlinks leaving volume:"] + bads))
|
||||||
|
|
||||||
|
if bads and flag_p:
|
||||||
raise Exception("found symlink leaving volume, and strict is set")
|
raise Exception("found symlink leaving volume, and strict is set")
|
||||||
|
|
||||||
if not flag_r:
|
if not flag_r:
|
||||||
|
|
Loading…
Reference in a new issue