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 CHANGED
@@ -1,8 +1,8 @@
1
1
  # coding: utf-8
2
2
 
3
- VERSION = (1, 16, 6)
3
+ VERSION = (1, 16, 7)
4
4
  CODENAME = "COPYparty"
5
- BUILD_DT = (2024, 12, 19)
5
+ BUILD_DT = (2024, 12, 23)
6
6
 
7
7
  S_VERSION = ".".join(map(str, VERSION))
8
8
  S_BUILD_DT = "{0:04d}-{1:02d}-{2:02d}".format(*BUILD_DT)
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
- ptn = self.conn.hsrv.ptn_cc
445
- k_safe = self.conn.hsrv.uparam_cc_ok
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 = ptn.search(zs)
497
+ m = ptn_cc.search(zs)
463
498
  if not m:
464
499
  continue
465
500
 
466
- hit = zs[m.span()[0] :]
467
- t = "malicious user; Cc in query [{}] => [{!r}]"
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("invalid relpath %r" % ("/" + self.vpath,))
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 = self.conn.hsrv.ptn_cc.search(zs)
915
+ m = ptn_cc.search(zs)
871
916
  if m:
872
- hit = zs[m.span()[0] :]
873
- t = "malicious user; Cc in out-hdr {!r} => [{!r}]"
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 "?" + "&amp;".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 not lk.find(r"./{DAV:}depth"):
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 = self.conn.hsrv.ptn_hsafe.sub("_", 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
- if len(ret) > 1000:
5082
- ret = ret[:1000]
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["evp"] = quotep(rv["vp"])
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
- self.log("%s #%d %.2fsec" % (lm, len(ret), time.time() - t0))
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
- rows = [[x["vp"], x["evp"], x["sz"], x["ip"], x["at"]] for x in ret]
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("\nremoved %s = %s" % (k, v))
409
+ rem.append("\n\033[33mremoved %s = %s" % (k, v))
410
410
 
411
- t = "network change detected:\033[32m%s\033[33m%s"
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\033[K" % (self.eta, spd, sleft, nleft)
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))
@@ -131,7 +131,7 @@
131
131
  <div id="widget"></div>
132
132
 
133
133
  <script>
134
- var SR = {{ r|tojson }},
134
+ var SR = "{{ r }}",
135
135
  CGV1 = {{ cgv1 }},
136
136
  CGV = {{ cgv|tojson }},
137
137
  TS = "{{ ts }}",
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|tojson }},
131
+ var SR = "{{ r }}",
132
132
  last_modified = {{ lastmod }},
133
- have_emp = {{ have_emp|tojson }},
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|tojson }},
29
+ var SR = "{{ r }}",
30
30
  last_modified = {{ lastmod }},
31
- have_emp = {{ have_emp|tojson }},
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 id="a" href="{{ r }}/?ru" class="af">refresh</a>
18
- <a id="a" href="{{ r }}/?h" class="af">control-panel</a>
19
- <form method="get" enctype="application/x-www-form-urlencoded" accept-charset="utf-8" action="{{ r }}">
20
- <input type="hidden" name="ru" value="a" />
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
+ &nbsp; Filter: <input type="text" id="filter" size="20" placeholder="documents/passwords" />
21
+ &nbsp; <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 = {{ r|tojson }},
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 id="a" href="{{ r }}/?shares" class="af">refresh</a>
18
- <a id="a" href="{{ r }}/?h" class="af">control-panel</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 = {{ r|tojson }},
66
+ var SR="{{ r }}",
66
67
  shr="{{ shr }}",
67
68
  lang="{{ lang }}",
68
69
  dfavico="{{ favico }}";
copyparty/web/splash.html CHANGED
@@ -168,7 +168,7 @@
168
168
  {%- endif %}
169
169
  <script>
170
170
 
171
- var SR = {{ r|tojson }},
171
+ var SR="{{ r }}",
172
172
  lang="{{ lang }}",
173
173
  dfavico="{{ favico }}";
174
174
 
copyparty/web/svcs.html CHANGED
@@ -233,7 +233,7 @@
233
233
  <a href="#" id="repl">π</a>
234
234
  <script>
235
235
 
236
- var SR = {{ r|tojson }},
236
+ var SR="{{ r }}",
237
237
  lang="{{ lang }}",
238
238
  dfavico="{{ favico }}";
239
239
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: copyparty
3
- Version: 1.16.6
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=JJ3NgXxnmonfdKeivWXs-b4z3FsuOlq62WbiCAifwR4,252
4
- copyparty/authsrv.py,sha256=n8lQACRCzKnYlgzNv1RkGehv5qI4soYnyZhNw4IPHxA,104062
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=DAi4JrEKCGTMBMjobQZ5d9WpisetKwuXLjZr2z1idpE,212463
14
+ copyparty/httpcli.py,sha256=cgeVci6xAUUp79z982xTL27v9XcWEzC5ymbmtj3v66M,214475
15
15
  copyparty/httpconn.py,sha256=mQSgljh0Q-jyWjF4tQLrHbRKRe9WKl19kGqsGMsJpWo,6880
16
- copyparty/httpsrv.py,sha256=a_WKCKlN5isIoy8bNdttlQFha_8X_E_cPoToZv2q5Cw,18255
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=H7z9tzYRCm-kZwktnm_wP-v2MXaIOygx9yfdk1xkqRo,19889
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=u7yLOD9ypqTEmA3bMPXqXrvebo7Lq62NjUdSZ_oGw0E,174556
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=KCkZ_LwzQnj9xhXKYptAxp6W3nVGiDoSJ4ioZDo7rQ0,4827
60
- copyparty/web/browser.js.gz,sha256=7YbcHLByMAc71j3nKKUrCEExAzfenYnHPBSrnJ8iJFA,89833
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=isNbIzWbp_oqkhQSXm0uf3st3h4uB3LLTXFcHHcvgPQ,4189
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=ImBhQAaEUCke2M85QU_fl4X2XQExRLcEzgCEN8RNe9o,1759
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=slfIxkdQ4vmYfMw0hlqX9bl-L8MpGsNF8HOIJvYcGWM,674
75
- copyparty/web/rups.html,sha256=XEdGH-h-McwCXAx7POF0atyyLDUdDeBL0OnM3vBnyzU,2006
76
- copyparty/web/rups.js.gz,sha256=wVEV-jrXLj0jrrmxtZqTQVpvF9KpDnkvujw6Tx8Bk3o,469
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=IhZnADkNoD_2-zEJnoiMG68iOXB58Ros1UNFVXjEwWE,2535
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=2iTamber6qv84SvbQzibL-onvRUJwyfthUaFgeYdBRA,6256
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=5cAp6RAkvqfDAbO9kxuDgXcmuDH20ZN2fse0uzCXb5s,11564
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=1XcH5XfC2UuGrpTnLVHCe4KFU0Vl6uC02CZz04rvKOc,51612
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.6.dist-info/LICENSE,sha256=gOr4h33pCsBEg9uIy9AYmb7qlocL4V9t2uPJS5wllr0,1072
113
- copyparty-1.16.6.dist-info/METADATA,sha256=YD_Fomt3BWkdN4PksbjdhOTgjdqO1nDew-_XdTYjiKU,141509
114
- copyparty-1.16.6.dist-info/WHEEL,sha256=PZUExdf71Ui_so67QXpySuHtCi3-J3wvF4ORK6k_S8U,91
115
- copyparty-1.16.6.dist-info/entry_points.txt,sha256=4zw6a3rqASywQomiYLObjjlxybaI65LYYOTJwgKz7b0,128
116
- copyparty-1.16.6.dist-info/top_level.txt,sha256=LnYUPsDyk-8kFgM6YJLG4h820DQekn81cObKSu9g-sI,10
117
- copyparty-1.16.6.dist-info/RECORD,,
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,,