Smail/docs/清库部署测试记录.md
smail 77501df123
Some checks are pending
Security Checks / security (push) Waiting to run
补记通知撤销审计与普通用户独立会话失效验收
2026-10-02 20:05:29 +08:00

334 lines
47 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 清库部署测试记录
本文保留分日期的测试记录。不同环境、版本和日期的结果不可相互替代;最新云端续验见文末。
## 范围与状态
日期:2026 年 9 月 16 日。仅测试本机 `D:\Desktop\Smail\yunx-test`,使用正式构建包和嵌入前端,未启用开发模式或停用本机恢复通道。
- [✓] 备份三份 SQLite 数据库和配置,校验备份后清空数据库对象,保留数据库文件。
- [✓] 完整构建、部署及部署指纹校验通过。
- [x] 首轮通过浏览器完成数据库、超级管理员、域名、DNS 展示和手动证书初始化;正式业务服务未就绪。
- [✓] 修复安装根地址认证探测失败,隔离浏览器直接访问根地址后自动进入中文安装向导。
- [✓] 修复 HTTP、HTTPS 全局实例在停止期间被清空而导致的崩溃;启动任务发布前同步准备实例,关闭已准备但尚未监听的实例也能正常退出。
- [✓] 全量自动回归与定向竞态检查通过。
- [!] 正式登录、刷新会话、普通用户及管理员邮件恢复、旧密码与旧会话失效实机验收未完成。
- [!] 超级管理员受保护本机恢复通道实机验收未完成。
## 实机证据
第一轮直接访问安装根地址出现“认证服务暂时不可用”。安装服务缺少 `/api/v1/user/info` 的初始化状态响应,前端未得到需要初始化的业务码。修复后,两个版本的认证探测路径均复用安装令牌和来源检查,只返回需要初始化状态,不执行账号或配置写入。
在全新隔离浏览器中访问 `http://127.0.0.1:5201/`,页面自动进入 `/#/setup?redirect=/`,显示中文六步安装向导,未再出现认证服务不可用。已查看页面快照和桌面截图;截图工具不允许写入当前工作区,因此截图仅保留在会话中,未声称落盘。
第一轮完成初始化后,Windows Named Pipe 在接受连接时返回 `Access is denied`,随后 HTTP 停止与启动并发导致空指针崩溃。最新构建重试相同权限环境后,保留明确权限错误并退出,未再发生空指针崩溃,监听端口已释放。
当前进程使用未提升的中等完整性令牌,管理员组仅用于拒绝检查。本机通道 ACL 仍限定 SYSTEM 与管理员,未放宽 ACL,未改成公开 HTTP 或 TCP 接口。
## 自动验证
- `go test ./listen/http_server ./res_init` 通过。
- `node test/run.mjs all` 通过:前端 166 项、部署 4 项以及全部后端包。部分未变更包使用 Go 测试缓存,不能据此认定受权限限制的 Windows IPC 用例已实机执行。
- `node test/run.mjs backend -race ./listen/http_server ./res_init` 通过。
- 新增覆盖:HTTP 和 HTTPS 停止先于监听、多个停止任务并发、HTTPS 准备失败清理 HTTP,以及安装状态接口的有效令牌、缺少令牌、来源限制、方法限制和初始化完成后拒绝访问。
- `git diff --check` 通过,仅存在仓库已有换行策略提示。
首次误将构建与回归并行调度,触发工作区锁且导致竞态测试读取不到正在移动的嵌入资源。已改用串行调度重跑并通过,此次失败不作为产品回归结论。
## 备份与日志
以下路径包含本地测试数据或配置,均为忽略的运行产物,不提交仓库:
- `test-log/live-20260916-1938/backup/`:清库前配置和数据库。
- `test-log/live-20260916-1938/reset-partition-config/`:归档的旧分区配置。
- `test-log/live-20260916-1938/before-retest/`:首轮初始化后、第二次清库前的配置和数据库。
- `test-log/live-20260916-1938/fresh.stderr.log`:原始崩溃证据。
- `test-log/live-20260916-1938/fixed.stdout.log` 与 `fixed.stderr.log`:修复后正式启动权限失败与退出证据。
- `test-log/live-20260916-1938/setup-retest.stdout.log`:最新安装向导进程日志。
- `test-log/run-2026-09-16T11-49-49-921Z-5240/`:成功的全量回归。
- `test-log/run-2026-09-16T11-51-52-136Z-29980/`:成功的竞态检查。
第二次清库后保留安装向导运行于 `127.0.0.1:5201`,数据库为空、配置未初始化,证书与业务密钥未删除。没有将旧账号备份恢复到当前运行库。
## 后续条件
后续正式流程需要符合项目部署要求的 Windows 权限环境或受支持的 Linux 部署环境。当前会话无法提供已提升的 Windows 令牌,不通过绕过权限限制推进验收。
在具备权限的环境中重新完成初始化并确认服务稳定后,再验证登录、会话刷新和邮箱恢复。邮件恢复还需要确定实际可接收验证码的外部测试邮箱;验证码收到、恢复页面打开或接口返回成功均不单独构成完整验收。
## 2026 年 10 月 2 日云端续验
### 范围
本段时间为 13:17 至 13:30,继续当天已经完成的全新部署验收,不重复清库或恢复历史数据。业务操作使用浏览器页面;交互式 SSH 仅检查运行状态、修改 Smail 专用 Nginx 日志配置和权限。未调用业务接口代替页面测试,未新建测试脚本,未修改 Go 或前端业务代码。
### 本段结果
- [✓] 普通用户使用恢复后的临时密码登录成功,原邮件可读;随后通过安全设置恢复指定测试密码并再次登录,收件箱邮件仍在。本文不记录密码或安全码。
- [✓] 密码恢复后的安全设置显示不存在有效安全码,公共恢复入口不再提供安全码验证;源码确认恢复事务会撤销整批凭据。因页面已经撤销整批安全码,本段未单独提交第二枚旧码,不能称为逐码重放实测。
- [✓] 修改密码后页面退出登录,明确提示原安全凭据已失效。
- [✓] 超级管理员在公共找回页面被明确拒绝重置,提示使用安全中心或部署端本机通道;未执行超级管理员本机重置。
- [✓] 基础配置页面显示单一 MySQL 数据库和数据库用户均为 `smail`;页面域名与本次部署确认值一致。
- [✓] SSL 页面显示手动配置、不自动续期,直接引用 Nginx 使用的同组证书文件路径。
- [✓] Smail 专用 Nginx 配置改为不含查询参数、来源页及认证头的访问日志格式;配置语法检查通过并平滑加载。通过浏览器打开带无敏感信息测试参数的登录页后,新访问日志仅包含路径,测试参数匹配数为零。
- [✓] Smail 专用访问日志及错误日志权限均已设为 `0640`;现有日志轮转配置也使用 `0640`,未改动其他项目日志。
- [✓] 调整后 Smail、Nginx 均运行正常;Smail 启动时间仍为当天 11:58:26,自动重启次数为零,本段未重启 Smail。
- [x] 部署模板同步专用访问日志格式,反代部署说明校正证书路径引用与热加载行为;本地差异检查通过。完整占位符模板尚未在另一套全新实例重新部署。
### 尚未关闭的验收项
- [!] 自动证书续期、证书更新后网页及各邮件协议加载闭环尚未实测通过,手动配置和热加载不能替代自动续期验收。
- [!] 外域双向收发、真实 SMTP/IMAP/POP3 客户端、反中继及通知凭据协议隔离仍待完成。
- [!] 外部邮箱恢复、超级管理员本机恢复、附件上传及其他安全功能尚未全部覆盖。
- [!] 本次全新环境的微信、Telegram 配置与真人绑定尚未完成,不继承历史成功结果。
- [!] 历史日志未删除;应用日志、错误日志及其他日志的敏感信息检查仍待完成,不能以访问日志格式修改代替全部日志审计。
- [!] 本轮临时账号、分组和其他验收数据保留用于后续测试,发布前仍需按确认范围完成清理。
以上不构成全项目验收通过或上线签收。
### 13:46 至 14:00:公网收件边界修复与外域投递诊断
本段继续同一轮验收,不重新清库。业务操作及公网检测均经浏览器键鼠完成;交互式 SSH 用于只读日志检查及 Smail 二进制更新,文件传输使用密码认证并严格校验已知主机密钥。未调用 Smail 业务接口、未执行辅助测试脚本、未恢复历史密钥、未改动同机其他项目。
#### 公网收件边界
- [✓] 修复前公网检测连接到本机 25 端口,收到 `220 cdis.cn ESMTP Service Ready`,但未认证的外域收件人得到 `250` 接受响应,检测报告提示可能开放中继。
- [x] 源码追踪发现匿名邮件进入本地收信流程;本段没有证明匿名邮件能实际转发到外域,不能将上述响应直接表述为已成功利用开放中继。
- [✓] 在收件人阶段增加地址格式检查、受管域名匹配和匿名外域拒绝;已认证连接仍先检查凭据是否被撤销,不改变通知发信地址及收件人数限制。
- [✓] 新版云端复测明确返回 `550 5.7.1 Relay access denied`,公网检测结果为非开放中继;检测目标为 `smtp.cdis.cn`,连接地址仍为本机。
- [✓] 普通用户通过网页发送站内自收邮件,收件箱出现新邮件,打开邮件编号 11 可读完整正文;服务更新后原会话及已有邮件仍可访问。
- [x] 已补充受管域名、别名、大小写、外域、伪装后缀、非受管子域名及无效地址的 Go 回归用例。本段遵守浏览器业务验收约束,没有执行 Go 单元测试,不能将新增用例记为已通过。
#### 外域投递与 DNS
- [!] 普通用户此前通过页面发送的 mail-tester 邮件仍未收到,检测页面明确显示暂未收到邮件。本段不是外域收发验收通过。
- [✓] 增加按 MX 主机及端口记录失败类别的诊断,不改变原有端口尝试顺序、安全停止条件和重试策略,不记录邮件正文、凭据或远端 SMTP 响应原文。
- [x] 新版持久队列继续尝试原邮件,13:54:47 至 13:54:49 的运行日志明确显示:到检测收件主机的 25 端口连接超时、465 端口连接超时、587 端口返回无路由。旧日志只有最后一次错误,不能反推此前 25 端口的具体错误。
- [!] 上述为一个外部目的地的失败证据,尚未证实云厂商限制或所有外域均不可达;主机防火墙允许出站也不能替代云网络验证。
- [✓] 公网 DNS 页面查询到邮件主域名的 MX 指向 `smtp.cdis.cn`,地址为本机,DMARC 记录存在且启用隔离或拒绝策略。此结果不能替代真实邮件的 SPF、DKIM、DMARC 校验。
- [!] 公网检测未查到本机 IP 的 PTR 记录,仍需核实并完成反向解析配置;本段没有修改 DNS。
#### 构建与部署证据
- 修改前检查点 `7612e10`、修复提交 `9e78499` 均已推送到 `smail` 远程。
- 从当前源码编译 Linux amd64 内置插件版本成功;本段未修改前端及插件源码,使用现有内嵌资源,未声称重新构建前端。
- 本地及云端二进制 SHA-256 均为 `379af177b0f999ddf48ed735bf081f6afe1b7b5e7df110211de646ab2bb01634`。
- 校验传输文件后仅更新 `/opt/smail/smail`;Smail 于 13:54:29 启动,更新后 Smail、Nginx 均为运行状态。未清库、未修改证书、未保留旧二进制备份、未重启其他项目。
本段关闭了公网匿名外域收件响应问题,但外域双向投递、真实客户端协议、通知凭据协议隔离及证书续期等未完成项仍然有效,整体验收继续进行。
### 14:01 至 14:23:公网证书验证与多地址连接预算修复
继续当天同一轮验收,不重复清库、不恢复历史配置。业务邮件均通过浏览器页面操作,交互式 SSH 仅用于运行状态、日志和部署;没有直接调用 Smail 业务接口,没有新增辅助脚本。
#### 公网 SMTP TLS 与证书
- [✓] 14:03:07 的 CheckTLS 接收端检测通过公网 MX 解析连接 `smtp.cdis.cn`,实际地址为 `47.108.78.12:25`;连接、EHLO、STARTTLS、加密及证书检查通过。
- [✓] 协商 TLS 1.3,套件为 `TLS_AES_128_GCM_SHA256`,密钥交换为 X25519;证书主机名校验通过,包含 `*.cdis.cn` 与根域 `cdis.cn`,页面显示 OCSP 未撤销。
- [✓] 页面证书有效期为 2026 年 9 月 30 日 16:41:53 UTC 至 2026 年 12 月 29 日 16:41:52 UTC。本段没有更换证书。
- [!] 检测在 MAIL FROM 后退出,没有执行 RCPT、DATA 或最终收件;MTA-STS、DANE、FCRDNS 未测。该页面分数不是全项目验收结果,也不证明自动续期。
#### 第二外部目的地与连接预算
- [x] MailGenius 页面停留在请求验证,未绕过;改用 CheckTLS 的发信检测页面取得收件说明。
- [x] 14:10 首次操作未在离开收件框前按回车确认目标,随后误选站内历史联系人,形成一封站内自收邮件;此邮件的发送成功不计入外域证据。14:12 重新输入并确认目标标签后,才向 `test@TestSender.CheckTLS.com` 正式提交检测邮件。
- [x] 旧版日志中该目的地出现 IPv6 超时及网络不可达。源码确认 DNS 与所有目标地址共用两秒时限,且仅保留最后一个地址的错误,后续地址可能没有有效尝试时间。
- [x] 修复后单个地址连接预算为十秒、DNS 预算为十秒,并受三十秒连接总时限及父级取消约束;汇总各地址失败原因。仍先检查全部解析地址是否允许访问,不改变 TLS 校验、SMTP 路由端口顺序和不确定投递停止规则。
- [x] 新增首地址超时后回退、父级取消、全部失败原因保留的 Go 用例;本段未运行单元测试,不标记用例通过。
- [!] 新版队列于 14:19:27 至 14:19:29 重试原邮件,日志明确显示 `ts11-do.checktls.com` 的 IPv4 地址 `165.227.190.238`:25 端口超时,465 和 587 返回无路由。连接预算修复没有消除公网出站失败。
- [!] 两个独立外部收件目的地均已有失败证据,仍不能直接认定云厂商封禁或所有外域不可达。下一步需核实云平台出站限制、安全组及网络路径;不可通过关闭 TLS 校验掩盖问题。
- [!] 本段收件箱没有外部检测回信,也未出现用户协助发送的“外域入站验收”邮件;外域双向投递仍未验收通过。
#### 修复部署与站内复测
- 修改前检查点 `3389f18`、修复提交 `eba1b9d` 均已推送至 `smail` 远程。
- Linux amd64 内置插件版本编译成功,沿用未改动的现有前端、插件内嵌资源;本段未重新构建前端。
- 本地及云端 SHA-256 均为 `7ddba6353e082d8281639a3db9b2fe81aa0d26dd7a3a4e7a5f3fc1994a5204c0`。
- 仅更新 Smail 二进制,服务于 14:16:58 启动,自动重启次数为零;Smail、Nginx 均正常,未重启其他项目。
- [✓] 浏览器刷新后普通用户会话与已有邮件保留;14:21 经页面回复站内邮件,新邮件编号 16 到达收件箱,正文可读。
本段完成连接预算代码修复和站内回归,但没有关闭外域投递问题。自动续期、真实邮件客户端、通知凭据协议隔离以及此前列明的剩余验收项继续保留,不据此签收上线。
### 14:32 至 15:24:外部证书签发、续期检查与公网 SMTP 复核
本段继续当天验收,没有再次清库或恢复历史数据。交互式 SSH 用于 Smail 专用证书工具和服务部署;后台证书路径通过浏览器页面修改。没有调用 Smail 业务接口代替页面操作,也没有新增 Python 或辅助测试脚本。
- [✓] 使用本轮输入的 DNS 凭据,14:50 完成邮件根域和泛域名证书真实签发,验证记录已清理。首次额外申请已被泛域覆盖的后台子域被签发机构拒绝;已修正模板,不再重复申请该子域。
- [✓] 新证书覆盖 `cdis.cn` 与 `*.cdis.cn`,序列号为 `05A89FD6E573B777E6A7565A646D7C10746A`,有效期至 2026 年 12 月 31 日 05:51:31 UTC。Nginx 使用经过校验并原子发布的合并证书;Smail 使用独立证书、私钥文件。
- [✓] 15:06 首次启动专用续期任务时,实际发现固定输出文件名与域名读取规则不一致,任务失败且未启用计时器。修复后移除固定文件名参数,发布工具、文档及回归用例统一使用邮件主域名命名。没有修改第三方模块缓存或项目依赖版本。
- [✓] 修复提交 `9465b4f` 已推送,Linux amd64 工具编译成功。部署工具本地及云端 SHA-256 一致:`651238a8ead4474f839a79b919094cb5b9d2a62e758d9e2ba595ff18634e7b69`。
- [✓] 15:16 手动执行续期任务成功:检测证书剩余 89 天而跳过签发,随后完成证书校验及发布、Nginx 配置检查和平滑加载。15:17 启用计时器后再次成功;下一次计划为 10 月 3 日 04:28:43。旧 `smail-tls-sync.path` 已禁用,避免两套任务混用。
- [✓] 浏览器后台已将证书和私钥路径保存为 `/var/lib/smail-acme-tls/certificates/cdis.cn.crt`、`/var/lib/smail-acme-tls/certificates/cdis.cn.key`;服务端只读核对确认持久化。Nginx 使用 `/etc/nginx/smail/tls.pem`。文件均为 root 所有、0600 权限;旧证书文件没有擅自删除。
- [✓] 15:22 经浏览器 CheckTLS 页面复核公网 `smtp.cdis.cn:25`,STARTTLS、TLS 1.3、证书链及主机名验证通过。页面截图中的序列号和有效期与新签发证书一致,证明 SMTP 已加载新证书,不是仅确认磁盘文件存在。
- [!] 同一次公网检测明确显示服务器 IP 的 PTR 查询返回 NXDOMAIN,FCrDNS 失败。此项需要服务器 IP 管理方配置反向解析;不能通过添加普通域名 A 记录代替。
- [!] 检测只执行到 MAIL FROM 后退出,未执行 RCPT TO、DATA,不能据此认定外域邮件入站投递完成,也不能证明出站可用。
- [!] 当前证书未到续期阈值,因此本段通过的是检查与发布流程,不是到期自动续期。HTTPS、其他邮件协议的新证书及真实续期仍需独立验收。
- [x] 已更新 Go 回归用例,但本段未运行自动测试,不能标为测试通过。
15:21 至 15:23 检查 Smail、Nginx 仍正常运行,Smail 主进程保持 1930122、自动重启次数为零。浏览器重新登录超级管理员后,原有收件列表正常显示。没有重启 Smail 主程序或其他项目;Nginx 仅执行配置检查和平滑加载。
外部检测页曾出现截图超时,关闭该检测页并重新打开后完成上述检测,未因此重启业务服务。附件上传仍只有此前工具路径权限拒绝的证据,不能归因于 Smail 上传功能失败。外域出站、真实客户端、通知凭据隔离和其余安全验收继续保持未关闭状态。
### 15:30 至 16:09:草稿密送、通知凭据查看与撤销后的普通邮件回归
沿用当天全新部署继续验收,没有再次清库。业务操作全部通过同一套浏览器工具的页面键鼠完成;仅查看浏览器自然产生的请求响应用于诊断,没有直接调用业务接口,没有注入脚本。以下结果不包含任何凭据明文。
- [✓] 超级管理员保存并重新打开草稿后,收件人、密送人、标题、中文正文与换行保留。发送主题为“验收1002-草稿恢复与密送隔离”的邮件后,发件箱显示发送成功,草稿箱不再残留该草稿。
- [✓] 管理员收件副本编号为 18,普通用户密送副本编号为 19,两者正文可读。管理员查看邮件及进入回复页面时未见密送地址,回复对象为原发件人。本结论仅覆盖此次站内组合,不替代原始邮件头及外域场景验收。
- [✓] 普通用户继承管理员回复地址时读取失败,编辑和发送操作不可用;超级管理员继承普通用户的收件副本地址时也无法读取。只证明此次两个访问边界,不代表全部跨账号场景已完成。
- [✓] 超级管理员逐账号开启 testuser 通知发信,将每分钟及每日收件人限额分别设为 2 和 5。首次生成凭据后,管理弹窗关闭,凭据显示在账号列表下方;其他账号没有随之开启。
- [✓] 普通用户只能查看本人的授权状态、限额及凭据入口,没有开启、生成或重置授权的管理按钮。错误的本人密码被拒绝,正确密码可显示凭据;60 秒后自动恢复掩码,再次查看仍要求本人密码验证。
- [✓] 16:01 至 16:02,在网页登录页面分别提交普通账号和通知专用用户名搭配通知凭据,两次均停留在登录页。浏览器自然产生的登录响应均为业务错误 100,提示账号或密码错误。随后原网页登录密码登录成功。未将通知凭据提交给任何第三方。
- [✓] 管理员通知管理页显示自身与 testuser,不显示超级管理员。账户管理页确认管理员和 testuser 同属测试普通组。管理员通过确认弹窗关闭 testuser 通知授权后,列表显示未开启,查看授权码按钮禁用,管理弹窗恢复为不可用的生成凭据按钮。
- [✓] 普通用户重新登录后,通知页显示未开启,不再出现查看凭据入口;原密码仍能登录,原有邮件正文仍可读取。
- [✓] 16:07 普通用户在通知授权关闭状态下回复站内邮件,主题为“验收1002-关闭通知授权后普通邮件回复”。发件箱刷新后显示发送成功;超级管理员收到收件副本 21,16:09 打开确认正文完整,完成关闭通知授权后普通邮件发送与阅读的回归。
- [!] 以上关闭授权结果只证明页面状态和普通邮件互不影响,尚未通过真实 SMTP 客户端证明旧凭据、已建立连接失效,也未验证 IMAP、POP3 拒绝通知凭据及限额实效。
- [!] 普通用户最新收件列表尚未出现约定主题“外域入站验收”的邮件;没有用户已发送的确认,不能据此认定入站故障。外域出站和反向解析问题仍未关闭。
旧浏览器标签曾出现安全提醒按钮无响应,未观察到对应确认请求。新建同项目标签后相同操作正常,后续多次登录也能关闭提醒;旧标签已关闭。根因未确认,不能写成产品问题已修复。本段结束时保留一个 Smail 标签及一个公网证书检测标签,没有新增浏览器工具实例。
16:00 和 16:04 通过既有交互式 SSH 复核 Smail、Nginx 均运行;16:00 主进程为 1930122,自动重启次数为零。本段没有修改程序、重新构建或重启服务,只补录验收文档。testuser 通知授权最终保持关闭,限额保留 2 和 5;协议侧验收继续保持未完成。
### 16:14 至 16:29:混合投递、抄送正文与公网加密发信端口
本段继续既有全新部署,没有重复清库、恢复旧数据或调整业务配置。业务操作仍通过浏览器键鼠完成;SSH 仅检查 Smail 服务、监听和既有投递日志。没有向第三方检测站提交账号密码、通知凭据或其他密钥。
- [✓] 超级管理员发送“验收1002-抄送与混合收件人部分失败”,主收件人为本站超级管理员和保留无效域名下的测试地址,抄送人为测试管理员。超级管理员收件副本 23 的地址和两行中文正文正确;发件箱明确显示部分成功,详情为已接收 2、失败 1,原因为收件域名解析失败。
- [✓] 16:25 打开管理员收件副本 24,主收件人、抄送人及两行中文正文均与发送内容一致,完成此前被弹窗阻挡的抄送正文核对。
- [!] 页面提示已接收的收件人不会自动重投,但本段没有覆盖重启、重试和长时间观察,不将此提示当作去重实测通过。
- [x] 安全提示弹窗在本段开始时已经消失。浏览器自然请求记录中出现确认请求,响应时间为 16:18:52,业务结果成功,返回关闭提示状态;本段控制台没有错误或警告。此前未观察到请求不代表请求最终没有发出,延迟原因仍未查清,不把自然恢复写成产品修复,也未据此修改源码。
- [✓] 16:27 通过浏览器操作 CheckTLS 对公网 smtp.cdis.cn 的 465 端口执行直接 TLS 检测,携带对应 SNI,协商 TLS 1.3,连接、加密和证书检查通过。
- [✓] 16:28 至 16:29 对同一主机 587 端口执行 STARTTLS 检测,协商 TLS 1.3,连接、STARTTLS、加密和证书检查通过。页面记录显示升级前不公布 AUTH,升级后公布 PLAIN、LOGIN;没有执行认证。
- [!] 两次公网检测的反向解析均为 NXDOMAIN,正反向一致性未通过。465 检测页面虽显示综合分数 100%,同页仍明确显示反向解析失败,不能据综合分数宣布全部通过。
- [!] 当前检测站访客页面的收件人验证和实际发信选项禁用;两次检测均在 MAIL FROM 后退出,没有执行 RCPT TO、DATA,不证明完整入站、SMTP 认证、通知发信或开放中继防护已通过。
16:25 复核 Smail、Nginx 均运行,主进程仍为 1930122,自动重启次数为零;16:27 只读检查确认 25、465、587、993、995 的监听归属于该 Smail 进程。监听存在不替代协议验收。既有日志仍有外域 IPv4 25 端口超时、其他尝试无路由的记录,不能据此断言云厂商封禁;外域实际收发、IMAP/POP3 和通知凭据协议隔离继续待验。
### 16:31 至 16:54:管理员降级恢复与外部邮箱绑定
本段延续当天的全新部署,未重复清库、恢复旧数据、修改业务源码或重启服务。业务操作继续通过浏览器键鼠完成;SSH 仅复核服务状态和既有投递日志。
- [✓] 超管账户管理默认组优先展示,其余分组折叠。测试管理员原本属于测试管理组和测试普通组,只能看到自己的两组,不显示默认组内的超级管理员。
- [✓] 将多分组管理员改为普通用户但保留两个分组时,页面拒绝保存,要求只选择一个分组,没有静默丢弃分组。选择测试管理组后降级成功;旧管理员页面执行受保护操作后回到登录页。
- [✓] 降级后重新登录显示普通用户,原收件列表保留,设置中不显示用户管理和配置管理。此项证明页面权限收敛,不代替全部越权路径和协议会话验证。
- [✓] 16:43 超管恢复 testadmin 的管理员角色及测试管理组、测试普通组。保存前触发当前密码确认,验证后自动继续保存;重新打开分组弹窗确认两组均已勾选。原密码未修改,重新登录显示管理员,用户管理入口恢复。
- [✓] 16:47 通过管理员本人外部安全邮箱页面,向用户指定的 163 邮箱发起绑定。自然请求返回待验证状态;随后页面显示脱敏邮箱、备用邮箱和已验证,超管审计页记录 16:48:23 验证外部邮箱成功。验证码提交不是本段代理执行,未读取或保存验证码,验收结论依据最终页面和审计记录。
- [x] 上述绑定期间存在某一网易 MX 地址连接超时,但最终绑定已验证,不能将单次地址失败扩大为全部外域出站失败,也不能据此宣布所有外域收发通过。其他外域目标投递、完整外域入站和 PTR 仍待验证。
- [✓] 已分别在超管和普通用户本人的页面,向用户指定的另外两个 163 邮箱发起绑定;随后分别核对两个账户页面均显示对应脱敏邮箱、备用邮箱和已验证。两次验证码提交均不是本段代理执行;三种角色的指定外部邮箱最终均已验证。本文不保存完整外部邮箱地址、挑战标识或会话信息。
- [!] 安全提醒弹窗再次出现点击后未立即响应的现象;管理员页面正常刷新后,同一前往设置操作成功打开外部邮箱设置。根因未确认,没有用脚本绕过弹窗,也未将刷新后恢复写成产品修复。
16:41、16:45、16:50 通过既有 SSH 会话确认 Smail 和 Nginx 均处于运行状态。普通用户最新收件列表仍未发现约定主题的外域入站验收邮件,不能在没有外部发送确认的情况下判定入站故障。
### 17:01 至 17:11:普通用户外部邮箱恢复闭环
本段继续同一轮云端验收,未清库、重启、重新部署或修改业务源码。业务操作仅使用浏览器键鼠,查看自然产生的网络记录用于定位登录失败,未直接调用业务接口。
- [✓] 普通用户刷新后重新打开外部安全邮箱设置,脱敏地址和已验证状态仍保留。
- [✓] 从登录页进入忘记密码,识别普通用户及其脱敏外部邮箱,点击获取验证码后显示已发送。本段代理未读取或提交邮箱验证码;随后观察到页面进入身份验证已通过的新密码步骤。
- [✓] 在已验证的页面设置临时密码,页面确认密码已重置。原密码登录被拒绝;使用实际提交的临时密码登录成功。
- [x] 临时密码首次输入超过页面规定长度,恢复页输入框按最大长度截短,导致首次使用未截短文本登录失败。自然请求记录及源码一致确认恢复页限制为 8 至 12 位,并有占位提示;不将本次输入失误记为后端重置失败。本文不保存临时密码或恢复令牌。
- [✓] 通过普通用户安全设置恢复用户指定测试密码,提交后退出登录,再次使用指定密码登录成功;打开已有邮件 19,正文两行及收件人信息仍可读取。
- [✓] 超级管理员公共恢复入口仍明确拒绝重置,提示使用安全中心或部署端本机通道。管理员公共恢复页显示其角色及对应脱敏邮箱;尚未发送验证码时,即使填入测试数字,验证按钮仍禁用。此项仅证明页面前置限制,不替代服务端绕过防护验收。
- [!] 本段没有完成管理员外部邮箱恢复、恢复令牌重放、协议侧旧连接撤销或超级管理员本机恢复。普通用户恢复期间没有保留另一条已登录会话,不能将重新登录成功写为所有旧会话撤销实测通过。
- [x] 安全提醒弹窗点击后未在即时快照消失,后续快照已消失,本段无需刷新即可继续;仍未定位既往延迟原因,没有修改源码。
17:01、17:10 交互式 SSH 只读复核 Smail、Nginx 均运行,主进程为 1930122,自动重启次数为零。此前推送重试已明确以连接超时结束;本段检查点推送返回认证失败,不能声称远程仓库已同步。
### 17:13 至 17:58:恢复流程后续记录与修复边界
以下补记来自同一轮连续验收的交接记录,不代表 18:16 后重新执行了这些场景。
- [✓] 管理员外部邮箱恢复成功后,旧页面刷新退出、旧密码被拒绝、临时密码可登录;随后通过本人安全设置恢复指定测试密码。管理员角色、两组范围以及邮件 24 的可读性保留。
- [✓] 普通用户访问管理员邮件 24、管理员访问普通用户邮件 19 均被拒绝。结论只覆盖这两个邮件详情,不扩展为全部附件、修改或协议权限验证。
- [x] 提交 `398824e` 调整八位验证码生成,同一数字最多出现两次,保留安全随机源,不改手机动态码。提交 `a901bd1` 补充公共密码恢复成功审计,并修正失效会话刷新后误报成功的提示。这些修改已包含于后续部署包。
- [✓] 注销共享会话后,旧页面刷新回到登录页,只提示登录失效,不再提示已刷新。这是注销失效场景,不冒充修复后的密码恢复旧会话场景。
- [!] 修复后管理员恢复流程到达设置新密码步骤,但提交时已过期,页面拒绝重置;原指定密码随后仍可登录。因此公共恢复成功审计的新版实机闭环仍未完成。
### 17:58 至 18:23:管理员与普通用户安全方式二选一
需求确认:账户完善提醒以有效安全码或已验证外部邮箱至少一项为准;两项均无则提醒。超级管理员既有规则保持不变。沿用当天全新部署的同一轮验收,没有再次清库,没有改变三个主要测试账号的外部邮箱绑定。
- [✓] 提交 `4741b64` 修改后端提醒判断、页面中文提示并补充回归用例;前端构建和 Linux 后端构建成功。回归用例未执行,不将编译成功写成自动测试通过。
- [✓] 18:03:21 部署 `acceptance-4741b64`,交接记录确认本地、传输与部署主程序 SHA-256 一致:`81955be51b9bd6b210f1b8eba6c303766b9c6d1c2171b63e1a4ba8ed36b24621`。仅重启 Smail,未重启其他项目。18:16 本段通过原交互式 SSH 会话复核 Smail、Nginx 均运行,主进程 1944507,自动重启次数为零。
- [✓] 上一段分别检查管理员和普通用户仅有已验证外部邮箱、无有效安全码;注销并重新登录均直接进入收件箱,不再提醒补齐另一项。
- [✓] 上一段临时普通用户 `testsecurity` 两项均无时显示新提醒;生成安全码后注销重新登录,不再提醒。未读取或保存安全码明文。
- [✓] 18:16 后以临时账号重新登录,页面明确显示管理员身份,没有完善安全弹窗;本人设置分别显示暂无外部安全邮箱、已配置有效离线恢复码,完成管理员仅安全码场景复核。
- [✓] 临时管理员本人撤销安全码后立即弹出完善账户安全;注销并再次登录仍显示提醒。文案为:安全码或外部邮箱至少配置一项。未配置时,每次登录都会提醒。
- [✓] 收尾时直接禁用管理员被现有规则拒绝。按现有角色变更要求临时生成安全码,降为普通用户,再由超管撤销全部安全码并停用。最终账户列表显示普通用户、未开启安全码、未绑定邮箱、已禁用。没有删除账号,临时浏览器标签已关闭。
- [x] 收尾后旧临时页面刷新回到登录页;因此前已做角色降级,不能单凭此现象将失效原因唯一归为停用。重新尝试登录没有进入收件箱,但本段未捕获具体错误提示,不扩大为全部会话或协议撤销验收。
- [!] 此次二选一修改仅覆盖账户完善提醒。角色调整、通知授权等高风险操作仍有独立安全码要求,未将已验证邮箱伪装为已配置安全码,尚未统一改成二选一。
- [!] 未验证邮箱、停用邮箱、全部安全码已使用等边界已补充源码回归用例,但没有执行自动测试,也没有逐项完成云端浏览器验收。
业务操作全部通过浏览器键鼠完成,没有直接调用业务接口或注入脚本。该项局部验收不代表项目整体验收完成;真实邮件客户端、外域收发、通知凭据撤销、全新环境推送、本机恢复及公共恢复审计仍按未完成项保留。此前文中的推送失败属于历史,本次功能提交和补记前检查点推送均成功。
### 18:25 至 18:51:统一授权二选一与账号权限恢复
本段继续当天同一轮全新部署验收,没有再次清库或恢复旧数据。上节所述高风险操作仍强制安全码的限制,已在本段统一调整为有效安全码或已验证外部邮箱任选其一;操作权限、分组范围和近期本人密码验证保持不变,实际消费恢复码的认证流程不变。
- [✓] 已提交并推送业务调整与回归覆盖,功能版本为 `acceptance-10a2733`。前端和 Linux Go 后端构建成功;回归用例已补充但未执行,不将构建成功写成自动测试通过。
- [✓] 18:38:34 仅重启 Smail 部署新包,本地、上传及部署程序 SHA-256 一致:`b6d7d2afee898b568a223e4ddc36ef6bb423b1e6b769b1fc611d93f3fca5b859`。18:44 后继续通过原交互式 SSH 会话复核 Smail、Nginx 均运行,主进程 1946662,自动重启次数为零。
- [✓] 无安全码、仅已验证外部邮箱的管理员,在本人所属分组内为普通用户开启通知发信授权。保存要求确认本人密码,验证后成功。普通用户页面同步显示开启状态,但没有管理开关;管理员随后关闭授权,普通用户刷新状态显示未开启,已恢复原关闭状态,没有生成或查看凭据。
- [✓] 超管将仅有已验证外部邮箱、没有安全码的普通用户升为管理员,保存前要求本人密码验证,验证后成功。本段随后将该账号降回普通用户,列表显示保存成功、原测试普通组、邮箱已绑定、安全码未开启、账号正常。
- [✓] 角色调整使旧普通用户页面回到登录页;以原指定密码重新登录后显示普通用户,收件列表保留,没有出现要求补齐安全码的完善提醒。临时升权已经恢复,没有遗留额外管理员权限。
- [x] 源码复核确认操作者与目标账号的外部邮箱状态独立传递;仅已验证邮箱满足条件,每次已认证请求重新读取状态,查询失败不沿用先前的已配置状态。此项属于代码审查,不代替全部失效状态实机验收。
- [!] 普通用户重新登录后点击设置没有打开弹窗,正常刷新后再次点击并等待仍未打开,当前控制台没有错误或警告。根因尚未确认,不能将该页面后续安全设置检查标为通过,也未用脚本绕过。
- [!] 待验证或停用邮箱、全部安全码已使用、数据库异常等边界已补充回归用例,但未执行自动测试,也未逐项完成浏览器实测;本段不宣称全部高风险操作和项目整体验收通过。
本段业务验收仅使用浏览器键鼠。保留现有测试账号和数据,不删除文件,不修改其他项目;后续仍需完成整体邮件协议、恢复与推送等既有待验项目。
### 19:05 至 19:14:个人邮件规则分流与移除后的投递复核
本段延续同一轮云端验收,未重新清库、部署或重启服务。通过原交互式 SSH 会话确认 Smail、Nginx 均处于运行状态;业务操作仅使用现有浏览器 MCP 的键鼠操作,没有直接调用业务接口或注入脚本。
- [✓] 普通用户现用标签页可以打开设置、安全码提示和规则页。此前旧标签设置无响应的问题在现用标签未复现;未修改相关代码,根因仍未确定,不记为产品缺陷已修复。
- [✓] 普通用户原规则列表为空。通过页面新建严格限定主题“验收1002-规则分流-1907”的个人规则,条件为邮件主题等于该值,动作为移动到广告箱。
- [✓] 超管于 19:10 向普通用户发送匹配主题的站内邮件,发件箱显示发送成功;普通用户广告箱实际出现该邮件,打开详情可读取发件人、收件人和完整中文正文。
- [✓] 通过页面确认删除本段新增的测试规则,列表恢复为空;没有删除文件或原有规则。19:12 再次向同一用户发送相同主题、不同正文的邮件,实际进入收件箱,打开详情可以读取第二封正文,证明规则移除后恢复默认投递。
- [✓] 普通用户操作日志显示本人 19:08:02 创建邮件规则成功、19:11:46 删除邮件规则成功。该证据只覆盖当前展示的个人记录,不代替全部日志隔离和脱敏审查。
- [!] 首次准备规则投递时误选历史联系人中的无效测试地址,19:09 的测试邮件在发件箱显示发送失败;该封不计入分流通过证据。后续逐项核对收件人标签后重新发送,未向真实第三方发送此测试正文。
- [!] 管理员公共恢复页仍停在邮箱验证码输入步骤,尚未完成本轮恢复、旧会话失效和恢复成功审计闭环;没有反复发送验证码。
本段没有覆盖规则的全部匹配类型、优先级、多条件、转发和跨用户隔离,也不代表真实 SMTP、IMAP、POP3 客户端及外域投递验收通过。测试邮件保留,临时规则已移除。
### 19:22 至 19:26:日志可见范围与普通用户运行日志脱敏抽样
本段延续当天同一轮验收,没有再次清库、部署或重启服务。19:22:28 通过原交互式 SSH 会话确认 Smail、Nginx 均运行;沿用同一浏览器 MCP,通过键鼠操作检查三个角色,不调用业务接口、不注入脚本。
- [✓] 管理员操作日志第一页同时显示本人通知授权操作和同组普通用户创建、删除邮件规则记录。用户管理页面确认管理员与普通用户均在测试普通组,当前管理员不显示默认分组。
- [✓] 管理员按操作者编号 1 查询操作记录为空;超管页面同一最近二十四小时时段显示超管的发信和账户编辑记录,不是因被查账号没有记录而产生的空结果。
- [✓] 超管用户列表显示临时账号 testsecurity 位于默认分组,当前为已禁用普通用户。超管按其编号 4 查询可见生成、撤销安全码及登录等历史操作;当前管理员按编号 4 查询为空。本例覆盖该组外账号的操作记录,不扩大为所有组外账号、所有日志类别均已验收。
- [✓] 管理员收发信日志第一页只显示本人编号 2 和同组普通用户编号 3;按超管编号 1 查询为空。超管以编号 1 查询可见 19:12:57、19:10:42 等投递记录,与管理员空结果形成对照。
- [✓] 普通用户收发信记录第一页仅显示本人编号 3。19:12:57 的本人收件详情显示发件人、收件人数和邮件大小,不显示邮件正文。
- [✓] 普通用户运行日志显示固定服务启动事件及账号相关事件。展开 14:27:41 错误事件及其原始记录后,只显示通用动作、结果、时间和日志模式字段,没有异常原文、源码路径、请求标识或对象详情。本项仅为这一详情的脱敏抽样。
- [x] 只读复核日志权限与运行日志裁剪源码:管理员范围为本人及同组普通用户;低权限视图允许固定公共生命周期事件,不能仅因普通用户可见主服务启动日志就认定越权。源码审查不代替其他数据和失效场景的实机验证。
- [!] 尚未完成全量分页、成员转组后的历史日志边界、组外收发信负例、所有运行事件和日志文件生命周期验收。现有结果不代表完整日志模块通过。
- [!] 公共密码恢复页面仍停留在管理员邮箱验证码输入阶段,验证码为空、继续按钮禁用;没有重发验证码,也没有完成密码恢复成功、旧会话失效和成功审计闭环。
本段没有修改业务源码或账号权限,没有读取恢复码明文,没有清理测试数据。现有管理员登录会话保持,用于后续密码恢复撤销验证。真实邮件客户端、外域双向投递、通知凭据撤销、推送、本机恢复、证书续期等上线门槛仍未关闭。
### 19:27 至 19:37:转组日志权限收尾与附件工具阻塞复核
- [✓] 超管将已禁用普通用户 testsecurity 临时移入测试普通组。管理员保留原登录会话,按操作者编号 4 查询,只显示五条历史普通用户事件;展开 18:10:28 登录详情,角色为 user。
- [✓] 超管对照查询同一账号,仍可看到更晚的历史事件;18:18:16 登录详情角色为 admin。管理员上述查询未显示该条管理员身份历史。本项覆盖这一个账号的历史角色边界,不扩大为全量日志通过。
- [✓] 续接时已通过超管页面将该账号恢复默认分组,列表确认仍为禁用普通用户、未配置安全码、未绑定外部邮箱;没有改变其密码或启用状态。管理员原会话再次按编号 4 查询,结果为空,完成本例移出组后的查询权限撤销闭环。
- [✓] 19:34 通过原交互式 SSH 会话确认 Smail、Nginx 均运行;部署主程序 SHA-256 仍为 `b6d7d2afee898b568a223e4ddc36ef6bb423b1e6b769b1fc611d93f3fca5b859`,与已部署安全方式二选一版本一致。本段没有重新部署、清库或重启服务。
- [!] 19:37 在超管发件页,使用浏览器上传工具选择仓库公开 LICENSE,仍被工具的工作区路径许可拒绝,请求未到达 Smail。未通过搬移文件、脚本或直接接口绕过限制;附件上传、下载和内容完整性继续未验收。已请用户在当前发件页手动添加非敏感小附件后保留页面。
- [!] 管理员公共恢复页仍在验证码输入步骤,未填写验证码;已请用户方便时获取新验证码并验证到新密码页。没有反复发码,没有将等待视为恢复成功。
本段业务操作仅使用浏览器键鼠,服务检查仅沿用已授权交互式 SSH。后续继续审查独立待验项,不因单个工具或验证码阻塞而重复已通过用例。
### 19:38 至 20:05:通知凭据撤销审计与普通用户独立会话失效
本节事件时间按服务器所在的东八区记录,继续同一轮全新部署。没有重复清库、创建备份、恢复旧数据、重新部署或重启服务;所有业务操作仍通过浏览器键鼠完成。
- [✓] 管理员为同组普通用户临时开启通知发信并生成凭据,保留原每分钟 2 个、每日 5 个收件人限额。普通用户只显示本人状态和密码验证查看入口,没有授权管理开关。本段没有发送通知邮件,没有复制或保存凭据明文。
- [✓] 普通用户在查看凭据验证框输入错误密码后,未显示凭据。管理员于 19:49:48 关闭授权;普通用户保留原验证框,随后输入正确密码提交,页面自动更新为未开启,隐藏查看入口。管理员页面同步显示未开启,查看授权码按钮禁用,管理页恢复为禁用的生成凭据按钮。临时通知授权已恢复关闭。
- [✓] 管理员日志页显示开启授权、生成凭据、关闭授权成功;普通用户两次查看凭据失败。展开详情确认错误密码对应业务结果 100,撤销后查看对应业务结果 405,均未误记为成功。抽查详情没有显示密码或通知凭据。本例只证明页面与所抽查审计,不证明真实 SMTP 旧凭据、旧连接撤销或限额生效。
- [x] 通知管理事件同时出现控制器记录与请求审计记录;其中控制器记录缺少展示层所需的结果说明,被页面归类为历史记录。源码可定位到控制器的记录函数与统一请求日志,尚未统一展示,不能据此声称完整日志体验验收通过。
- [✓] 管理员直接访问普通用户邮件 29 的前端详情地址,显示邮件暂时无法查看,没有正文。普通用户本人可正常打开同一邮件。该例补充同组管理员不自动取得成员邮件阅读权的证据,不替代全部附件及写操作权限检查。
- [✓] 19:55 后在同一 Smail 浏览器实例内新增独立隔离登录会话,保留普通用户原会话。19:56:45 通过本人安全设置修改为临时密码后,修改方退出登录;原会话点击刷新通知状态立即返回登录页。原密码登录未成功,临时新密码登录成功,仍能读取邮件 29。
- [✓] 19:59:20 通过本人设置恢复用户指定测试密码,19:59:43 使用该密码登录成功,收件列表保留。个人日志显示两次修改密码成功,展开详情结果为 0,未展示密码。临时隔离标签已经关闭;管理员原会话与等待附件的超管页面保留。本例是本人修改密码的独立网页会话撤销,不冒充公共邮箱恢复或邮件协议会话验收。
- [x] 本轮本机操作系统时区发生变化,旧页面的日志日期筛选框与缓存格式化器出现时间显示差异。只读核对本机时区、服务器东八区时间及前端实现后,正常刷新页面,筛选框与日志行按新的本地时区一致显示。没有修改系统时区或业务代码;动态切换时区后旧页面免刷新一致性仍未完善,不将该现象认定为数据库时间损坏。
- [✓] 原交互式 SSH 会话明确退出后,使用严格主机密钥校验及密码重新登录;20:02:34 确认 Smail、Nginx 均运行。没有因观察超时重启服务或浏览器工具。
- [!] 超管发件页仍未添加附件;管理员恢复页仍停在邮箱验证码输入步骤。本段没有重复请求验证码,也没有绕过上传工具路径限制。附件验收、新版公共恢复成功审计、外域收发、真实协议客户端、全新推送、超级管理员本机恢复和证书续期等上线门槛继续未关闭。