diff --git a/copyparty/httpcli.py b/copyparty/httpcli.py index ee31e8c6..3a4b6fe7 100644 --- a/copyparty/httpcli.py +++ b/copyparty/httpcli.py @@ -1084,7 +1084,7 @@ class HttpCli(object): errmsg = "ERROR: " + errmsg for sz, sha512, ofn, lfn in files: - vsuf = '' + vsuf = "" if self.can_read and "fk" in vfs.flags: vsuf = "?k=" + gen_filekey( self.args.fk_salt, @@ -1094,8 +1094,8 @@ class HttpCli(object): )[: vfs.flags["fk"]] vpath = "{}/{}".format(upload_vpath, lfn).strip("/") - msg += 'sha512: {} // {} bytes // {}\n'.format( - sha512[:56], sz, quotep(vpath) + vsuf, html_escape(ofn, crlf=True) + msg += 'sha512: {} // {} bytes // {} {}\n'.format( + sha512[:56], sz, quotep(vpath) + vsuf, html_escape(ofn, crlf=True), vsuf ) # truncated SHA-512 prevents length extension attacks; # using SHA-512/224, optionally SHA-512/256 = :64 @@ -1103,7 +1103,7 @@ class HttpCli(object): "url": "{}://{}/{}".format( "https" if self.tls else "http", self.headers.get("host", "copyparty"), - vpath + vsuf + vpath + vsuf, ), "sha512": sha512[:56], "sz": sz, diff --git a/copyparty/u2idx.py b/copyparty/u2idx.py index c1bd720c..34e15fa9 100644 --- a/copyparty/u2idx.py +++ b/copyparty/u2idx.py @@ -7,8 +7,8 @@ import time import threading from datetime import datetime -from .__init__ import unicode -from .util import s3dec, Pebkac, min_ex +from .__init__ import ANYWIN, unicode +from .util import absreal, s3dec, Pebkac, min_ex, gen_filekey from .bos import bos from .up2k import up2k_wark_from_hashlist @@ -242,6 +242,7 @@ class U2idx(object): self.active_cur = cur sret = [] + fk = flags.get("fk") c = cur.execute(q, v) for hit in c: w, ts, sz, rd, fn, ip, at = hit @@ -252,6 +253,20 @@ class U2idx(object): if rd.startswith("//") or fn.startswith("//"): rd, fn = s3dec(rd, fn) + if fk: + try: + ap = absreal(os.path.join(ptop, rd, fn)) + inf = bos.stat(ap) + except: + continue + + fn += ( + "?k=" + + gen_filekey( + self.args.fk_salt, ap, sz, 0 if ANYWIN else inf.st_ino + )[:fk] + ) + rp = "/".join([x for x in [vtop, rd, fn] if x]) sret.append({"ts": int(ts), "sz": sz, "rp": rp, "w": w[:16]}) diff --git a/copyparty/web/up2k.js b/copyparty/web/up2k.js index 9bb33b56..6fefd9c3 100644 --- a/copyparty/web/up2k.js +++ b/copyparty/web/up2k.js @@ -1658,7 +1658,7 @@ function up2k_init(subtle) { err = rsp; ofs = err.indexOf('\n/'); if (ofs !== -1) { - err = err.slice(0, ofs + 1) + linksplit(err.slice(ofs + 2)).join(' '); + err = err.slice(0, ofs + 1) + linksplit(err.slice(ofs + 2).trimEnd()).join(' '); } } if (err != "") { diff --git a/copyparty/web/util.js b/copyparty/web/util.js index 42c03762..b2d5054b 100644 --- a/copyparty/web/util.js +++ b/copyparty/web/util.js @@ -377,8 +377,16 @@ function makeSortable(table, cb) { function linksplit(rp) { - var ret = []; - var apath = '/'; + var ret = [], + apath = '/', + q = null; + + if (rp && rp.indexOf('?') + 1) { + q = rp.split('?', 2); + rp = q[0]; + q = '?' + q[1]; + } + if (rp && rp.charAt(0) == '/') rp = rp.slice(1); @@ -400,6 +408,9 @@ function linksplit(rp) { elink = elink.slice(0, -3) + '/'; } + if (!rp && q) + elink += q; + ret.push('' + vlink + ''); apath += elink; }