ftpserver.pl: Moved cURL SMTP server detection into EHLO command handler

Moved the special SMTP server detection code from the DATA command
handler, which happens further down the operation chain after EHLO,
MAIL and RCPT commands, to the EHLO command as it is the first command
to be generated by a SMTP operation as well as containing the special
"verifiedserver" string from the URL.

This not only makes it easier and quicker to detect but also means that
cURL doesn't need to specify "verifiedserver" as --mail-from and
--mail-rcpt arguments.

More importantly, this also makes the upcoming verification changes to
the RCPT handler easier to implement.
This commit is contained in:
Steve Holme 2013-09-21 20:49:23 +01:00
parent 9215cee4c6
commit b07709f741

View File

@ -693,51 +693,66 @@ my $smtp_type;
sub EHLO_smtp { sub EHLO_smtp {
my ($client) = @_; my ($client) = @_;
my @data;
# TODO: Get the IP address of the client connection to use in the EHLO if($client eq "verifiedserver") {
# response when the client doesn't specify one but for now use 127.0.0.1 # This is the secret command that verifies that this actually is
if (!$client) { # the curl test server
$client = "[127.0.0.1]"; sendcontrol "554 WE ROOLZ: $$\r\n";
}
# Set the server type to ESMTP if($verbose) {
$smtp_type = "ESMTP"; print STDERR "FTPD: We returned proof we are the test server\n";
# Calculate the EHLO response
push @data, "$smtp_type pingpong test server Hello $client";
if((@capabilities) || (@auth_mechs)) {
my $mechs;
for my $c (@capabilities) {
push @data, $c;
} }
for my $am (@auth_mechs) { logmsg "return proof we are we\n";
if(!$mechs) { }
$mechs = "$am"; else {
my @data;
# TODO: Get the IP address of the client connection to use in the
# EHLO response when the client doesn't specify one but for now use
# 127.0.0.1
if (!$client) {
$client = "[127.0.0.1]";
}
# Set the server type to ESMTP
$smtp_type = "ESMTP";
# Calculate the EHLO response
push @data, "$smtp_type pingpong test server Hello $client";
if((@capabilities) || (@auth_mechs)) {
my $mechs;
for my $c (@capabilities) {
push @data, $c;
}
for my $am (@auth_mechs) {
if(!$mechs) {
$mechs = "$am";
}
else {
$mechs .= " $am";
}
}
if($mechs) {
push @data, "AUTH $mechs";
}
}
# Send the EHLO response
for (my $i = 0; $i < @data; $i++) {
my $d = $data[$i];
if($i < @data - 1) {
sendcontrol "250-$d\r\n";
} }
else { else {
$mechs .= " $am"; sendcontrol "250 $d\r\n";
} }
} }
if($mechs) {
push @data, "AUTH $mechs";
}
}
# Send the EHLO response
for (my $i = 0; $i < @data; $i++) {
my $d = $data[$i];
if($i < @data - 1) {
sendcontrol "250-$d\r\n";
}
else {
sendcontrol "250 $d\r\n";
}
} }
return 0; return 0;
@ -808,14 +823,8 @@ sub DATA_smtp {
return; # failure return; # failure
} }
if($testno eq "<verifiedserver>") { $testno =~ s/^([^0-9]*)([0-9]+).*/$2/;
sendcontrol "554 WE ROOLZ: $$\r\n"; sendcontrol "354 Show me the mail\r\n";
return 0; # don't wait for data now
}
else {
$testno =~ s/^([^0-9]*)([0-9]+).*/$2/;
sendcontrol "354 Show me the mail\r\n";
}
logmsg "===> rcpt $testno was $smtp_rcpt\n"; logmsg "===> rcpt $testno was $smtp_rcpt\n";