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:
@@ -325,3 +325,42 @@ def test_lifespan_platform_engine_seam_and_bootstrap(tmp_path, monkeypatch):
|
||||
assert [u.username for u in users] == ["bootadmin"]
|
||||
assert verify_password("boot-pw", users[0].password_hash, users[0].salt)
|
||||
assert users[0].must_change_password is True
|
||||
|
||||
|
||||
def test_default_admin_password_warns_at_startup(
|
||||
tmp_path, monkeypatch, caplog):
|
||||
"""终审 I-4:lifespan 启动时 ADMIN_PASSWORD 仍为出厂默认 → 醒目
|
||||
WARNING(生产必须设环境变量);设了自定义值 → 无警示。比较基准 =
|
||||
Settings 字段默认值(与 main.py 同式,改默认值判定自动跟随)。"""
|
||||
import logging
|
||||
|
||||
from app.engine.config import settings
|
||||
from app.main import app
|
||||
from app.platform.registry import TenantRegistry
|
||||
|
||||
def _run_lifespan():
|
||||
app.state.registry = TenantRegistry.load_from_dir(
|
||||
SEED_DIR, data_dir=tmp_path / "tenants")
|
||||
app.state.platform_engine = make_platform_engine(
|
||||
tmp_path / "platform.db")
|
||||
try:
|
||||
with caplog.at_level(logging.WARNING, logger="app.main"):
|
||||
with TestClient(app) as client:
|
||||
assert client.get("/health").status_code == 200
|
||||
finally:
|
||||
app.state.registry = None
|
||||
app.state.platform_engine = None
|
||||
|
||||
# 出厂默认密码 → WARNING 提及用户名与"默认密码"
|
||||
monkeypatch.setattr(settings, "ADMIN_PASSWORD",
|
||||
type(settings).model_fields["ADMIN_PASSWORD"].default)
|
||||
_run_lifespan()
|
||||
assert any("默认密码" in r.getMessage()
|
||||
and settings.ADMIN_USERNAME in r.getMessage()
|
||||
for r in caplog.records)
|
||||
|
||||
# 自定义密码 → 无该警示
|
||||
caplog.clear()
|
||||
monkeypatch.setattr(settings, "ADMIN_PASSWORD", "n0t-default-pw")
|
||||
_run_lifespan()
|
||||
assert not any("默认密码" in r.getMessage() for r in caplog.records)
|
||||
|
||||
Reference in New Issue
Block a user