From 60072a08f17f1fe88fba87547b33417e6ced6f80 Mon Sep 17 00:00:00 2001 From: MeowOS Date: Mon, 31 Aug 2026 04:56:24 +0800 Subject: [PATCH] =?UTF-8?q?feat(pkg):=20version=5Fcode=20=E5=AE=89?= =?UTF-8?q?=E5=8D=93=E5=BC=8F=E7=89=88=E6=9C=AC=E8=A7=84=E5=88=99=E8=90=BD?= =?UTF-8?q?=E5=9C=B0=20(agent-190,=20=E7=94=A8=E6=88=B7=E5=AE=9A=E6=A1=88?= =?UTF-8?q?=20APPS=20=C2=A73.8)=20=E2=80=94=20app.json=20=E5=A2=9E=20versi?= =?UTF-8?q?on=5Fcode(=E7=BA=AF=E6=95=B0=E5=AD=97=E5=94=AF=E4=B8=80?= =?UTF-8?q?=E6=AF=94=E8=BE=83=E4=BE=9D=E6=8D=AE),=20version=20=E4=BB=85?= =?UTF-8?q?=E6=98=BE=E7=A4=BA;=20nyai=20install/upgrade/list-upgradable/in?= =?UTF-8?q?dex=20=E5=85=A8=E8=B5=B0=20code=20=E6=AF=94=E8=BE=83(=E7=BC=BA?= =?UTF-8?q?=20code=20=E6=8B=92=E8=A3=85);=20launcher=20meow=5Fpkg=5Finstal?= =?UTF-8?q?l=20=E5=90=8C=E6=AD=A5=E9=97=A8=E7=A6=81;=20=E6=97=A7=E7=82=B9?= =?UTF-8?q?=E5=88=86=E6=AF=94=E8=BE=83=E5=87=BD=E6=95=B0=E7=A7=BB=E9=99=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit nyai f2938d28→4cf5f690; launcher 24c9ee5d→ab8e610f; 宿主 9 场景全过(升/同版/降级拒/缺code拒/index/upgrade一致) 出入: 全新安装缺 code 放行(门禁仅 replacing 分支); export 保留签名的版本比对仍用显示版字符串(nyai+launcher 一致,待后续统一) --- patch_v2/meow_launcherd/app_launcher.c | 20 ++++ patch_v2/meow_launcherd/meow_launcherd | Bin 528508 -> 534508 bytes patch_v2/meowpkg/nyai | Bin 112428 -> 112428 bytes patch_v2/meowpkg/nyai.c | 131 +++++++++++-------------- patch_v2/meowpkg/nyai_host | Bin 73896 -> 73816 bytes 5 files changed, 75 insertions(+), 76 deletions(-) diff --git a/patch_v2/meow_launcherd/app_launcher.c b/patch_v2/meow_launcherd/app_launcher.c index 0d0ae05..e2e848f 100644 --- a/patch_v2/meow_launcherd/app_launcher.c +++ b/patch_v2/meow_launcherd/app_launcher.c @@ -620,6 +620,26 @@ int meow_pkg_install(const char *mpk_path) logmsg("pkg_install: meow_verify unavailable rc=%d, %s unverified (3rd party)", vr, pkg); } + /* 防降级门禁(与 nyai 同规范,APPS.md §3.8):仅按 version_code 比较。 + * 新版 code < 已装 → 拒;相等 → 允许重装;任一侧缺 version_code → 拒。 */ + if (replacing) { + char nc[32], oc[32]; + long long ncode = -1, ocode = -1; + int nok = 0, ok2 = 0; + if (pkg_json_field_mpk(mpk_path, "version_code", nc, sizeof nc) == 0) { + char *ep; long long v = strtoll(nc, &ep, 10); + if (ep != nc && *ep == '\0') { ncode = v; nok = 1; } + } + char instj[280]; + snprintf(instj, sizeof instj, "/usr/data/mnt/sd_0/MeowAPPs/%s/app.json", pkg); + if (pkg_json_field(instj, "version_code", oc, sizeof oc) == 0) { + char *ep; long long v = strtoll(oc, &ep, 10); + if (ep != oc && *ep == '\0') { ocode = v; ok2 = 1; } + } + if (!nok || !ok2) { logmsg("pkg_install: %s version_code missing, reject", pkg); return -4; } + if (ncode < ocode) { logmsg("pkg_install: downgrade %s new %lld < old %lld, reject", pkg, ncode, ocode); return -4; } + } + /* BusyBox tar 无 -z:用 gzip -dc | tar -x 处理 tar.gz。 */ snprintf(cmd, sizeof cmd, "rm -rf '%s' 2>/dev/null; " diff --git a/patch_v2/meow_launcherd/meow_launcherd b/patch_v2/meow_launcherd/meow_launcherd index e1b32b607fedd18fa543c973ab6aa43cc2f61687..d15a02a3024fbc47393e0430e3f263566d3152c3 100755 GIT binary patch delta 168665 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