diff options
| -rw-r--r-- | phpBB/config/services.yml | 4 | ||||
| -rw-r--r-- | phpBB/includes/functions_admin.php | 65 | ||||
| -rw-r--r-- | phpBB/phpbb/file_downloader.php | 120 | ||||
| -rw-r--r-- | phpBB/phpbb/version_helper.php | 21 | ||||
| -rw-r--r-- | tests/version/version_fetch_test.php | 1 | ||||
| -rw-r--r-- | tests/version/version_test.php | 3 | 
6 files changed, 153 insertions, 61 deletions
diff --git a/phpBB/config/services.yml b/phpBB/config/services.yml index 975f2f7580..8667cbbf84 100644 --- a/phpBB/config/services.yml +++ b/phpBB/config/services.yml @@ -109,6 +109,9 @@ services:      filesystem:          class: phpbb\filesystem +    file_downloader: +        class: phpbb\file_downloader +      http_kernel:          class: Symfony\Component\HttpKernel\HttpKernel          arguments: @@ -181,4 +184,5 @@ services:          arguments:              - @cache              - @config +            - @file_downloader              - @user diff --git a/phpBB/includes/functions_admin.php b/phpBB/includes/functions_admin.php index 5ddaf31cf5..0b9ea23fe7 100644 --- a/phpBB/includes/functions_admin.php +++ b/phpBB/includes/functions_admin.php @@ -2982,68 +2982,21 @@ function get_database_size()  /**  * Retrieve contents from remotely stored file +* +* @deprecated	3.1.2	Use file_downloader instead  */  function get_remote_file($host, $directory, $filename, &$errstr, &$errno, $port = 80, $timeout = 6)  { -	global $user; - -	if ($fsock = @fsockopen($host, $port, $errno, $errstr, $timeout)) -	{ -		@fputs($fsock, "GET $directory/$filename HTTP/1.0\r\n"); -		@fputs($fsock, "HOST: $host\r\n"); -		@fputs($fsock, "Connection: close\r\n\r\n"); +	global $phpbb_container; -		$timer_stop = time() + $timeout; -		stream_set_timeout($fsock, $timeout); - -		$file_info = ''; -		$get_info = false; - -		while (!@feof($fsock)) -		{ -			if ($get_info) -			{ -				$file_info .= @fread($fsock, 1024); -			} -			else -			{ -				$line = @fgets($fsock, 1024); -				if ($line == "\r\n") -				{ -					$get_info = true; -				} -				else if (stripos($line, '404 not found') !== false) -				{ -					$errstr = $user->lang('FILE_NOT_FOUND', $filename); -					return false; -				} -			} +	// Get file downloader and assign $errstr and $errno +	$file_downloader = $phpbb_container->get('file_downloader'); -			$stream_meta_data = stream_get_meta_data($fsock); - -			if (!empty($stream_meta_data['timed_out']) || time() >= $timer_stop) -			{ -				$errstr = $user->lang['FSOCK_TIMEOUT']; -				return false; -			} -		} -		@fclose($fsock); -	} -	else -	{ -		if ($errstr) -		{ -			$errstr = utf8_convert_message($errstr); -			return false; -		} -		else -		{ -			$errstr = $user->lang['FSOCK_DISABLED']; -			return false; -		} -	} +	$file_data = $file_downloader->get($host, $directory, $filename, $port, $timeout); +	$errstr = $file_downloader->get_error_string(); +	$errno = $file_downloader->get_error_number(); -	return $file_info; +	return $file_data;  }  /* diff --git a/phpBB/phpbb/file_downloader.php b/phpBB/phpbb/file_downloader.php new file mode 100644 index 0000000000..d717b394d5 --- /dev/null +++ b/phpBB/phpbb/file_downloader.php @@ -0,0 +1,120 @@ +<?php +/** +* +* This file is part of the phpBB Forum Software package. +* +* @copyright (c) phpBB Limited <https://www.phpbb.com> +* @license GNU General Public License, version 2 (GPL-2.0) +* +* For full copyright and license information, please see +* the docs/CREDITS.txt file. +* +*/ + +namespace phpbb; + +class file_downloader +{ +	/** @var string Error string */ +	protected $error_string = ''; + +	/** @var int Error number */ +	protected $error_number = 0; + +	/** +	 * Retrieve contents from remotely stored file +	 * +	 * @param string	$host			File host +	 * @param string	$directory		Directory file is in +	 * @param string	$filename		Filename of file to retrieve +	 * @param int		$port			Port to connect to; default: 80 +	 * @param int		$timeout		Connection timeout in seconds; default: 6 +	 * +	 * @return mixed File data as string if file can be read and there is no +	 *			timeout, false if there were errors or the connection timed out +	 * +	 * @throws \RuntimeException If data can't be retrieved and no error +	 *		message is returned +	 */ +	public function get($host, $directory, $filename, $port = 80, $timeout = 6) +	{ +		// Set default values for error variables +		$this->error_number = 0; +		$this->error_string = ''; + +		if ($socket = @fsockopen($host, $port, $this->error_number, $this->error_string, $timeout)) +		{ +			@fputs($socket, "GET $directory/$filename HTTP/1.0\r\n"); +			@fputs($socket, "HOST: $host\r\n"); +			@fputs($socket, "Connection: close\r\n\r\n"); + +			$timer_stop = time() + $timeout; +			stream_set_timeout($socket, $timeout); + +			$file_info = ''; +			$get_info = false; + +			while (!@feof($socket)) +			{ +				if ($get_info) +				{ +					$file_info .= @fread($socket, 1024); +				} +				else +				{ +					$line = @fgets($socket, 1024); +					if ($line == "\r\n") +					{ +						$get_info = true; +					} +					else if (stripos($line, '404 not found') !== false) +					{ +						throw new \RuntimeException(array('FILE_NOT_FOUND', $filename)); +					} +				} + +				$stream_meta_data = stream_get_meta_data($socket); + +				if (!empty($stream_meta_data['timed_out']) || time() >= $timer_stop) +				{ +					throw new \RuntimeException('FSOCK_TIMEOUT'); +				} +			} +			@fclose($socket); +		} +		else +		{ +			if ($this->error_string) +			{ +				$this->error_string = utf8_convert_message($this->error_string); +				return false; +			} +			else +			{ +				throw new \RuntimeException('FSOCK_DISABLED'); +			} +		} + +		return $file_info; +	} + +	/** +	 * Get error string +	 * +	 * @return string Error string +	 */ +	public function get_error_string() +	{ +		return $this->error_string; +	} + +	/** +	 * Get error number +	 * +	 * @return int Error number +	 */ +	public function get_error_number() +	{ +		return $this->error_number; +	} +} diff --git a/phpBB/phpbb/version_helper.php b/phpBB/phpbb/version_helper.php index bcc67712e4..8c106cf758 100644 --- a/phpBB/phpbb/version_helper.php +++ b/phpBB/phpbb/version_helper.php @@ -50,6 +50,9 @@ class version_helper  	/** @var \phpbb\config\config */  	protected $config; +	/** @var \phpbb\file_downloader */ +	protected $file_downloader; +  	/** @var \phpbb\user */  	protected $user; @@ -58,12 +61,14 @@ class version_helper  	 *  	 * @param \phpbb\cache\service $cache  	 * @param \phpbb\config\config $config +	 * @param \phpbb\file_downloader $file_downloader  	 * @param \phpbb\user $user  	 */ -	public function __construct(\phpbb\cache\service $cache, \phpbb\config\config $config, \phpbb\user $user) +	public function __construct(\phpbb\cache\service $cache, \phpbb\config\config $config, file_downloader $file_downloader, \phpbb\user $user)  	{  		$this->cache = $cache;  		$this->config = $config; +		$this->file_downloader = $file_downloader;  		$this->user = $user;  		if (defined('PHPBB_QA')) @@ -249,12 +254,18 @@ class version_helper  		}  		else if ($info === false || $force_update)  		{ -			$errstr = $errno = ''; -			$info = get_remote_file($this->host, $this->path, $this->file, $errstr, $errno); +			try { +				$info = $this->file_downloader->get($this->host, $this->path, $this->file); +			} +			catch (\RuntimeException $exception) +			{ +				throw new \RuntimeException(call_user_func_array(array($this->user, 'lang'), $exception->getMessage())); +			} +			$error_string = $this->file_downloader->get_error_string(); -			if (!empty($errstr)) +			if (!empty($error_string))  			{ -				throw new \RuntimeException($errstr); +				throw new \RuntimeException($error_string);  			}  			$info = json_decode($info, true); diff --git a/tests/version/version_fetch_test.php b/tests/version/version_fetch_test.php index 05eac58a52..cfc87183cf 100644 --- a/tests/version/version_fetch_test.php +++ b/tests/version/version_fetch_test.php @@ -33,6 +33,7 @@ class phpbb_version_helper_fetch_test extends phpbb_test_case  			new \phpbb\config\config(array(  				'version'	=> '3.1.0',  			)), +			new \phpbb\file_downloader(),  			new \phpbb\user('\phpbb\datetime')  		);  	} diff --git a/tests/version/version_test.php b/tests/version/version_test.php index ba31c79a79..528f1602d6 100644 --- a/tests/version/version_test.php +++ b/tests/version/version_test.php @@ -30,6 +30,7 @@ class phpbb_version_helper_test extends phpbb_test_case  			new \phpbb\config\config(array(  				'version'	=> '3.1.0',  			)), +			new \phpbb\file_downloader(),  			new \phpbb\user('\phpbb\datetime')  		);  	} @@ -208,6 +209,7 @@ class phpbb_version_helper_test extends phpbb_test_case  				new \phpbb\config\config(array(  					'version'	=> $current_version,  				)), +				new \phpbb\file_downloader(),  				new \phpbb\user('\phpbb\datetime'),  			))  			->getMock() @@ -318,6 +320,7 @@ class phpbb_version_helper_test extends phpbb_test_case  				new \phpbb\config\config(array(  					'version'	=> $current_version,  				)), +				new \phpbb\file_downloader(),  				new \phpbb\user('\phpbb\datetime'),  			))  			->getMock()  | 
