1
0
mirror of https://github.com/phpbb/phpbb.git synced 2025-05-22 23:40:12 +02:00

Merge branch '3.2.x'

This commit is contained in:
Marc Alexander 2017-04-16 11:42:53 +02:00
commit c92c2aa2f4
No known key found for this signature in database
GPG Key ID: 50E0D2423696F995
5 changed files with 177 additions and 221 deletions

View File

@ -25,48 +25,49 @@ if (!defined('IN_PHPBB'))
class acp_extensions class acp_extensions
{ {
var $u_action; var $u_action;
var $tpl_name;
var $page_title;
private $db;
private $config; private $config;
private $template; private $template;
private $user; private $user;
private $cache;
private $log; private $log;
private $request; private $request;
private $phpbb_dispatcher;
private $ext_manager;
function main() function main()
{ {
// Start the page // Start the page
global $config, $user, $template, $request, $phpbb_extension_manager, $db, $phpbb_root_path, $phpbb_log, $cache, $phpbb_dispatcher; global $config, $user, $template, $request, $phpbb_extension_manager, $phpbb_root_path, $phpbb_log, $phpbb_dispatcher;
$this->db = $db;
$this->config = $config; $this->config = $config;
$this->template = $template; $this->template = $template;
$this->user = $user; $this->user = $user;
$this->cache = $cache;
$this->request = $request; $this->request = $request;
$this->log = $phpbb_log; $this->log = $phpbb_log;
$this->phpbb_dispatcher = $phpbb_dispatcher; $this->phpbb_dispatcher = $phpbb_dispatcher;
$this->ext_manager = $phpbb_extension_manager;
$user->add_lang(array('install', 'acp/extensions', 'migrator')); $this->user->add_lang(array('install', 'acp/extensions', 'migrator'));
$this->page_title = 'ACP_EXTENSIONS'; $this->page_title = 'ACP_EXTENSIONS';
$action = $request->variable('action', 'list'); $action = $this->request->variable('action', 'list');
$ext_name = $request->variable('ext_name', ''); $ext_name = $this->request->variable('ext_name', '');
// What is a safe limit of execution time? Half the max execution time should be safe. // What is a safe limit of execution time? Half the max execution time should be safe.
$safe_time_limit = (ini_get('max_execution_time') / 2); $safe_time_limit = (ini_get('max_execution_time') / 2);
$start_time = time(); $start_time = time();
// Cancel action // Cancel action
if ($request->is_set_post('cancel')) if ($this->request->is_set_post('cancel'))
{ {
$action = 'list'; $action = 'list';
$ext_name = ''; $ext_name = '';
} }
if (in_array($action, array('enable', 'disable', 'delete_data')) && !check_link_hash($request->variable('hash', ''), $action . '.' . $ext_name)) if (in_array($action, array('enable', 'disable', 'delete_data')) && !check_link_hash($this->request->variable('hash', ''), $action . '.' . $ext_name))
{ {
trigger_error('FORM_INVALID', E_USER_WARNING); trigger_error('FORM_INVALID', E_USER_WARNING);
} }
@ -96,7 +97,7 @@ class acp_extensions
// If they've specified an extension, let's load the metadata manager and validate it. // If they've specified an extension, let's load the metadata manager and validate it.
if ($ext_name) if ($ext_name)
{ {
$md_manager = new \phpbb\extension\metadata_manager($ext_name, $config, $phpbb_extension_manager, $phpbb_root_path); $md_manager = $this->ext_manager->create_extension_metadata_manager($ext_name);
try try
{ {
@ -125,12 +126,12 @@ class acp_extensions
'force_unstable' => $force_unstable, 'force_unstable' => $force_unstable,
)); ));
confirm_box(false, $user->lang('EXTENSION_FORCE_UNSTABLE_CONFIRM'), $s_hidden_fields); confirm_box(false, $this->user->lang('EXTENSION_FORCE_UNSTABLE_CONFIRM'), $s_hidden_fields);
} }
else else
{ {
$config->set('extension_force_unstable', false); $this->config->set('extension_force_unstable', false);
trigger_error($user->lang['CONFIG_UPDATED'] . adm_back_link($this->u_action)); trigger_error($this->user->lang['CONFIG_UPDATED'] . adm_back_link($this->u_action));
} }
break; break;
@ -138,17 +139,17 @@ class acp_extensions
default: default:
if (confirm_box(true)) if (confirm_box(true))
{ {
$config->set('extension_force_unstable', true); $this->config->set('extension_force_unstable', true);
trigger_error($user->lang['CONFIG_UPDATED'] . adm_back_link($this->u_action)); trigger_error($this->user->lang['CONFIG_UPDATED'] . adm_back_link($this->u_action));
} }
$this->list_enabled_exts($phpbb_extension_manager); $this->list_enabled_exts();
$this->list_disabled_exts($phpbb_extension_manager); $this->list_disabled_exts();
$this->list_available_exts($phpbb_extension_manager); $this->list_available_exts();
$this->template->assign_vars(array( $this->template->assign_vars(array(
'U_VERSIONCHECK_FORCE' => $this->u_action . '&action=list&versioncheck_force=1', 'U_VERSIONCHECK_FORCE' => $this->u_action . '&action=list&versioncheck_force=1',
'FORCE_UNSTABLE' => $config['extension_force_unstable'], 'FORCE_UNSTABLE' => $this->config['extension_force_unstable'],
'U_ACTION' => $this->u_action, 'U_ACTION' => $this->u_action,
)); ));
@ -166,20 +167,20 @@ class acp_extensions
trigger_error($message . adm_back_link($this->u_action), E_USER_WARNING); trigger_error($message . adm_back_link($this->u_action), E_USER_WARNING);
} }
$extension = $phpbb_extension_manager->get_extension($ext_name); $extension = $this->ext_manager->get_extension($ext_name);
if (!$extension->is_enableable()) if (!$extension->is_enableable())
{ {
trigger_error($user->lang['EXTENSION_NOT_ENABLEABLE'] . adm_back_link($this->u_action), E_USER_WARNING); trigger_error($this->user->lang['EXTENSION_NOT_ENABLEABLE'] . adm_back_link($this->u_action), E_USER_WARNING);
} }
if ($phpbb_extension_manager->is_enabled($ext_name)) if ($this->ext_manager->is_enabled($ext_name))
{ {
redirect($this->u_action); redirect($this->u_action);
} }
$this->tpl_name = 'acp_ext_enable'; $this->tpl_name = 'acp_ext_enable';
$template->assign_vars(array( $this->template->assign_vars(array(
'PRE' => true, 'PRE' => true,
'L_CONFIRM_MESSAGE' => $this->user->lang('EXTENSION_ENABLE_CONFIRM', $md_manager->get_metadata('display-name')), 'L_CONFIRM_MESSAGE' => $this->user->lang('EXTENSION_ENABLE_CONFIRM', $md_manager->get_metadata('display-name')),
'U_ENABLE' => $this->u_action . '&action=enable&ext_name=' . urlencode($ext_name) . '&hash=' . generate_link_hash('enable.' . $ext_name), 'U_ENABLE' => $this->u_action . '&action=enable&ext_name=' . urlencode($ext_name) . '&hash=' . generate_link_hash('enable.' . $ext_name),
@ -197,47 +198,47 @@ class acp_extensions
trigger_error($message . adm_back_link($this->u_action), E_USER_WARNING); trigger_error($message . adm_back_link($this->u_action), E_USER_WARNING);
} }
$extension = $phpbb_extension_manager->get_extension($ext_name); $extension = $this->ext_manager->get_extension($ext_name);
if (!$extension->is_enableable()) if (!$extension->is_enableable())
{ {
trigger_error($user->lang['EXTENSION_NOT_ENABLEABLE'] . adm_back_link($this->u_action), E_USER_WARNING); trigger_error($this->user->lang['EXTENSION_NOT_ENABLEABLE'] . adm_back_link($this->u_action), E_USER_WARNING);
} }
try try
{ {
while ($phpbb_extension_manager->enable_step($ext_name)) while ($this->ext_manager->enable_step($ext_name))
{ {
// Are we approaching the time limit? If so we want to pause the update and continue after refreshing // Are we approaching the time limit? If so we want to pause the update and continue after refreshing
if ((time() - $start_time) >= $safe_time_limit) if ((time() - $start_time) >= $safe_time_limit)
{ {
$template->assign_var('S_NEXT_STEP', true); $this->template->assign_var('S_NEXT_STEP', true);
meta_refresh(0, $this->u_action . '&action=enable&ext_name=' . urlencode($ext_name) . '&hash=' . generate_link_hash('enable.' . $ext_name)); meta_refresh(0, $this->u_action . '&action=enable&ext_name=' . urlencode($ext_name) . '&hash=' . generate_link_hash('enable.' . $ext_name));
} }
} }
$this->log->add('admin', $user->data['user_id'], $user->ip, 'LOG_EXT_ENABLE', time(), array($ext_name)); $this->log->add('admin', $this->user->data['user_id'], $this->user->ip, 'LOG_EXT_ENABLE', time(), array($ext_name));
} }
catch (\phpbb\db\migration\exception $e) catch (\phpbb\db\migration\exception $e)
{ {
$template->assign_var('MIGRATOR_ERROR', $e->getLocalisedMessage($user)); $this->template->assign_var('MIGRATOR_ERROR', $e->getLocalisedMessage($this->user));
} }
$this->tpl_name = 'acp_ext_enable'; $this->tpl_name = 'acp_ext_enable';
$template->assign_vars(array( $this->template->assign_vars(array(
'U_RETURN' => $this->u_action . '&action=list', 'U_RETURN' => $this->u_action . '&action=list',
)); ));
break; break;
case 'disable_pre': case 'disable_pre':
if (!$phpbb_extension_manager->is_enabled($ext_name)) if (!$this->ext_manager->is_enabled($ext_name))
{ {
redirect($this->u_action); redirect($this->u_action);
} }
$this->tpl_name = 'acp_ext_disable'; $this->tpl_name = 'acp_ext_disable';
$template->assign_vars(array( $this->template->assign_vars(array(
'PRE' => true, 'PRE' => true,
'L_CONFIRM_MESSAGE' => $this->user->lang('EXTENSION_DISABLE_CONFIRM', $md_manager->get_metadata('display-name')), 'L_CONFIRM_MESSAGE' => $this->user->lang('EXTENSION_DISABLE_CONFIRM', $md_manager->get_metadata('display-name')),
'U_DISABLE' => $this->u_action . '&action=disable&ext_name=' . urlencode($ext_name) . '&hash=' . generate_link_hash('disable.' . $ext_name), 'U_DISABLE' => $this->u_action . '&action=disable&ext_name=' . urlencode($ext_name) . '&hash=' . generate_link_hash('disable.' . $ext_name),
@ -245,38 +246,38 @@ class acp_extensions
break; break;
case 'disable': case 'disable':
if (!$phpbb_extension_manager->is_enabled($ext_name)) if (!$this->ext_manager->is_enabled($ext_name))
{ {
redirect($this->u_action); redirect($this->u_action);
} }
while ($phpbb_extension_manager->disable_step($ext_name)) while ($this->ext_manager->disable_step($ext_name))
{ {
// Are we approaching the time limit? If so we want to pause the update and continue after refreshing // Are we approaching the time limit? If so we want to pause the update and continue after refreshing
if ((time() - $start_time) >= $safe_time_limit) if ((time() - $start_time) >= $safe_time_limit)
{ {
$template->assign_var('S_NEXT_STEP', true); $this->template->assign_var('S_NEXT_STEP', true);
meta_refresh(0, $this->u_action . '&action=disable&ext_name=' . urlencode($ext_name) . '&hash=' . generate_link_hash('disable.' . $ext_name)); meta_refresh(0, $this->u_action . '&action=disable&ext_name=' . urlencode($ext_name) . '&hash=' . generate_link_hash('disable.' . $ext_name));
} }
} }
$this->log->add('admin', $user->data['user_id'], $user->ip, 'LOG_EXT_DISABLE', time(), array($ext_name)); $this->log->add('admin', $this->user->data['user_id'], $this->user->ip, 'LOG_EXT_DISABLE', time(), array($ext_name));
$this->tpl_name = 'acp_ext_disable'; $this->tpl_name = 'acp_ext_disable';
$template->assign_vars(array( $this->template->assign_vars(array(
'U_RETURN' => $this->u_action . '&action=list', 'U_RETURN' => $this->u_action . '&action=list',
)); ));
break; break;
case 'delete_data_pre': case 'delete_data_pre':
if ($phpbb_extension_manager->is_enabled($ext_name)) if ($this->ext_manager->is_enabled($ext_name))
{ {
redirect($this->u_action); redirect($this->u_action);
} }
$this->tpl_name = 'acp_ext_delete_data'; $this->tpl_name = 'acp_ext_delete_data';
$template->assign_vars(array( $this->template->assign_vars(array(
'PRE' => true, 'PRE' => true,
'L_CONFIRM_MESSAGE' => $this->user->lang('EXTENSION_DELETE_DATA_CONFIRM', $md_manager->get_metadata('display-name')), 'L_CONFIRM_MESSAGE' => $this->user->lang('EXTENSION_DELETE_DATA_CONFIRM', $md_manager->get_metadata('display-name')),
'U_PURGE' => $this->u_action . '&action=delete_data&ext_name=' . urlencode($ext_name) . '&hash=' . generate_link_hash('delete_data.' . $ext_name), 'U_PURGE' => $this->u_action . '&action=delete_data&ext_name=' . urlencode($ext_name) . '&hash=' . generate_link_hash('delete_data.' . $ext_name),
@ -284,72 +285,72 @@ class acp_extensions
break; break;
case 'delete_data': case 'delete_data':
if ($phpbb_extension_manager->is_enabled($ext_name)) if ($this->ext_manager->is_enabled($ext_name))
{ {
redirect($this->u_action); redirect($this->u_action);
} }
try try
{ {
while ($phpbb_extension_manager->purge_step($ext_name)) while ($this->ext_manager->purge_step($ext_name))
{ {
// Are we approaching the time limit? If so we want to pause the update and continue after refreshing // Are we approaching the time limit? If so we want to pause the update and continue after refreshing
if ((time() - $start_time) >= $safe_time_limit) if ((time() - $start_time) >= $safe_time_limit)
{ {
$template->assign_var('S_NEXT_STEP', true); $this->template->assign_var('S_NEXT_STEP', true);
meta_refresh(0, $this->u_action . '&action=delete_data&ext_name=' . urlencode($ext_name) . '&hash=' . generate_link_hash('delete_data.' . $ext_name)); meta_refresh(0, $this->u_action . '&action=delete_data&ext_name=' . urlencode($ext_name) . '&hash=' . generate_link_hash('delete_data.' . $ext_name));
} }
} }
$this->log->add('admin', $user->data['user_id'], $user->ip, 'LOG_EXT_PURGE', time(), array($ext_name)); $this->log->add('admin', $this->user->data['user_id'], $this->user->ip, 'LOG_EXT_PURGE', time(), array($ext_name));
} }
catch (\phpbb\db\migration\exception $e) catch (\phpbb\db\migration\exception $e)
{ {
$template->assign_var('MIGRATOR_ERROR', $e->getLocalisedMessage($user)); $this->template->assign_var('MIGRATOR_ERROR', $e->getLocalisedMessage($this->user));
} }
$this->tpl_name = 'acp_ext_delete_data'; $this->tpl_name = 'acp_ext_delete_data';
$template->assign_vars(array( $this->template->assign_vars(array(
'U_RETURN' => $this->u_action . '&action=list', 'U_RETURN' => $this->u_action . '&action=list',
)); ));
break; break;
case 'details': case 'details':
// Output it to the template // Output it to the template
$md_manager->output_template_data($template);
$meta = $md_manager->get_metadata('all'); $meta = $md_manager->get_metadata('all');
$this->output_metadata_to_template($meta);
if (isset($meta['extra']['version-check'])) if (isset($meta['extra']['version-check']))
{ {
try try
{ {
$updates_available = $phpbb_extension_manager->version_check($md_manager, $request->variable('versioncheck_force', false), false, $this->config['extension_force_unstable'] ? 'unstable' : null); $updates_available = $this->ext_manager->version_check($md_manager, $this->request->variable('versioncheck_force', false), false, $this->config['extension_force_unstable'] ? 'unstable' : null);
$template->assign_vars(array( $this->template->assign_vars(array(
'S_UP_TO_DATE' => empty($updates_available), 'S_UP_TO_DATE' => empty($updates_available),
'UP_TO_DATE_MSG' => $this->user->lang(empty($updates_available) ? 'UP_TO_DATE' : 'NOT_UP_TO_DATE', $md_manager->get_metadata('display-name')), 'UP_TO_DATE_MSG' => $this->user->lang(empty($updates_available) ? 'UP_TO_DATE' : 'NOT_UP_TO_DATE', $md_manager->get_metadata('display-name')),
)); ));
$template->assign_block_vars('updates_available', $updates_available); $this->template->assign_block_vars('updates_available', $updates_available);
} }
catch (exception_interface $e) catch (exception_interface $e)
{ {
$message = call_user_func_array(array($this->user, 'lang'), array_merge(array($e->getMessage()), $e->get_parameters())); $message = call_user_func_array(array($this->user, 'lang'), array_merge(array($e->getMessage()), $e->get_parameters()));
$template->assign_vars(array( $this->template->assign_vars(array(
'S_VERSIONCHECK_FAIL' => true, 'S_VERSIONCHECK_FAIL' => true,
'VERSIONCHECK_FAIL_REASON' => ($e->getMessage() !== 'VERSIONCHECK_FAIL') ? $message : '', 'VERSIONCHECK_FAIL_REASON' => ($e->getMessage() !== 'VERSIONCHECK_FAIL') ? $message : '',
)); ));
} }
$template->assign_var('S_VERSIONCHECK', true); $this->template->assign_var('S_VERSIONCHECK', true);
} }
else else
{ {
$template->assign_var('S_VERSIONCHECK', false); $this->template->assign_var('S_VERSIONCHECK', false);
} }
$template->assign_vars(array( $this->template->assign_vars(array(
'U_BACK' => $this->u_action . '&action=list', 'U_BACK' => $this->u_action . '&action=list',
'U_VERSIONCHECK_FORCE' => $this->u_action . '&action=details&versioncheck_force=1&ext_name=' . urlencode($md_manager->get_metadata('name')), 'U_VERSIONCHECK_FORCE' => $this->u_action . '&action=details&versioncheck_force=1&ext_name=' . urlencode($md_manager->get_metadata('name')),
)); ));
@ -383,16 +384,15 @@ class acp_extensions
/** /**
* Lists all the enabled extensions and dumps to the template * Lists all the enabled extensions and dumps to the template
* *
* @param $phpbb_extension_manager An instance of the extension manager
* @return null * @return null
*/ */
public function list_enabled_exts(\phpbb\extension\manager $phpbb_extension_manager) public function list_enabled_exts()
{ {
$enabled_extension_meta_data = array(); $enabled_extension_meta_data = array();
foreach ($phpbb_extension_manager->all_enabled() as $name => $location) foreach ($this->ext_manager->all_enabled() as $name => $location)
{ {
$md_manager = $phpbb_extension_manager->create_extension_metadata_manager($name); $md_manager = $this->ext_manager->create_extension_metadata_manager($name);
try try
{ {
@ -407,7 +407,7 @@ class acp_extensions
try try
{ {
$force_update = $this->request->variable('versioncheck_force', false); $force_update = $this->request->variable('versioncheck_force', false);
$updates = $phpbb_extension_manager->version_check($md_manager, $force_update, !$force_update); $updates = $this->ext_manager->version_check($md_manager, $force_update, !$force_update);
$enabled_extension_meta_data[$name]['S_UP_TO_DATE'] = empty($updates); $enabled_extension_meta_data[$name]['S_UP_TO_DATE'] = empty($updates);
$enabled_extension_meta_data[$name]['S_VERSIONCHECK'] = true; $enabled_extension_meta_data[$name]['S_VERSIONCHECK'] = true;
@ -455,16 +455,15 @@ class acp_extensions
/** /**
* Lists all the disabled extensions and dumps to the template * Lists all the disabled extensions and dumps to the template
* *
* @param $phpbb_extension_manager An instance of the extension manager
* @return null * @return null
*/ */
public function list_disabled_exts(\phpbb\extension\manager $phpbb_extension_manager) public function list_disabled_exts()
{ {
$disabled_extension_meta_data = array(); $disabled_extension_meta_data = array();
foreach ($phpbb_extension_manager->all_disabled() as $name => $location) foreach ($this->ext_manager->all_disabled() as $name => $location)
{ {
$md_manager = $phpbb_extension_manager->create_extension_metadata_manager($name); $md_manager = $this->ext_manager->create_extension_metadata_manager($name);
try try
{ {
@ -477,7 +476,7 @@ class acp_extensions
if (isset($meta['extra']['version-check'])) if (isset($meta['extra']['version-check']))
{ {
$force_update = $this->request->variable('versioncheck_force', false); $force_update = $this->request->variable('versioncheck_force', false);
$updates = $phpbb_extension_manager->version_check($md_manager, $force_update, !$force_update); $updates = $this->ext_manager->version_check($md_manager, $force_update, !$force_update);
$disabled_extension_meta_data[$name]['S_UP_TO_DATE'] = empty($updates); $disabled_extension_meta_data[$name]['S_UP_TO_DATE'] = empty($updates);
$disabled_extension_meta_data[$name]['S_VERSIONCHECK'] = true; $disabled_extension_meta_data[$name]['S_VERSIONCHECK'] = true;
@ -525,18 +524,17 @@ class acp_extensions
/** /**
* Lists all the available extensions and dumps to the template * Lists all the available extensions and dumps to the template
* *
* @param $phpbb_extension_manager An instance of the extension manager
* @return null * @return null
*/ */
public function list_available_exts(\phpbb\extension\manager $phpbb_extension_manager) public function list_available_exts()
{ {
$uninstalled = array_diff_key($phpbb_extension_manager->all_available(), $phpbb_extension_manager->all_configured()); $uninstalled = array_diff_key($this->ext_manager->all_available(), $this->ext_manager->all_configured());
$available_extension_meta_data = array(); $available_extension_meta_data = array();
foreach ($uninstalled as $name => $location) foreach ($uninstalled as $name => $location)
{ {
$md_manager = $phpbb_extension_manager->create_extension_metadata_manager($name); $md_manager = $this->ext_manager->create_extension_metadata_manager($name);
try try
{ {
@ -549,7 +547,7 @@ class acp_extensions
if (isset($meta['extra']['version-check'])) if (isset($meta['extra']['version-check']))
{ {
$force_update = $this->request->variable('versioncheck_force', false); $force_update = $this->request->variable('versioncheck_force', false);
$updates = $phpbb_extension_manager->version_check($md_manager, $force_update, !$force_update); $updates = $this->ext_manager->version_check($md_manager, $force_update, !$force_update);
$available_extension_meta_data[$name]['S_UP_TO_DATE'] = empty($updates); $available_extension_meta_data[$name]['S_UP_TO_DATE'] = empty($updates);
$available_extension_meta_data[$name]['S_VERSIONCHECK'] = true; $available_extension_meta_data[$name]['S_VERSIONCHECK'] = true;
@ -614,4 +612,41 @@ class acp_extensions
{ {
return strnatcasecmp($val1['META_DISPLAY_NAME'], $val2['META_DISPLAY_NAME']); return strnatcasecmp($val1['META_DISPLAY_NAME'], $val2['META_DISPLAY_NAME']);
} }
/**
* Outputs extension metadata into the template
*
* @param array $metadata Array with all metadata for the extension
* @return null
*/
public function output_metadata_to_template($metadata)
{
$this->template->assign_vars(array(
'META_NAME' => $metadata['name'],
'META_TYPE' => $metadata['type'],
'META_DESCRIPTION' => (isset($metadata['description'])) ? $metadata['description'] : '',
'META_HOMEPAGE' => (isset($metadata['homepage'])) ? $metadata['homepage'] : '',
'META_VERSION' => $metadata['version'],
'META_TIME' => (isset($metadata['time'])) ? $metadata['time'] : '',
'META_LICENSE' => $metadata['license'],
'META_REQUIRE_PHP' => (isset($metadata['require']['php'])) ? $metadata['require']['php'] : '',
'META_REQUIRE_PHP_FAIL' => (isset($metadata['require']['php'])) ? false : true,
'META_REQUIRE_PHPBB' => (isset($metadata['extra']['soft-require']['phpbb/phpbb'])) ? $metadata['extra']['soft-require']['phpbb/phpbb'] : '',
'META_REQUIRE_PHPBB_FAIL' => (isset($metadata['extra']['soft-require']['phpbb/phpbb'])) ? false : true,
'META_DISPLAY_NAME' => (isset($metadata['extra']['display-name'])) ? $metadata['extra']['display-name'] : '',
));
foreach ($metadata['authors'] as $author)
{
$this->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'] : '',
));
}
}
} }

View File

@ -134,7 +134,7 @@ class check extends \phpbb\console\command\command
try try
{ {
$ext_manager = $this->phpbb_container->get('ext.manager'); $ext_manager = $this->phpbb_container->get('ext.manager');
$md_manager = $ext_manager->create_extension_metadata_manager($ext_name, null); $md_manager = $ext_manager->create_extension_metadata_manager($ext_name);
$updates_available = $ext_manager->version_check($md_manager, $recheck, false, $stability); $updates_available = $ext_manager->version_check($md_manager, $recheck, false, $stability);
$metadata = $md_manager->get_metadata('all'); $metadata = $md_manager->get_metadata('all');

View File

@ -152,7 +152,12 @@ class manager
*/ */
public function create_extension_metadata_manager($name) 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) public function enable_step($name)
{ {
// ignore extensions that are already enabled // ignore extensions that are already enabled
if (isset($this->extensions[$name]) && $this->extensions[$name]['ext_active']) if ($this->is_enabled($name))
{ {
return false; return false;
} }
@ -258,7 +263,7 @@ class manager
public function disable_step($name) public function disable_step($name)
{ {
// ignore extensions that are already disabled // ignore extensions that are already disabled
if (!isset($this->extensions[$name]) || !$this->extensions[$name]['ext_active']) if ($this->is_disabled($name))
{ {
return false; return false;
} }
@ -336,8 +341,8 @@ class manager
*/ */
public function purge_step($name) public function purge_step($name)
{ {
// ignore extensions that do not exist // ignore extensions that are not configured
if (!isset($this->extensions[$name])) if (!$this->is_configured($name))
{ {
return false; return false;
} }
@ -431,25 +436,11 @@ class manager
if ($file_info->isFile() && $file_info->getFilename() == 'composer.json') if ($file_info->isFile() && $file_info->getFilename() == 'composer.json')
{ {
$ext_name = $iterator->getInnerIterator()->getSubPath(); $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); $ext_name = str_replace(DIRECTORY_SEPARATOR, '/', $ext_name);
if ($this->is_available($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'])
{ {
continue; $available[$ext_name] = $this->get_extension_path($ext_name, true);
} }
$available[$ext_name] = $this->phpbb_root_path . 'ext/' . $ext_name . '/';
} }
} }
ksort($available); ksort($available);
@ -472,9 +463,13 @@ class manager
$configured = array(); $configured = array();
foreach ($this->extensions as $name => $data) foreach ($this->extensions as $name => $data)
{ {
if ($this->is_configured($name))
{
unset($data['metadata']);
$data['ext_path'] = ($phpbb_relative ? $this->phpbb_root_path : '') . $data['ext_path']; $data['ext_path'] = ($phpbb_relative ? $this->phpbb_root_path : '') . $data['ext_path'];
$configured[$name] = $data; $configured[$name] = $data;
} }
}
return $configured; return $configured;
} }
@ -490,7 +485,7 @@ class manager
$enabled = array(); $enabled = array();
foreach ($this->extensions as $name => $data) 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']; $enabled[$name] = ($phpbb_relative ? $this->phpbb_root_path : '') . $data['ext_path'];
} }
@ -511,7 +506,7 @@ class manager
$disabled = array(); $disabled = array();
foreach ($this->extensions as $name => $data) 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']; $disabled[$name] = ($phpbb_relative ? $this->phpbb_root_path : '') . $data['ext_path'];
} }
@ -527,7 +522,15 @@ class manager
*/ */
public function is_available($name) 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) 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) 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) public function is_configured($name)
{ {
return isset($this->extensions[$name]); return isset($this->extensions[$name]['ext_active']);
} }
/** /**

View File

@ -18,24 +18,6 @@ namespace phpbb\extension;
*/ */
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 * Name (including vendor) of the extension
* @var string * @var string
@ -58,19 +40,13 @@ class metadata_manager
* Creates the metadata manager * Creates the metadata manager
* *
* @param string $ext_name Name (including vendor) of the extension * @param string $ext_name Name (including vendor) of the extension
* @param \phpbb\config\config $config phpBB Config instance * @param string $ext_path Path to the extension directory including root path
* @param \phpbb\extension\manager $extension_manager An instance of the phpBB extension manager
* @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_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->ext_name = $ext_name;
$this->metadata = array(); $this->metadata = array();
$this->metadata_file = ''; $this->metadata_file = $ext_path . 'composer.json';
} }
/** /**
@ -81,13 +57,11 @@ class metadata_manager
*/ */
public function get_metadata($element = 'all') public function get_metadata($element = 'all')
{ {
$this->set_metadata_file(); // Fetch and clean the metadata if not done yet
if ($this->metadata === array())
// Fetch the metadata {
$this->fetch_metadata(); $this->fetch_metadata_from_file();
}
// Clean the metadata
$this->clean_metadata_array();
switch ($element) switch ($element)
{ {
@ -110,37 +84,17 @@ class metadata_manager
} }
/** /**
* 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));
}
}
/**
* 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_exists($this->metadata_file))
{ {
throw new \phpbb\extension\exception('FILE_NOT_FOUND', array($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))) if (!($file_contents = file_get_contents($this->metadata_file)))
{ {
throw new \phpbb\extension\exception('FILE_CONTENT_ERR', array($this->metadata_file)); throw new \phpbb\extension\exception('FILE_CONTENT_ERR', array($this->metadata_file));
@ -153,9 +107,6 @@ class metadata_manager
array_walk_recursive($metadata, array($this, 'sanitize_json')); array_walk_recursive($metadata, array($this, 'sanitize_json'));
$this->metadata = $metadata; $this->metadata = $metadata;
return true;
}
} }
/** /**
@ -169,16 +120,6 @@ class metadata_manager
$value = htmlspecialchars($value); $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;
}
/** /**
* Validate fields * Validate fields
* *
@ -201,8 +142,23 @@ class metadata_manager
switch ($name) switch ($name)
{ {
case 'all': case 'all':
$this->validate_enable(); $this->validate('display');
// no break
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;
case 'display': case 'display':
foreach ($fields as $field => $data) foreach ($fields as $field => $data)
@ -316,40 +272,4 @@ class metadata_manager
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' => (isset($this->metadata['require']['php'])) ? false : true,
'META_REQUIRE_PHPBB' => (isset($this->metadata['extra']['soft-require']['phpbb/phpbb'])) ? $this->metadata['extra']['soft-require']['phpbb/phpbb'] : '',
'META_REQUIRE_PHPBB_FAIL' => (isset($this->metadata['extra']['soft-require']['phpbb/phpbb'])) ? false : true,
'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'] : '',
));
}
}
} }

View File

@ -364,9 +364,7 @@ class phpbb_extension_metadata_manager_test extends phpbb_database_test_case
{ {
return new phpbb_mock_metadata_manager( return new phpbb_mock_metadata_manager(
$ext_name, $ext_name,
$this->config, $this->extension_manager->get_extension_path($ext_name, true)
$this->extension_manager,
$this->phpbb_root_path
); );
} }
} }