Skip to content

fix: 加固 Web UI 自更新重启路径#552

Open
hanzckernel wants to merge 1 commit intoEKKOLearnAI:mainfrom
hanzckernel:fix/update-button-click
Open

fix: 加固 Web UI 自更新重启路径#552
hanzckernel wants to merge 1 commit intoEKKOLearnAI:mainfrom
hanzckernel:fix/update-button-click

Conversation

@hanzckernel
Copy link
Copy Markdown
Collaborator

这次改了什么

  • Web UI 的 /api/update 自更新不再直接执行 npm/npm.cmd 或全局 hermes-web-ui shim。
  • 服务端改为用当前运行进程的 process.execPath 执行同一 Node 安装下的 npm-cli.js,并用同一个 Node 启动全局包里的 bin/hermes-web-ui.mjs 重启。
  • 找不到当前 Node 安装自带的 npm CLI 时失败关闭,不再回退到环境里的 PATH npm
  • 前端 doUpdate() 捕获更新请求 rejection,返回 false 并恢复 updating 状态,避免点击后 promise 直接冒泡导致按钮状态/反馈不可靠。

根因证据

复现到一个关键路径问题:即使执行的是当前 Node 目录下的绝对 npm 文件,它的 shebang 仍然可能是 #!/usr/bin/env node,会重新从环境 PATH 解析 node

本地验证:把假的 node 放到 PATH 最前面后执行绝对 npm:

absolute_npm=/Users/hanzhicheng/.nvm/versions/node/v24.15.0/bin/npm
exit_code=42
stdout=FAKE_NODE_INVOKED:/tmp/hermes-webui-fake-node.../node:/Users/hanzhicheng/.nvm/versions/node/v24.15.0/bin/npm --version

改为 process.execPath npm-cli.js ... 后,同样的污染 PATH 不会触发假 node,npm prefix -g 正常返回当前 Node 前缀。

相关问题 / 重复排查

验证

  • npm test -- --run tests/server/update-controller.test.ts tests/client/app-store.test.ts — 通过,2 个测试文件 / 6 个测试
  • npm run build — 通过
  • npm test — 通过,63 个测试文件,396 passed / 2 skipped
  • git diff --check — 通过
  • added-line secret / shell / eval scan — 无发现
  • 独立代码审查子代理 — 无 blocker / major issue

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

1 participant