From efc2b46303614b0824d3f58f51778e7ff925ccf5 Mon Sep 17 00:00:00 2001 From: javiexin Date: Mon, 26 Dec 2016 21:07:31 +0100 Subject: [PATCH 1/5] [ticket/14938] Inconsistency in ext_mgr all_available vs is_available Made is_available much more strict, in line with the checks in all_available PHPBB3-14938 --- phpBB/phpbb/extension/manager.php | 24 +++++++++++++++++++++++- 1 file changed, 23 insertions(+), 1 deletion(-) diff --git a/phpBB/phpbb/extension/manager.php b/phpBB/phpbb/extension/manager.php index 76f0e3558e..770c574dd5 100644 --- a/phpBB/phpbb/extension/manager.php +++ b/phpBB/phpbb/extension/manager.php @@ -524,7 +524,29 @@ class manager */ public function is_available($name) { - return file_exists($this->get_extension_path($name, true)); + // Not available if the folder does not exist + if (!file_exists($this->get_extension_path($name, true))) + { + return false; + } + + $composer_file = $this->get_extension_path($name, true) . '/composer.json'; + + // Not available if there is no composer.json. + if (!is_readable($composer_file) || !($ext_info = file_get_contents($composer_file))) + { + return false; + } + $ext_info = json_decode($ext_info, true); + + // Not available if malformed name or if the directory structure + // does not match the name value specified in composer.json. + if (substr_count($name, '/') !== 1 || !isset($ext_info['name']) || $name != $ext_info['name']) + { + return false; + } + + return true; } /** From 9658ecae8bb2c66bc105cf6787df6b8c40277676 Mon Sep 17 00:00:00 2001 From: javiexin Date: Fri, 30 Dec 2016 21:50:04 +0100 Subject: [PATCH 2/5] [ticket/14938] Inconsistency in ext_mgr all_available vs is_available Made is_available much more strict, in line with the checks in all_available Refactor all_available to use is_available, saving duplicate code. PHPBB3-14938 --- phpBB/phpbb/extension/manager.php | 20 +++----------------- 1 file changed, 3 insertions(+), 17 deletions(-) diff --git a/phpBB/phpbb/extension/manager.php b/phpBB/phpbb/extension/manager.php index 770c574dd5..036a0fc07d 100644 --- a/phpBB/phpbb/extension/manager.php +++ b/phpBB/phpbb/extension/manager.php @@ -433,25 +433,11 @@ class manager if ($file_info->isFile() && $file_info->getFilename() == 'composer.json') { $ext_name = $iterator->getInnerIterator()->getSubPath(); - $composer_file = $iterator->getPath() . '/composer.json'; - - // Ignore the extension if there is no composer.json. - if (!is_readable($composer_file) || !($ext_info = file_get_contents($composer_file))) - { - continue; - } - - $ext_info = json_decode($ext_info, true); $ext_name = str_replace(DIRECTORY_SEPARATOR, '/', $ext_name); - - // Ignore the extension if directory depth is not correct or if the directory structure - // does not match the name value specified in composer.json. - if (substr_count($ext_name, '/') !== 1 || !isset($ext_info['name']) || $ext_name != $ext_info['name']) + if ($this->is_available($ext_name)) { - continue; + $available[$ext_name] = $this->phpbb_root_path . 'ext/' . $ext_name . '/'; } - - $available[$ext_name] = $this->phpbb_root_path . 'ext/' . $ext_name . '/'; } } ksort($available); @@ -530,7 +516,7 @@ class manager return false; } - $composer_file = $this->get_extension_path($name, true) . '/composer.json'; + $composer_file = $this->get_extension_path($name, true) . 'composer.json'; // Not available if there is no composer.json. if (!is_readable($composer_file) || !($ext_info = file_get_contents($composer_file))) From abd6bd815449ba59c2b5737ebb0b47a55221a01c Mon Sep 17 00:00:00 2001 From: javiexin Date: Thu, 9 Feb 2017 23:10:29 +0100 Subject: [PATCH 3/5] [ticket/14938] Inconsistency in ext_mgr all_available vs is_available Made is_available much more strict, in line with the checks in all_available Refactor all_available to use is_available, saving duplicate code. Further simplify is_available by using metadata_manager. PHPBB3-14938 --- phpBB/phpbb/extension/manager.php | 26 ++++++-------------------- 1 file changed, 6 insertions(+), 20 deletions(-) diff --git a/phpBB/phpbb/extension/manager.php b/phpBB/phpbb/extension/manager.php index 036a0fc07d..608fd12444 100644 --- a/phpBB/phpbb/extension/manager.php +++ b/phpBB/phpbb/extension/manager.php @@ -510,29 +510,15 @@ class manager */ public function is_available($name) { - // Not available if the folder does not exist - if (!file_exists($this->get_extension_path($name, true))) + $md_manager = $this->create_extension_metadata_manager($name, $this->container->get('template')); + try + { + return $md_manager->get_metadata('all') && $md_manager->validate_enable(); + } + catch (\phpbb\extension\exception $e) { return false; } - - $composer_file = $this->get_extension_path($name, true) . 'composer.json'; - - // Not available if there is no composer.json. - if (!is_readable($composer_file) || !($ext_info = file_get_contents($composer_file))) - { - return false; - } - $ext_info = json_decode($ext_info, true); - - // Not available if malformed name or if the directory structure - // does not match the name value specified in composer.json. - if (substr_count($name, '/') !== 1 || !isset($ext_info['name']) || $name != $ext_info['name']) - { - return false; - } - - return true; } /** From 7313eb54b4f23c9ccd238e1a368c69bedb452229 Mon Sep 17 00:00:00 2001 From: javiexin Date: Fri, 10 Feb 2017 00:35:23 +0100 Subject: [PATCH 4/5] [ticket/14938] Inconsistency in ext_mgr all_available vs is_available Made is_available much more strict, in line with the checks in all_available Refactor all_available to use is_available, saving duplicate code. Further simplify is_available by using metadata_manager. Make optional the template object on metadata_manager creation. PHPBB3-14938 --- phpBB/phpbb/extension/manager.php | 6 +++--- phpBB/phpbb/extension/metadata_manager.php | 4 ++-- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/phpBB/phpbb/extension/manager.php b/phpBB/phpbb/extension/manager.php index 608fd12444..e7e5f83c23 100644 --- a/phpBB/phpbb/extension/manager.php +++ b/phpBB/phpbb/extension/manager.php @@ -149,10 +149,10 @@ class manager * Instantiates the metadata manager for the extension with the given name * * @param string $name The extension name - * @param \phpbb\template\template $template The template manager + * @param \phpbb\template\template $template The template manager or null * @return \phpbb\extension\metadata_manager Instance of the metadata manager */ - public function create_extension_metadata_manager($name, \phpbb\template\template $template) + public function create_extension_metadata_manager($name, \phpbb\template\template $template = null) { return new \phpbb\extension\metadata_manager($name, $this->config, $this, $template, $this->user, $this->phpbb_root_path); } @@ -510,7 +510,7 @@ class manager */ public function is_available($name) { - $md_manager = $this->create_extension_metadata_manager($name, $this->container->get('template')); + $md_manager = $this->create_extension_metadata_manager($name); try { return $md_manager->get_metadata('all') && $md_manager->validate_enable(); diff --git a/phpBB/phpbb/extension/metadata_manager.php b/phpBB/phpbb/extension/metadata_manager.php index a64d88fe39..0593cdabe1 100644 --- a/phpBB/phpbb/extension/metadata_manager.php +++ b/phpBB/phpbb/extension/metadata_manager.php @@ -72,11 +72,11 @@ class metadata_manager * @param string $ext_name Name (including vendor) of the extension * @param \phpbb\config\config $config phpBB Config instance * @param \phpbb\extension\manager $extension_manager An instance of the phpBB extension manager - * @param \phpbb\template\template $template phpBB Template instance + * @param \phpbb\template\template $template phpBB Template instance or null * @param \phpbb\user $user User instance * @param string $phpbb_root_path Path to the phpbb includes directory. */ - public function __construct($ext_name, \phpbb\config\config $config, \phpbb\extension\manager $extension_manager, \phpbb\template\template $template, \phpbb\user $user, $phpbb_root_path) + public function __construct($ext_name, \phpbb\config\config $config, \phpbb\extension\manager $extension_manager, \phpbb\template\template $template = null, \phpbb\user $user, $phpbb_root_path) { $this->config = $config; $this->extension_manager = $extension_manager; From 7b2ffaf78c9f591d1b68e650918a59cc436adecf Mon Sep 17 00:00:00 2001 From: javiexin Date: Fri, 10 Feb 2017 02:09:18 +0100 Subject: [PATCH 5/5] [ticket/14938] Inconsistency in ext_mgr all_available vs is_available Made is_available much more strict, in line with the checks in all_available Refactor all_available to use is_available, saving duplicate code. Further simplify is_available by using metadata_manager. Make optional the template object on metadata_manager creation. Fix extension_manager_mock to have config and user components. PHPBB3-14938 --- tests/mock/extension_manager.php | 2 ++ 1 file changed, 2 insertions(+) diff --git a/tests/mock/extension_manager.php b/tests/mock/extension_manager.php index 3b759fbbc2..94268159a8 100644 --- a/tests/mock/extension_manager.php +++ b/tests/mock/extension_manager.php @@ -20,5 +20,7 @@ class phpbb_mock_extension_manager extends \phpbb\extension\manager $this->extensions = $extensions; $this->filesystem = new \phpbb\filesystem(); $this->container = $container; + $this->config = new \phpbb\config\config(array()); + $this->user = new \phpbb\user('\phpbb\datetime'); } }