copyparty 1.16.6__py3-none-any.whl → 1.16.7__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- copyparty/__version__.py +2 -2
- copyparty/authsrv.py +2 -2
- copyparty/httpcli.py +77 -31
- copyparty/httpsrv.py +0 -4
- copyparty/tcpsrv.py +3 -3
- copyparty/up2k.py +1 -1
- copyparty/web/a/u2c.py +1 -1
- copyparty/web/browser.html +1 -1
- copyparty/web/browser.js.gz +0 -0
- copyparty/web/md.html +2 -2
- copyparty/web/mde.html +2 -2
- copyparty/web/rups.css.gz +0 -0
- copyparty/web/rups.html +8 -25
- copyparty/web/rups.js.gz +0 -0
- copyparty/web/shares.html +4 -3
- copyparty/web/splash.html +1 -1
- copyparty/web/svcs.html +1 -1
- {copyparty-1.16.6.dist-info → copyparty-1.16.7.dist-info}/METADATA +1 -1
- {copyparty-1.16.6.dist-info → copyparty-1.16.7.dist-info}/RECORD +23 -23
- {copyparty-1.16.6.dist-info → copyparty-1.16.7.dist-info}/LICENSE +0 -0
- {copyparty-1.16.6.dist-info → copyparty-1.16.7.dist-info}/WHEEL +0 -0
- {copyparty-1.16.6.dist-info → copyparty-1.16.7.dist-info}/entry_points.txt +0 -0
- {copyparty-1.16.6.dist-info → copyparty-1.16.7.dist-info}/top_level.txt +0 -0
copyparty/__version__.py
CHANGED
copyparty/authsrv.py
CHANGED
@@ -2174,11 +2174,11 @@ class AuthSrv(object):
|
|
2174
2174
|
if not self.args.no_voldump:
|
2175
2175
|
self.log(t)
|
2176
2176
|
|
2177
|
-
if have_e2d:
|
2177
|
+
if have_e2d or self.args.idp_h_usr:
|
2178
2178
|
t = self.chk_sqlite_threadsafe()
|
2179
2179
|
if t:
|
2180
2180
|
self.log("\n\033[{}\033[0m\n".format(t))
|
2181
|
-
|
2181
|
+
if have_e2d:
|
2182
2182
|
if not have_e2t:
|
2183
2183
|
t = "hint: enable multimedia indexing (artist/title/...) with argument -e2ts"
|
2184
2184
|
self.log(t, 6)
|
copyparty/httpcli.py
CHANGED
@@ -141,6 +141,14 @@ A_FILE = os.stat_result(
|
|
141
141
|
(0o644, -1, -1, 1, 1000, 1000, 8, 0x39230101, 0x39230101, 0x39230101)
|
142
142
|
)
|
143
143
|
|
144
|
+
RE_CC = re.compile(r"[\x00-\x1f]") # search always faster
|
145
|
+
RE_HSAFE = re.compile(r"[\x00-\x1f<>\"'&]") # search always much faster
|
146
|
+
RE_HOST = re.compile(r"[^][0-9a-zA-Z.:_-]") # search faster <=17ch
|
147
|
+
RE_MHOST = re.compile(r"^[][0-9a-zA-Z.:_-]+$") # match faster >=18ch
|
148
|
+
RE_K = re.compile(r"[^0-9a-zA-Z_-]") # search faster <=17ch
|
149
|
+
|
150
|
+
UPARAM_CC_OK = set("doc move tree".split())
|
151
|
+
|
144
152
|
|
145
153
|
class HttpCli(object):
|
146
154
|
"""
|
@@ -384,6 +392,15 @@ class HttpCli(object):
|
|
384
392
|
self.host = self.headers.get("x-forwarded-host") or self.host
|
385
393
|
trusted_xff = True
|
386
394
|
|
395
|
+
m = RE_HOST.search(self.host)
|
396
|
+
if m and self.host != self.args.name:
|
397
|
+
zs = self.host
|
398
|
+
t = "malicious user; illegal Host header; req(%r) host(%r) => %r"
|
399
|
+
self.log(t % (self.req, zs, zs[m.span()[0] :]), 1)
|
400
|
+
self.cbonk(self.conn.hsrv.gmal, zs, "bad_host", "illegal Host header")
|
401
|
+
self.terse_reply(b"illegal Host header", 400)
|
402
|
+
return False
|
403
|
+
|
387
404
|
if self.is_banned():
|
388
405
|
return False
|
389
406
|
|
@@ -429,6 +446,16 @@ class HttpCli(object):
|
|
429
446
|
self.loud_reply(t, status=400)
|
430
447
|
return False
|
431
448
|
|
449
|
+
ptn_cc = RE_CC
|
450
|
+
m = ptn_cc.search(self.req)
|
451
|
+
if m:
|
452
|
+
zs = self.req
|
453
|
+
t = "malicious user; Cc in req0 %r => %r"
|
454
|
+
self.log(t % (zs, zs[m.span()[0] :]), 1)
|
455
|
+
self.cbonk(self.conn.hsrv.gmal, zs, "cc_r0", "Cc in req0")
|
456
|
+
self.terse_reply(b"", 500)
|
457
|
+
return False
|
458
|
+
|
432
459
|
# split req into vpath + uparam
|
433
460
|
uparam = {}
|
434
461
|
if "?" not in self.req:
|
@@ -441,8 +468,8 @@ class HttpCli(object):
|
|
441
468
|
self.trailing_slash = vpath.endswith("/")
|
442
469
|
vpath = undot(vpath)
|
443
470
|
|
444
|
-
|
445
|
-
k_safe =
|
471
|
+
re_k = RE_K
|
472
|
+
k_safe = UPARAM_CC_OK
|
446
473
|
for k in arglist.split("&"):
|
447
474
|
if "=" in k:
|
448
475
|
k, zs = k.split("=", 1)
|
@@ -452,6 +479,14 @@ class HttpCli(object):
|
|
452
479
|
else:
|
453
480
|
sv = ""
|
454
481
|
|
482
|
+
m = re_k.search(k)
|
483
|
+
if m:
|
484
|
+
t = "malicious user; bad char in query key; req(%r) qk(%r) => %r"
|
485
|
+
self.log(t % (self.req, k, k[m.span()[0] :]), 1)
|
486
|
+
self.cbonk(self.conn.hsrv.gmal, self.req, "bc_q", "illegal qkey")
|
487
|
+
self.terse_reply(b"", 500)
|
488
|
+
return False
|
489
|
+
|
455
490
|
k = k.lower()
|
456
491
|
uparam[k] = sv
|
457
492
|
|
@@ -459,17 +494,26 @@ class HttpCli(object):
|
|
459
494
|
continue
|
460
495
|
|
461
496
|
zs = "%s=%s" % (k, sv)
|
462
|
-
m =
|
497
|
+
m = ptn_cc.search(zs)
|
463
498
|
if not m:
|
464
499
|
continue
|
465
500
|
|
466
|
-
|
467
|
-
t
|
468
|
-
self.log(t.format(self.req, hit), 1)
|
501
|
+
t = "malicious user; Cc in query; req(%r) qp(%r) => %r"
|
502
|
+
self.log(t % (self.req, zs, zs[m.span()[0] :]), 1)
|
469
503
|
self.cbonk(self.conn.hsrv.gmal, self.req, "cc_q", "Cc in query")
|
470
504
|
self.terse_reply(b"", 500)
|
471
505
|
return False
|
472
506
|
|
507
|
+
if "k" in uparam:
|
508
|
+
m = RE_K.search(uparam["k"])
|
509
|
+
if m:
|
510
|
+
zs = uparam["k"]
|
511
|
+
t = "malicious user; illegal filekey; req(%r) k(%r) => %r"
|
512
|
+
self.log(t % (self.req, zs, zs[m.span()[0] :]), 1)
|
513
|
+
self.cbonk(self.conn.hsrv.gmal, zs, "bad_k", "illegal filekey")
|
514
|
+
self.terse_reply(b"illegal filekey", 400)
|
515
|
+
return False
|
516
|
+
|
473
517
|
if self.is_vproxied:
|
474
518
|
if vpath.startswith(self.args.R):
|
475
519
|
vpath = vpath[len(self.args.R) + 1 :]
|
@@ -513,7 +557,7 @@ class HttpCli(object):
|
|
513
557
|
return self.tx_qr()
|
514
558
|
|
515
559
|
if relchk(self.vpath) and (self.vpath != "*" or self.mode != "OPTIONS"):
|
516
|
-
self.log("
|
560
|
+
self.log("illegal relpath; req(%r) => %r" % (self.req, "/" + self.vpath))
|
517
561
|
self.cbonk(self.conn.hsrv.gmal, self.req, "bad_vp", "invalid relpaths")
|
518
562
|
return self.tx_404() and self.keepalive
|
519
563
|
|
@@ -866,12 +910,12 @@ class HttpCli(object):
|
|
866
910
|
for k, zs in list(self.out_headers.items()) + self.out_headerlist:
|
867
911
|
response.append("%s: %s" % (k, zs))
|
868
912
|
|
913
|
+
ptn_cc = RE_CC
|
869
914
|
for zs in response:
|
870
|
-
m =
|
915
|
+
m = ptn_cc.search(zs)
|
871
916
|
if m:
|
872
|
-
|
873
|
-
t
|
874
|
-
self.log(t.format(zs, hit), 1)
|
917
|
+
t = "malicious user; Cc in out-hdr; req(%r) hdr(%r) => %r"
|
918
|
+
self.log(t % (self.req, zs, zs[m.span()[0] :]), 1)
|
875
919
|
self.cbonk(self.conn.hsrv.gmal, zs, "cc_hdr", "Cc in out-hdr")
|
876
920
|
raise Pebkac(999)
|
877
921
|
|
@@ -997,7 +1041,7 @@ class HttpCli(object):
|
|
997
1041
|
if not kv:
|
998
1042
|
return ""
|
999
1043
|
|
1000
|
-
r = ["%s=%s" % (k, quotep(zs)) if zs else k for k, zs in kv.items()]
|
1044
|
+
r = ["%s=%s" % (quotep(k), quotep(zs)) if zs else k for k, zs in kv.items()]
|
1001
1045
|
return "?" + "&".join(r)
|
1002
1046
|
|
1003
1047
|
def ourlq(self) :
|
@@ -1149,8 +1193,8 @@ class HttpCli(object):
|
|
1149
1193
|
return self.tx_res(res_path)
|
1150
1194
|
|
1151
1195
|
if res_path != undot(res_path):
|
1152
|
-
t = "malicious user; attempted path traversal %r => %r"
|
1153
|
-
self.log(t % ("/" + self.vpath, res_path), 1)
|
1196
|
+
t = "malicious user; attempted path traversal; req(%r) vp(%r) => %r"
|
1197
|
+
self.log(t % (self.req, "/" + self.vpath, res_path), 1)
|
1154
1198
|
self.cbonk(self.conn.hsrv.gmal, self.req, "trav", "path traversal")
|
1155
1199
|
|
1156
1200
|
self.tx_404()
|
@@ -1293,8 +1337,8 @@ class HttpCli(object):
|
|
1293
1337
|
|
1294
1338
|
pw = self.ouparam.get("pw")
|
1295
1339
|
if pw:
|
1296
|
-
q_pw = "?pw=%s" % (pw,)
|
1297
|
-
a_pw = "&pw=%s" % (pw,)
|
1340
|
+
q_pw = "?pw=%s" % (html_escape(pw, True, True),)
|
1341
|
+
a_pw = "&pw=%s" % (html_escape(pw, True, True),)
|
1298
1342
|
for i in hits:
|
1299
1343
|
i["rp"] += a_pw if "?" in i["rp"] else q_pw
|
1300
1344
|
else:
|
@@ -1655,7 +1699,7 @@ class HttpCli(object):
|
|
1655
1699
|
|
1656
1700
|
token = str(uuid.uuid4())
|
1657
1701
|
|
1658
|
-
if
|
1702
|
+
if lk.find(r"./{DAV:}depth") is None:
|
1659
1703
|
depth = self.headers.get("depth", "infinity")
|
1660
1704
|
lk.append(mktnod("D:depth", depth))
|
1661
1705
|
|
@@ -3636,6 +3680,7 @@ class HttpCli(object):
|
|
3636
3680
|
return logues, readmes
|
3637
3681
|
|
3638
3682
|
def _expand(self, txt , phs ) :
|
3683
|
+
ptn_hsafe = RE_HSAFE
|
3639
3684
|
for ph in phs:
|
3640
3685
|
if ph.startswith("hdr."):
|
3641
3686
|
sv = str(self.headers.get(ph[4:], ""))
|
@@ -3653,7 +3698,7 @@ class HttpCli(object):
|
|
3653
3698
|
self.log("unknown placeholder in server config: [%s]" % (ph,), 3)
|
3654
3699
|
continue
|
3655
3700
|
|
3656
|
-
sv =
|
3701
|
+
sv = ptn_hsafe.sub("_", sv)
|
3657
3702
|
txt = txt.replace("{{%s}}" % (ph,), sv)
|
3658
3703
|
|
3659
3704
|
return txt
|
@@ -4965,11 +5010,11 @@ class HttpCli(object):
|
|
4965
5010
|
ret.sort(key=lambda x: x["at"], reverse=True) # type: ignore
|
4966
5011
|
ret = ret[:2000]
|
4967
5012
|
|
5013
|
+
ret.sort(key=lambda x: x["at"], reverse=True) # type: ignore
|
5014
|
+
|
4968
5015
|
if len(ret) > 2000:
|
4969
5016
|
ret = ret[:2000]
|
4970
5017
|
|
4971
|
-
ret.sort(key=lambda x: x["at"], reverse=True) # type: ignore
|
4972
|
-
|
4973
5018
|
for rv in ret:
|
4974
5019
|
rv["vp"] = quotep(rv["vp"])
|
4975
5020
|
nfk = rv.pop("nfk")
|
@@ -5057,10 +5102,6 @@ class HttpCli(object):
|
|
5057
5102
|
if not dots and "/." in vp:
|
5058
5103
|
continue
|
5059
5104
|
|
5060
|
-
n -= 1
|
5061
|
-
if not n:
|
5062
|
-
break
|
5063
|
-
|
5064
5105
|
rv = {
|
5065
5106
|
"vp": vp,
|
5066
5107
|
"sz": sz,
|
@@ -5078,13 +5119,17 @@ class HttpCli(object):
|
|
5078
5119
|
ret.sort(key=lambda x: x["at"], reverse=True) # type: ignore
|
5079
5120
|
ret = ret[:1000]
|
5080
5121
|
|
5081
|
-
|
5082
|
-
|
5122
|
+
n -= 1
|
5123
|
+
if not n:
|
5124
|
+
break
|
5083
5125
|
|
5084
5126
|
ret.sort(key=lambda x: x["at"], reverse=True) # type: ignore
|
5085
5127
|
|
5128
|
+
if len(ret) > 1000:
|
5129
|
+
ret = ret[:1000]
|
5130
|
+
|
5086
5131
|
for rv in ret:
|
5087
|
-
rv["
|
5132
|
+
rv["vp"] = quotep(rv["vp"])
|
5088
5133
|
nfk = rv.pop("nfk")
|
5089
5134
|
if not nfk:
|
5090
5135
|
continue
|
@@ -5117,15 +5162,16 @@ class HttpCli(object):
|
|
5117
5162
|
for v in ret:
|
5118
5163
|
v["vp"] = self.args.SR + v["vp"]
|
5119
5164
|
|
5120
|
-
|
5165
|
+
now = time.time()
|
5166
|
+
self.log("%s #%d %.2fsec" % (lm, len(ret), now - t0))
|
5121
5167
|
|
5168
|
+
ret2 = {"now": int(now), "filter": sfilt, "ups": ret}
|
5169
|
+
jtxt = json.dumps(ret2, separators=(",\n", ": "))
|
5122
5170
|
if "j" in self.ouparam:
|
5123
|
-
jtxt = json.dumps(ret, separators=(",\n", ": "))
|
5124
5171
|
self.reply(jtxt.encode("utf-8", "replace"), mime="application/json")
|
5125
5172
|
return True
|
5126
5173
|
|
5127
|
-
|
5128
|
-
html = self.j2s("rups", this=self, rows=rows, filt=sfilt, now=int(time.time()))
|
5174
|
+
html = self.j2s("rups", this=self, v=jtxt)
|
5129
5175
|
self.reply(html.encode("utf-8"), status=200)
|
5130
5176
|
return True
|
5131
5177
|
|
copyparty/httpsrv.py
CHANGED
@@ -191,10 +191,6 @@ class HttpSrv(object):
|
|
191
191
|
self.xff_nm = build_netmap(self.args.xff_src)
|
192
192
|
self.xff_lan = build_netmap("lan")
|
193
193
|
|
194
|
-
self.ptn_cc = re.compile(r"[\x00-\x1f]")
|
195
|
-
self.ptn_hsafe = re.compile(r"[\x00-\x1f<>\"'&]")
|
196
|
-
self.uparam_cc_ok = set("doc move tree".split())
|
197
|
-
|
198
194
|
self.mallow = "GET HEAD POST PUT DELETE OPTIONS".split()
|
199
195
|
if not self.args.no_dav:
|
200
196
|
zs = "PROPFIND PROPPATCH LOCK UNLOCK MKCOL COPY MOVE"
|
copyparty/tcpsrv.py
CHANGED
@@ -403,12 +403,12 @@ class TcpSrv(object):
|
|
403
403
|
rem = []
|
404
404
|
for k, v in netdevs.items():
|
405
405
|
if k not in self.netdevs:
|
406
|
-
add.append("\n added %s = %s" % (k, v))
|
406
|
+
add.append("\n\033[32m added %s = %s" % (k, v))
|
407
407
|
for k, v in self.netdevs.items():
|
408
408
|
if k not in netdevs:
|
409
|
-
rem.append("\
|
409
|
+
rem.append("\n\033[33mremoved %s = %s" % (k, v))
|
410
410
|
|
411
|
-
t = "network change detected
|
411
|
+
t = "network change detected:%s%s"
|
412
412
|
self.log("tcpsrv", t % ("".join(add), "".join(rem)), 3)
|
413
413
|
self.netdevs = netdevs
|
414
414
|
self._distribute_netdevs()
|
copyparty/up2k.py
CHANGED
@@ -851,9 +851,9 @@ class Up2k(object):
|
|
851
851
|
self.iacct = self.asrv.iacct
|
852
852
|
self.grps = self.asrv.grps
|
853
853
|
|
854
|
+
have_e2d = self.args.idp_h_usr
|
854
855
|
vols = list(all_vols.values())
|
855
856
|
t0 = time.time()
|
856
|
-
have_e2d = False
|
857
857
|
|
858
858
|
if self.no_expr_idx:
|
859
859
|
modified = False
|
copyparty/web/a/u2c.py
CHANGED
@@ -1101,7 +1101,7 @@ class Ctl(object):
|
|
1101
1101
|
nleft = self.nfiles - self.up_f
|
1102
1102
|
tail = "\033[K\033[u" if VT100 and not self.ar.ns else "\r"
|
1103
1103
|
|
1104
|
-
t = "%s eta @ %s/s, %s, %d# left
|
1104
|
+
t = "%s eta @ %s/s, %s, %d# left" % (self.eta, spd, sleft, nleft)
|
1105
1105
|
if not self.hash_b:
|
1106
1106
|
t = " now hashing..."
|
1107
1107
|
eprint(txt + "\033]0;{0}\033\\\r{0}{1}".format(t, tail))
|
copyparty/web/browser.html
CHANGED
copyparty/web/browser.js.gz
CHANGED
Binary file
|
copyparty/web/md.html
CHANGED
@@ -128,9 +128,9 @@ write markdown (most html is 🙆 too)
|
|
128
128
|
|
129
129
|
<script>
|
130
130
|
|
131
|
-
var SR = {{ r
|
131
|
+
var SR = "{{ r }}",
|
132
132
|
last_modified = {{ lastmod }},
|
133
|
-
have_emp = {{ have_emp
|
133
|
+
have_emp = {{ "true" if have_emp else "false" }},
|
134
134
|
dfavico = "{{ favico }}";
|
135
135
|
|
136
136
|
var md_opt = {
|
copyparty/web/mde.html
CHANGED
@@ -26,9 +26,9 @@
|
|
26
26
|
<a href="#" id="repl">π</a>
|
27
27
|
<script>
|
28
28
|
|
29
|
-
var SR = {{ r
|
29
|
+
var SR = "{{ r }}",
|
30
30
|
last_modified = {{ lastmod }},
|
31
|
-
have_emp = {{ have_emp
|
31
|
+
have_emp = {{ "true" if have_emp else "false" }},
|
32
32
|
dfavico = "{{ favico }}";
|
33
33
|
|
34
34
|
var md_opt = {
|
copyparty/web/rups.css.gz
CHANGED
Binary file
|
copyparty/web/rups.html
CHANGED
@@ -6,6 +6,7 @@
|
|
6
6
|
<title>{{ s_doctitle }}</title>
|
7
7
|
<meta http-equiv="X-UA-Compatible" content="IE=edge">
|
8
8
|
<meta name="viewport" content="width=device-width, initial-scale=0.8">
|
9
|
+
<meta name="robots" content="noindex, nofollow">
|
9
10
|
<meta name="theme-color" content="#{{ tcolor }}">
|
10
11
|
<link rel="stylesheet" media="screen" href="{{ r }}/.cpr/rups.css?_={{ ts }}">
|
11
12
|
<link rel="stylesheet" media="screen" href="{{ r }}/.cpr/ui.css?_={{ ts }}">
|
@@ -14,14 +15,10 @@
|
|
14
15
|
|
15
16
|
<body>
|
16
17
|
<div id="wrap">
|
17
|
-
<a
|
18
|
-
<a
|
19
|
-
<
|
20
|
-
|
21
|
-
Filter: <input type="text" name="filter" size="20" placeholder="documents/passwords" value="{{ filt }}" />
|
22
|
-
<input type="submit" />
|
23
|
-
</form>
|
24
|
-
<span id="hits"></span>
|
18
|
+
<a href="#" id="re">refresh</a>
|
19
|
+
<a href="{{ r }}/?h">control-panel</a>
|
20
|
+
Filter: <input type="text" id="filter" size="20" placeholder="documents/passwords" />
|
21
|
+
<span id="hits"></span>
|
25
22
|
<table id="tab"><thead><tr>
|
26
23
|
<th>size</th>
|
27
24
|
<th>who</th>
|
@@ -29,27 +26,12 @@
|
|
29
26
|
<th>age</th>
|
30
27
|
<th>dir</th>
|
31
28
|
<th>file</th>
|
32
|
-
</tr></thead><tbody>
|
33
|
-
{% for vp, evp, sz, ip, at in rows %}
|
34
|
-
<tr>
|
35
|
-
<td>{{ sz }}</td>
|
36
|
-
<td>{{ ip }}</td>
|
37
|
-
<td>{{ at }}</td>
|
38
|
-
<td>{{ (now-at) }}</td>
|
39
|
-
<td></td>
|
40
|
-
<td><a href="{{ r }}{{ evp }}">{{ vp|e }}</a></td>
|
41
|
-
</tr>
|
42
|
-
{% endfor %}
|
43
|
-
</tbody></table>
|
44
|
-
{% if not rows %}
|
45
|
-
(the database is not aware of any uploads)
|
46
|
-
{% endif %}
|
29
|
+
</tr></thead><tbody id="tb"></tbody></table>
|
47
30
|
</div>
|
48
31
|
<a href="#" id="repl">π</a>
|
49
32
|
<script>
|
50
33
|
|
51
|
-
var SR
|
52
|
-
NOW = {{ now }},
|
34
|
+
var SR="{{ r }}",
|
53
35
|
lang="{{ lang }}",
|
54
36
|
dfavico="{{ favico }}";
|
55
37
|
|
@@ -58,6 +40,7 @@ document.documentElement.className = (STG && STG.cpp_thm) || "{{ this.args.theme
|
|
58
40
|
|
59
41
|
</script>
|
60
42
|
<script src="{{ r }}/.cpr/util.js?_={{ ts }}"></script>
|
43
|
+
<script>var V={{ v }};</script>
|
61
44
|
<script src="{{ r }}/.cpr/rups.js?_={{ ts }}"></script>
|
62
45
|
{%- if js %}
|
63
46
|
<script src="{{ js }}_={{ ts }}"></script>
|
copyparty/web/rups.js.gz
CHANGED
Binary file
|
copyparty/web/shares.html
CHANGED
@@ -6,6 +6,7 @@
|
|
6
6
|
<title>{{ s_doctitle }}</title>
|
7
7
|
<meta http-equiv="X-UA-Compatible" content="IE=edge">
|
8
8
|
<meta name="viewport" content="width=device-width, initial-scale=0.8">
|
9
|
+
<meta name="robots" content="noindex, nofollow">
|
9
10
|
<meta name="theme-color" content="#{{ tcolor }}">
|
10
11
|
<link rel="stylesheet" media="screen" href="{{ r }}/.cpr/shares.css?_={{ ts }}">
|
11
12
|
<link rel="stylesheet" media="screen" href="{{ r }}/.cpr/ui.css?_={{ ts }}">
|
@@ -14,8 +15,8 @@
|
|
14
15
|
|
15
16
|
<body>
|
16
17
|
<div id="wrap">
|
17
|
-
<a
|
18
|
-
<a
|
18
|
+
<a href="{{ r }}/?shares">refresh</a>
|
19
|
+
<a href="{{ r }}/?h">control-panel</a>
|
19
20
|
|
20
21
|
<span>axs = perms (read,write,move,delet)</span>
|
21
22
|
<span>nf = numFiles (0=dir)</span>
|
@@ -62,7 +63,7 @@
|
|
62
63
|
<a href="#" id="repl">π</a>
|
63
64
|
<script>
|
64
65
|
|
65
|
-
var SR
|
66
|
+
var SR="{{ r }}",
|
66
67
|
shr="{{ shr }}",
|
67
68
|
lang="{{ lang }}",
|
68
69
|
dfavico="{{ favico }}";
|
copyparty/web/splash.html
CHANGED
copyparty/web/svcs.html
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
Metadata-Version: 2.1
|
2
2
|
Name: copyparty
|
3
|
-
Version: 1.16.
|
3
|
+
Version: 1.16.7
|
4
4
|
Summary: Portable file server with accelerated resumable uploads, deduplication, WebDAV, FTP, zeroconf, media indexer, video thumbnails, audio transcoding, and write-only folders
|
5
5
|
Author-email: ed <copyparty@ocv.me>
|
6
6
|
License: MIT
|
@@ -1,7 +1,7 @@
|
|
1
1
|
copyparty/__init__.py,sha256=VR6ZZhB9IxaK5TDXDTBM_OIP5ydkrdbaEnstktLM__s,2649
|
2
2
|
copyparty/__main__.py,sha256=acjihZUEvEwFp6d6BnT35oFqminMZBruDUfVU76YijA,113564
|
3
|
-
copyparty/__version__.py,sha256=
|
4
|
-
copyparty/authsrv.py,sha256=
|
3
|
+
copyparty/__version__.py,sha256=1Wa9fHXGyIQdk3lnare95TArCCnFp0OA4JizO5IAN20,252
|
4
|
+
copyparty/authsrv.py,sha256=h1OhdMR_hrqZA9NH2pMRZ-Axc_GSoUajioCZhimVVsQ,104109
|
5
5
|
copyparty/broker_mp.py,sha256=QdOXXvV2Xn6J0CysEqyY3GZbqxQMyWnTpnba-a5lMc0,4987
|
6
6
|
copyparty/broker_mpw.py,sha256=PpSS4SK3pItlpfD8OwVr3QmJEPKlUgaf2nuMOozixgU,3347
|
7
7
|
copyparty/broker_thr.py,sha256=fjoYtpSscUA7-nMl4r1n2R7UK3J9lrvLS3rUZ-iJzKQ,1721
|
@@ -11,9 +11,9 @@ copyparty/cfg.py,sha256=UUmFpFbTm750Nv9RnofS80-FTpWT37EggEtmkE1wbxE,10374
|
|
11
11
|
copyparty/dxml.py,sha256=lZpg-kn-kQsXRtNY1n6fRaS-b7uXzMCyv8ovKnhZcZc,1548
|
12
12
|
copyparty/fsutil.py,sha256=IVOFG8zBQPMQDDv7RIStSJHwHiAnVNROZS37O5k465A,4524
|
13
13
|
copyparty/ftpd.py,sha256=T97SFS7JFtvRLbJX8C4fJSYwe13vhN3-E6emtlVmqLA,17608
|
14
|
-
copyparty/httpcli.py,sha256=
|
14
|
+
copyparty/httpcli.py,sha256=cgeVci6xAUUp79z982xTL27v9XcWEzC5ymbmtj3v66M,214475
|
15
15
|
copyparty/httpconn.py,sha256=mQSgljh0Q-jyWjF4tQLrHbRKRe9WKl19kGqsGMsJpWo,6880
|
16
|
-
copyparty/httpsrv.py,sha256=
|
16
|
+
copyparty/httpsrv.py,sha256=pxH_Eh8ElBLvOEDejgpP9Bvk65HNEou-03aYIcgXhrs,18090
|
17
17
|
copyparty/ico.py,sha256=eWSxEae4wOCfheHl-m-wchYvFRAR_97kJDb4NGaB-Z8,3561
|
18
18
|
copyparty/mdns.py,sha256=G73OWWg1copda47LgayCRK7qjVrk6cnUGpMR5ugmi7o,18315
|
19
19
|
copyparty/metrics.py,sha256=EOIiPOItEQmdK9YgNb75l0kCzanWb6RtJGwMI7ufifY,8966
|
@@ -26,12 +26,12 @@ copyparty/star.py,sha256=tV5BbX6AiQ7N4UU8DYtSTckNYeoeey4DBqq4LjfymbY,3818
|
|
26
26
|
copyparty/sutil.py,sha256=6zEEGl4hRe6bTB83Y_RtnBGxr2JcUa__GdiAMqNJZnY,3208
|
27
27
|
copyparty/svchub.py,sha256=sAHkiPGzzKACLqKlem2V-bps9Xh-wHlcfwaNywxcd5A,40877
|
28
28
|
copyparty/szip.py,sha256=HFtnwOiBgx0HMLUf-h_T84zSlRijPxmhRo5PM613kRA,8602
|
29
|
-
copyparty/tcpsrv.py,sha256=
|
29
|
+
copyparty/tcpsrv.py,sha256=2q18dGR8jnezA4SMfUXa-wrGRGX3nHIwkxkWvkTzF2A,19889
|
30
30
|
copyparty/tftpd.py,sha256=PXgG4rTmiaU_TavSyZWD5cFphdfChs9YvNY21qfExt8,13611
|
31
31
|
copyparty/th_cli.py,sha256=1B8el4NNs5cNyJyjOPiAdvLOX2HQXaebsHn6VLdZ_gU,4630
|
32
32
|
copyparty/th_srv.py,sha256=uAcz-wZJQEG5KavcZDkwToONZujyoOeC4oCxxKTD5us,29575
|
33
33
|
copyparty/u2idx.py,sha256=G6MDbD4I_sJSOwaNFZ6XLTQhnEDrB12pVKuKhzQ_leE,13676
|
34
|
-
copyparty/up2k.py,sha256=
|
34
|
+
copyparty/up2k.py,sha256=Uo_-zmJ9Bv8An0ph4w6Nh1883LWAsbH_H9mrX35OrpU,174570
|
35
35
|
copyparty/util.py,sha256=qhNakLtygJveVbZUuPvDY7Tm1E48E67CS9XBmosu5i4,95101
|
36
36
|
copyparty/bos/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
37
37
|
copyparty/bos/bos.py,sha256=Wb7eWsXJgR5AFlBR9ZOyKrLTwy-Kct9RrGiOu4Jo37Y,1622
|
@@ -56,31 +56,31 @@ copyparty/stolen/ifaddr/_shared.py,sha256=uNC4SdEIgdSLKvuUzsf1aM-H1Xrc_9mpLoOT43
|
|
56
56
|
copyparty/stolen/ifaddr/_win32.py,sha256=EE-QyoBgeB7lYQ6z62VjXNaRozaYfCkaJBHGNA8QtZM,4026
|
57
57
|
copyparty/web/baguettebox.js.gz,sha256=_amC3ipOrXKEFz8DsVP-JEl49VjMQYiKyF78eWfG-uk,7965
|
58
58
|
copyparty/web/browser.css.gz,sha256=kurx_iA-KxLYx8PqJsn0bJVjkAxP-0YTOHSV9l_oouo,11645
|
59
|
-
copyparty/web/browser.html,sha256=
|
60
|
-
copyparty/web/browser.js.gz,sha256=
|
59
|
+
copyparty/web/browser.html,sha256=dekrZQ6w8ciB-QPlp-mjcuzUVKlsCYcvvi6efmXRfQE,4822
|
60
|
+
copyparty/web/browser.js.gz,sha256=HejO4Brwmw-NmLVmqbK1I31LPP9arf7G9JaHOUpNcfY,89876
|
61
61
|
copyparty/web/browser2.html,sha256=NRUZ08GH-e2YcGXcoz0UjYg6JIVF42u4IMX4HHwWTmg,1587
|
62
62
|
copyparty/web/cf.html,sha256=lJThtNFNAQT1ClCHHlivAkDGE0LutedwopXD62Z8Nys,589
|
63
63
|
copyparty/web/dbg-audio.js.gz,sha256=Ma-KZtK8LnmiwNvNKFKXMPYl_Nn_3U7GsJ6-DRWC2HE,688
|
64
64
|
copyparty/web/md.css.gz,sha256=UZpN0J7ubVM05CZkbZYkQRJeGgJt_GNDEzKTGSQd8h4,2032
|
65
|
-
copyparty/web/md.html,sha256=
|
65
|
+
copyparty/web/md.html,sha256=hz-xJVfKtaeTUQn3tGh7ebIMvLbOjVKkrMhsCTr3lGM,4200
|
66
66
|
copyparty/web/md.js.gz,sha256=tw9vS9yZzyVW4FNOTv0MMHBdBEedfahZRZ8WhVJDu4A,4180
|
67
67
|
copyparty/web/md2.css.gz,sha256=uIVHKScThdbcfhXNSHgKZnALYpxbnXC-WuEzOJ20Lpc,699
|
68
68
|
copyparty/web/md2.js.gz,sha256=w0Ve06BUcyZfcWR8DAPpCj-kI-uL_wTL2aX_0PsNc-I,8363
|
69
69
|
copyparty/web/mde.css.gz,sha256=2SkAEDKIRPqywNJ8t_heQaeBQ_R73Rf-pQI_bDoKF6o,942
|
70
|
-
copyparty/web/mde.html,sha256=
|
70
|
+
copyparty/web/mde.html,sha256=fRGUlnNhK6ra8P4jskQLUw6Aaef6g6Heh4EEgYhJkxU,1770
|
71
71
|
copyparty/web/mde.js.gz,sha256=kN2eUSvr4mFuksfK4-4LimJmWdwsao39Sea2lWtu8L0,2224
|
72
72
|
copyparty/web/msg.css.gz,sha256=u90fXYAVrMD-jqwf5XFVC1ptSpSHZUe8Mez6PX101P8,300
|
73
73
|
copyparty/web/msg.html,sha256=w9CM3hkLLGJX9fWEaG4gSbTOPe2GcPqW8BpSCDiFzOI,977
|
74
|
-
copyparty/web/rups.css.gz,sha256=
|
75
|
-
copyparty/web/rups.html,sha256=
|
76
|
-
copyparty/web/rups.js.gz,sha256=
|
74
|
+
copyparty/web/rups.css.gz,sha256=pWklsym27oGGr-8tYQR7WnZvGZElAgCwLzlwTDErNAM,647
|
75
|
+
copyparty/web/rups.html,sha256=iPuz53jBT_mIWIfl1yrjjg5-P7oO2ada6fTFq8PgjGk,1479
|
76
|
+
copyparty/web/rups.js.gz,sha256=nvvcG8L-fkm7zkhjnlTGhBp_KD0j08mtHEW0sB7zy-Y,854
|
77
77
|
copyparty/web/shares.css.gz,sha256=SdPlZCBwz9tkPkgEo5pSPDOZSI079njxEfkJ64-iW3c,547
|
78
|
-
copyparty/web/shares.html,sha256=
|
78
|
+
copyparty/web/shares.html,sha256=YctvUrKuBYu42kxVylyW2_DEHm7Ik6uHqzfzVZ4N0ac,2545
|
79
79
|
copyparty/web/shares.js.gz,sha256=emeY2-wjkh8x1JgaW6ny5fcC7XpZzZzfE1f-sEyntQ4,940
|
80
80
|
copyparty/web/splash.css.gz,sha256=VxFqPvNdZtWb0u1C_GW2yYwrHq0lqPMitft9GYcv56k,1087
|
81
|
-
copyparty/web/splash.html,sha256=
|
81
|
+
copyparty/web/splash.html,sha256=QEnTH9QZXFmAuyVtgqOuuHKBtIdi7uclpRqe0ZMewj4,6249
|
82
82
|
copyparty/web/splash.js.gz,sha256=4VqNznN10-bT33IJm3VWzBEJ1s08XZyxFB1TYPUkuAo,2739
|
83
|
-
copyparty/web/svcs.html,sha256=
|
83
|
+
copyparty/web/svcs.html,sha256=S-YiS7DF5ndsy4MZXStdpIkCqSjKA9V5kIViCUQhMvw,11557
|
84
84
|
copyparty/web/svcs.js.gz,sha256=k81ZvZ3I-f4fMHKrNGGOgOlvXnCBz0mVjD-8mieoWCA,520
|
85
85
|
copyparty/web/ui.css.gz,sha256=v8U-1tetZzuzTpITjq8NWj1gg3jEiYDIIE8aE0dx63k,2800
|
86
86
|
copyparty/web/up2k.js.gz,sha256=CC1MM_FBfxpsjgtNWupzCdnlVNI3hBbWbNSCnOSpCTY,23460
|
@@ -88,7 +88,7 @@ copyparty/web/util.js.gz,sha256=aXgf3U-0TL9Sc7uMQhA_sMyTXLsZCH3YDe8qLJ4hpEM,1508
|
|
88
88
|
copyparty/web/w.hash.js.gz,sha256=l3GpSJD6mcU-1CRWkIj7PybgbjlfSr8oeO3vortIrQk,1105
|
89
89
|
copyparty/web/a/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
90
90
|
copyparty/web/a/partyfuse.py,sha256=9p5Hpg_IBiSimv7j9kmPhCGpy-FLXSRUOYnLjJ5JifU,28049
|
91
|
-
copyparty/web/a/u2c.py,sha256=
|
91
|
+
copyparty/web/a/u2c.py,sha256=OuA0UMtPDSrMHgd4ebANJXoLeIa1RKxzbBXUV3H8jIw,51606
|
92
92
|
copyparty/web/a/webdav-cfg.bat,sha256=Y4NoGZlksAIg4cBMb7KdJrpKC6Nx97onaTl6yMjaimk,1449
|
93
93
|
copyparty/web/dd/2.png,sha256=gJ14XFPzaw95L6z92fSq9eMPikSQyu-03P1lgiGe0_I,258
|
94
94
|
copyparty/web/dd/3.png,sha256=4lho8Koz5tV7jJ4ODo6GMTScZfkqsT05yp48EDFIlyg,252
|
@@ -109,9 +109,9 @@ copyparty/web/deps/prismd.css.gz,sha256=ObUlksQVr-OuYlTz-I4B23TeBg2QDVVGRnWBz8cV
|
|
109
109
|
copyparty/web/deps/scp.woff2,sha256=w99BDU5i8MukkMEL-iW0YO9H4vFFZSPWxbkH70ytaAg,8612
|
110
110
|
copyparty/web/deps/sha512.ac.js.gz,sha256=lFZaCLumgWxrvEuDr4bqdKHsqjX82AbVAb7_F45Yk88,7033
|
111
111
|
copyparty/web/deps/sha512.hw.js.gz,sha256=UAed2_ocklZCnIzcSYz2h4P1ycztlCLj-ewsRTud2lU,7939
|
112
|
-
copyparty-1.16.
|
113
|
-
copyparty-1.16.
|
114
|
-
copyparty-1.16.
|
115
|
-
copyparty-1.16.
|
116
|
-
copyparty-1.16.
|
117
|
-
copyparty-1.16.
|
112
|
+
copyparty-1.16.7.dist-info/LICENSE,sha256=gOr4h33pCsBEg9uIy9AYmb7qlocL4V9t2uPJS5wllr0,1072
|
113
|
+
copyparty-1.16.7.dist-info/METADATA,sha256=olG_plZH52nO0-2ebV8squbAOF_3h66Y8_8Bs_by6Zk,141509
|
114
|
+
copyparty-1.16.7.dist-info/WHEEL,sha256=PZUExdf71Ui_so67QXpySuHtCi3-J3wvF4ORK6k_S8U,91
|
115
|
+
copyparty-1.16.7.dist-info/entry_points.txt,sha256=4zw6a3rqASywQomiYLObjjlxybaI65LYYOTJwgKz7b0,128
|
116
|
+
copyparty-1.16.7.dist-info/top_level.txt,sha256=LnYUPsDyk-8kFgM6YJLG4h820DQekn81cObKSu9g-sI,10
|
117
|
+
copyparty-1.16.7.dist-info/RECORD,,
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|