补齐移动壳图片导出空内容边界

移动壳图片导出拒绝零字节 base64 内容

移动壳 HostBridge 测试覆盖图片导出空内容拒绝

移动壳配置检查反查图片导出字节边界
This commit is contained in:
2026-06-20 04:04:46 +08:00
parent 838bd86ea0
commit 395006a90a
3 changed files with 21 additions and 2 deletions
@@ -1700,6 +1700,15 @@ assertMobileDocumentPickerBoundary(
'MOBILE_AUDIO_DOCUMENT_PICKER_TYPES',
);
const exportImageFileBody = extractFunctionBody(filesSource, 'exportImageFile');
if (
!exportImageFileBody.includes(
'bytes <= 0 || bytes > HOST_BRIDGE_EXPORT_IMAGE_MAX_BYTES',
)
) {
throw new Error('mobile shell image export must reject empty and oversized bytes');
}
for (const [wrapperName, fileCall] of [
['exportMobileHostBridgeTextFile', 'ok(request, await exportTextFile(request.payload))'],
['importMobileHostBridgeTextFile', 'ok(request, await importTextFile())'],
@@ -1377,7 +1377,7 @@ describe('handleMobileHostBridgeMessage', () => {
});
});
test('file.exportImage 拒绝非图片 MIME 与超限内容', async () => {
test('file.exportImage 拒绝非图片 MIME、空内容与超限内容', async () => {
const unsupportedMime = await send(
request('file.exportImage', {
fileName: '分享卡.txt',
@@ -1388,6 +1388,16 @@ describe('handleMobileHostBridgeMessage', () => {
expect(expectFailed(unsupportedMime).error.code).toBe('invalid_request');
const emptyImage = await send(
request('file.exportImage', {
fileName: '分享卡.png',
base64Data: '',
mimeType: 'image/png',
}),
);
expect(expectFailed(emptyImage).error.code).toBe('invalid_request');
const oversized = await send(
request('file.exportImage', {
fileName: '分享卡.png',
+1 -1
View File
@@ -514,7 +514,7 @@ export async function exportImageFile(
throw invalidRequest('base64Data is required');
}
const bytes = base64DecodedByteLength(base64Data);
if (bytes > HOST_BRIDGE_EXPORT_IMAGE_MAX_BYTES) {
if (bytes <= 0 || bytes > HOST_BRIDGE_EXPORT_IMAGE_MAX_BYTES) {
throw invalidRequest('image exceeds file export size limit');
}
ensureImageBytesMatchMimeType(base64Data, mimeType as HostBridgeImageMimeType);