Skip to content

v2.4.9

Choose a tag to compare

@SelinuxJXM SelinuxJXM released this 05 Nov 10:29
· 1 commit to main since this release

JSecProbe v2.4.9 更新内容

本次修复一个会造成现场证据丢失的缺陷:在「全局层面 / 关键证据点」上传的截图与附件,切换测评对象或页面再返回后界面显示为空;若随后继续编辑,引用会被写回数据库抹掉,严重时「孤儿文件清理」会删除磁盘原件。这类问题不报错、不崩溃,属于静默数据丢失,因此一并加固了上传落库时序与清理策略。

修复

  • 修复:全局层面的证据上传后,切换页面 / 测评对象再回来就消失

    现场核查页每次切换测评对象或重新进入页面都会重建整张表,重建时必须从数据库把该测评项的「证据清单」(screenshot_paths)抄回来。资产视图一直是正常读库的,但「全局层面」视图重建行时把清单写死成空数组。于是出现一条逐步恶化的链条:

    1. 全局层面上传 → 切走再回来 → 界面显示空(此时数据库与磁盘里的文件其实都还在);
    2. 此时只要再改动任意一格,自动保存按「空清单」写回数据库 → 引用被抹掉;
    3. 之后若执行设置页的「孤儿文件清理」,它发现这些文件没有任何记录引用,就会把原件删除 —— 这一步不可逆。

    现已抽出共用的证据清单读回函数,全局视图与资产视图统一使用,杜绝「一处读、一处不读」再次发生。

  • 修复:上传后立刻切页,可能还没来得及落库

    证据上传与文本输入原本共用 1.5 秒自动保存防抖,上传完马上切换页面时容易丢失;且父组件处理上传事件时忽略了子组件回传的新行,用的是表格里的旧行标脏。现改为使用回传的新行,并把证据类改动的防抖窗口缩短到 300 毫秒。

  • 修复:离开页面时若正在保存,最后一次改动被静默丢弃

    卸载时如果恰好有一次自动保存正在进行,旧逻辑直接跳过本次 flush,脏标记随组件实例一起销毁。现改为标记「待补跑」,当前保存结束后再执行一次。

加固

  • 设置页「孤儿文件清理」的孤儿判定增加 24 小时宽限:刚上传、或数据库引用因异常暂时缺失的证据文件不会被立即删除,避免「显示丢失」直接演变成「真丢」。
  • 新增 src/views/onsite-verification/utils/screenshots.ts 作为证据清单读回的唯一入口,并补齐历史脏 JSON 的降级处理。

质量保障

  • 新增 tests/renderer/screenshots.test.ts(7 条用例),覆盖项目级 / 资产级读回必须一致、损坏 JSON 降级、空值与 null 等边界。
  • 改写 useAutoSaveCore.test.ts 的卸载竞态用例,断言「保存进行中卸载」会补跑而不是丢弃。
  • 真机复核:修复后在「全局层面」上传截图与附件、反复切换安全域与测评对象、再正常关闭应用,数据库 5 条证据引用全部保留且均指向存在的物理文件,无新增孤儿文件;上传落库实测约 324 毫秒。
  • 测试基线:6 个文件 70 个用例通过、1 个用例按环境跳过,退出码 0。

兼容性

数据库结构无变更,可直接覆盖升级。

注意:本次修复不会自动恢复历史上已被抹掉的引用。若此前遇到过证据消失,文件通常仍在数据目录的 screenshots/<项目ID>/<测评项ID>/ 或 evidence/<项目ID>/<测评项ID>/ 下,可按目录名对应回测评项重新关联。在执行设置页「孤儿文件清理」前,请先备份这两个目录。