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.
Files changed (42) hide show
  1. copyparty/__init__.py +0 -4
  2. copyparty/__main__.py +85 -69
  3. copyparty/__version__.py +3 -3
  4. copyparty/authsrv.py +31 -2
  5. copyparty/cfg.py +2 -0
  6. copyparty/ftpd.py +7 -2
  7. copyparty/httpcli.py +87 -31
  8. copyparty/httpsrv.py +2 -1
  9. copyparty/mtag.py +5 -1
  10. copyparty/multicast.py +1 -5
  11. copyparty/pwhash.py +4 -0
  12. copyparty/svchub.py +2 -11
  13. copyparty/tcpsrv.py +16 -6
  14. copyparty/tftpd.py +1 -1
  15. copyparty/th_cli.py +2 -2
  16. copyparty/th_srv.py +68 -2
  17. copyparty/up2k.py +21 -18
  18. copyparty/util.py +11 -0
  19. copyparty/web/browser.css.gz +0 -0
  20. copyparty/web/browser.js.gz +0 -0
  21. copyparty/web/md2.js.gz +0 -0
  22. copyparty/web/mde.js.gz +0 -0
  23. copyparty/web/rups.html +1 -8
  24. copyparty/web/rups.js.gz +0 -0
  25. copyparty/web/shares.js.gz +0 -0
  26. copyparty/web/splash.html +6 -1
  27. copyparty/web/splash.js.gz +0 -0
  28. copyparty/web/svcs.html +1 -0
  29. copyparty/web/svcs.js.gz +0 -0
  30. copyparty/web/up2k.js.gz +0 -0
  31. copyparty/web/util.js.gz +0 -0
  32. {copyparty-1.18.9.dist-info → copyparty-1.19.0.dist-info}/METADATA +50 -9
  33. {copyparty-1.18.9.dist-info → copyparty-1.19.0.dist-info}/RECORD +37 -42
  34. copyparty/web/dd/2.png +0 -0
  35. copyparty/web/dd/3.png +0 -0
  36. copyparty/web/dd/4.png +0 -0
  37. copyparty/web/dd/5.png +0 -0
  38. copyparty/web/dd/__init__.py +0 -0
  39. {copyparty-1.18.9.dist-info → copyparty-1.19.0.dist-info}/WHEEL +0 -0
  40. {copyparty-1.18.9.dist-info → copyparty-1.19.0.dist-info}/entry_points.txt +0 -0
  41. {copyparty-1.18.9.dist-info → copyparty-1.19.0.dist-info}/licenses/LICENSE +0 -0
  42. {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
- CV_EXTS = set(zsg.split(","))
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["t0c"]),
375
- int(job["poke"]),
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
- liname = iname.lower()
1568
- if (
1569
- sz
1570
- and (
1571
+ if sz:
1572
+ liname = iname.lower()
1573
+ ext = liname.rsplit(".", 1)[-1]
1574
+ if (
1571
1575
  liname in th_cvds
1572
- or (
1573
- not cv
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
- cv = iname
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 ,
Binary file
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
  &nbsp; Filter: <input type="text" id="filter" size="20" placeholder="documents/passwords" />
21
21
  &nbsp; <span id="hits"></span>
22
- <table id="tab"><thead><tr>
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
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 %}
Binary file
copyparty/web/svcs.html CHANGED
@@ -37,6 +37,7 @@
37
37
  {% if accs %}<code><b id="pw0">{{ pw }}</b></code>=password, {% endif %}<code><b>mp</b></code>=mountpoint
38
38
  </span>
39
39
  {% if accs %}<a href="#" id="setpw">use real password</a>{% endif %}
40
+ <a href="#" id="qr">show qr</a>
40
41
  </p>
41
42
 
42
43
 
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.18.9
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 (probably outdated): https://ocv.me/copyparty/helptext.html
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. Look out for red and yellow log messages which explain how to do this. But basically, 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. Note that `--rp-loc` in particular will not work at all unless you do this
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/package/arch/copyparty.service) and expects to find one or more [config files](./docs/example.conf) in `/etc/copyparty.d/`
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
- NOTE: there used to be an aur package; this evaporated when copyparty was adopted by the official archlinux repos. If you're still using the aur package, please move
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=4aJw_Mt3eSNMV8sJ95Nh4ris-tBUYhCOV094Rnxa5Xo,2651
2
- copyparty/__main__.py,sha256=voGZLR6chtYQGJgsfjcUYk9rhRGU3zwnpbRSfMpPNXE,127673
3
- copyparty/__version__.py,sha256=vPZH_BWBXQ3lZl1cfIPpgNLx29TvHsPpesL3B_9BvfA,248
4
- copyparty/authsrv.py,sha256=CHKI5MmroVe7s1oTDkCBG18aFOhpuFbDmqcVMuK5j-E,122551
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=THceFupFmsZWF8iJKDDHR_XUEU3TNQgDRJB50iLiC1k,15734
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=S0w6iMR8AlzLc_Aqn-TKuUJ-vNbmeQF6SQs614-NFOE,18107
14
- copyparty/httpcli.py,sha256=sY5MjJYYj2Q3nrlvTMl-a7QOJrVcSI_tlgUeRnzqACg,232778
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=MCNjOEH_xM2qXCLGcoN6W0RhWlikv68-zBx0nICIheU,18864
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=ljqkiUblKzmLF6NVSXBRcFvy61j8QdVOjXToi2xQcyM,19939
21
- copyparty/multicast.py,sha256=Me4XEEJijvvK2lMRwmGU2hsaI5_E9AEpCjIC4b9UefA,12393
22
- copyparty/pwhash.py,sha256=zHoz9FHGkFBxoRvSfG1XyjN3ibww_h5GE6_m5yS-fws,4246
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=lAa-4HfD1LSv3Sn3pOtgLWGHyPhtGDXSCzGvpVB21E0,49140
27
+ copyparty/svchub.py,sha256=FojDo4Li-1-XBSjuqAQI2PZZaDJCLi9ln5mFZfT6i88,48779
28
28
  copyparty/szip.py,sha256=9srQzjsTBrBadf6QMh4YRAL70rkZLevAOHqXWK5jvr8,8846
29
- copyparty/tcpsrv.py,sha256=BCOqlT_mRu1ibHJpPzvf9c4h83AnIMEfd8nBBednCCg,20484
30
- copyparty/tftpd.py,sha256=QuPcdx77gLmEpit3lLc0x4Px6BrBBKJpJl4VqINc5O8,14254
31
- copyparty/th_cli.py,sha256=IEX5tCb0gw9Z2aRIDL9bwdvJ6g5jhWZ8OEAAz16_xN4,5426
32
- copyparty/th_srv.py,sha256=S6ChazjXwXevUxkAajwIwHzA16PyNIwv6kYRFakvLmY,32759
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=QGB2D8ZKlgyAFaY6qoa-KMd_RComhW6F2kP2ukgEsyQ,179269
35
- copyparty/util.py,sha256=XQN86nmxN4RgWWw4k1dIbWeIAR_Dqh_7Z4X9WobwRFI,105732
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=29D3F4uB-VMd6uJo-SxWAwLfn08jcETYZm0SOJFJLAE,11847
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=crq0Io0MHZFAOfX7tfWSnp1CixbsNPa7FaGIUT3T-gA,170979
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=42GJAAMaAa6dnBAYJfUlz4yCtSzYe5d-W-B7zOfiLW0,8372
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=kN2eUSvr4mFuksfK4-4LimJmWdwsao39Sea2lWtu8L0,2224
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=36UfDfHYMltw7_qAWGUGeRF8zaCSw2EjclhsymW94n0,1512
77
- copyparty/web/rups.js.gz,sha256=99RaGb6fhpER4_eNyauN7yOhA8NFcO4qNKazlnyrano,854
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=KEOx1OxQeEQNHNjsPXCvtWGFIRQSKy_tP7XSvreNCXk,966
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=0MvDe1lKfGqczi7d4nKjWjG0cRVyvs8J6sDEj3DCPSI,6376
83
- copyparty/web/splash.js.gz,sha256=8GtUHvIQiOpa3VosmovP4zJT3qTV6lENrJCDtPSZuiY,6278
84
- copyparty/web/svcs.html,sha256=mamJdq0hsmHqG2BQsf9jg8G9bAl338wUhUZ2WtXOlGQ,14865
85
- copyparty/web/svcs.js.gz,sha256=AYatNKyT_bKRWX8sb3WD_iujBY3L4P7HWBrsuMctsLs,722
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=aoq6uXrL77zlYQnx9y9VNUVL7YBOHc4u-zFlIrQSX14,24811
88
- copyparty/web/util.js.gz,sha256=nqWl2JXpw9nVirYbwm4zpWPnonLBLpqHB6g8vncJ86Q,15499
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.18.9.dist-info/licenses/LICENSE,sha256=gOr4h33pCsBEg9uIy9AYmb7qlocL4V9t2uPJS5wllr0,1072
114
- copyparty-1.18.9.dist-info/METADATA,sha256=C696ifH8fB2Wc9FgyFvi21nc4kvfwMZ0WUn_WPBTnUo,167834
115
- copyparty-1.18.9.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
116
- copyparty-1.18.9.dist-info/entry_points.txt,sha256=4zw6a3rqASywQomiYLObjjlxybaI65LYYOTJwgKz7b0,128
117
- copyparty-1.18.9.dist-info/top_level.txt,sha256=LnYUPsDyk-8kFgM6YJLG4h820DQekn81cObKSu9g-sI,10
118
- copyparty-1.18.9.dist-info/RECORD,,
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
File without changes