Skip to content

fix(core): structure_service 输入校验收口——参数类型错误不再谎报 StorageError - #1149

Closed
STARDUSTLC666 wants to merge 2 commits into
FuRongJun-1999:mainfrom
STARDUSTLC666:fix/1107-structure-validation-20261030
Closed

STARDUSTLC666 wants to merge 2 commits into
FuRongJun-1999:mainfrom
STARDUSTLC666:fix/1107-structure-validation-20261030

Conversation

@STARDUSTLC666

Copy link
Copy Markdown
Contributor

修复 #1107(medium×3,core/structure_service 输入校验缺口):

改了什么 / 为什么

  • event_history / structure_history:limit 必须是 1..200 的整数(bool 也拒),before_rowid / before_revision 必须是正整数或 None。旧实现靠 max(1, min(limit, 200)) 静默归一,字符串游标在 SQLite 里因类型序恒真(静默回第一页),NaN 绑成 NULL,超大整数 OverflowError。
  • get_proposal / target_status / approve / review 的 proposal_id / aggregate_key 过 _text;review(note=None) 要求 note 是文本;propose(event_id='')、record_version_result(instance_id=123) 等参数类型错误在进入 SQL 前抛 WriteError。
  • load_service 的 grant 解析提取为 _parse_grant:capabilities / instances 必须是字符串数组;字符串不再被 frozenset() 拆成单字符集(授权面反转),缺字段/非数组启动即拒(fail-closed)。

验证方式与读数

# 改前(3552ec3)
event_history limit=2.5          -> IntegrityError: datatype mismatch
event_history before_rowid='abc' -> OK(回到第一页,cursor 5/4)
event_history before_rowid=10**100 -> OverflowError
get_proposal({})                 -> ProgrammingError: type 'dict' is not supported
propose(event_id='')             -> IntegrityError: FOREIGN KEY constraint failed
frozenset('instance-1')          -> ['-', '1', 'a', 'c', 'e', 'i', 'n', 's', 't']

# 改后:以上全部 WriteError(点名参数),grant 字符串/非数组启动即拒

python -X utf8 tests/test_issue1107_structure_service_validation.py            # 通过 24 / 失败 0
python -X utf8 tests/test_issue1107_structure_service_validation.py --mutate   # 3 条变异各自恰好命中
# 基线对照(origin/main 的两个文件):通过 2 / 失败 22(C01/C02 对照绿)
python -m pytest tests/test_structure_anchor.py tests/test_structure_events.py \
  tests/test_structure_read_deadline.py tests/test_structure_record_extra_tags.py \
  tests/test_structure_write_lock_order.py tests/test_structure_writer.py -q
# 49 passed, 2 skipped
实测 未改基线 3552ec3 本分支
limit=2.5 / True IntegrityError / 当 1 用 WriteError(点名 limit)
before_rowid='abc' 静默回第一页 WriteError(点名 before_rowid)
before_rowid=10**100 OverflowError WriteError(越界)
get_proposal({}) ProgrammingError WriteError(proposal_id)
review(note=None) NOT NULL IntegrityError WriteError(note)
grant instances='instance-1' 拆成单字符集(授权反转) 启动即拒
grant 缺 capabilities KeyError 启动即拒
正常分页 / 正常 review(对照) 正常 正常

具名反面对照(--mutate)

  • M1 撤 event_history 的 limit 整数校验 ⇒ A01/A02/A03 红。
  • M2 撤 grant instances 数组校验 ⇒ B03/B04 + E03 红。
  • M3 撤 review 的 note 类型校验 ⇒ A13 + E02 红。

三条变异各自恰好命中期望红集;变异后源码字节级还原。

边界与不做项

Fixes #1107

- event_history/structure_history:limit 必须是 1..200 整数(bool 也拒),
  before_rowid/before_revision 必须是正整数或 None;不再让 SQLite 类型序把
  字符串游标判为恒真(静默回第一页)、NaN 绑 NULL、超大整数 OverflowError。
- get_proposal/target_status/approve/review 的 id/aggregate_key 过 _text;
  review(note=None)、propose(event_id='')、record_version_result(instance_id=123)
  等不再穿透成 sqlite3.IntegrityError/ProgrammingError。
- load_service 的 grant 解析提取为 _parse_grant:capabilities/instances 必须是
  字符串数组;字符串不再被 frozenset() 拆成单字符集(授权面反转),缺字段/
  非数组启动即拒(fail-closed)。
- 新增 tests/test_issue1107_structure_service_validation.py:24 断言 + 3 定点变异;
  基线 2/24、修复后 24/24;structure 相关回归 49 passed / 2 skipped。
FuRongJun-1999 added a commit that referenced this pull request Oct 29, 2026
Linux CI 红=#1149 守卫是脚本式(pytest 收集 0 件、未列 SCRIPT_TESTS,
test_gate_coverage 判「两条腿都没走到」)。修法:包 test_ 入口进程内直调
_run_assertions()(断言组 24 检查),与 python -X utf8 直跑同判据。
FuRongJun-1999 added a commit that referenced this pull request Oct 29, 2026
…-1149

fix(core): 结构服务启动校验三处收口(lingshu #1107,镜像 #1149 净增量)
@FuRongJun-1999

Copy link
Copy Markdown
Owner

维护侧处置(值守第 162 轮):净增量已镜像合并,关闭指向

你的 #1107 三处校验(E01 _integer 闸/E02 note 类型/E03 grant 显式类型化)已由维护侧镜像 PR #1154 合并(9746af3)——_parse_grant/_integer 与守卫均为你的净增量原样,并与已合 #1153 的 item.strip() 强口径融合([" "] 不放行——融合点见镜像 PR 正文)。

本端读数:守卫 test_issue1107_structure_service_validation(脚本式→包 pytest 收集入口,24 检查)全绿;structure 邻接 26 passed;CI 4/4。

关闭指向 #1154。感谢高质量修复——「登记成功、step 才抛」的时序问题定位准确。

@FuRongJun-1999

Copy link
Copy Markdown
Owner

处置见上帖——关闭指向已合并修法。感谢贡献。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

2 participants