From d89329757edd6474c51334999ae83fde8ba9759f Mon Sep 17 00:00:00 2001 From: ed Date: Tue, 1 Jun 2021 03:55:31 +0200 Subject: [PATCH] fix permission check in tar/zip generator (gdi) --- copyparty/authsrv.py | 16 ++++++++-------- copyparty/httpcli.py | 8 ++++++-- tests/test_httpcli.py | 2 ++ tests/util.py | 3 +++ 4 files changed, 19 insertions(+), 10 deletions(-) diff --git a/copyparty/authsrv.py b/copyparty/authsrv.py index 82d6cd78..a99360b9 100644 --- a/copyparty/authsrv.py +++ b/copyparty/authsrv.py @@ -135,7 +135,7 @@ class VFS(object): # return os.path.realpath(rp) - def ls(self, rem, uname, scandir, lstat=False): + def ls(self, rem, uname, scandir, incl_wo=False, lstat=False): """return user-readable [fsdir,real,virt] items at vpath""" virt_vis = {} # nodes readable by user abspath = self.canonical(rem) @@ -143,12 +143,12 @@ class VFS(object): real.sort() if not rem: for name, vn2 in sorted(self.nodes.items()): - if ( - uname in vn2.uread - or "*" in vn2.uread - or uname in vn2.uwrite - or "*" in vn2.uwrite - ): + ok = uname in vn2.uread or "*" in vn2.uread + + if not ok and incl_wo: + ok = uname in vn2.uwrite or "*" in vn2.uwrite + + if ok: virt_vis[name] = vn2 # no vfs nodes in the list of real inodes @@ -162,7 +162,7 @@ class VFS(object): rel is a unix-style user-defined vpath (not vfs-related) """ - fsroot, vfs_ls, vfs_virt = self.ls(rem, uname, scandir, lstat) + fsroot, vfs_ls, vfs_virt = self.ls(rem, uname, scandir, False, lstat) rfiles = [x for x in vfs_ls if not stat.S_ISDIR(x[1].st_mode)] rdirs = [x for x in vfs_ls if stat.S_ISDIR(x[1].st_mode)] diff --git a/copyparty/httpcli.py b/copyparty/httpcli.py index d8cfafa1..989f52d4 100644 --- a/copyparty/httpcli.py +++ b/copyparty/httpcli.py @@ -1400,7 +1400,9 @@ class HttpCli(object): try: vn, rem = self.auth.vfs.get(top, self.uname, True, False) - fsroot, vfs_ls, vfs_virt = vn.ls(rem, self.uname, not self.args.no_scandir) + fsroot, vfs_ls, vfs_virt = vn.ls( + rem, self.uname, not self.args.no_scandir, True + ) except: vfs_ls = [] vfs_virt = {} @@ -1565,7 +1567,9 @@ class HttpCli(object): if v is not None: return self.tx_zip(k, v, vn, rem, [], self.args.ed) - fsroot, vfs_ls, vfs_virt = vn.ls(rem, self.uname, not self.args.no_scandir) + fsroot, vfs_ls, vfs_virt = vn.ls( + rem, self.uname, not self.args.no_scandir, True + ) stats = {k: v for k, v in vfs_ls} vfs_ls = [x[0] for x in vfs_ls] vfs_ls.extend(vfs_virt.keys()) diff --git a/tests/test_httpcli.py b/tests/test_httpcli.py index 91b3058c..d83be3a1 100644 --- a/tests/test_httpcli.py +++ b/tests/test_httpcli.py @@ -32,6 +32,8 @@ class Cfg(Namespace): no_zip=False, no_scandir=False, no_sendfile=True, + no_rescan=True, + ihead=False, nih=True, mtp=[], mte="a", diff --git a/tests/util.py b/tests/util.py index 2f79aec1..30864797 100644 --- a/tests/util.py +++ b/tests/util.py @@ -91,7 +91,10 @@ class VHttpConn(object): self.auth = auth self.log_func = log self.log_src = "a" + self.lf_url = None self.hsrv = VHttpSrv() self.nbyte = 0 self.workload = 0 + self.ico = None + self.thumbcli = None self.t0 = time.time() \ No newline at end of file