FTP: handle a 230 welcome response
...instead of the 220 we otherwise expect. Made the ftpserver.pl support sending a custom "welcome" and then created test 1219 to verify this fix with such a 230 welcome. Bug: http://curl.haxx.se/mail/lib-2013-02/0102.html Reported by: Anders Havn
This commit is contained in:
@@ -2711,7 +2711,10 @@ static CURLcode ftp_statemach_act(struct connectdata *conn)
|
|||||||
/* we have now received a full FTP server response */
|
/* we have now received a full FTP server response */
|
||||||
switch(ftpc->state) {
|
switch(ftpc->state) {
|
||||||
case FTP_WAIT220:
|
case FTP_WAIT220:
|
||||||
if(ftpcode != 220) {
|
if(ftpcode == 230)
|
||||||
|
/* 230 User logged in - already! */
|
||||||
|
return ftp_state_user_resp(conn, ftpcode, ftpc->state);
|
||||||
|
else if(ftpcode != 220) {
|
||||||
failf(data, "Got a %03d ftp-server response when 220 was expected",
|
failf(data, "Got a %03d ftp-server response when 220 was expected",
|
||||||
ftpcode);
|
ftpcode);
|
||||||
return CURLE_FTP_WEIRD_SERVER_REPLY;
|
return CURLE_FTP_WEIRD_SERVER_REPLY;
|
||||||
|
|||||||
@@ -107,6 +107,8 @@ For FTP/SMTP/POP/IMAP, these are supported:
|
|||||||
REPLY [command] [return value] [response string]
|
REPLY [command] [return value] [response string]
|
||||||
- Changes how the server responds to the [command]. [response string] is
|
- Changes how the server responds to the [command]. [response string] is
|
||||||
evaluated as a perl string, so it can contain embedded \r\n, for example.
|
evaluated as a perl string, so it can contain embedded \r\n, for example.
|
||||||
|
There's a special [command] named "welcome" (without quotes) which is the
|
||||||
|
string sent immediately on connect as a welcome.
|
||||||
COUNT [command] [num]
|
COUNT [command] [num]
|
||||||
- Do the REPLY change for [command] only [num] times and then go back to the
|
- Do the REPLY change for [command] only [num] times and then go back to the
|
||||||
built-in approach
|
built-in approach
|
||||||
|
|||||||
@@ -89,7 +89,7 @@ test1128 test1129 test1130 test1131 test1132 test1133 \
|
|||||||
\
|
\
|
||||||
test1200 test1201 test1202 test1203 test1204 test1205 test1206 test1207 \
|
test1200 test1201 test1202 test1203 test1204 test1205 test1206 test1207 \
|
||||||
test1208 test1209 test1210 test1211 test1212 test1213 test1214 test1215 \
|
test1208 test1209 test1210 test1211 test1212 test1213 test1214 test1215 \
|
||||||
test1216 test1217 test1218 \
|
test1216 test1217 test1218 test1219 \
|
||||||
test1220 test1221 test1222 test1223 test1224 test1225 test1226 test1227 \
|
test1220 test1221 test1222 test1223 test1224 test1225 test1226 test1227 \
|
||||||
\
|
\
|
||||||
test1300 test1301 test1302 test1303 test1304 test1305 test1306 test1307 \
|
test1300 test1301 test1302 test1303 test1304 test1305 test1306 test1307 \
|
||||||
|
|||||||
49
tests/data/test1219
Normal file
49
tests/data/test1219
Normal file
@@ -0,0 +1,49 @@
|
|||||||
|
<testcase>
|
||||||
|
<info>
|
||||||
|
<keywords>
|
||||||
|
FTP
|
||||||
|
PASV
|
||||||
|
RETR
|
||||||
|
</keywords>
|
||||||
|
</info>
|
||||||
|
# Server-side
|
||||||
|
<reply>
|
||||||
|
<data>
|
||||||
|
data
|
||||||
|
to
|
||||||
|
see
|
||||||
|
that FTP
|
||||||
|
works
|
||||||
|
so does it?
|
||||||
|
</data>
|
||||||
|
<servercmd>
|
||||||
|
REPLY welcome 230 welcome without password
|
||||||
|
</servercmd>
|
||||||
|
</reply>
|
||||||
|
|
||||||
|
# Client-side
|
||||||
|
<client>
|
||||||
|
<server>
|
||||||
|
ftp
|
||||||
|
</server>
|
||||||
|
<name>
|
||||||
|
FTP with no user+password required (230 response)
|
||||||
|
</name>
|
||||||
|
<command>
|
||||||
|
ftp://%HOSTIP:%FTPPORT/1219
|
||||||
|
</command>
|
||||||
|
|
||||||
|
</client>
|
||||||
|
|
||||||
|
# Verify data after the test has been "shot"
|
||||||
|
<verify>
|
||||||
|
<protocol>
|
||||||
|
PWD
|
||||||
|
EPSV
|
||||||
|
TYPE I
|
||||||
|
SIZE 1219
|
||||||
|
RETR 1219
|
||||||
|
QUIT
|
||||||
|
</protocol>
|
||||||
|
</verify>
|
||||||
|
</testcase>
|
||||||
@@ -6,7 +6,7 @@
|
|||||||
# | (__| |_| | _ <| |___
|
# | (__| |_| | _ <| |___
|
||||||
# \___|\___/|_| \_\_____|
|
# \___|\___/|_| \_\_____|
|
||||||
#
|
#
|
||||||
# Copyright (C) 1998 - 2012, Daniel Stenberg, <daniel@haxx.se>, et al.
|
# Copyright (C) 1998 - 2013, Daniel Stenberg, <daniel@haxx.se>, et al.
|
||||||
#
|
#
|
||||||
# This software is licensed as described in the file COPYING, which
|
# This software is licensed as described in the file COPYING, which
|
||||||
# you should have received as part of this distribution. The terms
|
# you should have received as part of this distribution. The terms
|
||||||
@@ -124,7 +124,6 @@ my $sockfilt_timeout = 5; # default timeout for sockfilter eXsysreads
|
|||||||
#
|
#
|
||||||
my %commandfunc; # protocol command specific function callbacks
|
my %commandfunc; # protocol command specific function callbacks
|
||||||
my %displaytext; # text returned to client before callback runs
|
my %displaytext; # text returned to client before callback runs
|
||||||
my @welcome; # text returned to client upon connection
|
|
||||||
|
|
||||||
#**********************************************************************
|
#**********************************************************************
|
||||||
# global vars customized for each test from the server commands file
|
# global vars customized for each test from the server commands file
|
||||||
@@ -547,13 +546,12 @@ sub protocolsetup {
|
|||||||
'NOOP' => '200 Yes, I\'m very good at doing nothing.',
|
'NOOP' => '200 Yes, I\'m very good at doing nothing.',
|
||||||
'PBSZ' => '500 PBSZ not implemented',
|
'PBSZ' => '500 PBSZ not implemented',
|
||||||
'PROT' => '500 PROT not implemented',
|
'PROT' => '500 PROT not implemented',
|
||||||
);
|
'welcome' => join("",
|
||||||
@welcome = (
|
|
||||||
'220- _ _ ____ _ '."\r\n",
|
'220- _ _ ____ _ '."\r\n",
|
||||||
'220- ___| | | | _ \| | '."\r\n",
|
'220- ___| | | | _ \| | '."\r\n",
|
||||||
'220- / __| | | | |_) | | '."\r\n",
|
'220- / __| | | | |_) | | '."\r\n",
|
||||||
'220- | (__| |_| | _ <| |___ '."\r\n",
|
'220- | (__| |_| | _ <| |___ '."\r\n",
|
||||||
'220 \___|\___/|_| \_\_____|'."\r\n"
|
'220 \___|\___/|_| \_\_____|'."\r\n")
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
elsif($proto eq 'pop3') {
|
elsif($proto eq 'pop3') {
|
||||||
@@ -567,14 +565,13 @@ sub protocolsetup {
|
|||||||
'USER' => '+OK We are happy you popped in!',
|
'USER' => '+OK We are happy you popped in!',
|
||||||
'PASS' => '+OK Access granted',
|
'PASS' => '+OK Access granted',
|
||||||
'QUIT' => '+OK byebye',
|
'QUIT' => '+OK byebye',
|
||||||
);
|
'welcome' => join("",
|
||||||
@welcome = (
|
|
||||||
' _ _ ____ _ '."\r\n",
|
' _ _ ____ _ '."\r\n",
|
||||||
' ___| | | | _ \| | '."\r\n",
|
' ___| | | | _ \| | '."\r\n",
|
||||||
' / __| | | | |_) | | '."\r\n",
|
' / __| | | | |_) | | '."\r\n",
|
||||||
' | (__| |_| | _ <| |___ '."\r\n",
|
' | (__| |_| | _ <| |___ '."\r\n",
|
||||||
' \___|\___/|_| \_\_____|'."\r\n",
|
' \___|\___/|_| \_\_____|'."\r\n",
|
||||||
'+OK cURL POP3 server ready to serve'."\r\n"
|
'+OK cURL POP3 server ready to serve'."\r\n")
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
elsif($proto eq 'imap') {
|
elsif($proto eq 'imap') {
|
||||||
@@ -590,14 +587,13 @@ sub protocolsetup {
|
|||||||
%displaytext = (
|
%displaytext = (
|
||||||
'LOGIN' => ' OK We are happy you popped in!',
|
'LOGIN' => ' OK We are happy you popped in!',
|
||||||
'LOGOUT' => ' OK thanks for the fish',
|
'LOGOUT' => ' OK thanks for the fish',
|
||||||
);
|
'welcome' => join("",
|
||||||
@welcome = (
|
|
||||||
' _ _ ____ _ '."\r\n",
|
' _ _ ____ _ '."\r\n",
|
||||||
' ___| | | | _ \| | '."\r\n",
|
' ___| | | | _ \| | '."\r\n",
|
||||||
' / __| | | | |_) | | '."\r\n",
|
' / __| | | | |_) | | '."\r\n",
|
||||||
' | (__| |_| | _ <| |___ '."\r\n",
|
' | (__| |_| | _ <| |___ '."\r\n",
|
||||||
' \___|\___/|_| \_\_____|'."\r\n",
|
' \___|\___/|_| \_\_____|'."\r\n",
|
||||||
'* OK cURL IMAP server ready to serve'."\r\n"
|
'* OK cURL IMAP server ready to serve'."\r\n")
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
elsif($proto eq 'smtp') {
|
elsif($proto eq 'smtp') {
|
||||||
@@ -610,13 +606,12 @@ sub protocolsetup {
|
|||||||
'MAIL' => '200 Note taken',
|
'MAIL' => '200 Note taken',
|
||||||
'RCPT' => '200 Receivers accepted',
|
'RCPT' => '200 Receivers accepted',
|
||||||
'QUIT' => '200 byebye',
|
'QUIT' => '200 byebye',
|
||||||
);
|
'welcome' => join("",
|
||||||
@welcome = (
|
|
||||||
'220- _ _ ____ _ '."\r\n",
|
'220- _ _ ____ _ '."\r\n",
|
||||||
'220- ___| | | | _ \| | '."\r\n",
|
'220- ___| | | | _ \| | '."\r\n",
|
||||||
'220- / __| | | | |_) | | '."\r\n",
|
'220- / __| | | | |_) | | '."\r\n",
|
||||||
'220- | (__| |_| | _ <| |___ '."\r\n",
|
'220- | (__| |_| | _ <| |___ '."\r\n",
|
||||||
'220 \___|\___/|_| \_\_____|'."\r\n"
|
'220 \___|\___/|_| \_\_____|'."\r\n")
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -2157,7 +2152,18 @@ while(1) {
|
|||||||
|
|
||||||
&customize(); # read test control instructions
|
&customize(); # read test control instructions
|
||||||
|
|
||||||
sendcontrol @welcome;
|
my $welcome = $customreply{"welcome"};
|
||||||
|
if(!$welcome) {
|
||||||
|
$welcome = $displaytext{"welcome"};
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
# clear it after use
|
||||||
|
$customreply{"welcome"}="";
|
||||||
|
if($welcome !~ /\r\n\z/) {
|
||||||
|
$welcome .= "\r\n";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
sendcontrol $welcome;
|
||||||
|
|
||||||
#remove global variables from last connection
|
#remove global variables from last connection
|
||||||
if($ftplistparserstate) {
|
if($ftplistparserstate) {
|
||||||
@@ -2168,9 +2174,7 @@ while(1) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if($verbose) {
|
if($verbose) {
|
||||||
for(@welcome) {
|
print STDERR "OUT: $welcome";
|
||||||
print STDERR "OUT: $_";
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
my $full = "";
|
my $full = "";
|
||||||
|
|||||||
Reference in New Issue
Block a user