(SMTP) support DATA better in the server and make sure to "escape" CRLF.CRLF
sequences in uploaded data. The test server doesn't "decode" escaped dot-lines but instead test cases must be written to take them into account. Added test case 803 to verify dot-escaping.
This commit is contained in:
@@ -63,7 +63,7 @@ EXTRA_DIST = test1 test108 test117 test127 test20 test27 test34 test46 \
|
||||
test1089 test1090 test1091 test1092 test1093 test1094 test1095 test1096 \
|
||||
test1097 test560 test561 test1098 test1099 test562 test563 test1100 \
|
||||
test564 test1101 test1102 test1103 test1104 test299 test310 test311 \
|
||||
test312 test1105 test565 test800 test1106 test801 test566 test802
|
||||
test312 test1105 test565 test800 test1106 test801 test566 test802 test803
|
||||
|
||||
filecheck:
|
||||
@mkdir test-place; \
|
||||
|
||||
@@ -38,11 +38,15 @@ EHLO user
|
||||
MAIL FROM:802@from
|
||||
RCPT TO:802@foo
|
||||
DATA
|
||||
QUIT
|
||||
</protocol>
|
||||
<upload>
|
||||
From: different
|
||||
To: another
|
||||
|
||||
body
|
||||
QUIT
|
||||
</protocol>
|
||||
|
||||
.
|
||||
</upload>
|
||||
</verify>
|
||||
</testcase>
|
||||
|
||||
64
tests/data/test803
Normal file
64
tests/data/test803
Normal file
@@ -0,0 +1,64 @@
|
||||
<testcase>
|
||||
<info>
|
||||
<keywords>
|
||||
SMTP
|
||||
</keywords>
|
||||
</info>
|
||||
|
||||
#
|
||||
# Server-side
|
||||
<reply>
|
||||
</reply>
|
||||
|
||||
#
|
||||
# Client-side
|
||||
<client>
|
||||
<server>
|
||||
smtp
|
||||
</server>
|
||||
<name>
|
||||
SMTP with CRLF-dot-CRLF in data
|
||||
</name>
|
||||
<stdin>
|
||||
From: different
|
||||
To: another
|
||||
|
||||
|
||||
.
|
||||
.
|
||||
|
||||
.
|
||||
|
||||
body
|
||||
</stdin>
|
||||
<command>
|
||||
smtp://%HOSTIP:%SMTPPORT -u user:secret --mail-rcpt 803@foo --mail-from 803@from -T -
|
||||
</command>
|
||||
</client>
|
||||
|
||||
#
|
||||
# Verify data after the test has been "shot"
|
||||
<verify>
|
||||
<protocol>
|
||||
EHLO user
|
||||
MAIL FROM:803@from
|
||||
RCPT TO:803@foo
|
||||
DATA
|
||||
QUIT
|
||||
</protocol>
|
||||
<upload>
|
||||
From: different
|
||||
To: another
|
||||
|
||||
|
||||
..
|
||||
..
|
||||
|
||||
..
|
||||
|
||||
body
|
||||
|
||||
.
|
||||
</upload>
|
||||
</verify>
|
||||
</testcase>
|
||||
@@ -473,12 +473,69 @@ sub DATA_smtp {
|
||||
|
||||
if($testno eq "verifiedserver") {
|
||||
sendcontrol "554 WE ROOLZ: $$\r\n";
|
||||
return 0; # don't wait for data now
|
||||
}
|
||||
else {
|
||||
$testno =~ s/^([0-9]*).*/$1/;
|
||||
sendcontrol "354 Show me the mail\r\n";
|
||||
}
|
||||
|
||||
logmsg "===> rcpt $testno was $smtp_rcpt\n";
|
||||
|
||||
my $filename = "log/upload.$testno";
|
||||
|
||||
logmsg "Store test number $testno in $filename\n";
|
||||
|
||||
open(FILE, ">$filename") ||
|
||||
return 0; # failed to open output
|
||||
|
||||
my $line;
|
||||
my $ulsize=0;
|
||||
my $disc=0;
|
||||
my $raw;
|
||||
while (5 == (sysread \*SFREAD, $line, 5)) {
|
||||
if($line eq "DATA\n") {
|
||||
my $i;
|
||||
my $eob;
|
||||
sysread \*SFREAD, $i, 5;
|
||||
|
||||
my $size = 0;
|
||||
if($i =~ /^([0-9a-fA-F]{4})\n/) {
|
||||
$size = hex($1);
|
||||
}
|
||||
|
||||
sysread \*SFREAD, $line, $size;
|
||||
|
||||
$ulsize += $size;
|
||||
print FILE $line if(!$nosave);
|
||||
|
||||
$raw .= $line;
|
||||
if($raw =~ /\x0d\x0a\x2e\x0d\x0a\z/) {
|
||||
# end of data marker!
|
||||
$eob = 1;
|
||||
}
|
||||
logmsg "> Appending $size bytes to file\n";
|
||||
if($eob) {
|
||||
logmsg "Found SMTP EOB marker\n";
|
||||
last;
|
||||
}
|
||||
}
|
||||
elsif($line eq "DISC\n") {
|
||||
# disconnect!
|
||||
$disc=1;
|
||||
last;
|
||||
}
|
||||
else {
|
||||
logmsg "No support for: $line";
|
||||
last;
|
||||
}
|
||||
}
|
||||
if($nosave) {
|
||||
print FILE "$ulsize bytes would've been stored here\n";
|
||||
}
|
||||
close(FILE);
|
||||
logmsg "received $ulsize bytes upload\n";
|
||||
|
||||
}
|
||||
|
||||
sub RCPT_smtp {
|
||||
|
||||
Reference in New Issue
Block a user