Files

63 lines
2.3 KiB
JavaScript
Raw Permalink Normal View History

import assert from 'node:assert/strict';
import { EnhancedSecureFileTransfer } from '../src/transfer/EnhancedSecureFileTransfer.js';
function createSystem(onIncomingFileRequest = () => {}) {
const manager = {
dataChannel: { onmessage: null, send() {}, readyState: 'open' },
isVerified: true,
fileTransferSystem: null,
isConnected: () => true
};
const system = new EnhancedSecureFileTransfer(manager, null, null, null, null, onIncomingFileRequest);
system.sendSecureMessage = async () => {};
return system;
}
function validMetadata(overrides = {}) {
return {
type: 'file_transfer_start',
fileId: 'file_1',
fileName: 'report.pdf',
fileSize: 1024,
fileType: 'application/pdf',
fileHash: 'abc',
totalChunks: 1,
chunkSize: 1024,
salt: new Array(32).fill(1),
...overrides
};
}
// Metadata is validated before a consent prompt is shown.
{
const system = createSystem();
assert.equal(system.validateIncomingMetadata(validMetadata()).isValid, true);
assert.equal(system.validateIncomingMetadata(validMetadata({ fileName: '../evil.pdf' })).isValid, false);
assert.equal(system.validateIncomingMetadata(validMetadata({ fileSize: 200 * 1024 * 1024 })).isValid, false);
}
// No receiving state or chunk buffers are allocated before explicit acceptance.
{
let prompted = null;
const system = createSystem(request => { prompted = request; });
await system.handleFileTransferStart(validMetadata());
assert.equal(prompted.fileName, 'report.pdf');
assert.equal(system.pendingIncomingTransfers.size, 1);
assert.equal(system.receivingTransfers.size, 0);
await system.handleFileChunk({ fileId: 'file_1', chunkIndex: 0 });
assert.equal(system.pendingChunks.size, 0);
}
// Incoming request spam is bounded.
{
const system = createSystem();
for (let index = 0; index < system.MAX_PENDING_INCOMING_TRANSFERS; index += 1) {
await system.handleFileTransferStart(validMetadata({ fileId: `file_${index}` }));
}
await system.handleFileTransferStart(validMetadata({ fileId: 'file_overflow' }));
assert.equal(system.pendingIncomingTransfers.size, system.MAX_PENDING_INCOMING_TRANSFERS);
}
console.log('File transfer consent tests passed');