aboutsummaryrefslogtreecommitdiffstats
path: root/phpBB/phpbb/version_helper.php
diff options
context:
space:
mode:
Diffstat (limited to 'phpBB/phpbb/version_helper.php')
-rw-r--r--phpBB/phpbb/version_helper.php97
1 files changed, 74 insertions, 23 deletions
diff --git a/phpBB/phpbb/version_helper.php b/phpBB/phpbb/version_helper.php
index b00f4f1d5f..bb15dd1a74 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)
{
@@ -244,12 +241,75 @@ class version_helper
}
/**
+ * Gets the latest extension update for the current phpBB 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_ext_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;
+
+ // Get current phpBB branch from version, e.g.: 3.2
+ preg_match('/^(\d+\.\d+).*$/', $this->config['version'], $matches);
+ $current_branch = $matches[1];
+
+ // 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, '>=');
+ });
+
+ // Filter out any phpbb branches less than the current version
+ $branches = array_filter(array_keys($versions), function($branch) use ($self, $current_branch) {
+ return $self->compare($branch, $current_branch, '>=');
+ });
+ if (!empty($branches))
+ {
+ $versions = array_intersect_key($versions, array_flip($branches));
+ }
+ else
+ {
+ // If branches are empty, it means the current phpBB branch is newer than any branch the
+ // extension was validated against. Reverse sort the versions array so we get the newest
+ // validated release available.
+ krsort($versions);
+ }
+
+ // Get the first available 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 array
- * @throws \RuntimeException
+ * @throws version_check_exception
*/
public function get_suggested_updates($force_update = false, $force_cache = false)
{
@@ -270,7 +330,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 array Version info
- * @throws \RuntimeException
+ * @throws version_check_exception
*/
public function get_versions_matching_stability($force_update = false, $force_cache = false)
{
@@ -290,7 +350,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 array Version info, includes stable and unstable data
- * @throws \RuntimeException
+ * @throws version_check_exception
*/
public function get_versions($force_update = false, $force_cache = false)
{
@@ -300,23 +360,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);
@@ -333,9 +386,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'];