- Robson Braga Araujo made passive FTP transfers work with SOCKS (both 4 and

5).
This commit is contained in:
Daniel Stenberg 2007-02-19 11:53:54 +00:00
parent ec1b351317
commit 17e8d60c01
7 changed files with 56 additions and 17 deletions

View File

@ -6,6 +6,10 @@
Changelog Changelog
Daniel (19 February 2007)
- Robson Braga Araujo made passive FTP transfers work with SOCKS (both 4 and
5).
Daniel (18 February 2007) Daniel (18 February 2007)
- Jeff Pohlmeyer identified two problems: first a rather obscure problem with - Jeff Pohlmeyer identified two problems: first a rather obscure problem with
the multi interface and connection re-use that could make a the multi interface and connection re-use that could make a

View File

@ -24,6 +24,7 @@ This release includes the following bugfixes:
o builds fine with VC2005 o builds fine with VC2005
o CURLOPT_RANGE set to NULL resets the range for FTP o CURLOPT_RANGE set to NULL resets the range for FTP
o curl_multi_remove_handle() rare crash o curl_multi_remove_handle() rare crash
o passive FTP transfers work with SOCKS
This release includes the following known bugs: 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: advice from friends like these:
Yang Tse, Manfred Schwarb, Michael Wallner, Jeff Pohlmeyer, Shmulik Regev, Yang Tse, Manfred Schwarb, Michael Wallner, Jeff Pohlmeyer, Shmulik Regev,
Rob Crittenden, Robert A. Monat, Dan Fandrich, Duncan Mac-Vicar Prett, Rob Crittenden, Robert A. Monat, Dan Fandrich, Duncan Mac-Vicar Prett,
Michal Marek Michal Marek, Robson Braga Araujo
Thanks! (and sorry if I forgot to mention someone) Thanks! (and sorry if I forgot to mention someone)

View 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 "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 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. 23. SOCKS-related problems:
We don't have any test cases for SOCKS proxy. We probably have even more A) libcurl doesn't support SOCKS for IPv6.
bugs and lack of features when a SOCKS proxy is used. And there seem to be a B) libcurl doesn't support FTPS over a SOCKS proxy.
problem with SOCKS when doing FTP: See C) We don't have any test cases for SOCKS proxy.
http://curl.haxx.se/bug/view.cgi?id=1371540 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 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 complaining on "unaligned file size" on completion. The problem is related

View File

@ -1737,6 +1737,23 @@ static CURLcode ftp_state_pasv_resp(struct connectdata *conn,
/* this just dumps information about this second connection */ /* this just dumps information about this second connection */
ftp_pasv_verbose(conn, conninfo, newhost, connectport); 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 #ifndef CURL_DISABLE_HTTP
if(conn->bits.tunnel_proxy && conn->bits.httpproxy) { if(conn->bits.tunnel_proxy && conn->bits.httpproxy) {
/* FIX: this MUST wait for a proper connect first if 'connected' is /* FIX: this MUST wait for a proper connect first if 'connected' is

View File

@ -108,12 +108,15 @@ static int blockread_all(struct connectdata *conn, /* connection data */
* Nonsupport "Identification Protocol (RFC1413)" * Nonsupport "Identification Protocol (RFC1413)"
*/ */
CURLcode Curl_SOCKS4(const char *proxy_name, CURLcode Curl_SOCKS4(const char *proxy_name,
char *hostname,
int remote_port,
int sockindex,
struct connectdata *conn) struct connectdata *conn)
{ {
unsigned char socksreq[262]; /* room for SOCKS4 request incl. user id */ unsigned char socksreq[262]; /* room for SOCKS4 request incl. user id */
int result; int result;
CURLcode code; CURLcode code;
curl_socket_t sock = conn->sock[FIRSTSOCKET]; curl_socket_t sock = conn->sock[sockindex];
long timeout; long timeout;
struct SessionHandle *data = conn->data; struct SessionHandle *data = conn->data;
@ -146,7 +149,7 @@ CURLcode Curl_SOCKS4(const char *proxy_name,
socksreq[0] = 4; /* version (SOCKS4) */ socksreq[0] = 4; /* version (SOCKS4) */
socksreq[1] = 1; /* connect */ socksreq[1] = 1; /* connect */
*((unsigned short*)&socksreq[2]) = htons(conn->remote_port); *((unsigned short*)&socksreq[2]) = htons(remote_port);
/* DNS resolve */ /* DNS resolve */
{ {
@ -154,7 +157,7 @@ CURLcode Curl_SOCKS4(const char *proxy_name,
Curl_addrinfo *hp=NULL; Curl_addrinfo *hp=NULL;
int rc; 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) if(rc == CURLRESOLV_ERROR)
return CURLE_COULDNT_RESOLVE_PROXY; return CURLE_COULDNT_RESOLVE_PROXY;
@ -190,7 +193,7 @@ CURLcode Curl_SOCKS4(const char *proxy_name,
} }
if(!hp) { if(!hp) {
failf(data, "Failed to resolve \"%s\" for SOCKS4 connect.", failf(data, "Failed to resolve \"%s\" for SOCKS4 connect.",
conn->host.name); hostname);
return CURLE_COULDNT_RESOLVE_HOST; return CURLE_COULDNT_RESOLVE_HOST;
} }
} }
@ -312,6 +315,9 @@ CURLcode Curl_SOCKS4(const char *proxy_name,
*/ */
CURLcode Curl_SOCKS5(const char *proxy_name, CURLcode Curl_SOCKS5(const char *proxy_name,
const char *proxy_password, const char *proxy_password,
char *hostname,
int remote_port,
int sockindex,
struct connectdata *conn) struct connectdata *conn)
{ {
/* /*
@ -336,7 +342,7 @@ CURLcode Curl_SOCKS5(const char *proxy_name,
ssize_t written; ssize_t written;
int result; int result;
CURLcode code; CURLcode code;
curl_socket_t sock = conn->sock[FIRSTSOCKET]; curl_socket_t sock = conn->sock[sockindex];
struct SessionHandle *data = conn->data; struct SessionHandle *data = conn->data;
long timeout; long timeout;
@ -507,7 +513,7 @@ CURLcode Curl_SOCKS5(const char *proxy_name,
{ {
struct Curl_dns_entry *dns; struct Curl_dns_entry *dns;
Curl_addrinfo *hp=NULL; 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) if(rc == CURLRESOLV_ERROR)
return CURLE_COULDNT_RESOLVE_HOST; return CURLE_COULDNT_RESOLVE_HOST;
@ -541,12 +547,12 @@ CURLcode Curl_SOCKS5(const char *proxy_name,
} }
if(!hp) { if(!hp) {
failf(data, "Failed to resolve \"%s\" for SOCKS5 connect.", failf(data, "Failed to resolve \"%s\" for SOCKS5 connect.",
conn->host.name); hostname);
return CURLE_COULDNT_RESOLVE_HOST; return CURLE_COULDNT_RESOLVE_HOST;
} }
} }
*((unsigned short*)&socksreq[8]) = htons(conn->remote_port); *((unsigned short*)&socksreq[8]) = htons(remote_port);
{ {
const int packetsize = 10; const int packetsize = 10;

View File

@ -28,6 +28,9 @@
* final destination server. * final destination server.
*/ */
CURLcode Curl_SOCKS4(const char *proxy_name, CURLcode Curl_SOCKS4(const char *proxy_name,
char *hostname,
int remote_port,
int sockindex,
struct connectdata *conn); struct connectdata *conn);
/* /*
@ -36,6 +39,9 @@ CURLcode Curl_SOCKS4(const char *proxy_name,
*/ */
CURLcode Curl_SOCKS5(const char *proxy_name, CURLcode Curl_SOCKS5(const char *proxy_name,
const char *proxy_password, const char *proxy_password,
char *hostname,
int remote_port,
int sockindex,
struct connectdata *conn); struct connectdata *conn);
#endif #endif

View File

@ -2287,13 +2287,15 @@ static CURLcode ConnectPlease(struct SessionHandle *data,
switch(data->set.proxytype) { switch(data->set.proxytype) {
case CURLPROXY_SOCKS5: 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; break;
case CURLPROXY_HTTP: case CURLPROXY_HTTP:
/* do nothing here. handled later. */ /* do nothing here. handled later. */
break; break;
case CURLPROXY_SOCKS4: case CURLPROXY_SOCKS4:
result = Curl_SOCKS4(conn->proxyuser, conn); result = Curl_SOCKS4(conn->proxyuser, conn->host.name, conn->remote_port,
FIRSTSOCKET, conn);
break; break;
default: default:
failf(data, "unknown proxytype option given"); failf(data, "unknown proxytype option given");