[ticket/10631] Various tidbits and cleanup on the acp extensions manager

PHPBB3-10631
This commit is contained in:
Nathan Guse 2012-07-22 18:11:56 -05:00 committed by Unknown Bliss
parent c45243a91e
commit 3ba59c6362
5 changed files with 253 additions and 243 deletions

View file

@ -40,24 +40,11 @@
<td><strong>{disabled.EXT_NAME}</strong></a></td> <td><strong>{disabled.EXT_NAME}</strong></a></td>
<td style="text-align: center;"><a href="{disabled.U_DETAILS}">{L_DETAILS}</a></td> <td style="text-align: center;"><a href="{disabled.U_DETAILS}">{L_DETAILS}</a></td>
<td style="text-align: center;"><a href="{disabled.U_ENABLE}">{L_ENABLE}</a>&nbsp; <td style="text-align: center;"><a href="{disabled.U_ENABLE}">{L_ENABLE}</a>&nbsp;
|&nbsp;<a href="{disabled.U_PURGE}">{L_PURGE}</a>&nbsp; <!-- IF disabled.U_PURGE -->|&nbsp;<a href="{disabled.U_PURGE}">{L_PURGE}</a>&nbsp;<!-- ENDIF -->
|&nbsp;<a href="{disabled.U_DELETE}">{L_DELETE}</a></td> <!-- IF disabled.U_DELETE -->|&nbsp;<a href="{disabled.U_DELETE}">{L_DELETE}</a><!-- ENDIF --></td>
</tr> </tr>
<!-- END disabled --> <!-- END disabled -->
<!-- ENDIF --> <!-- ENDIF -->
<!-- IF .avaliable -->
<tr>
<td class="row3" colspan="3"><strong>{L_AVALIABLE} {L_EXTENSIONS}</strong></td>
</tr>
<!-- BEGIN avaliable -->
<tr>
<td><strong>{avaliable.EXT_NAME}</strong></a></td>
<td style="text-align: center;"><a href="{avaliable.U_DETAILS}">{L_DETAILS}</a></td>
<td style="text-align: center;"><a href="{avaliable.U_ENABLE}">{L_ENABLE}</a>&nbsp;
|&nbsp;<a href="{avaliable.U_DELETE}">{L_DELETE}</a></td>
</tr>
<!-- END avaliable -->
<!-- ENDIF -->
</tbody> </tbody>
</table> </table>

View file

@ -25,7 +25,7 @@ class acp_extensions
function main() function main()
{ {
// Start the page // Start the page
global $user, $template, $request, $phpbb_extension_manager, $db, $phpbb_root_path; global $user, $template, $request, $phpbb_extension_manager, $db, $phpbb_root_path, $phpEx;
$user->add_lang(array('install', 'acp/extensions')); $user->add_lang(array('install', 'acp/extensions'));
@ -39,8 +39,8 @@ class acp_extensions
{ {
case 'list': case 'list':
default: default:
$this->list_enabled_exts($db, $template); $this->list_enabled_exts($phpbb_extension_manager, $template);
$this->list_disabled_exts($db, $template); $this->list_disabled_exts($phpbb_extension_manager, $template);
$this->list_available_exts($phpbb_extension_manager, $template); $this->list_available_exts($phpbb_extension_manager, $template);
$this->tpl_name = 'acp_ext_list'; $this->tpl_name = 'acp_ext_list';
@ -103,7 +103,7 @@ class acp_extensions
)); ));
break; break;
case 'delete_pre': /*case 'delete_pre':
$this->tpl_name = 'acp_ext_delete'; $this->tpl_name = 'acp_ext_delete';
$template->assign_vars(array( $template->assign_vars(array(
@ -114,11 +114,15 @@ class acp_extensions
case 'delete': case 'delete':
$this->tpl_name = 'acp_ext_delete'; $this->tpl_name = 'acp_ext_delete';
break; break;*/
case 'details': case 'details':
$md_manager = new phpbb_extension_metadata_manager($ext_name, $db, $phpbb_extension_manager, $phpbb_root_path, ".$phpEx", $template); $md_manager = new phpbb_extension_metadata_manager($ext_name, $db, $phpbb_extension_manager, $phpbb_root_path, ".$phpEx", $template);
$md_manager->get_all_meta_data('all', true);
if ($md_manager->get_metadata('all', true) === false)
{
trigger_error('EXTENSION_INVALID');
}
$this->tpl_name = 'acp_ext_details'; $this->tpl_name = 'acp_ext_details';
break; break;
@ -128,91 +132,74 @@ class acp_extensions
/** /**
* Lists all the enabled extensions and dumps to the template * Lists all the enabled extensions and dumps to the template
* *
* @param $db A database connection * @param $phpbb_extension_manager An instance of the extension manager
* @param $template An instance of the template engine * @param $template An instance of the template engine
* @return null * @return null
*/ */
private function list_enabled_exts($db, $template) private function list_enabled_exts(phpbb_extension_manager $phpbb_extension_manager, phpbb_template $template)
{ {
$sql = 'SELECT ext_name foreach ($phpbb_extension_manager->all_enabled() as $name => $location)
FROM ' . EXT_TABLE . '
WHERE ext_active = 1
ORDER BY ext_name ASC';
$result = $db->sql_query($sql);
// TODO: Use the display name from the composer.json
while ($row = $db->sql_fetchrow($result))
{ {
$template->assign_block_vars('enabled', array( $md_manager = $phpbb_extension_manager->get_extension_metadata($name, $template);
'EXT_NAME' => $row['ext_name'],
'U_DETAILS' => $this->u_action . '&amp;action=details&amp;ext_name=' . $row['ext_name'], $template->assign_block_vars('enabled', array(
'U_PURGE' => $this->u_action . '&amp;action=purge_pre&amp;ext_name=' . $row['ext_name'], 'EXT_NAME' => $md_manager->get_metadata('name'),
'U_DISABLE' => $this->u_action . '&amp;action=disable_pre&amp;ext_name=' . $row['ext_name'],
'U_DETAILS' => $this->u_action . '&amp;action=details&amp;ext_name=' . $name,
'U_PURGE' => $this->u_action . '&amp;action=purge_pre&amp;ext_name=' . $name,
'U_DISABLE' => $this->u_action . '&amp;action=disable_pre&amp;ext_name=' . $name,
)); ));
} }
$db->sql_freeresult($result);
return;
} }
/** /**
* Lists all the disabled extensions and dumps to the template * Lists all the disabled extensions and dumps to the template
* *
* @param $db A database connection * @param $phpbb_extension_manager An instance of the extension manager
* @param $template An instance of the template engine * @param $template An instance of the template engine
* @return null * @return null
*/ */
private function list_disabled_exts($db, $template) private function list_disabled_exts(phpbb_extension_manager $phpbb_extension_manager, phpbb_template $template)
{ {
$sql = 'SELECT ext_name foreach ($phpbb_extension_manager->all_disabled() as $name => $location)
FROM ' . EXT_TABLE . '
WHERE ext_active = 0
ORDER BY ext_name ASC';
$result = $db->sql_query($sql);
// TODO: Use the display name from the composer.json
while ($row = $db->sql_fetchrow($result))
{ {
$template->assign_block_vars('disabled', array( $md_manager = $phpbb_extension_manager->get_extension_metadata($name, $template);
'EXT_NAME' => $row['ext_name'],
'U_DETAILS' => $this->u_action . '&amp;action=details&amp;ext_name=' . $row['ext_name'], $template->assign_block_vars('disabled', array(
'U_PURGE' => $this->u_action . '&amp;action=purge_pre&amp;ext_name=' . $row['ext_name'], 'EXT_NAME' => $md_manager->get_metadata('name'),
'U_DELETE' => $this->u_action . '&amp;action=delete_pre&amp;ext_name=' . $row['ext_name'],
'U_ENABLE' => $this->u_action . '&amp;action=enable_pre&amp;ext_name=' . $row['ext_name'], 'U_DETAILS' => $this->u_action . '&amp;action=details&amp;ext_name=' . $name,
'U_PURGE' => $this->u_action . '&amp;action=purge_pre&amp;ext_name=' . $name,
//'U_DELETE' => $this->u_action . '&amp;action=delete_pre&amp;ext_name=' . $name,
'U_ENABLE' => $this->u_action . '&amp;action=enable_pre&amp;ext_name=' . $name,
)); ));
} }
$db->sql_freeresult($result);
return;
} }
/** /**
* Lists all the available extensions and dumps to the template * Lists all the available extensions and dumps to the template
* *
* @param $db A database connection * @param $phpbb_extension_manager An instance of the extension manager
* @param $template An instance of the template engine * @param $template An instance of the template engine
* @return null * @return null
*/ */
function list_available_exts($phpbb_extension_manager, $template) function list_available_exts(phpbb_extension_manager $phpbb_extension_manager, phpbb_template $template)
{ {
$phpbb_extension_manager->load_extensions();
$all_available = array_keys($phpbb_extension_manager->all_available()); $all_available = array_keys($phpbb_extension_manager->all_available());
$all_configured = array_keys($phpbb_extension_manager->all_configured()); $all_configured = array_keys($phpbb_extension_manager->all_configured());
$uninstalled = array_diff($all_available, $all_configured); $uninstalled = array_diff($all_available, $all_configured);
// TODO: Use the display name from the composer.json foreach ($uninstalled as $name => $location)
foreach ($uninstalled as $ext)
{ {
$template->assign_block_vars('disabled', array( $md_manager = $phpbb_extension_manager->get_extension_metadata($ext, $template);
'EXT_NAME' => $ext['ext_name'],
'U_DETAILS' => $this->u_action . '&amp;action=details&amp;ext_name=' . $ext['ext_name'], $template->assign_block_vars('disabled', array(
'U_DELETE' => $this->u_action . '&amp;action=delete_pre&amp;ext_name=' . $ext['ext_name'], 'EXT_NAME' => $md_manager->get_metadata('name'),
'U_ENABLE' => $this->u_action . '&amp;action=enable_pre&amp;ext_name=' . $ext['ext_name'],
'U_DETAILS' => $this->u_action . '&amp;action=details&amp;ext_name=' . $name,
//'U_DELETE' => $this->u_action . '&amp;action=delete_pre&amp;ext_name=' . $name,
'U_ENABLE' => $this->u_action . '&amp;action=enable_pre&amp;ext_name=' . $name,
)); ));
} }
return;
} }
} }

View file

@ -22,6 +22,7 @@ if (!defined('IN_PHPBB'))
*/ */
class phpbb_extension_manager class phpbb_extension_manager
{ {
protected $db;
protected $cache; protected $cache;
protected $php_ext; protected $php_ext;
protected $extensions; protected $extensions;
@ -120,6 +121,18 @@ class phpbb_extension_manager
} }
} }
/**
* Instantiates the metadata manager for the extension with the given name
*
* @param string $name The extension name
* @param string $template The template manager
* @return phpbb_extension_metadata_manager Instance of the metadata manager
*/
public function get_extension_metadata($name, phpbb_template $template)
{
return new phpbb_extension_metadata_manager($name, $this->db, $this, $this->phpbb_root_path, $this->phpEx, $template);
}
/** /**
* Runs a step of the extension enabling process. * Runs a step of the extension enabling process.
* *

View file

@ -26,6 +26,7 @@ class phpbb_extension_metadata_manager
protected $extension_manager; protected $extension_manager;
protected $db; protected $db;
protected $phpbb_root_path; protected $phpbb_root_path;
protected $template;
protected $ext_name; protected $ext_name;
public $metadata; public $metadata;
protected $metadata_file; protected $metadata_file;
@ -38,11 +39,12 @@ class phpbb_extension_metadata_manager
* @param string $phpbb_root_path Path to the phpbb includes directory. * @param string $phpbb_root_path Path to the phpbb includes directory.
* @param string $phpEx php file extension * @param string $phpEx php file extension
*/ */
public function __construct($ext_name, dbal $db, phpbb_extension_manager $extension_manager, $phpbb_root_path, $phpEx = '.php') public function __construct($ext_name, dbal $db, phpbb_extension_manager $extension_manager, $phpbb_root_path, $phpEx = '.php', phpbb_template $template)
{ {
$this->phpbb_root_path = $phpbb_root_path; $this->phpbb_root_path = $phpbb_root_path;
$this->db = $db; $this->db = $db;
$this->phpEx = $phpEx; $this->phpEx = $phpEx;
$this->template = $template;
$this->extension_manager = $extension_manager; $this->extension_manager = $extension_manager;
$this->ext_name = $ext_name; $this->ext_name = $ext_name;
$this->metadata = array(); $this->metadata = array();
@ -56,7 +58,7 @@ class phpbb_extension_metadata_manager
* @param boolean $template_output True if you want the requested metadata assigned to template vars * @param boolean $template_output True if you want the requested metadata assigned to template vars
* @return array Contains all of the requested metadata * @return array Contains all of the requested metadata
*/ */
public function get_metadata($element = 'all', $template_output = false, phpbb_template $template) public function get_metadata($element = 'all', $template_output = false)
{ {
// TODO: Check ext_name exists and is an extension that exists // TODO: Check ext_name exists and is an extension that exists
if (!$this->set_metadata_file()) if (!$this->set_metadata_file())
@ -64,6 +66,11 @@ class phpbb_extension_metadata_manager
return false; return false;
} }
if (!$this->fetch_metadata())
{
return false;
}
switch ($element) switch ($element)
{ {
case 'all': case 'all':
@ -82,7 +89,7 @@ class phpbb_extension_metadata_manager
break; break;
case 'name': case 'name':
if ($this->validate_name) if ($this->validate_name())
{ {
if ($template_output) if ($template_output)
{ {
@ -90,6 +97,7 @@ class phpbb_extension_metadata_manager
'MD_NAME' => htmlspecialchars($this->metadata['name']), 'MD_NAME' => htmlspecialchars($this->metadata['name']),
)); ));
} }
return $this->metadata['name']; return $this->metadata['name'];
} }
else else
@ -150,7 +158,7 @@ class phpbb_extension_metadata_manager
*/ */
private function validate_name() private function validate_name()
{ {
return preg_match('^[a-zA-Z0-9_\x7f-\xff]{2,}/[a-zA-Z0-9_\x7f-\xff]{2,}$', $this->metadata['name']); return preg_match('#^[a-zA-Z0-9_\x7f-\xff]{2,}/[a-zA-Z0-9_\x7f-\xff]{2,}$#', $this->metadata['name']);
} }
/** /**
@ -160,7 +168,7 @@ class phpbb_extension_metadata_manager
*/ */
private function validate_type() private function validate_type()
{ {
return $this->metadata['type'] != 'phpbb3-extension'; return $this->metadata['type'] == 'phpbb3-extension';
} }
/** /**
@ -170,7 +178,7 @@ class phpbb_extension_metadata_manager
*/ */
private function validate_description() private function validate_description()
{ {
return preg_match('^{10,}$', $this->metadata['description']); return preg_match('#^{10,}$#', $this->metadata['description']);
} }
/** /**
@ -180,7 +188,7 @@ class phpbb_extension_metadata_manager
*/ */
private function validate_version() private function validate_version()
{ {
return preg_match('^[0-9]{1,2}\.[0-9]{1,2}\.[0-9]{1,2}', $this->metadata['version']); return preg_match('#^[0-9]{1,2}\.[0-9]{1,2}\.[0-9]{1,2}#', $this->metadata['version']);
} }
/** /**
@ -201,7 +209,7 @@ class phpbb_extension_metadata_manager
*/ */
private function validate_require_phpbb() private function validate_require_phpbb()
{ {
return (preg_match('^[0-9]{1,2}\.[0-9]{1,2}\.[0-9]{1,2}$', $this->metadata['require']['phpbb']) && version_compare($this->metadata['require']['phpbb']), '3.1.0', '>'); return (preg_match('#^[0-9]{1,2}\.[0-9]{1,2}\.[0-9]{1,2}$#', $this->metadata['require']['phpbb']) && version_compare($this->metadata['require']['phpbb'], '3.1.0', '>='));
} }
/** /**
@ -211,7 +219,7 @@ class phpbb_extension_metadata_manager
*/ */
private function validate_extra_display_name() private function validate_extra_display_name()
{ {
return preg_match('^[a-zA-Z0-9_]{2,0}$', $this->metadata['name']); return preg_match('#^[a-zA-Z0-9_]{2,0}$#', $this->metadata['name']);
} }
/** /**
@ -234,7 +242,7 @@ class phpbb_extension_metadata_manager
*/ */
private function validate_require_php() private function validate_require_php()
{ {
return preg_match('^[0-9]{1,2}\.[0-9]{1,2}\.[0-9]{1,2}$', $this->metadata['require']['phpbb'] return (preg_match('#^[0-9]{1,2}\.[0-9]{1,2}\.[0-9]{1,2}$#', $this->metadata['require']['php']) && version_compare($this->metadata['require']['php'], phpversion(), '>='));
} }
/** /**
@ -255,7 +263,7 @@ class phpbb_extension_metadata_manager
*/ */
private function validate_homepage() private function validate_homepage()
{ {
return preg_match('([\d\w-.]+?\.(a[cdefgilmnoqrstuwz]|b[abdefghijmnorstvwyz]|c[acdfghiklmnoruvxyz]|d[ejkmnoz]|e[ceghrst]|f[ijkmnor]|g[abdefghilmnpqrstuwy]|h[kmnrtu]|i[delmnoqrst]|j[emop]|k[eghimnprwyz]|l[abcikrstuvy]|m[acdghklmnopqrstuvwxyz]|n[acefgilopruz]|om|p[aefghklmnrstwy]|qa|r[eouw]|s[abcdeghijklmnortuvyz]|t[cdfghjkmnoprtvwz]|u[augkmsyz]|v[aceginu]|w[fs]|y[etu]|z[amw]|aero|arpa|biz|com|coop|edu|info|int|gov|mil|museum|name|net|org|pro)(\b|\W(?<!&|=)(?!\.\s|\.{3}).*?))(\s|$)', $this->metadata['homepage']) return preg_match('#([\d\w-.]+?\.(a[cdefgilmnoqrstuwz]|b[abdefghijmnorstvwyz]|c[acdfghiklmnoruvxyz]|d[ejkmnoz]|e[ceghrst]|f[ijkmnor]|g[abdefghilmnpqrstuwy]|h[kmnrtu]|i[delmnoqrst]|j[emop]|k[eghimnprwyz]|l[abcikrstuvy]|m[acdghklmnopqrstuvwxyz]|n[acefgilopruz]|om|p[aefghklmnrstwy]|qa|r[eouw]|s[abcdeghijklmnortuvyz]|t[cdfghjkmnoprtvwz]|u[augkmsyz]|v[aceginu]|w[fs]|y[etu]|z[amw]|aero|arpa|biz|com|coop|edu|info|int|gov|mil|museum|name|net|org|pro)(\b|\W(?<!&|=)(?!\.\s|\.{3}).*?))(\s|$)#', $this->metadata['homepage']);
} }
/** /**
@ -287,19 +295,32 @@ class phpbb_extension_metadata_manager
} }
/** /**
* Gets the contents of the composer.json file and can also assign template vars * Gets the contents of the composer.json file
* *
* @return array Contains everything from the meta data file. Do not use without validating and cleaning first * @return bool True of false (if loading succeeded or failed)
*/ */
private function fetch_metadata() private function fetch_metadata()
{ {
// Read it if (!file_exists($this->metadata_file))
$metadata_file = file_get_contents($metadata_filepath); {
$metadata = json_decode($metadata_file, true) return false;
}
else
{
if (!($file_contents = file_get_contents($this->metadata_file)))
{
return false;
}
if (($metadata = json_decode($file_contents, true)) === NULL)
{
return false;
}
$this->metadata = $metadata; $this->metadata = $metadata;
return $metadata; return true;
}
} }
/** /**
@ -334,3 +355,4 @@ class phpbb_extension_metadata_manager
return; return;
} }
}

View file

@ -39,6 +39,7 @@ $lang = array_merge($lang, array(
'EXTENSIONS' => 'Extensions', 'EXTENSIONS' => 'Extensions',
'EXTENSIONS_ADMIN' => 'Extensions Manager', 'EXTENSIONS_ADMIN' => 'Extensions Manager',
'EXTENSIONS_EXPLAIN' => 'The Extensions Manager is a tool in your phpBB Board which allows you to manage all of your extensions statuses and view information about them.', 'EXTENSIONS_EXPLAIN' => 'The Extensions Manager is a tool in your phpBB Board which allows you to manage all of your extensions statuses and view information about them.',
'EXTENSION_INVALID' => 'The selected extension is not valid.',
'DETAILS' => 'Details', 'DETAILS' => 'Details',