残留批次A:成员删除、PR needs_local_worker 落库、推送 DNS TOCTOU
- 成员删除:DELETE /projects/{id}/members/{user_id},限 owner 或
全局管理员,禁删唯一 owner,记 remove_member 审计
(AuthStore.remove_member + server 分发,沿用 PATCH 守卫口径)
- PR needs_local_worker 落库:非 local 扫到 queued 任务时 CAS
写行状态为 needs_local_worker;claim/find_open 同步认该状态,
标记过的行仍可被 local worker 认领、不被搁置;另修
claim/find_open 对裸 sqlite3 tuple 行的 dict() 兜底
(TypeError/ValueError)
- 推送 DNS TOCTOU:发送改走建连时解析+判段的连接类,解析
一次、只拨判过的 IP,Host/SNI 仍为原域名;opener 直接构造
以排除 ProxyHandler 改写(build_opener 默认会塞代理)
This commit is contained in:
1 parent
6e3eb7ba11
commit
9bb9a50e4e
10 files changed
+725
-38
No files matched your search
@@ -449,7 +449,8 @@ class P1WorkerTestCase(unittest.TestCase):
|
||||
self.assertEqual(_status(self.db_path, "T1"), "failed")
|
||||
self.assertEqual(self.calls, [])
|
||||
|
||||
# 15. PR 非 local:显式 needs_local_worker,任务与排队都不动
|
||||
# 15. PR 非 local:显式 needs_local_worker,行状态持久化,
|
||||
# 任务本身不动,标记过的行仍可被 local worker 认领
|
||||
def test_pr_non_local_needs_local_worker(self):
|
||||
conn = sqlite3.connect(self.db_path)
|
||||
try:
|
||||
@@ -470,9 +471,14 @@ class P1WorkerTestCase(unittest.TestCase):
|
||||
row = conn.execute(
|
||||
"SELECT status FROM pr_jobs WHERE id = ?",
|
||||
(job_id,)).fetchone()
|
||||
self.assertEqual(row[0], "needs_local_worker")
|
||||
# 标记过的行仍可被 local worker 认领,不会被搁置。
|
||||
from cloud.pr_exec import claim_pr_job
|
||||
claimed = claim_pr_job(conn, "test-host")
|
||||
self.assertIsNotNone(claimed)
|
||||
self.assertEqual(claimed["id"], job_id)
|
||||
finally:
|
||||
conn.close()
|
||||
self.assertEqual(row[0], "queued")
|
||||
|
||||
# 16. 多文件签名 + 签名缺失/已变时认领 fail-closed
|
||||
def test_code_signature_multi_file_and_claim_refusal(self):
|
||||
|
||||
Reference in new issue
Block a user