From fdd6f3b4a61848124fd38d063b8587da147a02e6 Mon Sep 17 00:00:00 2001 From: ed Date: Sun, 23 Apr 2023 20:55:34 +0000 Subject: [PATCH] tar/zip: use volume name as toplevel fallback --- copyparty/authsrv.py | 3 ++- copyparty/httpcli.py | 16 ++++++++++++---- tests/test_httpcli.py | 2 +- 3 files changed, 15 insertions(+), 6 deletions(-) diff --git a/copyparty/authsrv.py b/copyparty/authsrv.py index e2cdc66c..84d3713e 100644 --- a/copyparty/authsrv.py +++ b/copyparty/authsrv.py @@ -578,6 +578,7 @@ class VFS(object): def zipgen( self, + vpath: str, vrem: str, flt: set[str], uname: str, @@ -589,7 +590,7 @@ class VFS(object): # if multiselect: add all items to archive root # if single folder: the folder itself is the top-level item - folder = "" if flt or not wrap else (vrem.split("/")[-1].lstrip(".") or "top") + folder = "" if flt or not wrap else (vpath.split("/")[-1].lstrip(".") or "top") g = self.walk(folder, vrem, [], uname, [[True, False]], dots, scandir, False) for _, _, vpath, apath, files, rd, vd in g: diff --git a/copyparty/httpcli.py b/copyparty/httpcli.py index 15822c25..9015de72 100644 --- a/copyparty/httpcli.py +++ b/copyparty/httpcli.py @@ -884,6 +884,7 @@ class HttpCli(object): return True fgen = vn.zipgen( + rem, rem, set(), self.uname, @@ -1669,7 +1670,7 @@ class HttpCli(object): items = [unquotep(x) for x in items if items] self.parser.drop() - return self.tx_zip(k, v, vn, rem, items, self.args.ed) + return self.tx_zip(k, v, "", vn, rem, items, self.args.ed) def handle_post_json(self) -> bool: try: @@ -2656,7 +2657,14 @@ class HttpCli(object): return ret def tx_zip( - self, fmt: str, uarg: str, vn: VFS, rem: str, items: list[str], dots: bool + self, + fmt: str, + uarg: str, + vpath: str, + vn: VFS, + rem: str, + items: list[str], + dots: bool, ) -> bool: if self.args.no_zip: raise Pebkac(400, "not enabled") @@ -2699,7 +2707,7 @@ class HttpCli(object): self.send_headers(None, mime=mime, headers={"Content-Disposition": cdis}) fgen = vn.zipgen( - rem, set(items), self.uname, False, dots, not self.args.no_scandir + vpath, rem, set(items), self.uname, dots, False, not self.args.no_scandir ) # for f in fgen: print(repr({k: f[k] for k in ["vp", "ap"]})) bgen = packer(self.log, fgen, utf8="utf" in uarg, pre_crc="crc" in uarg) @@ -3503,7 +3511,7 @@ class HttpCli(object): for k in ["zip", "tar"]: v = self.uparam.get(k) if v is not None: - return self.tx_zip(k, v, vn, rem, [], self.args.ed) + return self.tx_zip(k, v, self.vpath, vn, rem, [], self.args.ed) fsroot, vfs_ls, vfs_virt = vn.ls( rem, self.uname, not self.args.no_scandir, [[True, False], [False, True]] diff --git a/tests/test_httpcli.py b/tests/test_httpcli.py index 1cbc69a9..8e57a1db 100644 --- a/tests/test_httpcli.py +++ b/tests/test_httpcli.py @@ -122,7 +122,7 @@ class TestHttpCli(unittest.TestCase): tar = tarfile.open(fileobj=io.BytesIO(b)).getnames() except: tar = [] - tar = [x[4:] if x.startswith("top/") else x for x in tar] + tar = [x.split("/", 1)[1] for x in tar] tar = ["/".join([y for y in [top, durl, x] if y]) for x in tar] tar = [[x] + self.can_rw(x) for x in tar] tar_ok = [x[0] for x in tar if x[1]]