残留批次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
@@ -307,6 +307,25 @@ class AuthStore:
|
||||
"%s:%s" % (target_user_id, role),
|
||||
)
|
||||
|
||||
def remove_member(self, project_id, actor_user_id, target_user_id):
|
||||
"""删成员:只有 owner 能删,否则 raise PermissionError;同时记审计。"""
|
||||
if self._member_role(project_id, actor_user_id) != "owner":
|
||||
raise PermissionError(
|
||||
"only project owner can change members"
|
||||
)
|
||||
self.conn.execute(
|
||||
"DELETE FROM project_members"
|
||||
" WHERE project_id = ? AND user_id = ?",
|
||||
(project_id, target_user_id),
|
||||
)
|
||||
self.conn.commit()
|
||||
self.audit(
|
||||
actor_user_id,
|
||||
project_id,
|
||||
"remove_member",
|
||||
target_user_id,
|
||||
)
|
||||
|
||||
def check_permission(self, user_id, project_id, action):
|
||||
"""检查权限:满足最低角色返回 True,否则 False(含未加入项目)。"""
|
||||
min_role = _ACTION_MIN_ROLE.get(action)
|
||||
|
||||
Reference in new issue
Block a user