fix: 安全与健壮性排查修复(IPC 类型校验/AbortSignal/空名去重/窗口 await)

阻断项:
- install-manager: uninstall-installed / remove-installed / check-installed 由 any 改为 unknown + parseAppPayload 严格解析(PKGNAME_PATTERN 校验 pkgname,origin 仅限 spark|apm),消除命令注入风险;parseAppPayload/PKGNAME_PATTERN 提升至模块顶部复用并避免 TDZ
- App.vue openDetail: 参数由 Record<string,unknown> 收紧为 App | OpenDetailInput,新增 pkgname 运行时校验,避免访问 undefined 属性

改进项:
- App.vue homeLinks 去重:跳过空名称避免污染 seenNames,并对 links 数组与 HomeLink 必需字段做校验
- App.vue fetchWithRetry: 新增 AbortSignal 参数,递归链路传递,组件卸载时 rootAbortController.abort() 取消未完成任务
- index.ts showAndFocusMainWindow: 改为 async 并 await createWindow,调用点用 void 修饰避免 floating promise

vue-tsc --noEmit 通过。
This commit is contained in:
xiyidaiwa
2026-08-03 11:24:32 +08:00
parent b89c001401
commit 4f772ba7eb
3 changed files with 102 additions and 53 deletions
+7 -6
View File
@@ -272,9 +272,10 @@ const requestApplicationExit = (): void => {
app.quit();
};
const showAndFocusMainWindow = (): void => {
const showAndFocusMainWindow = async (): Promise<void> => {
if (!win || win.isDestroyed()) {
createWindow();
// 等待窗口创建完成,创建失败时调用方可通过异常感知
await createWindow();
return;
}
@@ -643,11 +644,11 @@ app.on("window-all-closed", () => {
});
app.on("second-instance", () => {
showAndFocusMainWindow();
void showAndFocusMainWindow();
});
app.on("activate", () => {
showAndFocusMainWindow();
void showAndFocusMainWindow();
});
app.on("will-quit", () => {
@@ -700,7 +701,7 @@ app.whenReady().then(() => {
{
label: "显示主界面",
click: () => {
showAndFocusMainWindow();
void showAndFocusMainWindow();
},
},
{
@@ -719,7 +720,7 @@ app.whenReady().then(() => {
win.hide();
win.setSkipTaskbar(true);
} else {
showAndFocusMainWindow();
void showAndFocusMainWindow();
}
});
});