aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJan-Hendrik Willms <tleilax+studip@gmail.com>2024-05-06 09:03:33 +0000
committerDavid Siegfried <david.siegfried@uni-vechta.de>2024-05-06 09:03:33 +0000
commite7bfc2e80046cdbe28122c8430d9ce9dfdafb5a1 (patch)
treeddb6021c7983c38418fd9bf8d455628b89e98759
parent8474ee1063d11f1d5fd4b79674d2d734b82e18b0 (diff)
fixes #3977
Closes #3977 Merge request studip/studip!2945
-rw-r--r--db/migrations/5.1.57_cleanup_tool_activations.php23
-rw-r--r--lib/plugins/engine/PluginManager.class.php60
2 files changed, 57 insertions, 26 deletions
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 0000000..6700816
--- /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 be4f766..f08b5fa 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;
}