From 00b0a955afda1cd16c0fd3452b989fe79e95a20b Mon Sep 17 00:00:00 2001
From: Jan-Hendrik Willms <tleilax+studip@gmail.com>
Date: Thu, 12 Dec 2024 09:55:28 +0000
Subject: [PATCH] move sorting to plugin administration and use it in both
 register actions, fixes #4993

Closes #4993

Merge request studip/studip!3747
---
 app/controllers/admin/plugin.php     |  9 +++------
 lib/classes/PluginAdministration.php | 10 +++++++++-
 2 files changed, 12 insertions(+), 7 deletions(-)

diff --git a/app/controllers/admin/plugin.php b/app/controllers/admin/plugin.php
index bc073a86719..1be046dc5c8 100644
--- a/app/controllers/admin/plugin.php
+++ b/app/controllers/admin/plugin.php
@@ -16,7 +16,7 @@
 
 class Admin_PluginController extends AuthenticatedController
 {
-    private $plugin_admin;
+    private PluginAdministration $plugin_admin;
 
     /**
      * Common tasks for all actions.
@@ -509,10 +509,7 @@ class Admin_PluginController extends AuthenticatedController
 
     public function unregistered_action()
     {
-        $plugins = $this->plugin_admin->scanPluginDirectory();
-        usort($plugins, function ($a, $b) {
-            return $a['pluginname'] <=> $b['pluginname'];
-        });
+        $plugins = $this->plugin_admin->scanPluginDirectory(true);
         $this->unknown_plugins = $plugins;
     }
 
@@ -525,7 +522,7 @@ class Admin_PluginController extends AuthenticatedController
     public function register_action($number)
     {
         CSRFProtection::verifyUnsafeRequest();
-        $unknown_plugins = $this->plugin_admin->scanPluginDirectory();
+        $unknown_plugins = $this->plugin_admin->scanPluginDirectory(true);
         $plugin = $unknown_plugins[$number];
 
         try {
diff --git a/lib/classes/PluginAdministration.php b/lib/classes/PluginAdministration.php
index f906842632f..7fd7d9b1fc9 100644
--- a/lib/classes/PluginAdministration.php
+++ b/lib/classes/PluginAdministration.php
@@ -399,7 +399,7 @@ class PluginAdministration
      *
      * @return array with manifest meta data
      */
-    public function scanPluginDirectory()
+    public function scanPluginDirectory(bool $sort = false)
     {
         $found = [];
         $basepath = Config::get()->PLUGINS_PATH;
@@ -423,6 +423,14 @@ class PluginAdministration
                 $found[] = $manifest;
             }
         }
+
+        if ($sort) {
+            usort(
+                $found,
+                fn($a, $b) => $a['pluginname'] <=> $b['pluginname']
+            );
+        }
+
         return $found;
     }
 
-- 
GitLab