copyparty 1.16.3__py3-none-any.whl → 1.16.5__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/__main__.py CHANGED
@@ -1075,7 +1075,7 @@ def add_cert(ap, cert_path):
1075
1075
  def add_auth(ap):
1076
1076
  ses_db = os.path.join(E.cfg, "sessions.db")
1077
1077
  ap2 = ap.add_argument_group('IdP / identity provider / user authentication options')
1078
- ap2.add_argument("--idp-h-usr", metavar="HN", type=u, default="", help="bypass the copyparty authentication checks and assume the request-header \033[33mHN\033[0m contains the username of the requesting user (for use with authentik/oauth/...)\n\033[1;31mWARNING:\033[0m if you enable this, make sure clients are unable to specify this header themselves; must be washed away and replaced by a reverse-proxy")
1078
+ ap2.add_argument("--idp-h-usr", metavar="HN", type=u, default="", help="bypass the copyparty authentication checks if the request-header \033[33mHN\033[0m contains a username to associate the request with (for use with authentik/oauth/...)\n\033[1;31mWARNING:\033[0m if you enable this, make sure clients are unable to specify this header themselves; must be washed away and replaced by a reverse-proxy")
1079
1079
  ap2.add_argument("--idp-h-grp", metavar="HN", type=u, default="", help="assume the request-header \033[33mHN\033[0m contains the groupname of the requesting user; can be referenced in config files for group-based access control")
1080
1080
  ap2.add_argument("--idp-h-key", metavar="HN", type=u, default="", help="optional but recommended safeguard; your reverse-proxy will insert a secret header named \033[33mHN\033[0m into all requests, and the other IdP headers will be ignored if this header is not present")
1081
1081
  ap2.add_argument("--idp-gsep", metavar="RE", type=u, default="|:;+,", help="if there are multiple groups in \033[33m--idp-h-grp\033[0m, they are separated by one of the characters in \033[33mRE\033[0m")
@@ -1729,7 +1729,7 @@ def main(argv = None) :
1729
1729
  except:
1730
1730
  lprint("\nfailed to disable quick-edit-mode:\n" + min_ex() + "\n")
1731
1731
 
1732
- if al.ansi:
1732
+ if not al.ansi:
1733
1733
  al.wintitle = ""
1734
1734
 
1735
1735
  # propagate implications
copyparty/__version__.py CHANGED
@@ -1,8 +1,8 @@
1
1
  # coding: utf-8
2
2
 
3
- VERSION = (1, 16, 3)
3
+ VERSION = (1, 16, 5)
4
4
  CODENAME = "COPYparty"
5
- BUILD_DT = (2024, 12, 4)
5
+ BUILD_DT = (2024, 12, 11)
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/httpcli.py CHANGED
@@ -537,8 +537,14 @@ class HttpCli(object):
537
537
  except:
538
538
  pass
539
539
 
540
+ self.pw = uparam.get("pw") or self.headers.get("pw") or bauth or cookie_pw
541
+ self.uname = (
542
+ self.asrv.sesa.get(self.pw)
543
+ or self.asrv.iacct.get(self.asrv.ah.hash(self.pw))
544
+ or "*"
545
+ )
546
+
540
547
  if self.args.idp_h_usr:
541
- self.pw = ""
542
548
  idp_usr = self.headers.get(self.args.idp_h_usr) or ""
543
549
  if idp_usr:
544
550
  idp_grp = (
@@ -583,20 +589,11 @@ class HttpCli(object):
583
589
  idp_grp = ""
584
590
 
585
591
  if idp_usr in self.asrv.vfs.aread:
592
+ self.pw = ""
586
593
  self.uname = idp_usr
587
594
  self.html_head += "<script>var is_idp=1</script>\n"
588
595
  else:
589
596
  self.log("unknown username: [%s]" % (idp_usr), 1)
590
- self.uname = "*"
591
- else:
592
- self.uname = "*"
593
- else:
594
- self.pw = uparam.get("pw") or self.headers.get("pw") or bauth or cookie_pw
595
- self.uname = (
596
- self.asrv.sesa.get(self.pw)
597
- or self.asrv.iacct.get(self.asrv.ah.hash(self.pw))
598
- or "*"
599
- )
600
597
 
601
598
  if self.args.ipu and self.uname == "*":
602
599
  self.uname = self.conn.ipu_iu[self.conn.ipu_nm.map(self.ip)]
copyparty/tcpsrv.py CHANGED
@@ -399,17 +399,17 @@ class TcpSrv(object):
399
399
  if not netdevs:
400
400
  continue
401
401
 
402
- added = "nothing"
403
- removed = "nothing"
402
+ add = []
403
+ rem = []
404
404
  for k, v in netdevs.items():
405
405
  if k not in self.netdevs:
406
- added = "{} = {}".format(k, v)
406
+ add.append("\n added %s = %s" % (k, v))
407
407
  for k, v in self.netdevs.items():
408
408
  if k not in netdevs:
409
- removed = "{} = {}".format(k, v)
409
+ rem.append("\nremoved %s = %s" % (k, v))
410
410
 
411
- t = "network change detected:\n added {}\033[0;33m\nremoved {}"
412
- self.log("tcpsrv", t.format(added, removed), 3)
411
+ t = "network change detected:\033[32m%s\033[33m%s"
412
+ self.log("tcpsrv", t % ("".join(add), "".join(rem)), 3)
413
413
  self.netdevs = netdevs
414
414
  self._distribute_netdevs()
415
415
 
copyparty/up2k.py CHANGED
@@ -3077,7 +3077,8 @@ class Up2k(object):
3077
3077
  if cur:
3078
3078
  dupe = (cj["prel"], cj["name"], cj["lmod"])
3079
3079
  try:
3080
- self.dupesched[src].append(dupe)
3080
+ if dupe not in self.dupesched[src]:
3081
+ self.dupesched[src].append(dupe)
3081
3082
  except:
3082
3083
  self.dupesched[src] = [dupe]
3083
3084
 
@@ -4652,6 +4653,13 @@ class Up2k(object):
4652
4653
  t = "forgetting partial upload {} ({})"
4653
4654
  p = self._vis_job_progress(job)
4654
4655
  self.log(t.format(wark, p))
4656
+
4657
+ src = djoin(ptop, vrem)
4658
+ zi = len(self.dupesched.pop(src, []))
4659
+ if zi:
4660
+ t = "...and forgetting %d links in dupesched"
4661
+ self.log(t % (zi,))
4662
+
4655
4663
  assert wark
4656
4664
  del reg[wark]
4657
4665
 
copyparty/web/a/u2c.py CHANGED
@@ -1,8 +1,8 @@
1
1
  #!/usr/bin/env python3
2
2
  from __future__ import print_function, unicode_literals
3
3
 
4
- S_VERSION = "2.6"
5
- S_BUILD_DT = "2024-11-10"
4
+ S_VERSION = "2.7"
5
+ S_BUILD_DT = "2024-12-06"
6
6
 
7
7
  """
8
8
  u2c.py: upload to copyparty
@@ -1031,8 +1031,8 @@ class Ctl(object):
1031
1031
  handshake(self.ar, file, False)
1032
1032
 
1033
1033
  def _fancy(self):
1034
+ atexit.register(self.cleanup_vt100)
1034
1035
  if VT100 and not self.ar.ns:
1035
- atexit.register(self.cleanup_vt100)
1036
1036
  ss.scroll_region(3)
1037
1037
 
1038
1038
  Daemon(self.hasher)
@@ -1040,6 +1040,7 @@ class Ctl(object):
1040
1040
  Daemon(self.handshaker)
1041
1041
  Daemon(self.uploader)
1042
1042
 
1043
+ last_sp = -1
1043
1044
  while True:
1044
1045
  with self.exit_cond:
1045
1046
  self.exit_cond.wait(0.07)
@@ -1078,6 +1079,12 @@ class Ctl(object):
1078
1079
  else:
1079
1080
  txt = " "
1080
1081
 
1082
+ if not VT100: # OSC9;4 (taskbar-progress)
1083
+ sp = int(self.up_b * 100 / self.nbytes) or 1
1084
+ if last_sp != sp:
1085
+ last_sp = sp
1086
+ txt += "\033]9;4;1;%d\033\\" % (sp,)
1087
+
1081
1088
  if not self.up_br:
1082
1089
  spd = self.hash_b / ((time.time() - self.t0) or 1)
1083
1090
  eta = (self.nbytes - self.hash_b) / (spd or 1)
@@ -1095,6 +1102,8 @@ class Ctl(object):
1095
1102
  tail = "\033[K\033[u" if VT100 and not self.ar.ns else "\r"
1096
1103
 
1097
1104
  t = "%s eta @ %s/s, %s, %d# left\033[K" % (self.eta, spd, sleft, nleft)
1105
+ if not self.hash_b:
1106
+ t = " now hashing..."
1098
1107
  eprint(txt + "\033]0;{0}\033\\\r{0}{1}".format(t, tail))
1099
1108
 
1100
1109
  if self.ar.wlist:
@@ -1115,7 +1124,10 @@ class Ctl(object):
1115
1124
  handshake(self.ar, file, False)
1116
1125
 
1117
1126
  def cleanup_vt100(self):
1118
- ss.scroll_region(None)
1127
+ if VT100:
1128
+ ss.scroll_region(None)
1129
+ else:
1130
+ eprint("\033]9;4;0\033\\")
1119
1131
  eprint("\033[J\033]0;\033\\")
1120
1132
 
1121
1133
  def cb_hasher(self, file, ofs):
@@ -1536,6 +1548,38 @@ source file/folder selection uses rsync syntax, meaning that:
1536
1548
  except:
1537
1549
  pass
1538
1550
 
1551
+ # msys2 doesn't uncygpath absolute paths with whitespace
1552
+ if not VT100:
1553
+ zsl = []
1554
+ for fn in ar.files:
1555
+ if re.search("^/[a-z]/", fn):
1556
+ fn = r"%s:\%s" % (fn[1:2], fn[3:])
1557
+ zsl.append(fn.replace("/", "\\"))
1558
+ ar.files = zsl
1559
+
1560
+ fok = []
1561
+ fng = []
1562
+ for fn in ar.files:
1563
+ if os.path.exists(fn):
1564
+ fok.append(fn)
1565
+ elif VT100:
1566
+ fng.append(fn)
1567
+ else:
1568
+ # windows leaves glob-expansion to the invoked process... okayyy let's get to work
1569
+ from glob import glob
1570
+
1571
+ fns = glob(fn)
1572
+ if fns:
1573
+ fok.extend(fns)
1574
+ else:
1575
+ fng.append(fn)
1576
+
1577
+ if fng:
1578
+ t = "some files/folders were not found:\n %s"
1579
+ raise Exception(t % ("\n ".join(fng),))
1580
+
1581
+ ar.files = fok
1582
+
1539
1583
  if ar.drd:
1540
1584
  ar.dr = True
1541
1585
 
Binary file
Binary file
Binary file
copyparty/web/svcs.html CHANGED
@@ -53,7 +53,6 @@
53
53
  {% if s %}
54
54
  <li>running <code>rclone mount</code> on LAN (or just dont have valid certificates)? add <code>--no-check-certificate</code></li>
55
55
  {% endif %}
56
- <li>running <code>rclone mount</code> as root? add <code>--allow-other</code></li>
57
56
  <li>old version of rclone? replace all <code>=</code> with <code>&nbsp;</code> (space)</li>
58
57
  </ul>
59
58
 
@@ -137,7 +136,6 @@
137
136
  {% if args.ftps %}
138
137
  <li>running on LAN (or just dont have valid certificates)? add <code>no_check_certificate=true</code> to the config command</li>
139
138
  {% endif %}
140
- <li>running <code>rclone mount</code> as root? add <code>--allow-other</code></li>
141
139
  <li>old version of rclone? replace all <code>=</code> with <code>&nbsp;</code> (space)</li>
142
140
  </ul>
143
141
  <p>if you want to use the native FTP client in windows instead (please dont), press <code>win+R</code> and run this command:</p>
copyparty/web/up2k.js.gz CHANGED
Binary file
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: copyparty
3
- Version: 1.16.3
3
+ Version: 1.16.5
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
@@ -394,6 +394,9 @@ same order here too
394
394
 
395
395
  * [Chrome issue 1352210](https://bugs.chromium.org/p/chromium/issues/detail?id=1352210) -- plaintext http may be faster at filehashing than https (but also extremely CPU-intensive)
396
396
 
397
+ * [Chrome issue 383568268](https://issues.chromium.org/issues/383568268) -- filereaders in webworkers can OOM / crash the browser-tab
398
+ * copyparty has a workaround which seems to work well enough
399
+
397
400
  * [Firefox issue 1790500](https://bugzilla.mozilla.org/show_bug.cgi?id=1790500) -- entire browser can crash after uploading ~4000 small files
398
401
 
399
402
  * Android: music playback randomly stops due to [battery usage settings](#fix-unreliable-playback-on-android)
@@ -1543,7 +1546,9 @@ replace copyparty passwords with oauth and such
1543
1546
 
1544
1547
  you can disable the built-in password-based login system, and instead replace it with a separate piece of software (an identity provider) which will then handle authenticating / authorizing of users; this makes it possible to login with passkeys / fido2 / webauthn / yubikey / ldap / active directory / oauth / many other single-sign-on contraptions
1545
1548
 
1546
- a popular choice is [Authelia](https://www.authelia.com/) (config-file based), another one is [authentik](https://goauthentik.io/) (GUI-based, more complex)
1549
+ * the regular config-defined users will be used as a fallback for requests which don't include a valid (trusted) IdP username header
1550
+
1551
+ some popular identity providers are [Authelia](https://www.authelia.com/) (config-file based) and [authentik](https://goauthentik.io/) (GUI-based, more complex)
1547
1552
 
1548
1553
  there is a [docker-compose example](./docs/examples/docker/idp-authelia-traefik) which is hopefully a good starting point (alternatively see [./docs/idp.md](./docs/idp.md) if you're the DIY type)
1549
1554
 
@@ -1,6 +1,6 @@
1
1
  copyparty/__init__.py,sha256=iRCNvMPg6k9WG_O2uCtlkD4vWogH8EgP9elp9XwSIJs,2610
2
- copyparty/__main__.py,sha256=fA4D0yAs6twyBcawN9lM7CtHuFagTsQloljWX9MZ1j0,113240
3
- copyparty/__version__.py,sha256=WuW67uQvM6-1HFurfiG1K1FKFNg68jqdRY83bRFPOxY,251
2
+ copyparty/__main__.py,sha256=QMgJweEFGzSHpKE54CcJe2sIHwwa8Kf3NRQqch58h0Q,113241
3
+ copyparty/__version__.py,sha256=qn_oNmlkJlFLhCQtoyBt5ojEXnzjKAyGucJ0Y9SRkSU,252
4
4
  copyparty/authsrv.py,sha256=CIK5OKl38LehdAt4hidCMpsATdJhPABJPkJStpQpp9U,103405
5
5
  copyparty/broker_mp.py,sha256=QdOXXvV2Xn6J0CysEqyY3GZbqxQMyWnTpnba-a5lMc0,4987
6
6
  copyparty/broker_mpw.py,sha256=PpSS4SK3pItlpfD8OwVr3QmJEPKlUgaf2nuMOozixgU,3347
@@ -11,7 +11,7 @@ copyparty/cfg.py,sha256=UUmFpFbTm750Nv9RnofS80-FTpWT37EggEtmkE1wbxE,10374
11
11
  copyparty/dxml.py,sha256=lZpg-kn-kQsXRtNY1n6fRaS-b7uXzMCyv8ovKnhZcZc,1548
12
12
  copyparty/fsutil.py,sha256=5CshJWO7CflfaRRNOb3JxghUH7W5rmS_HWNmKfx42MM,4538
13
13
  copyparty/ftpd.py,sha256=T97SFS7JFtvRLbJX8C4fJSYwe13vhN3-E6emtlVmqLA,17608
14
- copyparty/httpcli.py,sha256=hwHJ8EwV30MHZ6hGPGfmCuow5Nu2daMV2EN7Ups5jb8,207704
14
+ copyparty/httpcli.py,sha256=DRE8V3YxUk7YIBGSnmuH0px1ZSqtJciY15k1Rk8ThBI,207587
15
15
  copyparty/httpconn.py,sha256=mQSgljh0Q-jyWjF4tQLrHbRKRe9WKl19kGqsGMsJpWo,6880
16
16
  copyparty/httpsrv.py,sha256=PXLZlT6iuJZYG9ajNsAaNgRK3UtS4CrOGFGXOpkRtOk,18235
17
17
  copyparty/ico.py,sha256=eWSxEae4wOCfheHl-m-wchYvFRAR_97kJDb4NGaB-Z8,3561
@@ -26,12 +26,12 @@ copyparty/star.py,sha256=tV5BbX6AiQ7N4UU8DYtSTckNYeoeey4DBqq4LjfymbY,3818
26
26
  copyparty/sutil.py,sha256=JTMrQwcWH85hXB_cKG206eDZ967WZDGaP00AWvl_gB0,3214
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=VuW_aVDcyXIhIMZ8I-wpIouX8MI9TGp7KKSRohrMTtk,19897
29
+ copyparty/tcpsrv.py,sha256=H7z9tzYRCm-kZwktnm_wP-v2MXaIOygx9yfdk1xkqRo,19889
30
30
  copyparty/tftpd.py,sha256=FRCALO3PigoBlwUrqxoKHM_xk7wT2O0GPG1TvNRtjOY,13606
31
31
  copyparty/th_cli.py,sha256=o6FMkerYvAXS455z3DUossVztu_nzFlYSQhs6qN6Jt8,4636
32
32
  copyparty/th_srv.py,sha256=LBcB4LpsF-H7L52Z0Dhn9LogRjJVPp1GKa8MeIMIBnw,29596
33
33
  copyparty/u2idx.py,sha256=kF4TE-j78Faq_f4vGh5So5raYDYLt2UDpza6yBA3f54,13687
34
- copyparty/up2k.py,sha256=cCJrXr8ism5V5Kv0XOEjio5q5OtLKodr0cx2Wq01LUs,174179
34
+ copyparty/up2k.py,sha256=KQZcpqWRwjvmJLFEo3ejVWDroQi10jQdvgxuASDpUlY,174476
35
35
  copyparty/util.py,sha256=UyaYXfVO4nOkqhSMi9SZn2zK2W9texb9CL9rsqMak8I,95135
36
36
  copyparty/bos/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
37
37
  copyparty/bos/bos.py,sha256=Wb7eWsXJgR5AFlBR9ZOyKrLTwy-Kct9RrGiOu4Jo37Y,1622
@@ -55,9 +55,9 @@ copyparty/stolen/ifaddr/_posix.py,sha256=-67NdfGrCktfQPakT2fLbjl2U00QMvyBGkSvrUu
55
55
  copyparty/stolen/ifaddr/_shared.py,sha256=uNC4SdEIgdSLKvuUzsf1aM-H1Xrc_9mpLoOT43YukGs,6206
56
56
  copyparty/stolen/ifaddr/_win32.py,sha256=EE-QyoBgeB7lYQ6z62VjXNaRozaYfCkaJBHGNA8QtZM,4026
57
57
  copyparty/web/baguettebox.js.gz,sha256=_amC3ipOrXKEFz8DsVP-JEl49VjMQYiKyF78eWfG-uk,7965
58
- copyparty/web/browser.css.gz,sha256=1BN6qfX6Zai3osSbW0Y5WFcqD4D7wiWYOVEb8zXYu9w,11643
58
+ copyparty/web/browser.css.gz,sha256=kurx_iA-KxLYx8PqJsn0bJVjkAxP-0YTOHSV9l_oouo,11645
59
59
  copyparty/web/browser.html,sha256=KCkZ_LwzQnj9xhXKYptAxp6W3nVGiDoSJ4ioZDo7rQ0,4827
60
- copyparty/web/browser.js.gz,sha256=bJ0hs0hUG1cXPvRN8_5ApLConOK05yr3JBomPEOfOdM,89343
60
+ copyparty/web/browser.js.gz,sha256=7YbcHLByMAc71j3nKKUrCEExAzfenYnHPBSrnJ8iJFA,89833
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
@@ -77,15 +77,15 @@ copyparty/web/shares.js.gz,sha256=emeY2-wjkh8x1JgaW6ny5fcC7XpZzZzfE1f-sEyntQ4,94
77
77
  copyparty/web/splash.css.gz,sha256=VxFqPvNdZtWb0u1C_GW2yYwrHq0lqPMitft9GYcv56k,1087
78
78
  copyparty/web/splash.html,sha256=wc8El8_5BR3EMuVik8WYAkkEQ4S6-VepR1B1F8qAYgI,6190
79
79
  copyparty/web/splash.js.gz,sha256=EEfsi9YGtPTYRB6MPX8Dfg4YyfqncI9ldJS7_MGVOhs,2710
80
- copyparty/web/svcs.html,sha256=P5YZimYLeQMT0uz6u3clQSNZRc5Zs0Ok-ffcbcGSYuc,11762
80
+ copyparty/web/svcs.html,sha256=5cAp6RAkvqfDAbO9kxuDgXcmuDH20ZN2fse0uzCXb5s,11564
81
81
  copyparty/web/svcs.js.gz,sha256=k81ZvZ3I-f4fMHKrNGGOgOlvXnCBz0mVjD-8mieoWCA,520
82
82
  copyparty/web/ui.css.gz,sha256=v8U-1tetZzuzTpITjq8NWj1gg3jEiYDIIE8aE0dx63k,2800
83
- copyparty/web/up2k.js.gz,sha256=fDOT5g-LaF4WvXcceIFTc0pGhp1XPb6-W0vAdwIAKmg,23289
83
+ copyparty/web/up2k.js.gz,sha256=0keU0ljh9B41VsoVMpi-NtuYjtGl00xUgNH20CIbz8Y,23449
84
84
  copyparty/web/util.js.gz,sha256=MMDIZbxzBwBYE5eYLzhGGpC7h257oEFZaBKZwJ4uhc8,15077
85
85
  copyparty/web/w.hash.js.gz,sha256=l3GpSJD6mcU-1CRWkIj7PybgbjlfSr8oeO3vortIrQk,1105
86
86
  copyparty/web/a/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
87
87
  copyparty/web/a/partyfuse.py,sha256=9p5Hpg_IBiSimv7j9kmPhCGpy-FLXSRUOYnLjJ5JifU,28049
88
- copyparty/web/a/u2c.py,sha256=XqEFjWBiczcPsDpym74kkqg5o15Fuc7GThHfh5j0puA,50357
88
+ copyparty/web/a/u2c.py,sha256=1XcH5XfC2UuGrpTnLVHCe4KFU0Vl6uC02CZz04rvKOc,51612
89
89
  copyparty/web/a/webdav-cfg.bat,sha256=Y4NoGZlksAIg4cBMb7KdJrpKC6Nx97onaTl6yMjaimk,1449
90
90
  copyparty/web/dd/2.png,sha256=gJ14XFPzaw95L6z92fSq9eMPikSQyu-03P1lgiGe0_I,258
91
91
  copyparty/web/dd/3.png,sha256=4lho8Koz5tV7jJ4ODo6GMTScZfkqsT05yp48EDFIlyg,252
@@ -97,7 +97,7 @@ copyparty/web/deps/busy.mp3.gz,sha256=EVphk1_HYyRKJmtpeK99vbAstF7ub1f9ndu020H8PQ
97
97
  copyparty/web/deps/easymde.css.gz,sha256=vWxfueI64rPikuqFj69wJBtGisqf93AheQtOZqgUI_c,3041
98
98
  copyparty/web/deps/easymde.js.gz,sha256=rHBs4XWQe2bmv7ZzDIk43oxnTwrwpq5laYHhV5sKQQo,77014
99
99
  copyparty/web/deps/fuse.py,sha256=6j4Zy3VpQg629pwwIW77v2LJ1hy-qlyrxwhXfKl9B7I,33426
100
- copyparty/web/deps/marked.js.gz,sha256=3sviQ05gVpZF2s43evtFQZZSMSHV6K3OsS15OoBqb10,22610
100
+ copyparty/web/deps/marked.js.gz,sha256=nay9sv1hlF9Y6ngXuXvE_O-MaTa7vE5OyK05-jjWx7M,22617
101
101
  copyparty/web/deps/mini-fa.css.gz,sha256=CTPrNaH8OTVmxajrGP88E2MkjadY9_81TBVnd9sw9Y8,572
102
102
  copyparty/web/deps/mini-fa.woff,sha256=L9DNncV2TIyvsrspMbJouvnnt7F068Hbn7YZYvN76AU,2784
103
103
  copyparty/web/deps/prism.css.gz,sha256=Z_A6rJ3MN5KWnjvXaV787aTW_5DT-xjFd0YZ7_W-Krk,1468
@@ -106,9 +106,9 @@ copyparty/web/deps/prismd.css.gz,sha256=ObUlksQVr-OuYlTz-I4B23TeBg2QDVVGRnWBz8cV
106
106
  copyparty/web/deps/scp.woff2,sha256=w99BDU5i8MukkMEL-iW0YO9H4vFFZSPWxbkH70ytaAg,8612
107
107
  copyparty/web/deps/sha512.ac.js.gz,sha256=lFZaCLumgWxrvEuDr4bqdKHsqjX82AbVAb7_F45Yk88,7033
108
108
  copyparty/web/deps/sha512.hw.js.gz,sha256=UAed2_ocklZCnIzcSYz2h4P1ycztlCLj-ewsRTud2lU,7939
109
- copyparty-1.16.3.dist-info/LICENSE,sha256=gOr4h33pCsBEg9uIy9AYmb7qlocL4V9t2uPJS5wllr0,1072
110
- copyparty-1.16.3.dist-info/METADATA,sha256=VqCIFTrKFy5pOGmG5MAKvnE0_E2Arydg0dS4yhu3Zwo,140656
111
- copyparty-1.16.3.dist-info/WHEEL,sha256=PZUExdf71Ui_so67QXpySuHtCi3-J3wvF4ORK6k_S8U,91
112
- copyparty-1.16.3.dist-info/entry_points.txt,sha256=4zw6a3rqASywQomiYLObjjlxybaI65LYYOTJwgKz7b0,128
113
- copyparty-1.16.3.dist-info/top_level.txt,sha256=LnYUPsDyk-8kFgM6YJLG4h820DQekn81cObKSu9g-sI,10
114
- copyparty-1.16.3.dist-info/RECORD,,
109
+ copyparty-1.16.5.dist-info/LICENSE,sha256=gOr4h33pCsBEg9uIy9AYmb7qlocL4V9t2uPJS5wllr0,1072
110
+ copyparty-1.16.5.dist-info/METADATA,sha256=GZhzGQ_TCgJ9upH18-bjepyQPkFI5pK7EL64w7SWSD0,140992
111
+ copyparty-1.16.5.dist-info/WHEEL,sha256=PZUExdf71Ui_so67QXpySuHtCi3-J3wvF4ORK6k_S8U,91
112
+ copyparty-1.16.5.dist-info/entry_points.txt,sha256=4zw6a3rqASywQomiYLObjjlxybaI65LYYOTJwgKz7b0,128
113
+ copyparty-1.16.5.dist-info/top_level.txt,sha256=LnYUPsDyk-8kFgM6YJLG4h820DQekn81cObKSu9g-sI,10
114
+ copyparty-1.16.5.dist-info/RECORD,,