mirror of
https://github.com/moparisthebest/curl
synced 2024-08-13 17:03:50 -04:00
- Robson Braga Araujo made passive FTP transfers work with SOCKS (both 4 and
5).
This commit is contained in:
parent
ec1b351317
commit
17e8d60c01
4
CHANGES
4
CHANGES
@ -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
|
||||||
|
@ -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:
|
||||||
|
|
||||||
@ -42,6 +43,6 @@ 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)
|
||||||
|
@ -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
|
||||||
|
17
lib/ftp.c
17
lib/ftp.c
@ -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
|
||||||
|
22
lib/socks.c
22
lib/socks.c
@ -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;
|
||||||
|
@ -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
|
||||||
|
@ -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");
|
||||||
|
Loading…
Reference in New Issue
Block a user