fix: 终审修复——站点停用接线/prefix查重补创建reset/默认凭据警示+取舍补录
- I-1 站点停用全链接线: Site 数据类加 status 字段; DB 源 _load_one 与 文件源 read_tenant 均只输出 active 站点(停用站点域名不进 registry 索引 → 该域名 404;全停用=合法运营状态输出空 sites;文件源无 status 键默认 active 兼容)。E2E: PATCH 站点 disabled → 其域名 404、复启用 恢复;源级直测两源过滤。 - I-3 prefix 跨租户查重补两口: db.other_push_prefixes 共用助手 (MAX(version) 逐租户当前前缀,排除自身);创建向导(出厂档案前缀被占 → 400 提示改 blank/改占用方)与 reset push(重置回出厂撞车 → 400 提示 走 PUT)接入;PUT 原有查重改用同一助手。rollback 维持豁免(历史不可变 语义优先,取舍清单记档)。既有测试第二租户改 blank profile 避撞。 - I-4 默认凭据警示: lifespan 启动检测 ADMIN_PASSWORD 仍为 Settings 字段 默认值(非硬编码第二份,防双源漂移)→ logger.warning 醒目提示; CLAUDE.md Phase 4 部署记档补 ADMIN_PASSWORD 生产要求。 - I-2/M-2 取舍补录: 密钥掩码未实现(GET config/settings 明文返回 api_key/smtp 密码,Phase 3 前须定 __SET__ 哨兵方案);站点管理权限现为 仅超管(Phase 3 对接时决策放开或改 spec);取舍清单第 2 条同步刷新 (rollback 现为唯一豁免口)。 全量回归: 571 passed(基线 566 + 新增 5)。 Co-Authored-By: Claude Code <noreply@anthropic.com>
This commit is contained in:
@@ -50,6 +50,7 @@ from app.platform.db import (
|
||||
SiteDomain,
|
||||
Tenant,
|
||||
TenantConfigVersion,
|
||||
other_push_prefixes,
|
||||
write_config_version,
|
||||
)
|
||||
from app.platform.registry import _normalize_host
|
||||
@@ -227,6 +228,18 @@ async def create_tenant(
|
||||
detail=f"管理员用户名已被占用: {body.admin_username!r}")
|
||||
for domain in domains:
|
||||
await _assert_domain_free(session, domain)
|
||||
# push.prefix 跨租户查重(终审 I-3):首版快照带出厂 prefix——同
|
||||
# profile 第二个租户必撞(jiancai=ai-kefu-jc / auto=ai-kefu),
|
||||
# spec E1 前缀全局唯一防 CRM 线索串号,创建期就拦。blank 出厂
|
||||
# prefix 为空串,不参战(与 config_validation 同款空串豁免)。
|
||||
prefix = (snapshot.get("push") or {}).get("prefix")
|
||||
if (isinstance(prefix, str) and prefix
|
||||
and prefix in await other_push_prefixes(session, None)):
|
||||
raise HTTPException(
|
||||
status_code=400,
|
||||
detail=f"出厂档案的 push.prefix {prefix!r} 已被其他租户占用"
|
||||
f"——请改用 blank profile(创建后经配置 API 改前缀)"
|
||||
f"或先修改占用方前缀")
|
||||
|
||||
tenant = Tenant(slug=body.slug, name=body.name, status="active",
|
||||
profile=body.profile)
|
||||
|
||||
Reference in New Issue
Block a user