diff --git a/copyparty/httpcli.py b/copyparty/httpcli.py index 32fc101c..b87eac37 100644 --- a/copyparty/httpcli.py +++ b/copyparty/httpcli.py @@ -428,7 +428,7 @@ class HttpCli(object): fn = "put-{:.6f}-{}.bin".format(time.time(), addr) path = os.path.join(fdir, fn) - with open(path, "wb", 512 * 1024) as f: + with open(fsenc(path), "wb", 512 * 1024) as f: post_sz, _, sha_b64 = hashcopy(self.conn, reader, f) self.conn.hsrv.broker.put( @@ -548,9 +548,9 @@ class HttpCli(object): if sub: try: dst = os.path.join(vfs.realpath, rem) - os.makedirs(dst) + os.makedirs(fsenc(dst)) except: - if not os.path.isdir(dst): + if not os.path.isdir(fsenc(dst)): raise Pebkac(400, "some file got your folder name") x = self.conn.hsrv.broker.put(True, "up2k.handle_json", body) @@ -638,7 +638,7 @@ class HttpCli(object): reader = read_socket(self.sr, remains) - with open(path, "rb+", 512 * 1024) as f: + with open(fsenc(path), "rb+", 512 * 1024) as f: f.seek(cstart[0]) post_sz, _, sha_b64 = hashcopy(self.conn, reader, f) @@ -681,7 +681,7 @@ class HttpCli(object): times = (int(time.time()), int(lastmod)) self.log("no more chunks, setting times {}".format(times)) try: - os.utime(path, times) + os.utime(fsenc(path), times) except: self.log("failed to utime ({}, {})".format(path, times)) @@ -932,16 +932,16 @@ class HttpCli(object): mdir, mfile = os.path.split(fp) mfile2 = "{}.{:.3f}.md".format(mfile[:-3], srv_lastmod) try: - os.mkdir(os.path.join(mdir, ".hist")) + os.mkdir(fsenc(os.path.join(mdir, ".hist"))) except: pass - os.rename(fp, os.path.join(mdir, ".hist", mfile2)) + os.rename(fsenc(fp), fsenc(os.path.join(mdir, ".hist", mfile2))) p_field, _, p_data = next(self.parser.gen) if p_field != "body": raise Pebkac(400, "expected body, got {}".format(p_field)) - with open(fp, "wb", 512 * 1024) as f: + with open(fsenc(fp), "wb", 512 * 1024) as f: sz, sha512, _ = hashcopy(self.conn, p_data, f) new_lastmod = os.stat(fsenc(fp)).st_mtime @@ -1269,7 +1269,7 @@ class HttpCli(object): "md_chk_rate": self.args.mcr, "md": boundary, } - html = template.render(**targs).encode("utf-8") + html = template.render(**targs).encode("utf-8", "replace") html = html.split(boundary.encode("utf-8")) if len(html) != 2: raise Exception("boundary appears in " + html_path) @@ -1422,7 +1422,7 @@ class HttpCli(object): ) srv_info.append(humansize(bfree.value) + " free") else: - sv = os.statvfs(abspath) + sv = os.statvfs(fsenc(abspath)) free = humansize(sv.f_frsize * sv.f_bfree, True) total = humansize(sv.f_frsize * sv.f_blocks, True) diff --git a/copyparty/mtag.py b/copyparty/mtag.py index dde4629c..8079ce4a 100644 --- a/copyparty/mtag.py +++ b/copyparty/mtag.py @@ -392,7 +392,7 @@ class MTag(object): import mutagen try: - md = mutagen.File(abspath, easy=True) + md = mutagen.File(fsenc(abspath), easy=True) x = md.info.length except Exception as ex: return {} @@ -403,7 +403,7 @@ class MTag(object): try: q = int(md.info.bitrate / 1024) except: - q = int((os.path.getsize(abspath) / dur) / 128) + q = int((os.path.getsize(fsenc(abspath)) / dur) / 128) ret[".dur"] = [0, dur] ret[".q"] = [0, q] diff --git a/copyparty/th_srv.py b/copyparty/th_srv.py index 326d17e2..8520d3d0 100644 --- a/copyparty/th_srv.py +++ b/copyparty/th_srv.py @@ -228,7 +228,7 @@ class ThumbSrv(object): self.nthr -= 1 def conv_pil(self, abspath, tpath): - with Image.open(abspath) as im: + with Image.open(fsenc(abspath)) as im: crop = not self.args.th_no_crop res2 = self.res if crop: diff --git a/copyparty/u2idx.py b/copyparty/u2idx.py index bd25b54e..56305945 100644 --- a/copyparty/u2idx.py +++ b/copyparty/u2idx.py @@ -163,7 +163,7 @@ class U2idx(object): if rd.startswith("//") or fn.startswith("//"): rd, fn = s3dec(rd, fn) - rp = os.path.join(vtop, rd, fn).replace("\\", "/") + rp = "/".join([vtop, rd, fn]) 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 be496ed9..d39ba9cd 100644 --- a/copyparty/up2k.py +++ b/copyparty/up2k.py @@ -918,7 +918,7 @@ class Up2k(object): if dp_dir.startswith("//") or dp_fn.startswith("//"): dp_dir, dp_fn = s3dec(dp_dir, dp_fn) - dp_abs = os.path.join(cj["ptop"], dp_dir, dp_fn).replace("\\", "/") + dp_abs = "/".join([cj["ptop"], dp_dir, dp_fn]) # relying on path.exists to return false on broken symlinks if os.path.exists(fsenc(dp_abs)): job = { @@ -944,7 +944,7 @@ class Up2k(object): for fn in names: path = os.path.join(job["ptop"], job["prel"], fn) try: - if os.path.getsize(path) > 0: + if os.path.getsize(fsenc(path)) > 0: # upload completed or both present break except: @@ -1068,6 +1068,9 @@ class Up2k(object): raise Pebkac(400, "unknown wark") if chash not in job["need"]: + msg = "chash = {} , need:\n".format(chash) + msg += "\n".join(job["need"]) + self.log(msg) raise Pebkac(400, "already got that but thanks??") nchunk = [n for n, v in enumerate(job["hash"]) if v == chash] @@ -1173,10 +1176,10 @@ class Up2k(object): return wark def _hashlist_from_file(self, path): - fsz = os.path.getsize(path) + fsz = os.path.getsize(fsenc(path)) csz = up2k_chunksize(fsz) ret = [] - with open(path, "rb", 512 * 1024) as f: + with open(fsenc(path), "rb", 512 * 1024) as f: while fsz > 0: self.pp.msg = "{} MB, {}".format(int(fsz / 1024 / 1024), path) hashobj = hashlib.sha512() @@ -1267,13 +1270,13 @@ class Up2k(object): try: # remove the filename reservation path = os.path.join(job["ptop"], job["prel"], job["name"]) - if os.path.getsize(path) == 0: - os.unlink(path) + if os.path.getsize(fsenc(path)) == 0: + os.unlink(fsenc(path)) if len(job["hash"]) == len(job["need"]): # PARTIAL is empty, delete that too path = os.path.join(job["ptop"], job["prel"], job["tnam"]) - os.unlink(path) + os.unlink(fsenc(path)) except: pass @@ -1281,8 +1284,8 @@ class Up2k(object): if not reg: if k not in prev or prev[k] is not None: prev[k] = None - if os.path.exists(path): - os.unlink(path) + if os.path.exists(fsenc(path)): + os.unlink(fsenc(path)) return newest = max(x["poke"] for _, x in reg.items()) if reg else 0 diff --git a/copyparty/util.py b/copyparty/util.py index 35d03c56..fc554e3e 100644 --- a/copyparty/util.py +++ b/copyparty/util.py @@ -271,7 +271,7 @@ def ren_open(fname, *args, **kwargs): else: fpath = fname - if suffix and os.path.exists(fpath): + if suffix and os.path.exists(fsenc(fpath)): fpath += suffix fname += suffix ext += suffix @@ -751,6 +751,8 @@ def s3dec(rd, fn): def atomic_move(src, dst): + src = fsenc(src) + dst = fsenc(dst) if not PY2: os.replace(src, dst) else: