Skip to content

fix(media): 通过通用权限审批交付未知来源媒体 - #4044

Merged
GaoWeiLiuXD merged 5 commits into
makecindy:mainfrom
GaoWeiLiuXD:feature/safe-media-download
Sep 8, 2026
Merged

fix(media): 通过通用权限审批交付未知来源媒体#4044
GaoWeiLiuXD merged 5 commits into
makecindy:mainfrom
GaoWeiLiuXD:feature/safe-media-download

Conversation

@GaoWeiLiuXD

@GaoWeiLiuXD GaoWeiLiuXD commented Sep 7, 2026

Copy link
Copy Markdown
Collaborator

这次改了什么

摘要

媒体生成成功后,如果供应商返回了 Guide 名单外的新 CDN,客户端原先会以 MEDIA_RESULT_INVALID 拒绝交付。本 PR 保留名单作为免审批依据:正常已确认来源自动下载,名单外或需要额外权限时通过现有普通权限卡请求本次批准,允许后在 Cindy 内下载并保存为 cindy-media://

网络故障由客户端自动重试并沿用本次授权,只有来源或权限超出已批准范围才重新确认。私网访问例外绑定精确 URL,路径或 query 变化须重新审批;卡片显示当前具体路径和脱敏后的参数,让用户能区分本次目标。拒绝直接停止;重试耗尽保留原生成响应并报告失败,不要求模型重新付费生成或反复请求批准。刷新地址遇到网络错误、超时或 HTTP 5xx 时最多尝试三次,明确的上游拒绝不重试;刷新结果成功入库前保留原响应;本地入库失败对同一份已下载文件最多尝试三次,不重新下载或审批。

URL 媒体从网络接收、MIME 探测到哈希入库全程采用有界内存:逐块写入 Host 私有临时文件,再通过原 ingestMedia 和内容寻址仓入库。删除文件大小审批及额度状态,不将原内存实现的上限变成 URL 下载限制。base64 响应保持原规则;生成阶段沿用自身超时,下载上下文不再另设覆盖生成时间的九分钟计时器。

变更类型

  • fix 缺陷修复
  • feat 新功能
  • refactor / perf 重构或性能优化
  • docs / test / chore 文档、测试或工程维护
  • 其他:

范围

  • 关联 Issue / 需求:MiniMax H3 图生视频成功后,新 OSS 域名导致媒体交付被客户端拦截;无关联 Issue。
  • 本 PR 包含:图片/音频/视频结果接入安全下载通道;逐跳来源与权限检查、单次批准、客户端网络重试和原任务链接刷新;DNS/连接取消及资源释放;Host 审批共用 Session 交互等待生命周期;成功响应保留;临时文件下载和分块媒体入库;五语言文案和回归用例。
  • 明确不包含:磁盘配额或剩余空间保护(需求方明确排除)、服务端或 Art/Guide 更新、永久域名授权、其他确认卡改造、新增“领取”入口、数据库 schema/migration 或 Mobile 原生配置变更。
  • 用户可见变化:未知来源有明确的允许/拒绝卡,批准后自动下载;拒绝不重复弹卡,网络重试不需要再次确认。继续使用聊天底部的通用权限卡,不新增独立弹窗。
  • 是否存在 breaking change:无新增 wire 字段或工具参数,旧 Guide 继续兼容。下载来源与额外网络权限的处理按上述规则调整。

UI 变化

  • 平台:macOS Desktop,本地开发版,浅色模式。
  • 引用的设计规范:docs/design-rules/DESIGN.md §3 Typography Rules、§5 Layout Principles、§10 Light / Dark Dual-Mode Delivery Gate。复用现有 PermissionPrompt 的排版、聊天底部位置和主题语义 token;只增加来源展示与下载审批文案,没有新增窗口、遮罩或硬编码颜色。
  • 以下为用户提供的通用权限卡截图。截图来自界面预览,只证明卡片显示,不作为真实下载或手机审批端到端证据。深色模式未实机目检。

macOS 浅色模式:聊天底部的媒体下载通用权限卡

怎么验证的

自动验证

  • 当前 head e2754445c:Greptile 5/5、Codex Code/Security Review 均完成,未解决线程为 0;Linux/Windows 全部 CI、Git integration、DCO 与汇总校验通过。Linux 第二组首次因未改动的 PI foreground 取消 fixture 进程退出而失败,未修改代码,重跑失败作业后通过。维护者人工批准仍待完成。

  • 当前修正提交 e2754445c:Desktop 类型检查通过;根 test:unit:related 的公共包与测试调度器通过。Desktop 首次遇到测试进程 SIGSEGV(无用例断言失败),随后通过相同根门禁的 --workspace desktop --workspace-concurrency=1 完整重跑通过(126.5s),未修改测试调度或依赖。5 个提交 DCO 检查通过。

  • 本批补充 sig / OSSAccessKeyId 脱敏回归,以及过期地址刷新遇到网络错误、超时、HTTP 5xx 后重试成功、耗尽保留原响应、HTTP 401 不重试;所有分支均验证只有一次付费提交。

  • 新增回归验证同源私网路径/普通 query 变化时审批内容可区分,以及登录信息、签名值和 fragment 不进入卡片;仍使用普通 permission 链路。

  • Desktop 类型检查通过;另外两个受影响公共包无 typecheck script,按仓库契约跳过。

  • pnpm check:i18npnpm check:i18n-glossary:通过,五语言 9098 keys 一致,无新增术语违规。

  • 回归覆盖来源/权限审批、逐跳网络隔离、下载和本地入库重试、原响应保留;新增有/无 Content-Length 的分块下载、超原上限 URL 结果、临时文件失败/取消清理、文件源内容寻址去重与记账,以及生成超过九分钟仍保持下载上下文有效。

  • 验证复用 worktree 现有依赖;测试显式使用 Global 区域,不修改共享 .env。未新增或升级依赖。

手工验证

  • 本地 worktree:feature/safe-media-download,独立 cindy-local 开发实例。
  • 在现有聊天状态注入预览用 permission_request,确认卡片在聊天底部显示来源、原因与本次范围,使用现有允许/拒绝交互;没有创建真实待审批请求,也没有发起媒体下载。
  • 只读核对手机端普通 permission 展示、Device Link 决定回传和 Desktop resolver;媒体请求不进入 desktop-only confirmation 名单。Auto Review/Full Access 不参与 Host 发起的本次确认。

未执行的验证

  • 未进行真实付费媒体生成、真实公网/内网代理下载或手机端到端审批;本轮以回归用例及客户端预览验证。
  • 未进行 Windows 或深色模式实机目检。未启动 Mobile/Metro,因此无 Mobile 开发构建验收证据。
  • 额外的 @cindy/maker-core build 类型检查有 54 个基线诊断;用 TypeScript compiler host 将本次两个文件替换为 HEAD 源码只读对照,当前与基线诊断相同,无新增。该包没有 typecheck script,不将此额外检查描述为通过。

风险

风险分类

  • 无已知风险
  • SQLite / migration
  • system prompt
  • 协议兼容
  • 权限 / 安全 / 用户数据
  • 存量插件兼容(批准状态 / 指纹 / manifest 校验 / 安装布局 / 包格式)
  • 原生层 / fingerprint / OTA
  • 跨平台差异
  • 其他:

影响与回滚

  • 影响范围:Host 媒体结果的网络 GET。未知来源、HTTP、非默认端口、URL 登录信息、受限网络需要本次人工批准;批准不会变成永久允许或传给下一来源。每跳仍做解析、固定连接 IP 和当前账号/任务复核,不向媒体地址转发生成接口凭证。权限边界需要人工 review 后合并。
  • 受限网络批准目前允许当前精确 URL 访问特殊地址,包括 link-local / 云元数据;若同一域名在批准后的解析中改绑到这些地址,现有 URL 级批准不会区分该 IP 变化。固定连接 IP 只防止一次解析后的连接漂移,不消除批准前后两次解析的差异。此风险属实;review 建议的永久元数据阻断与需求方此前确认的“额外权限走审批、不强制拒绝”边界冲突,本轮不自行更改该权限策略,需维护者人工 review 此边界。
  • URL 下载内存保持有界,但没有磁盘配额、剩余空间预留或文件大小上限;快速或持续响应仍可能耗尽临时分区并影响其他进程,网络时限和事后清理不等于磁盘容量保护。需求方于 2026-09-08 明确要求本次不考虑该问题,因此作为已知风险保留,不在此 PR 增加容量保护或大小审批。磁盘/网络故障仍沿用现有重试与原响应保留,结束时尽力清理临时文件。
  • 已生成但未成功入库的原响应不再按常规六小时 TTL 删除,也不占生成并发名额;保留现有 invocation 状态,不新增表。长期未交付记录暂无 TTL 或数量淘汰上限,会持续占用本地空间;这是为避免静默丢失已付费结果而保留的策略,归档/清理期限需另行确定,不在本 PR 新增。旧版本回滚后仍可读取,但会恢复旧清理及硬拒绝策略。
  • 存量插件影响:无安装、manifest、批准记录或布局改动,不需要用户重装插件或重配凭证。
  • 多端故障范围:只结束当前审批请求/下载,不重连或拆除共享 Device Link 链路。macOS 已验证界面,Windows 与代理环境的运行验证留待后续。
  • 回滚 / 降级方式:revert 本 PR 即恢复原下载行为;无数据库 migration 或 Mobile fingerprint 变化。

提交前检查

  • 已 review 完整 diff
  • 每个 commit 都带 DCO 签名(git commit -s,见 DCO
  • UI 改动已在「UI 变化」注明引用的设计规范章节
  • 未提交凭证、令牌或授权文件
  • 已补充必要文档
  • 已确认测试结果或说明未执行原因

保留 Guide 名单作为免审批依据,未知来源及额外网络权限由 Host 发起单次普通权限审批。
媒体下载接入安全出口,复用本次授权自动重试并保留上游成功响应,避免重新付费生成。
补齐审批取消、Session 等待生命周期、五语言文案、回归用例和权限卡截图。

Signed-off-by: liugaowei <liugaowei@xd.com>
@GaoWeiLiuXD
GaoWeiLiuXD requested a review from a team as a code owner September 7, 2026 09:26
@chatgpt-codex-connector

chatgpt-codex-connector Bot commented Sep 7, 2026

Copy link
Copy Markdown

Codex Review Summary

This comment shows the latest Codex review activity on this pull request.

Review Status Commit Review trigger
📝 Code Review Completed 2026-09-08T02:47:57.526688Z e275444 New commits
🔒 Security Review Completed 2026-09-08T02:56:20.025827Z e275444 New commits
ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review" or "@codex security review".

Codex reacts with 👀 while any review is running, comments if it has suggestions, and reacts with 👍 once all reviews finish with no findings.

@greptile-apps

greptile-apps Bot commented Sep 7, 2026

Copy link
Copy Markdown

Greptile Summary

本次提交补齐了媒体访问 URL 中 sigOSSAccessKeyId 的脱敏,并为已过期媒体地址的只读任务刷新增加有界客户端重试。

  • 刷新网络错误、超时和 HTTP 5xx 时最多执行三次 poll,HTTP 4xx 明确拒绝不重试。
  • 刷新或后续入库失败时继续保留原始成功响应,不重新提交付费生成任务。
  • 审批卡与请求日志复用统一 URL 脱敏逻辑,新增常见签名参数的回归测试。
  • 先前关于精确 URL 私网授权及签名参数泄露的发现均已修复或解决。

Confidence Score: 5/5

当前提交修复了待复核的脱敏与地址刷新问题,未发现新的合并阻塞项,可以合并。

sigOSSAccessKeyId 已在统一 URL 脱敏路径中处理;过期地址刷新只重试临时 poll 故障,明确的 4xx 拒绝不会重试,重试耗尽也不会覆盖原成功响应或重新提交生成任务。既有线程均已解决,其中容量与长期保留风险由 GaoWeiLiuXD 明确接受并说明为本次范围外的产品边界。

Important Files Changed

Filename Overview
apps/desktop/src/main/cindy-media/invocationService.ts 为过期地址刷新增加仅针对 POLL_UNAVAILABLE 的三次有界重试,并保持原成功响应直到新媒体成功入库。
apps/desktop/src/main/cindy-media/mediaRequestLog.ts sigOSSAccessKeyId 纳入统一敏感参数脱敏规则。
apps/desktop/src/main/cindy-media/tests/invocationService.test.ts 覆盖刷新网络错误、超时、5xx、重试耗尽、4xx 拒绝以及不重复付费提交等分支。
apps/desktop/src/main/cindy-media/tests/mediaDownload.test.ts 验证审批输入不会暴露新增覆盖的签名参数值。
apps/desktop/src/main/cindy-media/tests/mediaRequestLog.test.ts 验证新增敏感参数被遮蔽,同时普通查询参数保持可见。

Sequence Diagram

sequenceDiagram
  participant C as Cindy
  participant P as 媒体供应商
  participant D as 下载器
  participant S as 本地媒体仓库

  C->>P: 查询已有任务
  P-->>C: 成功响应(媒体 URL)
  C->>D: 下载媒体
  D-->>C: URL 已过期
  loop 最多三次,仅网络错误/超时/5xx
    C->>P: 刷新已有任务地址(poll)
    P-->>C: 新响应或临时错误
  end
  C->>D: 下载刷新后的 URL
  D->>S: 从临时文件分块入库
  alt 下载及入库成功
    S-->>C: cindy-media:// URL
    C->>C: 原子更新为 complete
  else 刷新、下载或入库失败
    C->>C: 保留原成功响应及 pending 状态
  end
Loading

Reviews (5): Last reviewed commit: "fix(media): 补齐地址刷新重试与签名参数脱敏" | Re-trigger Greptile

Comment thread apps/desktop/src/main/cindy-media/mediaDownload.ts
Comment thread apps/desktop/src/main/cindy-media/mediaInvocationStore.ts

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: ef921c9e2e

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment thread apps/desktop/src/main/cindy-media/invocationService.ts
将私网例外绑定到精确请求目标,防止同源跳转扩大访问范围。刷新结果入库成功前保留原响应,本地入库使用同一份已下载字节进行有界重试。

Signed-off-by: liugaowei <liugaowei@xd.com>
@GaoWeiLiuXD

Copy link
Copy Markdown
Collaborator Author

本轮修复已推送:4505e76e19fc29c392ca2a65378a508707f31508

  • 私网例外绑定精确 URL,路径/query 变化须重新确认,同一请求重试沿用授权。
  • 已处理 Greptile「Comments Outside Diff」中的响应覆盖问题:刷新得到的新响应先在内存中 materialize,成功入库后才将持久状态替换为受管媒体结果;缺失、无效、再次过期或入库失败均保留原成功响应,已补回归验证。
  • 本地入库最多重试三次,复用同一份已下载字节,不重新下载、审批或付费生成。

长期未交付记录的留存策略按既定需求保留,已在对应线程解释依据,并在 PR 风险部分明确披露空间增长,不新增自动淘汰或领取入口。

本地完整相关单测门禁、受影响包类型检查与两次提交的 DCO 检查通过。当前提交的自动 review 和 CI 仍在运行,尚不声明 review clean 或可合并。

@GaoWeiLiuXD

Copy link
Copy Markdown
Collaborator Author

@greptileai 请审查当前提交 4505e76。上一轮已核实的问题与修复、留存策略依据和验证结果见最近回复及 PR 正文。

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: 4505e76e19

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment thread apps/desktop/src/main/cindy-media/mediaDownloadApproval.ts Outdated
Comment thread apps/desktop/src/main/cindy-media/mediaDownload.ts Outdated
@MagicLizi

Copy link
Copy Markdown
Contributor

@GaoWeiLiuXD 👋 这个 PR 还有 2 条 review conversation 没 resolve(apps/desktop/src/main/cindy-media/mediaDownloadApproval.ts / apps/desktop/src/main/cindy-media/mediaDownload.ts),auto-review 因此暂时跳过、没法继续审查 / 合并。

如果你已经按评论改完或回应了,请到对应 thread 上点 Resolve conversation;全部 resolve 后,下一轮 auto-review 会自动重新审查这个 PR。

@MagicLizi MagicLizi added touches:core 改动碰到架构核心路径(review-pr 自动维护,仅展示) touches:plugin-base 改动碰到插件基座(review-pr 自动维护,仅展示) touches:product-ui 改动碰到产品 / UI 面(review-pr 自动维护,仅展示) touches:rules 改动碰到规则 / 规范文档(review-pr 自动维护,仅展示) labels Sep 7, 2026
@MagicLizi

Copy link
Copy Markdown
Contributor

本 PR 需要维护者确认后才能合并。

改动把 Guide 名单外的媒体 CDN 接到现有通用权限卡:批准后在客户端下载为 cindy-media://,并改了插件基座 ghost.ts 的媒体调用路径、产品文案和媒体规则文档。插件基座不走自动豁免。

请维护者在本 PR 上 Approve 放行;需要修改就 Request Changes。讨论记录:#4047

@MagicLizi MagicLizi added the awaiting-discussion 等待维护者讨论(review-pr) label Sep 7, 2026
Signed-off-by: liugaowei <liugaowei@xd.com>

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: cffcfe984f

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment thread apps/desktop/src/main/cindy-media/mediaDownload.ts
@MagicLizi

Copy link
Copy Markdown
Contributor

@GaoWeiLiuXD 👋 这个 PR 还有 1 条 review conversation 没 resolve(apps/desktop/src/main/cindy-media/mediaDownload.ts),auto-review 因此暂时跳过、没法继续审查 / 合并。

如果你已经按评论改完或回应了,请到对应 thread 上点 Resolve conversation;全部 resolve 后,下一轮 auto-review 会自动重新审查这个 PR。

@MagicLizi MagicLizi added the touches:large-diff 改动量较大(review-pr 自动维护,仅展示) label Sep 7, 2026
@MagicLizi

Copy link
Copy Markdown
Contributor

@GaoWeiLiuXD 👋 这个 PR 改动了受保护的路径(.github/pr-assets/media-download-permission-light.png),auto-review 因此不合并、也不会自动审查。

这些路径的改动需要人工处理。如果执意要改,请联系 Lizi。

@GaoWeiLiuXD

Copy link
Copy Markdown
Collaborator Author

@greptileai 请审查当前提交 cffcfe9;上一轮结果仍绑定 4505e76。请只核实本次媒体下载改动的确定性问题。

Comment thread apps/desktop/src/main/cindy-media/mediaDownload.ts
Signed-off-by: liugaowei <liugaowei@xd.com>
@GaoWeiLiuXD

Copy link
Copy Markdown
Collaborator Author

@greptileai 请复核当前提交 2a2f3d8。本轮仅修正私网审批的具体目标展示,验证与范围见更新后的 PR 正文;磁盘容量保护已由需求方明确排除,并在原线程中记录为已知风险。

Comment thread apps/desktop/src/main/cindy-media/mediaDownload.ts

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: 2a2f3d8456

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment thread apps/desktop/src/main/maker-host/outbound-fetch.ts
Comment thread apps/desktop/src/main/cindy-media/invocationService.ts
@MagicLizi

Copy link
Copy Markdown
Contributor

@GaoWeiLiuXD 👋 这个 PR 还有 3 条 review conversation 没 resolve(apps/desktop/src/main/cindy-media/mediaDownload.ts / apps/desktop/src/main/maker-host/outbound-fetch.ts / apps/desktop/src/main/cindy-media/invocationService.ts),auto-review 因此暂时跳过、没法继续审查 / 合并。

如果你已经按评论改完或回应了,请到对应 thread 上点 Resolve conversation;全部 resolve 后,下一轮 auto-review 会自动重新审查这个 PR。

Signed-off-by: liugaowei <liugaowei@xd.com>
@GaoWeiLiuXD

Copy link
Copy Markdown
Collaborator Author

@greptileai 请复核当前提交 e275444:补齐 sig / OSSAccessKeyId 脱敏及原任务地址刷新的客户端有界重试,相关门禁已通过。风险与范围裁决见 PR 正文及各原线程,请勿将已明确排除的容量保护或新的永久网络阻断重新扩入本次修复。

@GaoWeiLiuXD
GaoWeiLiuXD merged commit 87994cd into makecindy:main Sep 8, 2026
19 of 21 checks passed
@GaoWeiLiuXD
GaoWeiLiuXD deleted the feature/safe-media-download branch September 8, 2026 03:48
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

awaiting-discussion 等待维护者讨论(review-pr) touches:core 改动碰到架构核心路径(review-pr 自动维护,仅展示) touches:large-diff 改动量较大(review-pr 自动维护,仅展示) touches:plugin-base 改动碰到插件基座(review-pr 自动维护,仅展示) touches:product-ui 改动碰到产品 / UI 面(review-pr 自动维护,仅展示) touches:rules 改动碰到规则 / 规范文档(review-pr 自动维护,仅展示)

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants