feat(channels): IM 入站图片接线(纯图片不再被丢 / data URI 进模型视图 / 诚实提示 / 来源白名单)

This commit is contained in:
AskaEth committed 2026-10-05 11:22:26 +08:00
1 parent 0cbc9ff886
commit b73a1276c6
18 files changed
+1224 -121

No files matched your search

+8 -6
View File
@@ -1,8 +1,9 @@
package telegram
// 本文件承载 Telegram 的**入站附件字节内联**(切片 IM-1):Bot API 上报的文件类
// 媒体只给 `file_id`,字节要分两步取回 —— 先 `getFile` 把平台文件 id 换成一个
// **平台自己返回**的相对路径,再把该路径拼到已配置的 API 根之后下载。
// 本文件承载 Telegram 的**入站附件字节内联**(切片 IM-1 / IM-IMG):Bot API 上报的
// **文件类与图片类**媒体都只给 `file_id`,字节要分两步取回 —— 先 `getFile` 把平台文件 id
// 换成一个**平台自己返回**的相对路径,再把该路径拼到已配置的 API 根之后下载(两步同一条
// 路、同一份来源白名单;图片多出来的只是「字节必须是白名单光栅图」与 5 MiB 的图片上限)。
//
// 三条边界:
// - 地址**完全由配置与平台返回值构造**:调用方(发送方)无法让请求打到别的主机;
@@ -25,8 +26,8 @@ import (
// getFileMethod 是 Bot API 里「用 file_id 换文件路径」的方法名。
const getFileMethod = "getFile"
// inlineInboundMedia 在消息投递给上层之前,把受支持格式的文件附件取回并内联。
// 失败绝不抛出:该附件保持无字节,由 channelbridge 的入站摄取照既有口径给模型
// inlineInboundMedia 在消息投递给上层之前,把受支持格式的附件(**文件类与图片类**)取回并
// 内联。失败绝不抛出:该附件保持无字节,由 channelbridge 的入站摄取照既有口径给模型
// 一行诚实提示(design/24 §4.4)。
func (a *Adapter) inlineInboundMedia(ctx context.Context, msg *adapter.UnifiedMessage) {
mediafetch.Inline(ctx, a.log, msg, telegramFetcher{a: a})
@@ -52,7 +53,8 @@ func (f telegramFetcher) Fetch(ctx context.Context, m adapter.Media) ([]byte, er
})
}
// assetAllowlist 给出文件下载的来源白名单:**只有已配置的 Bot API 根**。文件地址
// assetAllowlist 给出文件与**图片**下载的来源白名单:**只有已配置的 Bot API 根**(图片不
// 另立名单 —— 两者落的是同一台主机,另立一份只会多一处漂移)。文件地址
// 由「已配置的根 + 平台返回的相对路径」拼成,因此它不可能指向别的主机;白名单再把
// 这条性质钉死在代码里(配置读不出根时给空名单 ⇒ 谁都不许,deny-by-default)。
func (a *Adapter) assetAllowlist() mediafetch.Allowlist {