aboutsummaryrefslogtreecommitdiffstats
path: root/phpBB/phpbb/extension
diff options
context:
space:
mode:
Diffstat (limited to 'phpBB/phpbb/extension')
-rw-r--r--phpBB/phpbb/extension/manager.php65
-rw-r--r--phpBB/phpbb/extension/metadata_manager.php199
2 files changed, 75 insertions, 189 deletions
diff --git a/phpBB/phpbb/extension/manager.php b/phpBB/phpbb/extension/manager.php
index ca0ff31d5d..00aa2c6826 100644
--- a/phpBB/phpbb/extension/manager.php
+++ b/phpBB/phpbb/extension/manager.php
@@ -152,7 +152,12 @@ class manager
*/
public function create_extension_metadata_manager($name)
{
- return new \phpbb\extension\metadata_manager($name, $this->config, $this, $this->phpbb_root_path);
+ if (!isset($this->extensions[$name]['metadata']))
+ {
+ $metadata = new \phpbb\extension\metadata_manager($name, $this->get_extension_path($name, true));
+ $this->extensions[$name]['metadata'] = $metadata;
+ }
+ return $this->extensions[$name]['metadata'];
}
/**
@@ -168,7 +173,7 @@ class manager
public function enable_step($name)
{
// ignore extensions that are already enabled
- if (isset($this->extensions[$name]) && $this->extensions[$name]['ext_active'])
+ if ($this->is_enabled($name))
{
return false;
}
@@ -258,7 +263,7 @@ class manager
public function disable_step($name)
{
// ignore extensions that are already disabled
- if (!isset($this->extensions[$name]) || !$this->extensions[$name]['ext_active'])
+ if ($this->is_disabled($name))
{
return false;
}
@@ -336,8 +341,8 @@ class manager
*/
public function purge_step($name)
{
- // ignore extensions that do not exist
- if (!isset($this->extensions[$name]))
+ // ignore extensions that are not configured
+ if (!$this->is_configured($name))
{
return false;
}
@@ -431,25 +436,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->get_extension_path($ext_name, true);
}
-
- $available[$ext_name] = $this->phpbb_root_path . 'ext/' . $ext_name . '/';
}
}
ksort($available);
@@ -472,8 +463,12 @@ class manager
$configured = array();
foreach ($this->extensions as $name => $data)
{
- $data['ext_path'] = ($phpbb_relative ? $this->phpbb_root_path : '') . $data['ext_path'];
- $configured[$name] = $data;
+ if ($this->is_configured($name))
+ {
+ unset($data['metadata']);
+ $data['ext_path'] = ($phpbb_relative ? $this->phpbb_root_path : '') . $data['ext_path'];
+ $configured[$name] = $data;
+ }
}
return $configured;
}
@@ -490,7 +485,7 @@ class manager
$enabled = array();
foreach ($this->extensions as $name => $data)
{
- if ($data['ext_active'])
+ if ($this->is_enabled($name))
{
$enabled[$name] = ($phpbb_relative ? $this->phpbb_root_path : '') . $data['ext_path'];
}
@@ -511,7 +506,7 @@ class manager
$disabled = array();
foreach ($this->extensions as $name => $data)
{
- if (!$data['ext_active'])
+ if ($this->is_disabled($name))
{
$disabled[$name] = ($phpbb_relative ? $this->phpbb_root_path : '') . $data['ext_path'];
}
@@ -527,7 +522,15 @@ class manager
*/
public function is_available($name)
{
- return file_exists($this->get_extension_path($name, true));
+ $md_manager = $this->create_extension_metadata_manager($name);
+ try
+ {
+ return $md_manager->get_metadata('all') && $md_manager->validate_enable();
+ }
+ catch (\phpbb\extension\exception $e)
+ {
+ return false;
+ }
}
/**
@@ -538,7 +541,7 @@ class manager
*/
public function is_enabled($name)
{
- return isset($this->extensions[$name]) && $this->extensions[$name]['ext_active'];
+ return isset($this->extensions[$name]['ext_active']) && $this->extensions[$name]['ext_active'];
}
/**
@@ -549,7 +552,7 @@ class manager
*/
public function is_disabled($name)
{
- return isset($this->extensions[$name]) && !$this->extensions[$name]['ext_active'];
+ return isset($this->extensions[$name]['ext_active']) && !$this->extensions[$name]['ext_active'];
}
/**
@@ -563,7 +566,7 @@ class manager
*/
public function is_configured($name)
{
- return isset($this->extensions[$name]);
+ return isset($this->extensions[$name]['ext_active']);
}
/**
@@ -573,7 +576,7 @@ class manager
* @param bool $force_update Ignores cached data. Defaults to false.
* @param bool $force_cache Force the use of the cache. Override $force_update.
* @param string $stability Force the stability (null by default).
- * @return string
+ * @return array
* @throws runtime_exception
*/
public function version_check(\phpbb\extension\metadata_manager $md_manager, $force_update = false, $force_cache = false, $stability = null)
@@ -592,7 +595,7 @@ class manager
$version_helper->set_file_location($version_check['host'], $version_check['directory'], $version_check['filename'], isset($version_check['ssl']) ? $version_check['ssl'] : false);
$version_helper->force_stability($stability);
- return $updates = $version_helper->get_suggested_updates($force_update, $force_cache);
+ return $version_helper->get_ext_update_on_branch($force_update, $force_cache);
}
/**
diff --git a/phpBB/phpbb/extension/metadata_manager.php b/phpBB/phpbb/extension/metadata_manager.php
index ae1af10c1d..60b8db8310 100644
--- a/phpBB/phpbb/extension/metadata_manager.php
+++ b/phpBB/phpbb/extension/metadata_manager.php
@@ -19,24 +19,6 @@ namespace phpbb\extension;
class metadata_manager
{
/**
- * phpBB Config instance
- * @var \phpbb\config\config
- */
- protected $config;
-
- /**
- * phpBB Extension Manager
- * @var \phpbb\extension\manager
- */
- protected $extension_manager;
-
- /**
- * phpBB root path
- * @var string
- */
- protected $phpbb_root_path;
-
- /**
* Name (including vendor) of the extension
* @var string
*/
@@ -58,19 +40,13 @@ class metadata_manager
* Creates the 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 string $phpbb_root_path Path to the phpbb includes directory.
+ * @param string $ext_path Path to the extension directory including root path
*/
- public function __construct($ext_name, \phpbb\config\config $config, \phpbb\extension\manager $extension_manager, $phpbb_root_path)
+ public function __construct($ext_name, $ext_path)
{
- $this->config = $config;
- $this->extension_manager = $extension_manager;
- $this->phpbb_root_path = $phpbb_root_path;
-
$this->ext_name = $ext_name;
$this->metadata = array();
- $this->metadata_file = '';
+ $this->metadata_file = $ext_path . 'composer.json';
}
/**
@@ -81,92 +57,56 @@ class metadata_manager
*/
public function get_metadata($element = 'all')
{
- $this->set_metadata_file();
-
- // Fetch the metadata
- $this->fetch_metadata();
-
- // Clean the metadata
- $this->clean_metadata_array();
+ // Fetch and clean the metadata if not done yet
+ if ($this->metadata === array())
+ {
+ $this->fetch_metadata_from_file();
+ }
switch ($element)
{
case 'all':
default:
- // Validate the metadata
- if (!$this->validate())
- {
- return false;
- }
-
+ $this->validate();
return $this->metadata;
break;
case 'version':
case 'name':
- return ($this->validate($element)) ? $this->metadata[$element] : false;
+ $this->validate($element);
+ return $this->metadata[$element];
break;
case 'display-name':
- if (isset($this->metadata['extra']['display-name']))
- {
- return $this->metadata['extra']['display-name'];
- }
- else
- {
- return ($this->validate('name')) ? $this->metadata['name'] : false;
- }
+ return (isset($this->metadata['extra']['display-name'])) ? $this->metadata['extra']['display-name'] : $this->get_metadata('name');
break;
}
}
/**
- * Sets the filepath of the metadata file
+ * Gets the metadata file contents and cleans loaded file
*
* @throws \phpbb\extension\exception
*/
- private function set_metadata_file()
+ private function fetch_metadata_from_file()
{
- $ext_filepath = $this->extension_manager->get_extension_path($this->ext_name);
- $metadata_filepath = $this->phpbb_root_path . $ext_filepath . 'composer.json';
-
- $this->metadata_file = $metadata_filepath;
-
if (!file_exists($this->metadata_file))
{
throw new \phpbb\extension\exception('FILE_NOT_FOUND', array($this->metadata_file));
}
- }
- /**
- * Gets the contents of the composer.json file
- *
- * @return bool True if success, throws an exception on failure
- * @throws \phpbb\extension\exception
- */
- private function fetch_metadata()
- {
- if (!file_exists($this->metadata_file))
+ if (!($file_contents = file_get_contents($this->metadata_file)))
{
- throw new \phpbb\extension\exception('FILE_NOT_FOUND', array($this->metadata_file));
+ throw new \phpbb\extension\exception('FILE_CONTENT_ERR', array($this->metadata_file));
}
- else
- {
- if (!($file_contents = file_get_contents($this->metadata_file)))
- {
- throw new \phpbb\extension\exception('FILE_CONTENT_ERR', array($this->metadata_file));
- }
-
- if (($metadata = json_decode($file_contents, true)) === null)
- {
- throw new \phpbb\extension\exception('FILE_JSON_DECODE_ERR', array($this->metadata_file));
- }
-
- array_walk_recursive($metadata, array($this, 'sanitize_json'));
- $this->metadata = $metadata;
- return true;
+ if (($metadata = json_decode($file_contents, true)) === null)
+ {
+ throw new \phpbb\extension\exception('FILE_JSON_DECODE_ERR', array($this->metadata_file));
}
+
+ array_walk_recursive($metadata, array($this, 'sanitize_json'));
+ $this->metadata = $metadata;
}
/**
@@ -181,16 +121,6 @@ class metadata_manager
}
/**
- * This array handles the cleaning of the array
- *
- * @return array Contains the cleaned metadata array
- */
- private function clean_metadata_array()
- {
- return $this->metadata;
- }
-
- /**
* Validate fields
*
* @param string $name ("all" for display and enable validation
@@ -212,23 +142,8 @@ class metadata_manager
switch ($name)
{
case 'all':
- $this->validate('display');
-
- if (!$this->validate_dir())
- {
- throw new \phpbb\extension\exception('EXTENSION_DIR_INVALID');
- }
-
- if (!$this->validate_require_phpbb())
- {
- throw new \phpbb\extension\exception('META_FIELD_NOT_SET', array('soft-require'));
- }
-
- if (!$this->validate_require_php())
- {
- throw new \phpbb\extension\exception('META_FIELD_NOT_SET', array('require php'));
- }
- break;
+ $this->validate_enable();
+ // no break
case 'display':
foreach ($fields as $field => $data)
@@ -285,40 +200,43 @@ class metadata_manager
/**
* This array handles the verification that this extension can be enabled on this board
*
- * @return bool True if validation succeeded, False if failed
+ * @return bool True if validation succeeded, throws an exception if invalid
+ * @throws \phpbb\extension\exception
*/
public function validate_enable()
{
// Check for valid directory & phpBB, PHP versions
- if (!$this->validate_dir() || !$this->validate_require_phpbb() || !$this->validate_require_php())
- {
- return false;
- }
-
- return true;
+ return $this->validate_dir() && $this->validate_require_phpbb() && $this->validate_require_php();
}
/**
* Validates the most basic directory structure to ensure it follows <vendor>/<ext> convention.
*
- * @return boolean True when passes validation
+ * @return boolean True when passes validation, throws an exception if invalid
+ * @throws \phpbb\extension\exception
*/
public function validate_dir()
{
- return (substr_count($this->ext_name, '/') === 1 && $this->ext_name == $this->get_metadata('name'));
+ if (substr_count($this->ext_name, '/') !== 1 || $this->ext_name != $this->get_metadata('name'))
+ {
+ throw new \phpbb\extension\exception('EXTENSION_DIR_INVALID');
+ }
+
+ return true;
}
/**
* Validates the contents of the phpbb requirement field
*
- * @return boolean True when passes validation
+ * @return boolean True when passes validation, throws an exception if invalid
+ * @throws \phpbb\extension\exception
*/
public function validate_require_phpbb()
{
if (!isset($this->metadata['extra']['soft-require']['phpbb/phpbb']))
{
- return false;
+ throw new \phpbb\extension\exception('META_FIELD_NOT_SET', array('soft-require'));
}
return true;
@@ -327,51 +245,16 @@ class metadata_manager
/**
* Validates the contents of the php requirement field
*
- * @return boolean True when passes validation
+ * @return boolean True when passes validation, throws an exception if invalid
+ * @throws \phpbb\extension\exception
*/
public function validate_require_php()
{
if (!isset($this->metadata['require']['php']))
{
- return false;
+ throw new \phpbb\extension\exception('META_FIELD_NOT_SET', array('require php'));
}
return true;
}
-
- /**
- * Outputs the metadata into the template
- *
- * @param \phpbb\template\template $template phpBB Template instance
- */
- public function output_template_data(\phpbb\template\template $template)
- {
- $template->assign_vars(array(
- 'META_NAME' => $this->metadata['name'],
- 'META_TYPE' => $this->metadata['type'],
- 'META_DESCRIPTION' => (isset($this->metadata['description'])) ? $this->metadata['description'] : '',
- 'META_HOMEPAGE' => (isset($this->metadata['homepage'])) ? $this->metadata['homepage'] : '',
- 'META_VERSION' => (isset($this->metadata['version'])) ? $this->metadata['version'] : '',
- 'META_TIME' => (isset($this->metadata['time'])) ? $this->metadata['time'] : '',
- 'META_LICENSE' => $this->metadata['license'],
-
- 'META_REQUIRE_PHP' => (isset($this->metadata['require']['php'])) ? $this->metadata['require']['php'] : '',
- 'META_REQUIRE_PHP_FAIL' => !$this->validate_require_php(),
-
- 'META_REQUIRE_PHPBB' => (isset($this->metadata['extra']['soft-require']['phpbb/phpbb'])) ? $this->metadata['extra']['soft-require']['phpbb/phpbb'] : '',
- 'META_REQUIRE_PHPBB_FAIL' => !$this->validate_require_phpbb(),
-
- 'META_DISPLAY_NAME' => (isset($this->metadata['extra']['display-name'])) ? $this->metadata['extra']['display-name'] : '',
- ));
-
- foreach ($this->metadata['authors'] as $author)
- {
- $template->assign_block_vars('meta_authors', array(
- 'AUTHOR_NAME' => $author['name'],
- 'AUTHOR_EMAIL' => (isset($author['email'])) ? $author['email'] : '',
- 'AUTHOR_HOMEPAGE' => (isset($author['homepage'])) ? $author['homepage'] : '',
- 'AUTHOR_ROLE' => (isset($author['role'])) ? $author['role'] : '',
- ));
- }
- }
}