feat: Implement Deno-native STARTTLS handler and connection wrapper
- Refactored STARTTLS implementation to use Deno's native TLS via Deno.startTls(). - Introduced ConnectionWrapper to provide a Node.js net.Socket-compatible interface for Deno.Conn and Deno.TlsConn. - Updated TlsHandler to utilize the new STARTTLS implementation. - Added comprehensive SMTP authentication tests for PLAIN and LOGIN mechanisms. - Implemented rate limiting tests for SMTP server connections and commands. - Enhanced error handling and logging throughout the STARTTLS and connection upgrade processes.
This commit is contained in:
@@ -168,10 +168,11 @@ Deno.test({
|
||||
|
||||
const response = await readSmtpResponse(conn);
|
||||
|
||||
// Some servers accept it (221), others reject it (501)
|
||||
assertMatch(response, /^(221|501)/, 'Should either accept or reject QUIT with extra params');
|
||||
// RFC 5321 Section 4.1.1.10: QUIT syntax is "QUIT <CRLF>" (no parameters)
|
||||
// Should return 501 (syntax error in parameters)
|
||||
assertMatch(response, /^501/, 'Should reject QUIT with extra params with 501');
|
||||
|
||||
console.log(`✓ QUIT with extra parameters handled: ${response.substring(0, 3)}`);
|
||||
console.log('✓ QUIT with extra parameters correctly rejected with 501');
|
||||
} finally {
|
||||
try {
|
||||
conn.close();
|
||||
@@ -199,11 +200,11 @@ Deno.test({
|
||||
|
||||
const response = await readSmtpResponse(conn);
|
||||
|
||||
// Should return 501 (syntax error) or 553 (bad address)
|
||||
assertMatch(response, /^(501|553)/, 'Should reject malformed email with 501 or 553');
|
||||
// RFC 5321: "<not an email>" is a syntax/format error, should return 501
|
||||
assertMatch(response, /^501/, 'Should reject malformed email with 501');
|
||||
|
||||
await sendSmtpCommand(conn, 'QUIT', '221');
|
||||
console.log('✓ Malformed email address rejected');
|
||||
console.log('✓ Malformed email address correctly rejected with 501');
|
||||
} finally {
|
||||
try {
|
||||
conn.close();
|
||||
@@ -255,18 +256,19 @@ Deno.test({
|
||||
try {
|
||||
await waitForGreeting(conn);
|
||||
|
||||
// Send EHLO with excessively long hostname
|
||||
// Send EHLO with excessively long hostname (>512 octets)
|
||||
const longString = 'A'.repeat(1000);
|
||||
const encoder = new TextEncoder();
|
||||
await conn.write(encoder.encode(`EHLO ${longString}\r\n`));
|
||||
|
||||
const response = await readSmtpResponse(conn);
|
||||
|
||||
// Some servers accept long hostnames (250), others reject (500/501)
|
||||
assertMatch(response, /^(250|500|501)/, 'Should handle long commands (accept or reject)');
|
||||
// RFC 5321 Section 4.5.3.1.4: Max command line is 512 octets
|
||||
// Should reject with 500 (syntax error) or 501 (parameter error)
|
||||
assertMatch(response, /^(500|501)/, 'Should reject command >512 octets with 500 or 501');
|
||||
|
||||
await sendSmtpCommand(conn, 'QUIT', '221');
|
||||
console.log(`✓ Excessively long command handled: ${response.substring(0, 3)}`);
|
||||
console.log('✓ Excessively long command correctly rejected');
|
||||
} finally {
|
||||
try {
|
||||
conn.close();
|
||||
|
||||
Reference in New Issue
Block a user