copyparty 1.19.17__py3-none-any.whl → 1.19.18__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 +6 -1
- copyparty/__main__.py +1 -0
- copyparty/__version__.py +2 -2
- copyparty/authsrv.py +47 -25
- copyparty/ftpd.py +1 -1
- copyparty/httpcli.py +61 -25
- copyparty/httpsrv.py +2 -2
- copyparty/web/a/partyfuse.py.gz +0 -0
- copyparty/web/a/u2c.py.gz +0 -0
- copyparty/web/a/webdav-cfg.txt.gz +0 -0
- copyparty/web/browser.css.gz +0 -0
- copyparty/web/svcs.html +1 -1
- copyparty/web/tl/epo.js.gz +0 -0
- copyparty/web/up2k.js.gz +0 -0
- copyparty/web/util.js.gz +0 -0
- {copyparty-1.19.17.dist-info → copyparty-1.19.18.dist-info}/METADATA +17 -3
- {copyparty-1.19.17.dist-info → copyparty-1.19.18.dist-info}/RECORD +21 -21
- copyparty/web/a/partyfuse.py +0 -947
- copyparty/web/a/u2c.py +0 -1718
- copyparty/web/a/webdav-cfg.bat +0 -45
- {copyparty-1.19.17.dist-info → copyparty-1.19.18.dist-info}/WHEEL +0 -0
- {copyparty-1.19.17.dist-info → copyparty-1.19.18.dist-info}/entry_points.txt +0 -0
- {copyparty-1.19.17.dist-info → copyparty-1.19.18.dist-info}/licenses/LICENSE +0 -0
- {copyparty-1.19.17.dist-info → copyparty-1.19.18.dist-info}/top_level.txt +0 -0
copyparty/__init__.py
CHANGED
|
@@ -52,7 +52,7 @@ except:
|
|
|
52
52
|
zs = """
|
|
53
53
|
web/a/partyfuse.py
|
|
54
54
|
web/a/u2c.py
|
|
55
|
-
web/a/webdav-cfg.
|
|
55
|
+
web/a/webdav-cfg.txt
|
|
56
56
|
web/baguettebox.js
|
|
57
57
|
web/browser.css
|
|
58
58
|
web/browser.html
|
|
@@ -122,6 +122,11 @@ web/util.js
|
|
|
122
122
|
web/w.hash.js
|
|
123
123
|
"""
|
|
124
124
|
RES = set(zs.strip().split("\n"))
|
|
125
|
+
RESM = {
|
|
126
|
+
"web/a/partyfuse.txt": "web/a/partyfuse.py",
|
|
127
|
+
"web/a/u2c.txt": "web/a/u2c.py",
|
|
128
|
+
"web/a/webdav-cfg.bat": "web/a/webdav-cfg.txt",
|
|
129
|
+
}
|
|
125
130
|
|
|
126
131
|
|
|
127
132
|
class EnvParams(object):
|
copyparty/__main__.py
CHANGED
|
@@ -1788,6 +1788,7 @@ def add_ui(ap, retry ):
|
|
|
1788
1788
|
ap2.add_argument("--ufavico", metavar="TXT", type=u, default="", help="URL to .ico/png/gif/svg file; \033[33m--favico\033[0m takes precedence unless disabled (volflag=ufavico)")
|
|
1789
1789
|
ap2.add_argument("--ext-th", metavar="E=VP", type=u, action="append", help="\033[34mREPEATABLE:\033[0m use thumbnail-image \033[33mVP\033[0m for file-extension \033[33mE\033[0m, example: [\033[32mexe=/.res/exe.png\033[0m] (volflag=ext_th)")
|
|
1790
1790
|
ap2.add_argument("--mpmc", type=u, default="", help=argparse.SUPPRESS)
|
|
1791
|
+
ap2.add_argument("--notooltips", action="store_true", help="tooltips disabled as default")
|
|
1791
1792
|
ap2.add_argument("--spinner", metavar="TXT", type=u, default="🌲", help="\033[33memoji\033[0m or \033[33memoji,css\033[0m Example: [\033[32m🥖,padding:0\033[0m]")
|
|
1792
1793
|
ap2.add_argument("--css-browser", metavar="L", type=u, default="", help="URL to additional CSS to include in the filebrowser html")
|
|
1793
1794
|
ap2.add_argument("--js-browser", metavar="L", type=u, default="", help="URL to additional JS to include in the filebrowser html")
|
copyparty/__version__.py
CHANGED
copyparty/authsrv.py
CHANGED
|
@@ -391,6 +391,9 @@ class VFS(object):
|
|
|
391
391
|
self.vpath = vpath # absolute path in the virtual filesystem
|
|
392
392
|
self.vpath0 = vpath0 # original vpath (before idp expansion)
|
|
393
393
|
self.axs = axs
|
|
394
|
+
self.uaxs = {}
|
|
395
|
+
|
|
396
|
+
|
|
394
397
|
self.flags = flags # config options
|
|
395
398
|
self.root = self
|
|
396
399
|
self.dev = 0 # st_dev
|
|
@@ -548,29 +551,19 @@ class VFS(object):
|
|
|
548
551
|
|
|
549
552
|
def can_access(
|
|
550
553
|
self, vpath , uname
|
|
551
|
-
)
|
|
552
|
-
"""can Read,Write,Move,Delete,Get,Upget,Admin,Dot"""
|
|
554
|
+
) :
|
|
555
|
+
"""can Read,Write,Move,Delete,Get,Upget,Html,Admin,Dot"""
|
|
556
|
+
# NOTE: only used by get_perms, which is only used by hooks; the lowest of fruits
|
|
553
557
|
if vpath:
|
|
554
558
|
vn, _ = self._find(undot(vpath))
|
|
555
559
|
else:
|
|
556
560
|
vn = self
|
|
557
561
|
|
|
558
|
-
|
|
559
|
-
return (
|
|
560
|
-
uname in c.uread,
|
|
561
|
-
uname in c.uwrite,
|
|
562
|
-
uname in c.umove,
|
|
563
|
-
uname in c.udel,
|
|
564
|
-
uname in c.uget,
|
|
565
|
-
uname in c.upget,
|
|
566
|
-
uname in c.uadmin,
|
|
567
|
-
uname in c.udot,
|
|
568
|
-
)
|
|
569
|
-
# skip uhtml because it's rarely needed
|
|
562
|
+
return vn.uaxs[uname]
|
|
570
563
|
|
|
571
564
|
def get_perms(self, vpath , uname ) :
|
|
572
565
|
zbl = self.can_access(vpath, uname)
|
|
573
|
-
ret = "".join(ch for ch, ok in zip("
|
|
566
|
+
ret = "".join(ch for ch, ok in zip("rwmdgGha.", zbl) if ok)
|
|
574
567
|
if "rwmd" in ret and "a." in ret:
|
|
575
568
|
ret += "A"
|
|
576
569
|
return ret
|
|
@@ -763,20 +756,17 @@ class VFS(object):
|
|
|
763
756
|
virt_vis[name] = vn2
|
|
764
757
|
continue
|
|
765
758
|
|
|
766
|
-
|
|
767
|
-
zx = vn2.axs
|
|
768
|
-
axs = [zx.uread, zx.uwrite, zx.umove, zx.udel, zx.uget]
|
|
759
|
+
u_has = vn2.uaxs.get(uname) or [False] * 9
|
|
769
760
|
for pset in permsets:
|
|
770
761
|
ok = True
|
|
771
|
-
for req,
|
|
772
|
-
if req and
|
|
762
|
+
for req, zb in zip(pset, u_has):
|
|
763
|
+
if req and not zb:
|
|
773
764
|
ok = False
|
|
765
|
+
break
|
|
774
766
|
if ok:
|
|
767
|
+
virt_vis[name] = vn2
|
|
775
768
|
break
|
|
776
769
|
|
|
777
|
-
if ok:
|
|
778
|
-
virt_vis[name] = vn2
|
|
779
|
-
|
|
780
770
|
if ".hist" in abspath:
|
|
781
771
|
p = abspath.replace("\\", "/") if WINDOWS else abspath
|
|
782
772
|
if p.endswith("/.hist"):
|
|
@@ -1984,6 +1974,23 @@ class AuthSrv(object):
|
|
|
1984
1974
|
umap[usr].sort()
|
|
1985
1975
|
setattr(vfs, "a" + perm, umap)
|
|
1986
1976
|
|
|
1977
|
+
for vol in vfs.all_nodes.values():
|
|
1978
|
+
za = vol.axs
|
|
1979
|
+
vol.uaxs = {
|
|
1980
|
+
un: (
|
|
1981
|
+
un in za.uread,
|
|
1982
|
+
un in za.uwrite,
|
|
1983
|
+
un in za.umove,
|
|
1984
|
+
un in za.udel,
|
|
1985
|
+
un in za.uget,
|
|
1986
|
+
un in za.upget,
|
|
1987
|
+
un in za.uhtml,
|
|
1988
|
+
un in za.uadmin,
|
|
1989
|
+
un in za.udot,
|
|
1990
|
+
)
|
|
1991
|
+
for un in unames
|
|
1992
|
+
}
|
|
1993
|
+
|
|
1987
1994
|
all_users = {}
|
|
1988
1995
|
missing_users = {}
|
|
1989
1996
|
associated_users = {}
|
|
@@ -2317,6 +2324,10 @@ class AuthSrv(object):
|
|
|
2317
2324
|
free_umask = False
|
|
2318
2325
|
have_reflink = False
|
|
2319
2326
|
for vol in vfs.all_nodes.values():
|
|
2327
|
+
if os.path.isfile(vol.realpath):
|
|
2328
|
+
vol.flags["is_file"] = True
|
|
2329
|
+
vol.flags["d2d"] = True
|
|
2330
|
+
|
|
2320
2331
|
if (self.args.e2ds and vol.axs.uwrite) or self.args.e2dsa:
|
|
2321
2332
|
vol.flags["e2ds"] = True
|
|
2322
2333
|
|
|
@@ -2631,7 +2642,14 @@ class AuthSrv(object):
|
|
|
2631
2642
|
errors = True
|
|
2632
2643
|
|
|
2633
2644
|
for vol in vfs.all_nodes.values():
|
|
2634
|
-
if not vol.
|
|
2645
|
+
if not vol.flags.get("is_file"):
|
|
2646
|
+
continue
|
|
2647
|
+
zs = "og opds xlink"
|
|
2648
|
+
for zs in zs.split():
|
|
2649
|
+
vol.flags.pop(zs, None)
|
|
2650
|
+
|
|
2651
|
+
for vol in vfs.all_nodes.values():
|
|
2652
|
+
if not vol.realpath or vol.flags.get("is_file"):
|
|
2635
2653
|
continue
|
|
2636
2654
|
ccs = vol.flags["casechk"][:1].lower()
|
|
2637
2655
|
if ccs in ("y", "n"):
|
|
@@ -3077,6 +3095,10 @@ class AuthSrv(object):
|
|
|
3077
3095
|
for zs in zs.split():
|
|
3078
3096
|
if vf.get(zs):
|
|
3079
3097
|
js_htm[zs] = 1
|
|
3098
|
+
zs = "notooltips"
|
|
3099
|
+
for zs in zs.split():
|
|
3100
|
+
if getattr(self.args, zs, False):
|
|
3101
|
+
js_htm[zs] = 1
|
|
3080
3102
|
vn.js_htm = json_hesc(json.dumps(js_htm))
|
|
3081
3103
|
|
|
3082
3104
|
vols = list(vfs.all_nodes.values())
|
|
@@ -3421,7 +3443,7 @@ class AuthSrv(object):
|
|
|
3421
3443
|
raise Exception("volume not found: " + zs)
|
|
3422
3444
|
|
|
3423
3445
|
self.log(str({"users": users, "vols": vols, "flags": flags}))
|
|
3424
|
-
t = "/{}: read({}) write({}) move({}) del({}) dots({}) get({}) upGet({}) uadmin({})"
|
|
3446
|
+
t = "/{}: read({}) write({}) move({}) del({}) dots({}) get({}) upGet({}) html({}) uadmin({})"
|
|
3425
3447
|
for k, zv in self.vfs.all_vols.items():
|
|
3426
3448
|
vc = zv.axs
|
|
3427
3449
|
vs = [
|
copyparty/ftpd.py
CHANGED
|
@@ -194,7 +194,7 @@ class FtpFs(AbstractedFS):
|
|
|
194
194
|
if not avfs:
|
|
195
195
|
raise FSE(t.format(vpath), 1)
|
|
196
196
|
|
|
197
|
-
cr, cw, cm, cd, _, _, _, _ = avfs.
|
|
197
|
+
cr, cw, cm, cd, _, _, _, _, _ = avfs.uaxs[self.h.uname]
|
|
198
198
|
if r and not cr or w and not cw or m and not cm or d and not cd:
|
|
199
199
|
raise FSE(t.format(vpath), 1)
|
|
200
200
|
|
copyparty/httpcli.py
CHANGED
|
@@ -30,7 +30,7 @@ try:
|
|
|
30
30
|
except:
|
|
31
31
|
pass
|
|
32
32
|
|
|
33
|
-
from .__init__ import ANYWIN, RES, TYPE_CHECKING, EnvParams, unicode
|
|
33
|
+
from .__init__ import ANYWIN, RES, RESM, TYPE_CHECKING, EnvParams, unicode
|
|
34
34
|
from .__version__ import S_VERSION
|
|
35
35
|
from .authsrv import LEELOO_DALLAS, VFS # typechk
|
|
36
36
|
from .bos import bos
|
|
@@ -161,6 +161,12 @@ RE_MDV = re.compile(r"(.*)\.([0-9]+\.[0-9]{3})(\.[Mm][Dd])$")
|
|
|
161
161
|
|
|
162
162
|
UPARAM_CC_OK = set("doc move tree".split())
|
|
163
163
|
|
|
164
|
+
PERMS_rwh = [
|
|
165
|
+
[True, False],
|
|
166
|
+
[False, True],
|
|
167
|
+
[False, False, False, False, False, False, True],
|
|
168
|
+
]
|
|
169
|
+
|
|
164
170
|
|
|
165
171
|
class HttpCli(object):
|
|
166
172
|
"""
|
|
@@ -224,6 +230,7 @@ class HttpCli(object):
|
|
|
224
230
|
self.can_delete = False
|
|
225
231
|
self.can_get = False
|
|
226
232
|
self.can_upget = False
|
|
233
|
+
self.can_html = False
|
|
227
234
|
self.can_admin = False
|
|
228
235
|
self.can_dot = False
|
|
229
236
|
self.out_headerlist = []
|
|
@@ -732,18 +739,21 @@ class HttpCli(object):
|
|
|
732
739
|
if "bcasechk" in vn.flags and not vn.casechk(rem, True):
|
|
733
740
|
return self.tx_404() and False
|
|
734
741
|
|
|
735
|
-
|
|
736
|
-
|
|
737
|
-
|
|
738
|
-
|
|
739
|
-
|
|
740
|
-
|
|
741
|
-
|
|
742
|
-
|
|
743
|
-
|
|
744
|
-
|
|
745
|
-
|
|
746
|
-
|
|
742
|
+
try:
|
|
743
|
+
(
|
|
744
|
+
self.can_read,
|
|
745
|
+
self.can_write,
|
|
746
|
+
self.can_move,
|
|
747
|
+
self.can_delete,
|
|
748
|
+
self.can_get,
|
|
749
|
+
self.can_upget,
|
|
750
|
+
self.can_html,
|
|
751
|
+
self.can_admin,
|
|
752
|
+
self.can_dot,
|
|
753
|
+
) = avn.uaxs[self.uname]
|
|
754
|
+
except:
|
|
755
|
+
pass # default is all-false
|
|
756
|
+
|
|
747
757
|
self.avn = avn
|
|
748
758
|
self.vn = vn # note: do not dbv due to walk/zipgen
|
|
749
759
|
self.rem = rem
|
|
@@ -1270,6 +1280,20 @@ class HttpCli(object):
|
|
|
1270
1280
|
else:
|
|
1271
1281
|
return self.tx_res(res_path)
|
|
1272
1282
|
|
|
1283
|
+
if res_path in RESM:
|
|
1284
|
+
ap = self.E.mod_ + RESM[res_path]
|
|
1285
|
+
if (
|
|
1286
|
+
"txt" not in self.uparam
|
|
1287
|
+
and "mime" not in self.uparam
|
|
1288
|
+
and not self.ouparam.get("dl")
|
|
1289
|
+
):
|
|
1290
|
+
# return mimetype matching request extension
|
|
1291
|
+
self.ouparam["dl"] = res_path.split("/")[-1]
|
|
1292
|
+
if bos.path.exists(ap) or bos.path.exists(ap + ".gz"):
|
|
1293
|
+
return self.tx_file(ap)
|
|
1294
|
+
else:
|
|
1295
|
+
return self.tx_res(res_path)
|
|
1296
|
+
|
|
1273
1297
|
self.tx_404()
|
|
1274
1298
|
return False
|
|
1275
1299
|
|
|
@@ -4161,8 +4185,11 @@ class HttpCli(object):
|
|
|
4161
4185
|
# force download
|
|
4162
4186
|
|
|
4163
4187
|
if "dl" in self.ouparam:
|
|
4164
|
-
cdis =
|
|
4165
|
-
|
|
4188
|
+
cdis = self.ouparam["dl"] or req_path
|
|
4189
|
+
zs = gen_content_disposition(os.path.basename(cdis))
|
|
4190
|
+
self.out_headers["Content-Disposition"] = zs
|
|
4191
|
+
else:
|
|
4192
|
+
cdis = req_path
|
|
4166
4193
|
|
|
4167
4194
|
#
|
|
4168
4195
|
# if-modified
|
|
@@ -4228,7 +4255,7 @@ class HttpCli(object):
|
|
|
4228
4255
|
elif "mime" in self.uparam:
|
|
4229
4256
|
mime = str(self.uparam.get("mime"))
|
|
4230
4257
|
else:
|
|
4231
|
-
mime = guess_mime(
|
|
4258
|
+
mime = guess_mime(cdis)
|
|
4232
4259
|
|
|
4233
4260
|
logmsg += unicode(status) + logtail
|
|
4234
4261
|
|
|
@@ -4335,8 +4362,11 @@ class HttpCli(object):
|
|
|
4335
4362
|
# force download
|
|
4336
4363
|
|
|
4337
4364
|
if "dl" in self.ouparam:
|
|
4338
|
-
cdis =
|
|
4339
|
-
|
|
4365
|
+
cdis = self.ouparam["dl"] or req_path
|
|
4366
|
+
zs = gen_content_disposition(os.path.basename(cdis))
|
|
4367
|
+
self.out_headers["Content-Disposition"] = zs
|
|
4368
|
+
else:
|
|
4369
|
+
cdis = req_path
|
|
4340
4370
|
|
|
4341
4371
|
#
|
|
4342
4372
|
# if-modified
|
|
@@ -4464,7 +4494,7 @@ class HttpCli(object):
|
|
|
4464
4494
|
elif "rmagic" in self.vn.flags:
|
|
4465
4495
|
mime = guess_mime(req_path, fs_path)
|
|
4466
4496
|
else:
|
|
4467
|
-
mime = guess_mime(
|
|
4497
|
+
mime = guess_mime(cdis)
|
|
4468
4498
|
|
|
4469
4499
|
if "nohtml" in self.vn.flags and "html" in mime:
|
|
4470
4500
|
mime = "text/plain; charset=utf-8"
|
|
@@ -5238,7 +5268,7 @@ class HttpCli(object):
|
|
|
5238
5268
|
dls.append((perc, hsent, spd, eta, idle, usr, erd, rds, fn))
|
|
5239
5269
|
|
|
5240
5270
|
if self.args.have_unlistc:
|
|
5241
|
-
allvols = self.asrv.vfs.
|
|
5271
|
+
allvols = self.asrv.vfs.all_nodes
|
|
5242
5272
|
rvol = [x for x in rvol if "unlistcr" not in allvols[x[1:-1]].flags]
|
|
5243
5273
|
wvol = [x for x in wvol if "unlistcw" not in allvols[x[1:-1]].flags]
|
|
5244
5274
|
|
|
@@ -5517,7 +5547,7 @@ class HttpCli(object):
|
|
|
5517
5547
|
rem,
|
|
5518
5548
|
self.uname,
|
|
5519
5549
|
not self.args.no_scandir,
|
|
5520
|
-
|
|
5550
|
+
PERMS_rwh,
|
|
5521
5551
|
)
|
|
5522
5552
|
dots = self.uname in vn.axs.udot
|
|
5523
5553
|
dk_sz = vn.flags.get("dk")
|
|
@@ -5549,7 +5579,13 @@ class HttpCli(object):
|
|
|
5549
5579
|
for x in vfs_virt:
|
|
5550
5580
|
if x != excl:
|
|
5551
5581
|
try:
|
|
5552
|
-
dvn, drem = vfs.get(vjoin(top, x), self.uname,
|
|
5582
|
+
dvn, drem = vfs.get(vjoin(top, x), self.uname, False, False)
|
|
5583
|
+
if (
|
|
5584
|
+
self.uname not in dvn.axs.uread
|
|
5585
|
+
and self.uname not in dvn.axs.uwrite
|
|
5586
|
+
and self.uname not in dvn.axs.uhtml
|
|
5587
|
+
):
|
|
5588
|
+
raise Exception()
|
|
5553
5589
|
bos.stat(dvn.canonical(drem, False))
|
|
5554
5590
|
except:
|
|
5555
5591
|
x += "\n"
|
|
@@ -6474,8 +6510,7 @@ class HttpCli(object):
|
|
|
6474
6510
|
return self.tx_svg("upload\nonly")
|
|
6475
6511
|
|
|
6476
6512
|
if not self.can_read and self.can_get and self.avn:
|
|
6477
|
-
|
|
6478
|
-
if self.uname not in axs.uhtml:
|
|
6513
|
+
if not self.can_html:
|
|
6479
6514
|
pass
|
|
6480
6515
|
elif is_dir:
|
|
6481
6516
|
for fn in ("index.htm", "index.html"):
|
|
@@ -6496,6 +6531,7 @@ class HttpCli(object):
|
|
|
6496
6531
|
|
|
6497
6532
|
fk_pass = True
|
|
6498
6533
|
is_dir = False
|
|
6534
|
+
add_og = False
|
|
6499
6535
|
rem = vjoin(rem, fn)
|
|
6500
6536
|
vrem = vjoin(vrem, fn)
|
|
6501
6537
|
abspath = ap2
|
|
@@ -6689,7 +6725,7 @@ class HttpCli(object):
|
|
|
6689
6725
|
rem,
|
|
6690
6726
|
self.uname,
|
|
6691
6727
|
not self.args.no_scandir,
|
|
6692
|
-
|
|
6728
|
+
PERMS_rwh,
|
|
6693
6729
|
lstat="lt" in self.uparam,
|
|
6694
6730
|
throw=True,
|
|
6695
6731
|
)
|
copyparty/httpsrv.py
CHANGED
|
@@ -378,8 +378,8 @@ class HttpSrv(object):
|
|
|
378
378
|
if nloris < nconn / 2:
|
|
379
379
|
continue
|
|
380
380
|
|
|
381
|
-
t = "
|
|
382
|
-
self.log(self.name, t
|
|
381
|
+
t = "slow%s (idle-conn): %s banned for %d min" # slowloris
|
|
382
|
+
self.log(self.name, t % ("loris", ip, self.args.loris), 1)
|
|
383
383
|
self.bans[ip] = int(time.time() + self.args.loris * 60)
|
|
384
384
|
|
|
385
385
|
if self.args.log_conn:
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
copyparty/web/browser.css.gz
CHANGED
|
Binary file
|
copyparty/web/svcs.html
CHANGED
|
@@ -64,7 +64,7 @@
|
|
|
64
64
|
<li>old version of rclone? replace all <code>=</code> with <code> </code> (space)</li>
|
|
65
65
|
</ul>
|
|
66
66
|
|
|
67
|
-
<p>if you want to use the native WebDAV client in windows instead (slow and buggy), first run <a href="{{ r }}/.cpr/a/webdav-cfg.bat">webdav-cfg.bat</a> to remove the 47 MiB filesize limit (also fixes latency and password login), then connect:</p>
|
|
67
|
+
<p>if you want to use the native WebDAV client in windows instead (slow and buggy), first run <a href="{{ r }}/.cpr/a/webdav-cfg.txt?dl=webdav-cfg.bat">webdav-cfg.bat</a> to remove the 47 MiB filesize limit (also fixes latency and password login), then connect:</p>
|
|
68
68
|
<pre>
|
|
69
69
|
{%- if un %}
|
|
70
70
|
net use <b>w:</b> http{{ s }}://{{ ep }}/{{ rvp }}{% if accs %} <b>{{ pw }}</b> /user:{{ b_un }}{% endif %}
|
copyparty/web/tl/epo.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.19.
|
|
3
|
+
Version: 1.19.18
|
|
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
|
|
@@ -86,6 +86,7 @@ made in Norway 🇳🇴
|
|
|
86
86
|
|
|
87
87
|
* top
|
|
88
88
|
* [quickstart](#quickstart) - just run **[copyparty-sfx.py](https://github.com/9001/copyparty/releases/latest/download/copyparty-sfx.py)** -- that's it! 🎉
|
|
89
|
+
* [mirrors](#mirrors) - other places to download copyparty from
|
|
89
90
|
* [at home](#at-home) - make it accessible over the internet
|
|
90
91
|
* [on servers](#on-servers) - you may also want these, especially on servers
|
|
91
92
|
* [features](#features) - also see [comparison to similar software](./docs/versus.md)
|
|
@@ -222,7 +223,7 @@ just run **[copyparty-sfx.py](https://github.com/9001/copyparty/releases/latest/
|
|
|
222
223
|
|
|
223
224
|
* or install through [pypi](https://pypi.org/project/copyparty/): `python3 -m pip install --user -U copyparty`
|
|
224
225
|
* or if you cannot install python, you can use [copyparty.exe](#copypartyexe) instead
|
|
225
|
-
* or install [on arch](#arch-package) ╱ [on NixOS](#nixos-module) ╱ [through nix](#nix-package)
|
|
226
|
+
* or install [on arch](#arch-package) / [homebrew](#homebrew-formulae) ╱ [on NixOS](#nixos-module) ╱ [through nix](#nix-package)
|
|
226
227
|
* or if you are on android, [install copyparty in termux](#install-on-android)
|
|
227
228
|
* or maybe an iPhone or iPad? [install in a-Shell on iOS](#install-on-iOS)
|
|
228
229
|
* or maybe you have a [synology nas / dsm](./docs/synology-dsm.md)
|
|
@@ -260,6 +261,18 @@ some recommended options:
|
|
|
260
261
|
* see [accounts and volumes](#accounts-and-volumes) (or `--help-accounts`) for the syntax and other permissions
|
|
261
262
|
|
|
262
263
|
|
|
264
|
+
### mirrors
|
|
265
|
+
|
|
266
|
+
other places to download copyparty from (non-github links):
|
|
267
|
+
|
|
268
|
+
* https://copyparty.eu/ (hetzner, finland, official mirror):
|
|
269
|
+
* https://copyparty.eu/py = https://copyparty.eu/copyparty-sfx.py = the sfx
|
|
270
|
+
* https://copyparty.eu/en = https://copyparty.eu/copyparty-en.py = the english-only sfx
|
|
271
|
+
* https://copyparty.eu/pyz = https://copyparty.eu/copyparty.pyz = the zipapp
|
|
272
|
+
* https://copyparty.eu/enz = https://copyparty.eu/copyparty-en.pyz = the enterprise pyz
|
|
273
|
+
* https://copyparty.eu/cli = online cli helptext
|
|
274
|
+
|
|
275
|
+
|
|
263
276
|
### at home
|
|
264
277
|
|
|
265
278
|
make it accessible over the internet by starting a [cloudflare quicktunnel](https://developers.cloudflare.com/cloudflare-one/connections/connect-networks/do-more-with-tunnels/trycloudflare/) like so:
|
|
@@ -3131,7 +3144,8 @@ another emergency alternative, [copyparty.pyz](https://github.com/9001/copyparty
|
|
|
3131
3144
|
run it by doubleclicking it, or try typing `python copyparty.pyz` in your terminal/console/commandline/telex if that fails
|
|
3132
3145
|
|
|
3133
3146
|
it is a python [zipapp](https://docs.python.org/3/library/zipapp.html) meaning it doesn't have to unpack its own python code anywhere to run, so if the filesystem is busted it has a better chance of getting somewhere
|
|
3134
|
-
|
|
3147
|
+
|
|
3148
|
+
> there is also [copyparty-en.pyz](https://github.com/9001/copyparty/releases/latest/download/copyparty-en.pyz), english-only and without smb support (enterprise-friendly)
|
|
3135
3149
|
|
|
3136
3150
|
|
|
3137
3151
|
# install on android
|
|
@@ -1,7 +1,7 @@
|
|
|
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=hJUyXlxl7upqxONj_QDCAYhgNtSd9YHTdaCQt-DsEvw,3075
|
|
2
|
+
copyparty/__main__.py,sha256=OwUUZwfvpaOd97o_Sp-G68q3Q_XXKPjbh4D8LCUgNVc,150289
|
|
3
|
+
copyparty/__version__.py,sha256=JGvza0tjwt1CzfmJFfGXoXDMkFSeDpuRHCw-tDgV_rM,253
|
|
4
|
+
copyparty/authsrv.py,sha256=pOglyADjcWXPgPqlZeoS60GTJzH_uKmCXKPTDsoy7H4,136334
|
|
5
5
|
copyparty/broker_mp.py,sha256=QdOXXvV2Xn6J0CysEqyY3GZbqxQMyWnTpnba-a5lMc0,4987
|
|
6
6
|
copyparty/broker_mpw.py,sha256=LXQlmxzOvdpqP1aZoiIvWHAYUV_PoewLORLD1BGRs0g,3449
|
|
7
7
|
copyparty/broker_thr.py,sha256=fjoYtpSscUA7-nMl4r1n2R7UK3J9lrvLS3rUZ-iJzKQ,1721
|
|
@@ -10,10 +10,10 @@ copyparty/cert.py,sha256=OGTUBxhqPbseG0Bd4cHD6e5T5T8JdGqp3q0KAYqX0Cc,8031
|
|
|
10
10
|
copyparty/cfg.py,sha256=MPSVOamweuBhz65UdZQ7PVIzMle8BOyWQVBZBtesoZ4,17782
|
|
11
11
|
copyparty/dxml.py,sha256=VZADJS9z18LalENSvVfjk29ddnpaDQ-v8AVm_THwS1c,2607
|
|
12
12
|
copyparty/fsutil.py,sha256=kGvNM9G9YLeqcQjhDGfmT8gV7fn2WU0xye9BulL4h04,6469
|
|
13
|
-
copyparty/ftpd.py,sha256=
|
|
14
|
-
copyparty/httpcli.py,sha256=
|
|
13
|
+
copyparty/ftpd.py,sha256=skC-0LrG36qGFvhr1g1DDuwJLL2o1EJlrmnt71qknUM,18620
|
|
14
|
+
copyparty/httpcli.py,sha256=aNlTLRh6XXRVTizZLKxbGRDpsxWdcCsqmSAoy-Tli6s,251267
|
|
15
15
|
copyparty/httpconn.py,sha256=IA9fdCjigawZ4kWhgvVN3nSiy5pb3W2qaE6rFqUYdq0,6943
|
|
16
|
-
copyparty/httpsrv.py,sha256=
|
|
16
|
+
copyparty/httpsrv.py,sha256=0ELg4joFUkfJWTedca4l_3rbZ3G6R9JWEE91K2hymzA,19101
|
|
17
17
|
copyparty/ico.py,sha256=-7QjF_jIxnPo4Vr0oUPksQ_U_Ef0HRsSPm3s71idOz8,3879
|
|
18
18
|
copyparty/mdns.py,sha256=OfAms3kqolF5KFkorwwKH7ysd6_DRQzi3Ri62vTdCHA,19293
|
|
19
19
|
copyparty/metrics.py,sha256=1dim0ShnsD5cfspRbeN9Mt14wOIxPRtxCZY2IScikKw,8974
|
|
@@ -56,7 +56,7 @@ copyparty/stolen/ifaddr/_posix.py,sha256=-67NdfGrCktfQPakT2fLbjl2U00QMvyBGkSvrUu
|
|
|
56
56
|
copyparty/stolen/ifaddr/_shared.py,sha256=uNC4SdEIgdSLKvuUzsf1aM-H1Xrc_9mpLoOT43YukGs,6206
|
|
57
57
|
copyparty/stolen/ifaddr/_win32.py,sha256=EE-QyoBgeB7lYQ6z62VjXNaRozaYfCkaJBHGNA8QtZM,4026
|
|
58
58
|
copyparty/web/baguettebox.js.gz,sha256=B0gNOVblZWC3dcOektvuqT2jfVK99WY6ThRo9t1iu_A,9499
|
|
59
|
-
copyparty/web/browser.css.gz,sha256=
|
|
59
|
+
copyparty/web/browser.css.gz,sha256=QtHhYhn2MvMUPIL0JSlYHELpznO6DV53Oz41TVMvf20,15886
|
|
60
60
|
copyparty/web/browser.html,sha256=IxHHqvGMlrG8B4hYkoIaH2cX6qCOCCZ6TQbAx9oB8KY,4865
|
|
61
61
|
copyparty/web/browser.js.gz,sha256=vfurFx7CklzzYDs_GDJ_AXkTJHN-O46jO7gx4qr7WfI,72501
|
|
62
62
|
copyparty/web/browser2.html,sha256=NRUZ08GH-e2YcGXcoz0UjYg6JIVF42u4IMX4HHwWTmg,1587
|
|
@@ -83,16 +83,16 @@ copyparty/web/shares.js.gz,sha256=LGgFdYhtTwBp96x6CtWZpMWrGaZW7vn5LYvIhPQqm8g,94
|
|
|
83
83
|
copyparty/web/splash.css.gz,sha256=Ez7MRPtPzYEiSsLsI7S9o8_jGFQxUFvK2j92ow5AoDg,1155
|
|
84
84
|
copyparty/web/splash.html,sha256=NOYmsKmPpzJN0UbavTEq5Pfb9993URrOC9rBl6EJOBY,7578
|
|
85
85
|
copyparty/web/splash.js.gz,sha256=QPvYszEB_HAR98nb1pnEYnuuz23zHjH3wUTJGaa_Myo,1182
|
|
86
|
-
copyparty/web/svcs.html,sha256=
|
|
86
|
+
copyparty/web/svcs.html,sha256=V5NmGwzO3KKmeigu2BSx78Ukv6aqAGznJZhbHU4FsM0,17594
|
|
87
87
|
copyparty/web/svcs.js.gz,sha256=DapO-UcJYln4VPyZ6Pwi0Lzhlyx0Hul7y7E2ephu34c,971
|
|
88
88
|
copyparty/web/ui.css.gz,sha256=Txx36dDbFI7_9I2LPUO40nCFnxLFKVpdkBsHFwI7JoE,2848
|
|
89
|
-
copyparty/web/up2k.js.gz,sha256=
|
|
90
|
-
copyparty/web/util.js.gz,sha256
|
|
89
|
+
copyparty/web/up2k.js.gz,sha256=BP3SqLYK0yXcwIwxEDDec-MDs_wpku8BT9dbpCP-V-w,25169
|
|
90
|
+
copyparty/web/util.js.gz,sha256=-GTwa7gd_Qs4qhePihP23JeSr1gBjx0GH6ix904SC4k,16391
|
|
91
91
|
copyparty/web/w.hash.js.gz,sha256=rI-78PyXCdVjOpULbD9raBRyxxaPls5OjR7wonzXZPE,1193
|
|
92
92
|
copyparty/web/a/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
93
|
-
copyparty/web/a/partyfuse.py,sha256=
|
|
94
|
-
copyparty/web/a/u2c.py,sha256=
|
|
95
|
-
copyparty/web/a/webdav-cfg.
|
|
93
|
+
copyparty/web/a/partyfuse.py.gz,sha256=KsJ6UremoVn1OZvkzpHFO_6DdqLEyLRyvgJZzmogCog,7951
|
|
94
|
+
copyparty/web/a/u2c.py.gz,sha256=Tnr6DeROV4A4jOOIRNdRx9Gpr2TAIXQ6rEPQpq9BmF4,14366
|
|
95
|
+
copyparty/web/a/webdav-cfg.txt.gz,sha256=4fgQ587uE3s-U07MrybTPqlfVK0IBIHxpvBQB_5xuKU,720
|
|
96
96
|
copyparty/web/deps/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
97
97
|
copyparty/web/deps/busy.mp3.gz,sha256=ySTZiSMbGLJLioVUzUR2eEVemZQ-ACSgawJmw7lFvms,106
|
|
98
98
|
copyparty/web/deps/easymde.css.gz,sha256=s4eN1eVggiAyuK_LZjvHPTBFizw7TRuMU8DvMwB9_aA,3053
|
|
@@ -110,7 +110,7 @@ copyparty/web/deps/sha512.hw.js.gz,sha256=UAed2_ocklZCnIzcSYz2h4P1ycztlCLj-ewsRT
|
|
|
110
110
|
copyparty/web/tl/chi.js.gz,sha256=TMOdOsT5e6g5JkJSNfxMBj8j9Lcgp5CPAPSU_TBrWI4,14686
|
|
111
111
|
copyparty/web/tl/cze.js.gz,sha256=tWbPL2LyQj95z1THu0oIhKZT0xDW3nC3QqqyBUsSmEo,15424
|
|
112
112
|
copyparty/web/tl/deu.js.gz,sha256=Xw-PejKnh8VNEMkS9yh7FUgZYn_pj7G9iqgWlhpLbPM,15567
|
|
113
|
-
copyparty/web/tl/epo.js.gz,sha256=
|
|
113
|
+
copyparty/web/tl/epo.js.gz,sha256=_hVzbnd2EqZV8LIS5RPB1web7Y2-tWFPI9WmmTx-IJQ,14216
|
|
114
114
|
copyparty/web/tl/fin.js.gz,sha256=7SUK-xUwBe8aq49gPxdEX2GbjNCVzN4v_rJC7zZHgac,15168
|
|
115
115
|
copyparty/web/tl/fra.js.gz,sha256=9Jhn3878w-7BiMI9fRqZDJcWjs-8DJuLCza4LTC9bOU,15825
|
|
116
116
|
copyparty/web/tl/grc.js.gz,sha256=Q6vsE2hX8O7hv05AIjRXI46ozgHvsuifcz9S3Pse-e0,17752
|
|
@@ -126,9 +126,9 @@ copyparty/web/tl/spa.js.gz,sha256=pEqdC_qfbF1JNJQg5UX7bj6XXVZoLWzWCLkeT_oVNFk,14
|
|
|
126
126
|
copyparty/web/tl/swe.js.gz,sha256=JAz_p2ceHLxsu-lBfc3zcukszbnCDkcvE4IU4nzW2Kk,14393
|
|
127
127
|
copyparty/web/tl/tur.js.gz,sha256=yOgKEuZ8zpGJo7E-wPXIKjwVcQMAoDLDiJow_B3yomo,14977
|
|
128
128
|
copyparty/web/tl/ukr.js.gz,sha256=3ZUR27PBTI_QyhEcoX0yo6_KawvehTRzqbJ0q1pc_bo,17243
|
|
129
|
-
copyparty-1.19.
|
|
130
|
-
copyparty-1.19.
|
|
131
|
-
copyparty-1.19.
|
|
132
|
-
copyparty-1.19.
|
|
133
|
-
copyparty-1.19.
|
|
134
|
-
copyparty-1.19.
|
|
129
|
+
copyparty-1.19.18.dist-info/licenses/LICENSE,sha256=gOr4h33pCsBEg9uIy9AYmb7qlocL4V9t2uPJS5wllr0,1072
|
|
130
|
+
copyparty-1.19.18.dist-info/METADATA,sha256=Bk56Pc2lOPYT7tFd_v93D3c-qyrbbdB9MailgD1LdEM,182680
|
|
131
|
+
copyparty-1.19.18.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
|
|
132
|
+
copyparty-1.19.18.dist-info/entry_points.txt,sha256=4zw6a3rqASywQomiYLObjjlxybaI65LYYOTJwgKz7b0,128
|
|
133
|
+
copyparty-1.19.18.dist-info/top_level.txt,sha256=LnYUPsDyk-8kFgM6YJLG4h820DQekn81cObKSu9g-sI,10
|
|
134
|
+
copyparty-1.19.18.dist-info/RECORD,,
|