diff --git a/copyparty/__main__.py b/copyparty/__main__.py index f6d1d6b4..9b42a309 100644 --- a/copyparty/__main__.py +++ b/copyparty/__main__.py @@ -1004,6 +1004,8 @@ def add_upload(ap): ap2.add_argument("--dotpart", action="store_true", help="dotfile incomplete uploads, hiding them from clients unless \033[33m-ed\033[0m") ap2.add_argument("--plain-ip", action="store_true", help="when avoiding filename collisions by appending the uploader's ip to the filename: append the plaintext ip instead of salting and hashing the ip") ap2.add_argument("--put-name", metavar="TXT", type=u, default="put-{now.6f}-{cip}.bin", help="filename for nameless uploads (when uploader doesn't provide a name); default is [\033[32mput-UNIXTIME-IP.bin\033[0m] (the \033[32m.6f\033[0m means six decimal places) (volflag=put_name)") + ap2.add_argument("--put-ck", metavar="ALG", type=u, default="sha512", help="default checksum-hasher for PUT/WebDAV uploads: no / md5 / sha1 / sha256 / sha512 / b2 / blake2 / b2s / blake2s (volflag=put_ck)") + ap2.add_argument("--bup-ck", metavar="ALG", type=u, default="sha512", help="default checksum-hasher for bup/basic-uploader: no / md5 / sha1 / sha256 / sha512 / b2 / blake2 / b2s / blake2s (volflag=bup_ck)") ap2.add_argument("--unpost", metavar="SEC", type=int, default=3600*12, help="grace period where uploads can be deleted by the uploader, even without delete permissions; 0=disabled, default=12h") ap2.add_argument("--u2abort", metavar="NUM", type=int, default=1, help="clients can abort incomplete uploads by using the unpost tab (requires \033[33m-e2d\033[0m). [\033[32m0\033[0m] = never allowed (disable feature), [\033[32m1\033[0m] = allow if client has the same IP as the upload AND is using the same account, [\033[32m2\033[0m] = just check the IP, [\033[32m3\033[0m] = just check account-name (volflag=u2abort)") ap2.add_argument("--blank-wt", metavar="SEC", type=int, default=300, help="file write grace period (any client can write to a blank file last-modified more recently than \033[33mSEC\033[0m seconds ago)") diff --git a/copyparty/cfg.py b/copyparty/cfg.py index 458feeb4..a01ba03b 100644 --- a/copyparty/cfg.py +++ b/copyparty/cfg.py @@ -75,6 +75,7 @@ def vf_vmap() -> dict[str, str]: "th_x3": "th3x", } for k in ( + "bup_ck", "dbd", "forget_ip", "hsortn", @@ -95,6 +96,7 @@ def vf_vmap() -> dict[str, str]: "og_title_i", "og_tpl", "og_ua", + "put_ck", "put_name", "mv_retry", "rm_retry", @@ -167,6 +169,8 @@ flagcats = { "nosub": "forces all uploads into the top folder of the vfs", "magic": "enables filetype detection for nameless uploads", "put_name": "fallback filename for nameless uploads", + "put_ck": "default checksum-hasher for PUT/WebDAV uploads", + "bup_ck": "default checksum-hasher for bup/basic uploads", "gz": "allows server-side gzip compression of uploads with ?gz", "xz": "allows server-side lzma compression of uploads with ?xz", "pk": "forces server-side compression, optional arg: xz,9", diff --git a/copyparty/httpcli.py b/copyparty/httpcli.py index e73fd3d2..3f444260 100644 --- a/copyparty/httpcli.py +++ b/copyparty/httpcli.py @@ -2179,28 +2179,26 @@ class HttpCli(object): # small toctou, but better than clobbering a hardlink wunlink(self.log, path, vfs.flags) - halg = "sha512" hasher = None copier = hashcopy - if "ck" in self.ouparam or "ck" in self.headers: - halg = zs = self.ouparam.get("ck") or self.headers.get("ck") or "" - if not zs or zs == "no": - copier = justcopy - halg = "" - elif zs == "md5": - hasher = hashlib.md5(**USED4SEC) - elif zs == "sha1": - hasher = hashlib.sha1(**USED4SEC) - elif zs == "sha256": - hasher = hashlib.sha256(**USED4SEC) - elif zs in ("blake2", "b2"): - hasher = hashlib.blake2b(**USED4SEC) - elif zs in ("blake2s", "b2s"): - hasher = hashlib.blake2s(**USED4SEC) - elif zs == "sha512": - pass - else: - raise Pebkac(500, "unknown hash alg") + halg = self.ouparam.get("ck") or self.headers.get("ck") or vfs.flags["put_ck"] + if halg == "sha512": + pass + elif halg == "no": + copier = justcopy + halg = "" + elif halg == "md5": + hasher = hashlib.md5(**USED4SEC) + elif halg == "sha1": + hasher = hashlib.sha1(**USED4SEC) + elif halg == "sha256": + hasher = hashlib.sha256(**USED4SEC) + elif halg in ("blake2", "b2"): + hasher = hashlib.blake2b(**USED4SEC) + elif halg in ("blake2s", "b2s"): + hasher = hashlib.blake2s(**USED4SEC) + else: + raise Pebkac(500, "unknown hash alg") f, fn = ren_open(fn, *open_a, **params) try: @@ -3083,15 +3081,18 @@ class HttpCli(object): vfs, rem = self.asrv.vfs.get(self.vpath, self.uname, False, True) self._assert_safe_rem(rem) - halg = "sha512" hasher = None - copier = hashcopy if nohash: halg = "" copier = justcopy - elif "ck" in self.ouparam or "ck" in self.headers: - halg = self.ouparam.get("ck") or self.headers.get("ck") or "" - if not halg or halg == "no": + else: + copier = hashcopy + halg = ( + self.ouparam.get("ck") or self.headers.get("ck") or vfs.flags["bup_ck"] + ) + if halg == "sha512": + pass + elif halg == "no": copier = justcopy halg = "" elif halg == "md5": @@ -3104,8 +3105,6 @@ class HttpCli(object): hasher = hashlib.blake2b(**USED4SEC) elif halg in ("blake2s", "b2s"): hasher = hashlib.blake2s(**USED4SEC) - elif halg == "sha512": - pass else: raise Pebkac(500, "unknown hash alg") diff --git a/tests/util.py b/tests/util.py index 6990d125..ce6261ee 100644 --- a/tests/util.py +++ b/tests/util.py @@ -180,6 +180,7 @@ class Cfg(Namespace): v=v or [], c=c, E=E, + bup_ck="sha512", dbd="wal", dk_salt="b" * 16, fk_salt="a" * 16, @@ -192,6 +193,7 @@ class Cfg(Namespace): mte={"a": True}, mth={}, mtp=[], + put_ck="sha512", put_name="put-{now.6f}-{cip}.bin", mv_retry="0/0", rm_retry="0/0",