From cba3934cff0198686a3a6fe8d14f9878847a4e8c Mon Sep 17 00:00:00 2001
From: Jan-Hendrik Willms <tleilax+studip@gmail.com>
Date: Thu, 4 Apr 2024 11:06:11 +0000
Subject: [PATCH] fixes #3890

Closes #3890

Merge request studip/studip!2741
---
 app/controllers/contact.php                   | 14 +++++-
 app/views/calendar/calendar/export.php        |  2 +-
 .../course/wizard/steps/lvgroups/index.php    | 46 +++++++++++--------
 lib/classes/MyRealmModel.php                  |  4 +-
 .../coursewizardsteps/BasicDataWizardStep.php |  4 +-
 .../coursewizardsteps/LVGroupsWizardStep.php  | 25 +++++-----
 .../StudyAreasWizardStep.php                  |  2 +-
 lib/plugins/core/CorePlugin.php               |  2 +-
 8 files changed, 62 insertions(+), 37 deletions(-)

diff --git a/app/controllers/contact.php b/app/controllers/contact.php
index 7dd2b0581b3..2148777c360 100644
--- a/app/controllers/contact.php
+++ b/app/controllers/contact.php
@@ -189,9 +189,21 @@ class ContactController extends AuthenticatedController
             $user = User::findManyByUsername(Request::getArray('user'));
         }
         if ($group) {
-            $user = User::findMany(Statusgruppen::find($group)->members->pluck('user_id'));
+            $group_object = Statusgruppen::find($group);
+            if (!$group_object) {
+                $this->set_status(404);
+                $this->render_nothing();
+                return;
+            }
+            $user = User::findMany($group_object->members->pluck('user_id'));
         }
         if (!$user) {
+            $user_object = User::findCurrent();
+            if (!$user_object) {
+                $this->set_status(404);
+                $this->render_nothing();
+                return;
+            }
             $user = User::findCurrent()->contacts;
         }
 
diff --git a/app/views/calendar/calendar/export.php b/app/views/calendar/calendar/export.php
index 3fa302eeab0..0ff766d6859 100644
--- a/app/views/calendar/calendar/export.php
+++ b/app/views/calendar/calendar/export.php
@@ -8,7 +8,7 @@
  */
 ?>
 <form class="default" method="post"
-      action="<?= $controller->link_for('calendar/calendar/export/' . $user_id) ?>">
+      action="<?= $controller->link_for('calendar/calendar/export', $user_id ?? null) ?>">
     <?= CSRFProtection::tokenTag() ?>
     <fieldset>
         <legend><?= _('Termine exportieren') ?></legend>
diff --git a/app/views/course/wizard/steps/lvgroups/index.php b/app/views/course/wizard/steps/lvgroups/index.php
index 744cc94a0a5..0d8e196a12f 100644
--- a/app/views/course/wizard/steps/lvgroups/index.php
+++ b/app/views/course/wizard/steps/lvgroups/index.php
@@ -17,25 +17,33 @@
         </li>
     </ul>
 </div>
-<? if (!$values['locked']) : ?>
+<? if (empty($values['locked'])) : ?>
 
-	<div id="lvgroup-tree-open-nodes">
-	<? foreach ($open_lvg_nodes as $opennode) : ?>
-		<input type="hidden" name="open_lvg_nodes[]" value="<?= $opennode; ?>">
-	<? endforeach; ?>
-	</div>
+    <div id="lvgroup-tree-open-nodes">
+    <? foreach ($open_lvg_nodes as $opennode) : ?>
+        <input type="hidden" name="open_lvg_nodes[]" value="<?= $opennode; ?>">
+    <? endforeach; ?>
+    </div>
 
     <div id="studyareas" data-ajax-url="<?= $ajax_url ?>"
         data-forward-url="<?= $no_js_url ?>" data-no-search-result="<?=_('Es wurde kein Suchergebnis gefunden.') ?>">
         <h2><?= _('Lehrveranstaltungsgruppen Suche') ?></h2>
         <div>
             <input type="text" size="40" style="width: auto;" name="search" id="lvgroup-tree-search"
-                   value="<?= $values['searchterm'] ?>">
+                   value="<?= htmlReady($values['searchterm'] ?? '') ?>">
             <span id="lvgroup-tree-search-start">
-                <?= Icon::create('search', 'clickable')->asInput(["name" => 'start_search', "onclick" => "return STUDIP.MVV.CourseWizard.searchTree()", "class" => $search_result?'hidden-no-js':'']) ?>
+                <?= Icon::create('search')->asInput([
+                    'name'    => 'start_search',
+                    'onclick' => 'return STUDIP.MVV.CourseWizard.searchTree()',
+                    'class'   => !empty($search_result) ? 'hidden-no-js' : '',
+                ]) ?>
             </span>
             <span id="lvgroup-tree-search-reset" class="hidden-js">
-                <?= Icon::create('refresh', 'clickable')->asInput(["name" => 'reset_search', "onclick" => "return STUDIP.MVV.CourseWizard.resetSearch()", "class" => $search_result?'':' hidden-no-js']) ?>
+                <?= Icon::create('refresh')->asInput([
+                    'name'    => 'reset_search',
+                    'onclick' => 'return STUDIP.MVV.CourseWizard.resetSearch()',
+                    'class'   => !empty($search_result) ? '' : ' hidden-no-js',
+                ]) ?>
             </span>
         </div>
 
@@ -56,23 +64,25 @@
                 <? $pos_id = 1; ?>
                 <? foreach ((array) $tree as $node) : ?>
                     <? $children = $node->getChildren() ?>
-                    <? if (count($children)) : ?>
-                    <?= $this->render_partial('lvgroups/_node',
-                        ['node' => $node, 'pos_id' => $pos_id++,
-                            'open_nodes' => $open_lvg_nodes ?: [],
-                            'search_result' => $search_result ?: [],
-                            'children' => $node->getChildren()]) ?>
+                    <? if (count($children) > 0) : ?>
+                    <?= $this->render_partial('lvgroups/_node', [
+                        'node'          => $node,
+                        'pos_id'        => $pos_id++,
+                        'open_nodes'    => $open_lvg_nodes ?: [],
+                        'search_result' => $search_result ?? [],
+                        'children'      => $node->getChildren(),
+                    ]) ?>
                     <? endif ?>
                 <? endforeach; ?>
                 </ul>
             </li>
         </ul>
     </div>
-    <? if ($values['open_lvg_nodes']) : ?>
+    <? if (!empty($values['open_lvg_nodes'])) : ?>
     <input type="hidden" name="open_nodes" value="<?= json_encode($values['open_lvg_nodes']) ?>"/>
     <? endif; ?>
-    <? if ($values['searchterm']) : ?>
-    <input type="hidden" name="searchterm" value="<?= $values['searchterm'] ?>"/>
+    <? if (!empty($values['searchterm'])) : ?>
+    <input type="hidden" name="searchterm" value="<?= htmlReady($values['searchterm']) ?>">
     <? endif; ?>
     <script>
     //<!--
diff --git a/lib/classes/MyRealmModel.php b/lib/classes/MyRealmModel.php
index 5b7a29b69e7..f968026a618 100644
--- a/lib/classes/MyRealmModel.php
+++ b/lib/classes/MyRealmModel.php
@@ -283,7 +283,7 @@ class MyRealmModel
     public static function getPreparedCourses($sem = '', $params = [])
     {
         $semesters   = self::getSelectedSemesters($sem);
-        $current_semester_nr = Semester::getIndexById(@Semester::findCurrent()->id);
+        $current_semester_nr = Semester::getIndexById(Semester::findCurrent()->id ?? null);
         $min_sem_key = min($semesters);
         $max_sem_key = max($semesters);
         $group_field = $params['group_field'];
@@ -334,7 +334,7 @@ class MyRealmModel
             $_course['visitdate']      = $visits[$course->id][0]['visitdate'];
             $_course['user_status']    = $user_status;
             $_course['gruppe']         = !$is_deputy ? $member_ships[$course->id]['gruppe'] ?? null : ($deputy ? $deputy->gruppe : null);
-            $_course['sem_number_end'] = $course->isOpenEnded() ? $max_sem_key : Semester::getIndexById($course->end_semester->id);
+            $_course['sem_number_end'] = $course->isOpenEnded() ? $max_sem_key : Semester::getIndexById($course->end_semester->id ?? null);
             $_course['sem_number']     = Semester::getIndexById($course->start_semester->id);
             $_course['tools']          = $course->tools;
             $_course['name']           = $course->name;
diff --git a/lib/classes/coursewizardsteps/BasicDataWizardStep.php b/lib/classes/coursewizardsteps/BasicDataWizardStep.php
index 4f424e817ba..58fb09fb3b9 100644
--- a/lib/classes/coursewizardsteps/BasicDataWizardStep.php
+++ b/lib/classes/coursewizardsteps/BasicDataWizardStep.php
@@ -356,9 +356,9 @@ class BasicDataWizardStep implements CourseWizardStep
                 htmlReady(get_title_for_status('dozent', 1, $values['coursetype']))
             );
         }
-        if (!$values['lecturers'][$GLOBALS['user']->id] && !$GLOBALS['perm']->have_perm('admin')) {
+        if (empty($values['lecturers'][$GLOBALS['user']->id]) && !$GLOBALS['perm']->have_perm('admin')) {
             if (Config::get()->DEPUTIES_ENABLE) {
-                if (!$values['deputies'][$GLOBALS['user']->id]) {
+                if (empty($values['deputies'][$GLOBALS['user']->id])) {
                     $errors[] = sprintf(
                         _('Sie selbst müssen entweder als %s oder als Vertretung eingetragen sein.'),
                         htmlReady(get_title_for_status('dozent', 1, $values['coursetype']))
diff --git a/lib/classes/coursewizardsteps/LVGroupsWizardStep.php b/lib/classes/coursewizardsteps/LVGroupsWizardStep.php
index 22f11ea6764..f3437308e3c 100644
--- a/lib/classes/coursewizardsteps/LVGroupsWizardStep.php
+++ b/lib/classes/coursewizardsteps/LVGroupsWizardStep.php
@@ -36,7 +36,7 @@ class LVGroupsWizardStep implements CourseWizardStep
         $course_start_time = $values[$step_one_class]['start_time'];
 
         // We only need our own stored values here.
-        $values = $values[__CLASS__];
+        $values = $values[__CLASS__] ?? [];
 
         // Load template from step template directory.
         $factory = new Flexi_TemplateFactory($GLOBALS['STUDIP_BASE_PATH'] . '/app/views/course/wizard/steps');
@@ -53,9 +53,12 @@ class LVGroupsWizardStep implements CourseWizardStep
             }
         }
 
-        $selection_details = $values['lvgruppe_selection']['area_details'];
+        $selection_details = $values['lvgruppe_selection']['area_details'] ?? null;
 
-        if ($_SESSION[__CLASS__]['course_start_time'] != $course_start_time) {
+        if (
+            isset($_SESSION[__CLASS__]['course_start_time'])
+            && $_SESSION[__CLASS__]['course_start_time'] != $course_start_time
+        ) {
             // don't store previously opened nodes
             // because we get in trouble if the semester has changed
             $open_nodes = [];
@@ -65,15 +68,15 @@ class LVGroupsWizardStep implements CourseWizardStep
 
         $_SESSION[__CLASS__]['course_start_time'] = $course_start_time;
 
-        $tpl->set_attribute('open_lvg_nodes', $open_nodes);
-        $tpl->set_attribute('selection', $selection);
-        $tpl->set_attribute('selection_details', $selection_details);
-        $tpl->set_attribute('tree', $lvgtree->getRootItem()->getChildren());
+        $tpl->open_lvg_nodes = $open_nodes;
+        $tpl->selection = $selection;
+        $tpl->selection_details = $selection_details;
+        $tpl->tree = $lvgtree->getRootItem()->getChildren();
 
-        $tpl->set_attribute('ajax_url', $values['ajax_url'] ?: URLHelper::getLink('dispatch.php/course/wizard/ajax'));
-        $tpl->set_attribute('no_js_url', $values['no_js_url'] ?: 'dispatch.php/course/wizard/forward/'.$stepnumber.'/'.$temp_id);
-        $tpl->set_attribute('stepnumber', $stepnumber);
-        $tpl->set_attribute('temp_id', $temp_id);
+        $tpl->ajax_url = !empty($values['ajax_url']) ? $values['ajax_url'] : URLHelper::getLink('dispatch.php/course/wizard/ajax');
+        $tpl->no_js_url = !empty($values['no_js_url']) ? $values['no_js_url'] : URLHelper::getURL('dispatch.php/course/wizard/forward/'.$stepnumber.'/'.$temp_id);
+        $tpl->stepnumber = $stepnumber;
+        $tpl->temp_id = $temp_id;
         return $tpl->render();
     }
 
diff --git a/lib/classes/coursewizardsteps/StudyAreasWizardStep.php b/lib/classes/coursewizardsteps/StudyAreasWizardStep.php
index f81ce41c7aa..29de61730d7 100644
--- a/lib/classes/coursewizardsteps/StudyAreasWizardStep.php
+++ b/lib/classes/coursewizardsteps/StudyAreasWizardStep.php
@@ -28,7 +28,7 @@ class StudyAreasWizardStep implements CourseWizardStep
     public function getStepTemplate($values, $stepnumber, $temp_id)
     {
         // We only need our own stored values here.
-        $values = $values[get_class($this)];
+        $values = $values[get_class($this)] ?? [];
         // Load template from step template directory.
         $factory = new Flexi_TemplateFactory($GLOBALS['STUDIP_BASE_PATH'].'/app/views/course/wizard/steps');
         $tpl = $factory->open('studyareas/index');
diff --git a/lib/plugins/core/CorePlugin.php b/lib/plugins/core/CorePlugin.php
index 7f1aaed7c54..d059f4cca47 100644
--- a/lib/plugins/core/CorePlugin.php
+++ b/lib/plugins/core/CorePlugin.php
@@ -70,7 +70,7 @@ abstract class CorePlugin
         if (!empty($metadata['description_' . $language])) {
             return $metadata['description_' . $language];
         }
-        $description = $metadata['descriptionlong'] ?? $metadata['description'];
+        $description = $metadata['descriptionlong'] ?? $metadata['description'] ?? '';
 
         if ($this->plugin_info['description_mode'] === 'override_description') {
             return $this->plugin_info['description'];
-- 
GitLab