mirror of
https://github.com/9001/copyparty.git
synced 2025-08-17 17:12:13 -06:00
fix utf8 content-disposition
This commit is contained in:
parent
514d046d1f
commit
e14d81bc6f
|
@ -160,15 +160,16 @@ class VFS(object):
|
||||||
for x in vfs.walk(wrel, "", uname, scandir, lstat):
|
for x in vfs.walk(wrel, "", uname, scandir, lstat):
|
||||||
yield x
|
yield x
|
||||||
|
|
||||||
def zipgen(self, rems, uname, dots, scandir):
|
def zipgen(self, vrem, rems, uname, dots, scandir):
|
||||||
vtops = [["", [self, ""]]]
|
vtops = [["", [self, vrem]]]
|
||||||
if rems:
|
if rems:
|
||||||
# list of subfolders to zip was provided,
|
# list of subfolders to zip was provided,
|
||||||
# add all the ones uname is allowed to access
|
# add all the ones uname is allowed to access
|
||||||
vtops = []
|
vtops = []
|
||||||
for rem in rems:
|
for rem in rems:
|
||||||
try:
|
try:
|
||||||
vn = self.get(rem, uname, True, False)
|
d = rem if not vrem else vrem + "/" + rem
|
||||||
|
vn = self.get(d, uname, True, False)
|
||||||
vtops.append([rem, vn])
|
vtops.append([rem, vn])
|
||||||
except:
|
except:
|
||||||
pass
|
pass
|
||||||
|
|
|
@ -1047,7 +1047,7 @@ class HttpCli(object):
|
||||||
self.log("{}, {}".format(logmsg, spd))
|
self.log("{}, {}".format(logmsg, spd))
|
||||||
return ret
|
return ret
|
||||||
|
|
||||||
def tx_zip(self, vn, rems, dots):
|
def tx_zip(self, vn, rem, items, dots):
|
||||||
if self.args.no_zip:
|
if self.args.no_zip:
|
||||||
raise Pebkac(400, "not enabled")
|
raise Pebkac(400, "not enabled")
|
||||||
|
|
||||||
|
@ -1060,32 +1060,31 @@ class HttpCli(object):
|
||||||
else:
|
else:
|
||||||
mime = "application/zip"
|
mime = "application/zip"
|
||||||
|
|
||||||
if rems and rems[0]:
|
fn = items[0] if items and items[0] else self.vpath
|
||||||
fn = rems[0]
|
if fn:
|
||||||
|
fn = fn.rstrip("/").split("/")[-1]
|
||||||
else:
|
else:
|
||||||
fn = self.vpath.rstrip("/").split("/")[-1]
|
|
||||||
|
|
||||||
if not fn:
|
|
||||||
fn = self.headers.get("host", "hey")
|
fn = self.headers.get("host", "hey")
|
||||||
|
|
||||||
afn = "".join(
|
afn = "".join(
|
||||||
[x if x in (string.ascii_letters + string.digits) else "_" for x in fn]
|
[x if x in (string.ascii_letters + string.digits) else "_" for x in fn]
|
||||||
)
|
)
|
||||||
|
|
||||||
ufn = "".join(
|
bascii = unicode(string.ascii_letters + string.digits).encode("utf-8")
|
||||||
|
ufn = b"".join(
|
||||||
[
|
[
|
||||||
x
|
chr(x).encode("utf-8")
|
||||||
if x in (string.ascii_letters + string.digits)
|
if x in bascii
|
||||||
else "%{:02x}".format(ord(x))
|
else "%{:02x}".format(x).encode("ascii")
|
||||||
for x in fn
|
for x in fn.encode("utf-8")
|
||||||
]
|
]
|
||||||
)
|
).decode("ascii")
|
||||||
|
|
||||||
cdis = 'attachment; filename="{}.{}", filename*=UTF-8''{}.{}"
|
cdis = "attachment; filename=\"{}.{}\"; filename*=UTF-8''{}.{}"
|
||||||
cdis = cdis.format(afn, fmt, ufn, fmt)
|
cdis = cdis.format(afn, fmt, ufn, fmt)
|
||||||
self.send_headers(None, mime=mime, headers={"Content-Disposition": cdis})
|
self.send_headers(None, mime=mime, headers={"Content-Disposition": cdis})
|
||||||
|
|
||||||
fgen = vn.zipgen(rems, self.uname, dots, not self.args.no_scandir)
|
fgen = vn.zipgen(rem, items, self.uname, dots, not self.args.no_scandir)
|
||||||
# for f in fgen: print(repr({k: f[k] for k in ["vp", "ap"]}))
|
# for f in fgen: print(repr({k: f[k] for k in ["vp", "ap"]}))
|
||||||
bgen = StreamZip(fgen, False, False)
|
bgen = StreamZip(fgen, False, False)
|
||||||
bsent = 0
|
bsent = 0
|
||||||
|
@ -1251,7 +1250,7 @@ class HttpCli(object):
|
||||||
return self.tx_file(abspath)
|
return self.tx_file(abspath)
|
||||||
|
|
||||||
if "zip" in self.uparam:
|
if "zip" in self.uparam:
|
||||||
return self.tx_zip(vn, None, False)
|
return self.tx_zip(vn, rem, [], False)
|
||||||
|
|
||||||
fsroot, vfs_ls, vfs_virt = vn.ls(rem, self.uname, not self.args.no_scandir)
|
fsroot, vfs_ls, vfs_virt = vn.ls(rem, self.uname, not self.args.no_scandir)
|
||||||
stats = {k: v for k, v in vfs_ls}
|
stats = {k: v for k, v in vfs_ls}
|
||||||
|
|
Loading…
Reference in a new issue