diff --git a/copyparty/httpcli.py b/copyparty/httpcli.py index 462aa194..0c1d5c63 100644 --- a/copyparty/httpcli.py +++ b/copyparty/httpcli.py @@ -896,7 +896,7 @@ class HttpCli(object): if not num_left and fpool: with self.mutex: self.u2fh.close(path) - + # windows cant rename open files if ANYWIN and path != fin_path and not self.args.nw: self.conn.hsrv.broker.put(True, "up2k.finish_upload", ptop, wark).get() @@ -1782,7 +1782,7 @@ class HttpCli(object): if filt and filt not in vp: continue - ret.append({"vp": vp, "sz": sz, "at": at}) + ret.append({"vp": quotep(vp), "sz": sz, "at": at}) if len(ret) > 3000: ret.sort(key=lambda x: x["at"], reverse=True) ret = ret[:2000] diff --git a/copyparty/u2idx.py b/copyparty/u2idx.py index 34e15fa9..3da30bfc 100644 --- a/copyparty/u2idx.py +++ b/copyparty/u2idx.py @@ -8,7 +8,7 @@ import threading from datetime import datetime from .__init__ import ANYWIN, unicode -from .util import absreal, s3dec, Pebkac, min_ex, gen_filekey +from .util import absreal, s3dec, Pebkac, min_ex, gen_filekey, quotep from .bos import bos from .up2k import up2k_wark_from_hashlist @@ -253,21 +253,23 @@ class U2idx(object): if rd.startswith("//") or fn.startswith("//"): rd, fn = s3dec(rd, fn) - if fk: + if not fk: + suf = "" + else: try: ap = absreal(os.path.join(ptop, rd, fn)) inf = bos.stat(ap) except: continue - fn += ( + suf = ( "?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]) + rp = quotep("/".join([x for x in [vtop, rd, fn] if x])) + suf sret.append({"ts": int(ts), "sz": sz, "rp": rp, "w": w[:16]}) for hit in sret: diff --git a/copyparty/up2k.py b/copyparty/up2k.py index 21111253..bee9f333 100644 --- a/copyparty/up2k.py +++ b/copyparty/up2k.py @@ -27,6 +27,7 @@ from .util import ( sanitize_fn, ren_open, atomic_move, + quotep, vsplit, s3enc, s3dec, @@ -1172,7 +1173,7 @@ class Up2k(object): if job["need"]: self.log("unfinished:\n {0}\n {1}".format(src, dst)) err = "partial upload exists at a different location; please resume uploading here instead:\n" - err += "/" + vsrc + " " + err += "/" + quotep(vsrc) + " " dupe = [cj["prel"], cj["name"]] try: @@ -1184,7 +1185,8 @@ class Up2k(object): elif "nodupe" in self.flags[job["ptop"]]: self.log("dupe-reject:\n {0}\n {1}".format(src, dst)) - err = "upload rejected, file already exists:\n/" + vsrc + " " + err = "upload rejected, file already exists:\n" + err += "/" + quotep(vsrc) + " " raise Pebkac(400, err) else: # symlink to the client-provided name, diff --git a/copyparty/web/browser.css b/copyparty/web/browser.css index 9b52e87d..7ac8a10e 100644 --- a/copyparty/web/browser.css +++ b/copyparty/web/browser.css @@ -1964,7 +1964,8 @@ html.light #u2foot .warn span { background: #900; border-color: #d06; } -#u2tab a>span { +#u2tab a>span, +#unpost a>span { font-weight: bold; font-style: italic; color: #fff; diff --git a/copyparty/web/browser.js b/copyparty/web/browser.js index ffd11c66..8a6e79ee 100644 --- a/copyparty/web/browser.js +++ b/copyparty/web/browser.js @@ -2954,7 +2954,7 @@ document.onkeydown = function (e) { var r = res.hits[a], ts = parseInt(r.ts), sz = esc(r.sz + ''), - rp = esc(r.rp + ''), + rp = esc(uricom_dec(r.rp + '')[0]), ext = rp.lastIndexOf('.') > 0 ? rp.split('.').slice(-1)[0] : '%', links = linksplit(r.rp + ''); @@ -4348,7 +4348,6 @@ var unpost = (function () { } ct.onclick = function (e) { - ev(e); var tgt = e.target.closest('a[me]'); if (!tgt) return; @@ -4356,6 +4355,7 @@ var unpost = (function () { if (!tgt.getAttribute('href')) return; + ev(e); var ame = tgt.getAttribute('me'); if (ame != r.me) return toast.err(0, 'something broke, please try a refresh'); diff --git a/copyparty/web/up2k.js b/copyparty/web/up2k.js index a4eb7fbd..07feea18 100644 --- a/copyparty/web/up2k.js +++ b/copyparty/web/up2k.js @@ -939,7 +939,7 @@ function up2k_init(subtle) { pvis.addfile([ uc.fsearch ? esc(entry.name) : linksplit( - uricom_dec(entry.purl)[0] + entry.name).join(' '), + entry.purl + uricom_enc(entry.name)).join(' '), '📐 hash', '' ], fobj.size, draw_each); @@ -1137,6 +1137,7 @@ function up2k_init(subtle) { for (var a = 0; a < st.files.length; a++) { var t = st.files[a]; if (t.want_recheck) { + t.rechecks++; t.want_recheck = false; push_t(st.todo.handshake, t); } @@ -1571,7 +1572,7 @@ function up2k_init(subtle) { console.log("server-rename [" + t.purl + "] [" + t.name + "] to [" + rsp_purl + "] [" + response.name + "]"); t.purl = rsp_purl; t.name = response.name; - pvis.seth(t.n, 0, linksplit(uricom_dec(t.purl)[0] + t.name).join(' ')); + pvis.seth(t.n, 0, linksplit(t.purl + uricom_enc(t.name)).join(' ')); } var chunksize = get_chunksize(t.size), diff --git a/copyparty/web/util.js b/copyparty/web/util.js index 1c48c180..2bdd3181 100644 --- a/copyparty/web/util.js +++ b/copyparty/web/util.js @@ -400,19 +400,17 @@ function linksplit(rp) { link = rp.slice(0, ofs + 1); rp = rp.slice(ofs + 1); } - var vlink = esc(link), - elink = uricom_enc(link); + var vlink = esc(uricom_dec(link)[0]); if (link.indexOf('/') !== -1) { vlink = vlink.slice(0, -1) + '/'; - elink = elink.slice(0, -3) + '/'; } if (!rp && q) - elink += q; + link += q; - ret.push('' + vlink + ''); - apath += elink; + ret.push('' + vlink + ''); + apath += link; } return ret; }