记录云端全项目测试结果与尚未通过的验收边界
Some checks are pending
Security Checks / security (push) Waiting to run

This commit is contained in:
smail 2026-09-20 03:27:16 +08:00
parent 1d7e109d9f
commit bd585efacd
2 changed files with 145 additions and 2 deletions

View File

@ -0,0 +1,139 @@
# 云端全项目测试报告
测试日期:2026-09-20,时区 Asia/Shanghai。工作区:`D:\Desktop\Smail`。服务器:`47.108.78.12`,页面:`https://web.solit.cn/`。
## 结论与任务状态
已完成全项目自动化测试、发现问题的修复、Linux 构建和云端部署,并完成核心账号安全及邮件协议实机验证。当前没有未解决的自动化测试失败,但仍有真实外部邮箱收件、客户端网络路径和无人值守续期等未通过项,不能据此宣布整个项目最终验收通过。
- [✓] 已按授权备份、清理 Smail 相关环境,重新初始化测试数据库。接续测试复用本轮数据库,没有重复清库。
- [✓] 修复测试发现的问题,相关包完成复测;最新程序已部署,云端和本地摘要一致。
- [✓] 三类账号登录、TOTP 选择、提醒行为、邮件验证码跨场景消费、密码重置和客户端凭据撤销完成相应实机验证。
- [✓] 项目部署包只包含三个程序与四个运行目录,没有加入 Python、部署或续期脚本。
- [✓] 本轮临时 TOTP、外部邮箱绑定均已停用,账号密码保持用户指定值。
- [!] 三个指定的 163 邮箱尚未完成真实收件和绑定验证。
- [!] 当前客户端到公网邮件端口的连接路径未通过,不能声称外网邮件客户端收发通过。
- [!] DNS 无人值守续期及 Nginx 换证同步未通过。
- [!] Windows 提权 Named Pipe、依赖外部服务的插件业务等不在本轮 Linux 实机通过范围内。
## 本轮修复
| 提交 | 问题与结果 |
| --- | --- |
| `c82be24` | 修复全量测试的密码容量竞态,更新与现有行为不一致的审查夹具及前端说明。 |
| `b062ca6` | 项目 DNS 签发同时覆盖主域名及泛域名,保留两条同名 TXT 挑战。 |
| `65e61a3` | 修复真实数据库迁移中对文本主键错误处理序列的问题,校正日志测试。 |
| `b515186` | 公网地址探测支持失败回退,限制并发请求的总等待时间。 |
| `7aec99d` | 密码重置同步撤销旧客户端授权码,补充事务回滚及用户隔离回归。 |
| `e0baf27` | 未认证 POP3 的 QUIT 立即回复并关闭连接,不提交邮箱更新。 |
| `310ad01` | 停用的外部邮箱允许所属用户重新绑定、切换用途;清除旧验证状态并要求重新验证。停用同时失效绑定和变更挑战,保留跨用户隔离及主要邮箱数量限制。 |
每轮代码修改前均保存中文 Git 基线并推送。一次文档基线推送出现认证失败,重试后成功。没有使用宽泛暂存或提交测试凭据。
## 自动化测试证据
云端原始日志根目录:`/var/tmp/smail-cloud-tests-20260920/`。
| 范围 | 结果 | 证据 |
| --- | --- | --- |
| Linux 后端 | 66 个包的最新有效结果无失败,1953 个 PASS 标记、0 个 FAIL 标记、5 个 SKIP 标记 | `latest-summary.json`、`latest-packages.json` |
| 前端 | 198 项通过,0 失败、0 跳过 | 本地 `test-log/run-2026-09-19T17-30-34-658Z-19808/frontend.log` |
| Windows 构建互斥与测试入口 | 4 项通过;Linux 专用项在 Windows 跳过 | 本地 `test-log/run-2026-09-19T16-13-15-667Z-3920/deployment.log` |
| Linux 资源策略 | 15 项通过 | 云端 `resource-policy.log` |
| 实际服务资源只读预检 | 通过,无失败项;不替代业务验收 | 云端 `final-resource-check.json` |
| 最后一次修改的本地受影响包 | externalemail、controllers、recovery、verification 均通过 | 本地 `test-log/run-2026-09-19T19-10-20-850Z-26796/backend.log` |
| 最后一次修改的 Linux 复测 | externalemail、controllers 均 EXIT=0 | 云端 `rebind/externalemail.log`、`rebind/controllers.log` |
后端统计由首轮全量测试与受影响包的最新复测合并,**不是同一最新版一次执行的全量结果**。PASS 标记包含父测试和子测试,不能表述为 1953 个独立案例。首轮发现的 adminreset、dbmigration、logstore 等失败已用后续有效复测替换;具体映射保存在 `latest-packages.json`。
五个后端跳过项:
1. `TestProductionPluginIsolationPolicy`:Windows 专用。
2. `TestSecuritySetupBrowserFixture`:需要显式启用的长期浏览器夹具。
3. `TestSystemdResultPrompt`:需要隔离的 systemd 人工交互。
4. `TestSystemdCancelledInputResult`:同上。
5. `TestMaster`:旧集成入口,需显式启用,不能直接指向运行库。
本轮另行完成真实 smail-admin 启动、安全验证、成功提示及 stop 取消操作;自动化跳过项仍按跳过记录。Windows 未提权环境未完成 Named Pipe 验收,不列为通过。
## 云端业务验证
### 账号与登录
- `xuans` 为超级管理员,`testadmin` 为管理员,`testuser` 为普通用户。最终均保留用户指定密码;本文不记录密码、验证码、恢复令牌或 TOTP 密钥。
- 未配置安全验证的超级管理员登录后,页面强制要求至少启用一种方式。最终浏览器重新加载后可见该中文弹窗,没有跳过保护。
- 普通用户点击“我知道了”后可继续,注销并重新登录会再次提醒未完成的安全设置。
- 三类账号均具备用户可选的 TOTP 功能。普通用户实测绑定、登录和停用;密码阶段约 473 毫秒、TOTP 验证约 83 毫秒。其他两类账号本轮早期测试完成后也已停用测试 TOTP。
- 登录密码正确后,有主要外部邮箱的账号返回验证选择,`delivery_status=idle`,没有自动发邮件;只有主动发送才进入 `sending`。
### 邮件验证码与公开密码恢复
使用普通测试用户的真实站内收件箱临时验证管理员,邮件经项目正常投递与邮件 API 读取,没有改数据库伪造验证结果。此闭环证明应用链路,不替代 163 外部收件验收。
| 步骤 | 最后一次实测耗时 | 结果 |
| --- | ---: | --- |
| 停用邮箱重新绑定为主要邮箱 | 3190 毫秒 | 成功,仍须邮件验证 |
| 确认重新绑定 | 84 毫秒 | 成功 |
| 管理员密码阶段 | 341 毫秒 | 返回 email 选择,邮件 idle |
| 主动发送登录验证码 | 71 毫秒 | 返回 sending,后台完成真实投递 |
| 邮件码完成登录 | 103 毫秒 | 成功 |
| 立即发起公开恢复 | 143 毫秒 | 识别管理员及 email 方式 |
| 紧接着发送恢复邮件 | 2628 毫秒 | 成功,没有被登录验证码冷却阻塞 |
| 邮件码验证恢复身份 | 74 毫秒 | 发放一次性重置凭证 |
| 设置密码 | 307 毫秒 | 重置成功 |
| 重置后密码登录 | 365 毫秒 | 成功进入验证选择 |
| 再次主动发送登录码 | 89 毫秒 | 成功 |
以上为当次单请求观测,不是负载压测或全网延迟保证。公开恢复请求未携带登录 Cookie 或 CSRF 头。测试完成后通过正式接口停用临时邮箱;管理员再次直接登录约 430 毫秒,超级管理员约 307 毫秒。
### 邮件协议与重置撤销
- 服务器本机经域名校验的 TLS 完成 SMTP 投递、IMAP 查询读取和 POP3 收取,数据库收件归属核对正常。证据:`protocol-acceptance.json`。
- 真实密码重置后,旧客户端授权码在 SMTP、IMAP、POP3 均被拒绝。证据:`revoke/live-revocation.json`。
- 未认证、输入 USER 后及错误密码后的 POP3 QUIT 均立即回应并关闭连接;相关包回归通过。证据:`revoke/live-pop3-quit.json`。
- 超级管理员登录页恢复通道保持拒绝;本机重置使用受保护 Unix Domain Socket。最终 `/run/smail/admin-control.sock` 权限为 `0600`,所属用户/组为 `smail`,未增加公网重置 TCP 监听。
- smail-admin 仅显式 start 进入交互,stop 取消;restart、reload 及变体不能开启新的重置交互。systemd 的 restart 仍可能先停止原交互,这一系统行为边界详见《管理员重置命令限制验收》。
## 证书与网络限制
真实证书签发者为 Let's Encrypt YR1,SAN 为 `solit.cn` 和 `*.solit.cn`,有效期从 2026-09-19 16:44:26 UTC 至 2026-12-18 16:44:25 UTC。服务器通过回环和公网地址连接 443、465、993、995,使用实际域名 SNI、系统 CA 进行校验,均通过 TLS 1.3。浏览器 HTTPS 页面可访问。
本机系统 DNS 将三个邮件子域名解析到 `198.18.2.x`;本机 Python 不论域名连接还是强制公网 IP,连 443 也发生 TLS EOF。现有证据只能说明客户端网络路径未通过,不能归因为云端证书错误,也不能声称公网邮件客户端收发正常。本轮没有修改本机网络设置。
Google 公共 DNS 已查到 DKIM;对 1.1.1.1 的 UDP 查询超时,未计为通过。本轮 ACME TXT 清理仅针对新建的两个记录 ID,核对剩余为零,既有记录保留。
项目托管启用内置续期检查,手动及代理托管不触发 ACME,策略测试已通过。但 DNS 挑战当前仍依赖人工 TXT,Nginx 配置也固定引用具体证书文件,没有自动同步换证引用和重载。**无人值守续期仍未完成**。服务器没有启用 Smail、Certbot 或 ACME 外部续期 timer,本轮没有新增外部部署或续期脚本。
指定的三个 163 地址尚未完成真实收件及绑定验证,本轮没有向这些外部收件箱发送测试邮件。后续需由各邮箱持有人接收真实验证码,再通过正式绑定流程完成验证。
## 最新交付与运行状态
源码提交:`310ad0136e9794ccb67e2c92aec05e8c66f151ad`。运行版本:`test-25fa5dcf9844`。后续仅文档提交,不改变部署程序。
发布包:`out/release/Smail_linux_amd64.tar.gz`。文件结构:
```text
smail/
├── smail
├── smail-admin
├── smail-config
├── config/
├── data/
├── log/
└── ssl/
```
| 文件 | SHA-256 |
| --- | --- |
| 发布包 | `998a4a13514d0d2b5ef4a2708e1f27790b673af03fa390aa4f527e4f2e4da858` |
| smail | `ca525d4fe98973fea2cfb496b37b714fb3aad27999bf73f674bfa27f1358c98e` |
| smail-admin | `4af8a7c872d75fa48a967377e404815b0f4f7346c8c209cebb880ecb6039966f` |
| smail-config | `95372303efd7b16e54c21bc6190f13da7cbcd05faeeeaab12386ece555484bb4` |
本地构建收据:`out/release-receipts/Smail_linux_amd64.json`。三个云端文件均与收据一致。前端和内置插件构建完成;编辑器分块大于 500 KB 的既有构建提示仍存在,没有构建失败。
03:15:29 完成最后一次人工安装和启动。Smail PID 为 `712357`,自动重启次数为 0,Nginx active。HTTPS 返回 200,系统证书验证结果为 0,观测约 60 毫秒。最终两个数据库 `integrity_check` 均为 `ok`;启用的 TOTP 数量为 0,未停用的外部邮箱绑定数量为 0。最后一次启动后的 systemd warning 级日志查询无记录。
最后一次部署前备份:`/var/backups/smail-full-test-20260920/pre-rebind/`,含三个旧程序及配置、数据、证书归档。测试日志和测试二进制保留在 `/var/tmp/smail-cloud-tests-20260920/`,不属于运行依赖;没有擅自删除这些验收证据。FDM、Scert、Nginx、MySQL 和 PostgreSQL 的其他业务未因最后一次 Smail 更新而停启。
公网恢复入口已通过正式配置流程设置 `http.publicHttpsPort=443`;`/public-password-recovery` 跳转到 `https://web.solit.cn/rest/`,不再暴露内部 8002 端口,恢复页面返回 200。

View File

@ -16,6 +16,10 @@ Web 地址允许使用主域名或一级子域名;多级子域名、其他主
- [x] 根域名与一级子域名可用,多级及无关域名拒绝。
- [x] 两条同名 TXT 独立保留与清理。
- [x] 真实 X.509 校验识别完整覆盖、缺少根域名、缺少泛域名。
- [ ] 云服务器真实 CA 签发及可信 TLS 验收。
- [✓] 云服务器真实 CA 签发及可信 TLS 验收。
本地回归通过不代表真实签发已完成;云端结果需另行记录。
2026-09-20 已在云服务器完成 Let's Encrypt YR1 签发,SAN 包含 `solit.cn` 与 `*.solit.cn`,有效期为 2026-09-19 16:44:26 UTC 至 2026-12-18 16:44:25 UTC。服务器通过回环地址和公网地址连接 443、465、993、995,使用对应域名校验系统信任链,均通过 TLS 1.3 验证;实际浏览器也可访问 HTTPS 页面。
签发完成后仅删除本轮创建的两条 ACME TXT,其他 DNS 记录保留。当前客户端邮件端口网络路径仍未通过,不能将服务器侧验证等同于公网客户端收发验收。
DNS 挑战仍需人工设置 TXT;Nginx 当前引用具体版本的证书文件,项目换证后也没有自动同步引用和重载。因此真实签发已通过,无人值守续期闭环尚未通过。详见《云端全项目测试报告》。