From cab9feb225c843bfbf71a07d136b7394460d1847 Mon Sep 17 00:00:00 2001 From: ed Date: Mon, 19 Jan 2026 01:26:37 +0000 Subject: [PATCH] v1.20.2 --- README.md | 5 ++++- copyparty/__version__.py | 4 ++-- copyparty/authsrv.py | 10 +++++++++- copyparty/web/browser.js | 2 ++ docs/changelog.md | 33 +++++++++++++++++++++++++++++++++ tests/util.py | 2 +- 6 files changed, 51 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index f38d54db..151593f4 100644 --- a/README.md +++ b/README.md @@ -1882,7 +1882,7 @@ see the beautiful mess of a dictionary in [mtag.py](https://github.com/9001/copy ### metadata from xattrs -unix extended file attributes can be indexed into the db and made searchable; +unix extended file attributes (Linux-only) can be indexed into the db and made searchable; * `--db-xattr user.foo,user.bar` will index the xattrs `user.foo` and `user.bar`, * `--db-xattr user.foo=foo,user.bar=bar` will index them with the names `foo` and `bar`, @@ -1893,6 +1893,9 @@ however note that the tags must also be enabled with `-mte` so here are some com * `-e2ts --db-xattr user.foo,user.bar -mte +user.foo,user.bar` * `-e2ts --db-xattr user.foo=foo,user.bar=bar -mte +foo,bar` +as for actually adding the xattr `user.foo` to a file in the first place, +* `setfattr -n user.foo -v 'utsikt fra fløytoppen' photo.jpg` + ## file parser plugins diff --git a/copyparty/__version__.py b/copyparty/__version__.py index ec5f5dd7..0511f4c3 100644 --- a/copyparty/__version__.py +++ b/copyparty/__version__.py @@ -1,8 +1,8 @@ # coding: utf-8 -VERSION = (1, 20, 1) +VERSION = (1, 20, 2) CODENAME = "sftp is fine too" -BUILD_DT = (2026, 1, 9) +BUILD_DT = (2026, 1, 19) S_VERSION = ".".join(map(str, VERSION)) S_BUILD_DT = "{0:04d}-{1:02d}-{2:02d}".format(*BUILD_DT) diff --git a/copyparty/authsrv.py b/copyparty/authsrv.py index 96f9bd1b..0a6b1d17 100644 --- a/copyparty/authsrv.py +++ b/copyparty/authsrv.py @@ -2117,15 +2117,23 @@ class AuthSrv(object): if errors: sys.exit(1) for vol in dropvols: - vol.realpath = "" vol.axs = AXS() vol.uaxs = {} vfs.all_vols.pop(vol.vpath, None) vfs.all_nodes.pop(vol.vpath, None) for zv in vfs.all_nodes.values(): + try: + zv.all_aps.remove(vol.realpath) + zv.all_vps.remove(vol.vpath) + # pointless but might as well: + zv.all_vols.pop(vol.vpath) + zv.all_nodes.pop(vol.vpath) + except: + pass zs = next((x for x, y in zv.nodes.items() if y == vol), "") if zs: zv.nodes.pop(zs) + vol.realpath = "" promote = [] demote = [] diff --git a/copyparty/web/browser.js b/copyparty/web/browser.js index 77e62c1a..78bcbaa2 100644 --- a/copyparty/web/browser.js +++ b/copyparty/web/browser.js @@ -2,6 +2,8 @@ var J_BRW = 1; +if (!window.drcm) alert('FATAL ERROR: receiving stale data from the server; this may be due to a broken reverse-proxy (stuck cache). Try restarting copyparty and press CTRL-SHIFT-R in the browser'); + var XHR = XMLHttpRequest, img_re = /\.(a?png|avif|bmp|gif|heif|jpe?g|jfif|svg|webp|webm|mkv|mp4|m4v|mov)(\?|$)/i; diff --git a/docs/changelog.md b/docs/changelog.md index ac067cf0..3a09f4d2 100644 --- a/docs/changelog.md +++ b/docs/changelog.md @@ -1,3 +1,36 @@ +▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀ +# 2026-0109-0052 `v1.20.1` sftp fixes + +## 🧪 new features + +* #1174 add Japanese translation (thx @tkymmm!) b918b592 +* #1164 rightclick-menu now works in the gridview too (thx @Foox-dev!) feabbf3e +* #1176 IP to bind can be specified per protocol 87a5c22a + +## 🩹 bugfixes + +* various SFTP fixes (i blame the single [tschunk](https://germanfoods.org/tschunk/) on day 3): + * #1170 be more lenient regarding `stat` permissions 90308284 + * #1170 deletes could return EPERM when ENOENT was more appropriate 8c9e1016 + * #1170 files would be created with an extremely restrictive chmod 2f4a30b6 + * certified octal moment + * write-only folders could return ENOENT 6c41bac6 +* #1177 disk-usage quotas became incompatible with shares in v1.20.0 038af507 +* appending to existing files with `?apnd` was possible in volumes with non-reflink dedup, where it could propagate to deduped copies of the file 738a419b + * (was only possible for users with write+delete perms, so at least it couldn't be used for nefarious purposes) +* rightclick-menu: "copy link" would strip filekeys 3a16d346 + +## 🔧 other changes + +* copyparty.exe: updated pillow to 12.1.0 a9ae6d51 + +## 🌠 fun facts + +* [tschunk](https://germanfoods.org/tschunk/) is the sound a hacker makes as they faceplant onto the table after having one too many + * also see the funfacts in [the previous release](https://github.com/9001/copyparty/releases/tag/v1.20.0) for more CCC hijinks :p + + + ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀ # 2026-0102-0007 `v1.20.0` sftp is fine too diff --git a/tests/util.py b/tests/util.py index 3afba6bc..245c6916 100644 --- a/tests/util.py +++ b/tests/util.py @@ -167,7 +167,7 @@ class Cfg(Namespace): ex = "ah_alg bname chdir chmod_f chpw_db db_xattr doctitle df epilogues exit favico ipa ipar html_head html_head_d html_head_s idp_login idp_logout lg_sba lg_sbf log_date log_fk md_sba md_sbf name og_desc og_site og_th og_title og_title_a og_title_v og_title_i opds_exts preadmes prologues readmes shr shr_site site tcolor textfiles txt_eol ufavico ufavico_h unlist up_site vname xff_src zipmaxt R RS SR" ka.update(**{k: "" for k in ex.split()}) - ex = "apnd_who ban_403 ban_404 ban_422 ban_pw ban_pwc ban_url dont_ban cachectl http_vary rss_fmt_d rss_fmt_t spinner" + ex = "apnd_who ban_403 ban_404 ban_422 ban_pw ban_pwc ban_url dont_ban cachectl http_vary rcm rss_fmt_d rss_fmt_t spinner" ka.update(**{k: "no" for k in ex.split()}) ex = "ext_th grp idp_h_usr idp_hm_usr ipr on403 on404 qr_file xac xad xar xau xban xbc xbd xbr xbu xiu xm"