Client:增加认证更新配置与启动自动检查 #94

Closed
opened 2026-08-10 14:16:40 +08:00 by ila · 5 comments
Owner

基本信息

  • 类型:需求
  • 父级大工单:#1
  • 所属 MVP / 版本:MVP 后续 / 在线更新
  • 阶段:发布与升级
  • 依赖:#93

要解决什么

#93 已支持用户手动填写 HTTPS 清单地址并检查更新。实际发布服务器使用受 Basic Authentication 保护的固定清单,需要在不把密码写入源码、Git、SQLite、日志、工单和文档的前提下,保存更新配置、自动比较线上版本,并复用 #93 的下载和下次启动更新流程。

做什么 / 不做什么

  • 做:
    • 软件更新区域保留清单 URL、账号、密码三个输入框,增加“保存”按钮。
    • URL 默认指向已确认的发布清单,账号显示已确认的默认账号名;密码默认留空并使用密码框。
    • URL 和账号保存到现有 SQLite 设置;密码只保存到 Windows 凭据管理器。
    • 已有密码不回填明文,使用“已安全保存;留空不修改”的提示。
    • 检查和下载时从 Windows 凭据管理器读取密码并发送 Basic Authentication。
    • 仅对已确认的固定发布主机允许 HTTP;其他更新地址继续只允许 HTTPS。
    • 已保存完整配置时,Client 启动后通过 Qt 后台 Worker 自动检查一次;仅线上版本更高时提示下载。
    • 保留手动“检查更新”,网络失败只显示稳定状态,不影响 Client 启动。
  • 不做:
    • 不把密码写入源码、Git、SQLite、日志、异常文本、Gitea 或本地任务文档。
    • 不在 URL 查询参数或 URL 用户信息中携带凭据。
    • 不改变 #93 的 SHA256、大小、同源、安全解压、下次启动替换和失败回退流程。
    • 不改变 Admin 业务接口、采购流程、数据库结构和真实下单开关。

怎么做

  • 新增 Windows 凭据管理器的小型封装,使用系统 Credential API 保存、读取和删除通用凭据,不引入第三方依赖。
  • 扩展 settings_ui.py 和 update_ui_event.py,加入账号、密码、保存状态、显式保存及启动自动检查。
  • 扩展 update_service.py,支持内存中的 Basic Authentication;认证头不得进入返回对象、日志和错误信息。
  • HTTP 例外严格限定为固定发布主机和默认端口;重定向不得跨源,更新包仍与最终清单同源。
  • 增加凭据封装边界、表单保存/载入、自动检查、认证请求和 HTTP 主机白名单测试。
  • 同步 Client 需求、架构、界面和安全基线,不记录真实密码。

验收标准

  • 软件������区域显示 URL、账号、密码和保存、检查按钮,标签、Tab 顺序和密码隐藏正确。
  • URL 和账号可保存并在重启后恢复;密码不进入 SQLite、源码、Git、日志和错误文本。
  • 密码由 Windows 凭据管理器保存;已有密码不回填明文,留空保存不会覆盖。
  • 未保存密码时保存或检查给出明确提示并聚焦密码框。
  • 检查清单和下载更新包均携带 Basic Authentication,认证失败可重试且不泄露密码。
  • HTTP 仅允许固定发布主机;其他 HTTP、URL 凭据、查询参数、片段和跨源重定向仍被拒绝。
  • 已保存完整配置时启动后异步检查一次;最新版、失败和发现新版状态明确,不阻塞主线程。
  • 线上版本更高时复用 #93 的确认、下载、校验、暂存和下次启动更新流程。
  • 真实下单默认关闭,Admin 接口和采购流程未改变。
  • 自动测试和打包验证通过;未使用真实密码的自动化测试和未验证的真实服务器行为明确记录。

怎么验证

从 client/ 执行:

C:/Python310/python.exe -m py_compile src/windows_credential_store.py src/update_service.py src/update_ui_event.py
$env:QT_QPA_PLATFORM="offscreen"
C:/Python310/python.exe -m pytest test -q --disable-warnings
Remove-Item Env:QT_QPA_PLATFORM
.\build_client.bat

自动测试使用虚构账号密码和 Fake 凭据存储,不接触开发机真实凭据。最终由用户在设置页输入发布服务器密码并保存,再人工验证真实清单检查、下载和重启更新。

风险和回退

  • 固定服务器当前使用 HTTP Basic Authentication,网络链路可看到凭据和内容;本实现严格限制主机但不能替代 HTTPS,后续应给发布服务器配置有效 TLS。
  • Windows 凭据管理器不可用时保留 URL 和账号输入,不保存密码,并显示可操作错误。
  • 可回退本工单提交,恢复 #93 的手动 HTTPS 清单检查;已写入的系统凭据应通过软件设置或 Windows 凭据管理器删除。
## 基本信息 - 类型:需求 - 父级大工单:#1 - 所属 MVP / 版本:MVP 后续 / 在线更新 - 阶段:发布与升级 - 依赖:#93 ## 要解决什么 #93 已支持用户手动填写 HTTPS 清单地址并检查更新。实际发布服务器使用受 Basic Authentication 保护的固定清单,需要在不把密码写入源码、Git、SQLite、日志、工单和文档的前提下,保存更新配置、自动比较线上版本,并复用 #93 的下载和下次启动更新流程。 ## 做什么 / 不做什么 - 做: - 软件更新区域保留清单 URL、账号、密码三个输入框,增加“保存”按钮。 - URL 默认指向已确认的发布清单,账号显示已确认的默认账号名;密码默认留空并使用密码框。 - URL 和账号保存到现有 SQLite 设置;密码只保存到 Windows 凭据管理器。 - 已有密码不回填明文,使用“已安全保存;留空不修改”的提示。 - 检查和下载时从 Windows 凭据管理器读取密码并发送 Basic Authentication。 - 仅对已确认的固定发布主机允许 HTTP;其他更新地址继续只允许 HTTPS。 - 已保存完整配置时,Client 启动后通过 Qt 后台 Worker 自动检查一次;仅线上版本更高时提示下载。 - 保留手动“检查更新”,网络失败只显示稳定状态,不影响 Client 启动。 - 不做: - 不把密码写入源码、Git、SQLite、日志、异常文本、Gitea 或本地任务文档。 - 不在 URL 查询参数或 URL 用户信息中携带凭据。 - 不改变 #93 的 SHA256、大小、同源、安全解压、下次启动替换和失败回退流程。 - 不改变 Admin 业务接口、采购流程、数据库结构和真实下单开关。 ## 怎么做 - 新增 Windows 凭据管理器的小型封装,使用系统 Credential API 保存、读取和删除通用凭据,不引入第三方依赖。 - 扩展 `settings_ui.py` 和 `update_ui_event.py`,加入账号、密码、保存状态、显式保存及启动自动检查。 - 扩展 `update_service.py`,支持内存中的 Basic Authentication;认证头不得进入返回对象、日志和错误信息。 - HTTP 例外严格限定为固定发布主机和默认端口;重定向不得跨源,更新包仍与最终清单同源。 - 增加凭据封装边界、表单保存/载入、自动检查、认证请求和 HTTP 主机白名单测试。 - 同步 Client 需求、架构、界面和安全基线,不记录真实密码。 ## 验收标准 - [x] 软件������区域显示 URL、账号、密码和保存、检查按钮,标签、Tab 顺序和密码隐藏正确。 - [x] URL 和账号可保存并在重启后恢复;密码不进入 SQLite、源码、Git、日志和错误文本。 - [x] 密码由 Windows 凭据管理器保存;已有密码不回填明文,留空保存不会覆盖。 - [x] 未保存密码时保存或检查给出明确提示并聚焦密码框。 - [x] 检查清单和下载更新包均携带 Basic Authentication,认证失败可重试且不泄露密码。 - [x] HTTP 仅允许固定发布主机;其他 HTTP、URL 凭据、查询参数、片段和跨源重定向仍被拒绝。 - [x] 已保存完整配置时启动后异步检查一次;最新版、失败和发现新版状态明确,不阻塞主线程。 - [x] 线上版本更高时复用 #93 的确认、下载、校验、暂存和下次启动更新流程。 - [x] 真实下单默认关闭,Admin 接口和采购流程未改变。 - [x] 自动测试和打包验证通过;未使用真实密码的自动化测试和未验证的真实服务器行为明确记录。 ## 怎么验证 从 `client/` 执行: ```powershell C:/Python310/python.exe -m py_compile src/windows_credential_store.py src/update_service.py src/update_ui_event.py $env:QT_QPA_PLATFORM="offscreen" C:/Python310/python.exe -m pytest test -q --disable-warnings Remove-Item Env:QT_QPA_PLATFORM .\build_client.bat ``` 自动测试使用虚构账号密码和 Fake 凭据存储,不接触开发机真实凭据。最终由用户在设置页输入发布服务器密码并保存,再人工验证真实清单检查、下载和重启更新。 ## 风险和回退 - 固定服务器当前使用 HTTP Basic Authentication,网络链路可看到凭据和内容;本实现严格限制主机但不能替代 HTTPS,后续应给发布服务器配置有效 TLS。 - Windows 凭据管理器不可用时保留 URL 和账号输入,不保存密码,并显示可操作错误。 - 可回退本工单提交,恢复 #93 的手动 HTTPS 清单检查;已写入的系统凭据应通过软件设置或 Windows 凭据管理器删除。
Author
Owner

实施记录(待用户验收)

  • 实现提交:dc375ff feat: 增加认证更新配置与自动检查 (#94)
  • Client 版本:0.2.1。
  • 设置页增加 URL、账号、密码、保存和检查控件;密码框隐藏且不回填明文。
  • URL/账号写入现有非敏感设置,密码使用 Windows Credential API 写入系统凭据管理器。
  • 凭据按协议、主机和端口隔离;更换服务器不会自动复用旧服务器密码。
  • 已保存完整配置时启动后自动检查一次;仅发现新版时弹出下载确认。
  • 更新清单与 ZIP 都携带内存中的 Basic Authentication,认证头不会进入状态、日志或返回对象。
  • HTTP 例外只允许固定发布主机默认端口;其他 HTTP、URL 凭据、查询参数、片段和跨源重定向继续拒绝。

验证结果

  • C:/Python310/python.exe -m pytest test -q --disable-warnings:264 passed。
  • Windows 凭据管理器使用虚构测试凭据完成写入、读取和删除往返,测试凭据已删除。
  • .\build_client.bat:成功生成 0.2.1 发布目录、便携 ZIP、更新 ZIP和 autobuy——manifest.json。
  • 打包后 Launcher.exe 离屏启动成功,版本文件为 0.2.1。
  • 更新 ZIP SHA256:3c7c5908e141a26f41fff79e0b28f271179fc82b92779a1c2aef4c4654c1ae64。

未验证

  • 未使用真实发布密码访问线上清单和 ZIP;需由用户在设置页输入并保存后人工验证。
  • 尚未在全新且未安装 Python 的 Windows 机器上验证凭据保存和完整更新。
## 实施记录(待用户验收) - 实现提交:`dc375ff feat: 增加认证更新配置与自动检查 (#94)` - Client 版本:`0.2.1`。 - 设置页增加 URL、账号、密码、保存和检查控件;密码框隐藏且不回填明文。 - URL/账号写入现有非敏感设置,密码使用 Windows Credential API 写入系统凭据管理器。 - 凭据按协议、主机和端口隔离;更换服务器不会自动复用旧服务器密码。 - 已保存完整配置时启动后自动检查一次;仅发现新版时弹出下载确认。 - 更新清单与 ZIP 都携带内存中的 Basic Authentication,认证头不会进入状态、日志或返回对象。 - HTTP 例外只允许固定发布主机默认端口;其他 HTTP、URL 凭据、查询参数、片段和跨源重定向继续拒绝。 ### 验证结果 - `C:/Python310/python.exe -m pytest test -q --disable-warnings`:264 passed。 - Windows 凭据管理器使用虚构测试凭据完成写入、读取和删除往返,测试凭据已删除。 - `.\build_client.bat`:成功生成 0.2.1 发布目录、便携 ZIP、更新 ZIP和 `autobuy——manifest.json`。 - 打包后 `Launcher.exe` 离屏启动成功,版本文件为 0.2.1。 - 更新 ZIP SHA256:`3c7c5908e141a26f41fff79e0b28f271179fc82b92779a1c2aef4c4654c1ae64`。 ### 未验证 - 未使用真实发布密码访问线上清单和 ZIP;需由用户在设置页输入并保存后人工验证。 - 尚未在全新且未安装 Python 的 Windows 机器上验证凭据保存和完整更新。
Author
Owner

本地归档

  • 归档文档:docs/task/94-client认证更新配置与自动检查.md
  • 归档提交:6fd2598 docs: 归档任务 #94
  • 当前状态:实现与开发验证完成,等待用户输入真实发布密码进行验收;验收通过后关闭 #94 并更新父工单 #1。
## 本地归档 - 归档文档:`docs/task/94-client认证更新配置与自动检查.md` - 归档提交:`6fd2598 docs: 归档任务 #94` - 当前状态:实现与开发验证完成,等待用户输入真实发布密码进行验收;验收通过后关闭 #94 并更新父工单 #1。
Author
Owner

#116 将调整软件更新卡片的位置和单行字段布局,并增加“首次安全初始化更新凭据”的需求。#94 的密码不回填、只存 Windows 凭据管理器、不得进入源码/Git/SQLite/日志/工单/文档等边界继续有效;安全注入入口确认前不实施密码初始化。

#116 将调整软件更新卡片的位置和单行字段布局,并增加“首次安全初始化更新凭据”的需求。#94 的密码不回填、只存 Windows 凭据管理器、不得进入源码/Git/SQLite/日志/工单/文档等边界继续有效;安全注入入口确认前不实施密码初始化。
Author
Owner

范围变更:用户已明确修改项目红线。#116 实施后,Client 软件更新公开默认密码固定为 chengma,以单一源码常量随 Git 管理;仅在 Windows 凭据管理器没有已保存凭据时填入隐藏回显的密码框。该固定值是唯一例外,其他凭据保护规则继续有效。

范围变更:用户已明确修改项目红线。#116 实施后,Client 软件更新公开默认密码固定为 `chengma`,以单一源码常量随 Git 管理;仅在 Windows 凭据管理器没有已保存凭据时填入隐藏回显的密码框。该固定值是唯一例外,其他凭据保护规则继续有效。
Author
Owner

用户已于 2026-08-11 明确验收通过。

  • 本地归档状态已更新为“已完成,用户验收通过”
  • 验收记录提交:eca9289
  • 本工单按项目流程关闭
用户已于 2026-08-11 明确验收通过。 - 本地归档状态已更新为“已完成,用户验收通过” - 验收记录提交:`eca9289` - 本工单按项目流程关闭
ila closed this issue 2026-08-11 10:58:22 +08:00
Sign in to join this conversation.
No labels
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: chengma/cmautobuy#94