From 430074ffa822c2456cabbbe77413fd2d615db7d4 Mon Sep 17 00:00:00 2001
From: Jan-Hendrik Willms <tleilax+studip@gmail.com>
Date: Fri, 3 Mar 2023 20:05:20 +0000
Subject: [PATCH] adjustments due to phpstan report, fixes #2257

Closes #2257

Merge request studip/studip!1490
---
 lib/classes/ContentBar.php                        |  7 ++++---
 lib/classes/CoursewarePDFCertificate.php          |  7 +++----
 .../JsonApi/Routes/Courseware/UnitsCopy.php       | 10 ++++++++--
 .../JsonApi/Routes/Courseware/UnitsCreate.php     |  2 +-
 .../JsonApi/Routes/Courseware/UnitsUpdate.php     |  2 ++
 .../JsonApi/Routes/Files/FileRefsContentShow.php  |  2 +-
 lib/classes/Virusscanner.php                      |  7 +++++++
 lib/cronjobs/remind_oer_upload.class.php          | 15 ++++++---------
 lib/cronjobs/send_mail_notifications.class.php    |  2 +-
 lib/models/QuestionnaireInfo.php                  |  4 +---
 lib/models/User.class.php                         |  5 ++++-
 11 files changed, 38 insertions(+), 25 deletions(-)

diff --git a/lib/classes/ContentBar.php b/lib/classes/ContentBar.php
index 53b3dfce981..0e6a664dcb0 100644
--- a/lib/classes/ContentBar.php
+++ b/lib/classes/ContentBar.php
@@ -36,18 +36,19 @@ class ContentBar
     public static function get(): ContentBar
     {
         if (static::$instance === null) {
-            static::$instance = new static;
+            static::$instance = new static();
         }
         return static::$instance;
     }
 
     /**
      * Private constructor to ensure that the singleton Get() method is always
-     * used.
+     * used. The constructor is finalized so that the call to get() will never
+     * fail.
      *
      * @see ContentBar::get
      */
-    protected function __construct()
+    protected final function __construct()
     {
     }
 
diff --git a/lib/classes/CoursewarePDFCertificate.php b/lib/classes/CoursewarePDFCertificate.php
index e3ef02f70bb..ca6e704c27b 100644
--- a/lib/classes/CoursewarePDFCertificate.php
+++ b/lib/classes/CoursewarePDFCertificate.php
@@ -2,13 +2,12 @@
 
 class CoursewarePDFCertificate extends TCPDF
 {
+    protected $background;
+
     public function __construct($background = false, $orientation = 'P', $unit = 'mm', $format = 'A4', $unicode = true, $encoding = 'UTF-8')
     {
-        $this->config = Config::get();
-        if ($this->config->getValue('LOAD_EXTERNAL_MEDIA') === 'proxy') {
-            $this->media_proxy = new MediaProxy();
-        }
         parent::__construct($orientation, $unit, $format, $unicode, $encoding, false);
+
         if ($background) {
             $fileRef = FileRef::find($background);
             $this->background = $fileRef->file->getPath();
diff --git a/lib/classes/JsonApi/Routes/Courseware/UnitsCopy.php b/lib/classes/JsonApi/Routes/Courseware/UnitsCopy.php
index 53654598d52..61ffa956cf2 100644
--- a/lib/classes/JsonApi/Routes/Courseware/UnitsCopy.php
+++ b/lib/classes/JsonApi/Routes/Courseware/UnitsCopy.php
@@ -32,7 +32,13 @@ class UnitsCopy extends NonJsonApiController
         $rangeType = $data['rangeType'];
         $modified = $data['modified'];
 
-        if (!Authority::canCreateUnit($user)) {
+        try {
+            $range = \RangeFactory::createRange($rangeType, $rangeId);
+        } catch (\Exception $e) {
+            throw new RecordNotFoundException('Range could not be found');
+        }
+
+        if (!Authority::canCreateUnit($user, $range)) {
             throw new AuthorizationFailedException();
         }
 
@@ -43,4 +49,4 @@ class UnitsCopy extends NonJsonApiController
 
         return $response;
     }
-}
\ No newline at end of file
+}
diff --git a/lib/classes/JsonApi/Routes/Courseware/UnitsCreate.php b/lib/classes/JsonApi/Routes/Courseware/UnitsCreate.php
index c10961984d4..f8fb17b6b52 100644
--- a/lib/classes/JsonApi/Routes/Courseware/UnitsCreate.php
+++ b/lib/classes/JsonApi/Routes/Courseware/UnitsCreate.php
@@ -3,12 +3,12 @@
 namespace JsonApi\Routes\Courseware;
 
 use JsonApi\Errors\AuthorizationFailedException;
+use JsonApi\Errors\RecordNotFoundException;
 use JsonApi\JsonApiController;
 use JsonApi\Routes\ValidationTrait;
 use JsonApi\Schemas\Courseware\Unit as UnitSchema;
 use Psr\Http\Message\ResponseInterface as Response;
 use Psr\Http\Message\ServerRequestInterface as Request;
-use Studip\Activity\Activity;
 
 /**
  * Create a block in a container.
diff --git a/lib/classes/JsonApi/Routes/Courseware/UnitsUpdate.php b/lib/classes/JsonApi/Routes/Courseware/UnitsUpdate.php
index 53fccd3358f..762fb0437e8 100644
--- a/lib/classes/JsonApi/Routes/Courseware/UnitsUpdate.php
+++ b/lib/classes/JsonApi/Routes/Courseware/UnitsUpdate.php
@@ -6,6 +6,7 @@ use Courseware\Unit;
 use JsonApi\Errors\AuthorizationFailedException;
 use JsonApi\Errors\RecordNotFoundException;
 use JsonApi\JsonApiController;
+use JsonApi\Routes\TimestampTrait;
 use JsonApi\Routes\ValidationTrait;
 use JsonApi\Schemas\Courseware\Unit as UnitSchema;
 use Psr\Http\Message\ResponseInterface as Response;
@@ -17,6 +18,7 @@ use Psr\Http\Message\ServerRequestInterface as Request;
 class UnitsUpdate extends JsonApiController
 {
     use EditBlockAwareTrait;
+    use TimestampTrait;
     use ValidationTrait;
 
     /**
diff --git a/lib/classes/JsonApi/Routes/Files/FileRefsContentShow.php b/lib/classes/JsonApi/Routes/Files/FileRefsContentShow.php
index b2b67ce0246..e2d19c4a95b 100644
--- a/lib/classes/JsonApi/Routes/Files/FileRefsContentShow.php
+++ b/lib/classes/JsonApi/Routes/Files/FileRefsContentShow.php
@@ -114,7 +114,7 @@ class FileRefsContentShow extends NonJsonApiController
 
         $fileRef->incrementDownloadCounter();
 
-        $stream = Psr7\stream_for(fopen($pathFile, 'rb'));
+        $stream = Psr7\Utils::streamFor(fopen($pathFile, 'rb'));
 
         return $response->withBody($stream);
     }
diff --git a/lib/classes/Virusscanner.php b/lib/classes/Virusscanner.php
index 628fdbac42d..077e3e26de5 100644
--- a/lib/classes/Virusscanner.php
+++ b/lib/classes/Virusscanner.php
@@ -88,6 +88,13 @@ class Virusscanner
         return [];
     }
 
+    /**
+     * Finalized constructor so that the instantition in scan() will never fail.
+     */
+    protected final function __construct()
+    {
+    }
+
     /**
      * Establishes a connection to virus scanner via socket or TCP, depending on Stud.IP configuration.
      *
diff --git a/lib/cronjobs/remind_oer_upload.class.php b/lib/cronjobs/remind_oer_upload.class.php
index 9ac20e799d6..a1a8ee1984c 100644
--- a/lib/cronjobs/remind_oer_upload.class.php
+++ b/lib/cronjobs/remind_oer_upload.class.php
@@ -39,10 +39,10 @@ class RemindOerUpload extends CronJob
                 $filetype = $file_ref->getFileType();
                 $file_to_suggest = $filetype->convertToStandardFile();
 
-                $this->author = $file_ref->owner->username;
-                $this->link_to_share = URLHelper::getURL('dispatch.php/file/share_oer/' . $result['file_ref_id']);
-                $this->linktext = _('Klicken Sie hier, um das Material im OER-Campus zu veröffentlichen.');
-                $this->formatted_link = '['. $this->linktext .']' . $this->link_to_share;
+                $author = $file_ref->owner->username;
+                $link_to_share = URLHelper::getURL('dispatch.php/file/share_oer/' . $result['file_ref_id']);
+                $linktext = _('Klicken Sie hier, um das Material im OER-Campus zu veröffentlichen.');
+                $formatted_link = '['. $linktext .']' . $link_to_share;
 
                 $oer_reminder_message = sprintf(_("Sie wollten daran erinnert werden, die folgende Datei im OER-Campus zu veröffentlichen:\n\n"
                     . "Dateiname: %s \n"
@@ -50,14 +50,14 @@ class RemindOerUpload extends CronJob
                     . "%s \n\n"),
                     $file_to_suggest->getFilename(),
                     $file_to_suggest->getDescription(),
-                    $this->formatted_link
+                    $formatted_link
                 );
 
                 $messaging = new messaging();
 
                 $messaging->insert_message(
                     $oer_reminder_message,
-                    $this->author,
+                    $author,
                     '____%system%____',
                     '',
                     Request::option('message_id'),
@@ -67,10 +67,7 @@ class RemindOerUpload extends CronJob
                 );
 
                 OERPostUpload::deleteBySQL("file_ref_id = ?", [$result['file_ref_id']]);
-
             }
-
         }
-
     }
 }
diff --git a/lib/cronjobs/send_mail_notifications.class.php b/lib/cronjobs/send_mail_notifications.class.php
index c336308194e..08882943b94 100644
--- a/lib/cronjobs/send_mail_notifications.class.php
+++ b/lib/cronjobs/send_mail_notifications.class.php
@@ -114,7 +114,7 @@ class SendMailNotificationsJob extends CronJob
                     return;
                 }
 
-                $GLOBALS['user'] = new Seminar_user($user);
+                $GLOBALS['user'] = new Seminar_User($user);
 
                 $ok = false;
                 $mailmessage = $notification->getAllNotifications($user->id);
diff --git a/lib/models/QuestionnaireInfo.php b/lib/models/QuestionnaireInfo.php
index 75965866f7e..0b1493c5d6b 100644
--- a/lib/models/QuestionnaireInfo.php
+++ b/lib/models/QuestionnaireInfo.php
@@ -1,6 +1,4 @@
 <?php
-require_once 'lib/classes/QuestionType.interface.php';
-
 class QuestionnaireInfo extends QuestionnaireQuestion implements QuestionType
 {
     public static function getIcon(bool $active = false) : Icon
@@ -45,7 +43,7 @@ class QuestionnaireInfo extends QuestionnaireQuestion implements QuestionType
 
     public function createAnswer()
     {
-
+        return new QuestionnaireAnswer(); // Unused but necessary
     }
 
     public function getUserIdsOfFilteredAnswer($answer_option)
diff --git a/lib/models/User.class.php b/lib/models/User.class.php
index 82709db4b4e..0653f5ce7e9 100644
--- a/lib/models/User.class.php
+++ b/lib/models/User.class.php
@@ -237,7 +237,10 @@ class User extends AuthUserMd5 implements Range, PrivacyObject
      */
     public static function build($data, $is_new = true)
     {
-        $user = new static();
+        // Note: This should be used instead of `new static()` since PHPStan
+        $class = get_called_class();
+        $user = new $class();
+
         $user->info = new UserInfo();
         $user->setData($data);
         $user->setNew($is_new);
-- 
GitLab