feat(channels): IM 入站图片采集层(图片白名单 + 微信图片来源 + 复用 vision 内联入口)
- mediafetch 新增**图片白名单**(扩展名 + **字节嗅探兜底**;与文档/音频**三份名单互不污染**),
取回/裁决/上限全部走既有 Fetch(**来源白名单 deny-by-default** + 逐跳重定向校验 + 边读边限 + 超时)
⇒ 没有新造第四份取回实现
- 微信:给图片 URL 配来源白名单(沿用该渠道 CDN 根口径)
- vision 的 `data:` URI 内联入口为**只读复用**(未改 vision 一行)
- **行为变更**:图片现在**会**被尝试取回(**字节嗅探是唯一裁决权** —— 不是图片字节就不写 `Data`);
其它渠道尚无图片来源白名单 ⇒ 由 deny-by-default 拒绝(**安全**,只是暂读不到,走诚实降级)——
故同步更新了 kook 的既有测试(原断言「图片保持既有路径 = 不取回」已随口径演进)
- ⚠️ **`channelbridge` 一个字没碰**(接线点在切片报告 §7),等监工接线 + 补其它渠道白名单
- 测试:3 个新文件;变异 5 条
This commit is contained in:
1 parent
5de708a560
commit
6a545badbd
8 files changed
+1004
-37
No files matched your search
@@ -197,10 +197,11 @@ func TestInlineSkipsMediaThatAlreadyHasBytes(t *testing.T) {
|
||||
}
|
||||
}
|
||||
|
||||
// TestInlineIgnoresImageAndNonAudioVoice 钉住边界:图片媒体不走本循环(图片走视觉
|
||||
// 链路),**格式不可转写**的语音也不取字节(切片 IM-ASR 起,白名单格式的语音**会**
|
||||
// 被取回,见 inline_voice_test.go)。
|
||||
func TestInlineIgnoresImageAndNonAudioVoice(t *testing.T) {
|
||||
// TestInlineIgnoresNonImageAndNonAudioVoice 钉住分支边界:**声明不是图片格式**的图片媒体
|
||||
// (这里是 `.txt`)与格式不可转写的语音一样**不取字节**(切片 IM-IMG 起,声明命中图片白名单
|
||||
// 的图片**会**被 `inlineImages` 取回,见 inline_image_test.go;音频白名单里的语音同理见
|
||||
// inline_voice_test.go)。
|
||||
func TestInlineIgnoresNonImageAndNonAudioVoice(t *testing.T) {
|
||||
t.Parallel()
|
||||
f := &countingFetcher{data: []byte("x")}
|
||||
msg := &adapter.UnifiedMessage{
|
||||
@@ -215,7 +216,7 @@ func TestInlineIgnoresImageAndNonAudioVoice(t *testing.T) {
|
||||
Inline(context.Background(), testLogger(t), msg, f)
|
||||
|
||||
if f.calls() != 0 {
|
||||
t.Fatalf("非文件类媒体被取回了 %d 次,want 0", f.calls())
|
||||
t.Fatalf("声明不是图片格式的媒体被取回了 %d 次,want 0", f.calls())
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in new issue
Block a user