feat: 增加认证更新配置与自动检查 (#94)
This commit is contained in:
@@ -84,6 +84,7 @@ Admin 想知道某台 Client 是不是卡死了,用"领取后超时重派"就
|
||||
| 模态对话框 | 弹出来必须先处理它、否则动不了主窗口的窗口。**很打断人,只在必须做决定时用** | 高危确认 |
|
||||
| DPI / 显示缩放 | Windows 里"文字和应用的大小"那个百分比设置 | 需验证 100%~200% |
|
||||
| 高对比度 | Windows 的一种无障碍主题,颜色极简 | 需验证界面不能只靠颜色区分状态 |
|
||||
| Windows 凭据管理器 | Windows 专门保存密码等秘密的系统存储,普通 SQLite 和日志不应代替它 | 保存在线更新密码,界面不回填明文 |
|
||||
|
||||
## 4. 自动化和安全
|
||||
|
||||
|
||||
@@ -134,7 +134,7 @@ Client 应执行:
|
||||
2. **Android 设备:**ADB 地址、拼多多包名、设备测试连接。
|
||||
3. **自动化:**轮询周期、任务超时、最大重试次数和演练模式。
|
||||
4. **安全与诊断:**价格允许偏差、最大购买数量、日志目录、截图/XML 保留周期。
|
||||
5. **软件更新:**当前版本、HTTPS 更新清单地址、检查按钮和稳定状态文字。
|
||||
5. **软件更新:**当前版本、清单地址、账号、密码、保存/检查按钮和稳定状态文字。
|
||||
|
||||
密码和访问令牌不得以明文写入普通 SQLite 设置或日志。
|
||||
|
||||
@@ -214,13 +214,15 @@ CMAutoBuy/ 整个文件夹拷到任何机器都能用
|
||||
`autobuy——manifest.json`。清单至少记录版本、文件名、字节大小和 SHA256;SHA256
|
||||
用于发现下载损坏,不等同于发布者身份认证。
|
||||
|
||||
**在线更新:**操作人员在设置页填写完整 HTTPS 清单地址并主动检查。发现新版本后
|
||||
必须由用户确认下载;下载、校验和安全解压在后台线程完成,只写入
|
||||
**在线更新:**设置页默认显示已确认的发布清单地址和账号,密码由操作人员首次
|
||||
填写并保存到 Windows 凭据管理器;URL 和账号作为非敏感设置保存在 SQLite,密码
|
||||
不回填明文。保存完整配置后,Client 启动时在后台检查一次,也可手动检查。发现
|
||||
新版本后必须由用户确认下载;下载、校验和安全解压在后台线程完成,只写入
|
||||
`data/update/`。程序不会强制退出,用户下次通过 `Launcher.exe` 启动时才替换
|
||||
`app/`。Launcher 保留一份 `app.old/`,目录移动失败或新版本没有写入健康标记时
|
||||
恢复旧版本。更新包必须与清单同源;重定向后仍必须是 HTTPS;不允许忽略 TLS
|
||||
证书错误,也不在更新地址中保存账号密码。
|
||||
更新地址还不得包含查询参数或片段,避免 token 一类凭据被持久化。
|
||||
恢复旧版本。更新包必须与清单同源且重定向不得跨源。一般地址只允许 HTTPS;当前
|
||||
固定发布主机按已确认方案临时允许默认端口 HTTP 和 Basic Authentication。URL
|
||||
不得包含账号密码、查询参数或片段,认证密码不得写入源码、Git、SQLite 或日志。
|
||||
|
||||
`0.1.0` 的 Launcher 没有应用在线更新的能力,因此第一次升级到带在线更新的
|
||||
`0.2.0` 仍需人工替换一次完整程序;从 `0.2.0` 开始才可使用上述流程。当前没有
|
||||
|
||||
@@ -145,8 +145,9 @@ client/
|
||||
- Repository 封装 SQLite,界面和自动化代码不得直接拼接业务 SQL。
|
||||
- PDD Adapter 封装设备连接、页面识别、采集和采购。
|
||||
- ArtifactStore 保存失败截图、无障碍 XML 和结构化诊断文件。
|
||||
- `UpdateService` 只负责 HTTPS 清单、下载校验和安全暂存;正在运行的主程序不替换
|
||||
自身,目录替换与回退只由下一次启动的 `Launcher.exe` 执行。
|
||||
- `UpdateService` 负责认证清单、下载校验和安全暂存;URL/账号由 Repository 保存,
|
||||
密码只从 Windows 凭据管理器短暂读入内存。正在运行的主程序不替换自身,目录
|
||||
替换与回退只由下一次启动的 `Launcher.exe` 执行。
|
||||
|
||||
## 5. 线程模型
|
||||
|
||||
@@ -165,7 +166,7 @@ Qt 主线程
|
||||
└── Outbox 重试,不重复执行 PDD 操作
|
||||
|
||||
更新工作线程
|
||||
├── 检查 HTTPS 清单
|
||||
├── 读取系统凭据并检查认证清单
|
||||
└── 下载、SHA256 校验和安全解压到 data/update/
|
||||
```
|
||||
|
||||
@@ -293,14 +294,15 @@ def _on_finished(self, remote_task_id: str, result) -> None:
|
||||
### 5.3 在线更新启动顺序
|
||||
|
||||
```text
|
||||
主程序:HTTPS 清单 → 用户确认 → 下载并校验 → data/update/app.new + pending.json
|
||||
主程序:系统凭据 → 认证清单 → 用户确认 → 下载并校验 → app.new + pending.json
|
||||
Launcher:确认主程序未运行 → app 改名 app.old → app.new 改名 app → 启动主程序
|
||||
主程序:窗口成功创建 → 写 healthy.json
|
||||
Launcher:健康标记正确则完成;提前退出则恢复 app.old
|
||||
```
|
||||
|
||||
更新 ZIP 只允许 `app/` 内容,拒绝绝对路径、`..`、反斜杠路径和符号链接。Launcher
|
||||
不联网、不处理凭据,也不自更新。
|
||||
不联网、不处理凭据,也不自更新。启动自动检查只在 URL、账号和系统密码都已保存时
|
||||
执行,网络失败只更新设置页状态,不阻止主窗口使用。
|
||||
|
||||
## 6. 任务引擎状态
|
||||
|
||||
|
||||
@@ -299,8 +299,12 @@ class TaskTableModel(QAbstractTableModel):
|
||||
### 软件更新
|
||||
|
||||
- 显示只读的当前版本;
|
||||
- 清单地址使用带可见标签的单行输入框,只允许完整 HTTPS URL;
|
||||
- “检查更新”同时保存已验证的非敏感清单地址;检查和下载期间按钮防重复;
|
||||
- 清单地址、账号和密码分别使用带可见标签的单行输入框,密码框默认隐藏且不回填;
|
||||
- “保存”把 URL/账号写入 SQLite,把密码写入 Windows 凭据管理器;已有密码时留空
|
||||
表示不修改,修改账号时必须重新输入密码;
|
||||
- “检查更新”只使用已经保存的配置;存在未保存修改时先提示保存;检查和下载期间
|
||||
输入框及按钮禁用,防止并行任务和配置竞态;
|
||||
- 已保存完整配置时启动后自动检查一次;没有新版或网络失败不弹模态框;
|
||||
- 状态文字稳定显示未配置、检查中、已是最新、发现新版、下载进度、已准备、失败和
|
||||
恢复建议;
|
||||
- 发现新版本时使用有明确“下载更新 / 暂不下载”的确认框;下载完成不强制重启,
|
||||
@@ -322,6 +326,7 @@ class TaskTableModel(QAbstractTableModel):
|
||||
| 多个订单候选 | 状态改为“需要人工处理”,打开详情决策 |
|
||||
| 普通任务成功 | 更新行和状态区,不弹“成功”对话框 |
|
||||
| 更新检查或下载失败 | 软件更新卡片保留地址并显示原因和重试方式,当前程序不变 |
|
||||
| 更新设置保存成功 | 状态区提示已安全保存,密码输入框清空并显示已保存占位文字 |
|
||||
| 更新下载完成 | 软件更新卡片持续提示“下次启动生效”,不强制关闭程序 |
|
||||
|
||||
### 9.1 错误提示模板(照抄即可)
|
||||
|
||||
@@ -187,8 +187,14 @@ Artifact 写入前应脱敏,数据库只保存引用。保留周期由设置
|
||||
|
||||
### 8.1 在线更新安全
|
||||
|
||||
- 清单和更新包只允许 HTTPS,不提供忽略证书错误的开关;URL 不得包含账号密码、
|
||||
查询参数或片段,避免凭据随地址写入 SQLite 或错误提示。
|
||||
- 一般清单和更新包只允许 HTTPS;按已确认部署方案,只有固定发布主机的默认端口
|
||||
临时允许 HTTP Basic Authentication,任何其他 HTTP 地址仍拒绝。
|
||||
- URL 不得包含账号密码、查询参数或片段。URL 和账号可写 SQLite;密码只能写入
|
||||
Windows 凭据管理器,不得进入源码、Git、SQLite、日志、异常文本、工单或文档。
|
||||
- 不同协议、主机或端口使用不同的系统凭据目标;修改服务器地址后必须为新服务器
|
||||
重新输入密码,不能把旧服务器密码自动发送到新地址。
|
||||
- HTTP Basic Authentication 不能防止同网段监听或中间人攻击;主机白名单只限制
|
||||
Client 误连范围,不能替代 TLS,发布服务器具备条件后应迁移到 HTTPS。
|
||||
- 更新包必须与最终清单 URL 同源,并同时校验清单声明的字节大小和 SHA256。
|
||||
- 清单、压缩包和解压后总大小均有限制;ZIP 只能包含安全的 `app/` 内容,拒绝路径
|
||||
穿越、绝对路径、反斜杠路径和符号链接。
|
||||
|
||||
Reference in New Issue
Block a user