Files
copyparty/scripts/pyinstaller/loader.py

138 lines
3.2 KiB
Python
Raw Normal View History

2022-09-19 00:59:54 +02:00
# coding: utf-8
2023-02-21 19:18:10 +00:00
import base64
import hashlib
2023-02-14 21:50:14 +00:00
import os
import re
import shutil
import subprocess as sp
import sys
import traceback
2022-09-19 00:59:54 +02:00
v = r"""
2023-02-14 21:50:14 +00:00
this 32-bit copyparty.exe is compatible with Windows7-SP1 and later.
To make this possible, the EXE was compiled with Python 3.7.9,
which is EOL and does not receive security patches anymore.
if possible, for performance and security reasons, please use this instead:
https://github.com/9001/copyparty/releases/latest/download/copyparty-sfx.py
"""
if sys.version_info > (3, 10):
v = r"""
this 64-bit copyparty.exe is compatible with Windows 8 and later.
No security issues were known to affect this EXE at build time,
however that may have changed since then.
2022-09-19 00:59:54 +02:00
2022-09-19 23:49:07 +02:00
if possible, for performance and security reasons, please use this instead:
2022-09-19 00:59:54 +02:00
https://github.com/9001/copyparty/releases/latest/download/copyparty-sfx.py
"""
2022-12-07 21:35:53 +00:00
try:
print(v.replace("\n", "\n▒▌ ")[1:] + "\n")
except:
print(v.replace("\n", "\n|| ")[1:] + "\n")
2022-09-19 00:59:54 +02:00
2022-09-20 21:40:56 +02:00
def confirm(rv):
print()
print("retcode", rv if rv else traceback.format_exc())
print("*** hit enter to exit ***")
try:
input()
except:
pass
sys.exit(rv or 1)
2023-02-21 19:18:10 +00:00
def ckck():
hs = hashlib.sha512()
with open(sys.executable, "rb") as f:
f.seek(-12, 2)
rem = f.tell()
esum = f.read().decode("ascii", "replace")
f.seek(0)
while rem:
buf = f.read(min(rem, 64 * 1024))
rem -= len(buf)
hs.update(buf)
if not buf:
t = "unexpected eof @ {} with {} left"
raise Exception(t.format(f.tell(), rem))
fsum = base64.b64encode(hs.digest()[:9]).decode("utf-8")
if fsum != esum:
t = "exe integrity check error; [{}] != [{}]"
raise Exception(t.format(esum, fsum))
ckck()
2022-09-20 21:40:56 +02:00
def meicln(mod):
2022-09-19 00:59:54 +02:00
pdir, mine = os.path.split(mod)
dirs = os.listdir(pdir)
dirs = [x for x in dirs if x.startswith("_MEI") and x != mine]
dirs = [os.path.join(pdir, x) for x in dirs]
rm = []
for d in dirs:
if os.path.isdir(os.path.join(d, "copyparty", "web")):
rm.append(d)
if not rm:
return
print("deleting abandoned SFX dirs:")
for d in rm:
print(d)
for _ in range(9):
try:
shutil.rmtree(d)
break
except:
pass
print()
def meichk():
filt = "copyparty"
if filt not in sys.executable:
filt = os.path.basename(sys.executable)
pids = []
ptn = re.compile(r"^([^\s]+)\s+([0-9]+)")
2022-10-19 00:06:48 +02:00
try:
procs = sp.check_output("tasklist").decode("utf-8", "replace")
except:
procs = "" # winpe
2022-09-19 00:59:54 +02:00
for ln in procs.splitlines():
m = ptn.match(ln)
if m and filt in m.group(1).lower():
pids.append(int(m.group(2)))
mod = os.path.dirname(os.path.realpath(__file__))
if os.path.basename(mod).startswith("_MEI") and len(pids) == 2:
2022-09-20 21:40:56 +02:00
meicln(mod)
2022-09-19 00:59:54 +02:00
meichk()
from copyparty.__main__ import main
2022-09-20 21:40:56 +02:00
try:
main()
except SystemExit as ex:
c = ex.code
if c not in [0, -15]:
confirm(ex.code)
except KeyboardInterrupt:
pass
except:
confirm(0)