aboutsummaryrefslogtreecommitdiffstats
path: root/phpBB/includes/functions_transfer.php
diff options
context:
space:
mode:
authorAndreas Fischer <bantu@phpbb.com>2012-01-02 18:53:55 +0100
committerAndreas Fischer <bantu@phpbb.com>2012-01-02 18:53:55 +0100
commit2345be38b682a58f9b5e5429c76db97a0564093d (patch)
treefe39c5f348f86c23f3c9af9011d6d0c1b0c0baf5 /phpBB/includes/functions_transfer.php
parentc8da5ad9f42d8ced1aead79a42cc5caee5c5a2ff (diff)
parente14c3f3b77ab07ce97f357a15db5db5101df06c1 (diff)
downloadforums-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.php55
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 = '';