Skip to content

fix(viewer): 汇总样例保真修复并补齐安全回归 - #341

Closed
wybaby168 wants to merge 124 commits into
mainfrom
fix/issue-audit-20261006
Closed

wybaby168 wants to merge 124 commits into
mainfrom
fix/issue-audit-20261006

Conversation

@wybaby168

@wybaby168 wybaby168 commented Oct 7, 2026 •

Copy link
Copy Markdown
Member

Summary

本草稿 PR 提交 fix/issue-audit-20261006 的完整累积改动。分支原头为 2a0e108c52d4453bc34ba96d8fa2dd843631f3c8,相对 main@533b60da7bdcd7c42d225441d54406dafc75e33c 已有 122 个提交、411 个变更文件,另补 3 文件 Sharp 安全修复,以及后续 2 文件 WordML 路由边界修复。审查范围包含以下各项,不能按单独的依赖升级处理。

  • DOC/DOCX/WordML:修复表格网格、嵌套表格、竖排字体回退、编码与默认字体、分页容器时序、制表位、VML 文本位置、合并边框,以及图表和导出纸张几何;保留现有 0.3.32+compat.20260925.axes 引擎集成。
  • PPTX:修复文本域顺序、图片效果与绘制层次、段落和文本框属性、图表组合及 SmartArt 文本区域,并同步演示站 Worker。
  • Spreadsheet/PDF/OFD:修复文本容器解码、图表索引与样式、行尺寸及缩放状态、隐藏视口初始适配、拖拽阅读、页面方向、打印和页面适配。
  • Text/Archive/Vite:加入静态 LRC 预览,修复文档内 Markdown 锚点和安全代码高亮、归档文件名编码,以及 Vite 7/8 的 CommonJS 分块初始化路径;更新格式清单、说明和回归证据。
  • 补充 CJK 字体与真实浏览器 CI 门禁;本次仅将 Sharp 及对应 @img/* 锁定闭包升级到 0.35.5,加入从 Next 实际解析原生 Sharp 的安全回归,覆盖 GHSA-wq5f-xc86-pv6w。没有追加 DOCX 升级或其他消费者依赖修复。

Related issue

Refs #311, #312, #321, #322, #323, #325。

这里只关联已涉及的场景,不自动关闭这些 issue。尤其 #322 的上游引擎修复分发和实际浏览器分页验收仍有下述边界。

Change classification

  • User-visible UI or rendering change
  • Non-visual change
  • File-format or renderer behavior
  • Public API, package, Worker, WASM, or deployment-path change

Verification

验证均在独立 Linux 云环境进行,未使用用户电脑。使用 Node 24.20.0、pnpm 11.0.9,清除 NODE_PATH,使用独立 HOME、缓存和存储目录;物理安装测试检查实际模块解析路径。下表是 Sharp 候选 91c0bf9094722fa60f2d3766c5da94968b5a0f26 的验证记录。后续 WordML 修复的验证在文末单列;旧候选的完整构建不计作新代码的完整构建。

Check Result
pnpm install --frozen-lockfile Pass,2026-10-07 使用专用 store 重新确认冻结安装一致性;不是新的零缓存下载声明。
node --test .github/scripts/dependency-cohort.test.mjs Pass,2026-10-07,9/9;Next 实际解析 Sharp 0.35.5。旧 0.35.4 曾使新增断言失败。
pnpm verify:github-governance Pass,2026-10-07,52 通过、1 项私有发版流程检查按仓库设计跳过;格式检查通过。
pnpm exec vitest run --maxWorkers=2 Pass,2026-10-07,30 个文件、260 项通过、1 项跳过;跳过项要求外部 FILE_VIEWER_LINE_CHART_FIXTURE 验收工作簿。
pnpm audit --registry=https://registry.npmjs.org --json Pass,2026-10-07,退出码 0;high/critical 为 0。元数据仍列出仓库已有豁免的 Vue 2 low 1,不声明全部漏洞为 0。
pnpm build Pass,2026-10-06,同一原头及字节一致的 3 文件候选补丁;包括源码、组件、示例和演示站,使用 Rust 1.99.0、wasm-bindgen 0.2.127、Binaryen 132。
pnpm type-check Pass,2026-10-06,同一候选源代码,全量类型检查。
pnpm docs:build Pass,2026-10-06,同一候选源代码,文档生产构建。
pnpm test Blocked,2026-10-06:公共发布事实、日语检查、thumbnail 16 项和 archive #101/#148 前置检查通过;在 issue-297-bpmn.browser.mjs:98 因缺少固定 Chromium 可执行文件停止,后续聚合检查未执行。
pnpm test:compatibility Pass,2026-10-06,39 项原生回归和 28 项兼容性检查。
pnpm test:output-compatibility Pass,2026-10-06,27 项输出检查。

本次 Sharp 补丁 SHA-256:3c8a55c2f220d6a4b835cf99b380427726e85fb0d806c872d7e531e0f7c1b626。全量构建产生的无关 CHM 生成文件已记录哈希并恢复,没有混入本次提交。

原头 91c0bf9094722fa60f2d3766c5da94968b5a0f26 的 hosted Public CI、Security 和 DOC font 工作流已通过,但独立 CodeQL 汇总门禁报告 3 项告警。当前修复后的精确 head 正在重新执行 hosted 门禁,尚未结项。旧分支的历史浏览器记录、仓库截图和本地静态 DOM 检查均不替代这次候选的浏览器门禁,也不代表全部 Office 文件与桌面应用逐像素一致。

Sample / fixture evidence

Visual evidence

以下是分支已提交、已核对文件与图像内容的生成式 PPTX 绘制语义回归截图,来自 2026-09-23 的既有证据。它们展示文本域顺序、图片效果和绘制层次,未冒充本次云端重跑的新截图;本次环境没有生成新的浏览器截图。

Before:
PPTX generated drawing-semantics regression before

After:
PPTX generated drawing-semantics regression after

Risk and compatibility

  • Affected packages/formats: Core 输出路径;DOC、Word/DOCX/WordML、PPTX、Spreadsheet、PDF、OFD、Text、Archive;Vite 插件、Worker、字体/离线资产、演示与文档;Next 的 Sharp 可选图片处理依赖。此分支是 122 个既有提交的累积审查范围。
  • Compatibility or migration risk: DOCX 仍固定为 @file-viewer/docx@0.3.32 加哈希锁定的兼容补丁,与 fix: preserve dependency compatibility and standalone DICOM startup #340 的 0.3.33 集成存在语义边界,不能简单覆盖升级。实际公开 [bug]: word 预览分页问题 #322 原稿在本分支已安装引擎的静态检查中仍有 6 个空正文 section 且缺少页眉页脚文本;独立打包的 docxjs #14 可消除该静态回归并保持正文哈希,但尚未被本分支依赖采用。已检查的公开 0.3.33 包与该上游 PR 的 base bundle 相同,不含其新修复。这里没有完成 [bug]: word 预览分页问题 #322 的原稿浏览器测量、Worker 和分页保真结项,也没有纳入未取得的 [bug]: 内网 HTTP 下 .ppt 初始化因 Web Crypto SHA-256 不可用而失败 #329 私有 pptjs 补丁。
  • Compatibility or migration risk: 6 项功能检查通过的小型物理消费者使用“源码 DOC/Text/Vite tarball + 已发布 Core 3.1.2”的混合依赖图。其正式 audit 检出 2 个 low advisory,均指向已发布 Core 下同一个 DOMPurify 3.4.15 runtime;源码 Text 自身解析 3.4.16。这是分发边界,不能由工作区 audit 结果消除,也不能写成完整源码依赖图已通过。未在本 PR 追加消费者修复或 npm 发布。
  • Compatibility or migration risk: CJK 竖排需要宿主部署兼容字体;浏览器和打印驱动仍影响字体与纸张几何。相关 renderer 必须与匹配的 Worker/复制资产一起部署。原稿验收工作簿和未覆盖语料仍按各回归文档的范围处理。
  • Rollback: 按已审查的功能提交整体回退对应 renderer、匹配 Worker、引擎补丁/哈希与资产,避免只回退其中一端。Sharp 3 文件补丁可独立定位;回退它会恢复已知安全问题,应另行评估。没有数据库迁移,不执行 npm 发布。

Checklist

  • I added or updated focused automated coverage, or explained why it is not needed. 新增 Next 实际 Sharp runtime 断言,既有格式回归保留;跳过和阻塞项在上文逐项说明。
  • I updated user-facing documentation or release notes when behavior or API changed, or marked them not applicable. 分支包含 renderer README、格式清单、字体部署说明和回归范围文档。
  • I verified offline/private-deployment paths when changing Worker, WASM, fonts, vendor assets, or URLs. 独立源码构建完成 Worker/WASM 与演示离线资产阶段;原稿浏览器及宿主部署的未完成部分未计为通过。
  • I did not commit secrets, customer files, private samples, generated caches, or unrelated changes. 本轮后续提交包含 Sharp override、冻结 lockfile、依赖回归测试,以及下文独立验证的两文件 WordML 路由修复;未上传原稿,未混入云端生成文件。既有语料证据按完整分支范围审查。

WordML boundary repair — 2026-10-07

当前 head:d27e935bd7c6dbc3d00ce1cd3ccf692ca27b217c。对应 CodeQL review。

  • 已真实复现格式路由弱点:旧逻辑会接受出现在注释、其他属性、嵌套元素或相似 URI 中的 WordML 标记。既有转换器仍校验完整 XML 的根名称及准确 namespace,因此这里没有证明网络导航、XSS 或外部资源加载漏洞。
  • 用有界根 QName/namespace 绑定校验替换全局 substring 判断。保留 65,536 字节探测上限、ZIP/OLE 优先级、惰性加载及转换器的 DTD/完整 XML 防护。
  • 独立复核在中间候选中发现了 XML 名称范围及旧编码兼容性回归;最终代码使用 XML 1.0 名称范围,并保留声明编码与截断 UTF-8 前缀行为。这些问题均先加入失败控制,再修复重跑。没有增加忽略规则、调整依赖或更换 DOCX 引擎。
Check Result
已发布原头运行最终新增边界测试 Red,27 项中 14 项失败,作为保留的原始复现
最终 Word package build/test Pass,113/113
package + full workspace type-check Pass
full root Vitest Pass,260 项通过,1 项外部验收工作簿按既有配置跳过
compatibility / output checks Pass,39 原生 + 28 review + 27 output
DOCX upstream guard / diff check Pass
独立 XML/编码及 CPU 复核 Pass,56 controls、46 focused tests、18 CPU cases;此独立 Linux 云端最慢测量约 6.80 ms,不作跨机器性能保证
新精确 head hosted full CI Pass,PR workflow 与 push workflow 均完整通过
新精确 head CodeQL Check conclusion 为 success,原 high 告警已消失且对应 review thread 已由安全机器人关闭;仍报告 2 项 medium,未取得完整定位,不能计为已审核或零告警

此提交只修改 packages/renderers/word/src/wordContainer.ts 和新增的 packages/renderers/word/test/word-container-boundary.test.mjs。当前新 head 仍报告两项 medium CodeQL 告警,尚未取得完整定位;这些未审核项继续保留,不能由 analyzer 或 aggregate check 的 success 结论替代。没有执行合并或 npm 发布。

wybaby168 and others added 30 commits September 22, 2026 11:55
wybaby168 and others added 24 commits September 25, 2026 15:29
Keep the workspace override, five direct production manifests and the installed
DOMPurify runtime on 3.4.16. Reproduce the stale override in PRs 333 and 334 and
add an installed-version contract to prevent a manifest-only security update.

Refresh the lockfile for current devalue, fast-uri, brace-expansion, KaTeX,
source-map-js, compression and static docs Next security fixes. Regenerate the
DICOM license ledger from the exact installed closure without adding audit
exceptions.
Comment thread packages/renderers/word/src/wordContainer.ts Fixed
@wybaby168

Copy link
Copy Markdown
Member Author

Closing as superseded. The viewer fidelity fixes and regression coverage are present in #350, #360 and #364, including the final Word, PPTX, DOC font and Markdown corrections.

Verified on main c4cbee1b42ef1a7357e08c222da7451bf0ef2c31: Public CI, Security, and CodeQL all passed. The accepted replacement source was checked after landing.

@wybaby168 wybaby168 closed this Oct 11, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants