From 1ff14b4e05743895025d51183c4d1e6598e181a6 Mon Sep 17 00:00:00 2001 From: ed Date: Wed, 2 Oct 2024 21:59:53 +0000 Subject: [PATCH] optimizations, failsafes, formatting --- bin/partyfuse.py | 7 ++++--- copyparty/httpcli.py | 10 +++++++--- copyparty/httpsrv.py | 1 + copyparty/util.py | 4 ++++ tests/test_dots.py | 6 +++--- tests/test_httpcli.py | 7 +++++-- tests/util.py | 1 + 7 files changed, 25 insertions(+), 11 deletions(-) diff --git a/bin/partyfuse.py b/bin/partyfuse.py index 5708e587..93176297 100755 --- a/bin/partyfuse.py +++ b/bin/partyfuse.py @@ -63,7 +63,7 @@ UTC = timezone.utc # !rm.yes> MON3S = "Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec" -MON3 = {b:a for a,b in enumerate(MON3S.split(), 1)} +MON3 = {b: a for a, b in enumerate(MON3S.split(), 1)} # !rm.no> @@ -946,7 +946,7 @@ class CPPF(Operations): return ret - # !rm.yes> + # !rm.yes> fn = "cppf-{}-{}-{}".format(time.time(), offset, length) if False: with open(fn, "wb", len(ret)) as f: @@ -969,7 +969,7 @@ class CPPF(Operations): raise Exception("cache bork") return ret - # !rm.no> + # !rm.no> def getattr(self, path, fh=None): dbg("getattr %r", path) @@ -1057,6 +1057,7 @@ class CPPF(Operations): def statfs(self, path): dbg("@@ statfs [{}]".format(path)) return {} + # !rm.no> if sys.platform == "win32": diff --git a/copyparty/httpcli.py b/copyparty/httpcli.py index 435dabf8..2bc117f0 100644 --- a/copyparty/httpcli.py +++ b/copyparty/httpcli.py @@ -427,6 +427,7 @@ class HttpCli(object): vpath = undot(vpath) ptn = self.conn.hsrv.ptn_cc + k_safe = self.conn.hsrv.uparam_cc_ok for k in arglist.split("&"): if "=" in k: k, zs = k.split("=", 1) @@ -439,7 +440,7 @@ class HttpCli(object): k = k.lower() uparam[k] = sv - if k in ("doc", "move", "tree"): + if k in k_safe: continue zs = "%s=%s" % (k, sv) @@ -3829,7 +3830,7 @@ class HttpCli(object): items: list[str], ) -> bool: if self.args.no_zip: - raise Pebkac(400, "not enabled") + raise Pebkac(400, "not enabled in server config") logmsg = "{:4} {} ".format("", self.req) self.keepalive = False @@ -4145,7 +4146,7 @@ class HttpCli(object): "dbwt": None, } - assert vstate and vs # type: ignore # !rm + assert vstate.items and vs # type: ignore # !rm fmt = self.uparam.get("ls", "") if not fmt and (self.ua.startswith("curl/") or self.ua.startswith("fetch")): @@ -5149,6 +5150,9 @@ class HttpCli(object): for k in ["zip", "tar"]: v = self.uparam.get(k) if v is not None and (not add_og or not og_fn): + if is_dk and "dks" not in vn.flags: + t = "server config does not allow download-as-zip/tar; only dk is specified, need dks too" + raise Pebkac(403, t) return self.tx_zip(k, v, self.vpath, vn, rem, []) fsroot, vfs_ls, vfs_virt = vn.ls( diff --git a/copyparty/httpsrv.py b/copyparty/httpsrv.py index 04e230cb..c17390d2 100644 --- a/copyparty/httpsrv.py +++ b/copyparty/httpsrv.py @@ -181,6 +181,7 @@ class HttpSrv(object): self.ptn_cc = re.compile(r"[\x00-\x1f]") self.ptn_hsafe = re.compile(r"[\x00-\x1f<>\"'&]") + self.uparam_cc_ok = set("doc move tree".split()) self.mallow = "GET HEAD POST PUT DELETE OPTIONS".split() if not self.args.no_dav: diff --git a/copyparty/util.py b/copyparty/util.py index f2e7a930..4b8c863c 100644 --- a/copyparty/util.py +++ b/copyparty/util.py @@ -816,6 +816,8 @@ class _LUnrecv(object): self.buf = buf + self.buf t = "\033[0;7mur:push\033[0;1;31m {}\n\033[0;7mur:rem:\033[0;1;35m {}\033[0m" print(t.format(buf, self.buf)) + + # !rm.no> @@ -3572,6 +3574,8 @@ except ImportError: except ImportError: impresources = None try: + if sys.version_info > (3, 10): + raise ImportError() import pkg_resources except ImportError: pkg_resources = None diff --git a/tests/test_dots.py b/tests/test_dots.py index a34795c1..9f5944b8 100644 --- a/tests/test_dots.py +++ b/tests/test_dots.py @@ -107,9 +107,9 @@ class TestDots(unittest.TestCase): os.rename(".b", "v/.b") vcfg = [ - ".::r.,u1:g,u2:c,dk", - "v/a:v/a:r.,u1:g,u2:c,dk", - "v/.b:v/.b:r.,u1:g,u2:c,dk", + ".::r.,u1:g,u2:c,dks", + "v/a:v/a:r.,u1:g,u2:c,dks", + "v/.b:v/.b:r.,u1:g,u2:c,dks", ] self.args = Cfg(v=vcfg, a=["u1:u1", "u2:u2"]) self.asrv = AuthSrv(self.args, self.log) diff --git a/tests/test_httpcli.py b/tests/test_httpcli.py index 09a34461..0df9efa7 100644 --- a/tests/test_httpcli.py +++ b/tests/test_httpcli.py @@ -26,6 +26,7 @@ def hdr(query): class TestHttpCli(unittest.TestCase): def setUp(self): self.td = tu.get_ramdisk() + self.maxDiff = 99999 def tearDown(self): os.chdir(tempfile.gettempdir()) @@ -39,6 +40,7 @@ class TestHttpCli(unittest.TestCase): os.mkdir(td) os.chdir(td) + # "perm+user"; r/w/a (a=rw) for user a/o/x (a=all) self.dtypes = ["ra", "ro", "rx", "wa", "wo", "wx", "aa", "ao", "ax"] self.can_read = ["ra", "ro", "aa", "ao"] self.can_write = ["wa", "wo", "aa", "ao"] @@ -121,7 +123,8 @@ class TestHttpCli(unittest.TestCase): # expected files in archives if rok: - ref = [x for x in vfiles if self.in_dive(top + "/" + durl, x)] + zs = top + "/" + durl + ref = [x for x in vfiles if self.in_dive(zs, x)] ref.sort() else: ref = [] @@ -166,7 +169,7 @@ class TestHttpCli(unittest.TestCase): self.assertEqual([], zf_ng) # stash - h, ret = self.put(url) + h, ret = self.put(durl) res = h.startswith("HTTP/1.1 201 ") self.assertEqual(res, wok) if wok: diff --git a/tests/util.py b/tests/util.py index 098803c3..c2438fd7 100644 --- a/tests/util.py +++ b/tests/util.py @@ -267,6 +267,7 @@ class VHttpSrv(object): self.u2idx = None self.ptn_cc = re.compile(r"[\x00-\x1f]") + self.uparam_cc_ok = set("doc move tree".split()) def cachebuster(self): return "a"