diff options
author | Andreas Fischer <bantu@phpbb.com> | 2012-01-02 18:53:55 +0100 |
---|---|---|
committer | Andreas Fischer <bantu@phpbb.com> | 2012-01-02 18:53:55 +0100 |
commit | 2345be38b682a58f9b5e5429c76db97a0564093d (patch) | |
tree | fe39c5f348f86c23f3c9af9011d6d0c1b0c0baf5 /phpBB/includes/functions_transfer.php | |
parent | c8da5ad9f42d8ced1aead79a42cc5caee5c5a2ff (diff) | |
parent | e14c3f3b77ab07ce97f357a15db5db5101df06c1 (diff) | |
download | forums-2345be38b682a58f9b5e5429c76db97a0564093d.tar forums-2345be38b682a58f9b5e5429c76db97a0564093d.tar.gz forums-2345be38b682a58f9b5e5429c76db97a0564093d.tar.bz2 forums-2345be38b682a58f9b5e5429c76db97a0564093d.tar.xz forums-2345be38b682a58f9b5e5429c76db97a0564093d.zip |
Merge branch 'prep-release-3.0.10'
* prep-release-3.0.10: (221 commits)
[prep-release-3.0.10] Bumping version number for 3.0.10 final.
[prep-release-3.0.10] Update Changelog for 3.0.10-RC3 release.
[ticket/10531] Disallow deleting of the last style
[ticket/8996] Revert initial fix to keep old behaviour on empty selection Part2
[ticket/8996] Revert initial fix to keep old behaviour on empty selection
[ticket/10319] Missing hidden fields in search form
[ticket/10504] Revert the changes for widescreen optimisation PHPBB3-6632
[ticket/10504] Revert the changes for widescreen optimisation PHPBB3-10408
[ticket/10504] Revert the changes for widescreen optimisation PHPBB3-10485
[prep-release-3.0.10] Bumping version number for 3.0.10-RC3.
[ticket/10480] Add a build target for changelog building.
[ticket/10480] Add a build script for exporting the changelog from tracker.
[ticket/10502] Fix typo in changelog. 'red' should have been 'read'.
[prep-release-3.0.10] Remove duplicate ticket PHPBB3-10490 from changelog.
[ticket/10501] Fix description of table prefixes
[ticket/10503] Debug error "Invalid arguments" when previewing edits
[prep-release-3.0.10] Update Changelog for 3.0.10-RC2 release.
[ticket/10497] Fix SQL error when guest visits forum with unread topic
[prep-release-3.0.10] Bumping version number for 3.0.10-RC2.
[ticket/10461] Add a comment explaining the logic here.
...
Diffstat (limited to 'phpBB/includes/functions_transfer.php')
-rw-r--r-- | phpBB/includes/functions_transfer.php | 55 |
1 files changed, 44 insertions, 11 deletions
diff --git a/phpBB/includes/functions_transfer.php b/phpBB/includes/functions_transfer.php index 046abede8e..5ab7a87efd 100644 --- a/phpBB/includes/functions_transfer.php +++ b/phpBB/includes/functions_transfer.php @@ -808,23 +808,56 @@ class ftp_fsock extends transfer */ function _open_data_connection() { - $this->_send_command('PASV', '', false); - - if (!$ip_port = $this->_check_command(true)) + // Try to find out whether we have a IPv4 or IPv6 (control) connection + if (function_exists('stream_socket_get_name')) { - return false; + $socket_name = stream_socket_get_name($this->connection, true); + $server_ip = substr($socket_name, 0, strrpos($socket_name, ':')); } - // open the connection to start sending the file - if (!preg_match('#[0-9]{1,3},[0-9]{1,3},[0-9]{1,3},[0-9]{1,3},[0-9]+,[0-9]+#', $ip_port, $temp)) + if (!isset($server_ip) || preg_match(get_preg_expression('ipv4'), $server_ip)) { - // bad ip and port - return false; + // Passive mode + $this->_send_command('PASV', '', false); + + if (!$ip_port = $this->_check_command(true)) + { + return false; + } + + // open the connection to start sending the file + if (!preg_match('#[0-9]{1,3},[0-9]{1,3},[0-9]{1,3},[0-9]{1,3},[0-9]+,[0-9]+#', $ip_port, $temp)) + { + // bad ip and port + return false; + } + + $temp = explode(',', $temp[0]); + $server_ip = $temp[0] . '.' . $temp[1] . '.' . $temp[2] . '.' . $temp[3]; + $server_port = $temp[4] * 256 + $temp[5]; + } + else + { + // Extended Passive Mode - RFC2428 + $this->_send_command('EPSV', '', false); + + if (!$epsv_response = $this->_check_command(true)) + { + return false; + } + + // Response looks like "229 Entering Extended Passive Mode (|||12345|)" + // where 12345 is the tcp port for the data connection + if (!preg_match('#\(\|\|\|([0-9]+)\|\)#', $epsv_response, $match)) + { + return false; + } + $server_port = (int) $match[1]; + + // fsockopen expects IPv6 address in square brackets + $server_ip = "[$server_ip]"; } - $temp = explode(',', $temp[0]); - $server_ip = $temp[0] . '.' . $temp[1] . '.' . $temp[2] . '.' . $temp[3]; - $server_port = $temp[4] * 256 + $temp[5]; $errno = 0; $errstr = ''; |