From 78da395bb3ab4ab149994b48111b2d8ffad4f20a Mon Sep 17 00:00:00 2001
From: Jan-Hendrik Willms <tleilax+studip@gmail.com>
Date: Fri, 11 Nov 2022 15:22:18 +0000
Subject: [PATCH] valid semester from config, fixes #1774

Closes #1774

Merge request studip/studip!1151
---
 app/controllers/my_courses.php | 53 +++++++++++++++++++++++++++++-----
 lib/classes/MyRealmModel.php   | 11 ++++---
 2 files changed, 52 insertions(+), 12 deletions(-)

diff --git a/app/controllers/my_courses.php b/app/controllers/my_courses.php
index 7f98f1ba797..94ac6259e19 100644
--- a/app/controllers/my_courses.php
+++ b/app/controllers/my_courses.php
@@ -803,12 +803,8 @@ class MyCoursesController extends AuthenticatedController
 
         $widget = new SelectWidget(_('Semesterfilter'), $this->url_for('my_courses/set_semester'), 'sem_select');
         $widget->setMaxLength(50);
-        $widget->addElement(new SelectElement('current', _('Aktuelles Semester'), $sem === 'current'));
-        $widget->addElement(new SelectElement('future', _('Aktuelles und nächstes Semester'), $sem === 'future'));
-        $widget->addElement(new SelectElement('last', _('Aktuelles und letztes Semester'), $sem === 'last'));
-        $widget->addElement(new SelectElement('lastandnext', _('Letztes, aktuelles, nächstes Semester'), $sem === 'lastandnext'));
-        if (Config::get()->MY_COURSES_ENABLE_ALL_SEMESTERS) {
-            $widget->addElement(new SelectElement('all', _('Alle Semester'), $sem === 'all'));
+        foreach ($this->getTextualSemesterEntries() as $key => $label) {
+            $widget->addElement(new SelectElement($key, $label, $sem === $key));
         }
 
         $query = "SELECT semester_data.semester_id
@@ -846,7 +842,7 @@ class MyCoursesController extends AuthenticatedController
         }
 
         // create settings url depended on selected cycle
-        if (isset($sem) && !in_array($sem, words('future all last current'))) {
+        if (isset($sem) && !$this->isValidTextualSemesterEntry($sem)) {
             $this->settings_url = "dispatch.php/my_courses/groups/{$sem}";
         } else {
             $this->settings_url = 'dispatch.php/my_courses/groups';
@@ -1074,12 +1070,21 @@ class MyCoursesController extends AuthenticatedController
             $config_sem = 'future';
         }
 
+        if (
+            $config_sem
+            && !$this->isValidTextualSemesterEntry($config_sem)
+            && !Semester::exists($config_sem)
+        ) {
+            $config_sem = null;
+        }
+
         $sem = Request::get(
             'sem_select',
             $config_sem ?: Config::get()->MY_COURSES_DEFAULT_CYCLE
         );
 
-        if ($sem && !in_array($sem, ['future', 'all', 'last', 'current'])) {
+
+        if ($sem && !$this->isValidTextualSemesterEntry($sem)) {
             Request::set('sem_select', $sem);
         }
 
@@ -1108,4 +1113,36 @@ class MyCoursesController extends AuthenticatedController
 
         return $group_field === 'not_grouped' ? 'sem_number' : $group_field;
     }
+
+    /**
+     * Returns all valid textual semester entries like 'last', 'future' etc
+     *
+     * @return array<string, string>
+     */
+    private function getTextualSemesterEntries(): array
+    {
+        $entries = [
+            'current'     => _('Aktuelles Semester'),
+            'future'      => _('Aktuelles und nächstes Semester'),
+            'last'        => _('Aktuelles und letztes Semester'),
+            'lastandnext' => _('Letztes, aktuelles, nächstes Semester'),
+        ];
+
+        if (Config::get()->MY_COURSES_ENABLE_ALL_SEMESTERS) {
+            $entries['all'] = _('Alle Semester');
+        }
+
+        return $entries;
+    }
+
+    /**
+     * Returns whether the given entry is a valid textual semester entry.
+     *
+     * @see getTextualSemesterEntries()
+     * @return bool
+     */
+    private function isValidTextualSemesterEntry(string $entry): bool
+    {
+        return array_key_exists($entry, $this->getTextualSemesterEntries());
+    }
 }
diff --git a/lib/classes/MyRealmModel.php b/lib/classes/MyRealmModel.php
index 9f62b427cb2..9d225821aa8 100644
--- a/lib/classes/MyRealmModel.php
+++ b/lib/classes/MyRealmModel.php
@@ -169,12 +169,15 @@ class MyRealmModel
 
         $sem_data = Semester::getAllAsArray();
 
-        $semester_ids      = [];
-        for ($i = $min_sem_key; $i <= $max_sem_key; $i++) {
-            if (!empty($sem_data[$i]['semester_id'])) {
-                $semester_ids[] = $sem_data[$i]['semester_id'];
+        $semester_ids = [];
+        if (is_numeric($min_sem_key) && is_numeric($max_sem_key)) {
+            foreach ($sem_data as $index => $data) {
+                if ($index >= $min_sem_key && $index <= $max_sem_key) {
+                    $semester_ids[] = $data['semester_id'];
+                }
             }
         }
+
         $semesters = Semester::findMany($semester_ids);
         $studygroup_filter = !$params['studygroups_enabled'] ? false : true;
         $ordering          = '';
-- 
GitLab