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 分支忽略(正确行为)
This commit is contained in:
xiyidaiwa
2026-08-13 16:42:21 +08:00
parent b5c5ab04b5
commit 0f62a7e36a
17 changed files with 893 additions and 105 deletions
+26
View File
@@ -85,6 +85,32 @@ case "$command_type" in
fi
;;
"force-ssinstall")
# 强制安装被系统锁定(apt-mark hold)的包:在一次已提权的 pkexec 会话内
# 完成「解除锁定 → ssinstall 本地 .deb → 恢复锁定」,避免单独 pkexec apt-mark
# 触发额外权限框(apt-mark 不在 policykit 免密 exec.path 内)。
# 用法:force-ssinstall <pkgname> <deb路径> [ssinstall 额外参数...]
pkg="$2"
deb="$3"
shift 3
# 仅放行单包名(与前端 PKGNAME_PATTERN 一致,双引号防注入)
if [[ -z "$pkg" || -z "$deb" ]]; then
echo "错误:force-ssinstall 缺少包名或 deb 路径参数。"
exit 1
fi
# 安装前解除系统锁定(失败仅警告,不阻断)
apt-mark unhold "$pkg" 2>&1 || echo "警告:解除系统锁定 $pkg 失败,将继续尝试安装"
# 安装本地 .deb(--native 由本分支统一追加)
/usr/bin/ssinstall "$deb" "$@" --native 2>&1
exit_code=$?
# 安装后无论如何恢复系统锁定,保持用户原本的 hold 状态
apt-mark hold "$pkg" 2>&1 || echo "警告:恢复系统锁定 $pkg 失败,请手动检查"
if [[ "$exit_code" != "0" ]]; then
echo "安装失败,可尝试安装对应的 APM 版本应用;若无对应的 APM 版本应用,可提交用户反馈"
fi
exit $exit_code
;;
"aptss")
# 针对 aptss 的特殊逻辑:如果是 remove 子命令,需要图形化确认
if [[ "$2" == "remove" ]]; then