- Robson Braga Araujo made passive FTP transfers work with SOCKS (both 4 and
authorDaniel Stenberg <daniel@haxx.se>
Mon, 19 Feb 2007 11:53:54 +0000 (11:53 +0000)
committerDaniel Stenberg <daniel@haxx.se>
Mon, 19 Feb 2007 11:53:54 +0000 (11:53 +0000)
  5).

CHANGES
RELEASE-NOTES
docs/KNOWN_BUGS
lib/ftp.c
lib/socks.c
lib/socks.h
lib/url.c

diff --git a/CHANGES b/CHANGES
index aa11640..f75ef4f 100644 (file)
--- a/CHANGES
+++ b/CHANGES
@@ -6,6 +6,10 @@
 
                                   Changelog
 
+Daniel (19 February 2007)
+- Robson Braga Araujo made passive FTP transfers work with SOCKS (both 4 and
+  5).
+
 Daniel (18 February 2007)
 - Jeff Pohlmeyer identified two problems: first a rather obscure problem with
   the multi interface and connection re-use that could make a
index 59796b2..2ec0485 100644 (file)
@@ -24,6 +24,7 @@ This release includes the following bugfixes:
  o builds fine with VC2005
  o CURLOPT_RANGE set to NULL resets the range for FTP
  o curl_multi_remove_handle() rare crash
+ o passive FTP transfers work with SOCKS
 
 This release includes the following known bugs:
 
@@ -41,7 +42,7 @@ This release would not have looked like this without help, code, reports and
 advice from friends like these:
 
  Yang Tse, Manfred Schwarb, Michael Wallner, Jeff Pohlmeyer, Shmulik Regev,
- Rob Crittenden, Robert A. Monat,  Dan Fandrich, Duncan Mac-Vicar Prett,
- Michal Marek
+ Rob Crittenden, Robert A. Monat, Dan Fandrich, Duncan Mac-Vicar Prett,
+ Michal Marek, Robson Braga Araujo
 
         Thanks! (and sorry if I forgot to mention someone)
index 3155c45..729e321 100644 (file)
@@ -64,11 +64,14 @@ may have been fixed since this was written!
   "system context" will make it use wrong(?) user name - at least when compared
   to what winhttp does. See http://curl.haxx.se/bug/view.cgi?id=1281867
 
-23. We don't support SOCKS for IPv6. We don't support FTPS over a SOCKS proxy.
-  We don't have any test cases for SOCKS proxy. We probably have even more
-  bugs and lack of features when a SOCKS proxy is used. And there seem to be a
-  problem with SOCKS when doing FTP: See
-  http://curl.haxx.se/bug/view.cgi?id=1371540
+23. SOCKS-related problems:
+  A) libcurl doesn't support SOCKS for IPv6.
+  B) libcurl doesn't support FTPS over a SOCKS proxy.
+  C) We don't have any test cases for SOCKS proxy.
+  E) libcurl doesn't support active FTP over a SOCKS proxy
+
+  We probably have even more bugs and lack of features when a SOCKS proxy is
+  used.
 
 22. Sending files to a FTP server using curl on VMS, might lead to curl
   complaining on "unaligned file size" on completion. The problem is related
index e088443..28ecdcd 100644 (file)
--- a/lib/ftp.c
+++ b/lib/ftp.c
@@ -1737,6 +1737,23 @@ static CURLcode ftp_state_pasv_resp(struct connectdata *conn,
     /* this just dumps information about this second connection */
     ftp_pasv_verbose(conn, conninfo, newhost, connectport);
 
+  switch(data->set.proxytype) {
+  case CURLPROXY_SOCKS5:
+    result = Curl_SOCKS5(conn->proxyuser, conn->proxypasswd, newhost, newport,
+                         SECONDARYSOCKET, conn);
+    break;
+  case CURLPROXY_HTTP:
+    /* do nothing here. handled later. */
+    break;
+  case CURLPROXY_SOCKS4:
+    result = Curl_SOCKS4(conn->proxyuser, newhost, newport,
+                         SECONDARYSOCKET, conn);
+    break;
+  default:
+    failf(data, "unknown proxytype option given");
+    result = CURLE_COULDNT_CONNECT;
+    break;
+  }
 #ifndef CURL_DISABLE_HTTP
   if(conn->bits.tunnel_proxy && conn->bits.httpproxy) {
     /* FIX: this MUST wait for a proper connect first if 'connected' is
index b8bda8e..accab02 100644 (file)
@@ -108,12 +108,15 @@ static int blockread_all(struct connectdata *conn, /* connection data */
 *   Nonsupport "Identification Protocol (RFC1413)"
 */
 CURLcode Curl_SOCKS4(const char *proxy_name,
+                     char *hostname,
+                     int remote_port,
+                     int sockindex,
                      struct connectdata *conn)
 {
   unsigned char socksreq[262]; /* room for SOCKS4 request incl. user id */
   int result;
   CURLcode code;
-  curl_socket_t sock = conn->sock[FIRSTSOCKET];
+  curl_socket_t sock = conn->sock[sockindex];
   long timeout;
   struct SessionHandle *data = conn->data;
 
@@ -146,7 +149,7 @@ CURLcode Curl_SOCKS4(const char *proxy_name,
 
   socksreq[0] = 4; /* version (SOCKS4) */
   socksreq[1] = 1; /* connect */
-  *((unsigned short*)&socksreq[2]) = htons(conn->remote_port);
+  *((unsigned short*)&socksreq[2]) = htons(remote_port);
 
   /* DNS resolve */
   {
@@ -154,7 +157,7 @@ CURLcode Curl_SOCKS4(const char *proxy_name,
     Curl_addrinfo *hp=NULL;
     int rc;
 
-    rc = Curl_resolv(conn, conn->host.name, (int)conn->remote_port, &dns);
+    rc = Curl_resolv(conn, hostname, remote_port, &dns);
 
     if(rc == CURLRESOLV_ERROR)
       return CURLE_COULDNT_RESOLVE_PROXY;
@@ -190,7 +193,7 @@ CURLcode Curl_SOCKS4(const char *proxy_name,
     }
     if(!hp) {
       failf(data, "Failed to resolve \"%s\" for SOCKS4 connect.",
-            conn->host.name);
+            hostname);
       return CURLE_COULDNT_RESOLVE_HOST;
     }
   }
@@ -312,6 +315,9 @@ CURLcode Curl_SOCKS4(const char *proxy_name,
  */
 CURLcode Curl_SOCKS5(const char *proxy_name,
                      const char *proxy_password,
+                     char *hostname,
+                     int remote_port,
+                     int sockindex,
                      struct connectdata *conn)
 {
   /*
@@ -336,7 +342,7 @@ CURLcode Curl_SOCKS5(const char *proxy_name,
   ssize_t written;
   int result;
   CURLcode code;
-  curl_socket_t sock = conn->sock[FIRSTSOCKET];
+  curl_socket_t sock = conn->sock[sockindex];
   struct SessionHandle *data = conn->data;
   long timeout;
 
@@ -507,7 +513,7 @@ CURLcode Curl_SOCKS5(const char *proxy_name,
   {
     struct Curl_dns_entry *dns;
     Curl_addrinfo *hp=NULL;
-    int rc = Curl_resolv(conn, conn->host.name, (int)conn->remote_port, &dns);
+    int rc = Curl_resolv(conn, hostname, remote_port, &dns);
 
     if(rc == CURLRESOLV_ERROR)
       return CURLE_COULDNT_RESOLVE_HOST;
@@ -541,12 +547,12 @@ CURLcode Curl_SOCKS5(const char *proxy_name,
     }
     if(!hp) {
       failf(data, "Failed to resolve \"%s\" for SOCKS5 connect.",
-            conn->host.name);
+            hostname);
       return CURLE_COULDNT_RESOLVE_HOST;
     }
   }
 
-  *((unsigned short*)&socksreq[8]) = htons(conn->remote_port);
+  *((unsigned short*)&socksreq[8]) = htons(remote_port);
 
   {
     const int packetsize = 10;
index 0da9879..471b262 100644 (file)
@@ -28,6 +28,9 @@
  * final destination server.
  */
 CURLcode Curl_SOCKS4(const char *proxy_name,
+                     char *hostname,
+                     int remote_port,
+                     int sockindex,
                      struct connectdata *conn);
 
 /*
@@ -36,6 +39,9 @@ CURLcode Curl_SOCKS4(const char *proxy_name,
  */
 CURLcode Curl_SOCKS5(const char *proxy_name,
                      const char *proxy_password,
+                     char *hostname,
+                     int remote_port,
+                     int sockindex,
                      struct connectdata *conn);
 
 #endif
index 6d1fa04..692e66c 100644 (file)
--- a/lib/url.c
+++ b/lib/url.c
@@ -2287,13 +2287,15 @@ static CURLcode ConnectPlease(struct SessionHandle *data,
 
     switch(data->set.proxytype) {
     case CURLPROXY_SOCKS5:
-      result = Curl_SOCKS5(conn->proxyuser, conn->proxypasswd, conn);
+      result = Curl_SOCKS5(conn->proxyuser, conn->proxypasswd, conn->host.name,
+                           conn->remote_port, FIRSTSOCKET, conn);
       break;
     case CURLPROXY_HTTP:
       /* do nothing here. handled later. */
       break;
     case CURLPROXY_SOCKS4:
-      result = Curl_SOCKS4(conn->proxyuser, conn);
+      result = Curl_SOCKS4(conn->proxyuser, conn->host.name, conn->remote_port,
+                           FIRSTSOCKET, conn);
       break;
     default:
       failf(data, "unknown proxytype option given");