# 密码恢复实机验收 ## 本轮需求 - [~] 管理员、普通用户通过已验证外部邮箱及离线安全凭据恢复密码。 - [~] 超级管理员登录后通过外部安全邮箱验证码修改密码。 - [~] 超级管理员通过部署端受保护本机通道重置密码。 - [x] 管理员、普通用户的一次性恢复页面复用现有 Web 域名和 HTTPS 证书,固定入口为 `https://Web域名/rest/`。 ## 当前实现边界 - 普通用户邮箱恢复通过后可以设置新密码。 - 管理员邮箱恢复通过后仍需要未使用的离线恢复码。 - 离线恢复需要密保问题、密保答案和离线恢复码,不是只填写一个安全码。 - 超级管理员不能通过公开忘记密码接口恢复。登录后安全中心使用已验证外部邮箱验证码改密。 - 公开恢复邮件由 `no-reply@主邮件域名` 发送,邮件中的一次性链接使用 Web 域名,不再配置独立恢复域名或额外证书。 - 旧 `adminRecovery` 配置仅保留兼容读取,不在配置页面展示,也不参与恢复路由和证书域名计算。 - 改密成功会使旧会话和相关恢复、客户端凭据失效;测试后需要重新配置下一轮所需凭据。 ## Linux 本机通道部署整改 - 部署根目录为 `/opt/smail`,配置、证书、数据和日志保持原位置。 - 主服务使用 `smail` 系统账户,低端口仅通过 `CAP_NET_BIND_SERVICE` 授权。 - `smail-admin` 使用 root 和系统服务上下文,仅通过 `/run/smail/admin-control.sock` 通信。 - 恢复服务不允许开机自动运行,且只允许向本机密码代理临时目录写入交互请求。 - 安装前拒绝覆盖运行中程序,旧程序和服务文件备份到 `/var/backups`,不覆盖业务配置、数据库或证书。 部署人员在可信终端执行 `systemctl start smail-admin`,并按密码代理提示无回显输入两次新密码;如终端没有收到提示,可在另一个可信终端执行 `systemd-tty-ask-password-agent --query`。不得把密码放到命令行、环境变量或日志里。 ## 验收说明 Web 功能使用 MCP 模拟键鼠测试;终端用于源码检查、构建、部署、授权范围内的数据备份清理以及本机重置工具本身的交互,不调用业务 API 代替页面验收。2026 年 9 月 16 日用户已授权清理测试数据,本轮限定在 `yunx-test`,先备份所有测试数据库再清空,保留数据库文件并重新执行初始化。不得将此授权扩大到其他部署环境。 具体测试结果记录到 `test-log/日期/测试log`;收到验证码、页面提示请求已受理、构建成功均不单独等于密码恢复闭环完成。 本轮结果见《清库部署测试记录》。 ## 2026-09-18 正式管理员登录恢复 本次需求是诊断用户反馈的账号密码错误和后端无响应,恢复正式实例登录,并复核刷新后的会话。正式部署位于 `47.108.78.12:/opt/smail`,网页为 `https://mail.solit.cn/`。此次属于现有实例故障恢复,保留业务数据库和邮件,不执行首次安装清库流程。 - [✓] 核对实际运行进程打开的数据库为 `/opt/smail/data/smail.db`。用户表只有 `admin`(超级管理员)和 `remotecheck`(普通用户),没有反馈中的 `xuans`。 - [✓] 浏览器提交反馈账号时,登录请求约 293 毫秒返回 HTTP 200、业务错误 100、账号或密码错误。现有管理员使用用户提供的密码也失败。现场证据支持账号及密码不匹配,未观察到后端无响应。 - [✓] 重置前使用 SQLite 在线备份保存至 `/var/backups/smail-login-recovery-20260918-0xb3EO/smail.db`,完整性检查为 `ok`。目录权限 0700,备份权限 0600。 - [✓] 使用项目现有 `smail-admin` 服务及系统密码代理,无回显输入两次用户提供的新密码。通过受保护本机通道恢复现有超级管理员,服务结果 `success`、退出码 0;会话和安全版本递增至 2,旧会话及相关安全凭据按既有规则撤销。 - [✓] 浏览器用 `admin` 和用户提供的密码重新登录,显示超级管理员及收件箱。最终再次登录约 393 毫秒,邮件列表约 47 毫秒;忽略缓存刷新后仍保持登录,用户信息和邮件列表均返回 HTTP 200。 - [✓] Smail 与 Nginx 均持续 active,Smail PID 605706,自动重启次数为 0。未清库、未改用户名、未创建替代账号、未引入部署或续期脚本。 ### 公网恢复入口修复 通过已登录管理员的配置页面,将公网 HTTPS 端口由未设置改为 443,保留 HTTP 8001、HTTPS 8002 及 `direct` 模式。页面执行候选配置保存和应用,应用接口业务错误码为 0,正式配置代次从 2 升至 3,磁盘配置确认 `http.publicHttpsPort=443`。 浏览器访问 `/public-password-recovery`,成功跳转至 `https://mail.solit.cn/rest/#/forgot-password`,显示中文找回密码表单,返回登录按钮正常。服务器探测入口返回 302,目标为不含内部端口的 `https://mail.solit.cn/rest/`。本次验证覆盖入口及页面,没有发送恢复邮件,不代表外部邮箱改密闭环完成;超级管理员仍通过受保护本机通道恢复。