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;
}