copyparty 1.18.4__tar.gz → 1.18.6__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.
- {copyparty-1.18.4 → copyparty-1.18.6}/PKG-INFO +10 -5
- {copyparty-1.18.4 → copyparty-1.18.6}/README.md +9 -4
- {copyparty-1.18.4 → copyparty-1.18.6}/copyparty/__main__.py +28 -24
- {copyparty-1.18.4 → copyparty-1.18.6}/copyparty/__version__.py +2 -2
- {copyparty-1.18.4 → copyparty-1.18.6}/copyparty/authsrv.py +11 -0
- {copyparty-1.18.4 → copyparty-1.18.6}/copyparty/cfg.py +2 -0
- {copyparty-1.18.4 → copyparty-1.18.6}/copyparty/httpcli.py +31 -11
- {copyparty-1.18.4 → copyparty-1.18.6}/copyparty/httpsrv.py +1 -0
- {copyparty-1.18.4 → copyparty-1.18.6}/copyparty/mtag.py +3 -2
- {copyparty-1.18.4 → copyparty-1.18.6}/copyparty/svchub.py +1 -0
- {copyparty-1.18.4 → copyparty-1.18.6}/copyparty/up2k.py +4 -1
- {copyparty-1.18.4 → copyparty-1.18.6}/copyparty/util.py +13 -3
- copyparty-1.18.6/copyparty/web/browser.js.gz +0 -0
- {copyparty-1.18.4 → copyparty-1.18.6}/copyparty/web/svcs.html +1 -1
- copyparty-1.18.6/copyparty/web/svcs.js.gz +0 -0
- copyparty-1.18.6/copyparty/web/util.js.gz +0 -0
- {copyparty-1.18.4 → copyparty-1.18.6}/copyparty.egg-info/PKG-INFO +10 -5
- copyparty-1.18.4/copyparty/web/browser.js.gz +0 -0
- copyparty-1.18.4/copyparty/web/svcs.js.gz +0 -0
- copyparty-1.18.4/copyparty/web/util.js.gz +0 -0
- {copyparty-1.18.4 → copyparty-1.18.6}/LICENSE +0 -0
- {copyparty-1.18.4 → copyparty-1.18.6}/copyparty/__init__.py +0 -0
- {copyparty-1.18.4 → copyparty-1.18.6}/copyparty/bos/__init__.py +0 -0
- {copyparty-1.18.4 → copyparty-1.18.6}/copyparty/bos/bos.py +0 -0
- {copyparty-1.18.4 → copyparty-1.18.6}/copyparty/bos/path.py +0 -0
- {copyparty-1.18.4 → copyparty-1.18.6}/copyparty/broker_mp.py +0 -0
- {copyparty-1.18.4 → copyparty-1.18.6}/copyparty/broker_mpw.py +0 -0
- {copyparty-1.18.4 → copyparty-1.18.6}/copyparty/broker_thr.py +0 -0
- {copyparty-1.18.4 → copyparty-1.18.6}/copyparty/broker_util.py +0 -0
- {copyparty-1.18.4 → copyparty-1.18.6}/copyparty/cert.py +0 -0
- {copyparty-1.18.4 → copyparty-1.18.6}/copyparty/dxml.py +0 -0
- {copyparty-1.18.4 → copyparty-1.18.6}/copyparty/fsutil.py +0 -0
- {copyparty-1.18.4 → copyparty-1.18.6}/copyparty/ftpd.py +0 -0
- {copyparty-1.18.4 → copyparty-1.18.6}/copyparty/httpconn.py +0 -0
- {copyparty-1.18.4 → copyparty-1.18.6}/copyparty/ico.py +0 -0
- {copyparty-1.18.4 → copyparty-1.18.6}/copyparty/mdns.py +0 -0
- {copyparty-1.18.4 → copyparty-1.18.6}/copyparty/metrics.py +0 -0
- {copyparty-1.18.4 → copyparty-1.18.6}/copyparty/multicast.py +0 -0
- {copyparty-1.18.4 → copyparty-1.18.6}/copyparty/pwhash.py +0 -0
- {copyparty-1.18.4 → copyparty-1.18.6}/copyparty/res/COPYING.txt +0 -0
- {copyparty-1.18.4 → copyparty-1.18.6}/copyparty/res/__init__.py +0 -0
- {copyparty-1.18.4 → copyparty-1.18.6}/copyparty/res/insecure.pem +0 -0
- {copyparty-1.18.4 → copyparty-1.18.6}/copyparty/smbd.py +0 -0
- {copyparty-1.18.4 → copyparty-1.18.6}/copyparty/ssdp.py +0 -0
- {copyparty-1.18.4 → copyparty-1.18.6}/copyparty/star.py +0 -0
- {copyparty-1.18.4 → copyparty-1.18.6}/copyparty/stolen/__init__.py +0 -0
- {copyparty-1.18.4 → copyparty-1.18.6}/copyparty/stolen/dnslib/__init__.py +0 -0
- {copyparty-1.18.4 → copyparty-1.18.6}/copyparty/stolen/dnslib/bimap.py +0 -0
- {copyparty-1.18.4 → copyparty-1.18.6}/copyparty/stolen/dnslib/bit.py +0 -0
- {copyparty-1.18.4 → copyparty-1.18.6}/copyparty/stolen/dnslib/buffer.py +0 -0
- {copyparty-1.18.4 → copyparty-1.18.6}/copyparty/stolen/dnslib/dns.py +0 -0
- {copyparty-1.18.4 → copyparty-1.18.6}/copyparty/stolen/dnslib/label.py +0 -0
- {copyparty-1.18.4 → copyparty-1.18.6}/copyparty/stolen/dnslib/lex.py +0 -0
- {copyparty-1.18.4 → copyparty-1.18.6}/copyparty/stolen/dnslib/ranges.py +0 -0
- {copyparty-1.18.4 → copyparty-1.18.6}/copyparty/stolen/ifaddr/__init__.py +0 -0
- {copyparty-1.18.4 → copyparty-1.18.6}/copyparty/stolen/ifaddr/_posix.py +0 -0
- {copyparty-1.18.4 → copyparty-1.18.6}/copyparty/stolen/ifaddr/_shared.py +0 -0
- {copyparty-1.18.4 → copyparty-1.18.6}/copyparty/stolen/ifaddr/_win32.py +0 -0
- {copyparty-1.18.4 → copyparty-1.18.6}/copyparty/stolen/qrcodegen.py +0 -0
- {copyparty-1.18.4 → copyparty-1.18.6}/copyparty/stolen/surrogateescape.py +0 -0
- {copyparty-1.18.4 → copyparty-1.18.6}/copyparty/sutil.py +0 -0
- {copyparty-1.18.4 → copyparty-1.18.6}/copyparty/szip.py +0 -0
- {copyparty-1.18.4 → copyparty-1.18.6}/copyparty/tcpsrv.py +0 -0
- {copyparty-1.18.4 → copyparty-1.18.6}/copyparty/tftpd.py +0 -0
- {copyparty-1.18.4 → copyparty-1.18.6}/copyparty/th_cli.py +0 -0
- {copyparty-1.18.4 → copyparty-1.18.6}/copyparty/th_srv.py +0 -0
- {copyparty-1.18.4 → copyparty-1.18.6}/copyparty/u2idx.py +0 -0
- {copyparty-1.18.4 → copyparty-1.18.6}/copyparty/web/a/__init__.py +0 -0
- {copyparty-1.18.4 → copyparty-1.18.6}/copyparty/web/a/partyfuse.py +0 -0
- {copyparty-1.18.4 → copyparty-1.18.6}/copyparty/web/a/u2c.py +0 -0
- {copyparty-1.18.4 → copyparty-1.18.6}/copyparty/web/a/webdav-cfg.bat +0 -0
- {copyparty-1.18.4 → copyparty-1.18.6}/copyparty/web/baguettebox.js.gz +0 -0
- {copyparty-1.18.4 → copyparty-1.18.6}/copyparty/web/browser.css.gz +0 -0
- {copyparty-1.18.4 → copyparty-1.18.6}/copyparty/web/browser.html +0 -0
- {copyparty-1.18.4 → copyparty-1.18.6}/copyparty/web/browser2.html +0 -0
- {copyparty-1.18.4 → copyparty-1.18.6}/copyparty/web/cf.html +0 -0
- {copyparty-1.18.4 → copyparty-1.18.6}/copyparty/web/dbg-audio.js.gz +0 -0
- {copyparty-1.18.4 → copyparty-1.18.6}/copyparty/web/dd/2.png +0 -0
- {copyparty-1.18.4 → copyparty-1.18.6}/copyparty/web/dd/3.png +0 -0
- {copyparty-1.18.4 → copyparty-1.18.6}/copyparty/web/dd/4.png +0 -0
- {copyparty-1.18.4 → copyparty-1.18.6}/copyparty/web/dd/5.png +0 -0
- {copyparty-1.18.4 → copyparty-1.18.6}/copyparty/web/dd/__init__.py +0 -0
- {copyparty-1.18.4 → copyparty-1.18.6}/copyparty/web/deps/__init__.py +0 -0
- {copyparty-1.18.4 → copyparty-1.18.6}/copyparty/web/deps/busy.mp3.gz +0 -0
- {copyparty-1.18.4 → copyparty-1.18.6}/copyparty/web/deps/easymde.css.gz +0 -0
- {copyparty-1.18.4 → copyparty-1.18.6}/copyparty/web/deps/easymde.js.gz +0 -0
- {copyparty-1.18.4 → copyparty-1.18.6}/copyparty/web/deps/fuse.py +0 -0
- {copyparty-1.18.4 → copyparty-1.18.6}/copyparty/web/deps/marked.js.gz +0 -0
- {copyparty-1.18.4 → copyparty-1.18.6}/copyparty/web/deps/mini-fa.css.gz +0 -0
- {copyparty-1.18.4 → copyparty-1.18.6}/copyparty/web/deps/mini-fa.woff +0 -0
- {copyparty-1.18.4 → copyparty-1.18.6}/copyparty/web/deps/prism.css.gz +0 -0
- {copyparty-1.18.4 → copyparty-1.18.6}/copyparty/web/deps/prism.js.gz +0 -0
- {copyparty-1.18.4 → copyparty-1.18.6}/copyparty/web/deps/prismd.css.gz +0 -0
- {copyparty-1.18.4 → copyparty-1.18.6}/copyparty/web/deps/scp.woff2 +0 -0
- {copyparty-1.18.4 → copyparty-1.18.6}/copyparty/web/deps/sha512.ac.js.gz +0 -0
- {copyparty-1.18.4 → copyparty-1.18.6}/copyparty/web/deps/sha512.hw.js.gz +0 -0
- {copyparty-1.18.4 → copyparty-1.18.6}/copyparty/web/idp.html +0 -0
- {copyparty-1.18.4 → copyparty-1.18.6}/copyparty/web/md.css.gz +0 -0
- {copyparty-1.18.4 → copyparty-1.18.6}/copyparty/web/md.html +0 -0
- {copyparty-1.18.4 → copyparty-1.18.6}/copyparty/web/md.js.gz +0 -0
- {copyparty-1.18.4 → copyparty-1.18.6}/copyparty/web/md2.css.gz +0 -0
- {copyparty-1.18.4 → copyparty-1.18.6}/copyparty/web/md2.js.gz +0 -0
- {copyparty-1.18.4 → copyparty-1.18.6}/copyparty/web/mde.css.gz +0 -0
- {copyparty-1.18.4 → copyparty-1.18.6}/copyparty/web/mde.html +0 -0
- {copyparty-1.18.4 → copyparty-1.18.6}/copyparty/web/mde.js.gz +0 -0
- {copyparty-1.18.4 → copyparty-1.18.6}/copyparty/web/msg.css.gz +0 -0
- {copyparty-1.18.4 → copyparty-1.18.6}/copyparty/web/msg.html +0 -0
- {copyparty-1.18.4 → copyparty-1.18.6}/copyparty/web/rups.css.gz +0 -0
- {copyparty-1.18.4 → copyparty-1.18.6}/copyparty/web/rups.html +0 -0
- {copyparty-1.18.4 → copyparty-1.18.6}/copyparty/web/rups.js.gz +0 -0
- {copyparty-1.18.4 → copyparty-1.18.6}/copyparty/web/shares.css.gz +0 -0
- {copyparty-1.18.4 → copyparty-1.18.6}/copyparty/web/shares.html +0 -0
- {copyparty-1.18.4 → copyparty-1.18.6}/copyparty/web/shares.js.gz +0 -0
- {copyparty-1.18.4 → copyparty-1.18.6}/copyparty/web/splash.css.gz +0 -0
- {copyparty-1.18.4 → copyparty-1.18.6}/copyparty/web/splash.html +0 -0
- {copyparty-1.18.4 → copyparty-1.18.6}/copyparty/web/splash.js.gz +0 -0
- {copyparty-1.18.4 → copyparty-1.18.6}/copyparty/web/ui.css.gz +0 -0
- {copyparty-1.18.4 → copyparty-1.18.6}/copyparty/web/up2k.js.gz +0 -0
- {copyparty-1.18.4 → copyparty-1.18.6}/copyparty/web/w.hash.js.gz +0 -0
- {copyparty-1.18.4 → copyparty-1.18.6}/copyparty.egg-info/SOURCES.txt +0 -0
- {copyparty-1.18.4 → copyparty-1.18.6}/copyparty.egg-info/dependency_links.txt +0 -0
- {copyparty-1.18.4 → copyparty-1.18.6}/copyparty.egg-info/entry_points.txt +0 -0
- {copyparty-1.18.4 → copyparty-1.18.6}/copyparty.egg-info/requires.txt +0 -0
- {copyparty-1.18.4 → copyparty-1.18.6}/copyparty.egg-info/top_level.txt +0 -0
- {copyparty-1.18.4 → copyparty-1.18.6}/pyproject.toml +0 -0
- {copyparty-1.18.4 → copyparty-1.18.6}/setup.cfg +0 -0
@@ -1,6 +1,6 @@
|
|
1
1
|
Metadata-Version: 2.4
|
2
2
|
Name: copyparty
|
3
|
-
Version: 1.18.
|
3
|
+
Version: 1.18.6
|
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
|
@@ -70,7 +70,7 @@ turn almost any device into a file server with resumable uploads/downloads using
|
|
70
70
|
|
71
71
|
📷 **screenshots:** [browser](#the-browser) // [upload](#uploading) // [unpost](#unpost) // [thumbnails](#thumbnails) // [search](#searching) // [fsearch](#file-search) // [zip-DL](#zip-downloads) // [md-viewer](#markdown-viewer)
|
72
72
|
|
73
|
-
🎬 **videos:** [upload](https://a.ocv.me/pub/demo/pics-vids/up2k.webm) // [cli-upload](https://a.ocv.me/pub/demo/pics-vids/u2cli.webm) // [race-the-beam](https://a.ocv.me/pub/g/nerd-stuff/cpp/2024-0418-race-the-beam.webm)
|
73
|
+
🎬 **videos:** [upload](https://a.ocv.me/pub/demo/pics-vids/up2k.webm) // [cli-upload](https://a.ocv.me/pub/demo/pics-vids/u2cli.webm) // [race-the-beam](https://a.ocv.me/pub/g/nerd-stuff/cpp/2024-0418-race-the-beam.webm) // 👉 **[feature-showcase](https://a.ocv.me/pub/demo/showcase-hq.webm)** ([youtube](https://www.youtube.com/watch?v=15_-hgsX2V0))
|
74
74
|
|
75
75
|
made in Norway 🇳🇴
|
76
76
|
|
@@ -1497,12 +1497,17 @@ if you enable deduplication with `--dedup` then it'll create a symlink instead o
|
|
1497
1497
|
**warning:** when enabling dedup, you should also:
|
1498
1498
|
* enable indexing with `-e2dsa` or volflag `e2dsa` (see [file indexing](#file-indexing) section below); strongly recommended
|
1499
1499
|
* ...and/or `--hardlink-only` to use hardlink-based deduplication instead of symlinks; see explanation below
|
1500
|
+
* ...and/or `--reflink` to use CoW/reflink-based dedup (much safer than hardlink, but OS/FS-dependent)
|
1500
1501
|
|
1501
1502
|
it will not be safe to rename/delete files if you only enable dedup and none of the above; if you enable indexing then it is not *necessary* to also do hardlinks (but you may still want to)
|
1502
1503
|
|
1503
1504
|
by default, deduplication is done based on symlinks (symbolic links); these are tiny files which are pointers to the nearest full copy of the file
|
1504
1505
|
|
1505
|
-
you can choose to use hardlinks instead of softlinks, globally with `--hardlink-only` or volflag `hardlinkonly
|
1506
|
+
you can choose to use hardlinks instead of softlinks, globally with `--hardlink-only` or volflag `hardlinkonly`, and you can choose to use reflinks with `--reflink` or volflag `reflink`
|
1507
|
+
|
1508
|
+
advantages of using reflinks (CoW, copy-on-write):
|
1509
|
+
* entirely safe (when your filesystem supports it correctly); either file can be edited or deleted without affecting other copies
|
1510
|
+
* only linux 5.3 or newer, only python 3.14 or newer, only some filesystems (btrfs probably ok, maybe xfs too, but zfs had bugs)
|
1506
1511
|
|
1507
1512
|
advantages of using hardlinks:
|
1508
1513
|
* hardlinks are more compatible with other software; they behave entirely like regular files
|
@@ -2080,7 +2085,7 @@ some reverse proxies (such as [Caddy](https://caddyserver.com/)) can automatical
|
|
2080
2085
|
* **warning:** nginx-QUIC (HTTP/3) is still experimental and can make uploads much slower, so HTTP/1.1 is recommended for now
|
2081
2086
|
* depending on server/client, HTTP/1.1 can also be 5x faster than HTTP/2
|
2082
2087
|
|
2083
|
-
for improved security (and a 10% performance boost) consider listening on a unix-socket with `-i unix:770:www:/
|
2088
|
+
for improved security (and a 10% performance boost) consider listening on a unix-socket with `-i unix:770:www:/dev/shm/party.sock` (permission `770` means only members of group `www` can access it)
|
2084
2089
|
|
2085
2090
|
example webserver / reverse-proxy configs:
|
2086
2091
|
|
@@ -2301,7 +2306,7 @@ NOTE: there used to be an aur package; this evaporated when copyparty was adopte
|
|
2301
2306
|
|
2302
2307
|
## fedora package
|
2303
2308
|
|
2304
|
-
does not exist yet;
|
2309
|
+
does not exist yet; there are rumours that it is being packaged! keep an eye on this space...
|
2305
2310
|
|
2306
2311
|
|
2307
2312
|
## nix package
|
@@ -12,7 +12,7 @@ turn almost any device into a file server with resumable uploads/downloads using
|
|
12
12
|
|
13
13
|
📷 **screenshots:** [browser](#the-browser) // [upload](#uploading) // [unpost](#unpost) // [thumbnails](#thumbnails) // [search](#searching) // [fsearch](#file-search) // [zip-DL](#zip-downloads) // [md-viewer](#markdown-viewer)
|
14
14
|
|
15
|
-
🎬 **videos:** [upload](https://a.ocv.me/pub/demo/pics-vids/up2k.webm) // [cli-upload](https://a.ocv.me/pub/demo/pics-vids/u2cli.webm) // [race-the-beam](https://a.ocv.me/pub/g/nerd-stuff/cpp/2024-0418-race-the-beam.webm)
|
15
|
+
🎬 **videos:** [upload](https://a.ocv.me/pub/demo/pics-vids/up2k.webm) // [cli-upload](https://a.ocv.me/pub/demo/pics-vids/u2cli.webm) // [race-the-beam](https://a.ocv.me/pub/g/nerd-stuff/cpp/2024-0418-race-the-beam.webm) // 👉 **[feature-showcase](https://a.ocv.me/pub/demo/showcase-hq.webm)** ([youtube](https://www.youtube.com/watch?v=15_-hgsX2V0))
|
16
16
|
|
17
17
|
made in Norway 🇳🇴
|
18
18
|
|
@@ -1439,12 +1439,17 @@ if you enable deduplication with `--dedup` then it'll create a symlink instead o
|
|
1439
1439
|
**warning:** when enabling dedup, you should also:
|
1440
1440
|
* enable indexing with `-e2dsa` or volflag `e2dsa` (see [file indexing](#file-indexing) section below); strongly recommended
|
1441
1441
|
* ...and/or `--hardlink-only` to use hardlink-based deduplication instead of symlinks; see explanation below
|
1442
|
+
* ...and/or `--reflink` to use CoW/reflink-based dedup (much safer than hardlink, but OS/FS-dependent)
|
1442
1443
|
|
1443
1444
|
it will not be safe to rename/delete files if you only enable dedup and none of the above; if you enable indexing then it is not *necessary* to also do hardlinks (but you may still want to)
|
1444
1445
|
|
1445
1446
|
by default, deduplication is done based on symlinks (symbolic links); these are tiny files which are pointers to the nearest full copy of the file
|
1446
1447
|
|
1447
|
-
you can choose to use hardlinks instead of softlinks, globally with `--hardlink-only` or volflag `hardlinkonly
|
1448
|
+
you can choose to use hardlinks instead of softlinks, globally with `--hardlink-only` or volflag `hardlinkonly`, and you can choose to use reflinks with `--reflink` or volflag `reflink`
|
1449
|
+
|
1450
|
+
advantages of using reflinks (CoW, copy-on-write):
|
1451
|
+
* entirely safe (when your filesystem supports it correctly); either file can be edited or deleted without affecting other copies
|
1452
|
+
* only linux 5.3 or newer, only python 3.14 or newer, only some filesystems (btrfs probably ok, maybe xfs too, but zfs had bugs)
|
1448
1453
|
|
1449
1454
|
advantages of using hardlinks:
|
1450
1455
|
* hardlinks are more compatible with other software; they behave entirely like regular files
|
@@ -2022,7 +2027,7 @@ some reverse proxies (such as [Caddy](https://caddyserver.com/)) can automatical
|
|
2022
2027
|
* **warning:** nginx-QUIC (HTTP/3) is still experimental and can make uploads much slower, so HTTP/1.1 is recommended for now
|
2023
2028
|
* depending on server/client, HTTP/1.1 can also be 5x faster than HTTP/2
|
2024
2029
|
|
2025
|
-
for improved security (and a 10% performance boost) consider listening on a unix-socket with `-i unix:770:www:/
|
2030
|
+
for improved security (and a 10% performance boost) consider listening on a unix-socket with `-i unix:770:www:/dev/shm/party.sock` (permission `770` means only members of group `www` can access it)
|
2026
2031
|
|
2027
2032
|
example webserver / reverse-proxy configs:
|
2028
2033
|
|
@@ -2243,7 +2248,7 @@ NOTE: there used to be an aur package; this evaporated when copyparty was adopte
|
|
2243
2248
|
|
2244
2249
|
## fedora package
|
2245
2250
|
|
2246
|
-
does not exist yet;
|
2251
|
+
does not exist yet; there are rumours that it is being packaged! keep an eye on this space...
|
2247
2252
|
|
2248
2253
|
|
2249
2254
|
## nix package
|
@@ -539,14 +539,15 @@ def get_sects():
|
|
539
539
|
when running behind a reverse-proxy, it's recommended to
|
540
540
|
use unix-sockets for improved performance and security;
|
541
541
|
|
542
|
-
\033[32m-i unix:770:www:\033[33m/
|
543
|
-
|
544
|
-
|
542
|
+
\033[32m-i unix:770:www:\033[33m/dev/shm/party.sock\033[0m listens on
|
543
|
+
\033[33m/dev/shm/party.sock\033[0m with permissions \033[33m0770\033[0m;
|
544
|
+
only accessible to members of the \033[33mwww\033[0m group.
|
545
|
+
This is the best approach. Alternatively,
|
545
546
|
|
546
|
-
\033[32m-i unix:777:\033[33m/
|
547
|
-
access it; bad unless it's inside a restricted folder
|
547
|
+
\033[32m-i unix:777:\033[33m/dev/shm/party.sock\033[0m sets perms \033[33m0777\033[0m so anyone
|
548
|
+
can access it; bad unless it's inside a restricted folder
|
548
549
|
|
549
|
-
\033[32m-i unix:\033[33m/
|
550
|
+
\033[32m-i unix:\033[33m/dev/shm/party.sock\033[0m keeps umask-defined permission
|
550
551
|
(usually \033[33m0600\033[0m) and the same user/group as copyparty
|
551
552
|
|
552
553
|
\033[33m-p\033[0m (tcp ports) is ignored for unix sockets
|
@@ -864,31 +865,31 @@ def get_sects():
|
|
864
865
|
|
865
866
|
similarly, \033[33m--chmod-d\033[0m and \033[33mchmod_d\033[0m sets the directory/folder perm
|
866
867
|
|
867
|
-
the value is a three-digit octal number such as
|
868
|
+
the value is a three-digit octal number such as \033[32m755\033[0m, \033[32m750\033[0m, \033[32m644\033[0m, etc.
|
868
869
|
|
869
870
|
first digit = "User"; permission for the unix-user
|
870
871
|
second digit = "Group"; permission for the unix-group
|
871
872
|
third digit = "Other"; permission for all other users/groups
|
872
873
|
|
873
874
|
for files:
|
874
|
-
|
875
|
-
|
876
|
-
|
877
|
-
|
878
|
-
|
879
|
-
|
880
|
-
|
881
|
-
|
875
|
+
\033[32m0\033[0m = \033[35m---\033[0m = no access
|
876
|
+
\033[32m1\033[0m = \033[35m--x\033[0m = can execute the file as a program
|
877
|
+
\033[32m2\033[0m = \033[35m-w-\033[0m = can write
|
878
|
+
\033[32m3\033[0m = \033[35m-wx\033[0m = can write and execute
|
879
|
+
\033[32m4\033[0m = \033[35mr--\033[0m = can read
|
880
|
+
\033[32m5\033[0m = \033[35mr-x\033[0m = can read and execute
|
881
|
+
\033[32m6\033[0m = \033[35mrw-\033[0m = can read and write
|
882
|
+
\033[32m7\033[0m = \033[35mrwx\033[0m = can read, write, execute
|
882
883
|
|
883
884
|
for directories/folders:
|
884
|
-
|
885
|
-
|
886
|
-
|
887
|
-
|
888
|
-
|
889
|
-
|
890
|
-
|
891
|
-
|
885
|
+
\033[32m0\033[0m = \033[35m---\033[0m = no access
|
886
|
+
\033[32m1\033[0m = \033[35m--x\033[0m = can read files in folder but not list contents
|
887
|
+
\033[32m2\033[0m = \033[35m-w-\033[0m = n/a
|
888
|
+
\033[32m3\033[0m = \033[35m-wx\033[0m = can create files but not list
|
889
|
+
\033[32m4\033[0m = \033[35mr--\033[0m = can list, but not read/write
|
890
|
+
\033[32m5\033[0m = \033[35mr-x\033[0m = can list and read files
|
891
|
+
\033[32m6\033[0m = \033[35mrw-\033[0m = n/a
|
892
|
+
\033[32m7\033[0m = \033[35mrwx\033[0m = can read, write, list
|
892
893
|
"""
|
893
894
|
),
|
894
895
|
],
|
@@ -1048,6 +1049,7 @@ def add_upload(ap):
|
|
1048
1049
|
ap2.add_argument("--safe-dedup", metavar="N", type=int, default=50, help="how careful to be when deduplicating files; [\033[32m1\033[0m] = just verify the filesize, [\033[32m50\033[0m] = verify file contents have not been altered (volflag=safededup)")
|
1049
1050
|
ap2.add_argument("--hardlink", action="store_true", help="enable hardlink-based dedup; will fallback on symlinks when that is impossible (across filesystems) (volflag=hardlink)")
|
1050
1051
|
ap2.add_argument("--hardlink-only", action="store_true", help="do not fallback to symlinks when a hardlink cannot be made (volflag=hardlinkonly)")
|
1052
|
+
ap2.add_argument("--reflink", action="store_true", help="enable reflink-based dedup; will fallback on full copies when that is impossible (non-CoW filesystem) (volflag=reflink)")
|
1051
1053
|
ap2.add_argument("--no-dupe", action="store_true", help="reject duplicate files during upload; only matches within the same volume (volflag=nodupe)")
|
1052
1054
|
ap2.add_argument("--no-clone", action="store_true", help="do not use existing data on disk to satisfy dupe uploads; reduces server HDD reads in exchange for much more network load (volflag=noclone)")
|
1053
1055
|
ap2.add_argument("--no-snap", action="store_true", help="disable snapshots -- forget unfinished uploads on shutdown; don't create .hist/up2k.snap files -- abandoned/interrupted uploads must be cleaned up manually")
|
@@ -1280,6 +1282,7 @@ def add_stats(ap):
|
|
1280
1282
|
def add_yolo(ap):
|
1281
1283
|
ap2 = ap.add_argument_group('yolo options')
|
1282
1284
|
ap2.add_argument("--allow-csrf", action="store_true", help="disable csrf protections; let other domains/sites impersonate you through cross-site requests")
|
1285
|
+
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
1286
|
ap2.add_argument("--getmod", action="store_true", help="permit ?move=[...] and ?delete as GET")
|
1284
1287
|
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
1288
|
|
@@ -1327,6 +1330,7 @@ def add_safety(ap):
|
|
1327
1330
|
ap2.add_argument("--no-robots", action="store_true", help="adds http and html headers asking search engines to not index anything (volflag=norobots)")
|
1328
1331
|
ap2.add_argument("--logout", metavar="H", type=float, default=8086.0, help="logout clients after \033[33mH\033[0m hours of inactivity; [\033[32m0.0028\033[0m]=10sec, [\033[32m0.1\033[0m]=6min, [\033[32m24\033[0m]=day, [\033[32m168\033[0m]=week, [\033[32m720\033[0m]=month, [\033[32m8760\033[0m]=year)")
|
1329
1332
|
ap2.add_argument("--ban-pw", metavar="N,W,B", type=u, default="9,60,1440", help="more than \033[33mN\033[0m wrong passwords in \033[33mW\033[0m minutes = ban for \033[33mB\033[0m minutes; disable with [\033[32mno\033[0m]")
|
1333
|
+
ap2.add_argument("--ban-pwc", metavar="N,W,B", type=u, default="5,60,1440", help="more than \033[33mN\033[0m password-changes in \033[33mW\033[0m minutes = ban for \033[33mB\033[0m minutes; disable with [\033[32mno\033[0m]")
|
1330
1334
|
ap2.add_argument("--ban-404", metavar="N,W,B", type=u, default="50,60,1440", help="hitting more than \033[33mN\033[0m 404's in \033[33mW\033[0m minutes = ban for \033[33mB\033[0m minutes; only affects users who cannot see directory listings because their access is either g/G/h")
|
1331
1335
|
ap2.add_argument("--ban-403", metavar="N,W,B", type=u, default="9,2,1440", help="hitting more than \033[33mN\033[0m 403's in \033[33mW\033[0m minutes = ban for \033[33mB\033[0m minutes; [\033[32m1440\033[0m]=day, [\033[32m10080\033[0m]=week, [\033[32m43200\033[0m]=month")
|
1332
1336
|
ap2.add_argument("--ban-422", metavar="N,W,B", type=u, default="9,2,1440", help="hitting more than \033[33mN\033[0m 422's in \033[33mW\033[0m minutes = ban for \033[33mB\033[0m minutes (invalid requests, attempted exploits ++)")
|
@@ -1557,7 +1561,7 @@ def add_ui(ap, retry):
|
|
1557
1561
|
ap2.add_argument("--txt-max", metavar="KiB", type=int, default=64, help="max size of embedded textfiles on ?doc= (anything bigger will be lazy-loaded by JS)")
|
1558
1562
|
ap2.add_argument("--doctitle", metavar="TXT", type=u, default="copyparty @ --name", help="title / service-name to show in html documents")
|
1559
1563
|
ap2.add_argument("--bname", metavar="TXT", type=u, default="--name", help="server name (displayed in filebrowser document title)")
|
1560
|
-
ap2.add_argument("--pb-url", metavar="URL", type=u, default=URL_PRJ, help="powered-by link; disable with \033[33m-
|
1564
|
+
ap2.add_argument("--pb-url", metavar="URL", type=u, default=URL_PRJ, help="powered-by link; disable with \033[33m-nb\033[0m")
|
1561
1565
|
ap2.add_argument("--ver", action="store_true", help="show version on the control panel (incompatible with \033[33m-nb\033[0m)")
|
1562
1566
|
ap2.add_argument("--k304", metavar="NUM", type=int, default=0, help="configure the option to enable/disable k304 on the controlpanel (workaround for buggy reverse-proxies); [\033[32m0\033[0m] = hidden and default-off, [\033[32m1\033[0m] = visible and default-off, [\033[32m2\033[0m] = visible and default-on")
|
1563
1567
|
ap2.add_argument("--no304", metavar="NUM", type=int, default=0, help="configure the option to enable/disable no304 on the controlpanel (workaround for buggy caching in browsers); [\033[32m0\033[0m] = hidden and default-off, [\033[32m1\033[0m] = visible and default-off, [\033[32m2\033[0m] = visible and default-on")
|
@@ -2115,6 +2115,7 @@ class AuthSrv(object):
|
|
2115
2115
|
all_mte = {}
|
2116
2116
|
errors = False
|
2117
2117
|
free_umask = False
|
2118
|
+
have_reflink = False
|
2118
2119
|
for vol in vfs.all_nodes.values():
|
2119
2120
|
if (self.args.e2ds and vol.axs.uwrite) or self.args.e2dsa:
|
2120
2121
|
vol.flags["e2ds"] = True
|
@@ -2198,6 +2199,9 @@ class AuthSrv(object):
|
|
2198
2199
|
if "unlistcr" in vol.flags or "unlistcw" in vol.flags:
|
2199
2200
|
self.args.have_unlistc = True
|
2200
2201
|
|
2202
|
+
if "reflink" in vol.flags:
|
2203
|
+
have_reflink = True
|
2204
|
+
|
2201
2205
|
zs = str(vol.flags.get("tcolor", "")).lstrip("#")
|
2202
2206
|
if len(zs) == 3: # fc5 => ffcc55
|
2203
2207
|
vol.flags["tcolor"] = "".join([x * 2 for x in zs])
|
@@ -2562,6 +2566,13 @@ class AuthSrv(object):
|
|
2562
2566
|
t = "WARNING! The following IdP volumes are mounted below another volume where other users can read and/or write files. This is a SECURITY HAZARD!! When copyparty is restarted, it will not know about these IdP volumes yet. These volumes will then be accessible by an unexpected set of permissions UNTIL one of the users associated with their volume sends a request to the server. RECOMMENDATION: You should create a restricted volume where nobody can read/write files, and make sure that all IdP volumes are configured to appear somewhere below that volume."
|
2563
2567
|
self.log(t + "".join(self.idp_err), 1)
|
2564
2568
|
|
2569
|
+
if have_reflink:
|
2570
|
+
t = "WARNING: Reflink-based dedup was requested, but %s. This will not work; files will be full copies instead."
|
2571
|
+
if sys.version_info < (3, 14):
|
2572
|
+
self.log(t % "your python version is not new enough", 1)
|
2573
|
+
if not sys.platform.startswith("linux"):
|
2574
|
+
self.log(t % "your OS is not Linux", 1)
|
2575
|
+
|
2565
2576
|
self.vfs = vfs
|
2566
2577
|
self.acct = acct
|
2567
2578
|
self.defpw = defpw
|
@@ -52,6 +52,7 @@ def vf_bmap() :
|
|
52
52
|
"og_no_head",
|
53
53
|
"og_s_title",
|
54
54
|
"rand",
|
55
|
+
"reflink",
|
55
56
|
"rmagic",
|
56
57
|
"rss",
|
57
58
|
"wo_up_readme",
|
@@ -168,6 +169,7 @@ flagcats = {
|
|
168
169
|
"dedup": "enable symlink-based file deduplication",
|
169
170
|
"hardlink": "enable hardlink-based file deduplication,\nwith fallback on symlinks when that is impossible",
|
170
171
|
"hardlinkonly": "dedup with hardlink only, never symlink;\nmake a full copy if hardlink is impossible",
|
172
|
+
"reflink": "enable reflink-based file deduplication,\nwith fallback on full copy when that is impossible",
|
171
173
|
"safededup": "verify on-disk data before using it for dedup",
|
172
174
|
"noclone": "take dupe data from clients, even if available on HDD",
|
173
175
|
"nodupe": "rejects existing files (instead of linking/cloning them)",
|
@@ -2900,6 +2900,7 @@ class HttpCli(object):
|
|
2900
2900
|
|
2901
2901
|
ok, msg = self.asrv.chpw(self.conn.hsrv.broker, self.uname, pwd)
|
2902
2902
|
if ok:
|
2903
|
+
self.cbonk(self.conn.hsrv.gpwc, pwd, "pw", "too many password changes")
|
2903
2904
|
ok, msg = self.get_pwd_cookie(pwd)
|
2904
2905
|
if ok:
|
2905
2906
|
msg = "new password OK"
|
@@ -2981,12 +2982,20 @@ class HttpCli(object):
|
|
2981
2982
|
# reset both plaintext and tls
|
2982
2983
|
# (only affects active tls cookies when tls)
|
2983
2984
|
for k in ("cppwd", "cppws") if self.is_https else ("cppwd",):
|
2984
|
-
ck = gencookie(k, pwd, self.args.R, False)
|
2985
|
+
ck = gencookie(k, pwd, self.args.R, self.args.cookie_lax, False)
|
2985
2986
|
self.out_headerlist.append(("Set-Cookie", ck))
|
2986
2987
|
self.out_headers.pop("Set-Cookie", None) # drop keepalive
|
2987
2988
|
else:
|
2988
2989
|
k = "cppws" if self.is_https else "cppwd"
|
2989
|
-
ck = gencookie(
|
2990
|
+
ck = gencookie(
|
2991
|
+
k,
|
2992
|
+
pwd,
|
2993
|
+
self.args.R,
|
2994
|
+
self.args.cookie_lax,
|
2995
|
+
self.is_https,
|
2996
|
+
dur,
|
2997
|
+
"; HttpOnly",
|
2998
|
+
)
|
2990
2999
|
self.out_headers["Set-Cookie"] = ck
|
2991
3000
|
|
2992
3001
|
return dur > 0, msg
|
@@ -3002,6 +3011,9 @@ class HttpCli(object):
|
|
3002
3011
|
self.gctx = vpath
|
3003
3012
|
vpath = undot(vpath)
|
3004
3013
|
vfs, rem = self.asrv.vfs.get(vpath, self.uname, False, True)
|
3014
|
+
if "nosub" in vfs.flags:
|
3015
|
+
raise Pebkac(403, "mkdir is forbidden below this folder")
|
3016
|
+
|
3005
3017
|
rem = sanitize_vpath(rem, "/")
|
3006
3018
|
fn = vfs.canonical(rem)
|
3007
3019
|
|
@@ -4843,13 +4855,21 @@ class HttpCli(object):
|
|
4843
4855
|
def tx_svcs(self) :
|
4844
4856
|
aname = re.sub("[^0-9a-zA-Z]+", "", self.args.vname) or "a"
|
4845
4857
|
ep = self.host
|
4846
|
-
|
4847
|
-
|
4848
|
-
|
4849
|
-
|
4850
|
-
|
4851
|
-
|
4852
|
-
|
4858
|
+
sep = "]:" if "]" in ep else ":"
|
4859
|
+
if sep in ep:
|
4860
|
+
host, hport = ep.rsplit(":", 1)
|
4861
|
+
hport = ":" + hport
|
4862
|
+
else:
|
4863
|
+
host = ep
|
4864
|
+
hport = ""
|
4865
|
+
|
4866
|
+
if host.endswith(".local") and self.args.zm and not self.args.rclone_mdns:
|
4867
|
+
rip = self.conn.hsrv.nm.map(self.ip) or host
|
4868
|
+
if ":" in rip and "[" not in rip:
|
4869
|
+
rip = "[%s]" % (rip,)
|
4870
|
+
else:
|
4871
|
+
rip = host
|
4872
|
+
|
4853
4873
|
# safer than html_escape/quotep since this avoids both XSS and shell-stuff
|
4854
4874
|
pw = re.sub(r"[<>&$?`\"']", "_", self.pw or "hunter2")
|
4855
4875
|
vp = re.sub(r"[<>&$?`\"']", "_", self.uparam["hc"] or "").lstrip("/")
|
@@ -5018,7 +5038,7 @@ class HttpCli(object):
|
|
5018
5038
|
def setck(self) :
|
5019
5039
|
k, v = self.uparam["setck"].split("=", 1)
|
5020
5040
|
t = 0 if v in ("", "x") else 86400 * 299
|
5021
|
-
ck = gencookie(k, v, self.args.R, False, t)
|
5041
|
+
ck = gencookie(k, v, self.args.R, self.args.cookie_lax, False, t)
|
5022
5042
|
self.out_headerlist.append(("Set-Cookie", ck))
|
5023
5043
|
if "cc" in self.ouparam:
|
5024
5044
|
self.redirect("", "?h#cc")
|
@@ -5030,7 +5050,7 @@ class HttpCli(object):
|
|
5030
5050
|
for k in ALL_COOKIES:
|
5031
5051
|
if k not in self.cookies:
|
5032
5052
|
continue
|
5033
|
-
cookie = gencookie(k, "x", self.args.R, False)
|
5053
|
+
cookie = gencookie(k, "x", self.args.R, self.args.cookie_lax, False)
|
5034
5054
|
self.out_headerlist.append(("Set-Cookie", cookie))
|
5035
5055
|
|
5036
5056
|
self.redirect("", "?h#cc")
|
@@ -120,6 +120,7 @@ class HttpSrv(object):
|
|
120
120
|
self.nm = NetMap([], [])
|
121
121
|
self.ssdp = None
|
122
122
|
self.gpwd = Garda(self.args.ban_pw)
|
123
|
+
self.gpwc = Garda(self.args.ban_pwc)
|
123
124
|
self.g404 = Garda(self.args.ban_404)
|
124
125
|
self.g403 = Garda(self.args.ban_403)
|
125
126
|
self.g422 = Garda(self.args.ban_422, False)
|
@@ -160,12 +160,13 @@ def au_unpk(
|
|
160
160
|
znil = [x for x in znil if "cover" in x[0]] or znil
|
161
161
|
znil = [x for x in znil if CBZ_01.search(x[0])] or znil
|
162
162
|
t = "cbz: %d files, %d hits" % (nf, len(znil))
|
163
|
+
using = sorted(znil)[0][1].filename
|
163
164
|
if znil:
|
164
|
-
t += ", using " +
|
165
|
+
t += ", using " + using
|
165
166
|
log(t)
|
166
167
|
if not znil:
|
167
168
|
raise Exception("no images inside cbz")
|
168
|
-
fi = zf.open(
|
169
|
+
fi = zf.open(using)
|
169
170
|
|
170
171
|
else:
|
171
172
|
raise Exception("unknown compression %s" % (pk,))
|
@@ -162,6 +162,7 @@ class SvcHub(object):
|
|
162
162
|
# for non-http clients (ftp, tftp)
|
163
163
|
self.bans = {}
|
164
164
|
self.gpwd = Garda(self.args.ban_pw)
|
165
|
+
self.gpwc = Garda(self.args.ban_pwc)
|
165
166
|
self.g404 = Garda(self.args.ban_404)
|
166
167
|
self.g403 = Garda(self.args.ban_403)
|
167
168
|
self.g422 = Garda(self.args.ban_422, False)
|
@@ -3460,6 +3460,8 @@ class Up2k(object):
|
|
3460
3460
|
|
3461
3461
|
linked = False
|
3462
3462
|
try:
|
3463
|
+
if "reflink" in flags:
|
3464
|
+
raise Exception("reflink")
|
3463
3465
|
if not is_mv and not flags.get("dedup"):
|
3464
3466
|
raise Exception("dedup is disabled in config")
|
3465
3467
|
|
@@ -3516,7 +3518,8 @@ class Up2k(object):
|
|
3516
3518
|
|
3517
3519
|
linked = True
|
3518
3520
|
except Exception as ex:
|
3519
|
-
|
3521
|
+
if str(ex) != "reflink":
|
3522
|
+
self.log("cannot link; creating copy: " + repr(ex))
|
3520
3523
|
if bos.path.isfile(src):
|
3521
3524
|
csrc = src
|
3522
3525
|
elif fsrc and bos.path.isfile(fsrc):
|
@@ -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(
|
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
|
1962
|
-
return t % (
|
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) :
|
Binary file
|
@@ -36,7 +36,7 @@
|
|
36
36
|
<span class="os lin mac">
|
37
37
|
{% if accs %}<code><b id="pw0">{{ pw }}</b></code>=password, {% endif %}<code><b>mp</b></code>=mountpoint
|
38
38
|
</span>
|
39
|
-
<a href="#" id="setpw">use real password</a>
|
39
|
+
{% if accs %}<a href="#" id="setpw">use real password</a>{% endif %}
|
40
40
|
</p>
|
41
41
|
|
42
42
|
|
Binary file
|
Binary file
|
@@ -1,6 +1,6 @@
|
|
1
1
|
Metadata-Version: 2.4
|
2
2
|
Name: copyparty
|
3
|
-
Version: 1.18.
|
3
|
+
Version: 1.18.6
|
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
|
@@ -70,7 +70,7 @@ turn almost any device into a file server with resumable uploads/downloads using
|
|
70
70
|
|
71
71
|
📷 **screenshots:** [browser](#the-browser) // [upload](#uploading) // [unpost](#unpost) // [thumbnails](#thumbnails) // [search](#searching) // [fsearch](#file-search) // [zip-DL](#zip-downloads) // [md-viewer](#markdown-viewer)
|
72
72
|
|
73
|
-
🎬 **videos:** [upload](https://a.ocv.me/pub/demo/pics-vids/up2k.webm) // [cli-upload](https://a.ocv.me/pub/demo/pics-vids/u2cli.webm) // [race-the-beam](https://a.ocv.me/pub/g/nerd-stuff/cpp/2024-0418-race-the-beam.webm)
|
73
|
+
🎬 **videos:** [upload](https://a.ocv.me/pub/demo/pics-vids/up2k.webm) // [cli-upload](https://a.ocv.me/pub/demo/pics-vids/u2cli.webm) // [race-the-beam](https://a.ocv.me/pub/g/nerd-stuff/cpp/2024-0418-race-the-beam.webm) // 👉 **[feature-showcase](https://a.ocv.me/pub/demo/showcase-hq.webm)** ([youtube](https://www.youtube.com/watch?v=15_-hgsX2V0))
|
74
74
|
|
75
75
|
made in Norway 🇳🇴
|
76
76
|
|
@@ -1497,12 +1497,17 @@ if you enable deduplication with `--dedup` then it'll create a symlink instead o
|
|
1497
1497
|
**warning:** when enabling dedup, you should also:
|
1498
1498
|
* enable indexing with `-e2dsa` or volflag `e2dsa` (see [file indexing](#file-indexing) section below); strongly recommended
|
1499
1499
|
* ...and/or `--hardlink-only` to use hardlink-based deduplication instead of symlinks; see explanation below
|
1500
|
+
* ...and/or `--reflink` to use CoW/reflink-based dedup (much safer than hardlink, but OS/FS-dependent)
|
1500
1501
|
|
1501
1502
|
it will not be safe to rename/delete files if you only enable dedup and none of the above; if you enable indexing then it is not *necessary* to also do hardlinks (but you may still want to)
|
1502
1503
|
|
1503
1504
|
by default, deduplication is done based on symlinks (symbolic links); these are tiny files which are pointers to the nearest full copy of the file
|
1504
1505
|
|
1505
|
-
you can choose to use hardlinks instead of softlinks, globally with `--hardlink-only` or volflag `hardlinkonly
|
1506
|
+
you can choose to use hardlinks instead of softlinks, globally with `--hardlink-only` or volflag `hardlinkonly`, and you can choose to use reflinks with `--reflink` or volflag `reflink`
|
1507
|
+
|
1508
|
+
advantages of using reflinks (CoW, copy-on-write):
|
1509
|
+
* entirely safe (when your filesystem supports it correctly); either file can be edited or deleted without affecting other copies
|
1510
|
+
* only linux 5.3 or newer, only python 3.14 or newer, only some filesystems (btrfs probably ok, maybe xfs too, but zfs had bugs)
|
1506
1511
|
|
1507
1512
|
advantages of using hardlinks:
|
1508
1513
|
* hardlinks are more compatible with other software; they behave entirely like regular files
|
@@ -2080,7 +2085,7 @@ some reverse proxies (such as [Caddy](https://caddyserver.com/)) can automatical
|
|
2080
2085
|
* **warning:** nginx-QUIC (HTTP/3) is still experimental and can make uploads much slower, so HTTP/1.1 is recommended for now
|
2081
2086
|
* depending on server/client, HTTP/1.1 can also be 5x faster than HTTP/2
|
2082
2087
|
|
2083
|
-
for improved security (and a 10% performance boost) consider listening on a unix-socket with `-i unix:770:www:/
|
2088
|
+
for improved security (and a 10% performance boost) consider listening on a unix-socket with `-i unix:770:www:/dev/shm/party.sock` (permission `770` means only members of group `www` can access it)
|
2084
2089
|
|
2085
2090
|
example webserver / reverse-proxy configs:
|
2086
2091
|
|
@@ -2301,7 +2306,7 @@ NOTE: there used to be an aur package; this evaporated when copyparty was adopte
|
|
2301
2306
|
|
2302
2307
|
## fedora package
|
2303
2308
|
|
2304
|
-
does not exist yet;
|
2309
|
+
does not exist yet; there are rumours that it is being packaged! keep an eye on this space...
|
2305
2310
|
|
2306
2311
|
|
2307
2312
|
## nix package
|
Binary file
|
Binary file
|
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
|
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
|
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
|
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
|
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
|
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
|
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
|