diff --git a/CHANGELOG.md b/CHANGELOG.md index b58e19b992eab1c89237468e2e01e16e5846d443..787c6bfa4057289780ad3e9b4a3128f89a8d6a0e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -34,9 +34,37 @@ Features ^^^^^^^^ Bug Fixes +^^^^^^^^^ + + +Version 0.25.13 +--------------- + +Date: 08.03.18 + +Notes +^^^^^ + +Features +^^^^^^^^ +* AutoCron: Added doc for autocron. Extend AutoCron.php to be MultiDB aware. Update der AutoCron form. +* #4720 / Separate Database for Form & FormElement - Multi DB - fixed problem that 'Quick Edit Form / FormElement' has been broken in MultiDB Setup. +* #5603 / Report: final value of report columns (special column name) +* Fabric / delete now triggers form.changed / emojis work again +* #5571 / File Upload: save filesize and mimetype automatically in 'upload mode simple',if those columns exist. +* #5423 / two new column names 'filesize', 'mimetype' +* #5571 / File Upload: save filesize and mimetype + + * STORE_VARS contains now 'mimeType' and 'fileSize'. + * sqlBefore and sqlAfter will be fired in Upload Advanced and new in Upload Simple as well. + * STORE_VARS contains now `filenameOnly`. It can be used in downloadButton=.... + +Bug Fixes ^^^^^^^^^ +* Fabric: Corrected resizing with changed width in editor +* #5640 / UTF8 encoded strings: MAX LENGTH wrong Version 0.25.12 --------------- diff --git a/doc/NewVersion.md b/doc/NewVersion.md index 3b3353992ba6d5c3cca2135c77f02e5f732bc1d5..9bc88fb75121f6b8552cec46f0c41dfbd72d0e37 100644 --- a/doc/NewVersion.md +++ b/doc/NewVersion.md @@ -47,8 +47,8 @@ Neue Versionsnummer 6) **New Tag**: - git tag v0.25.12 - git push -u origin v0.25.12 + git tag v0.25.13 + git push -u origin v0.25.13 7) PhpStorm: **Sync** all files to VM qfq. diff --git a/extension/Documentation/Release.rst b/extension/Documentation/Release.rst index b58e19b992eab1c89237468e2e01e16e5846d443..787c6bfa4057289780ad3e9b4a3128f89a8d6a0e 100644 --- a/extension/Documentation/Release.rst +++ b/extension/Documentation/Release.rst @@ -34,9 +34,37 @@ Features ^^^^^^^^ Bug Fixes +^^^^^^^^^ + + +Version 0.25.13 +--------------- + +Date: 08.03.18 + +Notes +^^^^^ + +Features +^^^^^^^^ +* AutoCron: Added doc for autocron. Extend AutoCron.php to be MultiDB aware. Update der AutoCron form. +* #4720 / Separate Database for Form & FormElement - Multi DB - fixed problem that 'Quick Edit Form / FormElement' has been broken in MultiDB Setup. +* #5603 / Report: final value of report columns (special column name) +* Fabric / delete now triggers form.changed / emojis work again +* #5571 / File Upload: save filesize and mimetype automatically in 'upload mode simple',if those columns exist. +* #5423 / two new column names 'filesize', 'mimetype' +* #5571 / File Upload: save filesize and mimetype + + * STORE_VARS contains now 'mimeType' and 'fileSize'. + * sqlBefore and sqlAfter will be fired in Upload Advanced and new in Upload Simple as well. + * STORE_VARS contains now `filenameOnly`. It can be used in downloadButton=.... + +Bug Fixes ^^^^^^^^^ +* Fabric: Corrected resizing with changed width in editor +* #5640 / UTF8 encoded strings: MAX LENGTH wrong Version 0.25.12 --------------- diff --git a/extension/Documentation/Settings.cfg b/extension/Documentation/Settings.cfg index f0116a3aee946fccab4846d5923f4fad6365700e..75adbdbaca46cea14434bbb287f5e4e6e4831cd0 100644 --- a/extension/Documentation/Settings.cfg +++ b/extension/Documentation/Settings.cfg @@ -3,7 +3,7 @@ project = QFQ - Quick Form Query version = 0.25 -release = 0.25.12 +release = 0.25.13 t3author = Carsten Rose copyright = since 2017 by the author diff --git a/extension/Documentation/_make/conf.py b/extension/Documentation/_make/conf.py index 3dc87e1b1ca01b5b8fe5945d2262d9a31729ea2f..ee864d7757ac332405c2998816a40912bba77dc7 100644 --- a/extension/Documentation/_make/conf.py +++ b/extension/Documentation/_make/conf.py @@ -59,7 +59,7 @@ copyright = u'2017, Carsten Rose' # The short X.Y version. version = '0.25' # The full version, including alpha/beta/rc tags. -release = '0.25.12' +release = '0.25.13' # The language for content autogenerated by Sphinx. Refer to documentation # for a list of supported languages. diff --git a/extension/RELEASE.txt b/extension/RELEASE.txt index b58e19b992eab1c89237468e2e01e16e5846d443..787c6bfa4057289780ad3e9b4a3128f89a8d6a0e 100644 --- a/extension/RELEASE.txt +++ b/extension/RELEASE.txt @@ -34,9 +34,37 @@ Features ^^^^^^^^ Bug Fixes +^^^^^^^^^ + + +Version 0.25.13 +--------------- + +Date: 08.03.18 + +Notes +^^^^^ + +Features +^^^^^^^^ +* AutoCron: Added doc for autocron. Extend AutoCron.php to be MultiDB aware. Update der AutoCron form. +* #4720 / Separate Database for Form & FormElement - Multi DB - fixed problem that 'Quick Edit Form / FormElement' has been broken in MultiDB Setup. +* #5603 / Report: final value of report columns (special column name) +* Fabric / delete now triggers form.changed / emojis work again +* #5571 / File Upload: save filesize and mimetype automatically in 'upload mode simple',if those columns exist. +* #5423 / two new column names 'filesize', 'mimetype' +* #5571 / File Upload: save filesize and mimetype + + * STORE_VARS contains now 'mimeType' and 'fileSize'. + * sqlBefore and sqlAfter will be fired in Upload Advanced and new in Upload Simple as well. + * STORE_VARS contains now `filenameOnly`. It can be used in downloadButton=.... + +Bug Fixes ^^^^^^^^^ +* Fabric: Corrected resizing with changed width in editor +* #5640 / UTF8 encoded strings: MAX LENGTH wrong Version 0.25.12 --------------- diff --git a/extension/ext_emconf.php b/extension/ext_emconf.php index ad61b7db9c8a1485441443f2e46a222da8c73863..e72f80b395b23821e114aafb99eeab2908e35396 100644 --- a/extension/ext_emconf.php +++ b/extension/ext_emconf.php @@ -10,6 +10,6 @@ $EM_CONF[$_EXTKEY] = array( 'dependencies' => 'fluid,extbase', 'clearcacheonload' => true, 'state' => 'alpha', - 'version' => '0.25.12' + 'version' => '0.25.13' ); diff --git a/extension/qfq/api/delete.php b/extension/qfq/api/delete.php index 61dc2a0cefaf352d1b74b46733b7c7a8ed194d9d..b107ff6eca10b7478d698fde66c2153e07d148bd 100644 --- a/extension/qfq/api/delete.php +++ b/extension/qfq/api/delete.php @@ -87,7 +87,7 @@ try { switch ($modeAnswer) { case MODE_JSON: if ($flagSuccess) { - $answer[API_MESSAGE] = 'delete: success'; + $answer[API_MESSAGE] = 'Delete'; $answer[API_REDIRECT] = API_ANSWER_REDIRECT_CLIENT; $answer[API_STATUS] = API_ANSWER_STATUS_SUCCESS; } else { diff --git a/extension/qfq/api/save.php b/extension/qfq/api/save.php index 9e9dc739e7c1faa072222d0a9830021b5821b844..7683a4e05f345d7f80ff02aa091a8c3f72995176 100644 --- a/extension/qfq/api/save.php +++ b/extension/qfq/api/save.php @@ -63,7 +63,7 @@ try { $answer[API_REDIRECT_URL] = $arr[API_REDIRECT_URL]; $answer[API_STATUS] = API_ANSWER_STATUS_SUCCESS; - $answer[API_MESSAGE] = 'save: success'; + $answer[API_MESSAGE] = 'Save'; if (isset($data[API_ELEMENT_UPDATE])) { $answer[API_ELEMENT_UPDATE] = $data[API_ELEMENT_UPDATE]; } diff --git a/extension/qfq/qfq/AbstractBuildForm.php b/extension/qfq/qfq/AbstractBuildForm.php index 35154dd51d62e64abb482dc45b9da33609bd6023..acd4174fcbe9d7a5c7a331ac2152937f44991be8 100644 --- a/extension/qfq/qfq/AbstractBuildForm.php +++ b/extension/qfq/qfq/AbstractBuildForm.php @@ -1102,7 +1102,7 @@ abstract class AbstractBuildForm { if ($formElement[FE_MAX_LENGTH] > 0 && $value !== '') { // crop string only if it's not empty (substr returns false on empty strings) - $value = substr($value, 0, $formElement[FE_MAX_LENGTH]); + $value = mb_substr($value, 0, $formElement[FE_MAX_LENGTH]); } // 'maxLength' needs an upper 'L': naming convention for DB tables! if ($formElement[FE_MAX_LENGTH] > 0) { diff --git a/extension/qfq/qfq/Evaluate.php b/extension/qfq/qfq/Evaluate.php index a2db010070445abdbc322bb9984792bd72d45f72..5aaf8ae477e24e56e7d29e87a18049cfe9ee46dc 100644 --- a/extension/qfq/qfq/Evaluate.php +++ b/extension/qfq/qfq/Evaluate.php @@ -212,7 +212,7 @@ class Evaluate { $dbIndex = $this->dbIndex; // Check if the $token starts with '[<int>]...' - yes: open the necessary database. - if ($token[0] === '[') { + if (strlen($token) > 2 && $token[0] === '[') { if ($token[2] !== ']') { throw new UserFormException("Missing token ']' in '$token' on position 3", ERROR_TOKEN_MISSING); } @@ -224,6 +224,10 @@ class Evaluate { } } + if ($token === '') { + return ''; + } + if ($token[0] === '!') { $token = trim(substr($token, 1)); $sqlMode = ROW_REGULAR; diff --git a/extension/qfq/qfq/database/DatabaseUpdate.php b/extension/qfq/qfq/database/DatabaseUpdate.php index 248aa895fe41af5f957b9f0e370eaa2cf09d90b3..4278bb8f8cda514cd0918503cacef2dd216f55d5 100644 --- a/extension/qfq/qfq/database/DatabaseUpdate.php +++ b/extension/qfq/qfq/database/DatabaseUpdate.php @@ -116,6 +116,8 @@ class DatabaseUpdate { if ($dbUpdate === SYSTEM_DB_UPDATE_ALWAYS || ($dbUpdate === SYSTEM_DB_UPDATE_AUTO && $new != $old)) { $this->dbUpdateStatements($old, $new); $this->db->playSqlFile(__DIR__ . '/../../sql/formEditor.sql'); + + // Finally write the latest version number. $this->setDatabaseVersion($new); } } @@ -167,6 +169,8 @@ class DatabaseUpdate { foreach ($sqlStatements as $sql) { $this->db->sql($sql); } + // Remember already applied updates - in case something breaks and the update has to be repeated. + $this->setDatabaseVersion($new); } } } diff --git a/extension/qfq/qfq/report/Report.php b/extension/qfq/qfq/report/Report.php index 5aa4aee698185cfc353bbce2bf87889e5ab30ce4..2483a5bf18cf5c1b401056fae86aa7662d5babc3 100644 --- a/extension/qfq/qfq/report/Report.php +++ b/extension/qfq/qfq/report/Report.php @@ -620,7 +620,6 @@ class Report { $assoc[REPORT_TOKEN_FINAL_VALUE . $keyAssoc] = $renderedColumn; } - if ($flagOutput) { //prints $content .= $this->variables->doVariables($fsep); @@ -659,10 +658,16 @@ class Report { $flagOutput = true; $dummy = false; - // Empty column names are allowed: check with isset + // Special column name: '_...'? Empty column names are allowed: check with isset if (isset($columnName[0]) && $columnName[0] === TOKEN_COLUMN_CTRL) { $flagControl = true; $columnName = substr($columnName, 1); + + // Special column name and hide output: '__...'? (double '_' at the beginning) + if (isset($columnName[0]) && $columnName[0] === TOKEN_COLUMN_CTRL) { + $flagOutput = false; + $columnName = substr($columnName, 1); + } } //TODO: reserved names,not starting with '_' will be still accepted - stop this! diff --git a/extension/qfq/qfq/store/Session.php b/extension/qfq/qfq/store/Session.php index c0ef096bdfbc1fb2889ebe4c6a7956c5f5483a3d..45a0f3c75957cf8c6bbe235a8849c95537816277 100644 --- a/extension/qfq/qfq/store/Session.php +++ b/extension/qfq/qfq/store/Session.php @@ -23,23 +23,31 @@ class Session { * @throws CodeException */ private function __construct($phpUnit = false) { + if (self::$phpUnit !== null) { throw new CodeException("Try to set flag phpunit again - that should not happen.", ERROR_CODE_SHOULD_NOT_HAPPEN); } self::$phpUnit = $phpUnit; + if (self::$phpUnit === true) { self::$sessionLocal = array(); } else { ini_set('session.cookie_httponly', 1); + $lifetime = 86400; // one day + $path = $this->getSitePath(); - session_set_cookie_params(0, $path); + session_set_cookie_params($lifetime, $path); + $currentCookieParams = session_get_cookie_params(); session_name(SESSION_NAME); session_start(); + // Currently, setcookie() is only called to really extend the lifetime. All other parameter needs to be given again. + setcookie(SESSION_NAME, session_id(), time() + $lifetime, $path, $currentCookieParams['domain'], $currentCookieParams['secure'], true); + self::$sessionId = session_id(); } @@ -62,6 +70,7 @@ class Session { $path = $_SERVER['SCRIPT_NAME']; $pos = strrpos($path, '/'); + if ($pos === false) { throw new CodeException("Broken _SERVER[SCRIPT_NAME]: $path", ERROR_SESSION_BROKEN_SCRIPT_PATH); } @@ -97,6 +106,7 @@ class Session { * Destroy a session - this is only needed in case of attacks */ public static function destroy() { + session_destroy(); $_SESSION = array(); @@ -116,6 +126,7 @@ class Session { * */ public static function open() { + if (self::$sessionOpen != true && self::$sessionId != null) { session_id(self::$sessionId); session_start(); @@ -148,9 +159,9 @@ class Session { $feUidLoggedIn = $feUserUidSession; } - if ($feUidLoggedIn !== $feUserUidSession) { + if ($feUidLoggedIn != $feUserUidSession) { // destroy existing session store - Session::clearAll(); +// Session::clearAll(); // #5668 / Broken SIP after login - is it really a security improvement to destroy the SIP store in case the feUser changes? Probably not. // save new feUserUid, feUserName Session::set(SESSION_FE_USER_UID, $feUidLoggedIn); diff --git a/version b/version index a5c3b469ad19d6f599e9439004170c449e63b932..0c17dbff1bf4a24c230fa3fe55cc1b9f47901db2 100644 --- a/version +++ b/version @@ -1 +1 @@ -0.25.12 +0.25.13