copyparty 1.16.15__tar.gz → 1.16.16__tar.gz

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.
Files changed (123) hide show
  1. {copyparty-1.16.15 → copyparty-1.16.16}/PKG-INFO +1 -1
  2. {copyparty-1.16.15 → copyparty-1.16.16}/copyparty/__version__.py +2 -2
  3. {copyparty-1.16.15 → copyparty-1.16.16}/copyparty/authsrv.py +8 -7
  4. {copyparty-1.16.15 → copyparty-1.16.16}/copyparty/cfg.py +3 -0
  5. {copyparty-1.16.15 → copyparty-1.16.16}/copyparty/up2k.py +6 -1
  6. copyparty-1.16.16/copyparty/web/up2k.js.gz +0 -0
  7. {copyparty-1.16.15 → copyparty-1.16.16}/copyparty.egg-info/PKG-INFO +1 -1
  8. copyparty-1.16.15/copyparty/web/up2k.js.gz +0 -0
  9. {copyparty-1.16.15 → copyparty-1.16.16}/LICENSE +0 -0
  10. {copyparty-1.16.15 → copyparty-1.16.16}/README.md +0 -0
  11. {copyparty-1.16.15 → copyparty-1.16.16}/copyparty/__init__.py +0 -0
  12. {copyparty-1.16.15 → copyparty-1.16.16}/copyparty/__main__.py +0 -0
  13. {copyparty-1.16.15 → copyparty-1.16.16}/copyparty/bos/__init__.py +0 -0
  14. {copyparty-1.16.15 → copyparty-1.16.16}/copyparty/bos/bos.py +0 -0
  15. {copyparty-1.16.15 → copyparty-1.16.16}/copyparty/bos/path.py +0 -0
  16. {copyparty-1.16.15 → copyparty-1.16.16}/copyparty/broker_mp.py +0 -0
  17. {copyparty-1.16.15 → copyparty-1.16.16}/copyparty/broker_mpw.py +0 -0
  18. {copyparty-1.16.15 → copyparty-1.16.16}/copyparty/broker_thr.py +0 -0
  19. {copyparty-1.16.15 → copyparty-1.16.16}/copyparty/broker_util.py +0 -0
  20. {copyparty-1.16.15 → copyparty-1.16.16}/copyparty/cert.py +0 -0
  21. {copyparty-1.16.15 → copyparty-1.16.16}/copyparty/dxml.py +0 -0
  22. {copyparty-1.16.15 → copyparty-1.16.16}/copyparty/fsutil.py +0 -0
  23. {copyparty-1.16.15 → copyparty-1.16.16}/copyparty/ftpd.py +0 -0
  24. {copyparty-1.16.15 → copyparty-1.16.16}/copyparty/httpcli.py +0 -0
  25. {copyparty-1.16.15 → copyparty-1.16.16}/copyparty/httpconn.py +0 -0
  26. {copyparty-1.16.15 → copyparty-1.16.16}/copyparty/httpsrv.py +0 -0
  27. {copyparty-1.16.15 → copyparty-1.16.16}/copyparty/ico.py +0 -0
  28. {copyparty-1.16.15 → copyparty-1.16.16}/copyparty/mdns.py +0 -0
  29. {copyparty-1.16.15 → copyparty-1.16.16}/copyparty/metrics.py +0 -0
  30. {copyparty-1.16.15 → copyparty-1.16.16}/copyparty/mtag.py +0 -0
  31. {copyparty-1.16.15 → copyparty-1.16.16}/copyparty/multicast.py +0 -0
  32. {copyparty-1.16.15 → copyparty-1.16.16}/copyparty/pwhash.py +0 -0
  33. {copyparty-1.16.15 → copyparty-1.16.16}/copyparty/res/COPYING.txt +0 -0
  34. {copyparty-1.16.15 → copyparty-1.16.16}/copyparty/res/__init__.py +0 -0
  35. {copyparty-1.16.15 → copyparty-1.16.16}/copyparty/res/insecure.pem +0 -0
  36. {copyparty-1.16.15 → copyparty-1.16.16}/copyparty/smbd.py +0 -0
  37. {copyparty-1.16.15 → copyparty-1.16.16}/copyparty/ssdp.py +0 -0
  38. {copyparty-1.16.15 → copyparty-1.16.16}/copyparty/star.py +0 -0
  39. {copyparty-1.16.15 → copyparty-1.16.16}/copyparty/stolen/__init__.py +0 -0
  40. {copyparty-1.16.15 → copyparty-1.16.16}/copyparty/stolen/dnslib/__init__.py +0 -0
  41. {copyparty-1.16.15 → copyparty-1.16.16}/copyparty/stolen/dnslib/bimap.py +0 -0
  42. {copyparty-1.16.15 → copyparty-1.16.16}/copyparty/stolen/dnslib/bit.py +0 -0
  43. {copyparty-1.16.15 → copyparty-1.16.16}/copyparty/stolen/dnslib/buffer.py +0 -0
  44. {copyparty-1.16.15 → copyparty-1.16.16}/copyparty/stolen/dnslib/dns.py +0 -0
  45. {copyparty-1.16.15 → copyparty-1.16.16}/copyparty/stolen/dnslib/label.py +0 -0
  46. {copyparty-1.16.15 → copyparty-1.16.16}/copyparty/stolen/dnslib/lex.py +0 -0
  47. {copyparty-1.16.15 → copyparty-1.16.16}/copyparty/stolen/dnslib/ranges.py +0 -0
  48. {copyparty-1.16.15 → copyparty-1.16.16}/copyparty/stolen/ifaddr/__init__.py +0 -0
  49. {copyparty-1.16.15 → copyparty-1.16.16}/copyparty/stolen/ifaddr/_posix.py +0 -0
  50. {copyparty-1.16.15 → copyparty-1.16.16}/copyparty/stolen/ifaddr/_shared.py +0 -0
  51. {copyparty-1.16.15 → copyparty-1.16.16}/copyparty/stolen/ifaddr/_win32.py +0 -0
  52. {copyparty-1.16.15 → copyparty-1.16.16}/copyparty/stolen/qrcodegen.py +0 -0
  53. {copyparty-1.16.15 → copyparty-1.16.16}/copyparty/stolen/surrogateescape.py +0 -0
  54. {copyparty-1.16.15 → copyparty-1.16.16}/copyparty/sutil.py +0 -0
  55. {copyparty-1.16.15 → copyparty-1.16.16}/copyparty/svchub.py +0 -0
  56. {copyparty-1.16.15 → copyparty-1.16.16}/copyparty/szip.py +0 -0
  57. {copyparty-1.16.15 → copyparty-1.16.16}/copyparty/tcpsrv.py +0 -0
  58. {copyparty-1.16.15 → copyparty-1.16.16}/copyparty/tftpd.py +0 -0
  59. {copyparty-1.16.15 → copyparty-1.16.16}/copyparty/th_cli.py +0 -0
  60. {copyparty-1.16.15 → copyparty-1.16.16}/copyparty/th_srv.py +0 -0
  61. {copyparty-1.16.15 → copyparty-1.16.16}/copyparty/u2idx.py +0 -0
  62. {copyparty-1.16.15 → copyparty-1.16.16}/copyparty/util.py +0 -0
  63. {copyparty-1.16.15 → copyparty-1.16.16}/copyparty/web/a/__init__.py +0 -0
  64. {copyparty-1.16.15 → copyparty-1.16.16}/copyparty/web/a/partyfuse.py +0 -0
  65. {copyparty-1.16.15 → copyparty-1.16.16}/copyparty/web/a/u2c.py +0 -0
  66. {copyparty-1.16.15 → copyparty-1.16.16}/copyparty/web/a/webdav-cfg.bat +0 -0
  67. {copyparty-1.16.15 → copyparty-1.16.16}/copyparty/web/baguettebox.js.gz +0 -0
  68. {copyparty-1.16.15 → copyparty-1.16.16}/copyparty/web/browser.css.gz +0 -0
  69. {copyparty-1.16.15 → copyparty-1.16.16}/copyparty/web/browser.html +0 -0
  70. {copyparty-1.16.15 → copyparty-1.16.16}/copyparty/web/browser.js.gz +0 -0
  71. {copyparty-1.16.15 → copyparty-1.16.16}/copyparty/web/browser2.html +0 -0
  72. {copyparty-1.16.15 → copyparty-1.16.16}/copyparty/web/cf.html +0 -0
  73. {copyparty-1.16.15 → copyparty-1.16.16}/copyparty/web/dbg-audio.js.gz +0 -0
  74. {copyparty-1.16.15 → copyparty-1.16.16}/copyparty/web/dd/2.png +0 -0
  75. {copyparty-1.16.15 → copyparty-1.16.16}/copyparty/web/dd/3.png +0 -0
  76. {copyparty-1.16.15 → copyparty-1.16.16}/copyparty/web/dd/4.png +0 -0
  77. {copyparty-1.16.15 → copyparty-1.16.16}/copyparty/web/dd/5.png +0 -0
  78. {copyparty-1.16.15 → copyparty-1.16.16}/copyparty/web/dd/__init__.py +0 -0
  79. {copyparty-1.16.15 → copyparty-1.16.16}/copyparty/web/deps/__init__.py +0 -0
  80. {copyparty-1.16.15 → copyparty-1.16.16}/copyparty/web/deps/busy.mp3.gz +0 -0
  81. {copyparty-1.16.15 → copyparty-1.16.16}/copyparty/web/deps/easymde.css.gz +0 -0
  82. {copyparty-1.16.15 → copyparty-1.16.16}/copyparty/web/deps/easymde.js.gz +0 -0
  83. {copyparty-1.16.15 → copyparty-1.16.16}/copyparty/web/deps/fuse.py +0 -0
  84. {copyparty-1.16.15 → copyparty-1.16.16}/copyparty/web/deps/marked.js.gz +0 -0
  85. {copyparty-1.16.15 → copyparty-1.16.16}/copyparty/web/deps/mini-fa.css.gz +0 -0
  86. {copyparty-1.16.15 → copyparty-1.16.16}/copyparty/web/deps/mini-fa.woff +0 -0
  87. {copyparty-1.16.15 → copyparty-1.16.16}/copyparty/web/deps/prism.css.gz +0 -0
  88. {copyparty-1.16.15 → copyparty-1.16.16}/copyparty/web/deps/prism.js.gz +0 -0
  89. {copyparty-1.16.15 → copyparty-1.16.16}/copyparty/web/deps/prismd.css.gz +0 -0
  90. {copyparty-1.16.15 → copyparty-1.16.16}/copyparty/web/deps/scp.woff2 +0 -0
  91. {copyparty-1.16.15 → copyparty-1.16.16}/copyparty/web/deps/sha512.ac.js.gz +0 -0
  92. {copyparty-1.16.15 → copyparty-1.16.16}/copyparty/web/deps/sha512.hw.js.gz +0 -0
  93. {copyparty-1.16.15 → copyparty-1.16.16}/copyparty/web/md.css.gz +0 -0
  94. {copyparty-1.16.15 → copyparty-1.16.16}/copyparty/web/md.html +0 -0
  95. {copyparty-1.16.15 → copyparty-1.16.16}/copyparty/web/md.js.gz +0 -0
  96. {copyparty-1.16.15 → copyparty-1.16.16}/copyparty/web/md2.css.gz +0 -0
  97. {copyparty-1.16.15 → copyparty-1.16.16}/copyparty/web/md2.js.gz +0 -0
  98. {copyparty-1.16.15 → copyparty-1.16.16}/copyparty/web/mde.css.gz +0 -0
  99. {copyparty-1.16.15 → copyparty-1.16.16}/copyparty/web/mde.html +0 -0
  100. {copyparty-1.16.15 → copyparty-1.16.16}/copyparty/web/mde.js.gz +0 -0
  101. {copyparty-1.16.15 → copyparty-1.16.16}/copyparty/web/msg.css.gz +0 -0
  102. {copyparty-1.16.15 → copyparty-1.16.16}/copyparty/web/msg.html +0 -0
  103. {copyparty-1.16.15 → copyparty-1.16.16}/copyparty/web/rups.css.gz +0 -0
  104. {copyparty-1.16.15 → copyparty-1.16.16}/copyparty/web/rups.html +0 -0
  105. {copyparty-1.16.15 → copyparty-1.16.16}/copyparty/web/rups.js.gz +0 -0
  106. {copyparty-1.16.15 → copyparty-1.16.16}/copyparty/web/shares.css.gz +0 -0
  107. {copyparty-1.16.15 → copyparty-1.16.16}/copyparty/web/shares.html +0 -0
  108. {copyparty-1.16.15 → copyparty-1.16.16}/copyparty/web/shares.js.gz +0 -0
  109. {copyparty-1.16.15 → copyparty-1.16.16}/copyparty/web/splash.css.gz +0 -0
  110. {copyparty-1.16.15 → copyparty-1.16.16}/copyparty/web/splash.html +0 -0
  111. {copyparty-1.16.15 → copyparty-1.16.16}/copyparty/web/splash.js.gz +0 -0
  112. {copyparty-1.16.15 → copyparty-1.16.16}/copyparty/web/svcs.html +0 -0
  113. {copyparty-1.16.15 → copyparty-1.16.16}/copyparty/web/svcs.js.gz +0 -0
  114. {copyparty-1.16.15 → copyparty-1.16.16}/copyparty/web/ui.css.gz +0 -0
  115. {copyparty-1.16.15 → copyparty-1.16.16}/copyparty/web/util.js.gz +0 -0
  116. {copyparty-1.16.15 → copyparty-1.16.16}/copyparty/web/w.hash.js.gz +0 -0
  117. {copyparty-1.16.15 → copyparty-1.16.16}/copyparty.egg-info/SOURCES.txt +0 -0
  118. {copyparty-1.16.15 → copyparty-1.16.16}/copyparty.egg-info/dependency_links.txt +0 -0
  119. {copyparty-1.16.15 → copyparty-1.16.16}/copyparty.egg-info/entry_points.txt +0 -0
  120. {copyparty-1.16.15 → copyparty-1.16.16}/copyparty.egg-info/requires.txt +0 -0
  121. {copyparty-1.16.15 → copyparty-1.16.16}/copyparty.egg-info/top_level.txt +0 -0
  122. {copyparty-1.16.15 → copyparty-1.16.16}/pyproject.toml +0 -0
  123. {copyparty-1.16.15 → copyparty-1.16.16}/setup.cfg +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.2
2
2
  Name: copyparty
3
- Version: 1.16.15
3
+ Version: 1.16.16
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,8 +1,8 @@
1
1
  # coding: utf-8
2
2
 
3
- VERSION = (1, 16, 15)
3
+ VERSION = (1, 16, 16)
4
4
  CODENAME = "COPYparty"
5
- BUILD_DT = (2025, 2, 25)
5
+ BUILD_DT = (2025, 2, 28)
6
6
 
7
7
  S_VERSION = ".".join(map(str, VERSION))
8
8
  S_BUILD_DT = "{0:04d}-{1:02d}-{2:02d}".format(*BUILD_DT)
@@ -1577,12 +1577,8 @@ class AuthSrv(object):
1577
1577
  for vol in vfs.all_vols.values():
1578
1578
  unknown_flags = set()
1579
1579
  for k, v in vol.flags.items():
1580
- stripped = k.lstrip("-")
1581
- if k != stripped and stripped not in vol.flags:
1582
- t = "WARNING: the config for volume [/%s] tried to remove volflag [%s] by specifying [%s] but that volflag was not already set"
1583
- self.log(t % (vol.vpath, stripped, k), 3)
1584
- k = stripped
1585
- if k not in flagdescs and k not in k_ign:
1580
+ ks = k.lstrip("-")
1581
+ if ks not in flagdescs and ks not in k_ign:
1586
1582
  unknown_flags.add(k)
1587
1583
  if unknown_flags:
1588
1584
  t = "WARNING: the config for volume [/%s] has unrecognized volflags; will ignore: '%s'"
@@ -2174,8 +2170,13 @@ class AuthSrv(object):
2174
2170
  for vol in vfs.all_nodes.values():
2175
2171
  for k in list(vol.flags.keys()):
2176
2172
  if re.match("^-[^-]+$", k):
2177
- vol.flags.pop(k[1:], None)
2178
2173
  vol.flags.pop(k)
2174
+ zs = k[1:]
2175
+ if zs in vol.flags:
2176
+ vol.flags.pop(k[1:])
2177
+ else:
2178
+ t = "WARNING: the config for volume [/%s] tried to remove volflag [%s] by specifying [%s] but that volflag was not already set"
2179
+ self.log(t % (vol.vpath, zs, k), 3)
2179
2180
 
2180
2181
  if vol.flags.get("dots"):
2181
2182
  for name in vol.axs.uread:
@@ -293,6 +293,9 @@ flagcats = {
293
293
  "dots": "allow all users with read-access to\nenable the option to show dotfiles in listings",
294
294
  "fk=8": 'generates per-file accesskeys,\nwhich are then required at the "g" permission;\nkeys are invalidated if filesize or inode changes',
295
295
  "fka=8": 'generates slightly weaker per-file accesskeys,\nwhich are then required at the "g" permission;\nnot affected by filesize or inode numbers',
296
+ "dk=8": 'generates per-directory accesskeys,\nwhich are then required at the "g" permission;\nkeys are invalidated if filesize or inode changes',
297
+ "dks": "per-directory accesskeys allow browsing into subdirs",
298
+ "dky": 'allow seeing files (not folders) inside a specific folder\nwith "g" perm, and does not require a valid dirkey to do so',
296
299
  "rss": "allow '?rss' URL suffix (experimental)",
297
300
  "ups_who=2": "restrict viewing the list of recent uploads",
298
301
  "zip_who=2": "restrict access to download-as-zip/tar",
@@ -2939,9 +2939,14 @@ class Up2k(object):
2939
2939
  self.salt, cj["size"], cj["lmod"], cj["prel"], cj["name"]
2940
2940
  )
2941
2941
 
2942
- if vfs.flags.get("up_ts", "") == "fu" or not cj["lmod"]:
2942
+ zi = cj["lmod"]
2943
+ bad_mt = zi <= 0 or zi > 0xAAAAAAAA
2944
+ if bad_mt or vfs.flags.get("up_ts", "") == "fu":
2943
2945
  # force upload time rather than last-modified
2944
2946
  cj["lmod"] = int(time.time())
2947
+ if zi and bad_mt:
2948
+ t = "ignoring impossible last-modified time from client: %s"
2949
+ self.log(t % (zi,), 6)
2945
2950
 
2946
2951
  alts = []
2947
2952
  for ptop, cur in vols:
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.2
2
2
  Name: copyparty
3
- Version: 1.16.15
3
+ Version: 1.16.16
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
Binary file
File without changes
File without changes
File without changes
File without changes