fix utf8 content-disposition

This commit is contained in:
ed 2021-03-26 02:54:19 +01:00
parent 514d046d1f
commit e14d81bc6f
2 changed files with 18 additions and 18 deletions

View file

@ -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

View file

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