shenmo7192
|
56a7e11622
|
fix(install): 修复 APM 未安装时点安装静默无反应,并清理同类接线断裂
主问题:showApmInstallDialog 在 useAppState.ts 被重复声明为独立 ref,
而 processInstall.ts 置位的是 storeConfig.ts 中的另一份实例,导致 APM
未安装时点「安装」既不弹引导弹窗也不创建下载任务(界面毫无反应)。
修复:
- useAppState 改为从 storeConfig 再导出同一实例(消除双实例)
- processInstall 在 install-complete 兜底识别「未安装 APM」失败原因
- 新增回归测试 ApmInstallDialog.test.ts(回退修复后 3/3 失败)
同类「接线断裂」问题全量排查修复(源自 d7bdcf36 拆分 composables):
- 应用下载排行永远为空:loadRanking 在 apps 未填充时空跑且不重试
- 详情页卸载后按钮状态不刷新(丢失的 checkAppInstalled 分支)
- 重试已取消任务复用 id,被旧任务 finally 删除而永久卡在下载中
- remove-installed 的 spawn 缺 error 监听(可致主进程崩溃)且不消费 stderr
- 云端应用列表在来源查询失败时静默丢数据(已安装列表同源问题)
- 忽略更新写入失败无反馈;下载统计上报缺 catch
- isInstalledAppInfo 运行时校验被削弱
清理重构遗留孤儿代码:
- 删除无引用的 AppDetailPage/AccountQuickMenu/TopActions/UpdateCenterCloseConfirm
- 恢复 handleRemoveComplete 语义与 onUnmounted 的 abort/unbind
- 删除孤儿 IPC:list-upgradable/show-apm-install-dialog/uninstall-installed
- 删除孤儿渲染端代码:handleUpgrade/handleRemove/useDownloadItemStatus
及已无生产者的 queue-install 回灌监听器
验证:vue-tsc 0 error、vite build 通过、单元测试无新增失败
(基线 40 失败 → 35 失败)。
Signed-off-by: shenmo <jifengshenmo@outlook.com>
|
2026-10-11 12:34:10 +08:00 |
|
xiyidaiwa
|
ada3a6dab4
|
fix(install-manager): 按 dpkg 规则放宽 deb 文件名校验,修复含 epoch 冒号包被误拦
- 新增 FILENAME_PATTERN,按 Debian 规则允许包名/版本号合法字符:含 epoch 冒号
(如 steam-launcher_1:1.0.0.87_amd64.deb)与排序标记 ~(如 1.0~beta),及字母数字 . _ + -
- filename 校验由严格 PKGNAME_PATTERN 改为 FILENAME_PATTERN,并保留路径遍历双保险
(拒绝 '..' 段 + path.basename 拒绝含 '/' 的路径),安全性未削弱
- 修正字符组内 [:~] 正则区间陷阱:用 \- 转义隔离,避免误匹配 <,=,>,?,@,[,] 等符号
- 已用真实仓库 2085 个包验证:包名/文件名拒绝均为 0,全部可正常放行下载与安装
|
2026-08-17 09:12:08 +08:00 |
|
xiyidaiwa
|
7bad39a796
|
fix(security/robustness): 清理 update-center 调试日志 + cancel-install id 校验
- update-center/index.ts: 引入 pino logger,将约 30 处 console.log(含 [DEBUG] 前缀及敏感路径)
替换为 logger.debug(生产默认 info 级不打印,消除敏感信息泄露)
- install-manager.ts: cancel-install 增加 id 整数类型校验(typeof number && isInteger),防御非法输入
- PR 审查其余 5 项经代码实证为误报:JSON.parse 已有 try-catch、activeDownloadCount 的 mkdir/axios
均在 try 内且 finally 必执行、check/remove-installed 已用 parseAppPayload 做 PKGNAME_PATTERN 校验、
origin 已枚举归一化、initializeUpdateCenter 已有单例守卫;async handler 顶层 try-catch 因 Electron
主进程默认 unhandledRejection 不崩溃且改动面大(19 handler)风险高,未改
|
2026-08-13 23:37:03 +08:00 |
|
xiyidaiwa
|
e67f4752a4
|
fix(stability): cancel-install 增加 SIGTERM→SIGKILL 超时降级防止僵尸进程
- install-manager.ts: cancel-install 仅 kill()(SIGTERM),子进程忽略时成僵尸;新增 forceKill 封装先 SIGTERM 后 5s 超时降级 SIGKILL
- PR 审查其余 6 项经代码实证均为误报/可维护性建议,未改动:JSON.parse 已有 try-catch、pkgname 已 PKGNAME_PATTERN 校验防穿越、shell-caller 已双引号+白名单、watch 不修改 apps.length 无循环、baseApps 量级无需 shallowRef、install-complete 已 off 清理
|
2026-08-13 22:49:36 +08:00 |
|
xiyidaiwa
|
0f62a7e36a
|
feat(update-center): 支持被系统锁定(hold)包的强制安装与更新中心体验优化
- 标记 apt-mark hold 的 spark(aptss) 源包,默认禁用勾选并提示开启强制安装
- 更新中心发起更新时透传 forceHeld,后端 Spark 本地 deb 走 shell-caller
force-ssinstall 分支(单次免密 pkexec:unhold→ssinstall→hold),避免二次提权
- 无可选项时禁用全选并提示"无可更新项";更新选中后从列表中移除已启动项
- DownloadDetail 紧凑布局避免整页滚动;Toolbar 全选与更新选中按钮同行
- 继承 PKGNAME_PATTERN 与 metalinkUrl 白名单(https+*.spark-app.store+拒..)纵深防御
- apm 源无 hold 概念,forceHeld 在 apm 分支忽略(正确行为)
|
2026-08-13 16:42:21 +08:00 |
|
xiyidaiwa
|
b5c5ab04b5
|
fix(update-center): 修复更新中心点击更新后卡在"开始更新..."不动
- 根因:service.ts 用 webContents.send("queue-install") 向主下载队列发任务,
但 webContents.send 的目标对象是渲染进程,主进程 ipcMain 监听不到自己发出的消息,
导致任务从未进入 install-manager 的下载队列,UI 永远卡在 queued。
- 将 install-manager.ts 的 queue-install 处理逻辑抽为导出的 addInstallTask(payload, sender),
新增 QueueInstallPayload 类型,避免 any。
- 更新中心 service.ts 的 start() 改为直接 await addInstallTask(...),任务真正入队。
- 文档 docs/app-list-cache-analysis.md 新增第 9 节记录本修复。
|
2026-08-13 09:37:17 +08:00 |
|
xiyidaiwa
|
a7b8cd52af
|
fix(安全/性能): AI审查实证修复 - metalinkUrl SSRF校验 + withTimeout定时器泄漏 + 批量更新/初始加载守卫
- install-manager.ts: queue-install 增加 metalinkUrl 校验(仅允许相对路径或官方域名,防 SSRF)
- App.vue: withTimeout 用 finally(clearTimeout) 修复定时器泄漏
- App.vue: apps 批量更新改数组赋值替代 push(...),避免逐元素响应式重渲染
- App.vue: apps.length watcher 增加 initialCatalogLoaded 守卫,初始目录加载期间跳过已安装列表刷新 IPC
- 审计实证:①filename校验已有(误报) ④pauseDownload为历史TODO且后端不支持(不在此PR) ⑦⑧为可维护性大项(记录待后续)
注:AI审查4阻断项实证——①误报 ②真实加固 ③真实修复 ④历史遗留;4改进项 ⑤⑥真实已修 ⑦⑧记录
|
2026-08-12 20:28:27 +08:00 |
|
xiyidaiwa
|
30e1bc4840
|
refactor(更新中心): E方案重设计更新条目 + 已忽略沉底 + 复用app.update显示更新时间 + 安全加固
- UpdateCenterItem.vue: 改为单行紧凑卡片,显示 包名·当前→新版本、来源标签、更新时间(品牌色)、大小;已忽略项淡化
- updateCenter.ts: filteredItems 将已忽略项沉底到列表末尾
- UpdateCenterList/Modal + App.vue: 透传全局 apps,用 app.json 的 Update 字段(Date.parse)推算 updateTime,零额外网络请求
- typedefinition.ts + update-center/types.ts: 新增可选 updateTime 字段
- install-manager.ts: launch-app 补 pkgname.length > 256 长度限制(防 DoS)
- index.ts: close 事件先 clearTimeout 防抖定时器再同步保存窗口状态(消除竞态)
- App.vue: fetchWithRetry 重试 3→2、延迟 1000→500ms(体验优化)
- 7维审计通过;AI审查2阻断项(getIconUrl防护/fetchWithRetry泛型)经核实为误报
|
2026-08-11 23:54:00 +08:00 |
|
xiyidaiwa
|
7cafcc51f6
|
fix(download): 下载失败时补全日志,避免卡在"正在获取 Metalink"突兀退出
- 主进程 Metalink 下载请求失败显式 sendLog 并回传渲染端(原仅静默 logger.error)
- aria2c 拉起失败补 sendLog 日志
- Metalink 写入完成补 sendLog 提示
- 渲染端 install-complete 失败分支将错误原因写入 logs,并补成功/失败终止日志
- 配套: 缓存修复(C1 主进程 no-cache + C2 axios ?_t 版本戳) 已在上一提交实现
- 文档 docs/app-list-cache-analysis.md 新增第8节下载日志断层修复方案
|
2026-08-11 18:50:31 +08:00 |
|
xiyidaiwa
|
102ac72d89
|
fix: 安全加固 + 首页推荐优先加载解耦
- install-manager: queue-install JSON.parse 加 try-catch 防异常 payload
- App.vue: openExternalUrl 协议白名单(http/https) 防恶意 scheme
- AppDetailModal: sanitizeMoreContent 改用 textContent 防 v-html XSS
- storeConfig: loadPriorityConfig 校验顶层结构,畸形数据回退 APM
- App.vue onMounted: 首页推荐(loadHome+preloadHomeListApps) 与全量
应用加载(loadApps) 解耦,进入软件即优先显示首页推荐
|
2026-08-10 23:40:21 +08:00 |
|
xiyidaiwa
|
3f22207505
|
fix/refactor: 更新中心扫描与多项安全加固(经专业审计)
更新中心扫描修复:
- updateCenter.ts: 抽出 runSystemUpdateThenLoad, open/refresh 共用,
打开时即刷新双源(aptss ssupdate + apm update), 失败仅告警不阻断扫描
- shell-caller.sh: ssupdate 分支 exit $? 恒 0 吞掉刷新失败, 改为 exit $exit_code
- update-center/query.ts: 移除 nextVersion===currentVersion 误删真实更新项逻辑,
信任 aptss 上游 upgradable 判断
安全加固:
- AppDetailModal.vue: 新增 sanitizeMoreContent 剥除 HTML 标签后再 v-html, 防 XSS
- InstalledAppsModal.vue: ALLOWED_LOCAL_ICON_PREFIXES 收紧为具体子目录, 缩小
本地文件读取面
- install-manager.ts: filename 用 path.basename 防路径遍历; 包名/文件名 PKGNAME_PATTERN 校验
- index.ts: 临时目录改用 spark-store-${pid} 隔离, will-quit 清理对应目录
经 7 维度专业审计(安全/功能/类型/可维护/资源/性能/兼容)通过。
|
2026-08-10 21:42:36 +08:00 |
|
xiyidaiwa
|
ae584730c4
|
refactor: 多维度代码审查修复(安全/清理/类型)
- src/App.vue:
- fetchAppFromStore 的 category/pkgname 路径参数 encodeURIComponent 编码(防路径穿越)
- img_urls JSON.parse 增加 try/catch,解析失败回退空数组(两处)
- onUnmounted 统一移除 hashchange/resize/keydown 及全部 IPC 监听,修复内存泄漏
- 提取 createFallbackApp 消除 openDetail 重复回退构造
- 收集并统一停止等待 loading 的一次性 watcher,闭环生命周期清理
- src/global/typedefinition.ts: 移除 CategoryInfo/HomeLink 宽泛索引签名,
CategoryInfo 改用显式 extra 字段
- electron/main/backend/install-manager.ts: 清理冗余 eslint-disable 并修正缩进
(remove-installed/check-installed 已通过 parseAppPayload 完成 pkgname 校验,无需改动)
|
2026-08-06 22:06:43 +08:00 |
|
xiyidaiwa
|
3816703303
|
fix: 安全加固——queue-install 路径遍历校验 + 首页远程数据显式字段
针对 PR 安全审查的修复:
1. queue-install 路径遍历(阻断项,真实风险):
install-manager.ts 直接用渲染进程传入的 pkgname 拼装下载目录
/tmp/spark-store/download/ 与 ssinstall 命令参数 /,
此前未做任何校验。复用模块顶部 PKGNAME_PATTERN 对 pkgname 与 filename 做白名单校验,
拦截含 ../、/ 或非法字符的输入,杜绝路径遍历。
2. 首页远程数据展开(阻断项,纵深防御):
App.vue loadHome 此前用 { ...l } 直接展开远程 homelinks.json 到响应式数组,
可能注入未知属性。改为显式提取 name/url/icon/more/imgUrl/type/origin 已知字段构造,
仅保留可信字段(url 仍做必需校验以保首页正常渲染)。
注:check-installed 白名单(审查第1项)此前已在 4f772ba7 通过 parseAppPayload 修复,本次无改动。
vue-tsc --noEmit 通过。
|
2026-08-03 14:17:45 +08:00 |
|
xiyidaiwa
|
4f772ba7eb
|
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 通过。
|
2026-08-03 11:24:32 +08:00 |
|
 xiyidaiwaandshenmo7192
|
77b4244f1d
|
!408 refactor(已安装应用): 合并 APM/Spark 分页为列表标签并新增统计
Merge pull request !408 from xiyidaiwa/Erotica
|
2026-07-29 06:47:41 +00:00 |
|
shenmo7192
|
0a6fcd95c7
|
feat(install-manager): 安装成功时跳过APM快捷方式创建,仅针对升级任务
|
2026-07-19 23:27:19 +08:00 |
|
shenmo7192
|
5e120d03ae
|
refactor(installer): 更新下载重试策略为指数退避
将原来固定间隔的重试超时列表替换为指数退避的重试间隔,从首次3秒递增到末次1分钟,共10次重试,优化下载失败后的重试体验
|
2026-07-16 00:44:42 +08:00 |
|
shenmo7192
|
b233fea4d5
|
refactor(install): 重构下载安装队列逻辑,拆分并发控制
1. 将下载与安装流程分离,实现并发下载限制与单安装实例控制
2. 新增任务阶段枚举,替换原有activeDownloads计数逻辑
3. 优化取消任务的处理流程,区分运行中和排队中的任务
4. 修复下载队列显示的统计错误,改为展示已完成任务数
5. 调整日志格式与代码注释,提升可读性
|
2026-07-13 23:06:05 +08:00 |
|
MarcusPy827
|
2efea67a60
|
chore: APM桌面快捷方式补丁修正权限0755 -> 0644
|
2026-06-30 03:44:57 +08:00 |
|
MarcusPy827
|
51d7e1870c
|
chore: APM桌面快捷方式补丁改用异步读取+修复过早return
|
2026-06-30 03:43:21 +08:00 |
|
MarcusPy827
|
98d6ebd2b4
|
chore: APM桌面快捷方式补丁改用异步读取+从XDG拿路径
|
2026-06-30 03:27:36 +08:00 |
|
MarcusPy827
|
6921350878
|
fix: APM安装软件后无法自动创建快捷方式的问题
|
2026-06-30 03:13:28 +08:00 |
|
sunnypai
|
399b59dae8
|
fix pkexec lookup for privilege escalation
|
2026-06-17 13:30:38 +08:00 |
|
sunnypai
|
601d3f51f4
|
add nixos support
|
2026-06-17 12:51:44 +08:00 |
|
shenmo7192
|
24d55d0997
|
refactor: 优化代码结构并新增多标签分类应用加载逻辑
1. 重构下载重试超时列表为多行格式提升可读性
2. 合并环境变量配置行简化代码
3. 新增多标签分类页面的应用加载能力,包括:
- 添加displayCategories和displayApps计算属性
- 实现loadTabCategories和loadTabApps加载子分类数据
- 抽离normalizeAppJson复用应用数据格式化逻辑
- 优化侧边栏分类切换的应用过滤逻辑
|
2026-05-30 20:41:59 +08:00 |
|
shenmo7192
|
f62665cd73
|
release: bump version to 5.1.1 and fix dns download issue
add --async-dns=false aria2 parameter to all download jobs to fix potential dns resolution failures during package download
|
2026-05-16 02:35:29 +08:00 |
|
shenmo7192
|
e16acbd0a5
|
refactor(installer): 调整下载重试超时配置和次数
更新了下载重试的超时时间列表和总重试次数,从原3次调整为10次,优化下载成功率
|
2026-05-13 21:13:25 +08:00 |
|
shenmo7192
|
8a5f8d154f
|
feat: 添加APM安装确认弹窗并重构APM检查流程
1. 新增全局状态控制APM安装弹窗显示
2. 新建ApmInstallConfirmModal弹窗组件
3. 将主进程的APM安装弹窗逻辑迁移到前端Vue组件
4. 更新package.json版本到5.1.0
5. 简化安装和升级流程中的APM检查逻辑
|
2026-05-12 21:54:47 +08:00 |
|
momen
|
0b784af3d7
|
fix(sources): hide unavailable update and management entries
|
2026-04-16 13:04:54 +08:00 |
|
shenmo7192
|
68dd6a0a26
|
perf(spark): 优化已安装应用检查逻辑
- 对于 Spark 应用,使用 dpkg-query 替代自定义脚本检查安装状态
- 在 list-installed 接口中支持传入包名列表进行批量检查,避免全量扫描
- 添加 aptss 可用性检查,避免在不可用时执行相关命令
- 移除冗余的 check-installed 二次验证步骤
|
2026-04-16 00:10:14 +08:00 |
|
shenmo7192
|
a280d44481
|
fix(下载队列): 为滚动容器添加overscroll-contain防止滚动溢出
refactor(安装管理器): 移除upgradeOnly逻辑并统一使用ssinstall命令
test(更新中心): 更新测试用例以匹配新的安装逻辑
|
2026-04-12 21:25:10 +08:00 |
|
shenmo7192
|
9244708b90
|
feat(安装管理器): 添加安装参数以禁用桌面快捷方式和使用原生安装
添加 --no-create-desktop-entry 和 --native 参数以避免创建桌面快捷方式并确保使用原生安装方式
|
2026-04-12 21:14:06 +08:00 |
|
momen
|
0b17ada45a
|
feat(update-center): 实现集中式软件更新中心功能
新增更新中心模块,支持管理 APM 和传统 deb 软件更新任务
- 添加更新任务队列管理、状态跟踪和日志记录功能
- 实现更新项忽略配置持久化存储
- 新增更新确认对话框和迁移提示
- 优化主窗口关闭时的任务保护机制
- 添加单元测试覆盖核心逻辑
|
2026-04-09 08:19:51 +08:00 |
|
shenmo7192
|
1618b9a82f
|
fix(install-manager): 修正APM安装成功后的提示信息
更新安装成功提示信息,移除关于启动器展示应用的说明,并明确重启电脑后才能使用全部功能
|
2026-04-05 11:58:22 +08:00 |
|
momen
|
fdb5f4a51c
|
update:apm管理改为应用管理
|
2026-03-31 20:25:44 +08:00 |
|
shenmo7192
|
57410370b7
|
feat(apm): 在安装和更新应用前检查并提示安装APM
添加APM可用性检查逻辑,在安装或更新APM应用时,若检测到APM未安装,则弹出对话框提示用户安装
安装流程完成后显示成功提示并告知需要重启电脑
|
2026-03-30 18:39:03 +08:00 |
|
shenmo7192
|
e7fb8e689a
|
feat(应用详情): 增强应用详情页功能并优化代码格式
重构应用详情页逻辑,支持从首页和深度链接直接打开应用时自动获取完整信息
优化应用卡片来源标识显示,支持同时显示多个来源
统一代码格式,修复多行字符串和模板字符串的换行问题
|
2026-03-29 17:21:17 +08:00 |
|
shenmo7192
|
94f4307783
|
perf(安装日志): 优化安装日志处理性能
添加日志缓冲和批量发送机制以减少IPC通信次数
限制前端日志条目数量防止内存泄漏
|
2026-03-29 16:36:58 +08:00 |
|
shenmo7192
|
2d02e2afee
|
fix(install-manager): 取消安装时删除下载目录
在取消安装任务时,增加删除下载目录的逻辑以避免残留文件
|
2026-03-29 15:23:24 +08:00 |
|
shenmo7192
|
33c48f4543
|
fix(安装管理): 将 ssaudit 命令替换为 ssinstall 并添加版本检查
弃用 ssaudit 命令,统一使用 ssinstall 进行安装
在 shell-caller.sh 中添加对 ssaudit 的禁用检查和 ssinstall 失败时的版本提示
|
2026-03-29 14:24:58 +08:00 |
|
shenmo7192
|
1e6e776afe
|
fix(install-manager): 改进已安装应用列表的解析逻辑
增强对APM包名的解析,支持带或不带section的格式
添加更多调试日志以帮助排查问题
|
2026-03-29 12:48:09 +08:00 |
|
shenmo7192
|
596515e0a4
|
fix(install-manager): 优化已安装应用列表获取逻辑并改进安装成功提示
使用 `apm list --installed` 命令替代直接读取文件系统来获取已安装应用列表,提高可靠性
改进安装成功提示信息,更清晰地说明重启和立即使用的选项
|
2026-03-29 12:43:05 +08:00 |
|
shenmo7192
|
aec1faf964
|
fix(install): 允许添加不同来源的安装相同包名任务
改进任务重复检查逻辑,现在会同时检查软件包名称和来源
修复取消下载时未正确处理任务状态的问题
```
```msg
ci: 添加测试和构建的GitHub Actions配置文件
添加test.yml和build.yml的备份文件,包含单元测试、E2E测试和构建流程
|
2026-03-29 12:23:32 +08:00 |
|
shenmo7192
|
033735d476
|
fix(下载): 优化下载重试逻辑,使用递增超时时间
将固定30秒超时改为递增超时机制(3秒/5秒/15秒)
缩短进度检查间隔至1秒,提高响应速度
|
2026-03-29 12:06:10 +08:00 |
|
momen
|
d638ef7122
|
fix:修复取消下载后无法重试下载的问题,修复重试下载后没有日志输出的问题
|
2026-03-27 11:39:36 +08:00 |
|
momen
|
835572dabd
|
update:重复下载包时删除掉已有包
|
2026-03-27 11:33:57 +08:00 |
|
shenmo7192
|
7ff079276e
|
feat: 添加 APM 应用管理功能并优化界面
- 新增 APM 应用管理功能,支持显示已安装应用及其依赖项
- 优化已安装应用列表界面,增加应用图标和名称显示
- 调整顶部操作栏布局,将设置和关于按钮移至搜索框旁
- 修复类型定义,增加 isDependency 字段和更多应用信息
- 改进暗色模式下的界面显示效果
|
2026-03-24 20:47:55 +08:00 |
|
shenmo7192
|
480a7f3b77
|
update 降低超时时长
|
2026-03-22 19:29:33 +08:00 |
|
shenmo7192
|
c7761e8468
|
fix(下载): 增强aria2c下载的稳定性和重试机制
添加连接超时、下载超时和重试参数配置
实现0%卡死检测和自动重试逻辑
移除冗余的dpkg-query检测代码
优化安装按钮状态判断逻辑
更新版本号至4.9.9alpha4
|
2026-03-22 18:35:41 +08:00 |
|
shenmo7192
|
6729e321a6
|
去除界面优化
|
2026-03-15 17:00:58 +08:00 |
|