Files
memind/wechat-media.test.mjs
T
john c6ae7cd21c
Memind CI / Test, build, and release guards (pull_request) Successful in 2m56s
fix(wechat): trust configured imgproxy generated images
2026-07-22 09:05:18 +08:00

74 lines
2.7 KiB
JavaScript

import assert from 'node:assert/strict';
import test from 'node:test';
import sharp from 'sharp';
import { uploadWechatGeneratedImage } from './wechat-media.mjs';
test('uploadWechatGeneratedImage converts a generated asset and uploads WeChat image media', async () => {
const source = await sharp({
create: { width: 32, height: 32, channels: 3, background: '#336699' },
}).webp().toBuffer();
const calls = [];
const result = await uploadWechatGeneratedImage(
'access-1',
'/MindSpace/user/public/images/fresh.webp',
{
publicBaseUrl: 'https://example.com',
wechatFetch: async (url, init = {}) => {
calls.push({ url: String(url), init });
if (String(url).startsWith('https://example.com/')) {
return new Response(source, { status: 200, headers: { 'Content-Type': 'image/webp' } });
}
if (String(url).includes('/cgi-bin/media/upload')) {
assert.equal(init.method, 'POST');
assert.ok(init.body instanceof FormData);
return new Response(JSON.stringify({ type: 'image', media_id: 'wx-media-1', created_at: 1 }), {
status: 200,
headers: { 'Content-Type': 'application/json' },
});
}
throw new Error(`unexpected url: ${url}`);
},
},
);
assert.equal(result.mediaId, 'wx-media-1');
assert.equal(result.contentType, 'image/jpeg');
assert.ok(result.bytes > 0);
assert.match(calls[1].url, /access_token=access-1/);
assert.match(calls[1].url, /type=image/);
});
test('uploadWechatGeneratedImage accepts configured imgproxy origin and rejects unknown origins', async () => {
const source = await sharp({
create: { width: 16, height: 16, channels: 3, background: '#884422' },
}).png().toBuffer();
const wechatFetch = async (url) => {
if (String(url).startsWith('https://img.example.com/')) {
return new Response(source, { status: 200, headers: { 'Content-Type': 'image/png' } });
}
return new Response(JSON.stringify({ type: 'image', media_id: 'wx-media-imgproxy' }), {
status: 200,
headers: { 'Content-Type': 'application/json' },
});
};
const accepted = await uploadWechatGeneratedImage(
'access-2',
'https://img.example.com/signed/generated.webp',
{
publicBaseUrl: 'https://app.example.com',
allowedPublicBaseUrls: ['https://img.example.com'],
wechatFetch,
},
);
assert.equal(accepted.mediaId, 'wx-media-imgproxy');
await assert.rejects(
uploadWechatGeneratedImage('access-2', 'https://untrusted.example.net/generated.webp', {
publicBaseUrl: 'https://app.example.com',
allowedPublicBaseUrls: ['https://img.example.com'],
wechatFetch,
}),
/可信公网域名/,
);
});