feat: plist merging

This commit is contained in:
zx
2024-11-26 22:07:22 -05:00
parent 403e5d65a5
commit e09351287b
6 changed files with 32 additions and 6 deletions

View File

@@ -50,6 +50,10 @@ def main() -> None:
"-k", metavar="icon", "-k", metavar="icon",
help="modify the app's icon" help="modify the app's icon"
) )
parser.add_argument(
"-l", metavar="plist",
help="a plist to merge with the app's Info.plist"
)
parser.add_argument( parser.add_argument(
"-x", metavar="entitlements", "-x", metavar="entitlements",
help="add or modify entitlements to the main binary" help="add or modify entitlements to the main binary"
@@ -99,7 +103,7 @@ def main() -> None:
) )
parser.add_argument( parser.add_argument(
"--version", action="version", version="cyan v1.4.1" "--version", action="version", version="cyan v1.4.2b"
) )
from cyan import logic from cyan import logic

View File

@@ -66,6 +66,8 @@ def main(parser: ArgumentParser) -> None:
app.plist.change_minimum_version(args.m) app.plist.change_minimum_version(args.m)
if args.k is not None: if args.k is not None:
app.change_icon(args.k, tmpdir) app.change_icon(args.k, tmpdir)
if args.l is not None:
app.plist.merge_plist(args.l)
if args.x is not None: if args.x is not None:
app.executable.merge_entitlements(args.x) app.executable.merge_entitlements(args.x)

View File

@@ -105,7 +105,7 @@ class AppBundle:
def change_icon(self, path: str, tmpdir: str) -> None: def change_icon(self, path: str, tmpdir: str) -> None:
try: try:
from PIL import Image from PIL import Image # type: ignore
except Exception: except Exception:
return print("[?] pillow is not installed, -k is not available") return print("[?] pillow is not installed, -k is not available")

View File

@@ -10,11 +10,13 @@ class Plist:
try: try:
with open(path, "rb") as f: with open(path, "rb") as f:
self.data: dict[str, Any] = plistlib.load(f) self.data: dict[str, Any] = plistlib.load(f)
self.success = True
except Exception: except Exception:
if throw: if throw:
sys.exit(f"[!] couldn't read {path}") sys.exit(f"[!] couldn't read {path}")
else:
return None self.success = False
self.path = path self.path = path
self.app_path = app_path self.app_path = app_path
@@ -44,7 +46,7 @@ class Plist:
try: try:
if all(self[key] == val for key in keys): if all(self[key] == val for key in keys):
return False return False
raise KeyError # lets pretend this was always here.. raise KeyError
except KeyError: except KeyError:
for key in keys: for key in keys:
self[key] = val self[key] = val
@@ -121,3 +123,18 @@ class Plist:
else: else:
print(f"[?] minimum version was already \"{minimum}\"") print(f"[?] minimum version was already \"{minimum}\"")
def merge_plist(self, path: str) -> None:
pl = Plist(path, throw=False)
if not pl.success:
return print(f"[!] couldn't parse {path}")
changed = False
for k, v in pl.data.items():
if self.change(v, k):
changed = True
if not changed:
print("[?] no modified plist entries")
else:
print("[*] set plist keys:", ", ".join(pl.data))

View File

@@ -67,6 +67,9 @@ def validate_inputs(args: Namespace) -> Optional[str]:
if args.k is not None and not os.path.isfile(args.k): if args.k is not None and not os.path.isfile(args.k):
sys.exit(f"[!] {args.k} does not exist") sys.exit(f"[!] {args.k} does not exist")
if args.l is not None and not os.path.isfile(args.l):
sys.exit(f"[!] {args.l} does not exist")
if args.cyan is not None and not os.path.isfile(args.cyan): if args.cyan is not None and not os.path.isfile(args.cyan):
sys.exit(f"[!] {args.cyan} does not exist") sys.exit(f"[!] {args.cyan} does not exist")

View File

@@ -4,7 +4,7 @@ from setuptools import setup
setup( setup(
name="cyan", name="cyan",
version="1.4.1", version="1.4.2b",
description="finally, pyzule doesn't suck", description="finally, pyzule doesn't suck",
author="zx", author="zx",
author_email="zx@hrzn.email", author_email="zx@hrzn.email",