Scert/doc/DNS多账户整改任务清单.md
xuans 60b1b981db 更新邮件配置与第一台部署测试进度
补充 2026 年 10 月 4 日邮件配置确认、第一台候选包部署、运行边界及未完成验收项记录。
2026-10-04 11:47:35 +08:00

171 lines
22 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.

# DNS 多账户整改任务清单
## 2026年10月4日07:54 第一台实库故障注入复核
- [✓] 第一台 `f17ea6c` Linux 全量与 vet 通过;三库租约、原子创建和轮换竞争专项通过,证书及 HTTP 专项通过。
- [!] `0743` 单元于 07:50:38 失败退出一:MySQL 迁移 bad-collation 测试将表改为测试库本就使用的 unicode 排序规则,未实际注入冲突,导致预期拒绝但迁移成功。原失败保留,不能标记整轮通过。
- [~] 检查点 `eab5ba9` 已推送;故障注入改为与实际排序规则不同的限定值,并增加列级排序规则冲突及注入确实生效断言。待第一台固定新提交复跑,同时验证授权探测增量。
## 2026年10月4日07:45 授权探测引用保护
第一台 `scert-dns-leases-20261004-0743.service` 正在验证固定提交 `f17ea6c`,不停止、不重启该任务。复核发现授权探测同样可能写临时 TXT,不能只保护 ACME Provider 的挑战记录。
- [✓] 修改前检查点 `88aa5bb` 已推送;首次鉴权失败后重推成功。
- [x] 每个域名授权探测前重新验证租约及取消状态,防止读取凭据后撤权仍写 DNS。
- [x] 探测返回错误而外部清理未知时保留租约,不能以尚未创建 ACME Provider 为由释放引用;后续域名成功也不能清除先前未知状态。
- [✓] 本地证书、HTTP、app 三包全量和 vet 通过;独立账户专项十轮通过,补取消、撤权、多域名与清理未知测试。源码换行检查通过。
- [~] 第一台增量复审待执行;原 `0743` 单元仍在验证固定旧提交,不将其结果算作探测保护增量已通过。
## 2026年10月4日07:30 执行租约边界复核
沿用已确认的 Linux 与 Web 整改范围。修改前检查点 `7a3b78d` 已提交推送,未跟踪文件 `=` 保留。本批不操作第二台业务、不干扰浏览器发信配置。
- [x] 对比完整签发配置,拒绝时间戳相同但域名、SAN、证书类型、环境等资料已经变化的旧快照;SAN 按解码数组比较。
- [x] 底层域名更新和删除已补齐同一域名锁及活动租约保护,任务终态也不能绕过;证书状态更新仍正常进行,释放后可更新、删除。
- [x] 域名更新、删除遇到活动租约返回 409,接口回归验证不泄露租约标识或凭据引用。
- [✓] 本地五包全量及 vet 通过;仓储租约专项十轮、原子创建和租约冲突接口五轮通过。前端重新执行全量 339 项及构建通过。MySQL、PostgreSQL 本地跳过,不算实库证据。
- [~] 待提交干净源码并在第一台执行 Linux 全量与三库专项;本轮新迁移及租约尚未获得实库证据。
首轮新增 SAN 等价编码测试失败,原因是夹具单域名 SAN 实际包含主域名,不能改为空数组后声称等价;现已使用原 SAN 的缩进 JSON,保留实际语义。未据测试错误放宽产品校验。
## 2026年10月4日07:01 执行租约接入任务
沿用已确认的独立账户完整生命周期需求,本批不处理 Windows、不变更正式配置。检查点 `73dba28` 已提交推送。
- [x] 增加持久化执行租约,固定域名、绑定、账户版本、秘密引用及真实任务尝试;手工任务实时校验权限,自动续期必须核验真实调度身份。
- [x] 签发、续期和重试执行器已接通租约;独立账户不读取系统凭据,DNS 操作使用固定账户,取消后仍允许原凭据清理挑战记录。真实 DNS/ACME 全流程待验收。
- [x] 活动租约期间拒绝账户变更和绑定切换;释放失败或挑战清理不确定时保留租约,不按时间到期猜测可以回收秘密。
- [x] 新建域名与初始账户绑定、审计已改为同一事务,前端一次提交,不再出现先创建后绑定窗口。
- [~] 已补迁移、权限、并发、取消和清理失败测试,本地五包与前端通过;第一台 Linux 与三库复审待执行。
租约记录是不可变执行快照,不随任务历史清理级联删除。崩溃遗留租约的外部 TXT 核对及安全回收仍属完整 P1-03 门禁,不能仅凭任务终态或租约年龄释放。
## 2026年10月4日06:51 域名账户选择与 Linux 复审结果
- [✓] 第一台干净 `412c51f` 的 `0630` 单元 06:45:57 结束,inactive/success、退出码零;Linux 全量、vet 通过。单轮竞态仓储 17.076 秒、HTTP 23.331 秒;SQLite、MySQL、PostgreSQL 项目目录均实际运行通过,PostgreSQL 非跳过。
- [x] 域名表单读取实时绑定和账户目录,显示账户、服务商、用户归属;只选同项目已启用、验证通过且凭据可用的独立账户。原账户不可用时保留真实绑定,不擅自清空。
- [x] 新建与编辑依次保存资料、显式 DNS 绑定、服务器关联;绑定使用真实旧令牌和选定账户版本。不同服务商切换由绑定事务更新元数据,解除必须显式选择,切换 HTTP-01 需先解除保存。
- [x] 绑定失败停止后续保存,409 或网络不确定不自动重放、不使用系统凭据兜底;已创建的域名或成功绑定不因后续服务器关联失败重复创建、绑定。重新读取后核对真实状态再操作。
- [✓] 新增 24 项逻辑、2 项渲染回归;相关 46 项通过,前端全量 336 项零失败零跳过,生产构建 103 模块及差异检查通过。覆盖固定目标、跨项目、异常响应、迟到响应、卸载和保存中重复操作。
- [~] 最新域名页面尚未上线及浏览器验收。执行租约、真实签发/续期/重试、旧账户幂等导入、安全删除回收与生产门禁仍未完成,P1-03 保持进行中。
## 2026年10月4日06:44 域名表单接入任务
沿用上方总目标及下方已确认需求,不缩减独立账户签发、续期和重试范围。
- [✓] 修改前检查点 `122291f` 已提交推送;首次鉴权失败后重推成功,未跟踪文件 `=` 保留。
- [~] 第一台干净 `412c51f` 的 `scert-dns-ui-20261004-0630.service` 已实际启动,执行 Linux 全量、vet 和三库目录及接口竞态;观察时 active/running,不提前计为通过。
- [~] 域名表单读取真实 DNS 绑定、按项目选择已启用且验证通过的独立账户,并保留历史配置兼容入口。
- [ ] 接通新建及编辑保存,固定目标、绑定令牌和账户版本;部分成功不重复创建,冲突或结果不确定时必须刷新,禁止静默降级。
- [ ] 覆盖迟到响应、卸载、跨项目、轮换、禁用、绑定失败、服务器关联失败后的重试及页面渲染。
- [ ] 继续执行租约、旧账户导入、安全删除回收与真实签发续期;当前不发布过渡版本,不关闭 P1-03。
## 2026年10月4日06:28 页面生命周期开发结果
- [✓] 第一台 `0610` 单元已 inactive/success、退出码零;`c80530f` 单轮三库竞态通过:数据库 81.666 秒、仓储 37.304 秒、证书 1.032 秒、HTTP 22.561 秒。包含历史排序规则与错误列排序规则用例,修复获得实库证据。不是原 `0555` 三轮通过。
- [x] DNS 账户页接入新建、改名、启停、凭据轮换和指定授权域名在线验证;归属用户保持展示,归属项目显示名称;历史系统账户只读标记,尚未提供删除按钮。
- [x] 项目列表增加 `can_manage_dns`,按超级管理员或项目管理员、DNS 管理员角色实时计算;界面按项目能力显示操作,服务端写入仍实时核权。服务商目录仅含公共字段定义,允许已认证项目用户读取,实际系统 DNS 测试及系统设置权限不放宽。
- [x] 原生对话框、双列输入、鼠标悬浮说明、列表内滚动及固定表头;保留 5/10/15/30 分页。凭据不回填、不持久化,提交、取消、刷新、切换服务商和卸载时清空;409 不自动重放,网络中断提示结果未确认。
- [✓] 新增 24 项前端专项;前端全量 310 项及生产构建通过。HTTP 全包 27.129 秒、仓储全包 7.944 秒及两包 vet 通过。本地外部数据库跳过不计实库。
- [x] 初次后端回归发现两项旧测试把只读服务商目录当作全局管理员边界;已按新契约验证所有登录用户可读目录,并将管理员拒绝用例移到真实系统 DNS 写操作,未删除权限负向检查;复跑通过。
- [~] 本批页面与权限代码等待第一台干净源码 Linux 复审和真实浏览器验收;当前没有升级正式服务,没有操作第二台或修改发信配置。
- [ ] 域名表单账户选择、执行租约与签发续期重试、旧账户导入、安全删除回收和完整生产验收仍待完成,P1-03 不关闭。
## 2026年10月4日06:13 页面接入与实库复跑
- [!] `0555` 单元已实查失败,退出码一;全量和 vet 已完成,三库阶段明确出现磁盘空间不足,不能计为通过,也不能据此判定排序规则修复失败。
- [✓] 已确认相关测试单元终止且不存在隔离数据库进程,只清理 `0538/mysql` 与 `0425/mysql-race`、`0425/mysql-review` 下隔离实例的 `data` 目录;保留日志、源码、工具链、生产数据库和第二台,释放约 3.5 GB。
- [~] `scert-domain-dns-20261004-0610.service` 复用 `c80530f` 干净源码执行单轮三库竞态专项;不重复已完成全量,不将本轮表述为三轮通过。
- [✓] 页面接入前检查点 `7f7b084` 已提交推送。
- [~] 接入新建、改名、启停、轮换和在线验证;项目权限提示只用于界面,后端仍实时判权。凭据不回填、不持久化,旧版本冲突不自动重试写入。
- [ ] 页面单元回归、构建和更新代码的第一台 Linux 复审。
- [ ] 执行租约、实际签发续期、历史导入和安全回收仍未完成,不发布过渡版本,不关闭 P1-03。
## 2026年10月4日05:54 绑定接口与 MySQL 外键兼容修复
06:00(UTC+8)补充:修复已随 `c80530f` 提交推送。第一台 `scert-domain-dns-20261004-0555.service` 正在该提交的真实 Git 干净签出上执行全量、vet 和三库三轮竞态;已实查 active/running,尚无终态。不得重复启动或提前计为通过。源码和日志在 `/var/tmp/scert-domain-dns-20261004-0555`。
- [✓] 修改前检查点 `45798c5` 已推送;第一台原任务已查询至终态,没有因观察超时重复启动。
- [x] 新增域名账户绑定读取和写入接口,显式提供账户、绑定令牌和版本,支持解除;拒绝遗漏、空值、伪造身份字段、跨源、越权、旧版本及在途任务。依赖失败不泄露内部错误,成功审计与绑定同事务。
- [!] 干净 `7a6da6b` 的 Linux 全量及 vet 通过,但三库专项在 MySQL 报外键字段排序规则不兼容,整体单元退出一;不能计为三库通过。旧主键继承历史建库排序规则,新绑定列不能固定为项目标识的排序规则。
- [x] 修复为从历史域名主键读取字符集和排序规则,仅应用于新外键列,并严格校验重入结构;不修改历史父表或数据库默认值,不覆盖冲突表。补数据库默认值改变及错误列排序规则用例。
- [✓] 本地 HTTP API 全量 31.842 秒、数据库全量 27.797 秒及两包 vet 通过;本地外部实库跳过不计实库证据。首次新增测试编译时误用数据库包装对象的方法,已改为底层连接后复跑。
- [~] 等待修复提交的第一台干净源码实库复审。执行租约、旧账户导入、实际签发续期、删除回收和前端仍未接通;不发布过渡版本,不关闭 P1-03。
## 需求与边界(2026年10月4日)
依据《Scert整改合并优化清单》和《核心能力任务规格》P1-03,以及用户已确认的 DNS 账户归属要求执行;不是新增需求。范围仅 Linux 与 Web,第一台部署业务,第二台只验收证书推送。公共域名切换和邮件授权尚待确认,不阻断本项开发。
- 独立保存多个 DNS 账户,显示项目和用户归属,不把固定系统账户列表视为完成。
- 支持账户创建、验证、禁用、轮换和安全删除;凭据保存在现有秘密仓库,不在接口、日志或审计输出明文。
- 域名显式选择账户;签发、自动续期和重试使用同一绑定及实时权限,禁止跨项目使用。
- 兼容旧系统账户,处理域名、任务和旧凭据引用,不在迁移时擅自删除历史配置或密钥。
- 处理账户变更与签发并发,验证结果只能更新对应凭据版本;禁用不能被旧验证响应覆盖。
- 页面保持一页可用;覆盖 SQLite、MySQL、PostgreSQL 迁移、权限与竞态,再做第一台正式部署和实机验收。
## 执行状态
- [✓] 需求已确认:独立账户、用户与项目归属、域名绑定及完整签发生命周期;不能以旧系统账户兼容视图代替多账户。
- [✓] 修改前检查点已提交推送:`26b8c3c`。保留未跟踪文件 `=`,不提交、不删除。
- [x] 账户基础模型和迁移二十七:独立账户元数据、归属、状态、秘密引用和版本号;三库初轮专项通过,等待最终回归复审。
- [x] 基础仓储:实时项目权限、事务审计、版本冲突、轮换后验证失效和禁止公开返回秘密引用;未提供无引用保护的删除方法。
- [✓] 三库迁移和仓储专项三轮竞态通过;MySQL 审计故障夹具权限已修正,失败记录保留。完整执行链仍待实现验证。
- [ ] 旧系统账户导入及幂等恢复,保护配置与历史凭据引用。
- [✓] 域名绑定、原子创建、持久执行租约及数据库引用保护已通过第一台三库专项;安全删除、遗留租约核对和凭据清理尚未完成。
- [✓] 绑定接口严格参数、实时权限、版本竞争、跨源、审计回滚及租约占用回归通过;第一台固定 `37765ff` 全量与专项已结束成功。
- [x] 签发、续期、重试已接入账户解析、固定凭据和执行前权限复核;取消和清理不确定保留引用,真实 DNS/ACME 全流程仍待验收。
- [✓] 账户验证、增改、启停、轮换接口及无缓存和敏感字段隔离通过第一台 Linux 回归;不等于真实云端操作验收。
- [x] DNS 账户页和域名账户选择已实现,前端全量通过;最新正式产物与浏览器复审仍待完成。
- [✓] 第一台 `scert-dns-lease-review-20261004-0757.service` 于 08:04:50 成功结束,11:05 复核终态与干净源码;全量、vet 及单轮三库租约专项通过,日志保留在同名目录的 `review.log`。
- [ ] 最新正式产物升级及第一台生产流程验收。
- [ ] 公共域名真实浏览器和授权 DNS/公共 CA 验收。
## 完成标准
### 2026年10月4日05:34 域名绑定增量
- [x] 迁移二十八新增域名与账户绑定;复合外键约束同项目,允许同一账户绑定多个域名。SQLite 外键关闭时仍有插入、更新、删除、替换保护;MySQL 按建表、索引、两个外键的中断边界校验并恢复,不覆盖冲突结构。
- [x] 绑定仓储要求实时证书管理与凭据使用权限,核对账户版本、启用及验证状态;解除要求证书管理权限。每次绑定生成新令牌,拒绝旧页面覆盖和解除后重绑的旧令牌复用。
- [x] 绑定、域名服务商元数据和成功审计同事务;排队、运行、等待重试及取消中的任务阻止变更。域名删除原子解除引用,不删除账户;普通编辑不能绕过绑定改变验证方式或服务商。
- [x] 域名读取返回账户与绑定标识。执行租约尚未接入,因此签发入口对独立绑定明确拒绝,不能静默使用系统凭据替代;尚未开放绑定接口和页面,不部署此过渡状态作为完整功能。
- [✓] 本地数据库、仓储、证书、HTTP 四包全量通过;追加状态与错误分类用例后,仓储二十轮专项及四包 vet 通过。本地 MySQL/PostgreSQL 未配置而跳过的用例不计实库证据。
- [!] 干净提交 `1dc72f2` 第一台全量任务 `scert-dns-clean-20261004-0514.service` 失败:SQLite 并发锁错误被已有账户更新入口包装成凭据重复错误。已按驱动主错误码及扩展码分类为版本冲突,保留非锁错误拒绝;未放宽原并发断言,待修复版本第一台复跑。
- [~] 本轮先核验干净源码三库迁移、绑定仓储和 Linux 全量,再接旧账户导入、绑定接口、执行租约及签发续期链和前端。完整 P1-03 仍未完成。
只完成数据模型或管理接口不能关闭 P1-03。每阶段记录真实测试结果;外部服务未验证、跳过或仅隔离验证的项目维持未完成。CNAME 委派保留在总清单,不因本项账户开发自动关闭。
## 首轮验证记录(运行环境 UTC+8,2026年10月4日)
- 本地首轮专项发现 SQLite 默认外键开关关闭时引用保护无效;补项目插入、更新、删除、更换标识及替换触发器,不全局修改用户连接参数。首批失败真实保留,不把原代码计为通过。
- 本地领域、数据库和仓储包全量通过;本地未配置的 MySQL/PostgreSQL 实库用例跳过,不计实库证据。新增完整用例后三轮专项和 vet 通过。
- 第一台首轮任务 `scert-dns-accounts-20261004-0425.service` 已 inactive、success、退出码零:三库迁移、账户仓储、MySQL 八种中断/冲突和 vet 通过。日志为 `/var/tmp/scert-dns-accounts-20261004-0425/dns-accounts.log`。
- 增量竞态任务 `scert-dns-accounts-race-20261004-0430.service` 于 04:41 实查为 failed、退出码一;数据库三轮通过,185.274 秒,仓储 SQLite/PostgreSQL 通过,MySQL 三轮均在故障触发器创建时报 1419。修复仅将隔离库触发器注入改用测试管理连接,业务操作继续受限连接,不修改生产权限或全局信任参数。
- [~] 本轮沿用已确认需求:先复核修复后的实库竞态,再接入域名账户绑定及引用保护,随后接续执行链和页面;数据层检查点 `02e0399` 已提交推送,完整功能仍未完成。
- 当前 HTTP 路由、系统旧账户、域名签发配置和线上正式版本均未切换,生产数据及第二台未操作。
## 账户管理接口接入(运行环境 UTC+8,2026年10月4日05:04)
- [x] `/api/v1/dns/accounts` 现在合并独立账户与旧系统账户;独立账户列表只读元数据、不解密凭据,显示真实归属用户,用户已删除时保留原标识并显示缺失状态。旧系统账户仍是兼容视图,未伪装成已完成导入。
- [x] 创建、读取、改名、启停、轮换、验证六条路由已接入真实数据库仓储;写操作检查同源、实时项目权限,创建不能冒领归属或伪造验证结果,修改携带版本号。读取、拒绝和错误响应均禁止缓存。
- [x] 首次验证使用独立的管理权限入口,只读取目标账户的实际凭据并调用现有 DNS 在线验证器;轮换、禁用或撤权后,旧验证结果不得覆盖新状态。不接受客户端自报成功、凭据引用或验证令牌。
- [x] 故障注入覆盖秘密写入/读取失败、服务商错误、验证取消、依赖缺失、审计失败回滚和敏感字段隔离。HTTP 测试使用隔离数据库与注入验证器,不能计为真实云 DNS 成功。
- [✓] 本地 HTTP、仓储、数据库、领域四包全量及 vet 通过;随后新增依赖错误用例后的三轮 HTTP/仓储专项及 vet 通过。本地缺少外部数据库时跳过的用例不计实库证据。
- [✓] 05:09 实查第一台 `scert-dns-accounts-api-20261004-0458.service` 已 inactive、success、退出码零;三库与 HTTP 三轮竞态及 vet 通过。领域 1.023 秒、数据库 185.441 秒、仓储 49.344 秒、HTTP 40.278 秒;日志 `/var/tmp/scert-dns-accounts-20261004-0425/dns-accounts-api-race.log`。此前 `0445` 环境变量错误退出一,失败记录保留。本次为隔离覆盖树,未包含最后追加的依赖故障用例与领域标识生成器复用,须由后续干净源码回归补齐。
- [ ] 旧系统账户导入、域名绑定、执行租约、引用回收和安全删除、签发/续期/重试、前端操作仍未完成。旧秘密及提交结果不确定时的新秘密暂时保留,不能在缺少引用保护时误删;这不是完整回收方案。
- [ ] 完成当前实现复审后,提交干净源码并在第一台做 Linux 全量;本批不重复正式升级,不操作第二台,不把接口进展当作生产验收。
## 2026年10月4日最新执行进度:邮件配置确认与第一台候选部署
本轮仅操作第一台 `8.137.23.95`,第二台 `45.136.13.241` 未操作;没有清理业务数据库,没有创建辅助验收脚本,没有远端备份,没有开放新的公网端口,也没有使用或生成 SSH 密钥材料。
- [x] 旧系统 DNS 账户启动导入已完成编码,固定标识为 `legacy-system-dns`,重复启动幂等,保留现有账户修改并拒绝固定标识冲突;仓储、应用、HTTP API、通知定向测试及 `go vet` 通过。
- [x] 提交 `920b318` 已提交并推送;使用干净 worktree 生成 Linux amd64 候选包,`source_dirty=false`、`trimpath=true`、`local_path_check=passed`,归档 SHA-256 为 `0d2f05892f223c96c305e792a424ccc84905dcb57c0179be3732ff83b668bdc4`。
- [x] 最新候选包已通过密码 SSH 部署到第一台;归档 `SHA256SUMS` 全部通过,服务器 `/scert/scert` 摘要与候选包一致,`Scert.service` 和 `Scert-storage.socket` active。
- [x] 第一台运行边界复核通过:公网仅由 Nginx 提供 `80/443`,Scert 监听 `127.0.0.1:8443`,MySQL 仍为回环监听;没有新增外部业务端口。
- [x] 通过域名页面登录并只读核对超级管理员邮件配置:SMTP 已启用,`smtp.cdis.cn:587`、STARTTLS、系统通知用户名和收件人已保存,凭据已配置且未回显;未读取、记录或覆盖邮件密码。
- [!] 真实系统发信及收件箱送达尚未通过:网页公开密码恢复流程按设计不发验证码;本轮本机 `Scert-admin` 重置会话未形成有效请求并退出,未修改密码,也没有把失败结果误判为发信成功。
- [!] 服务启动日志仍保留历史中断部署事务缺少可信站点恢复基线,继续等待人工核查;未自动接管、删除锁或改写事务终态。
- [~] 待从真正保持前台终端的本机管理员会话重新验证验证码发送与密码重置闭环;随后继续三数据库首次 Web、DNS/ACME 正负向、真实证书部署回滚和公共域名严格 TLS 验收。
当前结论:第一台最新候选已运行,邮件配置已确认保存,但生产整体验收仍未通过;第二台仍只保留给后续证书推送、重载和回滚测试。