mirror of
https://github.com/9001/copyparty.git
synced 2025-08-18 09:22:31 -06:00
mojibake support for the spa stuff
This commit is contained in:
parent
57d994422d
commit
b9a4e47ea2
|
@ -6,7 +6,7 @@ import re
|
||||||
import threading
|
import threading
|
||||||
|
|
||||||
from .__init__ import PY2, WINDOWS
|
from .__init__ import PY2, WINDOWS
|
||||||
from .util import undot, Pebkac, fsdec, fsenc, statdir, uprint
|
from .util import undot, Pebkac, fsdec, fsenc, statdir, nuprint
|
||||||
|
|
||||||
|
|
||||||
class VFS(object):
|
class VFS(object):
|
||||||
|
@ -106,7 +106,7 @@ class VFS(object):
|
||||||
"""return user-readable [fsdir,real,virt] items at vpath"""
|
"""return user-readable [fsdir,real,virt] items at vpath"""
|
||||||
virt_vis = {} # nodes readable by user
|
virt_vis = {} # nodes readable by user
|
||||||
abspath = self.canonical(rem)
|
abspath = self.canonical(rem)
|
||||||
real = list(statdir(uprint, scandir, lstat, abspath))
|
real = list(statdir(nuprint, scandir, lstat, abspath))
|
||||||
real.sort()
|
real.sort()
|
||||||
if not rem:
|
if not rem:
|
||||||
for name, vn2 in sorted(self.nodes.items()):
|
for name, vn2 in sorted(self.nodes.items()):
|
||||||
|
|
|
@ -1136,7 +1136,7 @@ class HttpCli(object):
|
||||||
vfs_ls = exclude_dotfiles(vfs_ls)
|
vfs_ls = exclude_dotfiles(vfs_ls)
|
||||||
|
|
||||||
for fn in [x for x in vfs_ls if x != excl]:
|
for fn in [x for x in vfs_ls if x != excl]:
|
||||||
dirs.append(fn)
|
dirs.append(quotep(fn))
|
||||||
|
|
||||||
for x in vfs_virt.keys():
|
for x in vfs_virt.keys():
|
||||||
if x != excl:
|
if x != excl:
|
||||||
|
@ -1275,7 +1275,12 @@ class HttpCli(object):
|
||||||
del f["rd"]
|
del f["rd"]
|
||||||
if icur:
|
if icur:
|
||||||
q = "select w from up where rd = ? and fn = ?"
|
q = "select w from up where rd = ? and fn = ?"
|
||||||
r = icur.execute(q, (rd, fn)).fetchone()
|
try:
|
||||||
|
r = icur.execute(q, (rd, fn)).fetchone()
|
||||||
|
except:
|
||||||
|
args = s3enc(idx.mem_cur, rd, fn)
|
||||||
|
r = icur.execute(q, args).fetchone()
|
||||||
|
|
||||||
if not r:
|
if not r:
|
||||||
continue
|
continue
|
||||||
|
|
||||||
|
|
|
@ -25,6 +25,8 @@ class U2idx(object):
|
||||||
return
|
return
|
||||||
|
|
||||||
self.cur = {}
|
self.cur = {}
|
||||||
|
self.mem_cur = sqlite3.connect(":memory:")
|
||||||
|
self.mem_cur.execute(r"create table a (b text)")
|
||||||
|
|
||||||
def log(self, msg, c=0):
|
def log(self, msg, c=0):
|
||||||
self.log_func("u2idx", msg, c)
|
self.log_func("u2idx", msg, c)
|
||||||
|
@ -112,6 +114,9 @@ class U2idx(object):
|
||||||
if lim <= 0:
|
if lim <= 0:
|
||||||
break
|
break
|
||||||
|
|
||||||
|
if rd.startswith("//") or fn.startswith("//"):
|
||||||
|
rd, fn = s3dec(rd, fn)
|
||||||
|
|
||||||
rp = os.path.join(vtop, rd, fn).replace("\\", "/")
|
rp = os.path.join(vtop, rd, fn).replace("\\", "/")
|
||||||
sret.append({"ts": int(ts), "sz": sz, "rp": rp, "w": w[:16]})
|
sret.append({"ts": int(ts), "sz": sz, "rp": rp, "w": w[:16]})
|
||||||
|
|
||||||
|
|
|
@ -25,8 +25,8 @@ from .util import (
|
||||||
sanitize_fn,
|
sanitize_fn,
|
||||||
ren_open,
|
ren_open,
|
||||||
atomic_move,
|
atomic_move,
|
||||||
w8b64enc,
|
s3enc,
|
||||||
w8b64dec,
|
s3dec,
|
||||||
statdir,
|
statdir,
|
||||||
)
|
)
|
||||||
from .mtag import MTag
|
from .mtag import MTag
|
||||||
|
@ -110,29 +110,6 @@ class Up2k(object):
|
||||||
def log(self, msg, c=0):
|
def log(self, msg, c=0):
|
||||||
self.log_func("up2k", msg + "\033[K", c)
|
self.log_func("up2k", msg + "\033[K", c)
|
||||||
|
|
||||||
def w8enc(self, rd, fn):
|
|
||||||
ret = []
|
|
||||||
for v in [rd, fn]:
|
|
||||||
try:
|
|
||||||
self.mem_cur.execute("select * from a where b = ?", (v,))
|
|
||||||
ret.append(v)
|
|
||||||
except:
|
|
||||||
ret.append("//" + w8b64enc(v))
|
|
||||||
# self.log("mojien/{} [{}] {}".format(k, v, ret[-1][2:]))
|
|
||||||
|
|
||||||
return tuple(ret)
|
|
||||||
|
|
||||||
def w8dec(self, rd, fn):
|
|
||||||
ret = []
|
|
||||||
for k, v in [["d", rd], ["f", fn]]:
|
|
||||||
if v.startswith("//"):
|
|
||||||
ret.append(w8b64dec(v[2:]))
|
|
||||||
# self.log("mojide/{} [{}] {}".format(k, ret[-1], v[2:]))
|
|
||||||
else:
|
|
||||||
ret.append(v)
|
|
||||||
|
|
||||||
return tuple(ret)
|
|
||||||
|
|
||||||
def _vis_job_progress(self, job):
|
def _vis_job_progress(self, job):
|
||||||
perc = 100 - (len(job["need"]) * 100.0 / len(job["hash"]))
|
perc = 100 - (len(job["need"]) * 100.0 / len(job["hash"]))
|
||||||
path = os.path.join(job["ptop"], job["prel"], job["name"])
|
path = os.path.join(job["ptop"], job["prel"], job["name"])
|
||||||
|
@ -340,7 +317,7 @@ class Up2k(object):
|
||||||
try:
|
try:
|
||||||
c = dbw[0].execute(sql, (rd, fn))
|
c = dbw[0].execute(sql, (rd, fn))
|
||||||
except:
|
except:
|
||||||
c = dbw[0].execute(sql, self.w8enc(rd, fn))
|
c = dbw[0].execute(sql, s3enc(self.mem_cur, rd, fn))
|
||||||
|
|
||||||
in_db = list(c.fetchall())
|
in_db = list(c.fetchall())
|
||||||
if in_db:
|
if in_db:
|
||||||
|
@ -394,7 +371,7 @@ class Up2k(object):
|
||||||
for dwark, dts, dsz, drd, dfn in c:
|
for dwark, dts, dsz, drd, dfn in c:
|
||||||
nchecked += 1
|
nchecked += 1
|
||||||
if drd.startswith("//") or dfn.startswith("//"):
|
if drd.startswith("//") or dfn.startswith("//"):
|
||||||
drd, dfn = self.w8dec(drd, dfn)
|
drd, dfn = s3dec(drd, dfn)
|
||||||
|
|
||||||
abspath = os.path.join(top, drd, dfn)
|
abspath = os.path.join(top, drd, dfn)
|
||||||
# almost zero overhead dw
|
# almost zero overhead dw
|
||||||
|
@ -480,6 +457,9 @@ class Up2k(object):
|
||||||
if c2.execute(q, (w[:16],)).fetchone():
|
if c2.execute(q, (w[:16],)).fetchone():
|
||||||
continue
|
continue
|
||||||
|
|
||||||
|
if rd.startswith("//") or fn.startswith("//"):
|
||||||
|
rd, fn = s3dec(rd, fn)
|
||||||
|
|
||||||
abspath = os.path.join(ptop, rd, fn)
|
abspath = os.path.join(ptop, rd, fn)
|
||||||
self.pp.msg = "c{} {}".format(n_left, abspath)
|
self.pp.msg = "c{} {}".format(n_left, abspath)
|
||||||
args = c3, entags, w, abspath
|
args = c3, entags, w, abspath
|
||||||
|
@ -704,7 +684,7 @@ class Up2k(object):
|
||||||
cur = cur.execute(q, argv)
|
cur = cur.execute(q, argv)
|
||||||
for _, dtime, dsize, dp_dir, dp_fn in cur:
|
for _, dtime, dsize, dp_dir, dp_fn in cur:
|
||||||
if dp_dir.startswith("//") or dp_fn.startswith("//"):
|
if dp_dir.startswith("//") or dp_fn.startswith("//"):
|
||||||
dp_dir, dp_fn = self.w8dec(dp_dir, dp_fn)
|
dp_dir, dp_fn = s3dec(self.mem_cur, dp_dir, dp_fn)
|
||||||
|
|
||||||
dp_abs = os.path.join(cj["ptop"], dp_dir, dp_fn).replace("\\", "/")
|
dp_abs = os.path.join(cj["ptop"], dp_dir, dp_fn).replace("\\", "/")
|
||||||
# relying on path.exists to return false on broken symlinks
|
# relying on path.exists to return false on broken symlinks
|
||||||
|
@ -920,7 +900,7 @@ class Up2k(object):
|
||||||
try:
|
try:
|
||||||
db.execute(sql, (rd, fn))
|
db.execute(sql, (rd, fn))
|
||||||
except:
|
except:
|
||||||
db.execute(sql, self.w8enc(rd, fn))
|
db.execute(sql, s3enc(self.mem_cur, rd, fn))
|
||||||
|
|
||||||
def db_add(self, db, wark, rd, fn, ts, sz):
|
def db_add(self, db, wark, rd, fn, ts, sz):
|
||||||
sql = "insert into up values (?,?,?,?,?)"
|
sql = "insert into up values (?,?,?,?,?)"
|
||||||
|
@ -928,7 +908,7 @@ class Up2k(object):
|
||||||
try:
|
try:
|
||||||
db.execute(sql, v)
|
db.execute(sql, v)
|
||||||
except:
|
except:
|
||||||
rd, fn = self.w8enc(rd, fn)
|
rd, fn = s3enc(self.mem_cur, rd, fn)
|
||||||
v = (wark, ts, sz, rd, fn)
|
v = (wark, ts, sz, rd, fn)
|
||||||
db.execute(sql, v)
|
db.execute(sql, v)
|
||||||
|
|
||||||
|
|
|
@ -135,6 +135,10 @@ def uprint(msg):
|
||||||
print(msg.encode("ascii", "replace").decode(), end="")
|
print(msg.encode("ascii", "replace").decode(), end="")
|
||||||
|
|
||||||
|
|
||||||
|
def nuprint(msg):
|
||||||
|
uprint("{}\n".format(msg))
|
||||||
|
|
||||||
|
|
||||||
@contextlib.contextmanager
|
@contextlib.contextmanager
|
||||||
def ren_open(fname, *args, **kwargs):
|
def ren_open(fname, *args, **kwargs):
|
||||||
fdir = kwargs.pop("fdir", None)
|
fdir = kwargs.pop("fdir", None)
|
||||||
|
@ -600,6 +604,31 @@ else:
|
||||||
fsdec = w8dec
|
fsdec = w8dec
|
||||||
|
|
||||||
|
|
||||||
|
def s3enc(mem_cur, rd, fn):
|
||||||
|
ret = []
|
||||||
|
for v in [rd, fn]:
|
||||||
|
try:
|
||||||
|
mem_cur.execute("select * from a where b = ?", (v,))
|
||||||
|
ret.append(v)
|
||||||
|
except:
|
||||||
|
ret.append("//" + w8b64enc(v))
|
||||||
|
# self.log("mojien/{} [{}] {}".format(k, v, ret[-1][2:]))
|
||||||
|
|
||||||
|
return tuple(ret)
|
||||||
|
|
||||||
|
|
||||||
|
def s3dec(rd, fn):
|
||||||
|
ret = []
|
||||||
|
for k, v in [["d", rd], ["f", fn]]:
|
||||||
|
if v.startswith("//"):
|
||||||
|
ret.append(w8b64dec(v[2:]))
|
||||||
|
# self.log("mojide/{} [{}] {}".format(k, ret[-1], v[2:]))
|
||||||
|
else:
|
||||||
|
ret.append(v)
|
||||||
|
|
||||||
|
return tuple(ret)
|
||||||
|
|
||||||
|
|
||||||
def atomic_move(src, dst):
|
def atomic_move(src, dst):
|
||||||
if not PY2:
|
if not PY2:
|
||||||
os.replace(src, dst)
|
os.replace(src, dst)
|
||||||
|
|
|
@ -467,7 +467,7 @@ function play(tid, call_depth) {
|
||||||
var o = ebi(oid);
|
var o = ebi(oid);
|
||||||
o.setAttribute('id', 'thx_js');
|
o.setAttribute('id', 'thx_js');
|
||||||
if (window.history && history.replaceState) {
|
if (window.history && history.replaceState) {
|
||||||
hist_replace((document.location + '').split('#')[0] + '#' + oid);
|
hist_replace(document.location.pathname + '#' + oid);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
document.location.hash = oid;
|
document.location.hash = oid;
|
||||||
|
@ -510,7 +510,7 @@ function evau_error(e) {
|
||||||
if (eplaya.error.message)
|
if (eplaya.error.message)
|
||||||
err += '\n\n' + eplaya.error.message;
|
err += '\n\n' + eplaya.error.message;
|
||||||
|
|
||||||
err += '\n\nFile: «' + decodeURIComponent(eplaya.src.split('/').slice(-1)[0]) + '»';
|
err += '\n\nFile: «' + uricom_dec(eplaya.src.split('/').slice(-1)[0]) + '»';
|
||||||
|
|
||||||
alert(err);
|
alert(err);
|
||||||
}
|
}
|
||||||
|
@ -545,7 +545,7 @@ function autoplay_blocked() {
|
||||||
var na = ebi('blk_na');
|
var na = ebi('blk_na');
|
||||||
|
|
||||||
var fn = mp.tracks[mp.au.tid].split(/\//).pop();
|
var fn = mp.tracks[mp.au.tid].split(/\//).pop();
|
||||||
fn = decodeURIComponent(fn.replace(/\+/g, ' '));
|
fn = uricom_dec(fn.replace(/\+/g, ' '));
|
||||||
|
|
||||||
go.textContent = 'Play "' + fn + '"';
|
go.textContent = 'Play "' + fn + '"';
|
||||||
go.onclick = function (e) {
|
go.onclick = function (e) {
|
||||||
|
@ -744,7 +744,7 @@ function autoplay_blocked() {
|
||||||
treefiles.appendChild(ebi('epi'));
|
treefiles.appendChild(ebi('epi'));
|
||||||
|
|
||||||
swrite('entreed', 'tree');
|
swrite('entreed', 'tree');
|
||||||
get_tree("", get_vpath(), true);
|
get_tree("", get_evpath(), true);
|
||||||
}
|
}
|
||||||
|
|
||||||
function get_tree(top, dst, rst) {
|
function get_tree(top, dst, rst) {
|
||||||
|
@ -776,7 +776,7 @@ function autoplay_blocked() {
|
||||||
ebi('treeul').setAttribute('ts', this.ts);
|
ebi('treeul').setAttribute('ts', this.ts);
|
||||||
|
|
||||||
var top = this.top == '.' ? this.dst : this.top,
|
var top = this.top == '.' ? this.dst : this.top,
|
||||||
name = top.split('/').slice(-2)[0],
|
name = uricom_dec(top.split('/').slice(-2)[0]),
|
||||||
rtop = top.replace(/^\/+/, "");
|
rtop = top.replace(/^\/+/, "");
|
||||||
|
|
||||||
try {
|
try {
|
||||||
|
@ -827,7 +827,7 @@ function autoplay_blocked() {
|
||||||
}
|
}
|
||||||
|
|
||||||
function reload_tree() {
|
function reload_tree() {
|
||||||
var cdir = get_vpath();
|
var cdir = get_evpath();
|
||||||
var links = document.querySelectorAll('#treeul a+a');
|
var links = document.querySelectorAll('#treeul a+a');
|
||||||
for (var a = 0, aa = links.length; a < aa; a++) {
|
for (var a = 0, aa = links.length; a < aa; a++) {
|
||||||
var href = links[a].getAttribute('href');
|
var href = links[a].getAttribute('href');
|
||||||
|
@ -912,7 +912,7 @@ function autoplay_blocked() {
|
||||||
for (var a = 0; a < nodes.length; a++) {
|
for (var a = 0; a < nodes.length; a++) {
|
||||||
var r = nodes[a],
|
var r = nodes[a],
|
||||||
ln = ['<tr><td>' + r.lead + '</td><td><a href="' +
|
ln = ['<tr><td>' + r.lead + '</td><td><a href="' +
|
||||||
top + r.href + '">' + esc(decodeURIComponent(r.href)) + '</a>', r.sz];
|
top + r.href + '">' + esc(uricom_dec(r.href)) + '</a>', r.sz];
|
||||||
|
|
||||||
for (var b = 0; b < res.taglist.length; b++) {
|
for (var b = 0; b < res.taglist.length; b++) {
|
||||||
var k = res.taglist[b],
|
var k = res.taglist[b],
|
||||||
|
@ -960,12 +960,14 @@ function autoplay_blocked() {
|
||||||
keys.sort();
|
keys.sort();
|
||||||
for (var a = 0; a < keys.length; a++) {
|
for (var a = 0; a < keys.length; a++) {
|
||||||
var kk = keys[a],
|
var kk = keys[a],
|
||||||
k = kk.slice(1),
|
ks = kk.slice(1),
|
||||||
url = '/' + (top ? top + k : k) + '/',
|
k = uricom_dec(ks),
|
||||||
ek = esc(k),
|
hek = esc(k),
|
||||||
|
uek = ks == k ? k : uricom_enc(k, true),
|
||||||
|
url = '/' + (top ? top + uek : uek) + '/',
|
||||||
sym = res[kk] ? '-' : '+',
|
sym = res[kk] ? '-' : '+',
|
||||||
link = '<a href="#">' + sym + '</a><a href="' +
|
link = '<a href="#">' + sym + '</a><a href="' +
|
||||||
esc(url) + '">' + ek + '</a>';
|
url + '">' + hek + '</a>';
|
||||||
|
|
||||||
if (res[kk]) {
|
if (res[kk]) {
|
||||||
var subtree = parsetree(res[kk], url.slice(1));
|
var subtree = parsetree(res[kk], url.slice(1));
|
||||||
|
@ -1019,12 +1021,17 @@ function autoplay_blocked() {
|
||||||
|
|
||||||
window.onpopstate = function (e) {
|
window.onpopstate = function (e) {
|
||||||
console.log("h-pop " + e.state);
|
console.log("h-pop " + e.state);
|
||||||
get_tree("", e.state, true);
|
if (!e.state)
|
||||||
reqls(e.state);
|
return;
|
||||||
|
|
||||||
|
var url = new URL(e.state, "https://" + document.location.host);
|
||||||
|
url = url.pathname;
|
||||||
|
get_tree("", url, true);
|
||||||
|
reqls(url);
|
||||||
};
|
};
|
||||||
|
|
||||||
if (window.history && history.pushState) {
|
if (window.history && history.pushState) {
|
||||||
hist_replace(get_vpath() + window.location.hash);
|
hist_replace(get_evpath() + window.location.hash);
|
||||||
}
|
}
|
||||||
})();
|
})();
|
||||||
|
|
||||||
|
@ -1196,7 +1203,7 @@ function reload_browser(not_mp) {
|
||||||
filecols.set_style();
|
filecols.set_style();
|
||||||
makeSortable(ebi('files'));
|
makeSortable(ebi('files'));
|
||||||
|
|
||||||
var parts = get_vpath().split('/');
|
var parts = get_evpath().split('/');
|
||||||
var rm = document.querySelectorAll('#path>a+a+a');
|
var rm = document.querySelectorAll('#path>a+a+a');
|
||||||
for (a = rm.length - 1; a >= 0; a--)
|
for (a = rm.length - 1; a >= 0; a--)
|
||||||
rm[a].parentNode.removeChild(rm[a]);
|
rm[a].parentNode.removeChild(rm[a]);
|
||||||
|
|
|
@ -65,7 +65,7 @@ function statify(obj) {
|
||||||
if (a > 0)
|
if (a > 0)
|
||||||
loc.push(n[a]);
|
loc.push(n[a]);
|
||||||
|
|
||||||
var dec = hesc(decodeURIComponent(n[a]));
|
var dec = hesc(uricom_dec(n[a]));
|
||||||
|
|
||||||
nav.push('<a href="/' + loc.join('/') + '">' + dec + '</a>');
|
nav.push('<a href="/' + loc.join('/') + '">' + dec + '</a>');
|
||||||
}
|
}
|
||||||
|
|
|
@ -15,7 +15,7 @@ var dom_md = ebi('mt');
|
||||||
if (a > 0)
|
if (a > 0)
|
||||||
loc.push(n[a]);
|
loc.push(n[a]);
|
||||||
|
|
||||||
var dec = decodeURIComponent(n[a]).replace(/&/g, "&").replace(/</g, "<").replace(/>/g, ">");
|
var dec = uricom_dec(n[a]).replace(/&/g, "&").replace(/</g, "<").replace(/>/g, ">");
|
||||||
|
|
||||||
nav.push('<a href="/' + loc.join('/') + '">' + dec + '</a>');
|
nav.push('<a href="/' + loc.join('/') + '">' + dec + '</a>');
|
||||||
}
|
}
|
||||||
|
|
|
@ -332,7 +332,7 @@ function up2k_init(have_crypto) {
|
||||||
"name": fobj.name,
|
"name": fobj.name,
|
||||||
"size": fobj.size,
|
"size": fobj.size,
|
||||||
"lmod": lmod / 1000,
|
"lmod": lmod / 1000,
|
||||||
"purl": get_vpath(),
|
"purl": get_evpath(),
|
||||||
"done": false,
|
"done": false,
|
||||||
"hash": []
|
"hash": []
|
||||||
};
|
};
|
||||||
|
|
|
@ -220,6 +220,31 @@ function linksplit(rp) {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
function uricom_enc(txt, do_fb_enc) {
|
||||||
|
try {
|
||||||
|
return encodeURIComponent(txt);
|
||||||
|
}
|
||||||
|
catch (ex) {
|
||||||
|
console.log("uce-err [" + txt + "]");
|
||||||
|
if (do_fb_enc)
|
||||||
|
return esc(txt);
|
||||||
|
|
||||||
|
return txt;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
function uricom_dec(txt) {
|
||||||
|
try {
|
||||||
|
return decodeURIComponent(txt);
|
||||||
|
}
|
||||||
|
catch (ex) {
|
||||||
|
console.log("ucd-err [" + txt + "]");
|
||||||
|
return txt;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
function get_evpath() {
|
function get_evpath() {
|
||||||
var ret = document.location.pathname;
|
var ret = document.location.pathname;
|
||||||
|
|
||||||
|
@ -234,7 +259,7 @@ function get_evpath() {
|
||||||
|
|
||||||
|
|
||||||
function get_vpath() {
|
function get_vpath() {
|
||||||
return decodeURIComponent(get_evpath());
|
return uricom_dec(get_evpath());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue