diff options
Diffstat (limited to 'phpBB/phpbb/version_helper.php')
| -rw-r--r-- | phpBB/phpbb/version_helper.php | 85 | 
1 files changed, 58 insertions, 27 deletions
| diff --git a/phpBB/phpbb/version_helper.php b/phpBB/phpbb/version_helper.php index a1e66ba8fe..fb330df26f 100644 --- a/phpBB/phpbb/version_helper.php +++ b/phpBB/phpbb/version_helper.php @@ -13,6 +13,8 @@  namespace phpbb; +use phpbb\exception\version_check_exception; +  /**   * Class to handle version checking and comparison   */ @@ -58,23 +60,18 @@ class version_helper  	/** @var \phpbb\file_downloader */  	protected $file_downloader; -	/** @var \phpbb\user */ -	protected $user; -  	/**  	 * Constructor  	 *  	 * @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\file_downloader $file_downloader, \phpbb\user $user) +	public function __construct(\phpbb\cache\service $cache, \phpbb\config\config $config, \phpbb\file_downloader $file_downloader)  	{  		$this->cache = $cache;  		$this->config = $config;  		$this->file_downloader = $file_downloader; -		$this->user = $user;  		if (defined('PHPBB_QA'))  		{ @@ -175,7 +172,7 @@ class version_helper  	* @param bool $force_update Ignores cached data. Defaults to false.  	* @param bool $force_cache Force the use of the cache. Override $force_update.  	* @return string -	* @throws \RuntimeException +	* @throws version_check_exception  	*/  	public function get_latest_on_current_branch($force_update = false, $force_cache = false)  	{ @@ -184,7 +181,7 @@ class version_helper  		$self = $this;  		$current_version = $this->current_version; -		// Filter out any versions less than to the current version +		// Filter out any versions less than the current version  		$versions = array_filter($versions, function($data) use ($self, $current_version) {  			return $self->compare($data['current'], $current_version, '>=');  		}); @@ -201,12 +198,55 @@ class version_helper  	}  	/** +	 * Gets the latest update for the current branch the user is on +	 * Will suggest versions from newer branches when EoL has been reached +	 * and/or version from newer branch is needed for having all known security +	 * issues fixed. +	 * +	 * @param bool $force_update Ignores cached data. Defaults to false. +	 * @param bool $force_cache Force the use of the cache. Override $force_update. +	 * @return array Version info or empty array if there are no updates +	 * @throws \RuntimeException +	 */ +	public function get_update_on_branch($force_update = false, $force_cache = false) +	{ +		$versions = $this->get_versions_matching_stability($force_update, $force_cache); + +		$self = $this; +		$current_version = $this->current_version; + +		// Filter out any versions less than the current version +		$versions = array_filter($versions, function($data) use ($self, $current_version) { +			return $self->compare($data['current'], $current_version, '>='); +		}); + +		// Get the lowest version from the previous list. +		$update_info = array_reduce($versions, function($value, $data) use ($self, $current_version) { +			if ($value === null && $self->compare($data['current'], $current_version, '>=')) +			{ +				if (!$data['eol'] && (!$data['security'] || $self->compare($data['security'], $data['current'], '<='))) +				{ +					return ($self->compare($data['current'], $current_version, '>')) ? $data : array(); +				} +				else +				{ +					return null; +				} +			} + +			return $value; +		}); + +		return $update_info === null ? array() : $update_info; +	} + +	/**  	* Obtains the latest version information  	*  	* @param bool $force_update Ignores cached data. Defaults to false.  	* @param bool $force_cache Force the use of the cache. Override $force_update. -	* @return string -	* @throws \RuntimeException +	* @return array +	* @throws version_check_exception  	*/  	public function get_suggested_updates($force_update = false, $force_cache = false)  	{ @@ -226,8 +266,8 @@ class version_helper  	*  	* @param bool $force_update Ignores cached data. Defaults to false.  	* @param bool $force_cache Force the use of the cache. Override $force_update. -	* @return string Version info -	* @throws \RuntimeException +	* @return array Version info +	* @throws version_check_exception  	*/  	public function get_versions_matching_stability($force_update = false, $force_cache = false)  	{ @@ -246,8 +286,8 @@ class version_helper  	*  	* @param bool $force_update Ignores cached data. Defaults to false.  	* @param bool $force_cache Force the use of the cache. Override $force_update. -	* @return string Version info, includes stable and unstable data -	* @throws \RuntimeException +	* @return array Version info, includes stable and unstable data +	* @throws version_check_exception  	*/  	public function get_versions($force_update = false, $force_cache = false)  	{ @@ -257,23 +297,16 @@ class version_helper  		if ($info === false && $force_cache)  		{ -			throw new \RuntimeException($this->user->lang('VERSIONCHECK_FAIL')); +			throw new version_check_exception('VERSIONCHECK_FAIL');  		}  		else if ($info === false || $force_update)  		{ -			try { -				$info = $this->file_downloader->get($this->host, $this->path, $this->file, $this->use_ssl ? 443 : 80); -			} -			catch (\phpbb\exception\runtime_exception $exception) -			{ -				$prepare_parameters = array_merge(array($exception->getMessage()), $exception->get_parameters()); -				throw new \RuntimeException(call_user_func_array(array($this->user, 'lang'), $prepare_parameters)); -			} +			$info = $this->file_downloader->get($this->host, $this->path, $this->file, $this->use_ssl ? 443 : 80);  			$error_string = $this->file_downloader->get_error_string();  			if (!empty($error_string))  			{ -				throw new \RuntimeException($error_string); +				throw new version_check_exception($error_string);  			}  			$info = json_decode($info, true); @@ -290,9 +323,7 @@ class version_helper  			if (empty($info['stable']) && empty($info['unstable']))  			{ -				$this->user->add_lang('acp/common'); - -				throw new \RuntimeException($this->user->lang('VERSIONCHECK_FAIL')); +				throw new version_check_exception('VERSIONCHECK_FAIL');  			}  			$info['stable'] = (empty($info['stable'])) ? array() : $info['stable']; | 
