This commit is contained in:
2025-05-24 00:23:35 +00:00
parent 0907949f8a
commit cb52446f65
76 changed files with 1401 additions and 867 deletions

View File

@ -1,14 +1,15 @@
import { tap, expect } from '@git.zone/tstest/tapbundle';
import * as plugins from '../plugins.js';
import * as plugins from '../../../ts/plugins.js';
import * as net from 'net';
import { startTestServer, stopTestServer, TEST_PORT, sendEmailWithRawSocket } from '../../helpers/server.loader.js';
import { startTestServer, stopTestServer } from '../../helpers/server.loader.js';
import type { SmtpServer } from '../../../ts/mail/delivery/smtpserver/index.js';
let testServer: SmtpServer;
const TEST_PORT = 2525;
tap.test('setup - start test server', async () => {
testServer = await startTestServer();
await plugins.smartdelay.delayFor(1000);
testServer = await startTestServer({ port: TEST_PORT });
await new Promise(resolve => setTimeout(resolve, 1000));
});
tap.test('Nested MIME Structures - should handle deeply nested multipart structure', async (tools) => {
@ -21,27 +22,33 @@ tap.test('Nested MIME Structures - should handle deeply nested multipart structu
});
let dataBuffer = '';
let state = 'initial';
socket.on('data', (data) => {
dataBuffer += data.toString();
console.log('Server response:', data.toString());
if (dataBuffer.includes('220 ')) {
if (dataBuffer.includes('220 ') && state === 'initial') {
// Send EHLO
socket.write('EHLO testclient\r\n');
} else if (dataBuffer.includes('250 ') && dataBuffer.includes('EHLO')) {
state = 'ehlo_sent';
dataBuffer = '';
} else if (dataBuffer.includes('250 ') && state === 'ehlo_sent') {
// Send MAIL FROM
socket.write('MAIL FROM:<sender@example.com>\r\n');
state = 'mail_from_sent';
dataBuffer = '';
} else if (dataBuffer.includes('250 ') && dataBuffer.includes('sender accepted')) {
} else if (dataBuffer.includes('250 ') && state === 'mail_from_sent') {
// Send RCPT TO
socket.write('RCPT TO:<recipient@example.com>\r\n');
state = 'rcpt_to_sent';
dataBuffer = '';
} else if (dataBuffer.includes('250 ') && dataBuffer.includes('recipient accepted')) {
} else if (dataBuffer.includes('250 ') && state === 'rcpt_to_sent') {
// Send DATA
socket.write('DATA\r\n');
state = 'data_sent';
dataBuffer = '';
} else if (dataBuffer.includes('354 ')) {
} else if (dataBuffer.includes('354 ') && state === 'data_sent') {
// Create deeply nested MIME structure (4 levels)
const outerBoundary = '----=_Outer_Boundary_' + Date.now();
const middleBoundary = '----=_Middle_Boundary_' + Date.now();
@ -126,8 +133,9 @@ tap.test('Nested MIME Structures - should handle deeply nested multipart structu
console.log('Sending email with 4-level nested MIME structure');
socket.write(emailContent);
state = 'email_sent';
dataBuffer = '';
} else if (dataBuffer.includes('250 ') && dataBuffer.includes('Message accepted') ||
} else if ((dataBuffer.includes('250 OK') && state === 'email_sent') ||
dataBuffer.includes('552 ') ||
dataBuffer.includes('554 ') ||
dataBuffer.includes('500 ')) {
@ -165,23 +173,29 @@ tap.test('Nested MIME Structures - should handle circular references in multipar
});
let dataBuffer = '';
let state = 'initial';
socket.on('data', (data) => {
dataBuffer += data.toString();
console.log('Server response:', data.toString());
if (dataBuffer.includes('220 ')) {
if (dataBuffer.includes('220 ') && state === 'initial') {
socket.write('EHLO testclient\r\n');
} else if (dataBuffer.includes('250 ') && dataBuffer.includes('EHLO')) {
state = 'ehlo_sent';
dataBuffer = '';
} else if (dataBuffer.includes('250 ') && state === 'ehlo_sent') {
socket.write('MAIL FROM:<sender@example.com>\r\n');
state = 'mail_from_sent';
dataBuffer = '';
} else if (dataBuffer.includes('250 ') && dataBuffer.includes('sender accepted')) {
} else if (dataBuffer.includes('250 ') && state === 'mail_from_sent') {
socket.write('RCPT TO:<recipient@example.com>\r\n');
state = 'rcpt_to_sent';
dataBuffer = '';
} else if (dataBuffer.includes('250 ') && dataBuffer.includes('recipient accepted')) {
} else if (dataBuffer.includes('250 ') && state === 'rcpt_to_sent') {
socket.write('DATA\r\n');
state = 'data_sent';
dataBuffer = '';
} else if (dataBuffer.includes('354 ')) {
} else if (dataBuffer.includes('354 ') && state === 'data_sent') {
// Create structure with references between parts
const boundary1 = '----=_Boundary1_' + Date.now();
const boundary2 = '----=_Boundary2_' + Date.now();
@ -221,8 +235,9 @@ tap.test('Nested MIME Structures - should handle circular references in multipar
].join('\r\n');
socket.write(emailContent);
state = 'email_sent';
dataBuffer = '';
} else if (dataBuffer.includes('250 ') && dataBuffer.includes('Message accepted') ||
} else if ((dataBuffer.includes('250 OK') && state === 'email_sent') ||
dataBuffer.includes('552 ') ||
dataBuffer.includes('554 ') ||
dataBuffer.includes('500 ')) {
@ -259,23 +274,29 @@ tap.test('Nested MIME Structures - should handle mixed nesting with various enco
});
let dataBuffer = '';
let state = 'initial';
socket.on('data', (data) => {
dataBuffer += data.toString();
console.log('Server response:', data.toString());
if (dataBuffer.includes('220 ')) {
if (dataBuffer.includes('220 ') && state === 'initial') {
socket.write('EHLO testclient\r\n');
} else if (dataBuffer.includes('250 ') && dataBuffer.includes('EHLO')) {
state = 'ehlo_sent';
dataBuffer = '';
} else if (dataBuffer.includes('250 ') && state === 'ehlo_sent') {
socket.write('MAIL FROM:<sender@example.com>\r\n');
state = 'mail_from_sent';
dataBuffer = '';
} else if (dataBuffer.includes('250 ') && dataBuffer.includes('sender accepted')) {
} else if (dataBuffer.includes('250 ') && state === 'mail_from_sent') {
socket.write('RCPT TO:<recipient@example.com>\r\n');
state = 'rcpt_to_sent';
dataBuffer = '';
} else if (dataBuffer.includes('250 ') && dataBuffer.includes('recipient accepted')) {
} else if (dataBuffer.includes('250 ') && state === 'rcpt_to_sent') {
socket.write('DATA\r\n');
state = 'data_sent';
dataBuffer = '';
} else if (dataBuffer.includes('354 ')) {
} else if (dataBuffer.includes('354 ') && state === 'data_sent') {
// Create structure with various encodings
const boundary1 = '----=_Encoding_Outer_' + Date.now();
const boundary2 = '----=_Encoding_Inner_' + Date.now();
@ -323,8 +344,9 @@ tap.test('Nested MIME Structures - should handle mixed nesting with various enco
].join('\r\n');
socket.write(emailContent);
state = 'email_sent';
dataBuffer = '';
} else if (dataBuffer.includes('250 ') && dataBuffer.includes('Message accepted') ||
} else if ((dataBuffer.includes('250 OK') && state === 'email_sent') ||
dataBuffer.includes('552 ') ||
dataBuffer.includes('554 ') ||
dataBuffer.includes('500 ')) {