diff --git a/db/migrations/5.1.57_cleanup_tool_activations.php b/db/migrations/5.1.57_cleanup_tool_activations.php new file mode 100644 index 0000000000000000000000000000000000000000..6700816bc85e3503c48c5bd8292a7f5eb5fad1c3 --- /dev/null +++ b/db/migrations/5.1.57_cleanup_tool_activations.php @@ -0,0 +1,23 @@ +<?php +/** + * @see https://gitlab.studip.de/studip/studip/-/issues/3977 + */ +return new class extends Migration +{ + public function description() + { + return 'Removes invalid tool activations (that are no longer connected ' + . 'to a StandardPlugin'; + } + + protected function up() + { + $query = "DELETE FROM `tools_activated` + WHERE `plugin_id` NOT IN ( + SELECT `pluginid` + FROM `plugins` + WHERE FIND_IN_SET(?, `plugintype`) + )"; + DBManager::get()->execute($query, [StandardPlugin::class]); + } +}; diff --git a/lib/plugins/engine/PluginManager.class.php b/lib/plugins/engine/PluginManager.class.php index be4f76618313a1f9bc49096fd533061d8bf61cb3..f08b5fa4064acb711de9f4b4b98f7714a709c727 100644 --- a/lib/plugins/engine/PluginManager.class.php +++ b/lib/plugins/engine/PluginManager.class.php @@ -427,41 +427,49 @@ class PluginManager $this->plugins[$id]['name'] = $name; $this->plugins[$id]['path'] = $path; $this->plugins[$id]['type'] = $type; + } else { + foreach ($this->plugins as $plugin) { + $common_types = array_intersect($type, $plugin['type']); - return $id; - } - - foreach ($this->plugins as $plugin) { - $common_types = array_intersect($type, $plugin['type']); - - if (count($common_types) > 0 && $plugin['position'] >= $position) { - $position = $plugin['position'] + 1; + if (count($common_types) > 0 && $plugin['position'] >= $position) { + $position = $plugin['position'] + 1; + } } - } - $sql = 'INSERT INTO plugins ( + $sql = 'INSERT INTO plugins ( pluginname, pluginclassname, pluginpath, plugintype, navigationpos, dependentonid ) VALUES (?,?,?,?,?,?)'; - $stmt = $db->prepare($sql); - $stmt->execute([$name, $class, $path, join(',', $type), $position, $depends]); - $id = $db->lastInsertId(); - - $this->plugins[$id] = [ - 'id' => $id, - 'name' => $name, - 'class' => $class, - 'path' => $path, - 'type' => $type, - 'enabled' => false, - 'position' => $position, - 'depends' => $depends - ]; + $stmt = $db->prepare($sql); + $stmt->execute([$name, $class, $path, join(',', $type), $position, $depends]); + $id = $db->lastInsertId(); - $this->readPluginInfos(); + $this->plugins[$id] = [ + 'id' => $id, + 'name' => $name, + 'class' => $class, + 'path' => $path, + 'type' => $type, + 'enabled' => false, + 'position' => $position, + 'depends' => $depends + ]; + + $this->readPluginInfos(); - $db->exec("INSERT INTO roles_plugins (roleid, pluginid) + $db->exec("INSERT INTO roles_plugins (roleid, pluginid) SELECT roleid, $id FROM roles WHERE `system` = 'y' AND rolename != 'Nobody'"); + } + + if (!in_array(StandardPlugin::class, $type)) { + ToolActivation::findEachBySQL( + function (ToolActivation $activation) use ($id) { + $this->setPluginActivated($id, $activation->range_id, false); + }, + 'plugin_id = ?', + [$id] + ); + } return $id; }