From 829d4475e8d376899083a8efcb64c78a05835f5f Mon Sep 17 00:00:00 2001 From: AskaEth Date: Tue, 10 Nov 2026 21:08:59 +0800 Subject: [PATCH 1/2] =?UTF-8?q?feat(nyai):=20M35=20=E5=8C=85=E8=BA=AB?= =?UTF-8?q?=E4=BB=BD=E4=BB=A5=E5=B7=B2=E7=AD=BE=E5=90=8D=20app.json=20?= =?UTF-8?q?=E6=B8=85=E5=8D=95=E4=B8=BA=E5=87=86=20+=20=E6=9A=82=E5=AD=98?= =?UTF-8?q?=E8=BF=81=E5=88=B0=20SD=20=E5=B9=B6=E5=BF=85=E6=B8=85=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 包名/版本/依赖不再从 .mpk 文件名推导(用户定案:不对安装包文件名强依赖, 一切信息从清单取),改为解包后读 app.json.package 作唯一权威: - 落地目录 MeowAPPs/、meow_verify --package 、防降级基准全用清单包名; - 新增 footer.package == app.json.package 一致性检查,不一致拒装并同时报两个名字; - valid_pkg 拒绝 "." / ".."(此前 MeowAPPs/.. 可越出安装目录并被 rm_rf); - index 的 Package 字段同样取自清单(缺 package 的包跳过并告警); - scan/export 同步;--help 与错误文案去掉「需要 .mpk」。 暂存:MeowAPPs/.stg__(/usr/data NAND,仅剩 4MB) → /MeowOS/tmp/pkgs/---/(真机即 SD 卡): - mkdir 原子占位 + 失败重试 + pid/序号保证唯一,时间戳只给人看; - SD 未挂载/不可写直接拒装(不回退 /usr/data:目标本就在 SD,且跨 fs rename 会 EXDEV); - 解包前后各一道防护:tar -tv 只允许普通文件/目录(拒符号链接/硬链接/设备/FIFO), 解包后复核暂存树(非普通文件、nlink>1 一律拒); - 中央化 cleanup + SIGINT/SIGTERM/SIGHUP handler(先收子进程组再清)+ atexit 兜底, 成功/验签失败/清单非法/降级/解压失败/被中断全部删除暂存目录。 真机 time() 受 zig 0.17 mipsel time64 ABI 缺陷影响返回垃圾(实测 3381223399391169494、 localtime_r=NULL),故时间戳直取内核 o32 time32(syscall 4263)并自行换算 UTC, 不依赖 libc time()/localtime_r()。 upgrade 复用 install 同一实现(清单包名必须等于目标包名、目标必须已装)。 新增 host 回归 patch_v2/meowpkg/test_nyai.sh(49 断言:改名包/真实 0.1.7 反例/ footer≠清单/os.meow 无签名/第三方无签名/恶意包名/解压失败/SIGTERM/索引路径/upgrade)。 真机验证(固件 0.8.48,二进制只放 MeowOS/tmp,未覆盖 /usr/bin/nyai): os.meow.reader-0.1.4.bak.mpk 现在「签名校验通过 (package=os.meow.reader)」后才被 降级门禁拒绝(旧版此处是包名不符);weird-name.bin 装成 dev.m35.probe;SIGTERM 中断后暂存目录为空;Music=199164544、/usr/bin/nyai md5 a7d24553… 均未变。 --- patch_v2/meowpkg/nyai | Bin 113612 -> 150452 bytes patch_v2/meowpkg/nyai.c | 650 ++++++++++++++++++++++++++-------- patch_v2/meowpkg/nyai_host | Bin 73848 -> 46240 bytes patch_v2/meowpkg/test_nyai.sh | 244 +++++++++++++ 4 files changed, 746 insertions(+), 148 deletions(-) create mode 100755 patch_v2/meowpkg/test_nyai.sh diff --git a/patch_v2/meowpkg/nyai b/patch_v2/meowpkg/nyai index 3e7fccb102aef4e0668157a9f7a9e683c17182b9..3d1b5ae6bb7f3c130fc65bebd370f6fc98e40a4b 100755 GIT binary patch literal 150452 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�&rmSFIC*E&;W`^GVc1#Xac?y|Drt6>{S8$1 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 K?}~Er=l=&6-+XWY diff --git a/patch_v2/meowpkg/nyai.c b/patch_v2/meowpkg/nyai.c index d09b2d8..3757894 100644 --- a/patch_v2/meowpkg/nyai.c +++ b/patch_v2/meowpkg/nyai.c @@ -6,32 +6,54 @@ * - 源配置 MeowOS/opt/nyai/sources.list(每行一个源;local <路径> / http / * deb [trusted=yes] / file:// ; # 注释)。默认 local MeowOS/opt/repo。 * - 每源一个 Packages 索引(行式 Package/Version/Version-Code/Filename/Size/SHA256/Depends/Description), - * 由 `nyai index <目录>` 生成。 + * 由 `nyai index <目录>` 生成;Package 字段取自包内 app.json.package。 * - update 缓存索引到 MeowOS/opt/nyai/cache;install 按名称从索引取包(本地文件或 http 拉取), * 处理 Depends(递归)、校验 SHA256 + app.json;同 name 先备份;解压 MeowAPPs//; * 数据 init(MeowData//{data,cache})。exFAT 无符号链接 → 数据目录由环境变量注入,不建链接。 * + * 包身份(M35):**包名/版本/依赖全部来自包内 app.json**,文件名与后缀只作路径,不参与身份判定。 + * 安装流:解包到 SD 暂存目录 → 读 app.json(验签前,无循环依赖)→ 校验 footer.package 与 + * app.json.package 一致 → 用清单包名调 meow_verify → 防降级 → rename 部署。 + * 暂存目录 = /MeowOS/tmp/pkgs/---/,成功/失败/被信号中断都删。 + * * 路径前缀默认 /usr/data/mnt/sd_0;环境变量 MEOWROOT 可覆盖(仅本地 qemu/原生测试用,真机不设)。 */ #include #include +#include #include #include #include #include +#include #include #include +#include +#include +#include #include #include #include -#define NYAI_VERSION "0.2.0" +#define NYAI_VERSION "0.3.0" #define BUF 1024 #define MAX_SRC 16 #define MAX_PKG 256 #define MAX_DEPS 64 #define MAX_DEPTH 32 +/* 解包暂存目录根(相对 MeowROOT;真机 = /usr/data/mnt/sd_0/MeowOS/tmp/pkgs)。 + * 每次安装一个子目录 ---,无论成败都删。 */ +#define STG_SUBDIR "MeowOS/tmp/pkgs" + +/* .mpk 签名 footer 布局(与 patch_v2/meow_verify/meow_sig.h 同步;此处只读 package 用于 + * 「footer.package vs app.json.package」一致性检查——真正的验签仍由 meow_verify 执行)。 */ +#define SIG_MAGIC "MEOWSIG1" +#define SIG_PKG_MAX 64 +#define SIG_BLOCK_LEN_V1 180 +#define SIG_BLOCK_LEN_V2 184 +#define SIG_OFF_PKG 12 + /* ---------------- 路径 ---------------- */ static const char *meow_root(void) { @@ -46,6 +68,8 @@ static void path_cache(char *out, int n) { snprintf(out,n,"%s/MeowOS/opt/nyai/cache", meow_root()); } static void path_repo_default(char *out, int n) { snprintf(out,n,"%s/MeowOS/opt/repo", meow_root()); } +static void path_stg_base(char *out, int n) +{ snprintf(out,n,"%s/%s", meow_root(), STG_SUBDIR); } /* ---------------- 源结构 ---------------- */ typedef struct { @@ -87,10 +111,11 @@ static void strip_comment(char *s) if (p) *p = 0; } -/* 包名合法:仅 [A-Za-z0-9._-] */ +/* 包名合法:仅 [A-Za-z0-9._-],且拒绝 "." / ".."(否则 MeowAPPs/ 会越出安装目录)。 */ static int valid_pkg(const char *s) { if (!s || !*s) return 0; + if (!strcmp(s, ".") || !strcmp(s, "..")) return 0; for (; *s; s++) if (!(isalnum((unsigned char)*s) || *s=='.' || *s=='-' || *s=='_')) return 0; return 1; @@ -100,6 +125,9 @@ static int unsafe_path(const char *s) return s && strpbrk(s, " ;`$'\"&|<>") != NULL; } +/* 前向声明:错误前缀(install/upgrade),定义见安装期安全设施一节。 */ +static void op_err(const char *fmt, ...); + static int mkdir_p(const char *path) { char buf[BUF]; @@ -156,6 +184,92 @@ static void human_size(long long b, char *out, int n) else snprintf(out,n,"%.2f MB", b/(1024.0*1024)); } +/* ---------------- 时钟 / 暂存目录 ---------------- */ +/* 真机 time() 不可用:zig 0.17 自带 musl 在 mipsel 上把 time64 入口编成了 time32, + * 而 struct timespec 按 16 字节声明 → time() 返回「秒 + 纳秒<<32」的垃圾值 + * (实测 time()=3381223399391169494,见 devdocs/CLOCK_ABI.md)。这里直接走内核 o32 + * time32 ABI(SYS_clock_gettime=4263,缓冲 8 字节 {int32 sec,int32 nsec},真机实测正确)。 + * 该时间只用于给人看的目录名,唯一性由 mkdir(2) 失败重试 + pid 保证。 */ +static long long nyai_now(void) +{ +#if defined(__mips__) && !defined(__mips64) + struct { int32_t tv_sec, tv_nsec; } tv = { 0, 0 }; + if (syscall(4263, 0 /* CLOCK_REALTIME */, &tv) == 0 && tv.tv_sec > 0) + return (long long)tv.tv_sec; + return 0; +#else + return (long long)time(NULL); +#endif +} + +/* UTC "YYYYmmdd-HHMMSS"(localtime_r 在真机同样受 time64 缺陷影响返回 NULL,故自己算)。 */ +static void fmt_utc(long long sec, char *out, int n) +{ + if (sec <= 0) { snprintf(out, n, "t0"); return; } + long long z = sec / 86400 + 719468; /* civil_from_days */ + long long era = (z >= 0 ? z : z - 146096) / 146097; + unsigned doe = (unsigned)(z - era * 146097); + unsigned yoe = (doe - doe/1460 + doe/36524 - doe/146096) / 365; + long long y = (long long)yoe + era * 400; + unsigned doy = doe - (365*yoe + yoe/4 - yoe/100); + unsigned mp = (5*doy + 2)/153; + unsigned d = doy - (153*mp+2)/5 + 1; + unsigned m = mp + (mp < 10 ? 3 : 9); /* 1..12 */ + if (m <= 2) y++; + long long rem = sec % 86400; + snprintf(out, n, "%04lld%02u%02u-%02u%02u%02u", y, m, d, + (unsigned)(rem/3600), (unsigned)((rem%3600)/60), (unsigned)(rem%60)); +} + +/* 路径是否正好是某个挂载点(读 /proc/mounts 第二列)。1=是 0=否 -1=读不到。 */ +static int is_mount_point(const char *path) +{ + FILE *f = fopen("/proc/mounts", "r"); + if (!f) return -1; + char dev[256], mnt[512]; + int hit = 0; + while (fscanf(f, "%255s %511s %*s %*s %*s %*s", dev, mnt) == 2) { + if (!strcmp(mnt, path)) { hit = 1; break; } + } + fclose(f); + return hit; +} + +/* 准备暂存根:返回 0 成功;失败已打印原因并返回 -1。 + * SD 未挂载 / 不可写时**拒绝安装**(不回退 /usr/data):安装目标 MeowAPPs 本身就在 SD 上, + * 卡不在装也没意义;且 /usr/data 只剩 ~4MB,跨文件系统 rebase 还会让部署 rename 变 EXDEV。 */ +static int stg_prepare(char *base, int n) +{ + path_stg_base(base, n); + /* 真机根(/usr/data/...)必须是真实挂载点;宿主/CI 的 MEOWROOT 沙箱不查。 */ + const char *root = meow_root(); + int dev_root = !strcmp(root, "/usr/data") || !strncmp(root, "/usr/data/", 10); + if (dev_root && is_mount_point(root) != 1) { + op_err("暂存目录 %s 不可用:SD 卡未挂载(%s 不是挂载点),拒绝安装\n", base, root); + return -1; + } + if (mkdir_p(base) != 0 || access(base, W_OK) != 0) { + op_err("暂存目录 %s 不可用(SD 卡只读/写满?): %s\n", base, strerror(errno)); + return -1; + } + return 0; +} + +/* 建暂存目录(解包前包名未知,用 .prep 前缀):mkdir(2) 原子占位 + 失败递增重试; + * 唯一性由 mkdir 的 EEXIST + pid + 序号保证,时间戳只给人看。 */ +static int stg_mkdir(const char *base, char *out, int n) +{ + char ts[32]; + fmt_utc(nyai_now(), ts, sizeof ts); + for (int i = 0; i < 100; i++) { + if (snprintf(out, n, "%s/.prep-%s-%d-%d", base, ts, (int)getpid(), i) >= n) return -1; + if (mkdir(out, 0755) == 0) return 0; + if (errno != EEXIST) return -1; + } + return -1; +} + + /* ---------------- JSON 读取 ---------------- */ static int json_str(const char *j, const char *key, char *out, int n) { @@ -288,8 +402,21 @@ static int load_app_meta(const char *path, appmeta *m) return 0; } -/* 从 .mpk 里尽力读 app.json 字段(name/version/depends/description)。 - * 用 tar -t 定位成员,再 tar -xO 取内容;失败返回 -1。 */ +/* 从 .mpk 里尽力读 app.json 字段(package/name/version/depends/description)。 + * 用 tar -t 定位成员,再 tar -xO 取内容;失败返回 -1。 + * 成员名来自归档本身 → 保持原样('./app.json' 与 'app.json' 在 tar 里是不同名字), + * 但必须先做 shell/选项注入校验:禁前导 '-'(会被当成 tar 选项)、禁 shell 元字符、 + * 禁控制字符、禁 '..'(index/scan 会对任意文件调用)。 */ +static int member_safe_for_arg(const char *s) +{ + if (!s || !*s || *s == '-') return 0; + if (unsafe_path(s)) return 0; + if (strstr(s, "..")) return 0; + for (const char *p = s; *p; p++) + if ((unsigned char)*p < 0x20 || *p == 0x7f) return 0; + return 1; +} + static int mpk_appinfo(const char *file, appmeta *m) { memset(m, 0, sizeof *m); @@ -304,6 +431,7 @@ static int mpk_appinfo(const char *file, appmeta *m) size_t mlen=strlen(mm); while (mlen&&(mm[mlen-1]=='\n'||mm[mlen-1]=='\r'||mm[mlen-1]==' ')) mm[--mlen]=0; pclose(pf); if (!mlen) return -1; + if (!member_safe_for_arg(mm)) return -1; snprintf(cmd,sizeof cmd,"gzip -dc '%s' 2>/dev/null | tar -xO '%s' 2>/dev/null", file, mm); pf = popen(cmd, "r"); if (!pf) return -1; @@ -313,6 +441,7 @@ static int mpk_appinfo(const char *file, appmeta *m) if (!r) return -1; j[r]=0; if (json_str(j,"name",m->name,sizeof m->name)!=0 || !m->name[0]) return -1; + if (json_str(j,"package",m->package,sizeof m->package)!=0) m->package[0]=0; if (json_str(j,"version",m->version,sizeof m->version)!=0) m->version[0]=0; m->has_version_code = (json_int(j,"version_code",&m->version_code)==0); if (json_str(j,"depends",m->depends,sizeof m->depends)!=0) m->depends[0]=0; @@ -495,7 +624,7 @@ static int pkg_installed(const char *pkg) return access(p, R_OK) == 0; } -static int install_mpk_file(const char *mpk_path); +static int install_mpk_file(const char *mpk_path, const char *expect_pkg, int must_be_installed); /* 按记录安装一个索引包(含 sha256 校验 + 依赖),done 记录已装避免循环 */ static int install_rec(pkgrec *r, pkgrec *recs, int nrec, char (*done)[128], int ndone, int depth); @@ -586,7 +715,7 @@ static int install_rec(pkgrec *r, pkgrec *recs, int nrec, char (*done)[128], int return 1; } } - int rc = install_mpk_file(local); + int rc = install_mpk_file(local, r->pkg, 0); if (s->http) remove(local); return rc; } @@ -624,9 +753,11 @@ static int cmd_update(void) } /* ---------------- index ---------------- + * 索引的 Package 字段 = 包内 app.json.package(**不看文件名**;文件名只作 Filename 定位)。 + * 清单缺 package / 非法 → 跳过并告警,不入索引(否则 install 时验签与落盘目录会错)。 * 注意(MPK_SIGNATURE_DESIGN §5.5):索引记录的 SHA256 = 整包哈希(含尾部签名 footer 的 .mpk)。 * 必须先 `meow_sign sign .mpk` 完成签名、再 `nyai index `,否则索引与装后的整包不一致, - * install 的 sha256_file 校验会失败。本命令不改,仅标注此顺序约束(签名分级见 install_mpk_file)。 */ + * install 的 sha256_file 校验会失败。 */ static int cmd_index(const char *dir) { if (!dir || !*dir) { fprintf(stderr,"nyai: index: 缺目录\n"); return 2; } @@ -646,15 +777,16 @@ static int cmd_index(const char *dir) if (L<4 || strcmp(de->d_name+L-4, ".mpk")!=0) continue; char fpath[BUF]; snprintf(fpath,sizeof fpath,"%s/%s", r, de->d_name); struct stat st; if (stat(fpath,&st)!=0) continue; - char stem[128]; snprintf(stem,sizeof stem,"%.*s", (int)(L-4), de->d_name); appmeta m; char ver[64]="", dep[256]="", desc[256]=""; - if (mpk_appinfo(fpath,&m)==0) { - snprintf(ver,sizeof ver,"%s", m.version); snprintf(dep,sizeof dep,"%s", m.depends); - snprintf(desc,sizeof desc,"%s", m.description[0]?m.description:m.name); + if (mpk_appinfo(fpath,&m)!=0 || !m.package[0] || !valid_pkg(m.package)) { + fprintf(stderr,"nyai: index: 跳过 %s(app.json 缺合法 package 字段)\n", de->d_name); + continue; } + snprintf(ver,sizeof ver,"%s", m.version); snprintf(dep,sizeof dep,"%s", m.depends); + snprintf(desc,sizeof desc,"%s", m.description[0]?m.description:m.name); char sha[128]=""; sha256_file(fpath, sha, sizeof sha); - fprintf(f,"Package: %s\n", stem); + fprintf(f,"Package: %s\n", m.package); fprintf(f,"Version: %s\n", ver[0]?ver:"0.0.0"); if (m.has_version_code) fprintf(f,"Version-Code: %lld\n", m.version_code); fprintf(f,"Filename: %s\n", de->d_name); @@ -663,7 +795,7 @@ static int cmd_index(const char *dir) if (dep[0]) fprintf(f,"Depends: %s\n", dep); if (desc[0]) fprintf(f,"Description: %s\n", desc); fprintf(f,"\n"); - printf(" %s (%s)\n", stem, ver[0]?ver:"0.0.0"); + printf(" %s (%s)\n", m.package, ver[0]?ver:"0.0.0"); n++; } fclose(f); @@ -855,117 +987,362 @@ static void nyai_check_bin_depends(const appmeta *m) } } -/* ---------------- install(文件或名称) ---------------- */ -static int install_mpk_file(const char *mpk_path) +/* ---------------- 安装期安全设施:信号清理 / 子进程 / 成员检查 / footer 读取 ---------------- */ +static const char *g_op = "install"; /* 当前操作名(错误前缀:install / upgrade) */ +static char g_stg[BUF]; /* 当前暂存目录(空 = 无);所有退出路径都要清 */ +static pid_t g_child = -1; +static volatile sig_atomic_t g_sig = 0; + +static void op_err(const char *fmt, ...) { - if (!mpk_path || !*mpk_path) { fprintf(stderr,"nyai: install: 缺 .mpk 路径\n"); return 2; } - if (access(mpk_path, R_OK)!=0) { fprintf(stderr,"nyai: install: 打不开 %s\n", mpk_path); return 1; } - if (unsafe_path(mpk_path)) { fprintf(stderr,"nyai: install: 路径含非法字符\n"); return 1; } - const char *bn = strrchr(mpk_path,'/'); - bn = bn ? bn+1 : mpk_path; - const char *dot = strrchr(bn,'.'); - if (!dot || strcmp(dot,".mpk")!=0) { fprintf(stderr,"nyai: install: 需要 .mpk\n"); return 1; } - char pkg[64]; - int len=(int)(dot-bn); - if (len<=0 || len>=(int)sizeof pkg) { fprintf(stderr,"nyai: install: 包名无效\n"); return 1; } - memcpy(pkg,bn,len); pkg[len]=0; - if (!valid_pkg(pkg)) { fprintf(stderr,"nyai: install: 包名含非法字符: %s\n", pkg); return 1; } + va_list ap; + va_start(ap, fmt); + fprintf(stderr, "nyai: %s: ", g_op); + vfprintf(stderr, fmt, ap); + va_end(ap); +} + +/* 删掉本次的暂存目录(幂等;atexit / 信号 / 各失败分支共用)。 */ +static void stg_cleanup(void) +{ + if (!g_stg[0]) return; + rm_rf(g_stg); + g_stg[0] = 0; +} + +/* SIGINT/SIGTERM/SIGHUP:先收掉自己的子进程组(gzip|tar 还在写暂存目录时不能直接删), + * 主流程在下一个检查点清理并退出(stg_check_signal)。 */ +static void on_term(int sig) +{ + g_sig = sig; + if (g_child > 0) kill(-g_child, SIGTERM); +} + +/* 有挂起信号 → 清暂存目录并按惯例退出码退出。在所有阻塞步骤后调用。 */ +static void stg_check_signal(void) +{ + if (!g_sig) return; + if (g_stg[0]) op_err("收到信号 %d,已清理暂存目录 %s\n", (int)g_sig, g_stg); + stg_cleanup(); + exit(128 + (int)g_sig); +} + +/* 跑 shell 命令:子进程单独成组(setpgid),信号时整组收掉。 + * 返回 0=成功;非 0=子进程退出码;-1=派生失败或被信号中断。 */ +static int run_shell(const char *cmd) +{ + pid_t pid = fork(); + if (pid < 0) return -1; + if (pid == 0) { + setpgid(0, 0); + execl("/bin/sh", "sh", "-c", cmd, (char *)NULL); + _exit(127); + } + setpgid(pid, pid); + g_child = pid; + int st = 0; + for (;;) { + pid_t r = waitpid(pid, &st, 0); + if (r == pid) break; + if (r < 0 && errno == EINTR) { if (g_sig) kill(-pid, SIGTERM); continue; } + g_child = -1; + return -1; + } + g_child = -1; + if (g_sig) return -1; + if (!WIFEXITED(st)) return -1; + return WEXITSTATUS(st); +} + +/* 把不可打印字节换成 '?'(错误信息回显归档内容时防终端控制字符)。 */ +static void scrub(char *s) +{ + for (; *s; s++) { + unsigned char c = (unsigned char)*s; + if (c < 0x20 || c == 0x7f) *s = '?'; + } +} + +/* 解包前逐条检查归档成员类型(tar -tv 首列):只允许普通文件 '-' 与目录 'd'。 + * 符号链接/硬链接/设备/FIFO 一律拒绝(防「先建链、后续成员写穿到目录外」)。 + * 名字穿越交由 tar 自身剥离(busybox 1.31 真机实测:'../x'→'x'、'/x'→'x'); + * 解包后再用 stg_tree_ok() 复核暂存树。 + * 返回 0 通过 / -2 成员类型非法 / -3 空归档 / -1 读失败。 */ +static int mpk_check_members(const char *mpk) +{ + char cmd[BUF]; + snprintf(cmd, sizeof cmd, "gzip -dc '%s' 2>/dev/null | tar -tv 2>/dev/null", mpk); + FILE *pf = popen(cmd, "r"); + if (!pf) return -1; + char line[1200]; + int n = 0, bad = 0; + while (fgets(line, sizeof line, pf)) { + n++; + if (line[0] != '-' && line[0] != 'd') { + char *e = line + strlen(line); + while (e > line && (e[-1] == '\n' || e[-1] == '\r')) *--e = 0; + op_err("包内含链接/特殊文件(仅允许普通文件与目录),拒绝安装: %s\n", line); + bad = 1; + break; + } + } + pclose(pf); + if (bad) return -2; + return n ? 0 : -3; +} + +/* 解包后复核暂存树:只允许普通文件与目录;普通文件的 st_nlink 必须为 1 + * (硬链接到外部文件会表现为 nlink>1)。0=通过。 */ +static int stg_tree_ok(const char *path) +{ + struct stat st; + if (lstat(path, &st) != 0) return 0; + if (S_ISDIR(st.st_mode)) { + DIR *d = opendir(path); + if (!d) return 0; + int ok = 1; + struct dirent *de; + while ((de = readdir(d))) { + if (!strcmp(de->d_name,".") || !strcmp(de->d_name,"..")) continue; + char p[BUF]; + if (snprintf(p, sizeof p, "%s/%s", path, de->d_name) >= (int)sizeof p) { ok = 0; break; } + if (!stg_tree_ok(p)) { ok = 0; break; } + } + closedir(d); + return ok; + } + if (!S_ISREG(st.st_mode)) return 0; + return st.st_nlink <= 1; +} + +/* 读 .mpk 尾部签名 footer 的 package 字段(布局见 meow_sig.h)。 + * 返回 0=有 footer 且已填 out;1=无 footer(未签名);-1=读失败。 + * 只用于一致性诊断;签名有效性始终由 meow_verify 判定。 */ +static int read_footer_pkg(const char *mpk, char *out, int n) +{ + int fd = open(mpk, O_RDONLY); + if (fd < 0) return -1; + if (n <= 0) { close(fd); return -1; } + off_t sz = lseek(fd, 0, SEEK_END); + if (sz < (off_t)SIG_BLOCK_LEN_V1) { close(fd); return 1; } + uint8_t b4[4]; + if (lseek(fd, sz - 4, SEEK_SET) < 0 || read(fd, b4, 4) != 4) { close(fd); return -1; } + uint32_t blen = (uint32_t)b4[0] | ((uint32_t)b4[1] << 8) | + ((uint32_t)b4[2] << 16) | ((uint32_t)b4[3] << 24); + if ((int)blen != SIG_BLOCK_LEN_V1 && (int)blen != SIG_BLOCK_LEN_V2) { close(fd); return 1; } + if (sz < (off_t)blen) { close(fd); return 1; } + uint8_t blk[SIG_BLOCK_LEN_V2]; + if (lseek(fd, sz - (off_t)blen, SEEK_SET) < 0 || + read(fd, blk, (size_t)blen) != (ssize_t)blen) { close(fd); return -1; } + close(fd); + if (memcmp(blk, SIG_MAGIC, 8) != 0) return 1; + int cl = 0; + while (cl < SIG_PKG_MAX && blk[SIG_OFF_PKG + cl]) cl++; + if (n <= cl) cl = n - 1; + memcpy(out, blk + SIG_OFF_PKG, (size_t)cl); + out[cl] = 0; + return 0; +} + +/* 把 .prep-… 暂存目录改名成 ---(rename 原子占名, + * EEXIST/ENOTEMPTY 换序号重试)。返回 0 成功。失败由调用方沿用 .prep 名。 */ +static int stg_rename_pkg(const char *base, const char *prep, const char *pkg, char *out, int n) +{ + char ts[32]; + fmt_utc(nyai_now(), ts, sizeof ts); + for (int i = 0; i < 100; i++) { + if (snprintf(out, n, "%s/%s-%s-%d-%d", base, pkg, ts, (int)getpid(), i) >= n) return -1; + if (access(out, F_OK) == 0) continue; + if (rename(prep, out) == 0) return 0; + if (errno != EEXIST && errno != ENOTEMPTY) return -1; + } + return -1; +} + +/* ---------------- install(文件或名称) ---------------- */ +/* 安装/升级一个 .mpk。**包名、版本、依赖全部来自包内 app.json**,文件名与后缀不参与身份判定。 + * expect_pkg != NULL → 清单包名必须等于它(upgrade / 索引安装); + * must_be_installed → 目标必须已安装(upgrade)。 + * 暂存:/MeowOS/tmp/pkgs/---/ ——成功/失败/被信号中断都删。 */ +static int install_mpk_file(const char *mpk_path, const char *expect_pkg, int must_be_installed) +{ + struct stat fst; + char base[BUF], prep[BUF], final[BUF], stg[BUF], dst[BUF], bak[BUF], cmd[BUF * 2]; + + if (!mpk_path || !*mpk_path) { op_err("缺包文件路径\n"); return 2; } + if (unsafe_path(mpk_path)) { op_err("路径含非法字符\n"); return 1; } + if (stat(mpk_path, &fst) != 0 || !S_ISREG(fst.st_mode)) { op_err("打不开包文件 %s\n", mpk_path); return 1; } + if (stg_prepare(base, sizeof base) != 0) return 1; printf("Reading package lists... Done\n"); - char dst[BUF], bak[BUF], stg[BUF]; - snprintf(dst,sizeof dst,"%s/MeowAPPs/%s", meow_root(), pkg); - snprintf(bak,sizeof bak,"%s.bak_%d", dst, (int)getpid()); - snprintf(stg,sizeof stg,"%s/MeowAPPs/.stg_%d_%s", meow_root(), (int)getpid(), pkg); - int replacing = (access(dst,F_OK)==0); - /* 签名分级(II 期,MPK_SIGNATURE_DESIGN §5.2):有签名必须验签;os.meow.* 必须有有效签名; - * 无签名第三方放行(告警)。验签在 ① 解到 stg 后、② 防降级前执行(stg=临时目录,失败即 rm 不落盘)。 */ + /* ① 暂存目录:包名要解包后才知道,先用 .prep-<时间戳>-- 原子占位 */ + if (stg_mkdir(base, prep, sizeof prep) != 0) { + op_err("无法创建暂存目录(%s): %s\n", base, strerror(errno)); + return 1; + } + snprintf(g_stg, sizeof g_stg, "%s", prep); - /* ① 先解到临时目录读元数据,再决定替换(防降级 + 校验 app.json) */ - rm_rf(stg); - if (mkdir_p(stg)!=0) { fprintf(stderr,"nyai: install: 无法建临时目录 %s\n", stg); return 1; } - char cmd[1024]; - snprintf(cmd,sizeof cmd,"gzip -dc '%s' 2>/dev/null | tar -x -C '%s' 2>/dev/null && [ -f '%s/app.json' ]", mpk_path, stg, stg); - printf("Preparing to unpack %s ...\n", pkg); - if (system(cmd)!=0) { - fprintf(stderr,"nyai: install: 解压/校验 app.json 失败(%s 可能损坏或非 .mpk)\n", mpk_path); - rm_rf(stg); return 1; + /* ② 解包前检查归档成员类型 */ + int mr = mpk_check_members(mpk_path); + stg_check_signal(); + if (mr != 0) { + if (mr == -3) op_err("%s 解不出内容(不是 .mpk / 空归档)\n", mpk_path); + else if (mr == -1) op_err("无法读取包内容(%s)\n", mpk_path); + stg_cleanup(); + return 1; + } + /* ③ 解包到暂存目录(SD 卡,不占 /usr/data 的 4MB NAND) */ + printf("Preparing to unpack %s ...\n", mpk_path); + snprintf(cmd, sizeof cmd, "gzip -dc '%s' 2>/dev/null | tar -x -C '%s' 2>/dev/null", mpk_path, prep); + if (run_shell(cmd) != 0) { + stg_check_signal(); + op_err("解压失败(%s 可能损坏或不是 .mpk)\n", mpk_path); + stg_cleanup(); + return 1; + } + stg_check_signal(); + if (!stg_tree_ok(prep)) { + op_err("解压结果含符号链接/硬链接等危险条目,拒绝安装\n"); + stg_cleanup(); + return 1; + } + char appj[BUF]; + if (snprintf(appj, sizeof appj, "%s/app.json", prep) >= (int)sizeof appj) { + op_err("暂存路径过长\n"); stg_cleanup(); return 1; } - char stgj[BUF]; snprintf(stgj,sizeof stgj,"%s/app.json", stg); appmeta m; - if (load_app_meta(stgj,&m)!=0) { - fprintf(stderr,"nyai: install: app.json 不合法(缺 name 或 exec)\n"); - rm_rf(stg); return 1; + if (load_app_meta(appj, &m) != 0) { + op_err("app.json 不合法(缺 name 或 exec)\n"); + stg_cleanup(); + return 1; } - /* 二进制依赖检查(app.json depends):不阻断安装,缺 required 标注「安装后启动将失败」。 */ + + /* ④ 包名唯一来源:app.json.package(不再看文件名/后缀) */ + if (!m.package[0]) { + op_err("app.json 缺 package 字段(包名只能来自清单),拒绝安装\n"); + stg_cleanup(); + return 1; + } + if (!valid_pkg(m.package)) { + op_err("app.json.package 非法: %s,拒绝安装\n", m.package); + stg_cleanup(); + return 1; + } + if (expect_pkg && *expect_pkg && strcmp(m.package, expect_pkg) != 0) { + op_err("app.json.package(%s) 与目标包名(%s) 不一致,拒绝\n", m.package, expect_pkg); + stg_cleanup(); + return 1; + } + const char *pkg = m.package; + + /* 暂存目录改名成可读名 -<时间戳>--;改名失败就沿用 .prep 名(不影响功能) */ + snprintf(stg, sizeof stg, "%s", prep); + if (stg_rename_pkg(base, prep, pkg, final, sizeof final) == 0) { + snprintf(stg, sizeof stg, "%s", final); + snprintf(g_stg, sizeof g_stg, "%s", final); + } + + /* ⑤ footer.package 必须等于 app.json.package(签名说 A、内容说 B → 拒装) */ + { + char fpkg[SIG_PKG_MAX + 1]; + int fr = read_footer_pkg(mpk_path, fpkg, sizeof fpkg); + if (fr == 0) { + scrub(fpkg); + if (strcmp(fpkg, pkg) != 0) { + op_err("签名包名(%s) 与 app.json(%s) 不一致,拒绝安装\n", fpkg, pkg); + stg_cleanup(); + return 1; + } + } + } + + /* ⑥ 签名分级:验签用清单包名;os.meow.* 必须有有效签名,无签名第三方放行 */ nyai_check_bin_depends(&m); - /* ①.5 签名分级 + 三重绑定(MPK_SIGNATURE_DESIGN §3.3/§5.2 失败行为表) */ int vr = verify_mpk_signature(mpk_path, pkg, NULL, 0); + stg_check_signal(); int system_pkg = is_system_pkg(pkg); int keep_src = 0; /* 有效签 → 安装后另存原签 .mpk.src */ if (vr == 0) { keep_src = 1; printf("nyai: 签名校验通过 (package=%s)\n", pkg); } else if (vr == 1) { - fprintf(stderr,"nyai: install: 签名验证失败(内容被篡改/包名不符/公钥不符),拒绝安装\n"); - rm_rf(stg); return 1; + op_err("签名验证失败(内容被篡改/包名不符/公钥不符),拒绝安装\n"); + stg_cleanup(); + return 1; } else if (vr == 2) { if (system_pkg) { - fprintf(stderr,"nyai: install: 系统包 %s 必须签名(无签名),拒绝安装\n", pkg); - rm_rf(stg); return 1; + op_err("系统包 %s 必须签名(无签名),拒绝安装\n", pkg); + stg_cleanup(); + return 1; } printf("nyai: 提示: %s 未签名(第三方包放行安装)\n", pkg); } else { if (system_pkg) { - fprintf(stderr,"nyai: install: meow_verify 不可用(rc=%d),os.meow.* 拒装(宁缺勿装)\n", vr); - rm_rf(stg); return 1; + op_err("meow_verify 不可用(rc=%d),os.meow.* 拒装(宁缺勿装)\n", vr); + stg_cleanup(); + return 1; } printf("nyai: 警告: meow_verify 不可用(rc=%d),%s 未验签放行\n", vr, pkg); } - /* 绑定(一般/②):解包 app.json.package == 文件名茎(防目录改名/改 app.json;meow_verify 已保证① footer.package==pkg) */ - if (m.package[0] && strcmp(m.package, pkg) != 0) { - fprintf(stderr,"nyai: install: app.json.package(%s) != 包名(%s),拒绝\n", m.package, pkg); - rm_rf(stg); return 1; - } - /* ② 同包名替换前的防降级门禁(APPS.md §3.8,仅按 version_code 比较): - * 新版 code >= 已装 code(相等=重装,允许;<即降级拒装);任一侧缺 version_code → 拒装。 */ + /* ⑦ 落地目录 + 防降级(基准 = MeowAPPs/<清单包名> 的 app.json) */ + stg_check_signal(); /* 从这里开始要改 MeowAPPs,临界区不再响应中断 */ + if (snprintf(dst, sizeof dst, "%s/MeowAPPs/%s", meow_root(), pkg) >= (int)sizeof dst) { + op_err("包名过长\n"); stg_cleanup(); return 1; + } + snprintf(bak, sizeof bak, "%s.bak_%d", dst, (int)getpid()); + int replacing = (access(dst, F_OK) == 0); + if (must_be_installed && !replacing) { + op_err("%s 未安装(如需全新安装请用 install)\n", pkg); + stg_cleanup(); + return 1; + } if (replacing) { - char instj[BUF]; snprintf(instj,sizeof instj,"%s/app.json", dst); + char instj[BUF]; appmeta im; - if (load_app_meta(instj,&im)!=0 || !m.has_version_code || !im.has_version_code) { - fprintf(stderr,"nyai: install: 版本号无法判定(新缺 version_code 或已装缺 version_code),拒绝安装\n"); - rm_rf(stg); return 1; + snprintf(instj, sizeof instj, "%s/app.json", dst); + if (load_app_meta(instj, &im) != 0 || !m.has_version_code || !im.has_version_code) { + op_err("版本号无法判定(新缺 version_code 或已装缺 version_code),拒绝安装\n"); + stg_cleanup(); + return 1; } if (m.version_code < im.version_code) { - fprintf(stderr,"nyai: install: 不允许降级: 新版本 code %lld < 已装 code %lld\n", - m.version_code, im.version_code); - rm_rf(stg); return 1; + op_err("不允许降级: 新版本 code %lld < 已装 code %lld\n", m.version_code, im.version_code); + stg_cleanup(); + return 1; } rm_rf(bak); - if (rename(dst,bak)!=0) { fprintf(stderr,"nyai: install: 备份 %s 失败: %s\n", dst, strerror(errno)); rm_rf(stg); return 1; } + if (rename(dst, bak) != 0) { + op_err("备份 %s 失败: %s\n", dst, strerror(errno)); + stg_cleanup(); + return 1; + } printf("Backing up existing %s -> %s\n", pkg, bak); } else { rm_rf(dst); /* 防御:全新安装前清残留 */ } - /* ③ 部署临时目录 -> 正式目录 */ - if (rename(stg,dst)!=0) { - fprintf(stderr,"nyai: install: 部署 %s 失败: %s\n", dst, strerror(errno)); - rm_rf(stg); if (replacing) rename(bak,dst); /* 回滚到旧版 */ + /* ⑧ 部署:暂存目录与 MeowAPPs 同在 SD → rename 原子 */ + if (rename(stg, dst) != 0) { + op_err("部署 %s 失败: %s\n", dst, strerror(errno)); + stg_cleanup(); + if (replacing) rename(bak, dst); /* 回滚到旧版 */ return 1; } + g_stg[0] = 0; /* 已变成正式目录,不再属于清理范围 */ - /* ④ 数据 init(MeowData 数据保留,仅保证目录存在) */ - char d1[BUF],d2[BUF]; - path_data(d1,sizeof d1,pkg,"data"); path_data(d2,sizeof d2,pkg,"cache"); + /* ⑨ 数据 init(MeowData 数据保留,仅保证目录存在) */ + char d1[BUF], d2[BUF]; + path_data(d1, sizeof d1, pkg, "data"); + path_data(d2, sizeof d2, pkg, "cache"); mkdir_p(d1); mkdir_p(d2); - printf("Setting up %s (%s) ...\n", pkg, m.version[0]?m.version:"?"); + printf("Setting up %s (%s) ...\n", pkg, m.version[0] ? m.version : "?"); - /* ④.5 II 期:原签 .mpk 另存 MeowData//data/.mpk.src(导出保留签名) */ + /* ⑩ II 期:原签 .mpk 另存 MeowData//data/.mpk.src(导出保留签名) */ if (keep_src) save_mpk_source(mpk_path, pkg); - /* ⑤ 安装成功后清理本次创建的 .bak_(失败回滚路径不动) */ + /* ⑪ 安装成功后清理本次创建的 .bak_(失败回滚路径不动) */ if (replacing && bak[0]) { rm_rf(bak); printf("Removed backup %s\n", bak); } printf("OK\n"); return 0; @@ -973,21 +1350,21 @@ static int install_mpk_file(const char *mpk_path) static int cmd_install(const char *arg) { - if (!arg || !*arg) { fprintf(stderr,"nyai: install: 缺包名或 .mpk\n"); return 2; } - /* ① 文件路径直接装 */ - size_t L=strlen(arg); - if ((L>=4 && !strcmp(arg+L-4,".mpk")) && access(arg,R_OK)==0) { - return install_mpk_file(arg); - } - if (!valid_pkg(arg)) { - fprintf(stderr,"nyai: install: 非法包名: %s\n", arg); - return 1; - } + if (!arg || !*arg) { op_err("缺包文件路径或索引包名\n"); return 2; } + /* ① 存在的普通文件 → 直接装(文件名任意,身份来自包内 app.json) */ + struct stat st; + size_t L = strlen(arg); + int looks_file = (strchr(arg, '/') != NULL) || + (L >= 4 && !strcmp(arg + L - 4, ".mpk")) || + (access(arg, F_OK) == 0); + if (stat(arg, &st) == 0 && S_ISREG(st.st_mode)) return install_mpk_file(arg, NULL, 0); + if (looks_file) { op_err("打不开包文件 %s\n", arg); return 1; } + if (!valid_pkg(arg)) { op_err("非法包名: %s\n", arg); return 1; } /* ② 按索引装 */ pkgrec recs[MAX_PKG]; int nrec = load_all_indexes(recs, MAX_PKG, g_srcs, g_nsrc); if (nrec == 0) { - fprintf(stderr,"nyai: 索引为空,先 nyai update 刷新(或直接 install .mpk)\n"); + op_err("索引为空,先 nyai update 刷新(或直接 install <包文件>)\n"); return 1; } return install_by_name(arg, recs, nrec); @@ -1224,6 +1601,11 @@ static int cmd_export(const char *pkg, const char *out) char appj[BUF]; snprintf(appj,sizeof appj,"%s/app.json", src); appmeta m; if (load_app_meta(appj,&m)!=0) { fprintf(stderr,"nyai: export: %s/app.json 不合法(缺 name 或 exec)\n", pkg); return 1; } + /* 目录名必须等于清单包名(M35 后安装时已保证;老装目录缺 package 字段则跳过) */ + if (m.package[0] && strcmp(m.package, pkg) != 0) { + fprintf(stderr,"nyai: export: 目录名(%s) 与 app.json.package(%s) 不一致,拒绝导出\n", pkg, m.package); + return 1; + } /* 导出前体检:exec 文件存在且可执行。exec 可为绝对(包目录下,相对化)或相对路径。 */ char exec_rel[BUF]; if (exec_rel_to_pkg(src, m.exec, pkg, exec_rel, sizeof exec_rel)!=0) { @@ -1270,13 +1652,12 @@ static int cmd_scan(const char *dir) size_t L=strlen(de->d_name); if (L<4 || strcmp(de->d_name+L-4,".mpk")!=0) continue; char f[BUF]; snprintf(f,sizeof f,"%s/%s", r, de->d_name); - char stem[128]; snprintf(stem,sizeof stem,"%.*s",(int)(L-4),de->d_name); struct stat st; long long sz=0; if (stat(f,&st)==0) sz=st.st_size; char hs[24]; human_size(sz,hs,sizeof hs); - char nm[256]="", ver[64]=""; + char ver[64]=""; appmeta m; - if (mpk_appinfo(f,&m)==0) { snprintf(nm,sizeof nm,"%s",m.name); snprintf(ver,sizeof ver,"%s",m.version); } - printf("%-24s %-10s %-10s %s\n", nm[0]?nm:stem, ver[0]?ver:"?", hs, de->d_name); + if (mpk_appinfo(f,&m)==0) snprintf(ver,sizeof ver,"%s",m.version); + printf("%-24s %-10s %-10s %s\n", m.package[0]?m.package:"?", ver[0]?ver:"?", hs, de->d_name); found++; } closedir(d); @@ -1285,56 +1666,20 @@ static int cmd_scan(const char *dir) return 0; } +/* upgrade [file]:目标包名 pkg 必须已安装;包文件内部清单的 package 必须等于 pkg。 + * 其余(暂存/验签/防降级/部署/清理)全部走 install_mpk_file 同一实现,不再单独维护一套。 */ static int cmd_upgrade(const char *pkg, const char *file) { - if (!pkg || !valid_pkg(pkg)) { fprintf(stderr,"nyai: upgrade: 包名无效\n"); return 2; } - char mpk[BUF]; - if (file && *file) snprintf(mpk,sizeof mpk,"%s", file); - else snprintf(mpk,sizeof mpk,"%s.mpk", pkg); - if (access(mpk,R_OK)!=0) { fprintf(stderr,"nyai: upgrade: 找不到包文件 %s\n", mpk); return 1; } - char dst[BUF]; snprintf(dst,sizeof dst,"%s/MeowAPPs/%s", meow_root(), pkg); - if (access(dst,F_OK)!=0) { fprintf(stderr,"nyai: upgrade: %s 未安装(如需全新安装请用 install)\n", pkg); return 1; } - /* 签名分级(与 install 同规范):os.meow.* 必须有有效签名;有签必须验签;无签第三方放行。 */ - { - int vr = verify_mpk_signature(mpk, pkg, NULL, 0); - int sysp = is_system_pkg(pkg); - if (vr == 1) { fprintf(stderr,"nyai: upgrade: 签名验证失败,拒绝升级\n"); return 1; } - else if (vr == 2) { if (sysp) { fprintf(stderr,"nyai: upgrade: 系统包 %s 必须签名,拒绝升级\n", pkg); return 1; } printf("nyai: 提示: %s 未签名(第三方放行)\n", pkg); } - else if (vr != 0) { if (sysp) { fprintf(stderr,"nyai: upgrade: meow_verify 不可用(rc=%d),os.meow.* 拒升\n", vr); return 1; } printf("nyai: 警告: meow_verify 不可用(rc=%d),%s 未验签放行\n", vr, pkg); } + if (!pkg || !valid_pkg(pkg)) { op_err("包名无效\n"); return 2; } + char dst[BUF], mpk[BUF]; + if (snprintf(dst, sizeof dst, "%s/MeowAPPs/%s", meow_root(), pkg) >= (int)sizeof dst) { + op_err("包名过长\n"); return 1; } - /* 防降级门禁(与 install 同规范,APPS.md §3.8,仅按 version_code 比较): - * 新版 code >= 已装 code(相等=重装允许);任一侧缺 version_code → 拒绝。 */ - { - char aj[BUF]; snprintf(aj,sizeof aj,"%s/app.json", dst); - appmeta im, nm; - if (load_app_meta(aj,&im)!=0 || mpk_appinfo(mpk,&nm)!=0 || - !im.has_version_code || !nm.has_version_code) { - fprintf(stderr,"nyai: upgrade: 版本号无法判定(新缺 version_code 或已装缺 version_code),拒绝\n"); - return 1; - } - if (nm.version_code < im.version_code) { - fprintf(stderr,"nyai: upgrade: 不允许降级: 新版本 code %lld < 已装 code %lld\n", - nm.version_code, im.version_code); - return 1; - } - } - char bak[BUF]; snprintf(bak,sizeof bak,"%s.bak_%d", dst,(int)getpid()); - rm_rf(bak); - if (rename(dst,bak)!=0) { fprintf(stderr,"nyai: upgrade: 备份失败: %s\n", strerror(errno)); return 1; } - if (mkdir_p(dst)!=0) { rename(bak,dst); return 1; } - char cmd[1024]; - snprintf(cmd,sizeof cmd,"gzip -dc '%s' 2>/dev/null | tar -x -C '%s' 2>/dev/null && [ -f '%s/app.json' ]", mpk,dst,dst); - printf("Upgrading %s ...\n", pkg); - if (system(cmd)!=0) { fprintf(stderr,"nyai: upgrade: 解压失败,回滚\n"); rm_rf(dst); rename(bak,dst); return 1; } - char appj[BUF]; snprintf(appj,sizeof appj,"%s/app.json", dst); - appmeta m; - if (load_app_meta(appj,&m)!=0) { fprintf(stderr,"nyai: upgrade: 新包 app.json 不合法,回滚\n"); rm_rf(dst); rename(bak,dst); return 1; } - char d1[BUF],d2[BUF]; - path_data(d1,sizeof d1,pkg,"data"); path_data(d2,sizeof d2,pkg,"cache"); - mkdir_p(d1); mkdir_p(d2); - if (bak[0]) { rm_rf(bak); } /* 升级成功后清理本次 .bak_ */ - printf("OK (%s) — data preserved\n", m.version[0]?m.version:"?"); - return 0; + if (access(dst, F_OK) != 0) { op_err("%s 未安装(如需全新安装请用 install)\n", pkg); return 1; } + if (file && *file) snprintf(mpk, sizeof mpk, "%s", file); + else snprintf(mpk, sizeof mpk, "%s.mpk", pkg); /* 默认路径约定,不是身份来源 */ + if (access(mpk, R_OK) != 0) { op_err("找不到包文件 %s\n", mpk); return 1; } + return install_mpk_file(mpk, pkg, 1); } /* ---------------- usage / main ---------------- */ @@ -1345,7 +1690,7 @@ static void usage(FILE *o, const char *argv0) "\n" "Usage:\n" " %s update Read all sources into local index cache\n" -" %s install Install by index name or direct .mpk (resolves Depends)\n" +" %s install Install a package file (any filename) or an index name\n" " %s remove [--purge] Uninstall (--purge also deletes MeowData)\n" " %s list List installed apps (MeowAPPs/*)\n" " %s info Show package details (app.json)\n" @@ -1354,23 +1699,31 @@ static void usage(FILE *o, const char *argv0) " %s index Generate Packages index for a .mpk dir\n" " %s export [out.mpk] Pack MeowAPPs/ -> .mpk (no data)\n" " %s scan [dir] List .mpk in dir (default .)\n" -" %s upgrade [file.mpk] Upgrade app, keep MeowData\n" +" %s upgrade [file] Upgrade installed , keep MeowData\n" " %s --help This help\n" "\n" +"Package identity (name/version/depends) comes from the app.json inside the package;\n" +"the file name is irrelevant. install/upgrade unpack to %s/MeowOS/tmp/pkgs/ and always\n" +"delete that staging directory (success, failure, SIGINT/SIGTERM).\n" +"\n" "Sources: %s/MeowOS/opt/nyai/sources.list (local / http / deb [trusted=yes] ; # comment)\n" "Exit codes: 0 success, non-zero error.\n", NYAI_VERSION, argv0,argv0,argv0,argv0,argv0,argv0,argv0,argv0,argv0,argv0,argv0,argv0, - meow_root()); + meow_root(), meow_root()); } int main(int argc, char **argv) { + int sigs[] = { SIGINT, SIGTERM, SIGHUP }; + for (unsigned i = 0; i < sizeof sigs / sizeof sigs[0]; i++) signal(sigs[i], on_term); + atexit(stg_cleanup); /* 任何 return/exit 路径的兜底清理 */ + if (argc<2) { usage(stderr, argv[0]); return 1; } const char *cmd = argv[1]; if (!strcmp(cmd,"--help")||!strcmp(cmd,"-h")) { usage(stdout, argv[0]); return 0; } if (!strcmp(cmd,"update")) { return cmd_update(); } if (!strcmp(cmd,"install")) { - if (argc<3) { fprintf(stderr,"nyai: install: 缺包名或 .mpk\n"); return 2; } + if (argc<3) { op_err("缺包文件路径或索引包名\n"); return 2; } load_sources(); return cmd_install(argv[2]); } @@ -1396,7 +1749,8 @@ int main(int argc, char **argv) } if (!strcmp(cmd,"scan")) return cmd_scan(argc>2?argv[2]:NULL); if (!strcmp(cmd,"upgrade")) { - if (argc<3) { fprintf(stderr,"nyai: upgrade: 缺包名\n"); return 2; } + g_op = "upgrade"; + if (argc<3) { op_err("缺包名\n"); return 2; } return cmd_upgrade(argv[2], argc>3?argv[3]:NULL); } fprintf(stderr,"nyai: 未知命令 '%s'(--help 查看用法)\n", cmd); diff --git a/patch_v2/meowpkg/nyai_host b/patch_v2/meowpkg/nyai_host index f374b2f6f366b0f90005c75e9631901483d53104..6be4008590a7830aeb922466ac613de348556aa3 100755 GIT binary patch literal 46240 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 diff --git a/patch_v2/meowpkg/test_nyai.sh b/patch_v2/meowpkg/test_nyai.sh new file mode 100755 index 0000000..34441e0 --- /dev/null +++ b/patch_v2/meowpkg/test_nyai.sh @@ -0,0 +1,244 @@ +#!/bin/bash +# test_nyai.sh — nyai 宿主回归(M35:app.json 清单权威 + SD 暂存 + 无条件清理) +# +# 覆盖: +# 1 文件名/后缀与包名完全不同(weird-name.bin)仍按清单装进 MeowAPPs/ +# 2 真实反例:签名 os.meow.reader 包命名成 os.meow.reader-0.1.7.mpk 仍装进 MeowAPPs/os.meow.reader +# 3 footer.package ≠ app.json.package → 拒装,错误文案同时给出两个名字 +# 4 os.meow.* 无签名 → 拒装 +# 5 第三方无签名 → 放行(行为不变) +# 6 恶意 app.json.package(../x、a/b、.、..)→ 拒装且不落盘到目录外 +# 7 成功 / 各种失败 / 解压失败 / SIGTERM 中断 → MeowOS/tmp/pkgs 无残留 +# 8 索引路径:Packages 的 Package 字段取自清单(文件改名后按包名仍可装) +# 9 upgrade 复用 install 引擎:清单包名/目标包名不一致、降级都拒 +# +# 依赖:宿主 cc(编 nyai_host / meow_verify_host / meow_sign)。 +# 签名用例需要维护者私钥:默认 ~/.keys/meowos-signing/signing.key, +# 可用 NYAI_TEST_SIGN_KEY 覆盖;无私钥时签名用例 SKIP(不判 FAIL)。 +# 真实反例包默认 ~/.cache/os.meow.reader-0.1.7-signed.mpk,可用 NYAI_TEST_REAL_MPK 覆盖。 +# +# 用法:./test_nyai.sh [-v] +set -u + +HERE=$(cd "$(dirname "$0")" && pwd) +ROOT=$(cd "$HERE/../.." && pwd) +VERBOSE=0 +[ "${1:-}" = "-v" ] && VERBOSE=1 +WORK=${NYAI_TEST_WORK:-$(mktemp -d "${TMPDIR:-/tmp}/nyai-m35.XXXXXX")} +mkdir -p "$WORK" +CLEANUP_WORK=1 +[ -n "${NYAI_TEST_WORK:-}" ] && CLEANUP_WORK=0 +trap '[ "$CLEANUP_WORK" = 1 ] && rm -rf "$WORK"' EXIT + +PASS=0; FAIL=0; SKIP=0 +ok() { PASS=$((PASS+1)); printf 'PASS %s\n' "$1"; } +bad() { FAIL=$((FAIL+1)); printf 'FAIL %s\n' "$1"; [ -n "${2:-}" ] && printf ' %s\n' "$2"; } +skip() { SKIP=$((SKIP+1)); printf 'SKIP %s (%s)\n' "$1" "${2:-}"; } + +KEY=${NYAI_TEST_SIGN_KEY:-$HOME/.keys/meowos-signing/signing.key} +[ -r "$KEY" ] || KEY="" +REAL_MPK=${NYAI_TEST_REAL_MPK:-$HOME/.cache/os.meow.reader-0.1.7-signed.mpk} + +# ---------------- 构建 ---------------- +echo "== build ==" +( cd "$HERE" && ./build_nyai.sh host >/dev/null ) || { echo "build nyai_host failed"; exit 1; } +NYAI="$HERE/nyai_host" +CC=${CC_HOST:-cc} +V="$ROOT/patch_v2/meow_verify" +mkdir -p "$WORK/tools" +"$CC" -Os -Wno-sign-compare -Wno-unterminated-string-initialization -Wno-unused-function \ + -c "$V/tweetnacl.c" -o "$WORK/tools/tn.o" || { echo "build tweetnacl failed"; exit 1; } +"$CC" -Os -c "$V/sha256.c" -o "$WORK/tools/sha.o" || exit 1 +"$CC" -Os -I"$V" -c "$V/meow_verify.c" -o "$WORK/tools/mv.o" || exit 1 +"$CC" "$WORK/tools/mv.o" "$WORK/tools/sha.o" "$WORK/tools/tn.o" -o "$WORK/tools/meow_verify_host" || exit 1 +if [ -n "$KEY" ]; then + "$CC" -Os -I"$V" -I"$ROOT/patch_v2/meow_sign" "$ROOT/patch_v2/meow_sign/meow_sign.c" \ + "$WORK/tools/tn.o" "$WORK/tools/sha.o" -o "$WORK/tools/meow_sign" || exit 1 +fi +VERIFY="$WORK/tools/meow_verify_host" + +# ---------------- 辅助 ---------------- +sb() { # sb → 打印沙箱 MeowROOT + local d="$WORK/case-$1" + rm -rf "$d" + mkdir -p "$d/root/MeowAPPs" "$d/root/MeowOS/opt/nyai" + printf '%s\n' "$d/root" +} +mkpkg() { # mkpkg + rm -rf "$1"; mkdir -p "$1" + printf '{"name":"Test","package":"%s","exec":"bin","version":"0.1.%s","version_code":%s}\n' \ + "$2" "$3" "$3" > "$1/app.json" + printf '#!/bin/sh\nexit 0\n' > "$1/bin"; chmod +x "$1/bin" +} +pack() { tar czf "$2" -C "$1" .; } +sign() { # sign :文件名茎必须等于包名(meow_sign 约定),签完覆盖原文件 + [ -n "$KEY" ] || return 2 + mkdir -p "$WORK/sign" + cp "$2" "$WORK/sign/$1.mpk" + "$WORK/tools/meow_sign" sign "$WORK/sign/$1.mpk" "$KEY" >/dev/null 2>&1 || return 1 + cp "$WORK/sign/$1.mpk" "$2" +} +nyai_run() { # nyai_run + local r=$1; shift + MEOWROOT="$r" MEOW_VERIFY_BIN="$VERIFY" "$NYAI" "$@" +} +tmp_clean() { # tmp_clean :MeowOS/tmp/pkgs 下无任何条目 + local n + n=$(find "$1/MeowOS/tmp/pkgs" -mindepth 1 2>/dev/null | wc -l | tr -d ' ') + [ "$n" = "0" ] +} +show() { [ "$VERBOSE" = 1 ] && printf '%s\n' "$1"; } +expect() { # expect