From bcab137514c888a29ac4b8a796fabc7a19dcba57 Mon Sep 17 00:00:00 2001 From: Carsten Rose <carsten.rose@math.uzh.ch> Date: Sun, 21 Jun 2020 23:16:53 +0200 Subject: [PATCH] Refs #10778: Fix problem with missing mimetype. --- Documentation-develop/CODING.md | 2 +- .../Classes/Core/Helper/HelperFormElement.php | 14 ++++++++----- extension/Classes/Core/Save.php | 21 ++++++++++++------- 3 files changed, 23 insertions(+), 14 deletions(-) diff --git a/Documentation-develop/CODING.md b/Documentation-develop/CODING.md index b763de81b..690582a07 100644 --- a/Documentation-develop/CODING.md +++ b/Documentation-develop/CODING.md @@ -162,7 +162,7 @@ Upload to server, before 'save' ............................... * If a user open's a file for upload via the browse button, that file is immediately transmitted to the server. The user will see a turning wheel until the upload finished. -* After successfull upload the 'Browse' button disappears and the filename, plus the delete button, will be displayed (client logic). +* After successfully upload the 'Browse' button disappears and the filename, plus the delete button, will be displayed (client logic). * The uploaded file will be checked: maxsize, mime type, check script. * The uploaded file is still temporary. It has been renamed from '[STORE_EXTRA][<uploadSip>][FILES_TMP_NAME]' to '[STORE_EXTRA][<uploadSip>][FILES_TMP_NAME].cached'. diff --git a/extension/Classes/Core/Helper/HelperFormElement.php b/extension/Classes/Core/Helper/HelperFormElement.php index cb467d8f0..b969ac401 100644 --- a/extension/Classes/Core/Helper/HelperFormElement.php +++ b/extension/Classes/Core/Helper/HelperFormElement.php @@ -8,8 +8,8 @@ namespace IMATHUZH\Qfq\Core\Helper; -use IMATHUZH\Qfq\Core\Store\Store; use IMATHUZH\Qfq\Core\Evaluate; +use IMATHUZH\Qfq\Core\Store\Store; /** @@ -38,7 +38,7 @@ class HelperFormElement { */ public static function explodeParameterInArrayElements(array &$elements, $keyName) { - foreach ($elements AS $key => $element) { + foreach ($elements as $key => $element) { self::explodeParameter($element, $keyName); $elements[$key] = $element; } @@ -59,7 +59,7 @@ class HelperFormElement { // Do not add FE_SLAVE_ID - it's necessary to detect if a value is given or not. $default = [FE_SQL_BEFORE => '', FE_SQL_INSERT => '', FE_SQL_UPDATE => '', FE_SQL_DELETE => '', FE_SQL_AFTER => '']; - foreach ($elements AS $key => $element) { + foreach ($elements as $key => $element) { $elements[$key][FE_TG_INDEX] = 0; unset($elements[$key][FE_ADMIN_NOTE]); // $elements[$key][FE_DATA_REFERENCE] = ''; @@ -92,7 +92,7 @@ class HelperFormElement { if (!$flagAllowOverwrite) { // Check if some of the exploded keys conflict with existing keys $checkKeys = array_keys($arr); - foreach ($checkKeys AS $checkKey) { + foreach ($checkKeys as $checkKey) { if (!empty($element[$checkKey])) { self::$store = Store::getInstance(); self::$store->setVar(SYSTEM_FORM_ELEMENT, Logger::formatFormElementName($element), STORE_SYSTEM); @@ -870,7 +870,10 @@ EOF; * * @param array $fe * @param Evaluate $evaluate + * @throws \CodeException + * @throws \DbException * @throws \UserFormException + * @throws \UserReportException */ public static function sqlValidate(Evaluate $evaluate, array $fe) { @@ -906,7 +909,8 @@ EOF; // Throw user error message throw new \UserFormException(json_encode([ERROR_MESSAGE_TO_USER => $msg - , ERROR_MESSAGE_TO_DEVELOPER => 'validate() failed']), ERROR_REPORT_FAILED_ACTION); + , ERROR_MESSAGE_TO_DEVELOPER => "validate() failed.\nSQL Raw: " . $fe[FE_SQL_VALIDATE]]) + , ERROR_REPORT_FAILED_ACTION); } } \ No newline at end of file diff --git a/extension/Classes/Core/Save.php b/extension/Classes/Core/Save.php index 5f98928f6..2bb38b04b 100644 --- a/extension/Classes/Core/Save.php +++ b/extension/Classes/Core/Save.php @@ -538,8 +538,8 @@ class Save { $statusUpload = $this->store->getVar($formValues[$column] ?? '', STORE_EXTRA); // Get file stats $vars = array(); - $vars[VAR_FILE_SIZE] = $statusUpload[FILES_SIZE]; - $vars[VAR_FILE_MIME_TYPE] = $statusUpload[FILES_TYPE]; + $vars[VAR_FILE_SIZE] = $statusUpload[FILES_SIZE] ?? ''; + $vars[VAR_FILE_MIME_TYPE] = $statusUpload[FILES_TYPE] ?? ''; // Check for 'unzip'. if (isset($formElement[FE_FILE_UNZIP]) && $formElement[FE_FILE_UNZIP] != '0' && $vars[VAR_FILE_MIME_TYPE] = 'application/zip') { @@ -548,7 +548,7 @@ class Save { // Do upload $pathFileName = $this->doUpload($formElement, ($formValues[$column] ?? ''), $sip, $modeUpload); - if ($flagDoUnzip) { + if ($flagDoUnzip && $pathFileName != '') { if ($formElement[FE_FILE_UNZIP] == '' || $formElement[FE_FILE_UNZIP] == '1') { // Set default dir. $formElement[FE_FILE_UNZIP] = HelperFile::joinPathFilename(dirname($pathFileName), FE_FILE_UNPACK_DIR); @@ -654,7 +654,12 @@ class Save { ERROR_MESSAGE_TO_DEVELOPER => "File: " . $pathFileName]), ERROR_IO_ZIP_OPEN); } - // Do sqlValidate() before final extraction. + // Extract + if (false === $zip->extractTo($formElement[FE_FILE_UNZIP])) { + throw new \UserFormException("Failed to extract ZIP.", ERROR_IO_ZIP_OPEN); + } + + // Do sqlValidate() - to get mime type of zipped items, the archive has already been extracted. if (!empty($formElement[FE_SQL_VALIDATE])) { for ($i = 0; $i < $zip->numFiles; $i++) { $stat = $zip->statIndex($i); @@ -667,16 +672,16 @@ class Save { } } - // Extract - if (false === $zip->extractTo($formElement[FE_FILE_UNZIP])) { - throw new \UserFormException("Failed to extract ZIP.", ERROR_IO_ZIP_OPEN); - } // Close Zip if (false === $zip->close()) { throw new \UserFormException("Failed to close ZIP.", ERROR_IO_ZIP_OPEN); } // Process + if (!isset($formElement[FE_SLAVE_ID])) { + $formElement[FE_SLAVE_ID] = ''; + } + if (!empty($formElement[FE_SLAVE_ID] . $formElement[FE_SQL_BEFORE] . $formElement[FE_SQL_INSERT] . $formElement[FE_SQL_UPDATE] . $formElement[FE_SQL_DELETE] . $formElement[FE_SQL_AFTER])) { for ($i = 0; $i < $zip->numFiles; $i++) { -- GitLab