Skip to content

Commit

Permalink
Fixed issue #14661: Plugin development need a "Don't disable plugin" (#…
Browse files Browse the repository at this point in the history
  • Loading branch information
Shnoulle committed Mar 6, 2024
1 parent 4ac4251 commit e0c0674
Show file tree
Hide file tree
Showing 4 changed files with 48 additions and 15 deletions.
2 changes: 1 addition & 1 deletion application/controllers/admin/PluginManagerController.php
Expand Up @@ -44,7 +44,7 @@ public function index()
$data[] = [
'id' => $oPlugin->id,
'name' => $oPlugin->name,
'load_error' => $oPlugin->load_error,
'load_error' => $oPlugin->getLoadError(),
'description' => '',
'active' => $oPlugin->active,
'settings' => []
Expand Down
25 changes: 16 additions & 9 deletions application/libraries/PluginManager/PluginManager.php
Expand Up @@ -300,7 +300,7 @@ public function scanPlugins($includeInstalledPlugins = false)
$plugin = Plugin::model()->find('name = :name', [':name' => $pluginName]);
if (
empty($plugin)
|| ($includeInstalledPlugins && $plugin->load_error == 0)
|| ($includeInstalledPlugins && !$plugin->getLoadError())
) {
if (file_exists($file) && $this->isWhitelisted($pluginName)) {
try {
Expand All @@ -320,17 +320,21 @@ public function scanPlugins($includeInstalledPlugins = false)
'message' => $ex->getMessage(),
'file' => $ex->getFile()
];
$saveResult = Plugin::setPluginLoadError($plugin, $pluginName, $error);
$saveResult = Plugin::handlePluginLoadError($plugin, $pluginName, $error);
if (!$saveResult) {
// This only happens if database save fails.
// If handlePluginLoadError return 0 because debug is set
if (App()->getConfig('debug') >= 2) {
throw $ex;
}
// If handlePluginLoadError fail without debug : have a DB related issue
$this->shutdownObject->disable();
throw new \Exception(
'Internal error: Could not save load error for plugin ' . $pluginName
);
}
}
}
} elseif ($plugin->load_error == 1) {
} elseif ($plugin->getLoadError()) {
// List faulty plugins in scan files view.
$result[$pluginName] = [
'pluginName' => $pluginName,
Expand Down Expand Up @@ -464,9 +468,13 @@ public function loadPlugin($pluginName, $id = null, $init = true)
'file' => $ex->getFile()
];
$plugin = Plugin::model()->find('name = :name', [':name' => $pluginName]);
$saveResult = Plugin::setPluginLoadError($plugin, $pluginName, $error);
$saveResult = Plugin::handlePluginLoadError($plugin, $pluginName, $error);
if (!$saveResult) {
// This only happens if database save fails.
// If handlePluginLoadError return 0 because debug is set
if (App()->getConfig('debug') >= 2) {
throw $ex;
}
// If handlePluginLoadError fail without debug : have a DB related issue
$this->shutdownObject->disable();
throw new \Exception(
'Internal error: Could not save load error for plugin ' . $pluginName
Expand Down Expand Up @@ -499,8 +507,7 @@ public function loadPlugins()

foreach ($records as $record) {
if (
!isset($record->load_error)
|| $record->load_error == 0
!$record->getLoadError()
// NB: Authdb is hardcoded since updating sometimes causes error.
// @see https://bugs.limesurvey.org/view.php?id=15908
|| $record->name == 'Authdb'
Expand All @@ -522,7 +529,7 @@ public function loadAllPlugins()
{
$records = Plugin::model()->findAll();
foreach ($records as $record) {
if ($record->load_error == 0) {
if (!$record->getLoadError()) {
$this->loadPlugin($record->name, $record->id, $record->active);
}
}
Expand Down
Expand Up @@ -12,7 +12,6 @@
*/
class PluginManagerShutdownFunction
{

/**
* @var boolean
*/
Expand Down Expand Up @@ -84,7 +83,7 @@ public function __invoke()

$plugin = \Plugin::model()->find('name = :name', [':name' => $this->currentPluginName]);

$result = \Plugin::setPluginLoadError(
$result = \Plugin::handlePluginLoadError(
$plugin,
$this->currentPluginName,
$error
Expand Down
33 changes: 30 additions & 3 deletions application/models/Plugin.php
Expand Up @@ -64,6 +64,7 @@ public function tableName()
return '{{plugins}}';
}


/**
* Set this plugin as load error in database, and saves the error message.
* @param array $error Array with 'message' and 'file' keys (as get from error_get_last).
Expand Down Expand Up @@ -125,7 +126,7 @@ public function getExtensionConfig()
*/
public function getStatus()
{
if ($this->load_error == 1) {
if ($this->getLoadError()) {
return sprintf(
"<span data-toggle='tooltip' title='%s' class='btntooltip fa fa-times text-warning'></span>",
gT('Plugin load error')
Expand All @@ -150,7 +151,7 @@ public function getName()
'id' => $this->id
]
);
if ($this->load_error == 0) {
if (!$this->getLoadError()) {
return sprintf(
'<a href="%s">%s</a>',
$url,
Expand Down Expand Up @@ -198,7 +199,7 @@ public function getActionButtons()
$output = '';
if (Permission::model()->hasGlobalPermission('settings', 'update')) {
$output .= "<div class='icon-btn-row'>";
if ($this->load_error == 1) {
if ($this->getLoadError()) {
$reloadUrl = Yii::app()->createUrl(
'admin/pluginmanager',
[
Expand Down Expand Up @@ -307,6 +308,20 @@ protected function getUninstallButton()
return $output;
}

/**
* @param Plugin|null $plugin
* @param string $pluginName
* @param array $error Array with 'message' and 'file' keys (as get from error_get_last).
* @return int Rows affected, always 0 for debug >=2
*/
public static function handlePluginLoadError($plugin, $pluginName, array $error)
{
if (App()->getConfig('debug') >= 2) {
return 0;
}
return self::setPluginLoadError($plugin, $pluginName, $error);
}

/**
* @param Plugin|null $plugin
* @param string $pluginName
Expand Down Expand Up @@ -357,4 +372,16 @@ protected function getDir()
// NB: Name is same as plugin folder and plugin main class.
return $folder . DIRECTORY_SEPARATOR . $this->name;
}

/**
* Get load error as boolean
* @return boolean
*/
public function getLoadError()
{
if (App()->getConfig('debug') >= 2) {
return false;
}
return isset($this->load_error) && boolval($this->load_error);
}
}

0 comments on commit e0c0674

Please sign in to comment.