copyparty 1.18.9__py3-none-any.whl → 1.19.0__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/__init__.py +0 -4
- copyparty/__main__.py +85 -69
- copyparty/__version__.py +3 -3
- copyparty/authsrv.py +31 -2
- copyparty/cfg.py +2 -0
- copyparty/ftpd.py +7 -2
- copyparty/httpcli.py +87 -31
- copyparty/httpsrv.py +2 -1
- copyparty/mtag.py +5 -1
- copyparty/multicast.py +1 -5
- copyparty/pwhash.py +4 -0
- copyparty/svchub.py +2 -11
- copyparty/tcpsrv.py +16 -6
- copyparty/tftpd.py +1 -1
- copyparty/th_cli.py +2 -2
- copyparty/th_srv.py +68 -2
- copyparty/up2k.py +21 -18
- copyparty/util.py +11 -0
- copyparty/web/browser.css.gz +0 -0
- copyparty/web/browser.js.gz +0 -0
- copyparty/web/md2.js.gz +0 -0
- copyparty/web/mde.js.gz +0 -0
- copyparty/web/rups.html +1 -8
- copyparty/web/rups.js.gz +0 -0
- copyparty/web/shares.js.gz +0 -0
- copyparty/web/splash.html +6 -1
- copyparty/web/splash.js.gz +0 -0
- copyparty/web/svcs.html +1 -0
- copyparty/web/svcs.js.gz +0 -0
- copyparty/web/up2k.js.gz +0 -0
- copyparty/web/util.js.gz +0 -0
- {copyparty-1.18.9.dist-info → copyparty-1.19.0.dist-info}/METADATA +50 -9
- {copyparty-1.18.9.dist-info → copyparty-1.19.0.dist-info}/RECORD +37 -42
- copyparty/web/dd/2.png +0 -0
- copyparty/web/dd/3.png +0 -0
- copyparty/web/dd/4.png +0 -0
- copyparty/web/dd/5.png +0 -0
- copyparty/web/dd/__init__.py +0 -0
- {copyparty-1.18.9.dist-info → copyparty-1.19.0.dist-info}/WHEEL +0 -0
- {copyparty-1.18.9.dist-info → copyparty-1.19.0.dist-info}/entry_points.txt +0 -0
- {copyparty-1.18.9.dist-info → copyparty-1.19.0.dist-info}/licenses/LICENSE +0 -0
- {copyparty-1.18.9.dist-info → copyparty-1.19.0.dist-info}/top_level.txt +0 -0
copyparty/up2k.py
CHANGED
@@ -83,7 +83,10 @@ if TYPE_CHECKING:
|
|
83
83
|
from .svchub import SvcHub
|
84
84
|
|
85
85
|
zsg = "avif,avifs,bmp,gif,heic,heics,heif,heifs,ico,j2p,j2k,jp2,jpeg,jpg,jpx,png,tga,tif,tiff,webp"
|
86
|
-
|
86
|
+
ICV_EXTS = set(zsg.split(","))
|
87
|
+
|
88
|
+
zsg = "3gp,asf,av1,avc,avi,flv,m4v,mjpeg,mjpg,mkv,mov,mp4,mpeg,mpeg2,mpegts,mpg,mpg2,mts,nut,ogm,ogv,rm,vob,webm,wmv"
|
89
|
+
VCV_EXTS = set(zsg.split(","))
|
87
90
|
|
88
91
|
zsg = "nohash noidx xdev xvol"
|
89
92
|
VF_AFFECTS_INDEXING = set(zsg.split(" "))
|
@@ -368,11 +371,12 @@ class Up2k(object):
|
|
368
371
|
if ineed == ihash or not ineed:
|
369
372
|
continue
|
370
373
|
|
374
|
+
poke = job["poke"]
|
371
375
|
zt = (
|
372
376
|
ineed / ihash,
|
373
377
|
job["size"],
|
374
|
-
int(job
|
375
|
-
int(
|
378
|
+
int(job.get("t0c", poke)),
|
379
|
+
int(poke),
|
376
380
|
djoin(vtop, job["prel"], job["name"]),
|
377
381
|
)
|
378
382
|
ret.append(zt)
|
@@ -1470,7 +1474,7 @@ class Up2k(object):
|
|
1470
1474
|
unreg = []
|
1471
1475
|
files = []
|
1472
1476
|
fat32 = True
|
1473
|
-
cv = ""
|
1477
|
+
cv = vcv = ""
|
1474
1478
|
|
1475
1479
|
th_cvd = self.args.th_coversd
|
1476
1480
|
th_cvds = self.args.th_coversd_set
|
@@ -1564,25 +1568,24 @@ class Up2k(object):
|
|
1564
1568
|
|
1565
1569
|
rsz += sz
|
1566
1570
|
files.append((sz, lmod, iname))
|
1567
|
-
|
1568
|
-
|
1569
|
-
|
1570
|
-
|
1571
|
+
if sz:
|
1572
|
+
liname = iname.lower()
|
1573
|
+
ext = liname.rsplit(".", 1)[-1]
|
1574
|
+
if (
|
1571
1575
|
liname in th_cvds
|
1572
|
-
or (
|
1573
|
-
|
1574
|
-
and liname.rsplit(".", 1)[-1] in CV_EXTS
|
1575
|
-
and not iname.startswith(".")
|
1576
|
-
)
|
1577
|
-
)
|
1578
|
-
and (
|
1576
|
+
or (not cv and ext in ICV_EXTS and not iname.startswith("."))
|
1577
|
+
) and (
|
1579
1578
|
not cv
|
1580
1579
|
or liname not in th_cvds
|
1581
1580
|
or cv.lower() not in th_cvds
|
1582
1581
|
or th_cvd.index(liname) < th_cvd.index(cv.lower())
|
1583
|
-
)
|
1584
|
-
|
1585
|
-
|
1582
|
+
):
|
1583
|
+
cv = iname
|
1584
|
+
elif not vcv and ext in VCV_EXTS and not iname.startswith("."):
|
1585
|
+
vcv = iname
|
1586
|
+
|
1587
|
+
if not cv:
|
1588
|
+
cv = vcv
|
1586
1589
|
|
1587
1590
|
if not self.args.no_dirsz:
|
1588
1591
|
tnf += len(files)
|
copyparty/util.py
CHANGED
@@ -2895,6 +2895,17 @@ def justcopy(
|
|
2895
2895
|
return tlen, "checksum-disabled", "checksum-disabled"
|
2896
2896
|
|
2897
2897
|
|
2898
|
+
def eol_conv(
|
2899
|
+
fin , conv
|
2900
|
+
) :
|
2901
|
+
crlf = conv.lower() == "crlf"
|
2902
|
+
for buf in fin:
|
2903
|
+
buf = buf.replace(b"\r", b"")
|
2904
|
+
if crlf:
|
2905
|
+
buf = buf.replace(b"\n", b"\r\n")
|
2906
|
+
yield buf
|
2907
|
+
|
2908
|
+
|
2898
2909
|
def hashcopy(
|
2899
2910
|
fin ,
|
2900
2911
|
fout ,
|
copyparty/web/browser.css.gz
CHANGED
Binary file
|
copyparty/web/browser.js.gz
CHANGED
Binary file
|
copyparty/web/md2.js.gz
CHANGED
Binary file
|
copyparty/web/mde.js.gz
CHANGED
Binary file
|
copyparty/web/rups.html
CHANGED
@@ -19,14 +19,7 @@
|
|
19
19
|
<a href="{{ r }}/?h">control-panel</a>
|
20
20
|
Filter: <input type="text" id="filter" size="20" placeholder="documents/passwords" />
|
21
21
|
<span id="hits"></span>
|
22
|
-
<
|
23
|
-
<th>size</th>
|
24
|
-
<th>who</th>
|
25
|
-
<th>when</th>
|
26
|
-
<th>age</th>
|
27
|
-
<th>dir</th>
|
28
|
-
<th>file</th>
|
29
|
-
</tr></thead><tbody id="tb"></tbody></table>
|
22
|
+
<div id="tw"></div>
|
30
23
|
</div>
|
31
24
|
<a href="#" id="repl">π</a>
|
32
25
|
<script>
|
copyparty/web/rups.js.gz
CHANGED
Binary file
|
copyparty/web/shares.js.gz
CHANGED
Binary file
|
copyparty/web/splash.html
CHANGED
@@ -15,7 +15,7 @@
|
|
15
15
|
<body>
|
16
16
|
<div id="wrap">
|
17
17
|
{%- if not in_shr %}
|
18
|
-
<a id="a" href="{{ r }}/?h" class="af">refresh</a>
|
18
|
+
<a id="a" href="{{ r }}/?h{{ re }}" class="af">refresh</a>
|
19
19
|
<a id="v" href="{{ r }}/?hc" class="af">connect</a>
|
20
20
|
|
21
21
|
{%- if this.uname == '*' %}
|
@@ -120,7 +120,12 @@
|
|
120
120
|
<div>
|
121
121
|
<form id="lf" method="post" enctype="multipart/form-data" action="{{ r }}/{{ qvpath }}">
|
122
122
|
<input type="hidden" id="la" name="act" value="login" />
|
123
|
+
{% if this.args.usernames %}
|
124
|
+
<input type="text" id="lu" name="uname" placeholder=" username" size="12" />
|
125
|
+
<input type="password" id="lp" name="cppwd" placeholder=" password" size="12" />
|
126
|
+
{% else %}
|
123
127
|
<input type="password" id="lp" name="cppwd" placeholder=" password" />
|
128
|
+
{% endif %}
|
124
129
|
<input type="hidden" name="uhash" id="uhash" value="x" />
|
125
130
|
<input type="submit" id="ls" value="login" />
|
126
131
|
{% if chpw %}
|
copyparty/web/splash.js.gz
CHANGED
Binary file
|
copyparty/web/svcs.html
CHANGED
copyparty/web/svcs.js.gz
CHANGED
Binary file
|
copyparty/web/up2k.js.gz
CHANGED
Binary file
|
copyparty/web/util.js.gz
CHANGED
Binary file
|
@@ -1,6 +1,6 @@
|
|
1
1
|
Metadata-Version: 2.4
|
2
2
|
Name: copyparty
|
3
|
-
Version: 1.
|
3
|
+
Version: 1.19.0
|
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
|
@@ -37,6 +37,13 @@ Requires-Python: >=3.3
|
|
37
37
|
Description-Content-Type: text/markdown
|
38
38
|
License-File: LICENSE
|
39
39
|
Requires-Dist: Jinja2
|
40
|
+
Provides-Extra: all
|
41
|
+
Requires-Dist: argon2-cffi; extra == "all"
|
42
|
+
Requires-Dist: partftpy>=0.4.0; extra == "all"
|
43
|
+
Requires-Dist: Pillow; extra == "all"
|
44
|
+
Requires-Dist: pyftpdlib; extra == "all"
|
45
|
+
Requires-Dist: pyopenssl; extra == "all"
|
46
|
+
Requires-Dist: pyzmq; extra == "all"
|
40
47
|
Provides-Extra: thumbnails
|
41
48
|
Requires-Dist: Pillow; extra == "thumbnails"
|
42
49
|
Provides-Extra: thumbnails2
|
@@ -205,6 +212,8 @@ made in Norway 🇳🇴
|
|
205
212
|
|
206
213
|
just run **[copyparty-sfx.py](https://github.com/9001/copyparty/releases/latest/download/copyparty-sfx.py)** -- that's it! 🎉
|
207
214
|
|
215
|
+
> ℹ️ the sfx is a [self-extractor](https://github.com/9001/copyparty/issues/270) which unpacks an embedded `tar.gz` into `$TEMP` -- if this looks too scary, you can use the [zipapp](#zipapp) which has slightly worse performance
|
216
|
+
|
208
217
|
* or install through [pypi](https://pypi.org/project/copyparty/): `python3 -m pip install --user -U copyparty`
|
209
218
|
* or if you cannot install python, you can use [copyparty.exe](#copypartyexe) instead
|
210
219
|
* or install [on arch](#arch-package) ╱ [on NixOS](#nixos-module) ╱ [through nix](#nix-package)
|
@@ -493,6 +502,7 @@ upgrade notes
|
|
493
502
|
|
494
503
|
* can I link someone to a password-protected volume/file by including the password in the URL?
|
495
504
|
* yes, by adding `?pw=hunter2` to the end; replace `?` with `&` if there are parameters in the URL already, meaning it contains a `?` near the end
|
505
|
+
* if you have enabled `--usernames` then do `?pw=username:password` instead
|
496
506
|
|
497
507
|
* how do I stop `.hist` folders from appearing everywhere on my HDD?
|
498
508
|
* by default, a `.hist` folder is created inside each volume for the filesystem index, thumbnails, audio transcodes, and markdown document history. Use the `--hist` global-option or the `hist` volflag to move it somewhere else; see [database location](#database-location)
|
@@ -571,12 +581,17 @@ anyone trying to bruteforce a password gets banned according to `--ban-pw`; defa
|
|
571
581
|
|
572
582
|
and if you want to use config files instead of commandline args (good!) then here's the same examples as a configfile; save it as `foobar.conf` and use it like this: `python copyparty-sfx.py -c foobar.conf`
|
573
583
|
|
584
|
+
* you can also `PRTY_CONFIG=foobar.conf python copyparty-sfx.py` (convenient in docker etc)
|
585
|
+
|
574
586
|
```yaml
|
575
587
|
[accounts]
|
576
588
|
u1: p1 # create account "u1" with password "p1"
|
577
589
|
u2: p2 # (note that comments must have
|
578
590
|
u3: p3 # two spaces before the # sign)
|
579
591
|
|
592
|
+
[groups]
|
593
|
+
g1: u1, u2 # create a group
|
594
|
+
|
580
595
|
[/] # this URL will be mapped to...
|
581
596
|
/srv # ...this folder on the server filesystem
|
582
597
|
accs:
|
@@ -586,6 +601,7 @@ and if you want to use config files instead of commandline args (good!) then her
|
|
586
601
|
/mnt/music # which is mapped to this folder
|
587
602
|
accs:
|
588
603
|
r: u1, u2 # only these accounts can read,
|
604
|
+
r: @g1 # (exactly the same, just with a group instead)
|
589
605
|
rw: u3 # and only u3 can read-write
|
590
606
|
|
591
607
|
[/inc]
|
@@ -1066,6 +1082,7 @@ a feed example: https://cd.ocv.me/a/d2/d22/?rss&fext=mp3
|
|
1066
1082
|
url parameters:
|
1067
1083
|
|
1068
1084
|
* `pw=hunter2` for password auth
|
1085
|
+
* if you enabled `--usernames` then do `pw=username:password` instead
|
1069
1086
|
* `recursive` to also include subfolders
|
1070
1087
|
* `title=foo` changes the feed title (default: folder name)
|
1071
1088
|
* `fext=mp3,opus` only include mp3 and opus files (default: all)
|
@@ -1142,6 +1159,9 @@ open the `[🎺]` media-player-settings tab to configure it,
|
|
1142
1159
|
* `[awo]` is `opus` in a `weba` file, good for iPhones (iOS 17.5 and newer) but Apple is still fixing some state-confusion bugs as of iOS 18.2.1
|
1143
1160
|
* `[caf]` is `opus` in a `caf` file, good for iPhones (iOS 11 through 17), technically unsupported by Apple but works for the most part
|
1144
1161
|
* `[mp3]` -- the myth, the legend, the undying master of mediocre sound quality that definitely works everywhere
|
1162
|
+
* `[flac]` -- lossless but compressed, for LAN and/or fiber playback on electrostatic headphones
|
1163
|
+
* `[wav]` -- lossless and uncompressed, for LAN and/or fiber playback on electrostatic headphones connected to very old equipment
|
1164
|
+
* `flac` and `wav` must be enabled with `--allow-flac` / `--allow-wav` to allow spending the disk space
|
1145
1165
|
* "tint" reduces the contrast of the playback bar
|
1146
1166
|
|
1147
1167
|
|
@@ -1276,7 +1296,7 @@ using arguments or config files, or a mix of both:
|
|
1276
1296
|
|
1277
1297
|
**NB:** as humongous as this readme is, there is also a lot of undocumented features. Run copyparty with `--help` to see all available global options; all of those can be used in the `[global]` section of config files, and everything listed in `--help-flags` can be used in volumes as volflags.
|
1278
1298
|
* if running in docker/podman, try this: `docker run --rm -it copyparty/ac --help`
|
1279
|
-
* or see this
|
1299
|
+
* or see this: https://ocv.me/copyparty/helptext.html
|
1280
1300
|
* or if you prefer plaintext, https://ocv.me/copyparty/helptext.txt
|
1281
1301
|
|
1282
1302
|
|
@@ -1348,6 +1368,7 @@ an FTP server can be started using `--ftp 3921`, and/or `--ftps` for explicit T
|
|
1348
1368
|
* if you enable both `ftp` and `ftps`, the port-range will be divided in half
|
1349
1369
|
* some older software (filezilla on debian-stable) cannot passive-mode with TLS
|
1350
1370
|
* login with any username + your password, or put your password in the username field
|
1371
|
+
* unless you enabled `--usernames`
|
1351
1372
|
|
1352
1373
|
some recommended FTP / FTPS clients; `wark` = example password:
|
1353
1374
|
* https://winscp.net/eng/download.php
|
@@ -1365,6 +1386,7 @@ click the [connect](http://127.0.0.1:3923/?hc) button in the control-panel to se
|
|
1365
1386
|
|
1366
1387
|
general usage:
|
1367
1388
|
* login with any username + your password, or put your password in the username field (password field can be empty/whatever)
|
1389
|
+
* unless you enabled `--usernames`
|
1368
1390
|
|
1369
1391
|
on macos, connect from finder:
|
1370
1392
|
* [Go] -> [Connect to Server...] -> http://192.168.123.1:3923/
|
@@ -1380,6 +1402,7 @@ using the GUI (winXP or later):
|
|
1380
1402
|
* rightclick [my computer] -> [map network drive] -> Folder: `http://192.168.123.1:3923/`
|
1381
1403
|
* on winXP only, click the `Sign up for online storage` hyperlink instead and put the URL there
|
1382
1404
|
* providing your password as the username is recommended; the password field can be anything or empty
|
1405
|
+
* unless you enabled `--usernames`
|
1383
1406
|
|
1384
1407
|
the webdav client that's built into windows has the following list of bugs; you can avoid all of these by connecting with rclone instead:
|
1385
1408
|
* win7+ doesn't actually send the password to the server when reauthenticating after a reboot unless you first try to login with an incorrect password and then switch to the correct password
|
@@ -1437,6 +1460,7 @@ some **BIG WARNINGS** specific to SMB/CIFS, in decreasing importance:
|
|
1437
1460
|
* the smb backend is not fully integrated with vfs, meaning there could be security issues (path traversal). Please use `--smb-port` (see below) and [prisonparty](./bin/prisonparty.sh) or [bubbleparty](./bin/bubbleparty.sh)
|
1438
1461
|
* account passwords work per-volume as expected, and so does account permissions (read/write/move/delete), but `--smbw` must be given to allow write-access from smb
|
1439
1462
|
* [shadowing](#shadowing) probably works as expected but no guarantees
|
1463
|
+
* not compatible with pw-hashing or `--usernames`
|
1440
1464
|
|
1441
1465
|
and some minor issues,
|
1442
1466
|
* clients only see the first ~400 files in big folders;
|
@@ -1483,6 +1507,8 @@ note that this disables hotlinking because the opengraph spec demands it; to sne
|
|
1483
1507
|
|
1484
1508
|
you can also hotlink files regardless by appending `?raw` to the url
|
1485
1509
|
|
1510
|
+
> WARNING: if you plan to use WebDAV, then `--og-ua` / `og_ua` must be configured
|
1511
|
+
|
1486
1512
|
if you want to entirely replace the copyparty response with your own jinja2 template, give the template filepath to `--og-tpl` or volflag `og_tpl` (all members of `HttpCli` are available through the `this` object)
|
1487
1513
|
|
1488
1514
|
|
@@ -1939,6 +1965,8 @@ you can disable the built-in password-based login system, and instead replace it
|
|
1939
1965
|
|
1940
1966
|
* the regular config-defined users will be used as a fallback for requests which don't include a valid (trusted) IdP username header
|
1941
1967
|
|
1968
|
+
* if your IdP-server is slow, consider `--idp-cookie` and let requests with the cookie `cppws` bypass the IdP; experimental sessions-based feature added for a party
|
1969
|
+
|
1942
1970
|
some popular identity providers are [Authelia](https://www.authelia.com/) (config-file based) and [authentik](https://goauthentik.io/) (GUI-based, more complex)
|
1943
1971
|
|
1944
1972
|
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)
|
@@ -2101,7 +2129,11 @@ you can either:
|
|
2101
2129
|
* or do location-based proxying, using `--rp-loc=/stuff` to tell copyparty where it is mounted -- has a slight performance cost and higher chance of bugs
|
2102
2130
|
* if copyparty says `incorrect --rp-loc or webserver config; expected vpath starting with [...]` it's likely because the webserver is stripping away the proxy location from the request URLs -- see the `ProxyPass` in the apache example below
|
2103
2131
|
|
2104
|
-
when running behind a reverse-proxy (this includes services like cloudflare), it is important to configure real-ip correctly, as many features rely on knowing the client's IP.
|
2132
|
+
when running behind a reverse-proxy (this includes services like cloudflare), it is important to configure real-ip correctly, as many features rely on knowing the client's IP. The best/safest approach is to configure your reverse-proxy so it gives copyparty a header which only contains the client's true/real IP-address, and then setting `--xff-hdr theHeaderName --rproxy 1` but alternatively, if you want/need to let copyparty handle this, look out for red and yellow log messages which explain how to do that. Basically, the log will say this:
|
2133
|
+
|
2134
|
+
> set `--xff-hdr` to the name of the http-header to read the IP from (usually `x-forwarded-for`, but cloudflare uses `cf-connecting-ip`), and then `--xff-src` to the IP of the reverse-proxy so copyparty will trust the xff-hdr. You will also need to configure `--rproxy` to `1` if the header only contains one IP (the correct one) or to a *negative value* if it contains multiple; `-1` being the rightmost and most trusted IP (the nearest proxy, so usually not the correct one), `-2` being the second-closest hop, and so on
|
2135
|
+
|
2136
|
+
Note that `--rp-loc` in particular will not work at all unless you configure the above correctly
|
2105
2137
|
|
2106
2138
|
some reverse proxies (such as [Caddy](https://caddyserver.com/)) can automatically obtain a valid https/tls certificate for you, and some support HTTP/2 and QUIC which *could* be a nice speed boost, depending on a lot of factors
|
2107
2139
|
* **warning:** nginx-QUIC (HTTP/3) is still experimental and can make uploads much slower, so HTTP/1.1 is recommended for now
|
@@ -2320,11 +2352,9 @@ if your distro/OS is not mentioned below, there might be some hints in the [«on
|
|
2320
2352
|
|
2321
2353
|
`pacman -S copyparty` (in [arch linux extra](https://archlinux.org/packages/extra/any/copyparty/))
|
2322
2354
|
|
2323
|
-
it comes with a [systemd service](./contrib/
|
2324
|
-
|
2325
|
-
after installing it, you may want to `cp /usr/lib/systemd/system/copyparty.service /etc/systemd/system/` and then `vim /etc/systemd/system/copyparty.service` to change what user/group it is running as (you only need to do this once)
|
2355
|
+
it comes with a [systemd service](./contrib/systemd/copyparty@.service) as well as a [user service](./contrib/systemd/copyparty-user.service), and expects to find a [config file](./contrib/systemd/copyparty.example.conf) in `/etc/copyparty/copyparty.conf` or `~/.config/copyparty/copyparty.conf`
|
2326
2356
|
|
2327
|
-
|
2357
|
+
after installing, start either the system service or the user service and navigate to http://127.0.0.1:3923 for further instructions (unless you already edited the config files, in which case you are good to go, probably)
|
2328
2358
|
|
2329
2359
|
|
2330
2360
|
## fedora package
|
@@ -2487,6 +2517,7 @@ quick summary of more eccentric web-browsers trying to view a directory index:
|
|
2487
2517
|
| **SerenityOS** (7e98457) | hits a page fault, works with `?b=u`, file upload not-impl |
|
2488
2518
|
| **sony psp** 5.50 | can browse, upload/mkdir/msg (thx dwarf) [screenshot](https://github.com/user-attachments/assets/9d21f020-1110-4652-abeb-6fc09c533d4f) |
|
2489
2519
|
| **nintendo 3ds** | can browse, upload, view thumbnails (thx bnjmn) |
|
2520
|
+
| **Nintendo Wii (Opera 9.0 "Internet Channel")** | can browse, can't upload or download (no local storage), can view images - works best with `?b=u`, default view broken |
|
2490
2521
|
|
2491
2522
|
<p align="center"><img src="https://github.com/user-attachments/assets/88deab3d-6cad-4017-8841-2f041472b853" /></p>
|
2492
2523
|
|
@@ -2546,6 +2577,8 @@ you can provide passwords using header `PW: hunter2`, cookie `cppwd=hunter2`, ur
|
|
2546
2577
|
|
2547
2578
|
> for basic-authentication, all of the following are accepted: `password` / `whatever:password` / `password:whatever` (the username is ignored)
|
2548
2579
|
|
2580
|
+
* unless you've enabled `--usernames`, then it's `PW: usr:pwd`, cookie `cppwd=usr:pwd`, url-param `?pw=usr:pwd`
|
2581
|
+
|
2549
2582
|
NOTE: curl will not send the original filename if you use `-T` combined with url-params! Also, make sure to always leave a trailing slash in URLs unless you want to override the filename
|
2550
2583
|
|
2551
2584
|
|
@@ -2657,7 +2690,7 @@ there is a [discord server](https://discord.gg/25J8CdTT6G) with an `@everyone`
|
|
2657
2690
|
|
2658
2691
|
some notes on hardening
|
2659
2692
|
|
2660
|
-
* set `--rproxy 0` if your copyparty is directly facing the internet (not through a reverse-proxy)
|
2693
|
+
* set `--rproxy 0` *if and only if* your copyparty is directly facing the internet (not through a reverse-proxy)
|
2661
2694
|
* cors doesn't work right otherwise
|
2662
2695
|
* if you allow anonymous uploads or otherwise don't trust the contents of a volume, you can prevent XSS with volflag `nohtml`
|
2663
2696
|
* this returns html documents as plaintext, and also disables markdown rendering
|
@@ -2757,6 +2790,12 @@ optionally also specify `--ah-cli` to enter an interactive mode where it will ha
|
|
2757
2790
|
|
2758
2791
|
the default configs take about 0.4 sec and 256 MiB RAM to process a new password on a decent laptop
|
2759
2792
|
|
2793
|
+
when generating hashes using `--ah-cli` for docker or systemd services, make sure it is using the same `--ah-salt` by:
|
2794
|
+
* inspecting the generated salt using `--show-ah-salt` in copyparty service configuration
|
2795
|
+
* setting the same `--ah-salt` in both environments
|
2796
|
+
|
2797
|
+
> ⚠️ if you have enabled `--usernames` then provide the password as `username:password` when hashing it, for example `ed:hunter2`
|
2798
|
+
|
2760
2799
|
|
2761
2800
|
## https
|
2762
2801
|
|
@@ -2874,6 +2913,8 @@ these are standalone programs and will never be imported / evaluated by copypart
|
|
2874
2913
|
|
2875
2914
|
the self-contained "binary" (recommended!) [copyparty-sfx.py](https://github.com/9001/copyparty/releases/latest/download/copyparty-sfx.py) will unpack itself and run copyparty, assuming you have python installed of course
|
2876
2915
|
|
2916
|
+
if you only need english, [copyparty-en.py](https://github.com/9001/copyparty/releases/latest/download/copyparty-en.py) is the same thing but smaller
|
2917
|
+
|
2877
2918
|
you can reduce the sfx size by repacking it; see [./docs/devnotes.md#sfx-repack](./docs/devnotes.md#sfx-repack)
|
2878
2919
|
|
2879
2920
|
|
@@ -2901,7 +2942,7 @@ then again, if you are already into downloading shady binaries from the internet
|
|
2901
2942
|
|
2902
2943
|
## zipapp
|
2903
2944
|
|
2904
|
-
another emergency alternative, [copyparty.pyz](https://github.com/9001/copyparty/releases/latest/download/copyparty.pyz) has less features, is slow, requires python 3.7 or newer, worse compression, and more importantly is unable to benefit from more recent versions of jinja2 and such (which makes it less secure)... lots of drawbacks with this one really -- but it does not unpack any temporary files to disk, so it *may* just work if the regular sfx fails to start because the computer is messed up in certain funky ways, so it's worth a shot if all else fails
|
2945
|
+
another emergency alternative, [copyparty.pyz](https://github.com/9001/copyparty/releases/latest/download/copyparty.pyz) has less features, is slow, requires python 3.7 or newer, worse compression, and more importantly is unable to benefit from more recent versions of jinja2 and such (which makes it less secure)... lots of drawbacks with this one really -- but, unlike the sfx, it is a completely normal zipfile which does not unpack any temporary files to disk, so it *may* just work if the regular sfx fails to start because the computer is messed up in certain funky ways, so it's worth a shot if all else fails
|
2905
2946
|
|
2906
2947
|
run it by doubleclicking it, or try typing `python copyparty.pyz` in your terminal/console/commandline/telex if that fails
|
2907
2948
|
|
@@ -1,38 +1,38 @@
|
|
1
|
-
copyparty/__init__.py,sha256=
|
2
|
-
copyparty/__main__.py,sha256=
|
3
|
-
copyparty/__version__.py,sha256=
|
4
|
-
copyparty/authsrv.py,sha256=
|
1
|
+
copyparty/__init__.py,sha256=SJtQjM-9PP9K-IaoM9M3iNKvRApp0omOrAN6YtXTPNM,2599
|
2
|
+
copyparty/__main__.py,sha256=bFMl5D5Tno8XVqXgDpr-7SgOggq6VK-0Bq0P1qYbH1U,129918
|
3
|
+
copyparty/__version__.py,sha256=q7t1Us4JpeZfu0jfjyyPAuufDrObbDLz5oQANpVlxgk,250
|
4
|
+
copyparty/authsrv.py,sha256=0a0Y7B5abT5AFdMYcu9Kb_7q7wIHVA5kZ-rN2p0K8oM,123822
|
5
5
|
copyparty/broker_mp.py,sha256=QdOXXvV2Xn6J0CysEqyY3GZbqxQMyWnTpnba-a5lMc0,4987
|
6
6
|
copyparty/broker_mpw.py,sha256=PpSS4SK3pItlpfD8OwVr3QmJEPKlUgaf2nuMOozixgU,3347
|
7
7
|
copyparty/broker_thr.py,sha256=fjoYtpSscUA7-nMl4r1n2R7UK3J9lrvLS3rUZ-iJzKQ,1721
|
8
8
|
copyparty/broker_util.py,sha256=76mfnFOpX1gUUvtjm8UQI7jpTIaVINX10QonM-B7ggc,1680
|
9
9
|
copyparty/cert.py,sha256=pSSeVYticrDsnsrdRtfpUQN-8WRObsqrYtSRroXmgxo,7992
|
10
|
-
copyparty/cfg.py,sha256=
|
10
|
+
copyparty/cfg.py,sha256=uUqSxL_BI2anPUmcmn_FkmM97S4xuJ79sG49wVoDN3w,15831
|
11
11
|
copyparty/dxml.py,sha256=vu5uZQtwvwoqnFHbULs2Zh_y2DETu0T-ENpMZ1i2CV4,2505
|
12
12
|
copyparty/fsutil.py,sha256=NC_CJC4TDag399vVDH9_uQfdfpTMwRFLNxERSWhlVvs,4594
|
13
|
-
copyparty/ftpd.py,sha256=
|
14
|
-
copyparty/httpcli.py,sha256=
|
13
|
+
copyparty/ftpd.py,sha256=K40yLaoSDTDu-bWWOUy4f-B78enktdGr_h3VdH0h9Us,18257
|
14
|
+
copyparty/httpcli.py,sha256=_43lHsVmK3WT8R__4F7HAtPAIc98cUiixUTKLfTjmfY,235079
|
15
15
|
copyparty/httpconn.py,sha256=IA9fdCjigawZ4kWhgvVN3nSiy5pb3W2qaE6rFqUYdq0,6943
|
16
|
-
copyparty/httpsrv.py,sha256=
|
16
|
+
copyparty/httpsrv.py,sha256=Qyhna6GTIHnmpUBwUicdtDrXGwct8oKap0LqEtGD5X4,18911
|
17
17
|
copyparty/ico.py,sha256=-7QjF_jIxnPo4Vr0oUPksQ_U_Ef0HRsSPm3s71idOz8,3879
|
18
18
|
copyparty/mdns.py,sha256=G73OWWg1copda47LgayCRK7qjVrk6cnUGpMR5ugmi7o,18315
|
19
19
|
copyparty/metrics.py,sha256=1dim0ShnsD5cfspRbeN9Mt14wOIxPRtxCZY2IScikKw,8974
|
20
|
-
copyparty/mtag.py,sha256=
|
21
|
-
copyparty/multicast.py,sha256=
|
22
|
-
copyparty/pwhash.py,sha256=
|
20
|
+
copyparty/mtag.py,sha256=uAHixYCzB52dN9rhmRV_As_YX_baL5Ha-oRnTtmDdcg,20053
|
21
|
+
copyparty/multicast.py,sha256=ix78aoFs9xZxg_zFqCmIfz0U4nDve3S0_V0CQR4IwrM,12317
|
22
|
+
copyparty/pwhash.py,sha256=s80IBmdmtwz51yjY6hY9LuYPsMODIZSH2XGS3JEJS7c,4387
|
23
23
|
copyparty/smbd.py,sha256=Czo8SRkkl4ndCwEUe9Cbr8v0YOnyQHzubGSguPizuTc,14651
|
24
24
|
copyparty/ssdp.py,sha256=R1Z61GZOxBMF2Sk4RTxKWMOemogmcjEWG-CvLihd45k,7023
|
25
25
|
copyparty/star.py,sha256=tV5BbX6AiQ7N4UU8DYtSTckNYeoeey4DBqq4LjfymbY,3818
|
26
26
|
copyparty/sutil.py,sha256=E65jAaOzHlJYnqsOKDMPVT8kALPUVexpkSStWBdItkY,3231
|
27
|
-
copyparty/svchub.py,sha256=
|
27
|
+
copyparty/svchub.py,sha256=FojDo4Li-1-XBSjuqAQI2PZZaDJCLi9ln5mFZfT6i88,48779
|
28
28
|
copyparty/szip.py,sha256=9srQzjsTBrBadf6QMh4YRAL70rkZLevAOHqXWK5jvr8,8846
|
29
|
-
copyparty/tcpsrv.py,sha256=
|
30
|
-
copyparty/tftpd.py,sha256=
|
31
|
-
copyparty/th_cli.py,sha256=
|
32
|
-
copyparty/th_srv.py,sha256=
|
29
|
+
copyparty/tcpsrv.py,sha256=wZCoQayUT1XVp4Zfh2UMN-b8WryqUAcMFM-tNUFXIyc,20778
|
30
|
+
copyparty/tftpd.py,sha256=fXW0w2_fSbzKVQGTLgr4DbtxaIEfwB591bl0pYhwy6k,14272
|
31
|
+
copyparty/th_cli.py,sha256=1tq5yFTSa6ppy9xXuxUsm1SqF7Ps69b0cm4gAGM0vVo,5460
|
32
|
+
copyparty/th_srv.py,sha256=0WyPJRhKhCphGBe3gC53yNrlu0IT7WQ6WaWVSGxzpog,34749
|
33
33
|
copyparty/u2idx.py,sha256=4Y5OOPyVkc-pS0z6e3p4StXAMnjHobSOMmMsvNUTD34,13674
|
34
|
-
copyparty/up2k.py,sha256=
|
35
|
-
copyparty/util.py,sha256=
|
34
|
+
copyparty/up2k.py,sha256=5gKbwmgGgcTHK_qzBMiobakiBvjSqclyocXvICgubaM,179494
|
35
|
+
copyparty/util.py,sha256=dQc9WwW0vZMzmvzTHZ6Sv6VMpIzinrKKDueVU4FV7L4,105946
|
36
36
|
copyparty/bos/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
37
37
|
copyparty/bos/bos.py,sha256=DYt5mJJNt-935rU7HRm8kt_whpcVSI0uSphvD7PXrJo,2247
|
38
38
|
copyparty/bos/path.py,sha256=yEjCq2ki9CvxA5sCT8pS0keEXwugs0ZeUyUhdBziOCI,777
|
@@ -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=MxRofvhXjmUN7RtXtC17_9AlROVNUT-66WwJ_pHLY9c,8258
|
58
|
-
copyparty/web/browser.css.gz,sha256=
|
58
|
+
copyparty/web/browser.css.gz,sha256=a6uvAOjCumT3K4YSkSHcB3cYXA8RO_4QbfB9M7oR_kQ,11780
|
59
59
|
copyparty/web/browser.html,sha256=lhelkXI8_HGfuqo_5b6XEGzf8VNodOMXE9kbv31JtbM,4790
|
60
|
-
copyparty/web/browser.js.gz,sha256=
|
60
|
+
copyparty/web/browser.js.gz,sha256=WKzmxDoZ_vydwLOwaKchQbCXZlo0YPSgctFnUCo4yIw,230180
|
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
|
@@ -66,36 +66,31 @@ copyparty/web/md.css.gz,sha256=UZpN0J7ubVM05CZkbZYkQRJeGgJt_GNDEzKTGSQd8h4,2032
|
|
66
66
|
copyparty/web/md.html,sha256=hz-xJVfKtaeTUQn3tGh7ebIMvLbOjVKkrMhsCTr3lGM,4200
|
67
67
|
copyparty/web/md.js.gz,sha256=m5dpIskZZ8FD9X-L0EWpoZP-yLOo-PCWJ7j4AFtHVRI,4163
|
68
68
|
copyparty/web/md2.css.gz,sha256=uIVHKScThdbcfhXNSHgKZnALYpxbnXC-WuEzOJ20Lpc,699
|
69
|
-
copyparty/web/md2.js.gz,sha256=
|
69
|
+
copyparty/web/md2.js.gz,sha256=Km7nX6pnZs0GWaqCj54FYu-aYrkxa73C9yCGGOcG4dE,8368
|
70
70
|
copyparty/web/mde.css.gz,sha256=2SkAEDKIRPqywNJ8t_heQaeBQ_R73Rf-pQI_bDoKF6o,942
|
71
71
|
copyparty/web/mde.html,sha256=fRGUlnNhK6ra8P4jskQLUw6Aaef6g6Heh4EEgYhJkxU,1770
|
72
|
-
copyparty/web/mde.js.gz,sha256=
|
72
|
+
copyparty/web/mde.js.gz,sha256=FQplRzzMJqC_xNb8gmzj79PrlCfcPdKIm85lM6cR-xA,2220
|
73
73
|
copyparty/web/msg.css.gz,sha256=u90fXYAVrMD-jqwf5XFVC1ptSpSHZUe8Mez6PX101P8,300
|
74
74
|
copyparty/web/msg.html,sha256=w9CM3hkLLGJX9fWEaG4gSbTOPe2GcPqW8BpSCDiFzOI,977
|
75
75
|
copyparty/web/rups.css.gz,sha256=pWklsym27oGGr-8tYQR7WnZvGZElAgCwLzlwTDErNAM,647
|
76
|
-
copyparty/web/rups.html,sha256=
|
77
|
-
copyparty/web/rups.js.gz,sha256=
|
76
|
+
copyparty/web/rups.html,sha256=GHf0NOyw8HIluLxomnxvO_Eucef6MGYOaqz-aD-lSCI,1298
|
77
|
+
copyparty/web/rups.js.gz,sha256=eA0Ak3fEyvX7HKl1nt6Zc-cEXJlCQ7Gkw9RMsiKz3Zo,915
|
78
78
|
copyparty/web/shares.css.gz,sha256=SdPlZCBwz9tkPkgEo5pSPDOZSI079njxEfkJ64-iW3c,547
|
79
79
|
copyparty/web/shares.html,sha256=ZZ9BIuzhbVtJCAZOb_PAaEY_z9jo8i93QEJolNDHX3g,2578
|
80
|
-
copyparty/web/shares.js.gz,sha256=
|
80
|
+
copyparty/web/shares.js.gz,sha256=QgtzZ6oKJqGVlAEbhVCn-35F6mnwLwOmndRqlgtJd74,942
|
81
81
|
copyparty/web/splash.css.gz,sha256=S8_A7JJl71xACRBYGzafeaD82OacW6Fa7oKPiNyrhAs,1087
|
82
|
-
copyparty/web/splash.html,sha256=
|
83
|
-
copyparty/web/splash.js.gz,sha256=
|
84
|
-
copyparty/web/svcs.html,sha256=
|
85
|
-
copyparty/web/svcs.js.gz,sha256=
|
82
|
+
copyparty/web/splash.html,sha256=WwASAi2zq4Y7iKB1KMXnOEWmmsLao-nIdHEW2_CglVg,6614
|
83
|
+
copyparty/web/splash.js.gz,sha256=ArBn9m09VAsT7tFc4LeEmk5p0mS-U2rNL4kxaGkZeYY,10009
|
84
|
+
copyparty/web/svcs.html,sha256=JtjrG9CaCu1BPtve9mb0Z7m3TvCZEDkmKusQnJzQzGw,14909
|
85
|
+
copyparty/web/svcs.js.gz,sha256=_dvatVBMVI_iy5MnYQeZumFGAnu9lAP_WKrhOA1TYxs,852
|
86
86
|
copyparty/web/ui.css.gz,sha256=e3iIflzddmjoyPrun_1jsu9j7fbdonNQLyhEE2oKKOQ,2819
|
87
|
-
copyparty/web/up2k.js.gz,sha256=
|
88
|
-
copyparty/web/util.js.gz,sha256=
|
87
|
+
copyparty/web/up2k.js.gz,sha256=QuP9rbLgWLMNPweZn060wTCArfpcrOjGi1HaLu-ns0o,24987
|
88
|
+
copyparty/web/util.js.gz,sha256=a0as08f0I4p4LED_6cJkTZWK5b3vU35aA9praIbGVos,15545
|
89
89
|
copyparty/web/w.hash.js.gz,sha256=cFH6Xo4YRgH9Wr7RmHMSEfpuTmmIvEmzmSvv4RLmyPU,1193
|
90
90
|
copyparty/web/a/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
91
91
|
copyparty/web/a/partyfuse.py,sha256=9p5Hpg_IBiSimv7j9kmPhCGpy-FLXSRUOYnLjJ5JifU,28049
|
92
92
|
copyparty/web/a/u2c.py,sha256=f_KR1ZhOjJYBnyYlJbBXY-TnNITeT7HOf0R3pR_9DIM,53248
|
93
93
|
copyparty/web/a/webdav-cfg.bat,sha256=Y4NoGZlksAIg4cBMb7KdJrpKC6Nx97onaTl6yMjaimk,1449
|
94
|
-
copyparty/web/dd/2.png,sha256=gJ14XFPzaw95L6z92fSq9eMPikSQyu-03P1lgiGe0_I,258
|
95
|
-
copyparty/web/dd/3.png,sha256=4lho8Koz5tV7jJ4ODo6GMTScZfkqsT05yp48EDFIlyg,252
|
96
|
-
copyparty/web/dd/4.png,sha256=fIwEVmtZNZtloZuVEKPKnkx3SELwRJmB3US61y7t2lI,248
|
97
|
-
copyparty/web/dd/5.png,sha256=Lfpu8-yOlhONuoMbygloKqQVPXSm9gjxH2gUYn5QQAE,250
|
98
|
-
copyparty/web/dd/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
99
94
|
copyparty/web/deps/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
100
95
|
copyparty/web/deps/busy.mp3.gz,sha256=EVphk1_HYyRKJmtpeK99vbAstF7ub1f9ndu020H8PQ8,106
|
101
96
|
copyparty/web/deps/easymde.css.gz,sha256=vWxfueI64rPikuqFj69wJBtGisqf93AheQtOZqgUI_c,3041
|
@@ -110,9 +105,9 @@ copyparty/web/deps/prismd.css.gz,sha256=ObUlksQVr-OuYlTz-I4B23TeBg2QDVVGRnWBz8cV
|
|
110
105
|
copyparty/web/deps/scp.woff2,sha256=w99BDU5i8MukkMEL-iW0YO9H4vFFZSPWxbkH70ytaAg,8612
|
111
106
|
copyparty/web/deps/sha512.ac.js.gz,sha256=lFZaCLumgWxrvEuDr4bqdKHsqjX82AbVAb7_F45Yk88,7033
|
112
107
|
copyparty/web/deps/sha512.hw.js.gz,sha256=UAed2_ocklZCnIzcSYz2h4P1ycztlCLj-ewsRTud2lU,7939
|
113
|
-
copyparty-1.
|
114
|
-
copyparty-1.
|
115
|
-
copyparty-1.
|
116
|
-
copyparty-1.
|
117
|
-
copyparty-1.
|
118
|
-
copyparty-1.
|
108
|
+
copyparty-1.19.0.dist-info/licenses/LICENSE,sha256=gOr4h33pCsBEg9uIy9AYmb7qlocL4V9t2uPJS5wllr0,1072
|
109
|
+
copyparty-1.19.0.dist-info/METADATA,sha256=Gbc-lwedtIrKBwJ6UlVSGXkr5FY--ORydeRo2YCdZ3k,170883
|
110
|
+
copyparty-1.19.0.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
|
111
|
+
copyparty-1.19.0.dist-info/entry_points.txt,sha256=4zw6a3rqASywQomiYLObjjlxybaI65LYYOTJwgKz7b0,128
|
112
|
+
copyparty-1.19.0.dist-info/top_level.txt,sha256=LnYUPsDyk-8kFgM6YJLG4h820DQekn81cObKSu9g-sI,10
|
113
|
+
copyparty-1.19.0.dist-info/RECORD,,
|
copyparty/web/dd/2.png
DELETED
Binary file
|
copyparty/web/dd/3.png
DELETED
Binary file
|
copyparty/web/dd/4.png
DELETED
Binary file
|
copyparty/web/dd/5.png
DELETED
Binary file
|
copyparty/web/dd/__init__.py
DELETED
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|