4.0 KiB
4.0 KiB
94 Client:增加认证更新配置与启动自动检查
- 类型:需求
- 父级大工单:#1
- 所属 MVP / 版本:MVP 后续 / 在线更新
- 状态:已完成
- 日期:2026-08-10
- Gitea 工单:#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。
相关提交
dc375fffeat: 增加认证更新配置与自动检查 (#94)