diff --git a/docs/task/94-client认证更新配置与自动检查.md b/docs/task/94-client认证更新配置与自动检查.md new file mode 100644 index 0000000..9e99eca --- /dev/null +++ b/docs/task/94-client认证更新配置与自动检查.md @@ -0,0 +1,79 @@ +# 94 Client:增加认证更新配置与启动自动检查 + +- 类型:需求 +- 父级大工单:#1 +- 所属 MVP / 版本:MVP 后续 / 在线更新 +- 状态:已完成 +- 日期:2026-08-10 +- Gitea 工单:http://ilaer.eicp.net:8418/chengma/cmautobuy/issues/94 + +## 背景与目标 + +#93 已支持在线更新,但发布服务器需要 Basic Authentication。此任务增加更新配置 +保存和启动自动检查,同时保证密码不进入源码、Git、SQLite、日志、工单和文档。 + +## 最终方案 + +- 设置页保留清单 URL、账号、密码三个输入框,增加“保存”按钮。 +- URL 和账号保存到现有非敏感 SQLite 设置;密码只保存到 Windows 凭据管理器。 +- 密码框使用隐藏模式,已有密码不回填明文;留空保存表示不修改已有密码,修改账号 + 或服务器后必须重新输入密码。 +- Windows 凭据按照协议、主机和端口隔离,避免把旧服务器密码误发到新服务器。 +- 已保存完整配置时,Client 启动后通过 Qt Worker 自动检查一次;最新版或网络失败 + 不弹窗,只有发现新版时请求用户确认下载。 +- 清单和更新包都在内存中添加 Basic Authentication。固定发布主机临时允许默认端口 + HTTP,其他 HTTP 地址、URL 凭据、查询参数、片段和跨源重定向仍被拒绝。 +- 保留 #93 的大小、SHA256、版本、安全解压、下次启动替换和失败回退流程。 +- Client 版本升级为 `0.2.1`。 + +实现过程中增加了按 URL 源隔离系统凭据的保护。这比建单时的单一固定凭据目标更 +安全,不改变用户确认的界面和使用流程。 + +## 改了哪些 + +- `client/src/windows_credential_store.py`:Windows Credential API 小型封装。 +- `client/src/update_service.py`:Basic Authentication、固定 HTTP 主机白名单、 + Unicode URL 路径编码和跨源重定向保护。 +- `client/src/update_ui_event.py`:显式保存、系统凭据读取、启动检查和线程生命周期。 +- `client/src/settings_ui.py`、`settings_ui_event.py`:账号、密码、保存按钮和事件装配。 +- `client/src/version.py`:版本更新为 `0.2.1`。 +- `client/test/test_update_service.py`、`test_update_ui_event.py`、 + `test_windows_credential_store.py`:认证、安全边界、表单和自动检查测试。 +- `docs/client/`:同步术语、需求、架构、界面与安全基线。 + +## 验收结果 + +| 验收标准 | 结果 | +|---|---| +| 设置页显示 URL、账号、隐藏密码、保存和检查控件 | 通过 | +| URL/账号重启恢复,密码不进入 SQLite 和源码 | 通过 | +| 密码使用 Windows 凭据管理器,留空不会覆盖已有密码 | 通过 | +| 未保存密码和未保存修改具有明确提示 | 通过 | +| 清单与 ZIP 都携带认证且错误信息不泄露密码 | 通过 | +| HTTP 只允许固定主机,跨源重定向被拒绝 | 通过 | +| 已保存配置在启动后异步检查且不阻塞界面 | 通过 | +| 发现新版后复用 #93 的下载和更新流程 | 通过 | +| 真实下单开关、Admin 接口和采购流程未改变 | 通过 | +| 自动测试、凭据往返和打包验证通过 | 通过 | + +## 测试 + +- 执行的命令: + - 在 `client/` 执行 + `C:/Python310/python.exe -m pytest test -q --disable-warnings` + - 使用虚构测试凭据调用 Windows 凭据管理器写入、读取和删除 + - 在 `client/` 执行 `.\build_client.bat` + - 离屏启动 `client/release/CMAutoBuy-0.2.1/Launcher.exe` +- 结果:264 项测试通过;系统凭据往返通过且测试凭据已删除;0.2.1 发布产物生成 + 成功;打包程序启动成功。 +- **没验证到的部分**:未使用真实发布密码访问线上清单和 ZIP;尚未在全新且未安装 + Python 的 Windows 机器上验证凭据保存和完整在线更新。 + +## 遗留问题 + +- 当前固定发布服务器使用 HTTP Basic Authentication,不能抵抗链路监听和中间人 + 攻击;条件允许时应迁移到 HTTPS。 + +## 相关提交 + +- `dc375ff` feat: 增加认证更新配置与自动检查 (#94)