phpBB

Code Changes

File: phpbb/extension/metadata_manager.php

  Unmodified   Added   Modified   Removed
Line 18Line 18
*/
class metadata_manager
{

*/
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

	/**
* Name (including vendor) of the extension
* @var string

Line 58Line 40
	* Creates the metadata manager
*
* @param string $ext_name Name (including vendor) of the extension

	* 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->ext_name = $ext_name;
$this->metadata = array();

		$this->metadata_file = '';

		$this->metadata_file = $ext_path . 'composer.json';

	}

/**

	}

/**

Line 81Line 57
	*/
public function get_metadata($element = 'all')
{

	*/
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:


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->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':

			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;
}
}

/**

			break;
}
}

/**

	* Sets the filepath of the metadata file

	* Gets the metadata file contents and cleans loaded file

	*
* @throws \phpbb\extension\exception
*/

	*
* @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));

		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))
{
throw new \phpbb\extension\exception('FILE_NOT_FOUND', 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 (!($file_contents = file_get_contents($this->metadata_file)))
{
throw new \phpbb\extension\exception('FILE_CONTENT_ERR', array($this->metadata_file));

Line 164Line 107

array_walk_recursive($metadata, array($this, 'sanitize_json'));
$this->metadata = $metadata;


array_walk_recursive($metadata, array($this, 'sanitize_json'));
$this->metadata = $metadata;


return true;
}

 
	}

/**

	}

/**

Line 178Line 118
	public function sanitize_json(&$value, $key)
{
$value = htmlspecialchars($value);

	public function sanitize_json(&$value, $key)
{
$value = htmlspecialchars($value);

	}

/**
* This array handles the cleaning of the array
*
* @return array Contains the cleaned metadata array
*/
private function clean_metadata_array()
{
return $this->metadata;

 
	}

/**

	}

/**

Line 212Line 142
		switch ($name)
{
case 'all':

		switch ($name)
{
case 'all':

				$this->validate('display');


 
				$this->validate_enable();

				$this->validate_enable();

			break;

			// no break


case 'display':
foreach ($fields as $field => $data)


case 'display':
foreach ($fields as $field => $data)

Line 272Line 200
	/**
* This array handles the verification that this extension can be enabled on this board
*

	/**
* 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

	*/
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.
*

	}

/**
* 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()
{

	*/
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
*

	}


/**
* 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']))
{

	*/
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;

		}

return true;

Line 314Line 245
	/**
* Validates the contents of the php requirement field
*

	/**
* 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']))
{

	*/
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;

		}

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'] : '',
));
}

 
	}
}


	}
}