From 82593cd2bc056da73caa1b1e981c5a9ead0f1bf2 Mon Sep 17 00:00:00 2001 From: brettp Date: Wed, 27 Apr 2011 02:37:16 +0000 Subject: Refs #3362. Plugins don't check deps upon boot. Made package and manifest private properties of ElggPlugin and added ->getPackage() and ->getManifest(). git-svn-id: http://code.elgg.org/elgg/trunk@9030 36083f99-b078-4883-b0ff-0f9b5a30f544 --- actions/admin/plugins/activate.php | 2 +- actions/admin/plugins/activate_all.php | 4 +- actions/admin/plugins/deactivate.php | 4 +- actions/admin/plugins/deactivate_all.php | 4 +- actions/admin/plugins/set_priority.php | 4 +- actions/admin/plugins/simple_update_states.php | 2 +- actions/plugins/settings/save.php | 2 +- actions/plugins/usersettings/save.php | 2 +- engine/classes/ElggPlugin.php | 74 +++++++++++++++------- engine/classes/ElggPluginPackage.php | 4 +- engine/lib/admin.php | 4 +- engine/lib/deprecated-1.8.php | 2 +- engine/lib/plugins.php | 39 ++---------- install/ElggInstaller.php | 4 +- views/default/admin/plugin_settings.php | 2 +- views/default/admin/plugins/advanced.php | 2 +- views/default/core/settings/tools.php | 2 +- .../forms/admin/plugins/simple_update_states.php | 4 +- views/default/object/plugin/advanced.php | 24 +++---- .../object/plugin/elements/dependencies.php | 2 +- views/default/object/plugin/simple.php | 10 +-- 21 files changed, 100 insertions(+), 97 deletions(-) diff --git a/actions/admin/plugins/activate.php b/actions/admin/plugins/activate.php index 0d930b27f..e04ee6298 100644 --- a/actions/admin/plugins/activate.php +++ b/actions/admin/plugins/activate.php @@ -29,7 +29,7 @@ foreach ($plugin_guids as $guid) { if ($plugin->activate()) { $activated_guids[] = $guid; } else { - register_error(elgg_echo('admin:plugins:activate:no', array($plugin->manifest->getName()))); + register_error(elgg_echo('admin:plugins:activate:no', array($plugin->getManifest()->getName()))); } } diff --git a/actions/admin/plugins/activate_all.php b/actions/admin/plugins/activate_all.php index 25802ce2e..0f0352877 100644 --- a/actions/admin/plugins/activate_all.php +++ b/actions/admin/plugins/activate_all.php @@ -13,9 +13,9 @@ $plugins = elgg_get_plugins('inactive'); foreach ($plugins as $plugin) { if ($plugin->activate()) { - //system_message(elgg_echo('admin:plugins:activate:yes', array($plugin->manifest->getName()))); + //system_message(elgg_echo('admin:plugins:activate:yes', array($plugin->getManifest()->getName()))); } else { - register_error(elgg_echo('admin:plugins:activate:no', array($plugin->manifest->getName()))); + register_error(elgg_echo('admin:plugins:activate:no', array($plugin->getManifest()->getName()))); } } diff --git a/actions/admin/plugins/deactivate.php b/actions/admin/plugins/deactivate.php index 74c78e0fc..9ec620e13 100644 --- a/actions/admin/plugins/deactivate.php +++ b/actions/admin/plugins/deactivate.php @@ -26,9 +26,9 @@ foreach ($plugin_guids as $guid) { } if ($plugin->deactivate()) { - //system_message(elgg_echo('admin:plugins:deactivate:yes', array($plugin->manifest->getName()))); + //system_message(elgg_echo('admin:plugins:deactivate:yes', array($plugin->getManifest()->getName()))); } else { - register_error(elgg_echo('admin:plugins:deactivate:no', array($plugin->manifest->getName()))); + register_error(elgg_echo('admin:plugins:deactivate:no', array($plugin->getManifest()->getName()))); } } diff --git a/actions/admin/plugins/deactivate_all.php b/actions/admin/plugins/deactivate_all.php index f1bea0a2c..446cad8c0 100644 --- a/actions/admin/plugins/deactivate_all.php +++ b/actions/admin/plugins/deactivate_all.php @@ -13,9 +13,9 @@ $plugins = elgg_get_plugins('active'); foreach ($plugins as $plugin) { if ($plugin->deactivate()) { - //system_message(elgg_echo('admin:plugins:deactivate:yes', array($plugin->manifest->getName()))); + //system_message(elgg_echo('admin:plugins:deactivate:yes', array($plugin->getManifest()->getName()))); } else { - register_error(elgg_echo('admin:plugins:deactivate:no', array($plugin->manifest->getName()))); + register_error(elgg_echo('admin:plugins:deactivate:no', array($plugin->getManifest()->getName()))); } } diff --git a/actions/admin/plugins/set_priority.php b/actions/admin/plugins/set_priority.php index fd7857e49..702aae91b 100644 --- a/actions/admin/plugins/set_priority.php +++ b/actions/admin/plugins/set_priority.php @@ -25,9 +25,9 @@ if (!($plugin instanceof ElggPlugin)) { } if ($plugin->setPriority($priority)) { - //system_message(elgg_echo('admin:plugins:set_priority:yes', array($plugin->manifest->getName()))); + //system_message(elgg_echo('admin:plugins:set_priority:yes', array($plugin->getManifest()->getName()))); } else { - register_error(elgg_echo('admin:plugins:set_priority:no', array($plugin->manifest->getName()))); + register_error(elgg_echo('admin:plugins:set_priority:no', array($plugin->getManifest()->getName()))); } // don't regenerate the simplecache because the plugin won't be diff --git a/actions/admin/plugins/simple_update_states.php b/actions/admin/plugins/simple_update_states.php index 662a5c3dd..7601013a7 100644 --- a/actions/admin/plugins/simple_update_states.php +++ b/actions/admin/plugins/simple_update_states.php @@ -22,7 +22,7 @@ $success = TRUE; foreach ($installed_plugins as $plugin) { // this is only for simple plugins. - if ($plugin->manifest->getAdminInterface() != 'simple') { + if ($plugin->getManifest()->getAdminInterface() != 'simple') { continue; } diff --git a/actions/plugins/settings/save.php b/actions/plugins/settings/save.php index f3c865b9f..3b5694039 100644 --- a/actions/plugins/settings/save.php +++ b/actions/plugins/settings/save.php @@ -21,7 +21,7 @@ if (!($plugin instanceof ElggPlugin)) { forward(REFERER); } -$plugin_name = $plugin->manifest->getName(); +$plugin_name = $plugin->getManifest()->getName(); $result = false; diff --git a/actions/plugins/usersettings/save.php b/actions/plugins/usersettings/save.php index 9c1657388..c6214f68d 100644 --- a/actions/plugins/usersettings/save.php +++ b/actions/plugins/usersettings/save.php @@ -29,7 +29,7 @@ if (!($user instanceof ElggUser)) { forward(REFERER); } -$plugin_name = $plugin->manifest->getName(); +$plugin_name = $plugin->getManifest()->getName(); // make sure we're admin or the user if (!$user->canEdit()) { diff --git a/engine/classes/ElggPlugin.php b/engine/classes/ElggPlugin.php index 20a8673de..eb911455a 100644 --- a/engine/classes/ElggPlugin.php +++ b/engine/classes/ElggPlugin.php @@ -9,8 +9,8 @@ * @subpackage Plugins.Settings */ class ElggPlugin extends ElggObject { - public $package; - public $manifest; + private $package; + private $manifest; private $path; private $pluginID; @@ -76,18 +76,6 @@ class ElggPlugin extends ElggObject { // load the rest of the plugin parent::__construct($existing_guid); } - - // We have to let the entity load so we can manipulate it with the API. - // If the path is wrong or would cause an exception, catch it, - // disable the plugin, and emit an error. - try { - $this->package = new ElggPluginPackage($this->path, false); - $this->manifest = $this->package->getManifest(); - } catch (Exception $e) { - // we always have to allow the entity to load. - elgg_log("Failed to load $this->guid as a plugin. " . $e->getMessage(), 'WARNING'); - $this->errorMsg = $e->getmessage(); - } } /** @@ -152,7 +140,7 @@ class ElggPlugin extends ElggObject { * @return array */ public function getAvailableTextFiles() { - $filenames = $this->package->getTextFilenames(); + $filenames = $this->getPackage()->getTextFilenames(); $files = array(); foreach ($filenames as $filename) { @@ -562,13 +550,13 @@ class ElggPlugin extends ElggObject { return false; } - if (!$this->package instanceof ElggPluginPackage) { + if (!$this->getPackage() instanceof ElggPluginPackage) { $this->errorMsg = elgg_echo('ElggPlugin:NoPluginPackagePackage', array($this->getID(), $this->guid)); return false; } - if (!$this->package->isValid()) { - $this->errorMsg = $this->package->getError(); + if (!$this->getPackage()->isValid()) { + $this->errorMsg = $this->getPackage()->getError(); return false; } @@ -607,8 +595,8 @@ class ElggPlugin extends ElggObject { * @return bool */ public function canActivate($site_guid = null) { - if ($this->package) { - return $this->package->isValid() && $this->package->checkDependencies(); + if ($this->getPackage()) { + return $this->getPackage()->isValid() && $this->getPackage()->checkDependencies(); } return false; @@ -708,9 +696,9 @@ class ElggPlugin extends ElggObject { * @throws PluginException */ public function start($flags) { - if (!$this->canActivate()) { - return false; - } +// if (!$this->canActivate()) { +// return false; +// } // include start file if ($flags & ELGG_PLUGIN_INCLUDE_START) { @@ -958,4 +946,44 @@ class ElggPlugin extends ElggObject { public function getError() { return $this->errorMsg; } + + /** + * Returns this plugin's ElggPluginManifest object + * + * @return ElggPluginManifest + */ + public function getManifest() { + if ($this->manifest instanceof ElggPluginManifest) { + return $this->manifest; + } + + try { + $this->manifest = $this->getPackage()->getManifest(); + } catch (Exception $e) { + elgg_log("Failed to load manifest for plugin $this->guid. " . $e->getMessage(), 'WARNING'); + $this->errorMsg = $e->getmessage(); + } + + return $this->manifest; + } + + /** + * Returns this plugin's ElggPluginPackage object + * + * @return ElggPluginPackage + */ + public function getPackage() { + if ($this->package instanceof ElggPluginPackage) { + return $this->package; + } + + try { + $this->package = new ElggPluginPackage($this->path, false); + } catch (Exception $e) { + elgg_log("Failed to load package for $this->guid. " . $e->getMessage(), 'WARNING'); + $this->errorMsg = $e->getmessage(); + } + + return $this->package; + } } diff --git a/engine/classes/ElggPluginPackage.php b/engine/classes/ElggPluginPackage.php index 4daab381e..bad99362f 100644 --- a/engine/classes/ElggPluginPackage.php +++ b/engine/classes/ElggPluginPackage.php @@ -334,13 +334,13 @@ class ElggPluginPackage { // first, check if any active plugin conflicts with us. foreach ($enabled_plugins as $plugin) { - $temp_conflicts = $plugin->manifest->getConflicts(); + $temp_conflicts = $plugin->getManifest()->getConflicts(); foreach ($temp_conflicts as $conflict) { if ($conflict['type'] == 'plugin' && $conflict['name'] == $this_id) { $result = $this->checkDepPlugin($conflict, $enabled_plugins, false); // rewrite the conflict to show the originating plugin - $conflict['name'] = $plugin->manifest->getName(); + $conflict['name'] = $plugin->getManifest()->getName(); if (!$full_report && !$result['status']) { return $result['status']; diff --git a/engine/lib/admin.php b/engine/lib/admin.php index 06418c44f..61f64c8b3 100644 --- a/engine/lib/admin.php +++ b/engine/lib/admin.php @@ -329,7 +329,7 @@ function elgg_admin_add_plugin_settings_menu() { elgg_register_menu_item('page', array( 'name' => $plugin_id, 'href' => "admin/plugin_settings/$plugin_id", - 'text' => $plugin->manifest->getName(), + 'text' => $plugin->getManifest()->getName(), 'parent_name' => 'settings', 'context' => 'admin', 'section' => 'configure', @@ -541,7 +541,7 @@ function admin_markdown_page_handler($pages) { return true; } - $title = $plugin->manifest->getName() . ": $filename"; + $title = $plugin->getManifest()->getName() . ": $filename"; $text = Markdown($file_contents); $body = elgg_view_layout('admin', array( diff --git a/engine/lib/deprecated-1.8.php b/engine/lib/deprecated-1.8.php index bb52881cd..595b12aea 100644 --- a/engine/lib/deprecated-1.8.php +++ b/engine/lib/deprecated-1.8.php @@ -1667,7 +1667,7 @@ function get_installed_plugins($status = 'all') { if ($include) { $installed_plugins[$plugin->getID()] = array( 'active' => $plugin->isActive(), - 'manifest' => $plugin->manifest->getManifest() + 'manifest' => $plugin->getManifest()->getManifest() ); } } diff --git a/engine/lib/plugins.php b/engine/lib/plugins.php index 0947b7a8e..5aed3065a 100644 --- a/engine/lib/plugins.php +++ b/engine/lib/plugins.php @@ -266,9 +266,9 @@ function elgg_is_active_plugin($plugin_id, $site_guid = null) { /** * Loads all active plugins in the order specified in the tool admin panel. * - * @note This is called on every page load and includes additional checking that plugins - * are fit to be loaded. If a plugin is active and problematic, it will be disabled - * and a visible error emitted. + * @note This is called on every page load. If a plugin is active and problematic, it + * will be disabled and a visible error emitted. This does not check the deps system because + * that was too slow. * * @return bool */ @@ -307,17 +307,6 @@ function elgg_load_plugins() { $plugins = elgg_get_plugins('active'); if ($plugins) { foreach ($plugins as $plugin) { - // check if plugin can be started and try to start it. - // if anything is bad, disable it and emit a message. - if (!$plugin->isValid()) { - $plugin->deactivate(); - $msg = elgg_echo('PluginException:MisconfiguredPlugin', array($plugin->getID(), $plugin->guid)); - register_error($msg); - $return = false; - - continue; - } - try { $plugin->start($start_flags); } catch (Exception $e) { @@ -345,11 +334,10 @@ function elgg_load_plugins() { * Returns an ordered list of plugins * * @param string $status The status of the plugins. active, inactive, or all. - * @param bool $include_bad Include physically deleted and invalid plugins? * @param mixed $site_guid Optional site guid * @return array */ -function elgg_get_plugins($status = 'active', $include_bad = false, $site_guid = NULL) { +function elgg_get_plugins($status = 'active', $site_guid = null) { $db_prefix = get_config('dbprefix'); $priority = elgg_namespace_plugin_private_setting('internal', 'priority'); @@ -388,22 +376,9 @@ function elgg_get_plugins($status = 'active', $include_bad = false, $site_guid = break; } - if ($include_bad) { - $old_ia = elgg_set_ignore_access(true); - } - + $old_ia = elgg_set_ignore_access(true); $plugins = elgg_get_entities_from_relationship($options); - - if ($include_bad) { - elgg_set_ignore_access($old_ia); - } else { - // remove bad plugins - foreach ($plugins as $i => $plugin) { - if (!$plugin->isValid()) { - unset ($plugins[$i]); - } - } - } + elgg_set_ignore_access($old_ia); return $plugins; } @@ -573,7 +548,7 @@ function elgg_get_plugins_provides($type = null, $name = null) { $provides = array(); foreach ($active_plugins as $plugin) { - if ($plugin_provides = $plugin->manifest->getProvides()) { + if ($plugin_provides = $plugin->getManifest()->getProvides()) { foreach ($plugin_provides as $provided) { $provides[$provided['type']][$provided['name']] = array( 'version' => $provided['version'], diff --git a/install/ElggInstaller.php b/install/ElggInstaller.php index 1bf4808ef..62d3f6567 100644 --- a/install/ElggInstaller.php +++ b/install/ElggInstaller.php @@ -1344,8 +1344,8 @@ class ElggInstaller { elgg_generate_plugin_entities(); $plugins = elgg_get_plugins('any'); foreach ($plugins as $plugin) { - if ($plugin->manifest) { - if ($plugin->manifest->getActivateOnInstall()) { + if ($plugin->getManifest()) { + if ($plugin->getManifest()->getActivateOnInstall()) { $plugin->activate(); } } diff --git a/views/default/admin/plugin_settings.php b/views/default/admin/plugin_settings.php index 7473768c0..c75492270 100644 --- a/views/default/admin/plugin_settings.php +++ b/views/default/admin/plugin_settings.php @@ -17,7 +17,7 @@ $vars['entity'] = $plugin; $settings = false; if (elgg_view_exists("settings/$plugin_id/edit") || elgg_view_exists("plugins/$plugin_id/settings")) { - $title = $plugin->manifest->getName(); + $title = $plugin->getManifest()->getName(); $params = array('id' => "$plugin_id-settings"); $body = elgg_view_form("plugins/settings/save", $params, $vars); diff --git a/views/default/admin/plugins/advanced.php b/views/default/admin/plugins/advanced.php index 02e9ae58b..550154fcd 100644 --- a/views/default/admin/plugins/advanced.php +++ b/views/default/admin/plugins/advanced.php @@ -22,7 +22,7 @@ foreach ($installed_plugins as $id => $plugin) { continue; } - $plugin_categories = $plugin->manifest->getCategories(); + $plugin_categories = $plugin->getManifest()->getCategories(); // handle plugins that don't declare categories // unset them here because this is the list we foreach diff --git a/views/default/core/settings/tools.php b/views/default/core/settings/tools.php index ff02c9183..87c98902f 100644 --- a/views/default/core/settings/tools.php +++ b/views/default/core/settings/tools.php @@ -29,7 +29,7 @@ foreach ($installed_plugins as $plugin) { if (elgg_view_exists("usersettings/$plugin_id/edit") || elgg_view_exists("plugins/$plugin_id/usersettings")) { - $title = $plugin->manifest->getName(); + $title = $plugin->getManifest()->getName(); $body = elgg_view_form('plugins/usersettings/save', array(), array('entity' => $plugin)); echo elgg_view_module('info', $title, $body); } diff --git a/views/default/forms/admin/plugins/simple_update_states.php b/views/default/forms/admin/plugins/simple_update_states.php index 12b2cd616..cc1c1a710 100644 --- a/views/default/forms/admin/plugins/simple_update_states.php +++ b/views/default/forms/admin/plugins/simple_update_states.php @@ -16,9 +16,9 @@ foreach ($installed_plugins as $plugin) { if (!$plugin->isValid()) { continue; } - $interface = $plugin->manifest->getAdminInterface(); + $interface = $plugin->getManifest()->getAdminInterface(); if ($interface == 'simple') { - $plugin_list[$plugin->manifest->getName()] = $plugin; + $plugin_list[$plugin->getManifest()->getName()] = $plugin; } } diff --git a/views/default/object/plugin/advanced.php b/views/default/object/plugin/advanced.php index a346d4ff1..4c8bc8c17 100644 --- a/views/default/object/plugin/advanced.php +++ b/views/default/object/plugin/advanced.php @@ -13,7 +13,7 @@ $plugin = $vars['entity']; $priority = $plugin->getPriority(); $active = $plugin->isActive(); -$name = $plugin->manifest->getName(); +$name = $plugin->getManifest()->getName(); $can_activate = $plugin->canActivate(); $max_priority = elgg_get_max_plugin_priority(); $actions_base = '/action/admin/plugins/'; @@ -123,7 +123,7 @@ if ($categories) { } $screenshots_html = ''; -$screenshots = $plugin->manifest->getScreenshots(); +$screenshots = $plugin->getManifest()->getScreenshots(); if ($screenshots) { $base_url = elgg_get_plugins_path() . $plugin->getID() . '/'; foreach ($screenshots as $screenshot) { @@ -138,17 +138,17 @@ if ($screenshots) { } // metadata -$description = elgg_view('output/longtext', array('value' => $plugin->manifest->getDescription())); +$description = elgg_view('output/longtext', array('value' => $plugin->getManifest()->getDescription())); $author = '' . elgg_echo('admin:plugins:label:author') . ': ' - . elgg_view('output/text', array('value' => $plugin->manifest->getAuthor())); -$version = htmlspecialchars($plugin->manifest->getVersion()); + . elgg_view('output/text', array('value' => $plugin->getManifest()->getAuthor())); +$version = htmlspecialchars($plugin->getManifest()->getVersion()); $website = elgg_view('output/url', array( - 'href' => $plugin->manifest->getWebsite(), - 'text' => $plugin->manifest->getWebsite() + 'href' => $plugin->getManifest()->getWebsite(), + 'text' => $plugin->getManifest()->getWebsite() )); -$copyright = elgg_view('output/text', array('value' => $plugin->manifest->getCopyright())); -$license = elgg_view('output/text', array('value' => $plugin->manifest->getLicense())); +$copyright = elgg_view('output/text', array('value' => $plugin->getManifest()->getCopyright())); +$license = elgg_view('output/text', array('value' => $plugin->getManifest()->getLicense())); // show links to text files $files = $plugin->getAvailableTextFiles(); @@ -189,11 +189,11 @@ if (elgg_view_exists($settings_view)) { } ?>
-

manifest->getName(). " $version $settings_link"; ?>

+

getManifest()->getName(). " $version $settings_link"; ?>

manifest->getApiVersion() < 1.8) { - $reqs = $plugin->manifest->getRequires(); + if ($plugin->getManifest()->getApiVersion() < 1.8) { + $reqs = $plugin->getManifest()->getRequires(); if (!$reqs) { $message = elgg_echo('admin:plugins:warning:elgg_version_unknown'); echo "

$message

"; diff --git a/views/default/object/plugin/elements/dependencies.php b/views/default/object/plugin/elements/dependencies.php index 11a441a4a..b5cdaf8b6 100644 --- a/views/default/object/plugin/elements/dependencies.php +++ b/views/default/object/plugin/elements/dependencies.php @@ -9,7 +9,7 @@ */ $plugin = elgg_extract('plugin', $vars, false); -$deps = $plugin->package->checkDependencies(true); +$deps = $plugin->getPackage()->checkDependencies(true); $columns = array('type', 'name', 'expected_value', 'local_value', 'comment'); diff --git a/views/default/object/plugin/simple.php b/views/default/object/plugin/simple.php index d57d81934..5f5b08f10 100644 --- a/views/default/object/plugin/simple.php +++ b/views/default/object/plugin/simple.php @@ -5,11 +5,11 @@ $plugin_guid = $plugin->guid; $plugin_id = $plugin->getID(); $active = $plugin->isActive(); $can_activate = $plugin->canActivate(); -$name = $plugin->manifest->getName(); -$author = $plugin->manifest->getAuthor(); -$version = $plugin->manifest->getVersion(); -$website = $plugin->manifest->getWebsite(); -$description = $plugin->manifest->getDescription(); +$name = $plugin->getManifest()->getName(); +$author = $plugin->getManifest()->getAuthor(); +$version = $plugin->getManifest()->getVersion(); +$website = $plugin->getManifest()->getWebsite(); +$description = $plugin->getManifest()->getDescription(); if ($active) { $active_class = 'elgg-state-active'; -- cgit v1.2.3