]> git.ipfire.org Git - thirdparty/curl.git/commitdiff
FTP: handle a 230 welcome response
authorDaniel Stenberg <daniel@haxx.se>
Mon, 18 Feb 2013 22:40:29 +0000 (23:40 +0100)
committerDaniel Stenberg <daniel@haxx.se>
Fri, 12 Apr 2013 21:59:37 +0000 (23:59 +0200)
...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

lib/ftp.c
tests/FILEFORMAT
tests/data/Makefile.am
tests/data/test1219 [new file with mode: 0644]
tests/ftpserver.pl

index 5308b2fa217209744f56f0398e2b6489d01e9623..fb7c5737e6f895deaa23a32482da0fc1218755f8 100644 (file)
--- a/lib/ftp.c
+++ b/lib/ftp.c
@@ -2711,7 +2711,10 @@ static CURLcode ftp_statemach_act(struct connectdata *conn)
     /* we have now received a full FTP server response */
     switch(ftpc->state) {
     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",
               ftpcode);
         return CURLE_FTP_WEIRD_SERVER_REPLY;
index 063925f099d367d9dd478ea273890e0ee3b361f1..eeb4a9822b5325eff7c21cb9a4fb63348db8c68b 100644 (file)
@@ -107,6 +107,8 @@ For FTP/SMTP/POP/IMAP, these are supported:
 REPLY [command] [return value] [response string]
  - 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.
+   There's a special [command] named "welcome" (without quotes) which is the
+   string sent immediately on connect as a welcome.
 COUNT [command] [num]
  - Do the REPLY change for [command] only [num] times and then go back to the
    built-in approach
index c3857d2f5eb233f71efece6fcaa455f74b23c2f1..875a35d3ad0b5585b5e22e77a1e5e5243990a53f 100644 (file)
@@ -89,7 +89,7 @@ test1128 test1129 test1130 test1131 test1132 test1133 \
 \
 test1200 test1201 test1202 test1203 test1204 test1205 test1206 test1207 \
 test1208 test1209 test1210 test1211 test1212 test1213 test1214 test1215 \
-test1216 test1217 test1218 \
+test1216 test1217 test1218 test1219 \
 test1220 test1221 test1222 test1223 test1224 test1225 test1226 test1227 \
 \
 test1300 test1301 test1302 test1303 test1304 test1305 test1306 test1307 \
diff --git a/tests/data/test1219 b/tests/data/test1219
new file mode 100644 (file)
index 0000000..e42a211
--- /dev/null
@@ -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\r
+EPSV\r
+TYPE I\r
+SIZE 1219\r
+RETR 1219\r
+QUIT\r
+</protocol>
+</verify>
+</testcase>
index 23af6f85feff7f4157d805eee29a0a98e4e6bc6b..f6cb2551162ece9fcf688c38ab4d94675f2c7818 100755 (executable)
@@ -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
 # 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 %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
@@ -547,13 +546,12 @@ sub protocolsetup {
             'NOOP' => '200 Yes, I\'m very good at doing nothing.',
             'PBSZ' => '500 PBSZ not implemented',
             'PROT' => '500 PROT not implemented',
-        );
-        @welcome = (
+            'welcome' => join("",
             '220-        _   _ ____  _     '."\r\n",
             '220-    ___| | | |  _ \| |    '."\r\n",
             '220-   / __| | | | |_) | |    '."\r\n",
             '220-  | (__| |_| |  _ <| |___ '."\r\n",
-            '220    \___|\___/|_| \_\_____|'."\r\n"
+            '220    \___|\___/|_| \_\_____|'."\r\n")
         );
     }
     elsif($proto eq 'pop3') {
@@ -567,14 +565,13 @@ sub protocolsetup {
             'USER' => '+OK We are happy you popped in!',
             'PASS' => '+OK Access granted',
             'QUIT' => '+OK byebye',
-        );
-        @welcome = (
+            'welcome' => join("",
             '        _   _ ____  _     '."\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') {
@@ -590,14 +587,13 @@ sub protocolsetup {
         %displaytext = (
             'LOGIN'  => ' OK We are happy you popped in!',
             'LOGOUT' => ' OK thanks for the fish',
-        );
-        @welcome = (
+            'welcome' => join("",
             '        _   _ ____  _     '."\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') {
@@ -610,13 +606,12 @@ sub protocolsetup {
             'MAIL' => '200 Note taken',
             'RCPT' => '200 Receivers accepted',
             'QUIT' => '200 byebye',
-        );
-        @welcome = (
+            'welcome' => join("",
             '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
 
-    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
     if($ftplistparserstate) {
@@ -2168,9 +2174,7 @@ while(1) {
     }
 
     if($verbose) {
-        for(@welcome) {
-            print STDERR "OUT: $_";
-        }
+        print STDERR "OUT: $welcome";
     }
 
     my $full = "";