From 563a9be1d66b94f518ecc8891470d9de99924fee Mon Sep 17 00:00:00 2001 From: MeowOS Date: Mon, 31 Aug 2026 04:14:00 +0800 Subject: [PATCH] =?UTF-8?q?feat(meowpanel):=20=E9=80=9A=E7=9F=A5=E4=B8=AD?= =?UTF-8?q?=E5=BF=83+=E6=96=87=E4=BB=B6=E7=AE=A1=E7=90=86=E5=90=8E?= =?UTF-8?q?=E7=AB=AF=E8=A1=A5=E5=85=A8=20(agent-182)=20=E2=80=94=20/api/no?= =?UTF-8?q?tifications(=E8=AF=BBTF=E5=BD=92=E6=A1=A3,=E7=8E=AF=E5=BD=A2200?= =?UTF-8?q?=E6=9D=A1)+=E5=8D=95=E5=88=A0+dismiss=5Fall(=E4=BF=9D=E7=95=99?= =?UTF-8?q?=E5=AA=92=E4=BD=93/=E8=BF=9B=E5=BA=A6=E6=B4=BB=E5=8A=A8?= =?UTF-8?q?=E9=80=9A=E7=9F=A5);=20=E6=96=87=E4=BB=B6=E5=9F=9F=E4=BF=AE4bug?= =?UTF-8?q?(normalize=5Fpath=E4=B8=A2=E5=89=8D=E5=AF=BC/=E8=87=B4=E7=99=BD?= =?UTF-8?q?=E5=90=8D=E5=8D=95=E5=BF=85=E5=A4=B1=E8=B4=A5=E3=80=81upload=20?= =?UTF-8?q?multipart=20=E6=96=87=E4=BB=B6=E5=90=8D=E6=88=AA=E6=96=AD?= =?UTF-8?q?=E6=81=92NULL=E3=80=81rename=E6=8B=BC=E9=94=99=E8=B7=AF?= =?UTF-8?q?=E5=BE=84=E6=81=92ENOTDIR=E3=80=81read>1MB=E6=94=B9truncated)?= =?UTF-8?q?=20+=20=E4=B8=8A=E4=BC=A08MB=E4=B8=8A=E9=99=90+=E6=96=87?= =?UTF-8?q?=E4=BB=B6=E5=90=8D=E5=87=80=E5=8C=96+=E5=8F=8C=E9=87=8D?= =?UTF-8?q?=E7=99=BD=E5=90=8D=E5=8D=95=E9=98=B2=E9=80=83=E9=80=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit meowpanel 8108852f→58a7b186; mipsel/host -Wall -Wextra 0 warning; 宿主 curl 自测全过 需launcher配合项(已记录): MSG_NOTIFY_QUERY 查询帧 + dismiss 广播 IPC --- patch_v2/meowpanel/README.md | 53 +++- patch_v2/meowpanel/meowpanel | Bin 167180 -> 174124 bytes patch_v2/meowpanel/meowpanel.c | 446 ++++++++++++++++++++++++---- patch_v2/meowpanel/meowpanel_host | Bin 77016 -> 144088 bytes patch_v2/meowpanel/web/meowpanel.js | 14 +- 5 files changed, 438 insertions(+), 75 deletions(-) diff --git a/patch_v2/meowpanel/README.md b/patch_v2/meowpanel/README.md index 5228d89..47b67dd 100644 --- a/patch_v2/meowpanel/README.md +++ b/patch_v2/meowpanel/README.md @@ -102,18 +102,22 @@ http://.local:8080/ | POST | `/api/key` | 批量/顺序注入 | ✅ | | GET | `/api/logs` | `MeowOS/logs` 文件列表 | ✅(无卡→503) | | GET | `/api/logs/read?file=&lines=` | 读日志(上限 1000 行;`..`/绝对→403;敏感名→403) | ✅ | -| GET | `/api/notifications` | **501** | ⚠️ | -| DELETE | `/api/notifications/:id` | **501** | ⚠️ | -| POST | `/api/notifications/dismiss_all` | **501** | ⚠️ | +| GET | `/api/notifications` | 通知列表(读 TF 转储日志;见 §5.8) | ✅(无源→空态 `source:none`,不 503) | +| DELETE | `/api/notifications/:id` | 单条删除(重写日志移除该 id) | ✅(不存在→404) | +| POST | `/api/notifications/dismiss_all`(别名 `/api/notifications/clear`) | 一键清空:**保留活动中的媒体/进度通知**,移除其余 | ✅ | +| GET | `/api/files/read?path=` | 读文本:预览上限 1MB,超限 `truncated:true`(不再 404);二进制→415 | ✅ | ### 返回 501 `NOT_IMPLEMENTED` 的端点(诚实标注) | 端点 | 原因 | |---|---| -| `/api/notifications`、`/api/notifications/:id`、`/api/notifications/dismiss_all` | 通知存储为 **launcher 进程内存**(`meow_notif.c g_slots[]`,NOTIFICATION_SYSTEM §4),后端为独立 svcd 子进程,**跨进程不可达**那批内存槽;框架只在关机前 dump 到 TF `MeowOS/notifications/notifications.log`(CSV 追加,非活跃快照)。**需为通知后端另开 IPC 查询/清撤通道**(如 `MSG_NOTIFY_LIST` 应答)或持久化活跃集,见 MEOWPANEL_PROTOCOL §6 待定案。 | | `/api/key/:code` 的 `press:"hold"` | `hold` 需常驻持续注入通道(阶段 D),后端未实现;`tap`/`long` 已实现。 | | OTA 升级模式(`/api/system/ota` 带 `url`) | 升级为草案(MEOWPANEL_PROTOCOL §6 待定案);当前 `POST /api/system/ota` 空 body 触发 `meow_svc_power` 的 `POWER_UPGRADE`(写 mtd5 进升级模式),带 `url` 的下载+升级未实现。 | +> 通知端点已从 501 落地为「读 TF 卡通知转储日志」实现。因 launcher 侧 **`MSG_NOTIFY_LIST` 为下行推送(守护→App), +> 无「客户端查询通知清单」请求类型**(launcher `util.c` `case MSG_NOTIFY_LIST: "not dispatched here"`),后端(svcd 独立进程) +> 无法经 IPC 取活跃清单,故回退到 TF 转储文件。详见 §5.8 与输出「需 launcher 侧配合项」。 + > 前端对 `501` 显示「该功能后端尚未实现」(`ok:false,error.code=NOT_IMPLEMENTED`)。 --- @@ -189,9 +193,23 @@ http://.local:8080/ - `GET /api/logs/read?file=&lines=`:`file` 必须相对 `MeowOS/logs/`,**禁 `..`/绝对路径 → 403**,敏感名 → 403; 缺省 `lines=200`,上限 `1000`;返回 `{file,lines[],total,truncated}`。 -### 5.8 通知(501 及其依据) -见 §4 501 表:通知存储为 launcher 进程内存,后端跨进程不可读/清撤。已在源码 `api_notifications*` 注释「为何未实现 + -后续如何接」(通知后端加 `MSG_NOTIFY_LIST` 查询/清撤 IPC,或持久化活跃集到 TF `MeowOS/notifications/` 供只读)。 +### 5.8 通知(数据源 = TF 卡通知转储日志) +- **数据源优先级**:① launcher IPC 查询 →② TF 转储文件 →③ 空态。当前 ① 不可用(launcher 侧 `MSG_NOTIFY_LIST` 仅下行推送、 + 无客户端查询请求类型,见「需 launcher 侧配合项」),故以 ② 为准。 +- **TF 转储文件**:`<卡根>/MeowOS/notifications/notifications.log`(launcher `meow_notif_dump_tf` 一行一条 CSV, + 字段 `timestamp,id,app_id,app_icon,category,urgency,progress,title,body,target_activity,ongoing,media,dismissed`; + `meow_notif_clear_tf` 开机清空 → 会话级归档)。后端逐行流式读取(环形保留最新 `NOTIF_PREVIEW_MAX=200` 条,不全量进内存)。 +- **`GET /api/notifications`**:返回 `{count, items:[...], notifications:[...], source}`;`items`= `notifications` 别名 + (兼容前端读 `.notifications` 与任务约定空态 `items:[]`)。字段含 `id/app_id/app_name/app_icon/category/summary/body/ + urgency/ts/progress/ongoing/media/target_activity/dismissed`。`progress<0`→`null`;`app_name` 对 `system`→`系统`,其余用 `app_id` 兜底。 + 无源(无卡/文件不存在)→ `{count:0,items:[],notifications:[],source:"none"}`(**不 503、不伪造数据**)。 +- **`DELETE /api/notifications/:id`**:从日志移除该行(重写临时文件后 rename)。不存在 → 404。 +- **`POST /api/notifications/dismiss_all`(别名 `/api/notifications/clear`)**:重写日志,**只保留活动中的媒体/进度通知** + (`ongoing||media||progress>=0||category=="media"`),移除其余;返回 `{dismissed:<移除数>}`。 +- **语义边界**:日志是**归档快照**(归档时 `dismissed` 尚未置 1,故该列恒 ≈0 不可靠),非活跃快照;且面板清空只改 + 日志视图,**不联动 launcher 进程内存**(launcher 通知中心仍显示其内存活跃集)。无 launcher 查询/清撤 IPC 前的诚实降级。 +- **并发**:面板清空/删除用「写临时 + rename」重写日志;launcher 侧仍以 `O_APPEND` 追加,二者为竞写(低并发、会话级日志, + 可接受),已写入「已知边界」(§7)。 --- @@ -208,6 +226,17 @@ http://.local:8080/ 5. **`/api/files` 上传/删除/重命名等 path**:前端对这些操作传**绝对路径**(`d.path/子项`),列表传**相对 root**; 后端 `normalize_path` 对两者均容错(相对则拼 root,绝对则直用),符合协议「白名单根 + 规范化」。 6. **`GET /api/files` 返回值**:`files_list` 返回 `500` 语义时以 500 封装(协议未定义 `root` 之外错误枚举,用通用错误信封)。 +7. **通知清单数据源**:协议 §3.8 称后端「经通知后端读取」;因 launcher 无「客户端查询通知清单」IPC(`MSG_NOTIFY_LIST` 仅下行), + 后端**改读 TF 卡通知转储日志**(`MeowOS/notifications/notifications.log`)。响应额外带 `source`(`tf`/`none`)与 `items` 别名 + (与 `notifications` 同内容);`items` 为任务约定空态形状,`notifications` 为前端实际读取字段,二者并存。`clear` 语义为 + 「保留活动中的媒体/进度通知」(`ongoing||media||progress>=0`),对应通知中心既定语义。 +8. **`/api/files/read` 文本截断**:协议 §3.4 称「仅文本(<1MB)→ 二进制 415」;现实现为「预览上限 1MB,超限 `truncated:true`, + 不再整体 404」,二进制仍 415(比协议更友好,返回文件真实 `size` + `truncated`)。 +9. **`/api/files/upload`/`rename` 修正**:上传文件名经 `safe_filename` 取 basename、拒绝 `..`/分隔符(防 `../../etc/passwd` 逃逸), + 落盘前对 dir 与拼接后路径双重 `normalize_path`+白名单校验;rename 的新路径 = **原路径父目录** + `new_name`(原实现误拼到文件尾部, + 恒 ENOTDIR 失败)。上传体上限 `MAX_UPLOAD_BODY`=8MB,超限 → 413 `PAYLOAD_TOO_LARGE`。 +10. **TF 卡根可覆盖(宿主测试)**:`env MEOW_TF_ROOT` 覆盖卡根(设备上不设,恒用 `/usr/data/mnt/sd_0`);`env MEOW_NOTIF_LOG` + 覆盖通知转储日志路径。设 `MEOW_TF_ROOT` 时 `tf_present()` 恒真(测试用)。 --- @@ -223,6 +252,12 @@ http://.local:8080/ - **`/api/files/upload` 上传路径**:multipart 需要 `path` 字段(目标目录);缺失时上传文件会被忽略(前端总是带着 `path`)。 - **数据一致性**:设置直接写 `settings.conf`;`display.brightness`/`boot.default` 的 clamp/同步与 launcher `meow_settings_*` 同口径。 若 launcher 未来改 clamp 逻辑,需同步本表。 +- **通知视图为「会话级归档」**:TF 转储日志由 launcher 开机清空、每通知归档时追加一次;非活动(非 ongoing/无进度)通知 + 10s TTL 自动归档后仍留在日志,故面板会**显示已自动过期但未手动清理的历史通知**(直到 clear)。媒体/进度/ongoing 通知 + 持续保留。无 launcher 查询 IPC 前的诚实降级(见 §5.8)。 +- **通知清空不联动 launcher 内存**:面板 clear/delete 只重写日志视图,launcher 通知中心内存活跃集不受影响(两者数据源分离)。 +- **上传为「限长缓冲」非全流式**:multipart 请求体整体读入(上限 8MB,超限 413),下载为流式(8KB 分块)。严格「socket 逐字节流式上传 + 解析」未实现(需增量 multipart 解析器),列为后续;14MB 内存约束下 8MB 上限 + 流式下载已覆盖大文件读侧。 - **存储为 `meowpanel` 编译时刻写死**的 socket/路径会因 `--sock-perf/--sock-power`(qemu sim)可覆盖,但默认走 `/usr/data/meow_*.sock`。 --- @@ -231,9 +266,9 @@ http://.local:8080/ ``` patch_v2/meowpanel/ -├── meowpanel.c # 后端源码(单文件,约 2700 行) +├── meowpanel.c # 后端源码(单文件,约 3150 行,-Wall -Wextra 0 warning) ├── build_meowpanel.sh # 交叉编译 + host 分支(-Wall -Wextra 0 warning) -├── meowpanel # 交叉产物(mipsel 静态,约 166 KB,md5 11ed76ec…) +├── meowpanel # 交叉产物(mipsel 静态,约 174 KB,md5 58a7b186…) ├── meowpanel_host # 宿主编译(本机 ld,调试用) ├── services.d/ │ └── meowpanel.conf # 部署到 TF 卡 MeowOS/services.d/meowpanel.conf diff --git a/patch_v2/meowpanel/meowpanel b/patch_v2/meowpanel/meowpanel index d53e3017d5a2bad7f0ae7f4356f3156fa84e6682..f25ca32a24a5e3a70b59bb2a901414e9f8f04774 100755 GIT binary patch delta 63824 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

csb(ux#AK_o`t-#*mF`Pdn^U$ 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 VCN1Ud2y5}k8_IZ=pD$Bw{~I)bgwOy0 delta 58293 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/MeowOS */ +static const char *g_apps_dir = NULL; /* 派生:/MeowAPPs */ +static const char *g_logs_dir = NULL; /* 派生:/logs */ +static const char *g_notif_log = NULL; /* 通知转储日志:/notifications/notifications.log */ +#define TF_ROOT g_tf_root_buf +#define TF_CARD_DIR g_tf_card +#define MEOWAPPS_DIR g_apps_dir +#define LOGS_DIR g_logs_dir #define PERF_SOCK "/usr/data/meow_perf.sock" #define POWER_SOCK "/usr/data/meow_power.sock" #define NYAI_PATH "/usr/bin/nyai" /* 固件内置(权威) */ @@ -70,10 +81,13 @@ #define IPC_TIMEOUT_MS 2000 #define MAX_HTTP_HEADER (64 * 1024) -#define MAX_HTTP_BODY (16 * 1024 * 1024) /* 上传上限 */ +#define MAX_HTTP_BODY (16 * 1024 * 1024) /* 通用 body 上限(JSON/小件) */ +#define MAX_UPLOAD_BODY (8 * 1024 * 1024) /* multipart 上传上限(14MB 内存约束:不整读超 8MB) */ #define MAX_JSON_IN 65536 /* JSON body 解析上限 */ #define MAX_STATIC_FREEBUF (2 * 1024 * 1024) #define LOG_MAX_LINES 1000 +#define NOTIF_PREVIEW_MAX 200 /* 通知列表返回上限(每条约 0.2KB,总 <50KB) */ +#define TEXT_PREVIEW_MAX (1024 * 1024) /* 文本预览上限(超出截断,truncated=true;14MB 约束下 1MB 缓冲安全) */ /* 白名单子目录(TF 卡根下) */ static const char *g_allowed_dirs[] = { "MeowOS", "Music", "MeowData", "MeowAPPs", "book" }; @@ -89,6 +103,29 @@ static const char *g_sensitive_names[] = { static const char *g_sock_perf = PERF_SOCK; static const char *g_sock_power = POWER_SOCK; +/* 初始化 TF 卡派生路径(main 开头调用)。env MEOW_TF_ROOT 可覆盖卡根(宿主测试用); + * env MEOW_NOTIF_LOG 可覆盖通知转储日志路径(宿主测试用)。默认设备卡路径。 */ +static void init_tf_paths(void) +{ + const char *env = getenv("MEOW_TF_ROOT"); + if (env && env[0]) { + snprintf(g_tf_root_buf, sizeof g_tf_root_buf, "%s", env); + /* 去掉末尾 `/`(规范化处统一按无尾斜杠处理) */ + size_t l = strlen(g_tf_root_buf); + while (l > 1 && g_tf_root_buf[l - 1] == '/') g_tf_root_buf[--l] = 0; + } + snprintf(g_tf_card_buf, sizeof g_tf_card_buf, "%s/MeowOS", TF_ROOT); + snprintf(g_apps_dir_buf, sizeof g_apps_dir_buf, "%s/MeowAPPs", TF_ROOT); + snprintf(g_logs_dir_buf, sizeof g_logs_dir_buf, "%s/MeowOS/logs", TF_ROOT); + snprintf(g_notif_log_buf, sizeof g_notif_log_buf, "%s/MeowOS/notifications/notifications.log", TF_ROOT); + env = getenv("MEOW_NOTIF_LOG"); + if (env && env[0]) snprintf(g_notif_log_buf, sizeof g_notif_log_buf, "%s", env); + g_tf_card = g_tf_card_buf; + g_apps_dir = g_apps_dir_buf; + g_logs_dir = g_logs_dir_buf; + g_notif_log = g_notif_log_buf; +} + /* ---------------- 有界动态字符串(sbuf) ---------------- */ typedef struct { char *b; size_t n; size_t cap; } sbuf_t; @@ -146,6 +183,16 @@ static void sA_str(sbuf_t *s, const char *v) sA(s, "\""); } +/* 追加一段原始字节到 sbuf(长度明确,绕过 %s 的固定缓冲限制;用于大 JSON 数组复用)。 */ +static void sA_append(sbuf_t *s, const char *b, size_t n) +{ + if (!b || n == 0) return; + if (sb_reserve(s, n) < 0) return; + memcpy(s->b + s->n, b, n); + s->n += n; + s->b[s->n] = 0; +} + static void sbuf_free(sbuf_t *s) { free(s->b); s->b = NULL; s->n = s->cap = 0; } /* ---------------- 响应函数前向声明(文件列表等先于定义处使用) ---------------- */ @@ -156,6 +203,7 @@ static int send_ok(int sock, const char *data); static int send_err(int sock, int status, const char *code, const char *msg); static int send_json(int sock, int status, const char *data); static int send_file(int sock, int status, const char *ctype, const char *abspath, const char *filename); +static void panel_log(const char *fmt, ...); /* ---------------- CSV(enum 名/标签)非改写取值;定义在设置列表区,先声明供 settings_coerce 用 ---------------- */ static const char *csv_at(const char *s, int idx, char *buf, int buflen); @@ -795,6 +843,7 @@ done: /* ---------------- 路径安全 ---------------- */ static int tf_present(void) { + if (getenv("MEOW_TF_ROOT")) return 1; /* 宿主测试显式指定卡根(env 覆盖),信任其存在 */ FILE *f = fopen("/proc/mounts", "r"); if (!f) return 0; char line[512]; @@ -836,7 +885,8 @@ static int is_sensitive_name(const char *base) static int normalize_path(const char *in, char *buf, size_t buflen) { size_t rl = strlen(TF_ROOT); - char joined[1024]; + if (strlen(in) > 900) return -1; /* 拒绝超长路径(防御;真实路径远小于此) */ + char joined[2048]; if (in[0] == '/') { if (strncmp(in, TF_ROOT, rl) == 0 && (in[rl] == 0 || in[rl] == '/')) { snprintf(joined, sizeof joined, "%s", in); @@ -849,10 +899,13 @@ static int normalize_path(const char *in, char *buf, size_t buflen) } else { snprintf(joined, sizeof joined, "%s/%s", TF_ROOT, in); } - /* 逐分量规范化:/a/b/../c → /a/c;拒绝逃逸出 root */ - char out[1024]; + /* 逐分量规范化成**绝对**路径:/a/b/../c → /a/c;拒绝逃逸出 root。 + * 用绝对 out(以 '/' 开头)构建:首段即带前导 '/', 保证 path_in_whitelist 的绝对前缀比对成立。 */ + char out[2048]; size_t n = 0; - out[0] = 0; + out[0] = '/'; + out[1] = 0; + n = 1; char *p = joined; while (*p) { while (*p == '/') p++; @@ -863,24 +916,27 @@ static int normalize_path(const char *in, char *buf, size_t buflen) seg[k] = 0; if (!strcmp(seg, ".") || !strcmp(seg, "")) continue; if (!strcmp(seg, "..")) { - /* 弹出一级;若已在 root 再 .. 则逃逸 */ - if (n == 0) return -1; - while (n > 0 && out[n - 1] != '/') n--; - if (n > 0) n--; /* 去掉结尾 / */ + /* 弹出一级;已在根(n==1)再 .. → 逃逸出 root,拒绝 */ + if (n <= 1) return -1; + while (n > 1 && out[n - 1] != '/') n--; + if (n > 1) n--; /* 去掉结尾 /;out[n] 归属下一段或结束 */ out[n] = 0; continue; } if (k > 0) { - size_t need = strlen(out) + 1 + k + 1; + size_t need = n + ((n > 1) ? 1 : 0) + (size_t)k + 1; if (need >= sizeof out) return -1; - if (out[0]) strncat(out, "/", sizeof out - strlen(out) - 1); - strncat(out, seg, sizeof out - strlen(out) - 1); + if (n > 1) { out[n++] = '/'; out[n] = 0; } + memcpy(out + n, seg, (size_t)k); + n += (size_t)k; + out[n] = 0; } } - /* 空 → root */ - if (!out[0]) snprintf(out, sizeof out, "%s", TF_ROOT); - if (strlen(out) >= buflen) return -1; - snprintf(buf, buflen, "%s", out); + /* 空/根(n==1,仅 "/")→ 卡根 */ + if (n <= 1) snprintf(out, sizeof out, "%s", TF_ROOT); + size_t ol = strlen(out); + if (ol >= buflen) return -1; + memcpy(buf, out, ol + 1); /* 已证明 ol 1024 * 1024) { close(fd); return NULL; } - if (st.st_size < 0) { close(fd); return NULL; } - char *buf = malloc((size_t)st.st_size + 1); + if (fstat(fd, &st) < 0 || st.st_size < 0) { close(fd); return NULL; } + long long total = (long long)st.st_size; + size_t cap = total > TEXT_PREVIEW_MAX ? (size_t)TEXT_PREVIEW_MAX : (size_t)total; + char *buf = malloc(cap + 1); if (!buf) { close(fd); return NULL; } - ssize_t n = read(fd, buf, (size_t)st.st_size); + ssize_t n = read(fd, buf, cap); close(fd); if (n < 0) { free(buf); return NULL; } buf[n] = 0; @@ -984,8 +1048,8 @@ static char *read_text_file_limited(const char *abs, long long *size, int *trunc if (c < 0x09) ctrl++; } if (ctrl > n / 10) { free(buf); return (char *)-2; } - if (size) *size = (long long)n; - if (truncated) *truncated = 0; + if (size) *size = total; + if (truncated) *truncated = (total > (long long)cap) ? 1 : 0; return buf; } @@ -1286,7 +1350,10 @@ static int read_request(int sock, req_t *r) } char *body_start = buf + hend + 4; /* body 实际起点 */ size_t buffered = (hn > (size_t)(body_start - buf)) ? (hn - (size_t)(body_start - buf)) : 0; - if (clen > MAX_HTTP_BODY) { free(buf); return -1; } + /* 上传(multipart)走更严上限:14MB 内存约束下不整读超 MAX_UPLOAD_BODY。超限 → -2(413)。 */ + size_t cap = MAX_HTTP_BODY; + if (strncasecmp(r->content_type, "multipart/form-data", 19) == 0) cap = MAX_UPLOAD_BODY; + if (clen > cap) { free(buf); return -2; } if (clen == 0) { free(buf); r->body = NULL; r->body_len = 0; return 0; } char *body = malloc(clen + 1); if (!body) { free(buf); return -1; } @@ -1425,7 +1492,28 @@ static int send_file(int sock, int status, const char *ctype, const char *abspat * 解析 body,提取 name= 字段与 name=file 字段(可多个)。写到 target dir(白名单校验)。 * 返回 0=成功(把写入的 item 用 items_json 回填),负错误码语义同协议。 */ -typedef struct { char path[1400]; char filename[256]; } upfile_t; +typedef struct { char path[1400]; char filename[320]; } upfile_t; + +/* 安全文件名:取 basename(去目录分隔符),拒绝空/`.`/`..`/含控制字符或分隔符。 + * 返回 0=ok 写入 out;-1=拒绝。用于防上传文件名逃逸白名单(如 `../../etc/passwd`)。 */ +static int safe_filename(const char *name, char *out, size_t cap) +{ + if (!name || !name[0]) return -1; + const char *b = name; + /* 取最后一个路径分隔符之后(同时兼容 '/' 与 '\\') */ + const char *slash = strrchr(b, '/'); + const char *bsl = strrchr(b, '\\'); + if (bsl && (!slash || bsl > slash)) slash = bsl; + if (slash) b = slash + 1; + if (!b[0]) return -1; + if (!strcmp(b, ".") || !strcmp(b, "..")) return -1; + for (const char *p = b; *p; p++) { + unsigned char c = (unsigned char)*p; + if (c == '/' || c == '\\' || c < 0x20 || c == 0x7f) return -1; /* 禁止分隔符/控制字符 */ + } + snprintf(out, cap, "%s", b); + return 0; +} static int parse_multipart(const req_t *r, upfile_t *files, int maxfiles) { @@ -1469,10 +1557,12 @@ static int parse_multipart(const req_t *r, upfile_t *files, int maxfiles) char *l = ln; while (*l == '\r' || *l == ' ' || *l == '\t') l++; if (strncasecmp(l, "Content-Disposition:", 20) == 0) { - char *nm = strstr(l, "name=\""); - if (nm) { nm += 6; char *q = strchr(nm, '"'); if (q) { *q = 0; name = nm; } } + /* name 与 filename 常同行(name="file"; filename="up.txt")。 + * 先取 filename 再取 name——若先截断 name 收尾引号会把同行的 filename 一并截断。 */ char *fn = strstr(l, "filename=\""); if (fn) { fn += 10; char *q = strchr(fn, '"'); if (q) { *q = 0; fname = fn; } } + char *nm = strstr(l, "name=\""); + if (nm) { nm += 6; char *q = strchr(nm, '"'); if (q) { *q = 0; name = nm; } } } } /* 数据结束:下一个 "--boundary" 之前 */ @@ -1487,18 +1577,25 @@ static int parse_multipart(const req_t *r, upfile_t *files, int maxfiles) curpath[dl] = 0; } else if (name && !strcmp(name, "file") && fname && nfiles < maxfiles) { size_t dl = (size_t)(data_end - data_start); - snprintf(files[nfiles].filename, sizeof files[nfiles].filename, "%s", fname); - snprintf(files[nfiles].path, sizeof files[nfiles].path, "%s", curpath); - /* 写文件 */ - char abs[1024]; - if (normalize_path(files[nfiles].path, abs, sizeof abs) < 0 || !path_in_whitelist(abs)) { nfiles++; continue; } - snprintf(files[nfiles].path, sizeof files[nfiles].path, "%s/%s", abs, fname); - int fd = open(files[nfiles].path, O_WRONLY | O_CREAT | O_TRUNC, 0644); + char safe[260]; + if (safe_filename(fname, safe, sizeof safe) < 0) { p = data_end; continue; } /* 文件名非法:跳过该 part */ + /* 目标目录规范化 + 白名单校验 */ + char absdir[1024]; + if (normalize_path(curpath, absdir, sizeof absdir) < 0 || !path_in_whitelist(absdir)) { p = data_end; continue; } + /* 拼绝对路径后再规范化 + 白名单复校(防拼接后残留逃逸) */ + char joined[1400]; + snprintf(joined, sizeof joined, "%s/%s", absdir, safe); + char abs[1400]; + if (normalize_path(joined, abs, sizeof abs) < 0 || !path_in_whitelist(abs)) { p = data_end; continue; } + snprintf(files[nfiles].filename, sizeof files[nfiles].filename, "%s", safe); + snprintf(files[nfiles].path, sizeof files[nfiles].path, "%s", abs); + int fd = open(abs, O_WRONLY | O_CREAT | O_TRUNC, 0644); if (fd >= 0) { write_full(fd, data_start, dl); close(fd); + nfiles++; } - nfiles++; + /* fd<0(不可写)→ 不计数,跳过该文件 */ } p = data_end; } @@ -2065,7 +2162,9 @@ static int api_logs_list(int sock) DIR *d = opendir(LOGS_DIR); if (!d) return send_err(sock, 404, "NOT_FOUND", "日志目录不存在"); sbuf_t s = {0}; - sA(&s, "{\"dir\":\"" LOGS_DIR "\",\"files\":["); + sA(&s, "{\"dir\":"); + sA_str(&s, LOGS_DIR); + sA(&s, ",\"files\":["); int first = 1; struct dirent *e; while ((e = readdir(d))) { @@ -2164,23 +2263,224 @@ static int api_logs_read(int sock, const req_t *r) return rc; } -/* ---------------- 通知(后端跨进程不可读 → 501) ---------------- */ -/* 注:通知存储为 launcher 进程内存(meow_notif.c g_slots[],NOTIFICATION_SYSTEM §4), - * 后端为独立 svcd 子进程,跨进程无法读取/清撤那批内存槽;框架仅在关机前把通知 dump 到 - * TF 卡 MeowOS/notifications/notifications.log(CSV 追加,非活跃快照)。故本后端无法实现 - * 活跃通知列表/清撤 —— 需为通知后端另开 IPC 查询(如 MSG_NOTIFY_LIST 应答)或持久化活跃集, - * 见 MEOWPANEL_PROTOCOL §6 待定案。当前一律 501。 */ +/* ---------------- 通知(数据源 = TF 卡通知转储日志) ---------------- + * 数据源优先级(MEOWPANEL_PROTOCOL §3.8 / 任务): + * 1) launcher IPC 查询 —— meow_ipc.h 已定义 MSG_NOTIFY_LIST(0x23),但 launcher 侧仅作 + * 守护→App 下发行(util.c:1079「not dispatched here」),**无客户端查询请求类型**, + * 后端(svcd 独立进程)无法据此取到活跃清单 → 跳过,回退 ②。详见报告「需 launcher 侧配合项」。 + * 2) TF 卡通知转储文件 `<卡根>/MeowOS/notifications/notifications.log`: + * launcher 把每条通知归档时追加一行 CSV(meow_notif.c tf_line:CSV 追加 + 10MB 滚动,开机清空)。 + * 字段顺序:timestamp,id,app_id,app_icon,category,urgency,progress,title,body,target_activity, + * ongoing,media,dismissed(前 6/7/11/12/13 为裸整数,其余引号包裹 + 内部 " 翻倍)。 + * 注意:**归档发生在置 dismissed=1 之前(meow_notif_dismiss 先 archive_one 后置 dismissed)**, + * 故日志的 dismissed 列恒 ≈0(不可靠),且日志是「会话级归档」,非活跃快照。 + * 3) 都没有 → 明确空态 {items:[],notifications:[],source:"none"},**不伪造数据**。 + * clear(dismiss_all)语义:保留活动中的媒体/进度通知(ongoing||media||progress>=0||category=="media"), + * 其余从日志移除。单条删除:按 id 移除该行。 */ +typedef struct { + long long ms; /* created_ms(epoch ms) */ + unsigned id; + char app_id[40]; + char app_icon[64]; + char category[40]; + int urgency; + int progress; /* -1=无 */ + char summary[96]; + char body[128]; + char target[64]; + int ongoing, media, dismissed; +} notif_rec_t; + +/* 取一个 CSV 字段(引号包裹 → 解转义;裸字段 → 原样;末后跳过 ',')。返回 0。 */ +static int notif_csv_field(const char **pp, char *out, int outcap) +{ + const char *p = *pp; + int o = 0; + if (*p == '"') { + p++; + while (*p && *p != '"') { + if (*p == '"' && p[1] == '"') { + if (o < outcap - 1) out[o++] = '"'; + p += 2; + } else { + if (o < outcap - 1) out[o++] = *p; + p++; + } + } + if (*p == '"') p++; + } else { + while (*p && *p != ',' && *p != '\n' && *p != '\r') { + if (o < outcap - 1) out[o++] = *p; + p++; + } + } + if (o < outcap) { out[o] = 0; } + else if (outcap > 0) { out[outcap - 1] = 0; } + if (*p == ',') p++; + *pp = p; + return 0; +} + +static int notif_parse_line(const char *line, notif_rec_t *r) +{ + const char *p = line; + char f1[32], f2[16], f6[8], f7[16], f11[8], f12[8], f13[8]; + char app[40], icon[64], cat[40], sum[96], body[128], tgt[64]; + notif_csv_field(&p, f1, sizeof f1); + notif_csv_field(&p, f2, sizeof f2); + notif_csv_field(&p, app, sizeof app); + notif_csv_field(&p, icon, sizeof icon); + notif_csv_field(&p, cat, sizeof cat); + notif_csv_field(&p, f6, sizeof f6); + notif_csv_field(&p, f7, sizeof f7); + notif_csv_field(&p, sum, sizeof sum); + notif_csv_field(&p, body, sizeof body); + notif_csv_field(&p, tgt, sizeof tgt); + notif_csv_field(&p, f11, sizeof f11); + notif_csv_field(&p, f12, sizeof f12); + notif_csv_field(&p, f13, sizeof f13); + r->ms = strtoll(f1, NULL, 10); + r->id = (unsigned)strtoul(f2, NULL, 10); + r->urgency = atoi(f6); + r->progress = atoi(f7); + r->ongoing = atoi(f11); + r->media = atoi(f12); + r->dismissed = atoi(f13); + snprintf(r->app_id, sizeof r->app_id, "%s", app); + snprintf(r->app_icon, sizeof r->app_icon, "%s", icon); + snprintf(r->category, sizeof r->category, "%s", cat); + snprintf(r->summary, sizeof r->summary, "%s", sum); + snprintf(r->body, sizeof r->body, "%s", body); + snprintf(r->target, sizeof r->target, "%s", tgt); + return 0; +} + +/* 读通知日志,保留最新 maxrec 条(环形缓冲,避免全量进内存)。返回条数;-1=文件不存在/无卡。 */ +static int notif_load_list(notif_rec_t *recs, int maxrec) +{ + FILE *f = fopen(g_notif_log, "r"); + if (!f) return -1; + int total = 0, head = 0; + char line[1400]; + notif_rec_t r; + while (fgets(line, sizeof line, f)) { + if (notif_parse_line(line, &r) != 0) continue; + recs[head] = r; + head = (head + 1) % maxrec; + if (total < maxrec) total++; + } + fclose(f); + if (total < maxrec) return total; /* 未满窗:recs[0..total-1] 即 oldest..newest */ + /* 满窗:oldest 在 recs[head],重排为 oldest..newest 连续 */ + notif_rec_t tmp[NOTIF_PREVIEW_MAX]; + for (int i = 0; i < maxrec; i++) tmp[i] = recs[(head + i) % maxrec]; + memcpy(recs, tmp, (size_t)maxrec * sizeof recs[0]); + return total; +} + +/* app_id → 展示名("system" → "系统";其余用 app_id 兜底,前端可回退)。 */ +static const char *notif_app_name(const char *app_id) +{ + if (!strcmp(app_id, "system")) return "系统"; + return app_id; +} + +static void notif_emit_item(sbuf_t *out, const notif_rec_t *r) +{ + sA(out, "{\"id\":%u,\"app_id\":", r->id); + sA_str(out, r->app_id); + sA(out, ",\"app_name\":"); + sA_str(out, notif_app_name(r->app_id)); + sA(out, ",\"app_icon\":"); + sA_str(out, r->app_icon); + sA(out, ",\"category\":"); + sA_str(out, r->category); + sA(out, ",\"summary\":"); + sA_str(out, r->summary); + sA(out, ",\"body\":"); + sA_str(out, r->body); + sA(out, ",\"urgency\":%d,\"ts\":%lld,\"progress\":", r->urgency, r->ms > 0 ? r->ms / 1000 : 0); + if (r->progress >= 0) sA(out, "%d", r->progress); else sA(out, "null"); + sA(out, ",\"ongoing\":%s,\"media\":%s,\"target_activity\":", + r->ongoing ? "true" : "false", r->media ? "true" : "false"); + sA_str(out, r->target); + sA(out, ",\"dismissed\":%s}", r->dismissed ? "true" : "false"); +} + static int api_notifications(int sock) { - return send_err(sock, 501, "NOT_IMPLEMENTED", "通知存储为 launcher 进程内存,后端跨进程不可读(需通知后端暴露 IPC 查询/清撤)"); + notif_rec_t recs[NOTIF_PREVIEW_MAX]; + int n = notif_load_list(recs, NOTIF_PREVIEW_MAX); + if (n < 0) return send_json(sock, 200, "{\"count\":0,\"items\":[],\"notifications\":[],\"source\":\"none\"}"); + sbuf_t arr = {0}; + int first = 1; + for (int i = n - 1; i >= 0; i--) { /* newest first */ + if (!first) sA(&arr, ","); + first = 0; + notif_emit_item(&arr, &recs[i]); + } + sbuf_t s = {0}; + sA(&s, "{\"count\":%d,\"source\":\"tf\",\"items\":[", n); + if (arr.n) sA_append(&s, arr.b, arr.n); + sA(&s, "],\"notifications\":["); + if (arr.n) sA_append(&s, arr.b, arr.n); + sA(&s, "]}"); + sbuf_free(&arr); + int rc = send_json(sock, 200, s.b ? s.b : ""); + sbuf_free(&s); + return rc; } -static int api_notification_delete(int sock) + +/* 重写通知日志。mode=1:保留活动媒体/进度(ongoing||media||progress>=0||category=="media"), + * 其余删除(dismiss_all 语义,对应通知中心既定语义);mode=0:删除指定 id(单条删除)。 + * 返回删除行数;-1=IO 错;0=无文件(无可删)。写临时文件后 rename(避免与 launcher append 竞写)。 */ +static int notif_rewrite(int mode, unsigned del_id) { - return send_err(sock, 501, "NOT_IMPLEMENTED", "通知清撤需 launcher 通知后端 IPC,后端未实现"); + if (!g_notif_log || !g_notif_log[0]) return -1; + char tmppath[1400]; + snprintf(tmppath, sizeof tmppath, "%s.panel.tmp", g_notif_log); + FILE *in = fopen(g_notif_log, "r"); + if (!in) return 0; + FILE *out = fopen(tmppath, "w"); + if (!out) { fclose(in); return -1; } + int removed = 0; + char line[1400]; + while (fgets(line, sizeof line, in)) { + notif_rec_t r; + int parsed = (notif_parse_line(line, &r) == 0); + int drop = 0; + if (mode == 1) { + if (!parsed) drop = 1; + else drop = !(r.ongoing || r.media || r.progress >= 0 || !strcmp(r.category, "media")); + } else { + if (parsed && r.id == del_id) drop = 1; + } + if (drop) removed++; + else fputs(line, out); + } + fclose(in); + if (fclose(out) != 0) return -1; + if (rename(tmppath, g_notif_log) < 0) { unlink(tmppath); return -1; } + return removed; } + +static int api_notification_delete(int sock, unsigned id) +{ + int removed = notif_rewrite(0, id); + if (removed < 0) return send_err(sock, 500, "INTERNAL", "写通知存储失败"); + if (removed == 0) return send_err(sock, 404, "NOT_FOUND", "通知不存在"); + char d[64]; + snprintf(d, sizeof d, "{\"id\":%u,\"dismissed\":true}", id); + return send_json(sock, 200, d); +} + static int api_notification_dismiss_all(int sock) { - return send_err(sock, 501, "NOT_IMPLEMENTED", "通知清空需 launcher 通知后端 IPC,后端未实现"); + int removed = notif_rewrite(1, 0); + if (removed < 0) return send_err(sock, 500, "INTERNAL", "写通知存储失败"); + char d[64]; + snprintf(d, sizeof d, "{\"dismissed\":%d}", removed); + return send_json(sock, 200, d); } /* ---------------- 文件操作 ---------------- */ @@ -2208,7 +2508,7 @@ static int api_files_read(int sock, const req_t *r) sA_str(&s, abs); sA(&s, ",\"content\":"); sA_str(&s, txt); - sA(&s, ",\"size\":%lld,\"truncated\":false}", size); + sA(&s, ",\"size\":%lld,\"truncated\":%s}", size, trunc ? "true" : "false"); free(txt); int rc = send_json(sock, 200, s.b ? s.b : ""); sbuf_free(&s); @@ -2318,8 +2618,16 @@ static int api_files_rename(int sock, const req_t *r) if (strchr(pnn->str, '/')) { jv_free(root); return send_err(sock, 400, "BAD_REQUEST", "new_name 仅文件名"); } char abs[1024], newabs[1400]; if (normalize_path(pj->str, abs, sizeof abs) < 0 || !path_in_whitelist(abs)) { jv_free(root); return send_err(sock, 403, "FORBIDDEN", "白名单外/路径逃逸"); } - snprintf(newabs, sizeof newabs, "%s/%s", abs, pnn->str); - /* newabs 也须在白名单(new_name 不含 /,父目录已校验,无需再 normalize) */ + /* 新路径 = 原路径的**父目录** + new_name(new_name 仅文件名,不含分隔符) */ + char parent[1024]; + snprintf(parent, sizeof parent, "%s", abs); + char *sl = strrchr(parent, '/'); + if (!sl || sl == parent) { jv_free(root); return send_err(sock, 400, "BAD_REQUEST", "无法重命名根路径"); } + *sl = 0; + if (!parent[0]) snprintf(parent, sizeof parent, "%s", TF_ROOT); /* abs 顶层(如 /tmp/mptf/x)→ 父=根 */ + snprintf(newabs, sizeof newabs, "%s/%s", parent, pnn->str); + /* newabs 复校白名单(new_name 无 /,父目录已校验;防御) */ + if (!path_in_whitelist(newabs)) { jv_free(root); return send_err(sock, 403, "FORBIDDEN", "白名单外/路径逃逸"); } if (rename(abs, newabs) < 0) { jv_free(root); return send_err(sock, 500, "INTERNAL", "重命名失败"); } sbuf_t s = {0}; sA(&s, "{\"item\":{\"name\":"); @@ -2557,7 +2865,9 @@ static int api_apps_export(int sock, const char *pkg) if (!tf_present()) return send_err(sock, 503, "NO_CARD", "未识别到 TF 卡"); if (strchr(pkg, '/') || strchr(pkg, ':')) return send_err(sock, 400, "BAD_REQUEST", "包名非法"); char tmp[1100]; - mkdir(TF_CARD_DIR "/tmp", 0777); + char card_tmp[1200]; + snprintf(card_tmp, sizeof card_tmp, "%s/tmp", TF_CARD_DIR); + mkdir(card_tmp, 0777); snprintf(tmp, sizeof tmp, "%s/tmp/%s.mpk", TF_CARD_DIR, pkg); unlink(tmp); char cmd[1400]; @@ -2668,7 +2978,7 @@ static int handle(int sock, req_t *r) if (!strcmp(p, "/api/files/mkdir")) return api_files_mkdir(sock, r); if (!strcmp(p, "/api/files/rename")) return api_files_rename(sock, r); if (!strcmp(p, "/api/apps/install")) return api_apps_install(sock, r); - if (!strcmp(p, "/api/notifications/dismiss_all")) return api_notification_dismiss_all(sock); + if (!strcmp(p, "/api/notifications/dismiss_all") || !strcmp(p, "/api/notifications/clear")) return api_notification_dismiss_all(sock); if (!strcmp(p, "/api/key")) return api_key_batch(sock, r); char seg[256]; if (path_segment("/api/key/", p, seg, sizeof seg)) @@ -2721,8 +3031,10 @@ static int handle(int sock, req_t *r) if (!strcmp(r->method, "GET") && !strcmp(p, "/api/notifications")) return api_notifications(sock); if (!strcmp(r->method, "DELETE")) { char seg[256]; - if (path_segment("/api/notifications/", p, seg, sizeof seg)) - return api_notification_delete(sock); + if (path_segment("/api/notifications/", p, seg, sizeof seg)) { + unsigned nid = (unsigned)strtoul(seg, NULL, 10); + return api_notification_delete(sock, nid); + } } return send_err(sock, 404, "NOT_FOUND", "端点不存在"); @@ -2757,7 +3069,12 @@ static void handle_conn(int sock) { req_t r; memset(&r, 0, sizeof r); - if (read_request(sock, &r) != 0) { close(sock); return; } + int rr = read_request(sock, &r); + if (rr != 0) { + if (rr == -2) send_err(sock, 413, "PAYLOAD_TOO_LARGE", "请求体过大(超过上传上限)"); + close(sock); + return; + } handle(sock, &r); req_free(&r); close(sock); @@ -2778,6 +3095,7 @@ int main(int argc, char **argv) return 0; } } + init_tf_paths(); /* 先定卡根/派生路径(env 可覆盖,宿主测试用) */ const char *env = getenv("MEOW_IPC_PERF_SOCK"); if (env && env[0]) g_sock_perf = env; env = getenv("MEOW_IPC_POWER_SOCK"); diff --git a/patch_v2/meowpanel/meowpanel_host b/patch_v2/meowpanel/meowpanel_host index 604dde0a5fb1099f0f0dcf2b5c9b97d00052df3e..109625526966acc73721e0e9cdb33ae410d7f1cc 100755 GIT binary patch literal 144088 zcmb5X4PaHpng4(8y@5nTc}XC=+2jUPjBhA!iJ)8(DrjxRkgBV0lMt{dh`ebL+;a1> z)t1`kD83Zk6418fZnfDKDzU8ue5qC2hNx7#{??lW)K=RCc}oyNQn;U#iaI1OG47Xf_r|NBR^MlXPZaMGi^-#}#Zr-ULzdq?ey{BbHg#feE-*fgWZB9ZhJvGdg+!yPC@VK zP|xYFNUiyw{gtm;huW8)Gv=X_iwmB;@OS_DX?vDdDsGfQS3QbGVOo5A}iPZ+(-t`Y8WKAMo@0fS2`w ze@P$kSNp&t^>HeC9`B?4nm)=8M?mJ17yS4AKIr@e@Kdd?d-^E9t`GRUKH%X#`aiyp z^4IoJzM_xv&oj_d(e3p<;Q!JGytEJaqkZ&eQXl>KO&{fR`zZfpALVcDqd))I2mFja z;Q!qR{+s$JU)M+Z_xmW{+6VliKH#_Yf&c72_;yhrbbG%KJm2f1e03lF`CA|G^giI$ ztzTcbs?z*-rL}U^ippj8SSyz#7w?Ridnn zoXW*zm5Uaa-CA+m5&%vWL9AO>EL^DnR4h=11$Qm8ZmnFpYKc|3eOnt$6; zlZ8RE!n$iI_RV6ITy^IHYuTMkmRPsmxoqK5aNb6{mrg8Oxw5ii>8+MJv2c~O>b5%; zs`L_5q;l0g%NCZ+FI#eFrM2P?A-`+ol7$PGQTvXCchFbUBZ~8X>yE`LP*!&Lt-jv& zG@~A9D0h1VFm*K!(?edCsF^^8CF)FN#ma@1cc@iA>WWo&-e%q5)LLdnPXUa&N|A5H zs)-gsTO^lq!t=}JXq@FB%#loc(&|3-k zEUvQ>HK(xnS4S6OP-A!sjx3H{2IW+Y-Jh+_yt=a$~7d8$}-+nr0TZ>+d&)k3Rc z{+%lfTdlftaoGy%R)^s);3?Lr&EnbDTvb$DcIiczOtrk% zi4%KXC-uA*SY=n0ez^?NFZ{YFzoPWZ#Y^s7y0Elj{*r|d^W?s?!^TKc(J;sqMhzFNCZebW;9HE`N{O zkKp$7xBj4x^Do30o^kV){)Nf!XT9UXwwZLAwa-oOFzJZ(zi!&W7w*RA`9Tra(JG%L ztd>>a`kx+rpbL)$;3xm!l%E@bAK&l5mj&RK1Uvs$2jKNCp8EsvxxaVHZw~0X$in{-12V+;OD#WWB~59`(Xh7MYnus0AB9GM;t_f@Xw>ChbK1xuXM{# z2*6jn@K^x8)`iarz-wLj+yLBb_r?JHA-DXZ0Q~O1I`qFk0Qd0J1>o2J(J5aafIs8n zZw$bH;lg(W;Lp48<^bGl_mu$rb+`Q60r-0^{KEkJeHVTp0RO~=cLv~IyVfVY=du3> z&Ugn0;2zy31mGT?f&e_n#WN=W_wXzVz&$+60`LVc{o?`n+3vXN18@(|)&P8p+n*f) zxYwVz18@&dG628I#d9D4ukh%0s5d=tb>Sld@H<@i_yByJ3!f8!dwAvs;I(e~@&NoX z7akA5Jv{dZ;NNX?=KZk%e3~b(0`MQZ_!|T8Mi;�Ds?_B0&ovc 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 M)(Lyst4t~%E1u`W^DnQ07k&gW>P20@ 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 diff --git a/patch_v2/meowpanel/web/meowpanel.js b/patch_v2/meowpanel/web/meowpanel.js index c38a9b4..58e284d 100644 --- a/patch_v2/meowpanel/web/meowpanel.js +++ b/patch_v2/meowpanel/web/meowpanel.js @@ -339,7 +339,7 @@ }); } function doDownload(url, name) { - apiDownload(url).then(blobUrl => { + return apiDownload(url).then(blobUrl => { const a = document.createElement('a'); a.href = blobUrl; a.download = name || 'file'; document.body.appendChild(a); a.click(); a.remove(); setTimeout(() => URL.revokeObjectURL(blobUrl), 5000); @@ -432,7 +432,17 @@ if (install) { const fi = $('#app-file'); if (fi) { fi.value = ''; fi.click(); } return; } if (refresh) { renderApps(); return; } if (info) { appInfo(info.dataset.ainfo); return; } - if (exp) { e.preventDefault(); doDownload('/api/apps/' + exp.dataset.aexport + '/export', exp.dataset.aexport + '.mpk'); return; } + if (exp) { + e.preventDefault(); + if (exp.dataset.busy) return; /* 打包期间防连点 */ + exp.dataset.busy = '1'; + const oldTxt = exp.textContent; + exp.textContent = '打包中…'; + toast('正在打包导出 ' + exp.dataset.aexport + ',请稍候…'); + doDownload('/api/apps/' + exp.dataset.aexport + '/export', exp.dataset.aexport + '.mpk') + .finally(() => { delete exp.dataset.busy; exp.textContent = oldTxt; }); + return; + } if (uninst) { appUninstall(uninst.dataset.auninst); return; } if (goPath) { installFromPath($('#app-install-path').value); return; } });