Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
14 changes: 14 additions & 0 deletions src/ResMgr.cc
Original file line number Diff line number Diff line change
Expand Up @@ -816,6 +816,20 @@ const char *ResMgr::IPv6AddrValidate(xstring_c *value)
}
#endif

const char *ResMgr::IPAddrValidate(xstring_c *value)
{
if(!**value)
return 0;
#if INET6
if(!is_ipv4_address(*value) && !is_ipv6_address(*value))
return _("Invalid IP numeric address");
#else
if(!is_ipv4_address(*value))
return _("Invalid IPv4 numeric address");
#endif
return 0;
}

const char *ResMgr::FileAccessible(xstring_c *value,int mode,bool want_dir)
{
if(!**value)
Expand Down
1 change: 1 addition & 0 deletions src/ResMgr.h
Original file line number Diff line number Diff line change
Expand Up @@ -120,6 +120,7 @@ class ResMgr : public ResType
static const char *ERegExpValidate(xstring_c *value);
static const char *IPv4AddrValidate(xstring_c *value);
static const char *IPv6AddrValidate(xstring_c *value);
static const char *IPAddrValidate(xstring_c *value);
static const char *UNumberPairValidate(xstring_c *value);
static const char *FileAccessible(xstring_c *value,int mode,bool want_dir=false);
static const char *FileReadable(xstring_c *value);
Expand Down
30 changes: 28 additions & 2 deletions src/ftpclass.cc
Original file line number Diff line number Diff line change
Expand Up @@ -813,8 +813,34 @@ Ftp::pasv_state_t Ftp::Handle_EPSV()
Disconnect(_("cannot parse EPSV response"));
return PASV_NO_ADDRESS_YET;
}

conn->data_sa=conn->peer_sa;

// Check if a epsv addr is beeing forced.
// If yes, use this addr.
const char *epsvAddr = Query("ftp:force-epsv-addr");
if (epsvAddr && epsvAddr[0])
{
if(is_ipv4_address(epsvAddr))
{
inet_pton(AF_INET, epsvAddr, &conn->data_sa.in.sin_addr);
conn->data_sa.in.sin_port=htons(port);
conn->data_sa.sa.sa_family=AF_INET;
return PASV_HAVE_ADDRESS;
}
#if INET6
if(is_ipv6_address(epsvAddr))
{
inet_pton(AF_INET6, epsvAddr, &conn->data_sa.in6.sin6_addr);
conn->data_sa.in6.sin6_port=htons(port);
conn->data_sa.sa.sa_family=AF_INET6;
return PASV_HAVE_ADDRESS;
}
#endif
Disconnect("unsupported address family");
return PASV_NO_ADDRESS_YET;
}

if(conn->data_sa.sa.sa_family==AF_INET)
conn->data_sa.in.sin_port=htons(port);
#if INET6
Expand Down Expand Up @@ -2270,7 +2296,7 @@ int Ftp::Do()
{
Disconnect("invalid data connection address");
return MOVED;
}
}

pasv_state=PASV_DATASOCKET_CONNECTING;
if(copy_mode!=COPY_NONE)
Expand Down
1 change: 1 addition & 0 deletions src/resource.cc
Original file line number Diff line number Diff line change
Expand Up @@ -220,6 +220,7 @@ static ResType lftp_vars[] = {
{"ftp:port-range", "full", ResMgr::RangeValidate,0},
{"ftp:port-ipv4", "", ResMgr::IPv4AddrValidate,0},
{"ftp:prefer-epsv", "no", ResMgr::BoolValidate,0},
{"ftp:force-epsv-addr", "", ResMgr::IPAddrValidate,0},
{"ftp:proxy", "", FtpProxyValidate,0},
{"ftp:proxy-auth-type", "user", FtpProxyAuthTypeValidate,0},
{"ftp:rest-list", "no", ResMgr::BoolValidate,0},
Expand Down