diff --git a/lib/classes/ContentBar.php b/lib/classes/ContentBar.php index 53b3dfce98162aef4399e58aad9c9703d6d2e445..0e6a664dcb0365fc70221cefeb7ac53d291bfc35 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 e3ef02f70bb92de223faf95f18010466185447ef..ca6e704c27b221960218f44a56ebe0ed85dc8344 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 53654598d522a16eb1bc37dff144f17e3cf36428..61ffa956cf2d8531c0013b164a7ce30c788dc419 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 c10961984d4d188d1ed68073f46a0f124ed015e1..f8fb17b6b5290c0824058c6058387850a3bb632a 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 53fccd3358fe46f4b1d31d199f577adb42c5df85..762fb0437e81a86eda650ea66ad0c721073642cd 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 b2b67ce024620ccf9afddef40c49527ebac9d667..e2d19c4a95b73382f699eb5c1524320c1cca475f 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 628fdbac42d6414593df5512ad48a025cae5c485..077e3e26de5fc5297a6915fec0ff3242d36a2584 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 9ac20e799d610717cbc4c2ab07a12d6194c26533..a1a8ee1984cbb7ec12817091d5030101217f9b16 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 c336308194e8ebbfb5c7432a5593a9b8f82dfdc8..08882943b94634d363996075648e89a35ba2c834 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 75965866f7eb46271defa27e6637239a01e40aca..0b1493c5d6ba6bd16280b64c68ebd16158187186 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 82709db4b4edd926ac33a87c740d029f4c18b007..0653f5ce7e9a14c5674244185be34c5aa807250a 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);