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