From 37765ff2f0d6d3a781171c18360e98a538d48a2b Mon Sep 17 00:00:00 2001 From: xuans Date: Sun, 4 Oct 2026 07:56:04 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E6=AD=A3=E6=89=A7=E8=A1=8C=E7=A7=9F?= =?UTF-8?q?=E7=BA=A6=E8=BF=81=E7=A7=BB=E6=95=85=E9=9A=9C=E6=B3=A8=E5=85=A5?= =?UTF-8?q?=E5=B9=B6=E8=AE=B0=E5=BD=95=E4=B8=89=E5=BA=93=E5=A4=8D=E5=AE=A1?= =?UTF-8?q?=E8=AF=81=E6=8D=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../database/dns_execution_migration_test.go | 24 ++++++++++++++++--- doc/DNS多账户整改任务清单.md | 6 +++++ doc/Linux生产流程测试记录.md | 6 +++++ doc/Scert开发任务清单.md | 2 ++ doc/Scert整改任务执行清单.md | 2 ++ doc/Scert整改合并优化清单.md | 2 ++ doc/核心能力任务规格.md | 1 + 7 files changed, 40 insertions(+), 3 deletions(-) diff --git a/backend/internal/database/dns_execution_migration_test.go b/backend/internal/database/dns_execution_migration_test.go index 7e13bf8..a3fb588 100644 --- a/backend/internal/database/dns_execution_migration_test.go +++ b/backend/internal/database/dns_execution_migration_test.go @@ -4,7 +4,7 @@ import "testing" func TestMySQLDNSExecutionInterruptedMigration(t *testing.T) { f := startRealMySQL(t) - for _, boundary := range []string{"before-create", "after-create", "with-record", "bad-column", "bad-index", "bad-collation"} { + for _, boundary := range []string{"before-create", "after-create", "with-record", "bad-column", "bad-index", "bad-collation", "bad-column-collation"} { t.Run(boundary, func(t *testing.T) { db := f.database(t) mysqlPrepareVersion(t, db.DB, 28) @@ -18,8 +18,26 @@ func TestMySQLDNSExecutionInterruptedMigration(t *testing.T) { mysqlDeploymentExec(t, db.DB, "ALTER TABLE dns_execution_leases MODIFY COLUMN account_revision INT NULL") case "bad-index": mysqlDeploymentExec(t, db.DB, "ALTER TABLE dns_execution_leases DROP INDEX uq_dns_leases_attempt") - case "bad-collation": - mysqlDeploymentExec(t, db.DB, "ALTER TABLE dns_execution_leases CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci") + case "bad-collation", "bad-column-collation": + var before, after string + query := `SELECT table_collation FROM information_schema.tables WHERE table_schema = DATABASE() AND table_name = 'dns_execution_leases'` + if err := db.DB.QueryRowContext(t.Context(), query).Scan(&before); err != nil { + t.Fatal(err) + } + // 必须真正改变排序规则,不能把测试库默认值当作故障注入。 + collation := "utf8mb4_bin" + if before == collation { + collation = "utf8mb4_unicode_ci" + } + statement := "ALTER TABLE dns_execution_leases CONVERT TO CHARACTER SET utf8mb4 COLLATE " + collation + if boundary == "bad-column-collation" { + statement = "ALTER TABLE dns_execution_leases MODIFY COLUMN task_id VARCHAR(64) CHARACTER SET utf8mb4 COLLATE " + collation + " NOT NULL" + query = `SELECT collation_name FROM information_schema.columns WHERE table_schema = DATABASE() AND table_name = 'dns_execution_leases' AND column_name = 'task_id'` + } + mysqlDeploymentExec(t, db.DB, statement) + if err := db.DB.QueryRowContext(t.Context(), query).Scan(&after); err != nil || before == after { + t.Fatal("排序规则故障注入未实际生效", err) + } default: conflict = false } diff --git a/doc/DNS多账户整改任务清单.md b/doc/DNS多账户整改任务清单.md index c2140ad..8aaaa13 100644 --- a/doc/DNS多账户整改任务清单.md +++ b/doc/DNS多账户整改任务清单.md @@ -1,5 +1,11 @@ # 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 的挑战记录。 diff --git a/doc/Linux生产流程测试记录.md b/doc/Linux生产流程测试记录.md index f0d0a84..6822435 100644 --- a/doc/Linux生产流程测试记录.md +++ b/doc/Linux生产流程测试记录.md @@ -2,6 +2,12 @@ ## 2026年10月4日07:40 执行租约复审准备 +### 07:55 第一台终态与故障夹具修正 + +- `scert-dns-leases-20261004-0743.service` 于 07:50:38 结束,failed、退出一。固定 `f17ea6c` 的 Linux 全量、vet 通过;三库租约及原子绑定单轮竞态通过:SQLite 3.19 秒、MySQL 16.54 秒、PostgreSQL 2.83 秒,均实际执行;仓储包 23.616 秒。源码工作区仍干净。 +- MySQL 迁移专项 38.94 秒失败,唯一失败为 bad-collation:原夹具设置 utf8mb4_unicode_ci,而隔离库本就使用该值,没有制造冲突。其余五个边界通过;证书 2.639 秒、HTTP 3.345 秒专项通过,整轮不计成功。 +- 已将故障注入改为与实际规则不同的限定值并验证生效,另加列级排序规则冲突;产品迁移校验逻辑未放宽。检查点 `eab5ba9` 已推送,修正及授权探测增量待第一台新提交复审。 + ### 07:51 运行状态与授权探测增量 - 第一台干净 `f17ea6c99e3bd4472813853294347bdfad0b8b17` 已于 07:43:33 运行 `scert-dns-leases-20261004-0743.service`;观察 07:49:16 为 active/running,已进入 MySQL 租约专项,仍待最终结果。 diff --git a/doc/Scert开发任务清单.md b/doc/Scert开发任务清单.md index 001b740..7c1e184 100644 --- a/doc/Scert开发任务清单.md +++ b/doc/Scert开发任务清单.md @@ -2,6 +2,8 @@ ## 2026年10月4日07:40 DNS 执行链进展 +07:55 实库结果:第一台 `f17ea6c` 的 Linux 全量、vet 和三库执行租约及原子创建专项通过;整轮因 MySQL 故障注入无效而失败,已修正夹具并新增列级排序规则用例,待连同授权探测增量复审。 + 07:51 补充:补齐授权探测临时 TXT 的逐域名授权和不确定清理引用保护,本地三包及 vet、十轮专项通过;本轮第一台旧提交验证仍在运行,不能提前计入探测增量。 - [x] 独立账户执行租约已接通证书任务与自动续期执行器,重试依真实尝试序号重新授权,不允许系统凭据回退。 diff --git a/doc/Scert整改任务执行清单.md b/doc/Scert整改任务执行清单.md index b19a967..06dc51f 100644 --- a/doc/Scert整改任务执行清单.md +++ b/doc/Scert整改任务执行清单.md @@ -2,6 +2,8 @@ ## 2026年10月4日07:40 执行租约边界复核 +07:55 实库结果:第一台 Linux 全量、vet、三库租约与原子创建竞态通过。MySQL 迁移故障夹具未注入真实排序规则差异导致整轮失败,修正并补列级冲突后待复跑;授权探测增量仍需独立复审。 + 07:51 补充:授权探测的临时 TXT 与 ACME 挑战一样受租约保护,每域名重新授权,探测失败保留未知外部状态引用。本地三包及 vet、专项十轮通过,第一台增量待验证。 - [x] 完成租约迁移二十九、真实任务授权、固定凭据引用、取消清理及活动引用保护;新建域名与首次绑定改为原子事务。 diff --git a/doc/Scert整改合并优化清单.md b/doc/Scert整改合并优化清单.md index b209463..66203d2 100644 --- a/doc/Scert整改合并优化清单.md +++ b/doc/Scert整改合并优化清单.md @@ -2,6 +2,8 @@ ## 2026年10月4日07:40 执行租约与原子创建进度 +07:55 实库结果:`f17ea6c` 第一台 Linux 全量、vet 和三库租约/原子创建竞态通过;整轮仍失败,MySQL 排序规则故障夹具未实际改变默认值。现已修正故障注入并增加列级冲突验证,待与授权探测增量一起复审,不修改产品拒绝规则来迁就测试。 + 07:51 补充:授权探测也已纳入逐域名租约校验及不确定清理引用保护,本地三包全量与 vet、独立账户十轮专项通过。第一台 `0743` 单元验证固定 `f17ea6c`,仍待终态;探测增量需另行 Linux 复审。 - [x] P1-03 已接入真实任务尝试的 DNS 执行租约,固定账户版本及秘密引用;取消后使用原凭据清理,清理或释放不确定则保留引用。未实现的崩溃遗留核对与安全回收仍是门禁。 diff --git a/doc/核心能力任务规格.md b/doc/核心能力任务规格.md index 5e3edd2..a2c8113 100644 --- a/doc/核心能力任务规格.md +++ b/doc/核心能力任务规格.md @@ -2,6 +2,7 @@ ## 2026年10月4日07:40 DNS 执行与原子绑定契约 +- MySQL 迁移恢复必须拒绝表级和列级排序规则冲突;故障测试必须先确认注入后的规则确实不同,不能使用库的默认值伪造冲突场景。该修正不改变产品迁移规则。 - 授权探测同样可能写临时 TXT,每个域名调用前必须核验取消状态和真实租约。探测错误无法确认外部清理时保留引用,即使 ACME Provider 尚未创建;之后的成功探测不得清除先前未知状态。 - 新建域名可携带 `dns_account_id`、`dns_account_revision`;绑定标识由服务端生成,域名、绑定、审计共用事务。普通资料更新拒绝这些初始绑定字段,编辑仍使用独立绑定接口及真实旧令牌。 - 租约绑定真实运行中的任务、尝试、序号、项目、域名、账户版本及秘密引用。自动续期必须同时满足服务端调度标记、真实无操作者续期任务和域名启用续期;手工重试额外要求重试权限。