copyparty 1.18.4__tar.gz → 1.18.5__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 (125) hide show
  1. {copyparty-1.18.4 → copyparty-1.18.5}/PKG-INFO +1 -1
  2. {copyparty-1.18.4 → copyparty-1.18.5}/copyparty/__main__.py +1 -0
  3. {copyparty-1.18.4 → copyparty-1.18.5}/copyparty/__version__.py +2 -2
  4. {copyparty-1.18.4 → copyparty-1.18.5}/copyparty/httpcli.py +27 -11
  5. {copyparty-1.18.4 → copyparty-1.18.5}/copyparty/util.py +13 -3
  6. copyparty-1.18.5/copyparty/web/browser.js.gz +0 -0
  7. copyparty-1.18.5/copyparty/web/util.js.gz +0 -0
  8. {copyparty-1.18.4 → copyparty-1.18.5}/copyparty.egg-info/PKG-INFO +1 -1
  9. copyparty-1.18.4/copyparty/web/browser.js.gz +0 -0
  10. copyparty-1.18.4/copyparty/web/util.js.gz +0 -0
  11. {copyparty-1.18.4 → copyparty-1.18.5}/LICENSE +0 -0
  12. {copyparty-1.18.4 → copyparty-1.18.5}/README.md +0 -0
  13. {copyparty-1.18.4 → copyparty-1.18.5}/copyparty/__init__.py +0 -0
  14. {copyparty-1.18.4 → copyparty-1.18.5}/copyparty/authsrv.py +0 -0
  15. {copyparty-1.18.4 → copyparty-1.18.5}/copyparty/bos/__init__.py +0 -0
  16. {copyparty-1.18.4 → copyparty-1.18.5}/copyparty/bos/bos.py +0 -0
  17. {copyparty-1.18.4 → copyparty-1.18.5}/copyparty/bos/path.py +0 -0
  18. {copyparty-1.18.4 → copyparty-1.18.5}/copyparty/broker_mp.py +0 -0
  19. {copyparty-1.18.4 → copyparty-1.18.5}/copyparty/broker_mpw.py +0 -0
  20. {copyparty-1.18.4 → copyparty-1.18.5}/copyparty/broker_thr.py +0 -0
  21. {copyparty-1.18.4 → copyparty-1.18.5}/copyparty/broker_util.py +0 -0
  22. {copyparty-1.18.4 → copyparty-1.18.5}/copyparty/cert.py +0 -0
  23. {copyparty-1.18.4 → copyparty-1.18.5}/copyparty/cfg.py +0 -0
  24. {copyparty-1.18.4 → copyparty-1.18.5}/copyparty/dxml.py +0 -0
  25. {copyparty-1.18.4 → copyparty-1.18.5}/copyparty/fsutil.py +0 -0
  26. {copyparty-1.18.4 → copyparty-1.18.5}/copyparty/ftpd.py +0 -0
  27. {copyparty-1.18.4 → copyparty-1.18.5}/copyparty/httpconn.py +0 -0
  28. {copyparty-1.18.4 → copyparty-1.18.5}/copyparty/httpsrv.py +0 -0
  29. {copyparty-1.18.4 → copyparty-1.18.5}/copyparty/ico.py +0 -0
  30. {copyparty-1.18.4 → copyparty-1.18.5}/copyparty/mdns.py +0 -0
  31. {copyparty-1.18.4 → copyparty-1.18.5}/copyparty/metrics.py +0 -0
  32. {copyparty-1.18.4 → copyparty-1.18.5}/copyparty/mtag.py +0 -0
  33. {copyparty-1.18.4 → copyparty-1.18.5}/copyparty/multicast.py +0 -0
  34. {copyparty-1.18.4 → copyparty-1.18.5}/copyparty/pwhash.py +0 -0
  35. {copyparty-1.18.4 → copyparty-1.18.5}/copyparty/res/COPYING.txt +0 -0
  36. {copyparty-1.18.4 → copyparty-1.18.5}/copyparty/res/__init__.py +0 -0
  37. {copyparty-1.18.4 → copyparty-1.18.5}/copyparty/res/insecure.pem +0 -0
  38. {copyparty-1.18.4 → copyparty-1.18.5}/copyparty/smbd.py +0 -0
  39. {copyparty-1.18.4 → copyparty-1.18.5}/copyparty/ssdp.py +0 -0
  40. {copyparty-1.18.4 → copyparty-1.18.5}/copyparty/star.py +0 -0
  41. {copyparty-1.18.4 → copyparty-1.18.5}/copyparty/stolen/__init__.py +0 -0
  42. {copyparty-1.18.4 → copyparty-1.18.5}/copyparty/stolen/dnslib/__init__.py +0 -0
  43. {copyparty-1.18.4 → copyparty-1.18.5}/copyparty/stolen/dnslib/bimap.py +0 -0
  44. {copyparty-1.18.4 → copyparty-1.18.5}/copyparty/stolen/dnslib/bit.py +0 -0
  45. {copyparty-1.18.4 → copyparty-1.18.5}/copyparty/stolen/dnslib/buffer.py +0 -0
  46. {copyparty-1.18.4 → copyparty-1.18.5}/copyparty/stolen/dnslib/dns.py +0 -0
  47. {copyparty-1.18.4 → copyparty-1.18.5}/copyparty/stolen/dnslib/label.py +0 -0
  48. {copyparty-1.18.4 → copyparty-1.18.5}/copyparty/stolen/dnslib/lex.py +0 -0
  49. {copyparty-1.18.4 → copyparty-1.18.5}/copyparty/stolen/dnslib/ranges.py +0 -0
  50. {copyparty-1.18.4 → copyparty-1.18.5}/copyparty/stolen/ifaddr/__init__.py +0 -0
  51. {copyparty-1.18.4 → copyparty-1.18.5}/copyparty/stolen/ifaddr/_posix.py +0 -0
  52. {copyparty-1.18.4 → copyparty-1.18.5}/copyparty/stolen/ifaddr/_shared.py +0 -0
  53. {copyparty-1.18.4 → copyparty-1.18.5}/copyparty/stolen/ifaddr/_win32.py +0 -0
  54. {copyparty-1.18.4 → copyparty-1.18.5}/copyparty/stolen/qrcodegen.py +0 -0
  55. {copyparty-1.18.4 → copyparty-1.18.5}/copyparty/stolen/surrogateescape.py +0 -0
  56. {copyparty-1.18.4 → copyparty-1.18.5}/copyparty/sutil.py +0 -0
  57. {copyparty-1.18.4 → copyparty-1.18.5}/copyparty/svchub.py +0 -0
  58. {copyparty-1.18.4 → copyparty-1.18.5}/copyparty/szip.py +0 -0
  59. {copyparty-1.18.4 → copyparty-1.18.5}/copyparty/tcpsrv.py +0 -0
  60. {copyparty-1.18.4 → copyparty-1.18.5}/copyparty/tftpd.py +0 -0
  61. {copyparty-1.18.4 → copyparty-1.18.5}/copyparty/th_cli.py +0 -0
  62. {copyparty-1.18.4 → copyparty-1.18.5}/copyparty/th_srv.py +0 -0
  63. {copyparty-1.18.4 → copyparty-1.18.5}/copyparty/u2idx.py +0 -0
  64. {copyparty-1.18.4 → copyparty-1.18.5}/copyparty/up2k.py +0 -0
  65. {copyparty-1.18.4 → copyparty-1.18.5}/copyparty/web/a/__init__.py +0 -0
  66. {copyparty-1.18.4 → copyparty-1.18.5}/copyparty/web/a/partyfuse.py +0 -0
  67. {copyparty-1.18.4 → copyparty-1.18.5}/copyparty/web/a/u2c.py +0 -0
  68. {copyparty-1.18.4 → copyparty-1.18.5}/copyparty/web/a/webdav-cfg.bat +0 -0
  69. {copyparty-1.18.4 → copyparty-1.18.5}/copyparty/web/baguettebox.js.gz +0 -0
  70. {copyparty-1.18.4 → copyparty-1.18.5}/copyparty/web/browser.css.gz +0 -0
  71. {copyparty-1.18.4 → copyparty-1.18.5}/copyparty/web/browser.html +0 -0
  72. {copyparty-1.18.4 → copyparty-1.18.5}/copyparty/web/browser2.html +0 -0
  73. {copyparty-1.18.4 → copyparty-1.18.5}/copyparty/web/cf.html +0 -0
  74. {copyparty-1.18.4 → copyparty-1.18.5}/copyparty/web/dbg-audio.js.gz +0 -0
  75. {copyparty-1.18.4 → copyparty-1.18.5}/copyparty/web/dd/2.png +0 -0
  76. {copyparty-1.18.4 → copyparty-1.18.5}/copyparty/web/dd/3.png +0 -0
  77. {copyparty-1.18.4 → copyparty-1.18.5}/copyparty/web/dd/4.png +0 -0
  78. {copyparty-1.18.4 → copyparty-1.18.5}/copyparty/web/dd/5.png +0 -0
  79. {copyparty-1.18.4 → copyparty-1.18.5}/copyparty/web/dd/__init__.py +0 -0
  80. {copyparty-1.18.4 → copyparty-1.18.5}/copyparty/web/deps/__init__.py +0 -0
  81. {copyparty-1.18.4 → copyparty-1.18.5}/copyparty/web/deps/busy.mp3.gz +0 -0
  82. {copyparty-1.18.4 → copyparty-1.18.5}/copyparty/web/deps/easymde.css.gz +0 -0
  83. {copyparty-1.18.4 → copyparty-1.18.5}/copyparty/web/deps/easymde.js.gz +0 -0
  84. {copyparty-1.18.4 → copyparty-1.18.5}/copyparty/web/deps/fuse.py +0 -0
  85. {copyparty-1.18.4 → copyparty-1.18.5}/copyparty/web/deps/marked.js.gz +0 -0
  86. {copyparty-1.18.4 → copyparty-1.18.5}/copyparty/web/deps/mini-fa.css.gz +0 -0
  87. {copyparty-1.18.4 → copyparty-1.18.5}/copyparty/web/deps/mini-fa.woff +0 -0
  88. {copyparty-1.18.4 → copyparty-1.18.5}/copyparty/web/deps/prism.css.gz +0 -0
  89. {copyparty-1.18.4 → copyparty-1.18.5}/copyparty/web/deps/prism.js.gz +0 -0
  90. {copyparty-1.18.4 → copyparty-1.18.5}/copyparty/web/deps/prismd.css.gz +0 -0
  91. {copyparty-1.18.4 → copyparty-1.18.5}/copyparty/web/deps/scp.woff2 +0 -0
  92. {copyparty-1.18.4 → copyparty-1.18.5}/copyparty/web/deps/sha512.ac.js.gz +0 -0
  93. {copyparty-1.18.4 → copyparty-1.18.5}/copyparty/web/deps/sha512.hw.js.gz +0 -0
  94. {copyparty-1.18.4 → copyparty-1.18.5}/copyparty/web/idp.html +0 -0
  95. {copyparty-1.18.4 → copyparty-1.18.5}/copyparty/web/md.css.gz +0 -0
  96. {copyparty-1.18.4 → copyparty-1.18.5}/copyparty/web/md.html +0 -0
  97. {copyparty-1.18.4 → copyparty-1.18.5}/copyparty/web/md.js.gz +0 -0
  98. {copyparty-1.18.4 → copyparty-1.18.5}/copyparty/web/md2.css.gz +0 -0
  99. {copyparty-1.18.4 → copyparty-1.18.5}/copyparty/web/md2.js.gz +0 -0
  100. {copyparty-1.18.4 → copyparty-1.18.5}/copyparty/web/mde.css.gz +0 -0
  101. {copyparty-1.18.4 → copyparty-1.18.5}/copyparty/web/mde.html +0 -0
  102. {copyparty-1.18.4 → copyparty-1.18.5}/copyparty/web/mde.js.gz +0 -0
  103. {copyparty-1.18.4 → copyparty-1.18.5}/copyparty/web/msg.css.gz +0 -0
  104. {copyparty-1.18.4 → copyparty-1.18.5}/copyparty/web/msg.html +0 -0
  105. {copyparty-1.18.4 → copyparty-1.18.5}/copyparty/web/rups.css.gz +0 -0
  106. {copyparty-1.18.4 → copyparty-1.18.5}/copyparty/web/rups.html +0 -0
  107. {copyparty-1.18.4 → copyparty-1.18.5}/copyparty/web/rups.js.gz +0 -0
  108. {copyparty-1.18.4 → copyparty-1.18.5}/copyparty/web/shares.css.gz +0 -0
  109. {copyparty-1.18.4 → copyparty-1.18.5}/copyparty/web/shares.html +0 -0
  110. {copyparty-1.18.4 → copyparty-1.18.5}/copyparty/web/shares.js.gz +0 -0
  111. {copyparty-1.18.4 → copyparty-1.18.5}/copyparty/web/splash.css.gz +0 -0
  112. {copyparty-1.18.4 → copyparty-1.18.5}/copyparty/web/splash.html +0 -0
  113. {copyparty-1.18.4 → copyparty-1.18.5}/copyparty/web/splash.js.gz +0 -0
  114. {copyparty-1.18.4 → copyparty-1.18.5}/copyparty/web/svcs.html +0 -0
  115. {copyparty-1.18.4 → copyparty-1.18.5}/copyparty/web/svcs.js.gz +0 -0
  116. {copyparty-1.18.4 → copyparty-1.18.5}/copyparty/web/ui.css.gz +0 -0
  117. {copyparty-1.18.4 → copyparty-1.18.5}/copyparty/web/up2k.js.gz +0 -0
  118. {copyparty-1.18.4 → copyparty-1.18.5}/copyparty/web/w.hash.js.gz +0 -0
  119. {copyparty-1.18.4 → copyparty-1.18.5}/copyparty.egg-info/SOURCES.txt +0 -0
  120. {copyparty-1.18.4 → copyparty-1.18.5}/copyparty.egg-info/dependency_links.txt +0 -0
  121. {copyparty-1.18.4 → copyparty-1.18.5}/copyparty.egg-info/entry_points.txt +0 -0
  122. {copyparty-1.18.4 → copyparty-1.18.5}/copyparty.egg-info/requires.txt +0 -0
  123. {copyparty-1.18.4 → copyparty-1.18.5}/copyparty.egg-info/top_level.txt +0 -0
  124. {copyparty-1.18.4 → copyparty-1.18.5}/pyproject.toml +0 -0
  125. {copyparty-1.18.4 → copyparty-1.18.5}/setup.cfg +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: copyparty
3
- Version: 1.18.4
3
+ Version: 1.18.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
@@ -1280,6 +1280,7 @@ def add_stats(ap):
1280
1280
  def add_yolo(ap):
1281
1281
  ap2 = ap.add_argument_group('yolo options')
1282
1282
  ap2.add_argument("--allow-csrf", action="store_true", help="disable csrf protections; let other domains/sites impersonate you through cross-site requests")
1283
+ ap2.add_argument("--cookie-lax", action="store_true", help="allow cookies from other domains (if you follow a link from another website into your server, you will arrive logged-in); this reduces protection against CSRF")
1283
1284
  ap2.add_argument("--getmod", action="store_true", help="permit ?move=[...] and ?delete as GET")
1284
1285
  ap2.add_argument("--wo-up-readme", action="store_true", help="allow users with write-only access to upload logues and readmes without adding the _wo_ filename prefix (volflag=wo_up_readme)")
1285
1286
 
@@ -1,8 +1,8 @@
1
1
  # coding: utf-8
2
2
 
3
- VERSION = (1, 18, 4)
3
+ VERSION = (1, 18, 5)
4
4
  CODENAME = "logtail"
5
- BUILD_DT = (2025, 7, 25)
5
+ BUILD_DT = (2025, 7, 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)
@@ -2981,12 +2981,20 @@ class HttpCli(object):
2981
2981
  # reset both plaintext and tls
2982
2982
  # (only affects active tls cookies when tls)
2983
2983
  for k in ("cppwd", "cppws") if self.is_https else ("cppwd",):
2984
- ck = gencookie(k, pwd, self.args.R, False)
2984
+ ck = gencookie(k, pwd, self.args.R, self.args.cookie_lax, False)
2985
2985
  self.out_headerlist.append(("Set-Cookie", ck))
2986
2986
  self.out_headers.pop("Set-Cookie", None) # drop keepalive
2987
2987
  else:
2988
2988
  k = "cppws" if self.is_https else "cppwd"
2989
- ck = gencookie(k, pwd, self.args.R, self.is_https, dur, "; HttpOnly")
2989
+ ck = gencookie(
2990
+ k,
2991
+ pwd,
2992
+ self.args.R,
2993
+ self.args.cookie_lax,
2994
+ self.is_https,
2995
+ dur,
2996
+ "; HttpOnly",
2997
+ )
2990
2998
  self.out_headers["Set-Cookie"] = ck
2991
2999
 
2992
3000
  return dur > 0, msg
@@ -4843,13 +4851,21 @@ class HttpCli(object):
4843
4851
  def tx_svcs(self) :
4844
4852
  aname = re.sub("[^0-9a-zA-Z]+", "", self.args.vname) or "a"
4845
4853
  ep = self.host
4846
- host = ep.split(":")[0]
4847
- hport = ep[ep.find(":") :] if ":" in ep else ""
4848
- rip = (
4849
- host
4850
- if self.args.rclone_mdns or not self.args.zm
4851
- else self.conn.hsrv.nm.map(self.ip) or host
4852
- )
4854
+ sep = "]:" if "]" in ep else ":"
4855
+ if sep in ep:
4856
+ host, hport = ep.rsplit(":", 1)
4857
+ hport = ":" + hport
4858
+ else:
4859
+ host = ep
4860
+ hport = ""
4861
+
4862
+ if host.endswith(".local") and self.args.zm and not self.args.rclone_mdns:
4863
+ rip = self.conn.hsrv.nm.map(self.ip) or host
4864
+ if ":" in rip and "[" not in rip:
4865
+ rip = "[%s]" % (rip,)
4866
+ else:
4867
+ rip = host
4868
+
4853
4869
  # safer than html_escape/quotep since this avoids both XSS and shell-stuff
4854
4870
  pw = re.sub(r"[<>&$?`\"']", "_", self.pw or "hunter2")
4855
4871
  vp = re.sub(r"[<>&$?`\"']", "_", self.uparam["hc"] or "").lstrip("/")
@@ -5018,7 +5034,7 @@ class HttpCli(object):
5018
5034
  def setck(self) :
5019
5035
  k, v = self.uparam["setck"].split("=", 1)
5020
5036
  t = 0 if v in ("", "x") else 86400 * 299
5021
- ck = gencookie(k, v, self.args.R, False, t)
5037
+ ck = gencookie(k, v, self.args.R, self.args.cookie_lax, False, t)
5022
5038
  self.out_headerlist.append(("Set-Cookie", ck))
5023
5039
  if "cc" in self.ouparam:
5024
5040
  self.redirect("", "?h#cc")
@@ -5030,7 +5046,7 @@ class HttpCli(object):
5030
5046
  for k in ALL_COOKIES:
5031
5047
  if k not in self.cookies:
5032
5048
  continue
5033
- cookie = gencookie(k, "x", self.args.R, False)
5049
+ cookie = gencookie(k, "x", self.args.R, self.args.cookie_lax, False)
5034
5050
  self.out_headerlist.append(("Set-Cookie", cookie))
5035
5051
 
5036
5052
  self.redirect("", "?h#cc")
@@ -1951,15 +1951,25 @@ def formatdate(ts = None) :
1951
1951
  return RFC2822 % (WKDAYS[wd], d, MONTHS[mo - 1], y, h, mi, s)
1952
1952
 
1953
1953
 
1954
- def gencookie(k , v , r , tls , dur = 0, txt = "") :
1954
+ def gencookie(
1955
+ k , v , r , lax , tls , dur = 0, txt = ""
1956
+ ) :
1955
1957
  v = v.replace("%", "%25").replace(";", "%3B")
1956
1958
  if dur:
1957
1959
  exp = formatdate(time.time() + dur)
1958
1960
  else:
1959
1961
  exp = "Fri, 15 Aug 1997 01:00:00 GMT"
1960
1962
 
1961
- t = "%s=%s; Path=/%s; Expires=%s%s%s; SameSite=Lax"
1962
- return t % (k, v, r, exp, "; Secure" if tls else "", txt)
1963
+ t = "%s=%s; Path=/%s; Expires=%s%s%s; SameSite=%s"
1964
+ return t % (
1965
+ k,
1966
+ v,
1967
+ r,
1968
+ exp,
1969
+ "; Secure" if tls else "",
1970
+ txt,
1971
+ "Lax" if lax else "Strict",
1972
+ )
1963
1973
 
1964
1974
 
1965
1975
  def humansize(sz , terse = False) :
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: copyparty
3
- Version: 1.18.4
3
+ Version: 1.18.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
Binary file
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes