From 1e5f39ff4fe2bf623099f953179700fae663df8a Mon Sep 17 00:00:00 2001 From: Marc Egger <marc.egger@uzh.ch> Date: Tue, 9 Jun 2020 10:57:14 +0200 Subject: [PATCH 001/195] Refs #10120 Teste form zu json --- extension/Classes/Core/Form/FormAsFile.php | 21 +++++++++++++++++++++ extension/Classes/Core/QuickFormQuery.php | 6 ++++++ 2 files changed, 27 insertions(+) create mode 100644 extension/Classes/Core/Form/FormAsFile.php diff --git a/extension/Classes/Core/Form/FormAsFile.php b/extension/Classes/Core/Form/FormAsFile.php new file mode 100644 index 000000000..d786b38c9 --- /dev/null +++ b/extension/Classes/Core/Form/FormAsFile.php @@ -0,0 +1,21 @@ +<?php + + +namespace IMATHUZH\Qfq\Core\Form; + + +use IMATHUZH\Qfq\Core\Database\Database; + +class FormAsFile +{ + public function databaseToJson(string $formName, Database $database) { + $constant = F_NAME; // can't use constants in strings directly (below) + $form = $database->sql("SELECT * FROM `Form` AS f WHERE `f`.`$constant` LIKE ? AND `f`.`deleted`='no'", ROW_EXPECT_1, + [$formName], 'Form "' . $formName . '" not found or multiple forms with the same name.'); + + throw new \UserFormException(json_encode([ + ERROR_MESSAGE_TO_USER => 'Marc debug error', + ERROR_MESSAGE_TO_DEVELOPER => json_encode($form, JSON_PRETTY_PRINT) + ])); + } +} \ No newline at end of file diff --git a/extension/Classes/Core/QuickFormQuery.php b/extension/Classes/Core/QuickFormQuery.php index 411b764fc..bafadab6d 100644 --- a/extension/Classes/Core/QuickFormQuery.php +++ b/extension/Classes/Core/QuickFormQuery.php @@ -15,6 +15,7 @@ use IMATHUZH\Qfq\Core\Database\DatabaseUpdate; use IMATHUZH\Qfq\Core\Form\Dirty; use IMATHUZH\Qfq\Core\Form\DragAndDrop; use IMATHUZH\Qfq\Core\Form\FormAction; +use IMATHUZH\Qfq\Core\Form\FormAsFile; use IMATHUZH\Qfq\Core\Helper\HelperFile; use IMATHUZH\Qfq\Core\Helper\HelperFormElement; use IMATHUZH\Qfq\Core\Helper\KeyValueStringParser; @@ -997,6 +998,11 @@ class QuickFormQuery { $this->store->setVar(CLIENT_RECORD_ID, $rTmp, STORE_TYPO3); } + ///////////////// JUST A TEST, DELETE ME! ////////////// + $formASFile = new FormAsFile(); + $formASFile->databaseToJson('person', $this->dbArray[$this->dbIndexQfq]); + ///////////////// TEST FINISHED //////////////////////// + // Load form $constant = F_NAME; // PhpStorm complains if the constant is directly defined in the string below $form = $this->dbArray[$this->dbIndexQfq]->sql("SELECT * FROM `Form` AS f WHERE `f`.`$constant` LIKE ? AND `f`.`deleted`='no'", ROW_EXPECT_1, -- GitLab From 6c7db18440d016a266216a40541a560f9877951a Mon Sep 17 00:00:00 2001 From: Marc Egger <marc.egger@uzh.ch> Date: Tue, 9 Jun 2020 12:25:34 +0200 Subject: [PATCH 002/195] Refs #10120 get default values for Form table --- extension/Classes/Core/Form/FormAsFile.php | 23 +++++++++++++++++++++- extension/Classes/Core/QuickFormQuery.php | 2 +- 2 files changed, 23 insertions(+), 2 deletions(-) diff --git a/extension/Classes/Core/Form/FormAsFile.php b/extension/Classes/Core/Form/FormAsFile.php index d786b38c9..a3c0ea25f 100644 --- a/extension/Classes/Core/Form/FormAsFile.php +++ b/extension/Classes/Core/Form/FormAsFile.php @@ -5,14 +5,35 @@ namespace IMATHUZH\Qfq\Core\Form; use IMATHUZH\Qfq\Core\Database\Database; +use IMATHUZH\Qfq\Core\Store\Store; class FormAsFile { - public function databaseToJson(string $formName, Database $database) { + public function databaseToJson(string $formName, Database $database,Store $store) { + // TODO: felder die default werte enthalten aus JSON loeschen + // TODO: Form und Form Elemente laden, als JSON zurueck geben + // TODO: in QuickFormQuery einmal form normal laden und auch hiermit laden und dann resultat vergleichen + $constant = F_NAME; // can't use constants in strings directly (below) $form = $database->sql("SELECT * FROM `Form` AS f WHERE `f`.`$constant` LIKE ? AND `f`.`deleted`='no'", ROW_EXPECT_1, [$formName], 'Form "' . $formName . '" not found or multiple forms with the same name.'); + // get default values for Form table + $schema_column_name = 'COLUMN_NAME'; + $schema_column_default = 'COLUMN_DEFAULT'; + $dbNameQFQ = $store->getVar(SYSTEM_DB_NAME_QFQ, STORE_SYSTEM); + $query = "SELECT $schema_column_name, $schema_column_default + FROM Information_Schema.Columns + WHERE Table_Schema = '$dbNameQFQ' + AND Table_Name = 'Form'"; + $formSchema = $database->sql($query, ROW_REGULAR, []); + $form['formSchema'] = $formSchema; ///// DEBUG + + // get form elements + $formElements = $database->sql("SELECT * FROM `FormElement` AS `fe` WHERE `fe`.`formId` = ? ORDER BY `fe`.`ord`, `fe`.`id`", ROW_REGULAR, [$form["id"]]); + $form['formElements'] = $formElements; + + /////// DEBUG throw new \UserFormException(json_encode([ ERROR_MESSAGE_TO_USER => 'Marc debug error', ERROR_MESSAGE_TO_DEVELOPER => json_encode($form, JSON_PRETTY_PRINT) diff --git a/extension/Classes/Core/QuickFormQuery.php b/extension/Classes/Core/QuickFormQuery.php index bafadab6d..9adfe5516 100644 --- a/extension/Classes/Core/QuickFormQuery.php +++ b/extension/Classes/Core/QuickFormQuery.php @@ -1000,7 +1000,7 @@ class QuickFormQuery { ///////////////// JUST A TEST, DELETE ME! ////////////// $formASFile = new FormAsFile(); - $formASFile->databaseToJson('person', $this->dbArray[$this->dbIndexQfq]); + $formASFile->databaseToJson('person', $this->dbArray[$this->dbIndexQfq], $this->store); ///////////////// TEST FINISHED //////////////////////// // Load form -- GitLab From 4799d6bcb582df694e93e72481d2f256c6d13615 Mon Sep 17 00:00:00 2001 From: Marc Egger <marc.egger@uzh.ch> Date: Wed, 17 Jun 2020 11:39:40 +0200 Subject: [PATCH 003/195] Refs #10120 filter non default columns from form and formElements --- extension/Classes/Core/Form/FormAsFile.php | 92 ++++++++++++++++++---- 1 file changed, 75 insertions(+), 17 deletions(-) diff --git a/extension/Classes/Core/Form/FormAsFile.php b/extension/Classes/Core/Form/FormAsFile.php index a3c0ea25f..bb71dfdd0 100644 --- a/extension/Classes/Core/Form/FormAsFile.php +++ b/extension/Classes/Core/Form/FormAsFile.php @@ -7,36 +7,94 @@ namespace IMATHUZH\Qfq\Core\Form; use IMATHUZH\Qfq\Core\Database\Database; use IMATHUZH\Qfq\Core\Store\Store; +// TODO: move to Constants.php if this file is actually used +const SCHEMA_COLUMN_NAME = 'COLUMN_NAME'; +const SCHEMA_COLUMN_DEFAULT = 'COLUMN_DEFAULT'; + class FormAsFile { - public function databaseToJson(string $formName, Database $database,Store $store) { + public function databaseToJson(string $formName, Database $database,Store $store) + { + // TODO: create FORM_schema.JSON and FORM_ELEMENT_schema.JSON with default values + // TODO: read defaults from FORM_schema.JSON instead of database schema // TODO: felder die default werte enthalten aus JSON loeschen + // Problem: wenn sich default wert aendert dann aendern sich auch alle bisherigen forms. + // zur Zeit ist default wert nur beim erstellen des forms relevant + // Problem: Eigentlich sollten wir jetzt default werte in einem JSON fixieren und diese dort draus lesen. + // TODO: Form und Form Elemente laden, als JSON zurueck geben // TODO: in QuickFormQuery einmal form normal laden und auch hiermit laden und dann resultat vergleichen + // TODO: Besprechen: php 7.3 syntax erlauben? bsp. flexible heredoc multiline string - $constant = F_NAME; // can't use constants in strings directly (below) - $form = $database->sql("SELECT * FROM `Form` AS f WHERE `f`.`$constant` LIKE ? AND `f`.`deleted`='no'", ROW_EXPECT_1, + /* get form from table */ + /***********************/ + + // define $form: array(column name => value) + $F_NAME = F_NAME; // can't use constants in strings directly + $form = $database->sql("SELECT * FROM `Form` AS f WHERE `f`.`$F_NAME` LIKE ? AND `f`.`deleted`='no'", ROW_EXPECT_1, [$formName], 'Form "' . $formName . '" not found or multiple forms with the same name.'); - // get default values for Form table - $schema_column_name = 'COLUMN_NAME'; - $schema_column_default = 'COLUMN_DEFAULT'; - $dbNameQFQ = $store->getVar(SYSTEM_DB_NAME_QFQ, STORE_SYSTEM); - $query = "SELECT $schema_column_name, $schema_column_default - FROM Information_Schema.Columns - WHERE Table_Schema = '$dbNameQFQ' - AND Table_Name = 'Form'"; - $formSchema = $database->sql($query, ROW_REGULAR, []); - $form['formSchema'] = $formSchema; ///// DEBUG - - // get form elements + // define $formNoDefault: array(column name => value) + $formNoDefault = $this->filterNonDefaultColumns($form, 'Form', $database, $store); + + // define $formElementsNoDefault: array(array(column name => value)) $formElements = $database->sql("SELECT * FROM `FormElement` AS `fe` WHERE `fe`.`formId` = ? ORDER BY `fe`.`ord`, `fe`.`id`", ROW_REGULAR, [$form["id"]]); - $form['formElements'] = $formElements; + $formElementsNoDefault = array_map(function ($formElement) use ($store, $database) { + return $this->filterNonDefaultColumns($formElement, 'FormElement', $database, $store); + }, $formElements); + + + $formNoDefault['formElementDefaults'] = $this->getColumnDefaults('FormElement', $database, $store); + $formNoDefault['formElements'] = $formElements; + $formNoDefault['formElementsNoDefault'] = $formElementsNoDefault; /////// DEBUG throw new \UserFormException(json_encode([ ERROR_MESSAGE_TO_USER => 'Marc debug error', - ERROR_MESSAGE_TO_DEVELOPER => json_encode($form, JSON_PRETTY_PRINT) + ERROR_MESSAGE_TO_DEVELOPER => json_encode($formNoDefault, JSON_PRETTY_PRINT) ])); } + + /** + * @param string $tableName + * @param Database $database + * @param Store $store + * @return mixed|null + * @throws \CodeException + * @throws \DbException + * @throws \UserFormException + */ + public function getColumnDefaults(string $tableName, Database $database, Store $store): array + { + // define: $formSchema: array(array('COLUMN_NAME' => column name, 'COLUMN_DEFAULT' => column default)) + $dbNameQFQ = $store->getVar(SYSTEM_DB_NAME_QFQ, STORE_SYSTEM); + $query = "SELECT " . SCHEMA_COLUMN_NAME . ", " . SCHEMA_COLUMN_DEFAULT . " FROM Information_Schema.Columns WHERE Table_Schema = '$dbNameQFQ' AND Table_Name = '$tableName'"; + $formSchema = $database->sql($query, ROW_REGULAR, []); + + // return: array(column name => default value) + return array_reduce($formSchema, function ($result, $column) { + $result[$column[SCHEMA_COLUMN_NAME]] = $column[SCHEMA_COLUMN_DEFAULT]; + return $result; + }, []); + } + + /** + * @param $row + * @param string $tableName + * @param Database $database + * @param Store $store + * @return array + * @throws \CodeException + * @throws \DbException + * @throws \UserFormException + */ + public function filterNonDefaultColumns(array $row, string $tableName, Database $database, Store $store): array + { + $columnDefaults = $this->getColumnDefaults($tableName, $database, $store); + + // return $formNoDefault: array(column name => value) + return array_filter($row, function ($value, $columnName) use ($columnDefaults) { + return $value !== $columnDefaults[$columnName]; + }, ARRAY_FILTER_USE_BOTH); + } } \ No newline at end of file -- GitLab From d3fe1f7e37d87d9841b70af6a1147ae74ba569cf Mon Sep 17 00:00:00 2001 From: Marc Egger <marc.egger@uzh.ch> Date: Tue, 23 Jun 2020 17:55:01 +0200 Subject: [PATCH 004/195] Refs #10120 build toml, current toml parser needs php 7.1! --- extension/Classes/Core/Form/FormAsFile.php | 55 +++++++++++++++------- extension/Classes/Core/QuickFormQuery.php | 6 ++- extension/composer.json | 3 +- 3 files changed, 45 insertions(+), 19 deletions(-) diff --git a/extension/Classes/Core/Form/FormAsFile.php b/extension/Classes/Core/Form/FormAsFile.php index bb71dfdd0..305047dd5 100644 --- a/extension/Classes/Core/Form/FormAsFile.php +++ b/extension/Classes/Core/Form/FormAsFile.php @@ -3,9 +3,11 @@ namespace IMATHUZH\Qfq\Core\Form; +use Yosymfony\Toml\Toml; use IMATHUZH\Qfq\Core\Database\Database; use IMATHUZH\Qfq\Core\Store\Store; +use Yosymfony\Toml\TomlBuilder; // TODO: move to Constants.php if this file is actually used const SCHEMA_COLUMN_NAME = 'COLUMN_NAME'; @@ -13,7 +15,7 @@ const SCHEMA_COLUMN_DEFAULT = 'COLUMN_DEFAULT'; class FormAsFile { - public function databaseToJson(string $formName, Database $database,Store $store) + public function databaseToJson(string $formName, Database $database, string $dbNameQFQ) { // TODO: create FORM_schema.JSON and FORM_ELEMENT_schema.JSON with default values // TODO: read defaults from FORM_schema.JSON instead of database schema @@ -35,39 +37,60 @@ class FormAsFile [$formName], 'Form "' . $formName . '" not found or multiple forms with the same name.'); // define $formNoDefault: array(column name => value) - $formNoDefault = $this->filterNonDefaultColumns($form, 'Form', $database, $store); + $formNoDefault = $this->filterNonDefaultColumns($form, 'Form', $database, $dbNameQFQ); // define $formElementsNoDefault: array(array(column name => value)) $formElements = $database->sql("SELECT * FROM `FormElement` AS `fe` WHERE `fe`.`formId` = ? ORDER BY `fe`.`ord`, `fe`.`id`", ROW_REGULAR, [$form["id"]]); - $formElementsNoDefault = array_map(function ($formElement) use ($store, $database) { - return $this->filterNonDefaultColumns($formElement, 'FormElement', $database, $store); + $formElementsNoDefault = array_map(function ($formElement) use ($dbNameQFQ, $database) { + return $this->filterNonDefaultColumns($formElement, 'FormElement', $database, $dbNameQFQ); }, $formElements); - $formNoDefault['formElementDefaults'] = $this->getColumnDefaults('FormElement', $database, $store); - $formNoDefault['formElements'] = $formElements; - $formNoDefault['formElementsNoDefault'] = $formElementsNoDefault; - /////// DEBUG + + // collect output + $columnDefaults = $this->getColumnDefaults('FormElement', $database, $dbNameQFQ); + + // parse TOML + $array = Toml::Parse('key = [1,2,3]'); + + // build TOML + $tb = new TomlBuilder(); + $tb->addTable('Form'); + foreach($formNoDefault as $parameter => $value) { + $tb->addValue($parameter, $value); + } + foreach ($formElementsNoDefault as $formElement) { + // add form elements to toml + // php auf version 7.1 hoch + // composer update + $tb->addArrayTables('FormElement'); + foreach ($formElement as $parameter => $value) { + $tb->addValue($parameter, $value); + } + } + $result = $tb->getTomlString(); + + + throw new \UserFormException(json_encode([ ERROR_MESSAGE_TO_USER => 'Marc debug error', - ERROR_MESSAGE_TO_DEVELOPER => json_encode($formNoDefault, JSON_PRETTY_PRINT) + ERROR_MESSAGE_TO_DEVELOPER => $result // json_encode($array, JSON_PRETTY_PRINT) ])); } /** * @param string $tableName * @param Database $database - * @param Store $store + * @param string $dbNameQFQ * @return mixed|null * @throws \CodeException * @throws \DbException * @throws \UserFormException */ - public function getColumnDefaults(string $tableName, Database $database, Store $store): array + public function getColumnDefaults(string $tableName, Database $database, string $dbNameQFQ): array { // define: $formSchema: array(array('COLUMN_NAME' => column name, 'COLUMN_DEFAULT' => column default)) - $dbNameQFQ = $store->getVar(SYSTEM_DB_NAME_QFQ, STORE_SYSTEM); $query = "SELECT " . SCHEMA_COLUMN_NAME . ", " . SCHEMA_COLUMN_DEFAULT . " FROM Information_Schema.Columns WHERE Table_Schema = '$dbNameQFQ' AND Table_Name = '$tableName'"; $formSchema = $database->sql($query, ROW_REGULAR, []); @@ -79,18 +102,18 @@ class FormAsFile } /** - * @param $row + * @param array $row * @param string $tableName * @param Database $database - * @param Store $store + * @param string $dbNameQFQ * @return array * @throws \CodeException * @throws \DbException * @throws \UserFormException */ - public function filterNonDefaultColumns(array $row, string $tableName, Database $database, Store $store): array + public function filterNonDefaultColumns(array $row, string $tableName, Database $database, string $dbNameQFQ): array { - $columnDefaults = $this->getColumnDefaults($tableName, $database, $store); + $columnDefaults = $this->getColumnDefaults($tableName, $database, $dbNameQFQ); // return $formNoDefault: array(column name => value) return array_filter($row, function ($value, $columnName) use ($columnDefaults) { diff --git a/extension/Classes/Core/QuickFormQuery.php b/extension/Classes/Core/QuickFormQuery.php index 9adfe5516..dd6ab47c9 100644 --- a/extension/Classes/Core/QuickFormQuery.php +++ b/extension/Classes/Core/QuickFormQuery.php @@ -62,7 +62,7 @@ class QuickFormQuery { */ protected $evaluate = null; - protected $formSpec = array(); + protected $formSpec = array(); // Stores the form content after parsing SQL queries and QFQ syntax stored in form attributes protected $feSpecAction = array(); // Form Definition: copy of the loaded form protected $feSpecNative = array(); // FormEelement Definition: all formElement.class='action' of the loaded form protected $feSpecNativeRaw = array(); // FormEelement Definition: all formElement.class='action' of the loaded form @@ -1000,7 +1000,7 @@ class QuickFormQuery { ///////////////// JUST A TEST, DELETE ME! ////////////// $formASFile = new FormAsFile(); - $formASFile->databaseToJson('person', $this->dbArray[$this->dbIndexQfq], $this->store); + $formASFile->databaseToJson('form', $this->dbArray[$this->dbIndexQfq], $this->store->getVar(SYSTEM_DB_NAME_QFQ, STORE_SYSTEM)); ///////////////// TEST FINISHED //////////////////////// // Load form @@ -1069,6 +1069,8 @@ class QuickFormQuery { } $formSpec = $this->syncSystemFormConfig($formSpec); + + // Set form parameter which are expected to exist. $formSpec = $this->initForm($formSpec, $recordId); $formSpec = array_merge($formSpec, $parseLater); diff --git a/extension/composer.json b/extension/composer.json index 1e0adcf6e..24251d600 100644 --- a/extension/composer.json +++ b/extension/composer.json @@ -2,7 +2,8 @@ "require": { "phpoffice/phpspreadsheet": "^1.3", "ext-json": "*", - "twig/twig": "^2.0" + "twig/twig": "^2.0", + "yosymfony/toml": "^0.3.3" }, "require-dev": { "phpunit/phpunit": "^6.5" -- GitLab From 19aa224246e90cfe3385841cbeed6f9b1ab27b53 Mon Sep 17 00:00:00 2001 From: megger <marc.egger@uzh.ch> Date: Wed, 24 Jun 2020 11:29:44 +0200 Subject: [PATCH 005/195] add yosymfon-toml-fork as submodule --- .gitmodules | 3 +++ extension/Submodules/yosymfon-toml-fork | 1 + 2 files changed, 4 insertions(+) create mode 100644 .gitmodules create mode 160000 extension/Submodules/yosymfon-toml-fork diff --git a/.gitmodules b/.gitmodules new file mode 100644 index 000000000..ce06d034a --- /dev/null +++ b/.gitmodules @@ -0,0 +1,3 @@ +[submodule "extension/Submodules/yosymfon-toml-fork"] + path = extension/Submodules/yosymfon-toml-fork + url = https://git.math.uzh.ch/megger/yosymfon-toml-fork diff --git a/extension/Submodules/yosymfon-toml-fork b/extension/Submodules/yosymfon-toml-fork new file mode 160000 index 000000000..1e2325581 --- /dev/null +++ b/extension/Submodules/yosymfon-toml-fork @@ -0,0 +1 @@ +Subproject commit 1e23255811dc2999fe347e9996c6281938492ed8 -- GitLab From 1fb238c52f24967a8d2367875c77c4ad066fb7ba Mon Sep 17 00:00:00 2001 From: Marc Egger <marc.egger@uzh.ch> Date: Wed, 24 Jun 2020 15:19:40 +0200 Subject: [PATCH 006/195] Refs #10120 add git-submodules to "make bootstrap" --- Makefile | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/Makefile b/Makefile index 23814b1d5..defecd527 100644 --- a/Makefile +++ b/Makefile @@ -56,7 +56,7 @@ release: basic build-dist plantuml: cd doc/diagram ; $(MAKE) -bootstrap: .npmpackages .plantuml_install .virtual_env +bootstrap: git-submodules .npmpackages .plantuml_install .virtual_env npm update grunt default @@ -131,5 +131,12 @@ doc-local: doc-qfqio: rsync -av "Documentation/_build/html/" root@w16.math.uzh.ch:/var/www/html/qfq/doc/ + +git-submodules: + git submodule update --init --recursive + + # always pull submodule changes when using `git pull` + git config submodule.recurse true + git pull -- GitLab From a3cb3cd55d6820861c606d45c6ddbc2806eebf63 Mon Sep 17 00:00:00 2001 From: Marc Egger <marc.egger@uzh.ch> Date: Wed, 24 Jun 2020 16:34:07 +0200 Subject: [PATCH 007/195] Store.php: add missing class import --- extension/Classes/Core/Store/Store.php | 1 + 1 file changed, 1 insertion(+) diff --git a/extension/Classes/Core/Store/Store.php b/extension/Classes/Core/Store/Store.php index a39166e74..6be741eae 100644 --- a/extension/Classes/Core/Store/Store.php +++ b/extension/Classes/Core/Store/Store.php @@ -9,6 +9,7 @@ namespace IMATHUZH\Qfq\Core\Store; use IMATHUZH\Qfq\Core\Database\Database; +use IMATHUZH\Qfq\Core\Helper\HelperFile; use IMATHUZH\Qfq\Core\Helper\KeyValueStringParser; use IMATHUZH\Qfq\Core\Helper\Logger; use IMATHUZH\Qfq\Core\Helper\OnArray; -- GitLab From bdc1316e14d39c9df667c9b5502cdf115abaf80b Mon Sep 17 00:00:00 2001 From: Marc Egger <marc.egger@uzh.ch> Date: Wed, 24 Jun 2020 17:01:50 +0200 Subject: [PATCH 008/195] Refs #10120 add yosymfony/parser-utils as submodule. now parsing works --- .gitmodules | 3 +++ Makefile | 2 +- extension/Classes/Core/Form/FormAsFile.php | 11 +++-------- extension/Submodules/yosymfony-parser-utils | 1 + extension/composer.json | 7 ++++--- 5 files changed, 12 insertions(+), 12 deletions(-) create mode 160000 extension/Submodules/yosymfony-parser-utils diff --git a/.gitmodules b/.gitmodules index ce06d034a..d63402973 100644 --- a/.gitmodules +++ b/.gitmodules @@ -1,3 +1,6 @@ [submodule "extension/Submodules/yosymfon-toml-fork"] path = extension/Submodules/yosymfon-toml-fork url = https://git.math.uzh.ch/megger/yosymfon-toml-fork +[submodule "extension/Submodules/yosymfony-parser-utils"] + path = extension/Submodules/yosymfony-parser-utils + url = https://github.com/yosymfony/parser-utils diff --git a/Makefile b/Makefile index defecd527..529fc0dc9 100644 --- a/Makefile +++ b/Makefile @@ -8,7 +8,7 @@ RELEASE_DATE = $(shell date '+%Y%m%d%H%M') GIT_REVISION_SHORT = $(shell git rev-parse --short HEAD || true) GIT_REVISION_LONG = $(shell git rev-parse HEAD || true) -EXTENSION_CONTENT = Classes Configuration Resources ext_emconf.php ext_localconf.php ext_tables.php ext_icon.png ext_conf_template.txt config-example.qfq.php RELEASE.txt vendor +EXTENSION_CONTENT = Classes Submodules Configuration Resources ext_emconf.php ext_localconf.php ext_tables.php ext_icon.png ext_conf_template.txt config-example.qfq.php RELEASE.txt vendor DISTDIR=dist diff --git a/extension/Classes/Core/Form/FormAsFile.php b/extension/Classes/Core/Form/FormAsFile.php index 305047dd5..788ac9783 100644 --- a/extension/Classes/Core/Form/FormAsFile.php +++ b/extension/Classes/Core/Form/FormAsFile.php @@ -3,10 +3,8 @@ namespace IMATHUZH\Qfq\Core\Form; -use Yosymfony\Toml\Toml; - use IMATHUZH\Qfq\Core\Database\Database; -use IMATHUZH\Qfq\Core\Store\Store; +use Yosymfony\Toml\Toml; use Yosymfony\Toml\TomlBuilder; // TODO: move to Constants.php if this file is actually used @@ -52,7 +50,7 @@ class FormAsFile $columnDefaults = $this->getColumnDefaults('FormElement', $database, $dbNameQFQ); // parse TOML - $array = Toml::Parse('key = [1,2,3]'); + $array = Toml::parse('key = [1,2,3]'); // build TOML $tb = new TomlBuilder(); @@ -61,10 +59,7 @@ class FormAsFile $tb->addValue($parameter, $value); } foreach ($formElementsNoDefault as $formElement) { - // add form elements to toml - // php auf version 7.1 hoch - // composer update - $tb->addArrayTables('FormElement'); + $tb->addArrayOfTable('FormElement'); foreach ($formElement as $parameter => $value) { $tb->addValue($parameter, $value); } diff --git a/extension/Submodules/yosymfony-parser-utils b/extension/Submodules/yosymfony-parser-utils new file mode 160000 index 000000000..00bec9a12 --- /dev/null +++ b/extension/Submodules/yosymfony-parser-utils @@ -0,0 +1 @@ +Subproject commit 00bec9a12722b21f2baf7f9db35f127e90c162c9 diff --git a/extension/composer.json b/extension/composer.json index 24251d600..0fb75a81b 100644 --- a/extension/composer.json +++ b/extension/composer.json @@ -2,15 +2,16 @@ "require": { "phpoffice/phpspreadsheet": "^1.3", "ext-json": "*", - "twig/twig": "^2.0", - "yosymfony/toml": "^0.3.3" + "twig/twig": "^2.0" }, "require-dev": { "phpunit/phpunit": "^6.5" }, "autoload": { "psr-4": { - "IMATHUZH\\Qfq\\": "Classes" + "IMATHUZH\\Qfq\\": "Classes", + "Yosymfony\\Toml\\": "Submodules/yosymfon-toml-fork/src", + "Yosymfony\\ParserUtils\\": "Submodules/yosymfony-parser-utils/src" }, "files": ["Classes/Core/Constants.php", "Classes/Core/Exception/DbException.php", -- GitLab From 957e2d916f6b1109b84b5999b45c1b2f7d24ab5e Mon Sep 17 00:00:00 2001 From: Marc Egger <marc.egger@uzh.ch> Date: Wed, 24 Jun 2020 17:05:55 +0200 Subject: [PATCH 009/195] Refs #10120 add git-submodules to "make basic" for deployment --- Makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Makefile b/Makefile index 529fc0dc9..db30956b4 100644 --- a/Makefile +++ b/Makefile @@ -64,7 +64,7 @@ bootstrap: git-submodules .npmpackages .plantuml_install .virtual_env # cd extension/Resources/Private; composer update cd extension; composer update -basic: .npmpackages .virtual_env +basic: git-submodules .npmpackages .virtual_env grunt default # IMPORTANT: install composer with no-dev flag for deployment! cd extension; composer install --no-dev --optimize-autoloader; cd vendor/phpoffice/phpspreadsheet; rm -rf .github bin docs samples .g* .s* .t* C* c* m* p* -- GitLab From d107a9869377be12261e27ac5fa4e8192459b310 Mon Sep 17 00:00:00 2001 From: Marc Egger <marc.egger@uzh.ch> Date: Mon, 29 Jun 2020 09:47:05 +0200 Subject: [PATCH 010/195] Refs #10120 test multiline strings TOML parser --- extension/Classes/Core/Form/FormAsFile.php | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/extension/Classes/Core/Form/FormAsFile.php b/extension/Classes/Core/Form/FormAsFile.php index 788ac9783..fb7df7d2f 100644 --- a/extension/Classes/Core/Form/FormAsFile.php +++ b/extension/Classes/Core/Form/FormAsFile.php @@ -66,6 +66,14 @@ class FormAsFile } $result = $tb->getTomlString(); + // Test multiline TOML + $multiline = "@line1 3abstaende \n line2"; + $multiline2 = "@line1 3abstaende + line2"; + $tb = new TomlBuilder(); + //$result = $tb->addValue('multi', $multiline) + // ->getTomlString(); + throw new \UserFormException(json_encode([ -- GitLab From 324207fb6e412d3ae6c4122f74823769130c4c0b Mon Sep 17 00:00:00 2001 From: Marc Egger <marc.egger@uzh.ch> Date: Mon, 29 Jun 2020 12:09:58 +0200 Subject: [PATCH 011/195] Refs #10120 load form from file to database, not finished --- extension/Classes/Core/Form/FormAsFile.php | 131 +++++++++++++-------- extension/Classes/Core/QuickFormQuery.php | 4 +- 2 files changed, 82 insertions(+), 53 deletions(-) diff --git a/extension/Classes/Core/Form/FormAsFile.php b/extension/Classes/Core/Form/FormAsFile.php index fb7df7d2f..5170b5ec4 100644 --- a/extension/Classes/Core/Form/FormAsFile.php +++ b/extension/Classes/Core/Form/FormAsFile.php @@ -10,21 +10,64 @@ use Yosymfony\Toml\TomlBuilder; // TODO: move to Constants.php if this file is actually used const SCHEMA_COLUMN_NAME = 'COLUMN_NAME'; const SCHEMA_COLUMN_DEFAULT = 'COLUMN_DEFAULT'; +const SYSTEM_FORM_FILE_PATH = 'fileadmin/protected/qfq/form'; class FormAsFile { - public function databaseToJson(string $formName, Database $database, string $dbNameQFQ) + + /** + * + * Reads the form file and saves in in the Form and FormElement tables + * If the form does not exist as a file but it is in the database, then create the file. + * If the form does not exist anywhere then throw exception + * + * @return mixed|null + */ + public static function FileToDatabase(string $formName) { + + // TODO: testen: form einmal aus file laden und einmal aus datenbank und inhalte vergleichen. + + $filename = SYSTEM_FORM_FILE_PATH . '/' . $formName . ".json"; + $fileContents = file_get_contents($filename); + + if ($fileContents !== false) { + $form = json_decode($fileContents, true); + // TODO: save to database <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< + } else { + // TODO: if form is in database then save to JSON + // TODO: if form not in database, throw exception + } + + /////// DEBUG ///////// + throw new \UserFormException(json_encode([ + ERROR_MESSAGE_TO_USER => 'Marc debug error', + ERROR_MESSAGE_TO_DEVELOPER => json_encode($form, JSON_PRETTY_PRINT) + ])); + /////////////////////// + + } + + /** + * + * Reads the form from the databse and saves it in the form folder as a file + * + * @param string $formName + * @param Database $database + * @param string $dbNameQFQ + * @return mixed|null + * @throws \CodeException + * @throws \DbException + * @throws \UserFormException + */ + public static function databaseToFile(string $formName, Database $database, string $dbNameQFQ) { - // TODO: create FORM_schema.JSON and FORM_ELEMENT_schema.JSON with default values - // TODO: read defaults from FORM_schema.JSON instead of database schema - // TODO: felder die default werte enthalten aus JSON loeschen - // Problem: wenn sich default wert aendert dann aendern sich auch alle bisherigen forms. - // zur Zeit ist default wert nur beim erstellen des forms relevant - // Problem: Eigentlich sollten wir jetzt default werte in einem JSON fixieren und diese dort draus lesen. - - // TODO: Form und Form Elemente laden, als JSON zurueck geben - // TODO: in QuickFormQuery einmal form normal laden und auch hiermit laden und dann resultat vergleichen + // TODO: Besprechen: php 7.3 syntax erlauben? bsp. flexible heredoc multiline string + // TODO: ? Default werte nicht in file speichern ? + // Problem: wenn sich default wert aendert dann aendern sich auch alle bisherigen forms. + // zur Zeit ist default wert nur beim erstellen des forms relevant + // Eigentlich sollten wir jetzt default werte in einem JSON fixieren und diese dort draus lesen. + // Oder wir koennten in einem form das default.json angeben woraus die default werte gelesen werden. /* get form from table */ /***********************/ @@ -34,55 +77,37 @@ class FormAsFile $form = $database->sql("SELECT * FROM `Form` AS f WHERE `f`.`$F_NAME` LIKE ? AND `f`.`deleted`='no'", ROW_EXPECT_1, [$formName], 'Form "' . $formName . '" not found or multiple forms with the same name.'); - // define $formNoDefault: array(column name => value) - $formNoDefault = $this->filterNonDefaultColumns($form, 'Form', $database, $dbNameQFQ); +// // define $formNoDefault: array(column name => value) +// $formNoDefault = $this->filterNonDefaultColumns($form, 'Form', $database, $dbNameQFQ); - // define $formElementsNoDefault: array(array(column name => value)) + // define $formElements: array(array(column name => value)) $formElements = $database->sql("SELECT * FROM `FormElement` AS `fe` WHERE `fe`.`formId` = ? ORDER BY `fe`.`ord`, `fe`.`id`", ROW_REGULAR, [$form["id"]]); - $formElementsNoDefault = array_map(function ($formElement) use ($dbNameQFQ, $database) { - return $this->filterNonDefaultColumns($formElement, 'FormElement', $database, $dbNameQFQ); - }, $formElements); +// // define $formElementsNoDefault: array(array(column name => value)) +// $formElementsNoDefault = array_map(function ($formElement) use ($dbNameQFQ, $database) { +// return $this->filterNonDefaultColumns($formElement, 'FormElement', $database, $dbNameQFQ); +// }, $formElements); - /////// DEBUG + // add Form Elements to Form + $form['FormElement'] = $formElements; - // collect output - $columnDefaults = $this->getColumnDefaults('FormElement', $database, $dbNameQFQ); + // make Json from Form with FormElements + $formJson = json_encode($form, JSON_PRETTY_PRINT); - // parse TOML - $array = Toml::parse('key = [1,2,3]'); - - // build TOML - $tb = new TomlBuilder(); - $tb->addTable('Form'); - foreach($formNoDefault as $parameter => $value) { - $tb->addValue($parameter, $value); - } - foreach ($formElementsNoDefault as $formElement) { - $tb->addArrayOfTable('FormElement'); - foreach ($formElement as $parameter => $value) { - $tb->addValue($parameter, $value); - } + // write to file + if (!is_dir(SYSTEM_FORM_FILE_PATH)) { + mkdir(SYSTEM_FORM_FILE_PATH, 0777, true); } - $result = $tb->getTomlString(); - - // Test multiline TOML - $multiline = "@line1 3abstaende \n line2"; - $multiline2 = "@line1 3abstaende - line2"; - $tb = new TomlBuilder(); - //$result = $tb->addValue('multi', $multiline) - // ->getTomlString(); - + $filename = SYSTEM_FORM_FILE_PATH . '/' . $formName . ".json"; + file_put_contents($filename, $formJson); - - throw new \UserFormException(json_encode([ - ERROR_MESSAGE_TO_USER => 'Marc debug error', - ERROR_MESSAGE_TO_DEVELOPER => $result // json_encode($array, JSON_PRETTY_PRINT) - ])); } /** + * + * Returns an associative array with the default value for each column in table $tableName + * return: array(column name => default value) + * * @param string $tableName * @param Database $database * @param string $dbNameQFQ @@ -91,7 +116,7 @@ class FormAsFile * @throws \DbException * @throws \UserFormException */ - public function getColumnDefaults(string $tableName, Database $database, string $dbNameQFQ): array + private static function getColumnDefaults(string $tableName, Database $database, string $dbNameQFQ): array { // define: $formSchema: array(array('COLUMN_NAME' => column name, 'COLUMN_DEFAULT' => column default)) $query = "SELECT " . SCHEMA_COLUMN_NAME . ", " . SCHEMA_COLUMN_DEFAULT . " FROM Information_Schema.Columns WHERE Table_Schema = '$dbNameQFQ' AND Table_Name = '$tableName'"; @@ -105,6 +130,10 @@ class FormAsFile } /** + * + * Receives a row $row from table $tableName and returns a new array with only the columns of $row which do not + * contain the default value set for that column. + * * @param array $row * @param string $tableName * @param Database $database @@ -114,9 +143,9 @@ class FormAsFile * @throws \DbException * @throws \UserFormException */ - public function filterNonDefaultColumns(array $row, string $tableName, Database $database, string $dbNameQFQ): array + private static function filterNonDefaultColumns(array $row, string $tableName, Database $database, string $dbNameQFQ): array { - $columnDefaults = $this->getColumnDefaults($tableName, $database, $dbNameQFQ); + $columnDefaults = self::getColumnDefaults($tableName, $database, $dbNameQFQ); // return $formNoDefault: array(column name => value) return array_filter($row, function ($value, $columnName) use ($columnDefaults) { diff --git a/extension/Classes/Core/QuickFormQuery.php b/extension/Classes/Core/QuickFormQuery.php index dd6ab47c9..73c4797ac 100644 --- a/extension/Classes/Core/QuickFormQuery.php +++ b/extension/Classes/Core/QuickFormQuery.php @@ -999,8 +999,8 @@ class QuickFormQuery { } ///////////////// JUST A TEST, DELETE ME! ////////////// - $formASFile = new FormAsFile(); - $formASFile->databaseToJson('form', $this->dbArray[$this->dbIndexQfq], $this->store->getVar(SYSTEM_DB_NAME_QFQ, STORE_SYSTEM)); + // FormAsFile::databaseToJson('person', $this->dbArray[$this->dbIndexQfq], $this->store->getVar(SYSTEM_DB_NAME_QFQ, STORE_SYSTEM)); + FormAsFile::FileToDatabase('person'); ///////////////// TEST FINISHED //////////////////////// // Load form -- GitLab From d3d05439f63316924cc22531329eadd3b9bb7932 Mon Sep 17 00:00:00 2001 From: Marc Egger <marc.egger@uzh.ch> Date: Mon, 29 Jun 2020 18:37:31 +0200 Subject: [PATCH 012/195] Refs #10120 load form from file to database, still not finished --- extension/Classes/Core/Form/FormAsFile.php | 115 +++++++++++++++++++-- extension/Classes/Core/Helper/SqlQuery.php | 44 ++++++++ extension/Classes/Core/QuickFormQuery.php | 4 +- extension/Classes/Core/Save.php | 17 +-- 4 files changed, 153 insertions(+), 27 deletions(-) create mode 100644 extension/Classes/Core/Helper/SqlQuery.php diff --git a/extension/Classes/Core/Form/FormAsFile.php b/extension/Classes/Core/Form/FormAsFile.php index 5170b5ec4..aad9a5a08 100644 --- a/extension/Classes/Core/Form/FormAsFile.php +++ b/extension/Classes/Core/Form/FormAsFile.php @@ -4,10 +4,14 @@ namespace IMATHUZH\Qfq\Core\Form; use IMATHUZH\Qfq\Core\Database\Database; +use IMATHUZH\Qfq\Core\Helper\SqlQuery; use Yosymfony\Toml\Toml; use Yosymfony\Toml\TomlBuilder; -// TODO: move to Constants.php if this file is actually used +// TODO: forms fuer die kein file existiert auf deleted setzen? +// TODO: move Constants to Constants.php if this file is actually used +// TODO: extract all sql queries and make them reusable +// TODO: refactor insertRecord from Save.php together with code in here into a helper function const SCHEMA_COLUMN_NAME = 'COLUMN_NAME'; const SCHEMA_COLUMN_DEFAULT = 'COLUMN_DEFAULT'; const SYSTEM_FORM_FILE_PATH = 'fileadmin/protected/qfq/form'; @@ -21,30 +25,112 @@ class FormAsFile * If the form does not exist as a file but it is in the database, then create the file. * If the form does not exist anywhere then throw exception * + * @param string $formName + * @param Database $database + * @param string $dbNameQFQ * @return mixed|null + * @throws \CodeException + * @throws \DbException + * @throws \UserFormException */ - public static function FileToDatabase(string $formName) { + public static function FileToDatabase(string $formName, Database $database, string $dbNameQFQ) { + // TODO: modification date setzen? +// if ($columnModified && !isset($newValues[COLUMN_MODIFIED])) { +// $newValues[COLUMN_MODIFIED] = date('YmdHis'); +// } // TODO: testen: form einmal aus file laden und einmal aus datenbank und inhalte vergleichen. $filename = SYSTEM_FORM_FILE_PATH . '/' . $formName . ".json"; $fileContents = file_get_contents($filename); if ($fileContents !== false) { - $form = json_decode($fileContents, true); - // TODO: save to database <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< + $formFile = json_decode($fileContents, true); + // TODO: execute update query <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< + // TODO: was wenn Form name geaendert wurde? + // TODO: dont overwrite id and formId (and name?) from JSON + // TODO: if form exists get id + + $F_NAME = F_NAME; // can't use constants in strings directly + $formDb = $database->sql("SELECT * FROM `Form` AS f WHERE `f`.`$F_NAME` LIKE ? AND `f`.`deleted`='no'", ROW_REGULAR, [$formName]); + + if (count($formDb) === 1) { + $formDb = $formDb[0]; + + // update + // list($a, $b) = self::testmultireturn($x); + + + // filter values + $formColumns = array_keys($formDb); + $newValues = array_filter($formFile, function ($value, $columnName) use ($formColumns, $formDb) { + return in_array($columnName, $formColumns) && $value !== $formDb[$columnName]; + }, ARRAY_FILTER_USE_BOTH); + + list($sql, $parameterArray) = SqlQuery::updateRecord('Form', $newValues, $formDb['id']); + + /////// DEBUG ///////// + throw new \UserFormException(json_encode([ + ERROR_MESSAGE_TO_USER => 'Marc debug error', + ERROR_MESSAGE_TO_DEVELOPER => json_encode([$sql, $parameterArray], JSON_PRETTY_PRINT) + ])); + /////////////////////// + + + } elseif (count($formFile) === 0) { + // insert + + // define: $formSchema: array(array('COLUMN_NAME' => column name)) + $query = "SELECT " . SCHEMA_COLUMN_NAME . " FROM Information_Schema.Columns WHERE Table_Schema = '$dbNameQFQ' AND Table_Name = 'Form'"; + $formSchema = $database->sql($query, ROW_REGULAR, []); + $formColumns = array_column($formSchema, SCHEMA_COLUMN_NAME); + } else { + throw new \DbException( "Expected none or one row, got count($formFile) rows", ERROR_DB_TOO_MANY_ROWS); + } + + + +// if ($recordId == 0) { +// if ($columnCreated && !isset($newValues[COLUMN_CREATED])) { +// $newValues[COLUMN_CREATED] = date('YmdHis'); +// } +// $recordId = $this->insertRecord($this->formSpec[F_TABLE_NAME], $newValues); +// +// } else { +// $this->updateRecord($this->formSpec[F_TABLE_NAME], $newValues, $recordId, $this->formSpec[F_PRIMARY_KEY]); +// } } else { // TODO: if form is in database then save to JSON // TODO: if form not in database, throw exception } - /////// DEBUG ///////// - throw new \UserFormException(json_encode([ - ERROR_MESSAGE_TO_USER => 'Marc debug error', - ERROR_MESSAGE_TO_DEVELOPER => json_encode($form, JSON_PRETTY_PRINT) - ])); - /////////////////////// + + + } + + /** + * + * + * + * @param $tableName + * @param array $values + * @return int + */ + public function insertRecord($tableName, array $values) { + + if (count($values) === 0) + return 0; // nothing to write, last insert id=0 + + $paramList = str_repeat('?, ', count($values)); + $paramList = substr($paramList, 0, strlen($paramList) - 2); + $columnList = '`' . implode('`, `', array_keys($values)) . '`'; + + $sql = "INSERT INTO `$tableName` ( " . $columnList . " ) VALUES ( " . $paramList . ' )'; + + $rc = $this->db->sql($sql, ROW_REGULAR, array_values($values)); + + return $rc; } /** @@ -76,12 +162,19 @@ class FormAsFile $F_NAME = F_NAME; // can't use constants in strings directly $form = $database->sql("SELECT * FROM `Form` AS f WHERE `f`.`$F_NAME` LIKE ? AND `f`.`deleted`='no'", ROW_EXPECT_1, [$formName], 'Form "' . $formName . '" not found or multiple forms with the same name.'); + $formId = $form['id']; + unset($form['id']); // // define $formNoDefault: array(column name => value) // $formNoDefault = $this->filterNonDefaultColumns($form, 'Form', $database, $dbNameQFQ); // define $formElements: array(array(column name => value)) - $formElements = $database->sql("SELECT * FROM `FormElement` AS `fe` WHERE `fe`.`formId` = ? ORDER BY `fe`.`ord`, `fe`.`id`", ROW_REGULAR, [$form["id"]]); + $formElements = $database->sql("SELECT * FROM `FormElement` AS `fe` WHERE `fe`.`formId` = ? ORDER BY `fe`.`ord`, `fe`.`id`", ROW_REGULAR, [$formId]); + $formElements = array_map(function ($formElement) { + unset($formElement['id']); + unset($formElement['formId']); + return $formElement; + }, $formElements); // // define $formElementsNoDefault: array(array(column name => value)) // $formElementsNoDefault = array_map(function ($formElement) use ($dbNameQFQ, $database) { diff --git a/extension/Classes/Core/Helper/SqlQuery.php b/extension/Classes/Core/Helper/SqlQuery.php new file mode 100644 index 000000000..f0a1ea1b2 --- /dev/null +++ b/extension/Classes/Core/Helper/SqlQuery.php @@ -0,0 +1,44 @@ +<?php + +namespace IMATHUZH\Qfq\Core\Helper; + +/** + * Class SqlQuery + * @package qfq + */ +class SqlQuery { + + /** + * Return prepared sql statement together with a parameter array to update the given table with the contents of an + * associative array of the form array(column => value). + * There must be at least one column to update. + * + * @param string $tableName + * @param array $values nonempty, of the form array(column => value) + * @param int $recordId + * @param string $primaryKey + * @return array|int + * @throws \CodeException + */ + public static function updateRecord(string $tableName, array $values, int $recordId, string $primaryKey = F_PRIMARY_KEY_DEFAULT) { + + if (count($values) === 0) + throw new \CodeException('No columns given to update - this should not happen.', ERROR_CODE_SHOULD_NOT_HAPPEN); + + if ($recordId === 0) { + throw new \CodeException('RecordId=0 - this is not possible for update.', ERROR_RECORDID_0_FORBIDDEN); + } + + $sql = 'UPDATE `' . $tableName . '` SET '; + + foreach ($values as $column => $value) { + + $sql .= '`' . $column . '` = ?, '; + } + + $sql = substr($sql, 0, strlen($sql) - 2) . " WHERE $primaryKey = ?"; + $values[] = $recordId; + + return array($sql, array_values($values)); + } +} diff --git a/extension/Classes/Core/QuickFormQuery.php b/extension/Classes/Core/QuickFormQuery.php index 73c4797ac..42de55acc 100644 --- a/extension/Classes/Core/QuickFormQuery.php +++ b/extension/Classes/Core/QuickFormQuery.php @@ -999,8 +999,8 @@ class QuickFormQuery { } ///////////////// JUST A TEST, DELETE ME! ////////////// - // FormAsFile::databaseToJson('person', $this->dbArray[$this->dbIndexQfq], $this->store->getVar(SYSTEM_DB_NAME_QFQ, STORE_SYSTEM)); - FormAsFile::FileToDatabase('person'); + // FormAsFile::databaseToFile('person', $this->dbArray[$this->dbIndexQfq], $this->store->getVar(SYSTEM_DB_NAME_QFQ, STORE_SYSTEM)); + FormAsFile::FileToDatabase('person', $this->dbArray[$this->dbIndexQfq], $this->store->getVar(SYSTEM_DB_NAME_QFQ, STORE_SYSTEM)); ///////////////// TEST FINISHED //////////////////////// // Load form diff --git a/extension/Classes/Core/Save.php b/extension/Classes/Core/Save.php index 886444cae..78f5941ba 100644 --- a/extension/Classes/Core/Save.php +++ b/extension/Classes/Core/Save.php @@ -16,6 +16,7 @@ use IMATHUZH\Qfq\Core\Helper\KeyValueStringParser; use IMATHUZH\Qfq\Core\Helper\Logger; use IMATHUZH\Qfq\Core\Helper\OnArray; use IMATHUZH\Qfq\Core\Helper\Sanitize; +use IMATHUZH\Qfq\Core\Helper\SqlQuery; use IMATHUZH\Qfq\Core\Helper\Support; use IMATHUZH\Qfq\Core\Store\FillStoreForm; use IMATHUZH\Qfq\Core\Store\Sip; @@ -459,21 +460,9 @@ class Save { if (count($values) === 0) return 0; // nothing to write, 0 rows affected - if ($recordId === 0) { - throw new \CodeException('RecordId=0 - this is not possible for update.', ERROR_RECORDID_0_FORBIDDEN); - } - - $sql = 'UPDATE `' . $tableName . '` SET '; + list($sql, $parameterArray) = SqlQuery::updateRecord($tableName, $values, $recordId, $primaryKey); - foreach ($values as $column => $value) { - - $sql .= '`' . $column . '` = ?, '; - } - - $sql = substr($sql, 0, strlen($sql) - 2) . " WHERE $primaryKey = ?"; - $values[] = $recordId; - - $rc = $this->db->sql($sql, ROW_REGULAR, array_values($values)); + $rc = $this->db->sql($sql, ROW_REGULAR, $parameterArray); return $rc; } -- GitLab From 31920a8c6815b7cfc4c8b295661b63cea1e35a31 Mon Sep 17 00:00:00 2001 From: Marc Egger <marc.egger@uzh.ch> Date: Tue, 30 Jun 2020 12:09:18 +0200 Subject: [PATCH 013/195] Refs #10120 update and insert form work, todo: FormElements --- extension/Classes/Core/Form/FormAsFile.php | 165 +++++++++++---------- extension/Classes/Core/Helper/SqlQuery.php | 36 +++-- extension/Classes/Core/QuickFormQuery.php | 2 +- extension/Classes/Core/Save.php | 8 +- 4 files changed, 113 insertions(+), 98 deletions(-) diff --git a/extension/Classes/Core/Form/FormAsFile.php b/extension/Classes/Core/Form/FormAsFile.php index aad9a5a08..57ce978e2 100644 --- a/extension/Classes/Core/Form/FormAsFile.php +++ b/extension/Classes/Core/Form/FormAsFile.php @@ -5,9 +5,9 @@ namespace IMATHUZH\Qfq\Core\Form; use IMATHUZH\Qfq\Core\Database\Database; use IMATHUZH\Qfq\Core\Helper\SqlQuery; -use Yosymfony\Toml\Toml; -use Yosymfony\Toml\TomlBuilder; +// TODO: Wenn form name im FormEditor geandert wurde form_old -> form_new, dann altes form_old.json loeschen +// TODO: Einfache loesung: nach jedem speichern, alle namen der DB forms und File forms laden und vergleichen // TODO: forms fuer die kein file existiert auf deleted setzen? // TODO: move Constants to Constants.php if this file is actually used // TODO: extract all sql queries and make them reusable @@ -15,6 +15,7 @@ use Yosymfony\Toml\TomlBuilder; const SCHEMA_COLUMN_NAME = 'COLUMN_NAME'; const SCHEMA_COLUMN_DEFAULT = 'COLUMN_DEFAULT'; const SYSTEM_FORM_FILE_PATH = 'fileadmin/protected/qfq/form'; +const FORM_FILE_FORM_ELEMENT = 'FormElement'; class FormAsFile { @@ -33,104 +34,99 @@ class FormAsFile * @throws \DbException * @throws \UserFormException */ - public static function FileToDatabase(string $formName, Database $database, string $dbNameQFQ) { + public static function FileToDatabase(string $formName, Database $database) { + // TODO: set Form and FormElement to deleted:'yes' if its in DB but not in file (check if there is already a deleted Form with same name?) + // TODO: check if $formName is valid as a file name // TODO: modification date setzen? // if ($columnModified && !isset($newValues[COLUMN_MODIFIED])) { // $newValues[COLUMN_MODIFIED] = date('YmdHis'); // } // TODO: testen: form einmal aus file laden und einmal aus datenbank und inhalte vergleichen. - $filename = SYSTEM_FORM_FILE_PATH . '/' . $formName . ".json"; - $fileContents = file_get_contents($filename); + $filePath = SYSTEM_FORM_FILE_PATH . '/' . $formName . ".json"; + $fileContents = file_get_contents($filePath); + if ($fileContents === false) { + // TODO: carsten fragen ob diese message nicht nur fuer Developer sein sollte + throw new \UserFormException("Form definition file not found or no permission to read file: $filePath", ERROR_IO_FILE_NOT_FOUND); + } + + $formFile = json_decode($fileContents, true); + $F_NAME = F_NAME; // can't use constants in strings directly + $TABLE_NAME_FORM = TABLE_NAME_FORM; // can't use constants in strings directly + $formDb = $database->sql("SELECT * FROM `$TABLE_NAME_FORM` AS f WHERE `f`.`$F_NAME` LIKE ? AND `f`.`deleted`='no'", ROW_REGULAR, [$formName]); - if ($fileContents !== false) { - $formFile = json_decode($fileContents, true); - // TODO: execute update query <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< + if (count($formDb) === 1) { + + // TODO: check if Form and FormElement have unique name // TODO: was wenn Form name geaendert wurde? // TODO: dont overwrite id and formId (and name?) from JSON // TODO: if form exists get id - $F_NAME = F_NAME; // can't use constants in strings directly - $formDb = $database->sql("SELECT * FROM `Form` AS f WHERE `f`.`$F_NAME` LIKE ? AND `f`.`deleted`='no'", ROW_REGULAR, [$formName]); - - if (count($formDb) === 1) { - $formDb = $formDb[0]; - - // update - // list($a, $b) = self::testmultireturn($x); + $formDb = $formDb[0]; + // filter values that have changed + // $changedValues: array(column => changed_value) + $formColumns = array_keys($formDb); + $changedValues = array_filter($formFile, function ($value, $columnName) use ($formColumns, $formDb) { + return $columnName !== 'id' && in_array($columnName, $formColumns) && $value !== $formDb[$columnName]; + }, ARRAY_FILTER_USE_BOTH); - // filter values - $formColumns = array_keys($formDb); - $newValues = array_filter($formFile, function ($value, $columnName) use ($formColumns, $formDb) { - return in_array($columnName, $formColumns) && $value !== $formDb[$columnName]; - }, ARRAY_FILTER_USE_BOTH); + // update Form table + list($sql, $parameterArray) = SqlQuery::updateRecord(TABLE_NAME_FORM, $changedValues, $formDb[F_ID]); + // TODO: uncomment sql execution + // $database->sql($sql, ROW_REGULAR, $parameterArray); - list($sql, $parameterArray) = SqlQuery::updateRecord('Form', $newValues, $formDb['id']); + // TODO: get formElements + // TODO: for each form element - /////// DEBUG ///////// - throw new \UserFormException(json_encode([ - ERROR_MESSAGE_TO_USER => 'Marc debug error', - ERROR_MESSAGE_TO_DEVELOPER => json_encode([$sql, $parameterArray], JSON_PRETTY_PRINT) - ])); - /////////////////////// + // updateFormElement($formElementId, $values); + foreach ($formFile[FORM_FILE_FORM_ELEMENT] as &$formElement) { + self::updateFormElement($formElement, $formDb[F_ID], $database); + } - } elseif (count($formFile) === 0) { - // insert + /////// DEBUG ///////// + throw new \UserFormException(json_encode([ + ERROR_MESSAGE_TO_USER => 'Marc debug error', + ERROR_MESSAGE_TO_DEVELOPER => json_encode($formFile[FORM_FILE_FORM_ELEMENT], JSON_PRETTY_PRINT) + ])); + /////////////////////// - // define: $formSchema: array(array('COLUMN_NAME' => column name)) - $query = "SELECT " . SCHEMA_COLUMN_NAME . " FROM Information_Schema.Columns WHERE Table_Schema = '$dbNameQFQ' AND Table_Name = 'Form'"; - $formSchema = $database->sql($query, ROW_REGULAR, []); - $formColumns = array_column($formSchema, SCHEMA_COLUMN_NAME); - } else { - throw new \DbException( "Expected none or one row, got count($formFile) rows", ERROR_DB_TOO_MANY_ROWS); - } + } elseif (count($formDb) === 0) { + // filter columns that exist in the table + // $insertValues: array(column => value) + $formSchema = $database->getTableDefinition(TABLE_NAME_FORM); + $formColumns = array_column($formSchema, 'Field'); + $insertValues = array_filter($formFile, function ($columnName) use ($formColumns) { + return $columnName !== 'id' && in_array($columnName, $formColumns); + }, ARRAY_FILTER_USE_KEY); + // execute insert + list($sql, $parameterArray) = SqlQuery::insertRecord(TABLE_NAME_FORM, $insertValues); + // TODO: uncomment sql execution + // $formId = $database->sql($sql, ROW_REGULAR, $parameterArray); -// if ($recordId == 0) { -// if ($columnCreated && !isset($newValues[COLUMN_CREATED])) { -// $newValues[COLUMN_CREATED] = date('YmdHis'); -// } -// $recordId = $this->insertRecord($this->formSpec[F_TABLE_NAME], $newValues); -// -// } else { -// $this->updateRecord($this->formSpec[F_TABLE_NAME], $newValues, $recordId, $this->formSpec[F_PRIMARY_KEY]); -// } } else { - // TODO: if form is in database then save to JSON - // TODO: if form not in database, throw exception + throw new \DbException( "Expected none or one row, got " . count($formDb) . " rows", ERROR_DB_TOO_MANY_ROWS); } - - - - } /** - * - * - * - * @param $tableName - * @param array $values - * @return int + * @param array $formElementFile + * @param int $formId + * @param Database $database + * @throws \CodeException + * @throws \DbException + * @throws \UserFormException */ - public function insertRecord($tableName, array $values) { - - if (count($values) === 0) - return 0; // nothing to write, last insert id=0 - - $paramList = str_repeat('?, ', count($values)); - $paramList = substr($paramList, 0, strlen($paramList) - 2); - $columnList = '`' . implode('`, `', array_keys($values)) . '`'; - - $sql = "INSERT INTO `$tableName` ( " . $columnList . " ) VALUES ( " . $paramList . ' )'; - - $rc = $this->db->sql($sql, ROW_REGULAR, array_values($values)); - - return $rc; + private static function updateFormElement(array $formElementFile,int $formId, Database $database) + { + $FE_NAME = FE_NAME; // can't use constants in strings directly + $FE_FORM_ID = FE_FORM_ID; // can't use constants in strings directly + $TABLE_NAME_FORM_ELEMENT = TABLE_NAME_FORM_ELEMENT; // can't use constants in strings directly + $formElementDb = $database->sql("SELECT * FROM `$TABLE_NAME_FORM_ELEMENT` AS fe WHERE `fe`.`$FE_FORM_ID`=? AND `fe`.`$FE_NAME` LIKE ? AND `fe`.`deleted`='no'", ROW_REGULAR, [$formId, $formElementFile[FE_NAME]]); } /** @@ -148,6 +144,8 @@ class FormAsFile public static function databaseToFile(string $formName, Database $database, string $dbNameQFQ) { + // TODO: check if $formName is valid as a file name + // TODO: check if Form and FormElement have unique name // TODO: Besprechen: php 7.3 syntax erlauben? bsp. flexible heredoc multiline string // TODO: ? Default werte nicht in file speichern ? // Problem: wenn sich default wert aendert dann aendern sich auch alle bisherigen forms. @@ -160,29 +158,31 @@ class FormAsFile // define $form: array(column name => value) $F_NAME = F_NAME; // can't use constants in strings directly - $form = $database->sql("SELECT * FROM `Form` AS f WHERE `f`.`$F_NAME` LIKE ? AND `f`.`deleted`='no'", ROW_EXPECT_1, + $TABLE_NAME_FORM = TABLE_NAME_FORM; // can't use constants in strings directly + $form = $database->sql("SELECT * FROM `$TABLE_NAME_FORM` AS f WHERE `f`.`$F_NAME` LIKE ? AND `f`.`deleted`='no'", ROW_EXPECT_1, [$formName], 'Form "' . $formName . '" not found or multiple forms with the same name.'); - $formId = $form['id']; - unset($form['id']); + $formId = $form[F_ID]; + unset($form[F_ID]); // // define $formNoDefault: array(column name => value) -// $formNoDefault = $this->filterNonDefaultColumns($form, 'Form', $database, $dbNameQFQ); +// $formNoDefault = $this->filterNonDefaultColumns($form, TABLE_NAME_FORM, $database, $dbNameQFQ); // define $formElements: array(array(column name => value)) - $formElements = $database->sql("SELECT * FROM `FormElement` AS `fe` WHERE `fe`.`formId` = ? ORDER BY `fe`.`ord`, `fe`.`id`", ROW_REGULAR, [$formId]); + $TABLE_NAME_FORM_ELEMENT = TABLE_NAME_FORM_ELEMENT; // can't use constants in strings directly + $formElements = $database->sql("SELECT * FROM `$TABLE_NAME_FORM_ELEMENT` AS `fe` WHERE `fe`.`formId` = ? ORDER BY `fe`.`ord`, `fe`.`id`", ROW_REGULAR, [$formId]); $formElements = array_map(function ($formElement) { - unset($formElement['id']); - unset($formElement['formId']); + unset($formElement[FE_ID]); + unset($formElement[FE_FORM_ID]); return $formElement; }, $formElements); // // define $formElementsNoDefault: array(array(column name => value)) // $formElementsNoDefault = array_map(function ($formElement) use ($dbNameQFQ, $database) { -// return $this->filterNonDefaultColumns($formElement, 'FormElement', $database, $dbNameQFQ); +// return $this->filterNonDefaultColumns($formElement, TABLE_NAME_FORM_ELEMENT, $database, $dbNameQFQ); // }, $formElements); // add Form Elements to Form - $form['FormElement'] = $formElements; + $form[FORM_FILE_FORM_ELEMENT] = $formElements; // make Json from Form with FormElements $formJson = json_encode($form, JSON_PRETTY_PRINT); @@ -192,6 +192,7 @@ class FormAsFile mkdir(SYSTEM_FORM_FILE_PATH, 0777, true); } $filename = SYSTEM_FORM_FILE_PATH . '/' . $formName . ".json"; + // TODO: Throw exception if current user has no write permissions on file file_put_contents($filename, $formJson); } @@ -212,6 +213,8 @@ class FormAsFile private static function getColumnDefaults(string $tableName, Database $database, string $dbNameQFQ): array { // define: $formSchema: array(array('COLUMN_NAME' => column name, 'COLUMN_DEFAULT' => column default)) + + // TODO: replace following using $formSchema = $database->getTableDefinition(TABLE_NAME_FORM_ELEMENT); $query = "SELECT " . SCHEMA_COLUMN_NAME . ", " . SCHEMA_COLUMN_DEFAULT . " FROM Information_Schema.Columns WHERE Table_Schema = '$dbNameQFQ' AND Table_Name = '$tableName'"; $formSchema = $database->sql($query, ROW_REGULAR, []); diff --git a/extension/Classes/Core/Helper/SqlQuery.php b/extension/Classes/Core/Helper/SqlQuery.php index f0a1ea1b2..0773ef1e8 100644 --- a/extension/Classes/Core/Helper/SqlQuery.php +++ b/extension/Classes/Core/Helper/SqlQuery.php @@ -9,8 +9,8 @@ namespace IMATHUZH\Qfq\Core\Helper; class SqlQuery { /** - * Return prepared sql statement together with a parameter array to update the given table with the contents of an - * associative array of the form array(column => value). + * Create SQL query that updates the given table with the contents of an associative array. + * Returns prepared UPDATE statement together with a parameter array. * There must be at least one column to update. * * @param string $tableName @@ -20,25 +20,41 @@ class SqlQuery { * @return array|int * @throws \CodeException */ - public static function updateRecord(string $tableName, array $values, int $recordId, string $primaryKey = F_PRIMARY_KEY_DEFAULT) { - + public static function updateRecord(string $tableName, array $values, int $recordId, string $primaryKey = F_PRIMARY_KEY_DEFAULT) + { if (count($values) === 0) throw new \CodeException('No columns given to update - this should not happen.', ERROR_CODE_SHOULD_NOT_HAPPEN); - if ($recordId === 0) { throw new \CodeException('RecordId=0 - this is not possible for update.', ERROR_RECORDID_0_FORBIDDEN); } - $sql = 'UPDATE `' . $tableName . '` SET '; - foreach ($values as $column => $value) { - $sql .= '`' . $column . '` = ?, '; } - $sql = substr($sql, 0, strlen($sql) - 2) . " WHERE $primaryKey = ?"; $values[] = $recordId; - return array($sql, array_values($values)); } + + /** + * Create SQL query which inserts the values of the given associative arry into the given table. + * Returns prepared INSERT statement together with a parameter array. + * There must be at least one value given. + * + * @param $tableName + * @param array $values array(column => value) + * @return array + * @throws \CodeException + */ + public static function insertRecord($tableName, array $values): array + { + if (count($values) === 0) + throw new \CodeException('No columns given to insert - this should not happen.', ERROR_CODE_SHOULD_NOT_HAPPEN); + $paramList = str_repeat('?, ', count($values)); + $paramList = substr($paramList, 0, strlen($paramList) - 2); + $columnList = '`' . implode('`, `', array_keys($values)) . '`'; + $sql = "INSERT INTO `$tableName` ( " . $columnList . " ) VALUES ( " . $paramList . ' )'; + $parameterArray = array_values($values); + return array($sql, $parameterArray); + } } diff --git a/extension/Classes/Core/QuickFormQuery.php b/extension/Classes/Core/QuickFormQuery.php index 42de55acc..e3837ee59 100644 --- a/extension/Classes/Core/QuickFormQuery.php +++ b/extension/Classes/Core/QuickFormQuery.php @@ -1000,7 +1000,7 @@ class QuickFormQuery { ///////////////// JUST A TEST, DELETE ME! ////////////// // FormAsFile::databaseToFile('person', $this->dbArray[$this->dbIndexQfq], $this->store->getVar(SYSTEM_DB_NAME_QFQ, STORE_SYSTEM)); - FormAsFile::FileToDatabase('person', $this->dbArray[$this->dbIndexQfq], $this->store->getVar(SYSTEM_DB_NAME_QFQ, STORE_SYSTEM)); + FormAsFile::FileToDatabase('person', $this->dbArray[$this->dbIndexQfq]); ///////////////// TEST FINISHED //////////////////////// // Load form diff --git a/extension/Classes/Core/Save.php b/extension/Classes/Core/Save.php index 78f5941ba..a89270773 100644 --- a/extension/Classes/Core/Save.php +++ b/extension/Classes/Core/Save.php @@ -433,13 +433,9 @@ class Save { if (count($values) === 0) return 0; // nothing to write, last insert id=0 - $paramList = str_repeat('?, ', count($values)); - $paramList = substr($paramList, 0, strlen($paramList) - 2); - $columnList = '`' . implode('`, `', array_keys($values)) . '`'; + list($sql, $parameterArray) = SqlQuery::insertRecord($tableName, $values); - $sql = "INSERT INTO `$tableName` ( " . $columnList . " ) VALUES ( " . $paramList . ' )'; - - $rc = $this->db->sql($sql, ROW_REGULAR, array_values($values)); + $rc = $this->db->sql($sql, ROW_REGULAR, $parameterArray); return $rc; } -- GitLab From b72e479be2cac4fa0d7a1909e33cc3e9c252a3c4 Mon Sep 17 00:00:00 2001 From: Marc Egger <marc.egger@uzh.ch> Date: Tue, 30 Jun 2020 18:06:15 +0200 Subject: [PATCH 014/195] Refs #10120 update and insert formElement work, todo: Delete Form/FormElement --- extension/Classes/Core/Form/FormAsFile.php | 192 ++++++++++++++------- 1 file changed, 131 insertions(+), 61 deletions(-) diff --git a/extension/Classes/Core/Form/FormAsFile.php b/extension/Classes/Core/Form/FormAsFile.php index 57ce978e2..1f8e0cf47 100644 --- a/extension/Classes/Core/Form/FormAsFile.php +++ b/extension/Classes/Core/Form/FormAsFile.php @@ -28,105 +28,184 @@ class FormAsFile * * @param string $formName * @param Database $database - * @param string $dbNameQFQ - * @return mixed|null * @throws \CodeException * @throws \DbException * @throws \UserFormException */ - public static function FileToDatabase(string $formName, Database $database) { + public static function FileToDatabase(string $formName, Database $database): void + { + // TODO: check if $formName is valid as a file name <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< NEXT // TODO: set Form and FormElement to deleted:'yes' if its in DB but not in file (check if there is already a deleted Form with same name?) - // TODO: check if $formName is valid as a file name + // TODO: Talk with carsten about creating a deleted form every time the file is renamed // TODO: modification date setzen? // if ($columnModified && !isset($newValues[COLUMN_MODIFIED])) { // $newValues[COLUMN_MODIFIED] = date('YmdHis'); // } // TODO: testen: form einmal aus file laden und einmal aus datenbank und inhalte vergleichen. + // get Form from file $filePath = SYSTEM_FORM_FILE_PATH . '/' . $formName . ".json"; $fileContents = file_get_contents($filePath); if ($fileContents === false) { - // TODO: carsten fragen ob diese message nicht nur fuer Developer sein sollte - throw new \UserFormException("Form definition file not found or no permission to read file: $filePath", ERROR_IO_FILE_NOT_FOUND); + // TODO: carsten fragen ob diese messages nicht nur fuer Developer sein sollte + throw new \UserFormException("Form definition file not found or no permission to read file: $filePath" + , ERROR_IO_FILE_NOT_FOUND); } - $formFile = json_decode($fileContents, true); + // get Form from database if it exists + $formFromFile = json_decode($fileContents, true); $F_NAME = F_NAME; // can't use constants in strings directly $TABLE_NAME_FORM = TABLE_NAME_FORM; // can't use constants in strings directly - $formDb = $database->sql("SELECT * FROM `$TABLE_NAME_FORM` AS f WHERE `f`.`$F_NAME` LIKE ? AND `f`.`deleted`='no'", ROW_REGULAR, [$formName]); - - if (count($formDb) === 1) { + $formFromDb = $database->sql("SELECT * FROM `$TABLE_NAME_FORM` AS f WHERE `f`.`$F_NAME` LIKE ? AND `f`.`deleted`='no'", ROW_REGULAR, [$formName]); - // TODO: check if Form and FormElement have unique name - // TODO: was wenn Form name geaendert wurde? - // TODO: dont overwrite id and formId (and name?) from JSON - // TODO: if form exists get id + // update or insert Form + if (count($formFromDb) === 1) { + /* update Form */ - $formDb = $formDb[0]; + $formFromDb = $formFromDb[0]; - // filter values that have changed - // $changedValues: array(column => changed_value) - $formColumns = array_keys($formDb); - $changedValues = array_filter($formFile, function ($value, $columnName) use ($formColumns, $formDb) { - return $columnName !== 'id' && in_array($columnName, $formColumns) && $value !== $formDb[$columnName]; - }, ARRAY_FILTER_USE_BOTH); + // filter allowed columns which have changed + $formColumns = array_keys($formFromDb); + $changedValues = array_filter($formFromFile, function ($value, $columnName) use ($formColumns, $formFromDb) { + return !in_array($columnName, [F_ID, F_NAME]) + && in_array($columnName, $formColumns) + && $value !== $formFromDb[$columnName]; + }, ARRAY_FILTER_USE_BOTH); // array(column => changed_value) // update Form table - list($sql, $parameterArray) = SqlQuery::updateRecord(TABLE_NAME_FORM, $changedValues, $formDb[F_ID]); - // TODO: uncomment sql execution - // $database->sql($sql, ROW_REGULAR, $parameterArray); - - // TODO: get formElements - // TODO: for each form element - - // updateFormElement($formElementId, $values); + if (count($changedValues) > 0) { + list($sql, $parameterArray) = SqlQuery::updateRecord(TABLE_NAME_FORM, $changedValues, $formFromDb[F_ID]); + // TODO: uncomment sql execution: +// $database->sql($sql, ROW_REGULAR, $parameterArray); + } - foreach ($formFile[FORM_FILE_FORM_ELEMENT] as &$formElement) { - self::updateFormElement($formElement, $formDb[F_ID], $database); + // update FormElements + foreach ($formFromFile[FORM_FILE_FORM_ELEMENT] as &$formElementFromFile) { + self::updateOrInsertFormElement($formElementFromFile, $formFromDb[F_ID], $database); } - /////// DEBUG ///////// - throw new \UserFormException(json_encode([ - ERROR_MESSAGE_TO_USER => 'Marc debug error', - ERROR_MESSAGE_TO_DEVELOPER => json_encode($formFile[FORM_FILE_FORM_ELEMENT], JSON_PRETTY_PRINT) - ])); - /////////////////////// + // Todo: remove FormElements that are not in file - } elseif (count($formDb) === 0) { + } elseif (count($formFromDb) === 0) { + /* insert Form */ - // filter columns that exist in the table - // $insertValues: array(column => value) + // filter allowed columns $formSchema = $database->getTableDefinition(TABLE_NAME_FORM); $formColumns = array_column($formSchema, 'Field'); - $insertValues = array_filter($formFile, function ($columnName) use ($formColumns) { - return $columnName !== 'id' && in_array($columnName, $formColumns); - }, ARRAY_FILTER_USE_KEY); + $insertValues = array_filter($formFromFile, function ($columnName) use ($formColumns) { + return $columnName !== F_ID && in_array($columnName, $formColumns); + }, ARRAY_FILTER_USE_KEY); // array(column => value) // execute insert + $insertValues[$F_NAME] = $formName; list($sql, $parameterArray) = SqlQuery::insertRecord(TABLE_NAME_FORM, $insertValues); - // TODO: uncomment sql execution - // $formId = $database->sql($sql, ROW_REGULAR, $parameterArray); + // TODO: uncomment sql execution: +// $formId = $database->sql($sql, ROW_REGULAR, $parameterArray); + + // insert FormElements + foreach ($formFromFile[FORM_FILE_FORM_ELEMENT] as &$formElementFromFile) { + self::insertFormElement($formElementFromFile, $formId, $database); + } } else { - throw new \DbException( "Expected none or one row, got " . count($formDb) . " rows", ERROR_DB_TOO_MANY_ROWS); + throw new \DbException( "Expected none or one row, got " . count($formFromDb) + . " rows. Are there multiple forms with the name '$formName' ?", ERROR_DB_TOO_MANY_ROWS); } } /** - * @param array $formElementFile + * @param array $values * @param int $formId * @param Database $database * @throws \CodeException * @throws \DbException * @throws \UserFormException */ - private static function updateFormElement(array $formElementFile,int $formId, Database $database) + private static function updateOrInsertFormElement(array $values, int $formId, Database $database): void { + if (!(array_key_exists(FE_NAME, $values) && $values[FE_NAME] !=='')) { + throw new \UserFormException("Trying to update or insert a FormElement without name to Form with id: $formId" + , ERROR_CODE_SHOULD_NOT_HAPPEN); + } + + // get FormElement from database if it exists $FE_NAME = FE_NAME; // can't use constants in strings directly $FE_FORM_ID = FE_FORM_ID; // can't use constants in strings directly $TABLE_NAME_FORM_ELEMENT = TABLE_NAME_FORM_ELEMENT; // can't use constants in strings directly - $formElementDb = $database->sql("SELECT * FROM `$TABLE_NAME_FORM_ELEMENT` AS fe WHERE `fe`.`$FE_FORM_ID`=? AND `fe`.`$FE_NAME` LIKE ? AND `fe`.`deleted`='no'", ROW_REGULAR, [$formId, $formElementFile[FE_NAME]]); + $formElementDb = $database->sql("SELECT * FROM `$TABLE_NAME_FORM_ELEMENT` AS fe WHERE `fe`.`$FE_FORM_ID`=? AND `fe`.`$FE_NAME` LIKE ? AND `fe`.`deleted`='no'" + , ROW_REGULAR, [$formId, $values[FE_NAME]]); + + // update or insert FormElement + if (count($formElementDb) === 1) { + /* update FormElement */ + + $formElementDb = $formElementDb[0]; + + // filter allowed columns which have changed + $formElementColumns = array_keys($formElementDb); + $changedValues = array_filter($values, function ($value, $columnName) use ($formElementColumns, $formElementDb) { + return !in_array($columnName,[FE_ID, FE_FORM_ID]) + && in_array($columnName, $formElementColumns) + && $value !== $formElementDb[$columnName]; + }, ARRAY_FILTER_USE_BOTH); // array(column => changed_value) + + // update FormElement table + if (count($changedValues) > 0) { + list($sql, $parameterArray) = SqlQuery::updateRecord(TABLE_NAME_FORM_ELEMENT, $changedValues, $formElementDb[FE_ID]); + // TODO: uncomment sql execution: +// $database->sql($sql, ROW_REGULAR, $parameterArray); + } + + } elseif (count($formElementDb) === 0) { + /* insert FormElement */ + + self::insertFormElement($values, $formId, $database); + + } else { + throw new \DbException( "Expected none or one row, got " . count($formElementDb) + . " rows. Are there multiple FormElements with the same name in Form with id $formId ?" + , ERROR_DB_TOO_MANY_ROWS); + } + + // TODO: next + // TODO: check if values have been changed + } + + /** + * @param array $values + * @param int $formId + * @param Database $database + * @throws \CodeException + * @throws \DbException + * @throws \UserFormException + */ + private static function insertFormElement(array $values, int $formId, Database $database): void + { + if (!(array_key_exists(FE_NAME, $values) && $values[FE_NAME] !=='')) { + throw new \UserFormException("Trying to insert a FormElement without name to Form with id: $formId" + , ERROR_CODE_SHOULD_NOT_HAPPEN); + } + + // filter allowed columns + $formElementSchema = $database->getTableDefinition(TABLE_NAME_FORM_ELEMENT); + $formElementColumns = array_column($formElementSchema, 'Field'); + $insertValues = array_filter($values, function ($columnName) use ($formElementColumns) { + return !in_array($columnName, [FE_ID, FE_FORM_ID]) && in_array($columnName, $formElementColumns); + }, ARRAY_FILTER_USE_KEY); // array(column => value) + + // execute insert ($insertValues will at least contain 'name') + $insertValues[FE_FORM_ID] = $formId; + list($sql, $parameterArray) = SqlQuery::insertRecord(TABLE_NAME_FORM_ELEMENT, $insertValues); + // TODO: uncomment sql execution: +// $database->sql($sql, ROW_REGULAR, $parameterArray); + + /////// DEBUG ///////// + throw new \UserFormException(json_encode([ + ERROR_MESSAGE_TO_USER => 'Marc debug error', + ERROR_MESSAGE_TO_DEVELOPER => json_encode([$sql, $parameterArray], JSON_PRETTY_PRINT) + ])); + /////////////////////// } /** @@ -136,12 +215,11 @@ class FormAsFile * @param string $formName * @param Database $database * @param string $dbNameQFQ - * @return mixed|null * @throws \CodeException * @throws \DbException * @throws \UserFormException */ - public static function databaseToFile(string $formName, Database $database, string $dbNameQFQ) + public static function databaseToFile(string $formName, Database $database): void { // TODO: check if $formName is valid as a file name @@ -163,9 +241,7 @@ class FormAsFile [$formName], 'Form "' . $formName . '" not found or multiple forms with the same name.'); $formId = $form[F_ID]; unset($form[F_ID]); - -// // define $formNoDefault: array(column name => value) -// $formNoDefault = $this->filterNonDefaultColumns($form, TABLE_NAME_FORM, $database, $dbNameQFQ); + unset($form[$F_NAME]); // define $formElements: array(array(column name => value)) $TABLE_NAME_FORM_ELEMENT = TABLE_NAME_FORM_ELEMENT; // can't use constants in strings directly @@ -176,11 +252,6 @@ class FormAsFile return $formElement; }, $formElements); -// // define $formElementsNoDefault: array(array(column name => value)) -// $formElementsNoDefault = array_map(function ($formElement) use ($dbNameQFQ, $database) { -// return $this->filterNonDefaultColumns($formElement, TABLE_NAME_FORM_ELEMENT, $database, $dbNameQFQ); -// }, $formElements); - // add Form Elements to Form $form[FORM_FILE_FORM_ELEMENT] = $formElements; @@ -205,7 +276,7 @@ class FormAsFile * @param string $tableName * @param Database $database * @param string $dbNameQFQ - * @return mixed|null + * @return array array(column name => default value) * @throws \CodeException * @throws \DbException * @throws \UserFormException @@ -218,7 +289,6 @@ class FormAsFile $query = "SELECT " . SCHEMA_COLUMN_NAME . ", " . SCHEMA_COLUMN_DEFAULT . " FROM Information_Schema.Columns WHERE Table_Schema = '$dbNameQFQ' AND Table_Name = '$tableName'"; $formSchema = $database->sql($query, ROW_REGULAR, []); - // return: array(column name => default value) return array_reduce($formSchema, function ($result, $column) { $result[$column[SCHEMA_COLUMN_NAME]] = $column[SCHEMA_COLUMN_DEFAULT]; return $result; -- GitLab From c16c82c7065d6eef21116af461f0e4895bed7f08 Mon Sep 17 00:00:00 2001 From: Marc Egger <marc.egger@uzh.ch> Date: Mon, 6 Jul 2020 12:05:39 +0200 Subject: [PATCH 015/195] Refs #10120 remove form update. delete and insert always. --- extension/Classes/Core/Constants.php | 3 + extension/Classes/Core/Form/FormAsFile.php | 264 +++++++++++-------- extension/Classes/Core/Helper/HelperFile.php | 10 + 3 files changed, 160 insertions(+), 117 deletions(-) diff --git a/extension/Classes/Core/Constants.php b/extension/Classes/Core/Constants.php index 400c65ead..ecb1e851a 100644 --- a/extension/Classes/Core/Constants.php +++ b/extension/Classes/Core/Constants.php @@ -363,6 +363,7 @@ const ERROR_DND_EMPTY_REORDER_SQL = 2700; // Form const ERROR_FORM_RESERVED_NAME = 2800; +const ERROR_FORM_INVALID_NAME = 2801; // Import (Excel, ODS, ...) const ERROR_IMPORT_MISSING_EXPLICIT_TYPE = 2900; @@ -931,6 +932,7 @@ const GLYPH_ICON_COPY = 'glyphicon-copy'; // FORM columns: real const F_ID = 'id'; const F_NAME = 'name'; +const F_DELETED = 'deleted'; const F_TITLE = 'title'; const F_TABLE_NAME = 'tableName'; const F_PRIMARY_KEY = 'primaryKey'; @@ -944,6 +946,7 @@ const F_DIRTY_MODE = 'dirtyMode'; const F_NOTE_INTERNAL = 'noteInternal'; const F_MULTI_SQL = 'multiSql'; const F_MULTI_COL_ID = 'id'; +const F_FILE_STATS = 'fileStats'; const F_SUBMIT_BUTTON_TEXT = 'submitButtonText'; const F_BUTTON_ON_CHANGE_CLASS = 'buttonOnChangeClass'; diff --git a/extension/Classes/Core/Form/FormAsFile.php b/extension/Classes/Core/Form/FormAsFile.php index 1f8e0cf47..16c4e659a 100644 --- a/extension/Classes/Core/Form/FormAsFile.php +++ b/extension/Classes/Core/Form/FormAsFile.php @@ -4,18 +4,27 @@ namespace IMATHUZH\Qfq\Core\Form; use IMATHUZH\Qfq\Core\Database\Database; +use IMATHUZH\Qfq\Core\Helper\HelperFile; use IMATHUZH\Qfq\Core\Helper\SqlQuery; -// TODO: Wenn form name im FormEditor geandert wurde form_old -> form_new, dann altes form_old.json loeschen -// TODO: Einfache loesung: nach jedem speichern, alle namen der DB forms und File forms laden und vergleichen -// TODO: forms fuer die kein file existiert auf deleted setzen? -// TODO: move Constants to Constants.php if this file is actually used -// TODO: extract all sql queries and make them reusable -// TODO: refactor insertRecord from Save.php together with code in here into a helper function +/** + * + * + */ + +// TODO: Carsten Fragen: Form aus DB loeschen wenn file nicht mehr da? falls ja, wann? Bevor form geladen wird, wird file sowieso zuerst gecheckt. +// TODO: Form Editor form name einschraenken auf valide file names +// TODO: Container zuordnenm container elemente muessen einen eindeutigen namen haben + +// TODO: BEFOORE PRUDUCTION + // TODO: add fileStats column to Form schema + // TODO: move Constants to Constants.php if this file is actually used + // TODO: extract all sql queries and make them reusable + // TODO: testen: form einmal aus file laden und einmal aus datenbank und inhalte vergleichen. const SCHEMA_COLUMN_NAME = 'COLUMN_NAME'; const SCHEMA_COLUMN_DEFAULT = 'COLUMN_DEFAULT'; const SYSTEM_FORM_FILE_PATH = 'fileadmin/protected/qfq/form'; -const FORM_FILE_FORM_ELEMENT = 'FormElement'; +const FORM_FILE_FORM_ELEMENT = 'FormElement'; // Key for FormElements array saved in Form File class FormAsFile { @@ -23,95 +32,106 @@ class FormAsFile /** * * Reads the form file and saves in in the Form and FormElement tables - * If the form does not exist as a file but it is in the database, then create the file. - * If the form does not exist anywhere then throw exception + * + * File Laden (parameter: import string (importStamp) der in form gespeichert wird) + * 1) Timestamp, Dateigroesse, Inode mittels FS_stat von file auslesen (stat() https://www.php.net/manual/en/function.stat.php, HelperFile::getFileStats (FS stat), fileinode https://www.php.net/manual/en/function.fileinode.php) + * 2) import string vergleichen mit mitgegebenem + * 3) Falls string sich nicht geandert -> return + * 4) Form aus DB loeschen mit FE elements + * 5) File laden + * 6) columns filtern (Schema Columns - id - formId) + * 7) neun importStamp dem column array hinzufuegen + * 8) INSERT Form und FormElement * * @param string $formName + * @param string $fileStats * @param Database $database + * @return bool returns false if there were no changes * @throws \CodeException * @throws \DbException * @throws \UserFormException */ - public static function FileToDatabase(string $formName, Database $database): void + public static function FileToDatabase(string $formName, string $fileStats, Database $database): bool { - // TODO: check if $formName is valid as a file name <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< NEXT - // TODO: set Form and FormElement to deleted:'yes' if its in DB but not in file (check if there is already a deleted Form with same name?) - // TODO: Talk with carsten about creating a deleted form every time the file is renamed - // TODO: modification date setzen? -// if ($columnModified && !isset($newValues[COLUMN_MODIFIED])) { -// $newValues[COLUMN_MODIFIED] = date('YmdHis'); -// } - // TODO: testen: form einmal aus file laden und einmal aus datenbank und inhalte vergleichen. - - // get Form from file + // Get file stats and exit if they have not changed + self::CheckFormNameValid($formName); $filePath = SYSTEM_FORM_FILE_PATH . '/' . $formName . ".json"; + $fileReadException = new \UserFormException(json_encode([ + ERROR_MESSAGE_TO_USER => 'Form not found.', + ERROR_MESSAGE_TO_DEVELOPER => "Form definition file not found or no permission to read file: '$filePath'"]), + ERROR_FORM_NOT_FOUND); + if(!file_exists($filePath)) { + throw $fileReadException; + } + $stat = stat($filePath); + if ($stat === false) { + throw $fileReadException; + } + $fileStatsNew = json_encode([ + 'modified' => $stat['mtime'], + 'size' => $stat['size'], + 'inode' => $stat['ino'] + ]); + if ($fileStatsNew === $fileStats) { + return false; + } + + // Read form file $fileContents = file_get_contents($filePath); if ($fileContents === false) { - // TODO: carsten fragen ob diese messages nicht nur fuer Developer sein sollte - throw new \UserFormException("Form definition file not found or no permission to read file: $filePath" - , ERROR_IO_FILE_NOT_FOUND); + throw $fileReadException; } - - // get Form from database if it exists $formFromFile = json_decode($fileContents, true); + + // Delete old form from DB if exists + $F_ID = F_ID; // can't use constants in strings directly $F_NAME = F_NAME; // can't use constants in strings directly $TABLE_NAME_FORM = TABLE_NAME_FORM; // can't use constants in strings directly - $formFromDb = $database->sql("SELECT * FROM `$TABLE_NAME_FORM` AS f WHERE `f`.`$F_NAME` LIKE ? AND `f`.`deleted`='no'", ROW_REGULAR, [$formName]); - - // update or insert Form + $formFromDb = $database->sql("SELECT `$F_ID` FROM `$TABLE_NAME_FORM` AS f WHERE `f`.`$F_NAME` LIKE ? AND `f`.`deleted`='no'", ROW_REGULAR, [$formName]); if (count($formFromDb) === 1) { - /* update Form */ - - $formFromDb = $formFromDb[0]; - - // filter allowed columns which have changed - $formColumns = array_keys($formFromDb); - $changedValues = array_filter($formFromFile, function ($value, $columnName) use ($formColumns, $formFromDb) { - return !in_array($columnName, [F_ID, F_NAME]) - && in_array($columnName, $formColumns) - && $value !== $formFromDb[$columnName]; - }, ARRAY_FILTER_USE_BOTH); // array(column => changed_value) - - // update Form table - if (count($changedValues) > 0) { - list($sql, $parameterArray) = SqlQuery::updateRecord(TABLE_NAME_FORM, $changedValues, $formFromDb[F_ID]); - // TODO: uncomment sql execution: -// $database->sql($sql, ROW_REGULAR, $parameterArray); - } - - // update FormElements - foreach ($formFromFile[FORM_FILE_FORM_ELEMENT] as &$formElementFromFile) { - self::updateOrInsertFormElement($formElementFromFile, $formFromDb[F_ID], $database); - } - - // Todo: remove FormElements that are not in file + $formId = $formFromDb[0][$F_ID]; + // TODO: uncomment sql delete +// $database->sql("DELETE FROM `$TABLE_NAME_FORM` WHERE `$F_ID`=? LIMIT 1", ROW_REGULAR, [$formId]); + $TABLE_NAME_FORM_ELEMENT = TABLE_NAME_FORM_ELEMENT; // can't use constants in strings directly + $FE_FORM_ID = FE_FORM_ID; // can't use constants in strings directly + // TODO: uncomment sql delete +// $database->sql("DELETE FROM `$TABLE_NAME_FORM_ELEMENT` WHERE `$FE_FORM_ID`=?", ROW_REGULAR, [$formId]); + } elseif (count($formFromDb) > 1) { + throw new \DbException(json_encode([ + ERROR_MESSAGE_TO_USER => 'Form Name Error.', + ERROR_MESSAGE_TO_DEVELOPER => "Expected none or one row, got " . count($formFromDb) . "rows. Are there multiple forms with the name '$formName' ?"]), + ERROR_DB_TOO_MANY_ROWS); + } - } elseif (count($formFromDb) === 0) { - /* insert Form */ + /* Insert form from file to DB */ - // filter allowed columns - $formSchema = $database->getTableDefinition(TABLE_NAME_FORM); - $formColumns = array_column($formSchema, 'Field'); - $insertValues = array_filter($formFromFile, function ($columnName) use ($formColumns) { - return $columnName !== F_ID && in_array($columnName, $formColumns); - }, ARRAY_FILTER_USE_KEY); // array(column => value) + // filter allowed form columns + $formSchema = $database->getTableDefinition(TABLE_NAME_FORM); + $formColumns = array_column($formSchema, 'Field'); + $insertValues = array_filter($formFromFile, function ($columnName) use ($formColumns) { + return $columnName !== F_ID && in_array($columnName, $formColumns); + }, ARRAY_FILTER_USE_KEY); // array(column => value) - // execute insert - $insertValues[$F_NAME] = $formName; - list($sql, $parameterArray) = SqlQuery::insertRecord(TABLE_NAME_FORM, $insertValues); - // TODO: uncomment sql execution: + // execute insert + $insertValues[$F_NAME] = $formName; + $insertValues[F_FILE_STATS] = $fileStatsNew; + list($sql, $parameterArray) = SqlQuery::insertRecord(TABLE_NAME_FORM, $insertValues); + // TODO: uncomment sql execution: // $formId = $database->sql($sql, ROW_REGULAR, $parameterArray); - // insert FormElements - foreach ($formFromFile[FORM_FILE_FORM_ELEMENT] as &$formElementFromFile) { - self::insertFormElement($formElementFromFile, $formId, $database); - } - - } else { - throw new \DbException( "Expected none or one row, got " . count($formFromDb) - . " rows. Are there multiple forms with the name '$formName' ?", ERROR_DB_TOO_MANY_ROWS); + // insert FormElements + foreach ($formFromFile[FORM_FILE_FORM_ELEMENT] as &$formElementFromFile) { + self::insertFormElement($formElementFromFile, $formId, $database); } + + /////// DEBUG ///////// + throw new \UserFormException(json_encode([ + ERROR_MESSAGE_TO_USER => 'Marc debug error', + ERROR_MESSAGE_TO_DEVELOPER => json_encode([], JSON_PRETTY_PRINT) + ])); + /////////////////////// + return true; } /** @@ -164,12 +184,9 @@ class FormAsFile } else { throw new \DbException( "Expected none or one row, got " . count($formElementDb) - . " rows. Are there multiple FormElements with the same name in Form with id $formId ?" - , ERROR_DB_TOO_MANY_ROWS); + . " rows. Are there multiple FormElements with the same name in Form with id $formId ?", + ERROR_DB_TOO_MANY_ROWS); } - - // TODO: next - // TODO: check if values have been changed } /** @@ -182,12 +199,15 @@ class FormAsFile */ private static function insertFormElement(array $values, int $formId, Database $database): void { + // check if name given if (!(array_key_exists(FE_NAME, $values) && $values[FE_NAME] !=='')) { - throw new \UserFormException("Trying to insert a FormElement without name to Form with id: $formId" - , ERROR_CODE_SHOULD_NOT_HAPPEN); + throw new \UserFormException(json_encode([ + ERROR_MESSAGE_TO_USER => 'Form import Error.', + ERROR_MESSAGE_TO_DEVELOPER => "Trying to insert a FormElement without name to Form with id: '$formId'"]), + ERROR_CODE_SHOULD_NOT_HAPPEN); } - // filter allowed columns + // filter allowed formElement columns $formElementSchema = $database->getTableDefinition(TABLE_NAME_FORM_ELEMENT); $formElementColumns = array_column($formElementSchema, 'Field'); $insertValues = array_filter($values, function ($columnName) use ($formElementColumns) { @@ -199,19 +219,17 @@ class FormAsFile list($sql, $parameterArray) = SqlQuery::insertRecord(TABLE_NAME_FORM_ELEMENT, $insertValues); // TODO: uncomment sql execution: // $database->sql($sql, ROW_REGULAR, $parameterArray); - - /////// DEBUG ///////// - throw new \UserFormException(json_encode([ - ERROR_MESSAGE_TO_USER => 'Marc debug error', - ERROR_MESSAGE_TO_DEVELOPER => json_encode([$sql, $parameterArray], JSON_PRETTY_PRINT) - ])); - /////////////////////// } /** - * * Reads the form from the databse and saves it in the form folder as a file * + * 1) Get Form from DB + * 2) Remove keys from form: id, name, importStamp + * 3) Get FormElements from DB (ordered by ord column) + * 4) Remove keys from FormElements: id, feId + * 5) Write JSON to file + * * @param string $formName * @param Database $database * @param string $dbNameQFQ @@ -221,51 +239,49 @@ class FormAsFile */ public static function databaseToFile(string $formName, Database $database): void { + self::CheckFormNameValid($formName); - // TODO: check if $formName is valid as a file name - // TODO: check if Form and FormElement have unique name - // TODO: Besprechen: php 7.3 syntax erlauben? bsp. flexible heredoc multiline string - // TODO: ? Default werte nicht in file speichern ? - // Problem: wenn sich default wert aendert dann aendern sich auch alle bisherigen forms. - // zur Zeit ist default wert nur beim erstellen des forms relevant - // Eigentlich sollten wir jetzt default werte in einem JSON fixieren und diese dort draus lesen. - // Oder wir koennten in einem form das default.json angeben woraus die default werte gelesen werden. + // Get form from DB + $FORM = TABLE_NAME_FORM; // can't use constants in strings directly + $NAME = F_NAME; // can't use constants in strings directly + $DELETED = F_DELETED; // can't use constants in strings directly + $form = $database->sql("SELECT * FROM `$FORM` AS f WHERE `f`.`$NAME` LIKE ? AND `f`.`$DELETED`='no'", ROW_EXPECT_1, + [$formName], 'Form "' . $formName . '" not found or multiple forms with the same name.'); // array(column name => value) - /* get form from table */ - /***********************/ - - // define $form: array(column name => value) - $F_NAME = F_NAME; // can't use constants in strings directly - $TABLE_NAME_FORM = TABLE_NAME_FORM; // can't use constants in strings directly - $form = $database->sql("SELECT * FROM `$TABLE_NAME_FORM` AS f WHERE `f`.`$F_NAME` LIKE ? AND `f`.`deleted`='no'", ROW_EXPECT_1, - [$formName], 'Form "' . $formName . '" not found or multiple forms with the same name.'); + // Remove columns id, name, importStamp $formId = $form[F_ID]; unset($form[F_ID]); - unset($form[$F_NAME]); + unset($form[F_NAME]); + unset($form[F_FILE_STATS]); - // define $formElements: array(array(column name => value)) - $TABLE_NAME_FORM_ELEMENT = TABLE_NAME_FORM_ELEMENT; // can't use constants in strings directly - $formElements = $database->sql("SELECT * FROM `$TABLE_NAME_FORM_ELEMENT` AS `fe` WHERE `fe`.`formId` = ? ORDER BY `fe`.`ord`, `fe`.`id`", ROW_REGULAR, [$formId]); + // Get formElements from DB + $FORM_ELEMENT = TABLE_NAME_FORM_ELEMENT; // can't use constants in strings directly + $FORM_ID = FE_FORM_ID; // can't use constants in strings directly + $ORD = FE_ORD; // can't use constants in strings directly + $ID = FE_ID; // can't use constants in strings directly + $formElements = $database->sql("SELECT * FROM `$FORM_ELEMENT` AS `fe` WHERE `fe`.`$FORM_ID` = ? ORDER BY `fe`.`$ORD`, `fe`.`$ID`", ROW_REGULAR, [$formId]); // array(array(column name => value)) + + // Remove id, formId $formElements = array_map(function ($formElement) { unset($formElement[FE_ID]); unset($formElement[FE_FORM_ID]); return $formElement; }, $formElements); - // add Form Elements to Form + // write form as JSON to file $form[FORM_FILE_FORM_ELEMENT] = $formElements; - - // make Json from Form with FormElements $formJson = json_encode($form, JSON_PRETTY_PRINT); - - // write to file if (!is_dir(SYSTEM_FORM_FILE_PATH)) { mkdir(SYSTEM_FORM_FILE_PATH, 0777, true); } $filename = SYSTEM_FORM_FILE_PATH . '/' . $formName . ".json"; - // TODO: Throw exception if current user has no write permissions on file - file_put_contents($filename, $formJson); - + $success = file_put_contents($filename, $formJson); + if ($success === false) { + throw new \UserFormException(json_encode([ + ERROR_MESSAGE_TO_USER => 'writing file failed', + ERROR_MESSAGE_TO_DEVELOPER => "Can't write to file '$filename'"]), + ERROR_IO_WRITE_FILE); + } } /** @@ -318,4 +334,18 @@ class FormAsFile return $value !== $columnDefaults[$columnName]; }, ARRAY_FILTER_USE_BOTH); } + + /** + * @param string $formName + * @throws \UserFormException + */ + private static function CheckFormNameValid(string $formName): void + { + if (!HelperFile::isValidFileName($formName)) { + throw new \UserFormException(json_encode([ + ERROR_MESSAGE_TO_USER => 'Invalid form name.', + ERROR_MESSAGE_TO_DEVELOPER => "Form name not valid '$formName': Name may only consist of alphanumeric characters and _ . -"]), + ERROR_FORM_INVALID_NAME); + } + } } \ No newline at end of file diff --git a/extension/Classes/Core/Helper/HelperFile.php b/extension/Classes/Core/Helper/HelperFile.php index 5619f9c0c..846bd4321 100644 --- a/extension/Classes/Core/Helper/HelperFile.php +++ b/extension/Classes/Core/Helper/HelperFile.php @@ -540,5 +540,15 @@ class HelperFile { return $pre . $separator . $post; } + + /** + * Checks if the given file name only contains alphanumeric characters and ".", "-", "_" + * @param string $fileName + * @return bool + */ + public static function isValidFileName(string $fileName): bool + { + return preg_match('/^([-\.\w]+)$/', $fileName) > 0; + } } -- GitLab From 8a937d21a17d7837ce8ad28c5d1a14169eda0c84 Mon Sep 17 00:00:00 2001 From: Marc Egger <marc.egger@uzh.ch> Date: Mon, 6 Jul 2020 18:32:08 +0200 Subject: [PATCH 016/195] Refs #10120 almost finished with container referencing in form file --- extension/Classes/Core/Form/FormAsFile.php | 126 ++++++++++++++------- 1 file changed, 83 insertions(+), 43 deletions(-) diff --git a/extension/Classes/Core/Form/FormAsFile.php b/extension/Classes/Core/Form/FormAsFile.php index 16c4e659a..198849252 100644 --- a/extension/Classes/Core/Form/FormAsFile.php +++ b/extension/Classes/Core/Form/FormAsFile.php @@ -12,11 +12,13 @@ use IMATHUZH\Qfq\Core\Helper\SqlQuery; * */ -// TODO: Carsten Fragen: Form aus DB loeschen wenn file nicht mehr da? falls ja, wann? Bevor form geladen wird, wird file sowieso zuerst gecheckt. -// TODO: Form Editor form name einschraenken auf valide file names +// TODO: if form is not in DB yet but form file exists, then don't throw exception in QuckFormQuery. // TODO: Container zuordnenm container elemente muessen einen eindeutigen namen haben +// TODO: Carsten Fragen: Form aus DB loeschen wenn file nicht mehr da? falls ja, wann? Bevor form geladen wird, wird file sowieso zuerst gecheckt. // TODO: BEFOORE PRUDUCTION + // TODO: Form Editor form name einschraenken auf eindeutige und valide file names + // TODO: Form Editor anpassen: container name muessen eindeutig sein. // TODO: add fileStats column to Form schema // TODO: move Constants to Constants.php if this file is actually used // TODO: extract all sql queries and make them reusable @@ -24,7 +26,8 @@ use IMATHUZH\Qfq\Core\Helper\SqlQuery; const SCHEMA_COLUMN_NAME = 'COLUMN_NAME'; const SCHEMA_COLUMN_DEFAULT = 'COLUMN_DEFAULT'; const SYSTEM_FORM_FILE_PATH = 'fileadmin/protected/qfq/form'; -const FORM_FILE_FORM_ELEMENT = 'FormElement'; // Key for FormElements array saved in Form File +const FORM_FILE_FORM_ELEMENT = 'FormElement_ff'; // Key for FormElements array saved in Form File +const FORM_FILE_CONTAINER_NAME = 'containerName_ff'; // key for referencing container FormElements by name in form file class FormAsFile { @@ -51,10 +54,16 @@ class FormAsFile * @throws \DbException * @throws \UserFormException */ - public static function FileToDatabase(string $formName, string $fileStats, Database $database): bool + public static function FileToDatabase(string $formName, Database $database): bool { - // Get file stats and exit if they have not changed + ///////////// DEBUG ////////// + if ($formName !== 'person') { + return false; + } + //////////////////////////////// + + // Get file stats both from file system and DB and exit if they are equal self::CheckFormNameValid($formName); $filePath = SYSTEM_FORM_FILE_PATH . '/' . $formName . ".json"; $fileReadException = new \UserFormException(json_encode([ @@ -73,7 +82,13 @@ class FormAsFile 'size' => $stat['size'], 'inode' => $stat['ino'] ]); - if ($fileStatsNew === $fileStats) { + $F_ID = F_ID; // can't use constants in strings directly + $F_FILE_STATS = F_FILE_STATS; // can't use constants in strings directly + $F_NAME = F_NAME; // can't use constants in strings directly + $TABLE_NAME_FORM = TABLE_NAME_FORM; // can't use constants in strings directly + $formFromDb = $database->sql("SELECT `$F_ID`, `$F_FILE_STATS` FROM `$TABLE_NAME_FORM` AS f WHERE `f`.`$F_NAME` LIKE ? AND `f`.`deleted`='no'", ROW_EXPECT_0_1, + [$formName], "Multiple forms with the same name: '$formName'"); + if (array_key_exists($F_FILE_STATS, $formFromDb) && $fileStatsNew === $formFromDb[F_FILE_STATS]) { return false; } @@ -84,24 +99,15 @@ class FormAsFile } $formFromFile = json_decode($fileContents, true); - // Delete old form from DB if exists - $F_ID = F_ID; // can't use constants in strings directly - $F_NAME = F_NAME; // can't use constants in strings directly - $TABLE_NAME_FORM = TABLE_NAME_FORM; // can't use constants in strings directly - $formFromDb = $database->sql("SELECT `$F_ID` FROM `$TABLE_NAME_FORM` AS f WHERE `f`.`$F_NAME` LIKE ? AND `f`.`deleted`='no'", ROW_REGULAR, [$formName]); - if (count($formFromDb) === 1) { - $formId = $formFromDb[0][$F_ID]; + // Delete old form from DB if it exists + if (array_key_exists(F_ID, $formFromDb)) { + $formId = $formFromDb[$F_ID]; // TODO: uncomment sql delete -// $database->sql("DELETE FROM `$TABLE_NAME_FORM` WHERE `$F_ID`=? LIMIT 1", ROW_REGULAR, [$formId]); + $database->sql("DELETE FROM `$TABLE_NAME_FORM` WHERE `$F_ID`=? LIMIT 1", ROW_REGULAR, [$formId]); $TABLE_NAME_FORM_ELEMENT = TABLE_NAME_FORM_ELEMENT; // can't use constants in strings directly $FE_FORM_ID = FE_FORM_ID; // can't use constants in strings directly // TODO: uncomment sql delete -// $database->sql("DELETE FROM `$TABLE_NAME_FORM_ELEMENT` WHERE `$FE_FORM_ID`=?", ROW_REGULAR, [$formId]); - } elseif (count($formFromDb) > 1) { - throw new \DbException(json_encode([ - ERROR_MESSAGE_TO_USER => 'Form Name Error.', - ERROR_MESSAGE_TO_DEVELOPER => "Expected none or one row, got " . count($formFromDb) . "rows. Are there multiple forms with the name '$formName' ?"]), - ERROR_DB_TOO_MANY_ROWS); + $database->sql("DELETE FROM `$TABLE_NAME_FORM_ELEMENT` WHERE `$FE_FORM_ID`=?", ROW_REGULAR, [$formId]); } /* Insert form from file to DB */ @@ -113,24 +119,46 @@ class FormAsFile return $columnName !== F_ID && in_array($columnName, $formColumns); }, ARRAY_FILTER_USE_KEY); // array(column => value) - // execute insert + // execute form insert $insertValues[$F_NAME] = $formName; $insertValues[F_FILE_STATS] = $fileStatsNew; list($sql, $parameterArray) = SqlQuery::insertRecord(TABLE_NAME_FORM, $insertValues); // TODO: uncomment sql execution: -// $formId = $database->sql($sql, ROW_REGULAR, $parameterArray); + $formId = $database->sql($sql, ROW_REGULAR, $parameterArray); + + // insert FormElements to DB and collect container ids + $containerIds = []; // array(container_name => id) + foreach ($formFromFile[FORM_FILE_FORM_ELEMENT] as &$formElementFromFile) { + $feId = self::insertFormElement($formElementFromFile, $formId, $database); + $formElementFromFile[FE_ID] = $feId; + if ($formElementFromFile[FE_CLASS] === FE_CLASS_CONTAINER) { + $containerIds[$formElementFromFile[FE_NAME]] = $feId; + } + } + + // TODO: for each form element which has a FORM_FILE_CONTAINER_NAME update the ID using the above map - // insert FormElements foreach ($formFromFile[FORM_FILE_FORM_ELEMENT] as &$formElementFromFile) { - self::insertFormElement($formElementFromFile, $formId, $database); + if (array_key_exists(FORM_FILE_CONTAINER_NAME, $formElementFromFile)) { + + // TODO: this never happens though it should. Key seems not to exist in any FE........ <<<<<<<<<<<<<<<<<<<< NEXT + /////// DEBUG ///////// + throw new \UserFormException(json_encode([ + ERROR_MESSAGE_TO_USER => 'Marc debug error', + ERROR_MESSAGE_TO_DEVELOPER => json_encode($formElementFromFile, JSON_PRETTY_PRINT) + ])); + /////////////////////// + + $containerName = $formElementFromFile[FORM_FILE_CONTAINER_NAME]; + $containerId = $containerIds[$containerName]; + $feId = $formElementFromFile[FE_ID]; + $TABLE_NAME_FORM_ELEMENT = TABLE_NAME_FORM_ELEMENT; + $FE_ID_CONTAINER = FE_ID_CONTAINER; + // TODO: uncomment sql execution + $database->sql("UPDATE `$TABLE_NAME_FORM_ELEMENT` SET `$FE_ID_CONTAINER`=? WHERE `id`=?", ROW_REGULAR, [$feId, $containerId]); + } } - /////// DEBUG ///////// - throw new \UserFormException(json_encode([ - ERROR_MESSAGE_TO_USER => 'Marc debug error', - ERROR_MESSAGE_TO_DEVELOPER => json_encode([], JSON_PRETTY_PRINT) - ])); - /////////////////////// return true; } @@ -197,16 +225,8 @@ class FormAsFile * @throws \DbException * @throws \UserFormException */ - private static function insertFormElement(array $values, int $formId, Database $database): void + private static function insertFormElement(array $values, int $formId, Database $database): int { - // check if name given - if (!(array_key_exists(FE_NAME, $values) && $values[FE_NAME] !=='')) { - throw new \UserFormException(json_encode([ - ERROR_MESSAGE_TO_USER => 'Form import Error.', - ERROR_MESSAGE_TO_DEVELOPER => "Trying to insert a FormElement without name to Form with id: '$formId'"]), - ERROR_CODE_SHOULD_NOT_HAPPEN); - } - // filter allowed formElement columns $formElementSchema = $database->getTableDefinition(TABLE_NAME_FORM_ELEMENT); $formElementColumns = array_column($formElementSchema, 'Field'); @@ -214,11 +234,13 @@ class FormAsFile return !in_array($columnName, [FE_ID, FE_FORM_ID]) && in_array($columnName, $formElementColumns); }, ARRAY_FILTER_USE_KEY); // array(column => value) - // execute insert ($insertValues will at least contain 'name') + // execute insert $insertValues[FE_FORM_ID] = $formId; list($sql, $parameterArray) = SqlQuery::insertRecord(TABLE_NAME_FORM_ELEMENT, $insertValues); // TODO: uncomment sql execution: -// $database->sql($sql, ROW_REGULAR, $parameterArray); + $id = $database->sql($sql, ROW_REGULAR, $parameterArray); + + return $id; } /** @@ -261,8 +283,26 @@ class FormAsFile $ID = FE_ID; // can't use constants in strings directly $formElements = $database->sql("SELECT * FROM `$FORM_ELEMENT` AS `fe` WHERE `fe`.`$FORM_ID` = ? ORDER BY `fe`.`$ORD`, `fe`.`$ID`", ROW_REGULAR, [$formId]); // array(array(column name => value)) - // Remove id, formId - $formElements = array_map(function ($formElement) { + // Replace container ID with container name and remove all id columns for each formElement + $ContainerNames = array_reduce($formElements, function ($result, $formElement) { + if ($formElement[FE_CLASS] === FE_CLASS_CONTAINER) { + $containerName = $formElement[FE_NAME]; + if (in_array($containerName, $result) || $containerName === '') { + throw new \UserFormException(json_encode([ + ERROR_MESSAGE_TO_USER => 'Duplicate container names.', + ERROR_MESSAGE_TO_DEVELOPER => "Container Form Elements must have a unique and nonempty name. Container name: '$containerName'."]), + ERROR_FORM_INVALID_NAME); + } + $result[$formElement[FE_ID]] = $containerName; + } + return $result; + }, []); // array(id => name) + $formElements = array_map(function ($formElement) use ($ContainerNames) { + $containerId = $formElement[FE_ID_CONTAINER]; + if ($containerId !== 0) { + $formElement[FORM_FILE_CONTAINER_NAME] = $ContainerNames[$containerId]; + } + unset($formElement[FE_ID_CONTAINER]); unset($formElement[FE_ID]); unset($formElement[FE_FORM_ID]); return $formElement; -- GitLab From fbf9a433e7f44bce5a6ff3388716f639b48ae184 Mon Sep 17 00:00:00 2001 From: Marc Egger <marc.egger@uzh.ch> Date: Tue, 7 Jul 2020 11:28:33 +0200 Subject: [PATCH 017/195] Refs #10120 containers work & form is deleted from DB if file not readable --- extension/Classes/Core/Form/FormAsFile.php | 117 +++++++++++++-------- 1 file changed, 73 insertions(+), 44 deletions(-) diff --git a/extension/Classes/Core/Form/FormAsFile.php b/extension/Classes/Core/Form/FormAsFile.php index 198849252..dccd88b20 100644 --- a/extension/Classes/Core/Form/FormAsFile.php +++ b/extension/Classes/Core/Form/FormAsFile.php @@ -17,12 +17,15 @@ use IMATHUZH\Qfq\Core\Helper\SqlQuery; // TODO: Carsten Fragen: Form aus DB loeschen wenn file nicht mehr da? falls ja, wann? Bevor form geladen wird, wird file sowieso zuerst gecheckt. // TODO: BEFOORE PRUDUCTION + // TODO: remove DEBUG blocks // TODO: Form Editor form name einschraenken auf eindeutige und valide file names // TODO: Form Editor anpassen: container name muessen eindeutig sein. // TODO: add fileStats column to Form schema // TODO: move Constants to Constants.php if this file is actually used // TODO: extract all sql queries and make them reusable // TODO: testen: form einmal aus file laden und einmal aus datenbank und inhalte vergleichen. + // TODO: maybe: update button in form list which removes forms from DB if their file was deleted + // TODO: Carsten Fragen: add log messages somewhare? const SCHEMA_COLUMN_NAME = 'COLUMN_NAME'; const SCHEMA_COLUMN_DEFAULT = 'COLUMN_DEFAULT'; const SYSTEM_FORM_FILE_PATH = 'fileadmin/protected/qfq/form'; @@ -47,19 +50,18 @@ class FormAsFile * 8) INSERT Form und FormElement * * @param string $formName - * @param string $fileStats * @param Database $database - * @return bool returns false if there were no changes + * @return void returns false if there were no changes * @throws \CodeException * @throws \DbException * @throws \UserFormException */ - public static function FileToDatabase(string $formName, Database $database): bool + public static function FileToDatabase(string $formName, Database $database): void { ///////////// DEBUG ////////// if ($formName !== 'person') { - return false; + return; } //////////////////////////////// @@ -71,10 +73,12 @@ class FormAsFile ERROR_MESSAGE_TO_DEVELOPER => "Form definition file not found or no permission to read file: '$filePath'"]), ERROR_FORM_NOT_FOUND); if(!file_exists($filePath)) { + self::deleteForm($formName, $database); throw $fileReadException; } $stat = stat($filePath); if ($stat === false) { + self::deleteForm($formName, $database); throw $fileReadException; } $fileStatsNew = json_encode([ @@ -88,13 +92,14 @@ class FormAsFile $TABLE_NAME_FORM = TABLE_NAME_FORM; // can't use constants in strings directly $formFromDb = $database->sql("SELECT `$F_ID`, `$F_FILE_STATS` FROM `$TABLE_NAME_FORM` AS f WHERE `f`.`$F_NAME` LIKE ? AND `f`.`deleted`='no'", ROW_EXPECT_0_1, [$formName], "Multiple forms with the same name: '$formName'"); - if (array_key_exists($F_FILE_STATS, $formFromDb) && $fileStatsNew === $formFromDb[F_FILE_STATS]) { - return false; + if (array_key_exists(F_FILE_STATS, $formFromDb) && $fileStatsNew === $formFromDb[F_FILE_STATS]) { + return; } // Read form file $fileContents = file_get_contents($filePath); if ($fileContents === false) { + self::deleteForm($formName, $database); throw $fileReadException; } $formFromFile = json_decode($fileContents, true); @@ -102,31 +107,21 @@ class FormAsFile // Delete old form from DB if it exists if (array_key_exists(F_ID, $formFromDb)) { $formId = $formFromDb[$F_ID]; - // TODO: uncomment sql delete - $database->sql("DELETE FROM `$TABLE_NAME_FORM` WHERE `$F_ID`=? LIMIT 1", ROW_REGULAR, [$formId]); - $TABLE_NAME_FORM_ELEMENT = TABLE_NAME_FORM_ELEMENT; // can't use constants in strings directly - $FE_FORM_ID = FE_FORM_ID; // can't use constants in strings directly - // TODO: uncomment sql delete - $database->sql("DELETE FROM `$TABLE_NAME_FORM_ELEMENT` WHERE `$FE_FORM_ID`=?", ROW_REGULAR, [$formId]); + self::deleteFormWithId($formId, $database); } - /* Insert form from file to DB */ - - // filter allowed form columns + // Insert new Form to DB (after filtering allowed columns and adding columns 'name' and 'fileStats') $formSchema = $database->getTableDefinition(TABLE_NAME_FORM); $formColumns = array_column($formSchema, 'Field'); $insertValues = array_filter($formFromFile, function ($columnName) use ($formColumns) { return $columnName !== F_ID && in_array($columnName, $formColumns); }, ARRAY_FILTER_USE_KEY); // array(column => value) - - // execute form insert - $insertValues[$F_NAME] = $formName; + $insertValues[F_NAME] = $formName; $insertValues[F_FILE_STATS] = $fileStatsNew; - list($sql, $parameterArray) = SqlQuery::insertRecord(TABLE_NAME_FORM, $insertValues); - // TODO: uncomment sql execution: - $formId = $database->sql($sql, ROW_REGULAR, $parameterArray); + list($sqlFormInsert, $parameterArrayFormInsert) = SqlQuery::insertRecord(TABLE_NAME_FORM, $insertValues); + $formId = $database->sql($sqlFormInsert, ROW_REGULAR, $parameterArrayFormInsert); - // insert FormElements to DB and collect container ids + // Insert FormElements to DB and collect container ids $containerIds = []; // array(container_name => id) foreach ($formFromFile[FORM_FILE_FORM_ELEMENT] as &$formElementFromFile) { $feId = self::insertFormElement($formElementFromFile, $formId, $database); @@ -136,30 +131,24 @@ class FormAsFile } } - // TODO: for each form element which has a FORM_FILE_CONTAINER_NAME update the ID using the above map - + // Update container IDs for each form element which has a container name foreach ($formFromFile[FORM_FILE_FORM_ELEMENT] as &$formElementFromFile) { if (array_key_exists(FORM_FILE_CONTAINER_NAME, $formElementFromFile)) { - - // TODO: this never happens though it should. Key seems not to exist in any FE........ <<<<<<<<<<<<<<<<<<<< NEXT - /////// DEBUG ///////// - throw new \UserFormException(json_encode([ - ERROR_MESSAGE_TO_USER => 'Marc debug error', - ERROR_MESSAGE_TO_DEVELOPER => json_encode($formElementFromFile, JSON_PRETTY_PRINT) - ])); - /////////////////////// - $containerName = $formElementFromFile[FORM_FILE_CONTAINER_NAME]; $containerId = $containerIds[$containerName]; $feId = $formElementFromFile[FE_ID]; - $TABLE_NAME_FORM_ELEMENT = TABLE_NAME_FORM_ELEMENT; - $FE_ID_CONTAINER = FE_ID_CONTAINER; - // TODO: uncomment sql execution - $database->sql("UPDATE `$TABLE_NAME_FORM_ELEMENT` SET `$FE_ID_CONTAINER`=? WHERE `id`=?", ROW_REGULAR, [$feId, $containerId]); + list($sql, $parameterArray) = SqlQuery::updateRecord(TABLE_NAME_FORM_ELEMENT, [FE_ID_CONTAINER => $containerId], $feId); + $database->sql($sql, ROW_REGULAR, $parameterArray); } } - - return true; + return; + + /////// DEBUG ///////// +// throw new \UserFormException(json_encode([ +// ERROR_MESSAGE_TO_USER => 'Marc debug error', +// ERROR_MESSAGE_TO_DEVELOPER => json_encode([$containerId, $feId], JSON_PRETTY_PRINT) +// ])); + /////////////////////// } /** @@ -237,7 +226,6 @@ class FormAsFile // execute insert $insertValues[FE_FORM_ID] = $formId; list($sql, $parameterArray) = SqlQuery::insertRecord(TABLE_NAME_FORM_ELEMENT, $insertValues); - // TODO: uncomment sql execution: $id = $database->sql($sql, ROW_REGULAR, $parameterArray); return $id; @@ -283,8 +271,8 @@ class FormAsFile $ID = FE_ID; // can't use constants in strings directly $formElements = $database->sql("SELECT * FROM `$FORM_ELEMENT` AS `fe` WHERE `fe`.`$FORM_ID` = ? ORDER BY `fe`.`$ORD`, `fe`.`$ID`", ROW_REGULAR, [$formId]); // array(array(column name => value)) - // Replace container ID with container name and remove all id columns for each formElement - $ContainerNames = array_reduce($formElements, function ($result, $formElement) { + // Replace container ID with container name and remove all id columns for each FormElement + $containerNames = array_reduce($formElements, function ($result, $formElement) { if ($formElement[FE_CLASS] === FE_CLASS_CONTAINER) { $containerName = $formElement[FE_NAME]; if (in_array($containerName, $result) || $containerName === '') { @@ -297,10 +285,10 @@ class FormAsFile } return $result; }, []); // array(id => name) - $formElements = array_map(function ($formElement) use ($ContainerNames) { + $formElements = array_map(function ($formElement) use ($containerNames) { $containerId = $formElement[FE_ID_CONTAINER]; if ($containerId !== 0) { - $formElement[FORM_FILE_CONTAINER_NAME] = $ContainerNames[$containerId]; + $formElement[FORM_FILE_CONTAINER_NAME] = $containerNames[$containerId]; } unset($formElement[FE_ID_CONTAINER]); unset($formElement[FE_ID]); @@ -388,4 +376,45 @@ class FormAsFile ERROR_FORM_INVALID_NAME); } } + + /** + * Delete form with given name and its form elements from DB + * + * @param string $formName + * @param Database $database + * @return void + * @throws \CodeException + * @throws \DbException + * @throws \UserFormException + */ + private static function deleteForm(string $formName, Database $database): void + { + $F_ID = F_ID; // can't use constants in strings directly + $F_NAME = F_NAME; // can't use constants in strings directly + $TABLE_NAME_FORM = TABLE_NAME_FORM; // can't use constants in strings directly + $formFromDb = $database->sql("SELECT `$F_ID` FROM `$TABLE_NAME_FORM` AS f WHERE `f`.`$F_NAME` LIKE ? AND `f`.`deleted`='no'", ROW_EXPECT_0_1, + [$formName], "Multiple forms with the same name: '$formName'"); + if (array_key_exists(F_ID, $formFromDb)) { + self::deleteFormWithId($formFromDb[$F_ID], $database); + } + } + + /** + * Delete form with given id and its form elements from DB + * + * @param $formId + * @param Database $database + * @throws \CodeException + * @throws \DbException + * @throws \UserFormException + */ + private static function deleteFormWithId(int $formId, Database $database): void + { + $F_ID = F_ID; // can't use constants in strings directly + $TABLE_NAME_FORM = TABLE_NAME_FORM; // can't use constants in strings directly + $database->sql("DELETE FROM `$TABLE_NAME_FORM` WHERE `$F_ID`=? LIMIT 1", ROW_REGULAR, [$formId]); + $TABLE_NAME_FORM_ELEMENT = TABLE_NAME_FORM_ELEMENT; // can't use constants in strings directly + $FE_FORM_ID = FE_FORM_ID; // can't use constants in strings directly + $database->sql("DELETE FROM `$TABLE_NAME_FORM_ELEMENT` WHERE `$FE_FORM_ID`=?", ROW_REGULAR, [$formId]); + } } \ No newline at end of file -- GitLab From 9f3512813ef7eca5be135f730e45c9246e1669b5 Mon Sep 17 00:00:00 2001 From: Marc Egger <marc.egger@uzh.ch> Date: Tue, 7 Jul 2020 11:33:04 +0200 Subject: [PATCH 018/195] Refs #10120 remove unused code: non-default column filtering, update FormElement. --- extension/Classes/Core/Form/FormAsFile.php | 106 --------------------- 1 file changed, 106 deletions(-) diff --git a/extension/Classes/Core/Form/FormAsFile.php b/extension/Classes/Core/Form/FormAsFile.php index dccd88b20..d63b2aa8a 100644 --- a/extension/Classes/Core/Form/FormAsFile.php +++ b/extension/Classes/Core/Form/FormAsFile.php @@ -151,61 +151,6 @@ class FormAsFile /////////////////////// } - /** - * @param array $values - * @param int $formId - * @param Database $database - * @throws \CodeException - * @throws \DbException - * @throws \UserFormException - */ - private static function updateOrInsertFormElement(array $values, int $formId, Database $database): void - { - if (!(array_key_exists(FE_NAME, $values) && $values[FE_NAME] !=='')) { - throw new \UserFormException("Trying to update or insert a FormElement without name to Form with id: $formId" - , ERROR_CODE_SHOULD_NOT_HAPPEN); - } - - // get FormElement from database if it exists - $FE_NAME = FE_NAME; // can't use constants in strings directly - $FE_FORM_ID = FE_FORM_ID; // can't use constants in strings directly - $TABLE_NAME_FORM_ELEMENT = TABLE_NAME_FORM_ELEMENT; // can't use constants in strings directly - $formElementDb = $database->sql("SELECT * FROM `$TABLE_NAME_FORM_ELEMENT` AS fe WHERE `fe`.`$FE_FORM_ID`=? AND `fe`.`$FE_NAME` LIKE ? AND `fe`.`deleted`='no'" - , ROW_REGULAR, [$formId, $values[FE_NAME]]); - - // update or insert FormElement - if (count($formElementDb) === 1) { - /* update FormElement */ - - $formElementDb = $formElementDb[0]; - - // filter allowed columns which have changed - $formElementColumns = array_keys($formElementDb); - $changedValues = array_filter($values, function ($value, $columnName) use ($formElementColumns, $formElementDb) { - return !in_array($columnName,[FE_ID, FE_FORM_ID]) - && in_array($columnName, $formElementColumns) - && $value !== $formElementDb[$columnName]; - }, ARRAY_FILTER_USE_BOTH); // array(column => changed_value) - - // update FormElement table - if (count($changedValues) > 0) { - list($sql, $parameterArray) = SqlQuery::updateRecord(TABLE_NAME_FORM_ELEMENT, $changedValues, $formElementDb[FE_ID]); - // TODO: uncomment sql execution: -// $database->sql($sql, ROW_REGULAR, $parameterArray); - } - - } elseif (count($formElementDb) === 0) { - /* insert FormElement */ - - self::insertFormElement($values, $formId, $database); - - } else { - throw new \DbException( "Expected none or one row, got " . count($formElementDb) - . " rows. Are there multiple FormElements with the same name in Form with id $formId ?", - ERROR_DB_TOO_MANY_ROWS); - } - } - /** * @param array $values * @param int $formId @@ -312,57 +257,6 @@ class FormAsFile } } - /** - * - * Returns an associative array with the default value for each column in table $tableName - * return: array(column name => default value) - * - * @param string $tableName - * @param Database $database - * @param string $dbNameQFQ - * @return array array(column name => default value) - * @throws \CodeException - * @throws \DbException - * @throws \UserFormException - */ - private static function getColumnDefaults(string $tableName, Database $database, string $dbNameQFQ): array - { - // define: $formSchema: array(array('COLUMN_NAME' => column name, 'COLUMN_DEFAULT' => column default)) - - // TODO: replace following using $formSchema = $database->getTableDefinition(TABLE_NAME_FORM_ELEMENT); - $query = "SELECT " . SCHEMA_COLUMN_NAME . ", " . SCHEMA_COLUMN_DEFAULT . " FROM Information_Schema.Columns WHERE Table_Schema = '$dbNameQFQ' AND Table_Name = '$tableName'"; - $formSchema = $database->sql($query, ROW_REGULAR, []); - - return array_reduce($formSchema, function ($result, $column) { - $result[$column[SCHEMA_COLUMN_NAME]] = $column[SCHEMA_COLUMN_DEFAULT]; - return $result; - }, []); - } - - /** - * - * Receives a row $row from table $tableName and returns a new array with only the columns of $row which do not - * contain the default value set for that column. - * - * @param array $row - * @param string $tableName - * @param Database $database - * @param string $dbNameQFQ - * @return array - * @throws \CodeException - * @throws \DbException - * @throws \UserFormException - */ - private static function filterNonDefaultColumns(array $row, string $tableName, Database $database, string $dbNameQFQ): array - { - $columnDefaults = self::getColumnDefaults($tableName, $database, $dbNameQFQ); - - // return $formNoDefault: array(column name => value) - return array_filter($row, function ($value, $columnName) use ($columnDefaults) { - return $value !== $columnDefaults[$columnName]; - }, ARRAY_FILTER_USE_BOTH); - } - /** * @param string $formName * @throws \UserFormException -- GitLab From 3557cdb294ad83926b6d8213cbeae59aeb21a6d4 Mon Sep 17 00:00:00 2001 From: Marc Egger <marc.egger@uzh.ch> Date: Tue, 7 Jul 2020 12:11:38 +0200 Subject: [PATCH 019/195] Refs #10120 docstrings cleanup --- extension/Classes/Core/Form/FormAsFile.php | 99 +++++++++------------- extension/Classes/Core/QuickFormQuery.php | 4 +- 2 files changed, 44 insertions(+), 59 deletions(-) diff --git a/extension/Classes/Core/Form/FormAsFile.php b/extension/Classes/Core/Form/FormAsFile.php index d63b2aa8a..bbd92e11a 100644 --- a/extension/Classes/Core/Form/FormAsFile.php +++ b/extension/Classes/Core/Form/FormAsFile.php @@ -7,15 +7,6 @@ use IMATHUZH\Qfq\Core\Database\Database; use IMATHUZH\Qfq\Core\Helper\HelperFile; use IMATHUZH\Qfq\Core\Helper\SqlQuery; -/** - * - * - */ - -// TODO: if form is not in DB yet but form file exists, then don't throw exception in QuckFormQuery. -// TODO: Container zuordnenm container elemente muessen einen eindeutigen namen haben -// TODO: Carsten Fragen: Form aus DB loeschen wenn file nicht mehr da? falls ja, wann? Bevor form geladen wird, wird file sowieso zuerst gecheckt. - // TODO: BEFOORE PRUDUCTION // TODO: remove DEBUG blocks // TODO: Form Editor form name einschraenken auf eindeutige und valide file names @@ -23,12 +14,11 @@ use IMATHUZH\Qfq\Core\Helper\SqlQuery; // TODO: add fileStats column to Form schema // TODO: move Constants to Constants.php if this file is actually used // TODO: extract all sql queries and make them reusable - // TODO: testen: form einmal aus file laden und einmal aus datenbank und inhalte vergleichen. + // TODO: write tests // TODO: maybe: update button in form list which removes forms from DB if their file was deleted // TODO: Carsten Fragen: add log messages somewhare? -const SCHEMA_COLUMN_NAME = 'COLUMN_NAME'; -const SCHEMA_COLUMN_DEFAULT = 'COLUMN_DEFAULT'; -const SYSTEM_FORM_FILE_PATH = 'fileadmin/protected/qfq/form'; + +const SYSTEM_FORM_FILE_PATH = 'fileadmin/protected/qfq/form'; // where form specification files are saved and loaded const FORM_FILE_FORM_ELEMENT = 'FormElement_ff'; // Key for FormElements array saved in Form File const FORM_FILE_CONTAINER_NAME = 'containerName_ff'; // key for referencing container FormElements by name in form file @@ -36,18 +26,12 @@ class FormAsFile { /** + * Remove the form from the DB and insert it using the form file. (only if the form file was changed) + * If the form file can't be read, then the form is deleted from the DB and an exception is thrown. * - * Reads the form file and saves in in the Form and FormElement tables - * - * File Laden (parameter: import string (importStamp) der in form gespeichert wird) - * 1) Timestamp, Dateigroesse, Inode mittels FS_stat von file auslesen (stat() https://www.php.net/manual/en/function.stat.php, HelperFile::getFileStats (FS stat), fileinode https://www.php.net/manual/en/function.fileinode.php) - * 2) import string vergleichen mit mitgegebenem - * 3) Falls string sich nicht geandert -> return - * 4) Form aus DB loeschen mit FE elements - * 5) File laden - * 6) columns filtern (Schema Columns - id - formId) - * 7) neun importStamp dem column array hinzufuegen - * 8) INSERT Form und FormElement + * Recognize form file change: Compare the current file stats with the ones saved in the Form table. + * Container References: The form file uses names instead if ids to reference container formElements. These references are translated when the formElements are inserted. + * Ignored keys: The keys 'id', 'formId', 'feIdContainer' are ignored when reading the form file. * * @param string $formName * @param Database $database @@ -152,42 +136,15 @@ class FormAsFile } /** - * @param array $values - * @param int $formId - * @param Database $database - * @throws \CodeException - * @throws \DbException - * @throws \UserFormException - */ - private static function insertFormElement(array $values, int $formId, Database $database): int - { - // filter allowed formElement columns - $formElementSchema = $database->getTableDefinition(TABLE_NAME_FORM_ELEMENT); - $formElementColumns = array_column($formElementSchema, 'Field'); - $insertValues = array_filter($values, function ($columnName) use ($formElementColumns) { - return !in_array($columnName, [FE_ID, FE_FORM_ID]) && in_array($columnName, $formElementColumns); - }, ARRAY_FILTER_USE_KEY); // array(column => value) - - // execute insert - $insertValues[FE_FORM_ID] = $formId; - list($sql, $parameterArray) = SqlQuery::insertRecord(TABLE_NAME_FORM_ELEMENT, $insertValues); - $id = $database->sql($sql, ROW_REGULAR, $parameterArray); - - return $id; - } - - /** - * Reads the form from the databse and saves it in the form folder as a file + * Reads the form from the DB and saves it in the form folder as a form file. + * If the form file path does not exist, it is created. * - * 1) Get Form from DB - * 2) Remove keys from form: id, name, importStamp - * 3) Get FormElements from DB (ordered by ord column) - * 4) Remove keys from FormElements: id, feId - * 5) Write JSON to file + * Container FormElements: The form file uses names instead if ids to reference containers. These references are translated before saving the file. + * Ignored columns: The columns 'id', 'name' (only Form table), 'fileStats', 'formId', 'feIdContainer' are not saved in the file. + * FormElement order: The formElements are ordered by the 'ord' column before writing them to the file. * * @param string $formName * @param Database $database - * @param string $dbNameQFQ * @throws \CodeException * @throws \DbException * @throws \UserFormException @@ -203,7 +160,7 @@ class FormAsFile $form = $database->sql("SELECT * FROM `$FORM` AS f WHERE `f`.`$NAME` LIKE ? AND `f`.`$DELETED`='no'", ROW_EXPECT_1, [$formName], 'Form "' . $formName . '" not found or multiple forms with the same name.'); // array(column name => value) - // Remove columns id, name, importStamp + // Remove columns id, name, fileStats $formId = $form[F_ID]; unset($form[F_ID]); unset($form[F_NAME]); @@ -258,6 +215,8 @@ class FormAsFile } /** + * Throws an exception if form name is not a valid file name. + * * @param string $formName * @throws \UserFormException */ @@ -271,6 +230,32 @@ class FormAsFile } } + /** + * @param array $values + * @param int $formId + * @param Database $database + * @return int + * @throws \CodeException + * @throws \DbException + * @throws \UserFormException + */ + private static function insertFormElement(array $values, int $formId, Database $database): int + { + // filter allowed formElement columns + $formElementSchema = $database->getTableDefinition(TABLE_NAME_FORM_ELEMENT); + $formElementColumns = array_column($formElementSchema, 'Field'); + $insertValues = array_filter($values, function ($columnName) use ($formElementColumns) { + return !in_array($columnName, [FE_ID, FE_FORM_ID]) && in_array($columnName, $formElementColumns); + }, ARRAY_FILTER_USE_KEY); // array(column => value) + + // execute insert + $insertValues[FE_FORM_ID] = $formId; + list($sql, $parameterArray) = SqlQuery::insertRecord(TABLE_NAME_FORM_ELEMENT, $insertValues); + $id = $database->sql($sql, ROW_REGULAR, $parameterArray); + + return $id; + } + /** * Delete form with given name and its form elements from DB * diff --git a/extension/Classes/Core/QuickFormQuery.php b/extension/Classes/Core/QuickFormQuery.php index e3837ee59..97c5ec095 100644 --- a/extension/Classes/Core/QuickFormQuery.php +++ b/extension/Classes/Core/QuickFormQuery.php @@ -999,8 +999,8 @@ class QuickFormQuery { } ///////////////// JUST A TEST, DELETE ME! ////////////// - // FormAsFile::databaseToFile('person', $this->dbArray[$this->dbIndexQfq], $this->store->getVar(SYSTEM_DB_NAME_QFQ, STORE_SYSTEM)); - FormAsFile::FileToDatabase('person', $this->dbArray[$this->dbIndexQfq]); + // FormAsFile::databaseToFile($formName, $this->dbArray[$this->dbIndexQfq]); + FormAsFile::FileToDatabase($formName, $this->dbArray[$this->dbIndexQfq]); ///////////////// TEST FINISHED //////////////////////// // Load form -- GitLab From df7ee54e846893410dd2c6ce19cc58b459b33d91 Mon Sep 17 00:00:00 2001 From: Marc Egger <marc.egger@uzh.ch> Date: Tue, 7 Jul 2020 17:54:36 +0200 Subject: [PATCH 020/195] Refs #10120 load form from file if it is opened in Form-Editor --- extension/Classes/Core/Form/FormAsFile.php | 100 +++++++++++++++++---- extension/Classes/Core/QuickFormQuery.php | 20 +++-- 2 files changed, 98 insertions(+), 22 deletions(-) diff --git a/extension/Classes/Core/Form/FormAsFile.php b/extension/Classes/Core/Form/FormAsFile.php index bbd92e11a..9af8f8c80 100644 --- a/extension/Classes/Core/Form/FormAsFile.php +++ b/extension/Classes/Core/Form/FormAsFile.php @@ -1,16 +1,23 @@ <?php - namespace IMATHUZH\Qfq\Core\Form; use IMATHUZH\Qfq\Core\Database\Database; use IMATHUZH\Qfq\Core\Helper\HelperFile; use IMATHUZH\Qfq\Core\Helper\SqlQuery; + +// TODO: form list Report: when form list report is loaded, load new form files into DB and delete removed forms from DB +// TODO: Carsten Fragen: Form backups erstellen vor dem delete? +// TODO: Maybe: solve reference by ID after file change Problem (might not be a big deal since it only happens on git pull) + // Problem: FormEditor and form list might reference a form by an old id. In that case everything has to be reloaded. That's anoying. + // Variant 1: reference form by name in edit and delete button, not by id (only solver part of the problem) + // Variant 2: track old form ids and relay to new form automatically. Track old form ids in new Form column "oldIds" + // TODO: BEFOORE PRUDUCTION // TODO: remove DEBUG blocks - // TODO: Form Editor form name einschraenken auf eindeutige und valide file names - // TODO: Form Editor anpassen: container name muessen eindeutig sein. + // TODO: Form-Editor form name einschraenken auf eindeutige und valide file names + // TODO: Form-Editor anpassen: container name muessen eindeutig sein. // TODO: add fileStats column to Form schema // TODO: move Constants to Constants.php if this file is actually used // TODO: extract all sql queries and make them reusable @@ -18,6 +25,11 @@ use IMATHUZH\Qfq\Core\Helper\SqlQuery; // TODO: maybe: update button in form list which removes forms from DB if their file was deleted // TODO: Carsten Fragen: add log messages somewhare? +///////////////// JUST A TEST, DELETE ME! ////////////// +// FormAsFile::databaseToFile($formName, $this->dbArray[$this->dbIndexQfq]); +// FormAsFile::FileToDatabase($formName, $this->dbArray[$this->dbIndexQfq]); +///////////////// TEST FINISHED //////////////////////// + const SYSTEM_FORM_FILE_PATH = 'fileadmin/protected/qfq/form'; // where form specification files are saved and loaded const FORM_FILE_FORM_ELEMENT = 'FormElement_ff'; // Key for FormElements array saved in Form File const FORM_FILE_CONTAINER_NAME = 'containerName_ff'; // key for referencing container FormElements by name in form file @@ -25,30 +37,81 @@ const FORM_FILE_CONTAINER_NAME = 'containerName_ff'; // key for referencing cont class FormAsFile { + /** + * Wrapper to call self::loadForm(...) with a formElement ID instead of a form name. + * + * @param int $formElementId + * @param Database $database + * @return bool True if form has been updated. + * @throws \CodeException + * @throws \DbException + * @throws \UserFormException + */ + public static function loadFormElementWithId(int $formElementId, Database $database): bool + { + if ($formElementId === 0) { + return false; + } + + // get form name + $F_NAME = F_NAME; + $TABLE_NAME_FORM_ELEMENT = TABLE_NAME_FORM_ELEMENT; + $TABLE_NAME_FORM = TABLE_NAME_FORM; + $F_ID = F_ID; + $FE_FORM_ID = FE_FORM_ID; + $FE_ID = FE_ID; + $formFromDb = $database->sql("SELECT `f`.`$F_ID`, `f`.`$F_NAME` FROM `$TABLE_NAME_FORM` AS f INNER JOIN `$TABLE_NAME_FORM_ELEMENT` AS fe ON f.`$F_ID`=fe.`$FE_FORM_ID` WHERE `fe`.`$FE_ID`=?", ROW_EXPECT_1, + [$formElementId], "Form element with id '$formElementId' not found. This might be because the Form definition file has changed. Please close tab and reload the form list and Form-Editor from scratch."); + + // load form + return self::loadForm($formFromDb[F_NAME], $database); + } + + /** + * Wrapper to call self::loadForm(...) with an ID instead of a form name. + * + * @param int $formId + * @param Database $database + * @return bool True if form has been updated. + * @throws \CodeException + * @throws \DbException + * @throws \UserFormException + */ + public static function loadFormWithId(int $formId, Database $database): bool + { + if ($formId === 0) { + return false; + } + + // get form name + $F_NAME = F_NAME; + $TABLE_NAME_FORM = TABLE_NAME_FORM; + $F_ID = F_ID; + $formFromDb = $database->sql("SELECT `$F_NAME` FROM `$TABLE_NAME_FORM` AS f WHERE `f`.`$F_ID`=? AND `f`.`deleted`='no'", ROW_EXPECT_1, + [$formId], "Form with id '$formId' not found. This might be because the Form definition file has changed. Please close tab and reload the form list and Form-Editor from scratch."); + + // load form + return self::loadForm($formFromDb[F_NAME], $database); + } + /** * Remove the form from the DB and insert it using the form file. (only if the form file was changed) * If the form file can't be read, then the form is deleted from the DB and an exception is thrown. * + * Form file location: SYSTEM_FORM_FILE_PATH * Recognize form file change: Compare the current file stats with the ones saved in the Form table. * Container References: The form file uses names instead if ids to reference container formElements. These references are translated when the formElements are inserted. * Ignored keys: The keys 'id', 'formId', 'feIdContainer' are ignored when reading the form file. * * @param string $formName * @param Database $database - * @return void returns false if there were no changes + * @return bool True if form has been updated. * @throws \CodeException * @throws \DbException * @throws \UserFormException */ - public static function FileToDatabase(string $formName, Database $database): void + public static function loadForm(string $formName, Database $database): bool { - - ///////////// DEBUG ////////// - if ($formName !== 'person') { - return; - } - //////////////////////////////// - // Get file stats both from file system and DB and exit if they are equal self::CheckFormNameValid($formName); $filePath = SYSTEM_FORM_FILE_PATH . '/' . $formName . ".json"; @@ -77,7 +140,7 @@ class FormAsFile $formFromDb = $database->sql("SELECT `$F_ID`, `$F_FILE_STATS` FROM `$TABLE_NAME_FORM` AS f WHERE `f`.`$F_NAME` LIKE ? AND `f`.`deleted`='no'", ROW_EXPECT_0_1, [$formName], "Multiple forms with the same name: '$formName'"); if (array_key_exists(F_FILE_STATS, $formFromDb) && $fileStatsNew === $formFromDb[F_FILE_STATS]) { - return; + return false; } // Read form file @@ -125,7 +188,7 @@ class FormAsFile $database->sql($sql, ROW_REGULAR, $parameterArray); } } - return; + return true; /////// DEBUG ///////// // throw new \UserFormException(json_encode([ @@ -160,7 +223,7 @@ class FormAsFile $form = $database->sql("SELECT * FROM `$FORM` AS f WHERE `f`.`$NAME` LIKE ? AND `f`.`$DELETED`='no'", ROW_EXPECT_1, [$formName], 'Form "' . $formName . '" not found or multiple forms with the same name.'); // array(column name => value) - // Remove columns id, name, fileStats + // Remove columns: id, name, fileStats $formId = $form[F_ID]; unset($form[F_ID]); unset($form[F_NAME]); @@ -173,7 +236,7 @@ class FormAsFile $ID = FE_ID; // can't use constants in strings directly $formElements = $database->sql("SELECT * FROM `$FORM_ELEMENT` AS `fe` WHERE `fe`.`$FORM_ID` = ? ORDER BY `fe`.`$ORD`, `fe`.`$ID`", ROW_REGULAR, [$formId]); // array(array(column name => value)) - // Replace container ID with container name and remove all id columns for each FormElement + // Translate container references (id to name) and remove all id columns $containerNames = array_reduce($formElements, function ($result, $formElement) { if ($formElement[FE_CLASS] === FE_CLASS_CONTAINER) { $containerName = $formElement[FE_NAME]; @@ -231,6 +294,9 @@ class FormAsFile } /** + * Insert formElement to the given form. + * Keys removed before insert: id, formId, feIdContainer + * * @param array $values * @param int $formId * @param Database $database @@ -245,7 +311,7 @@ class FormAsFile $formElementSchema = $database->getTableDefinition(TABLE_NAME_FORM_ELEMENT); $formElementColumns = array_column($formElementSchema, 'Field'); $insertValues = array_filter($values, function ($columnName) use ($formElementColumns) { - return !in_array($columnName, [FE_ID, FE_FORM_ID]) && in_array($columnName, $formElementColumns); + return !in_array($columnName, [FE_ID, FE_FORM_ID, FE_ID_CONTAINER]) && in_array($columnName, $formElementColumns); }, ARRAY_FILTER_USE_KEY); // array(column => value) // execute insert diff --git a/extension/Classes/Core/QuickFormQuery.php b/extension/Classes/Core/QuickFormQuery.php index 97c5ec095..5ee312509 100644 --- a/extension/Classes/Core/QuickFormQuery.php +++ b/extension/Classes/Core/QuickFormQuery.php @@ -998,16 +998,26 @@ class QuickFormQuery { $this->store->setVar(CLIENT_RECORD_ID, $rTmp, STORE_TYPO3); } - ///////////////// JUST A TEST, DELETE ME! ////////////// - // FormAsFile::databaseToFile($formName, $this->dbArray[$this->dbIndexQfq]); - FormAsFile::FileToDatabase($formName, $this->dbArray[$this->dbIndexQfq]); - ///////////////// TEST FINISHED //////////////////////// - // Load form + FormAsFile::loadForm($formName, $this->dbArray[$this->dbIndexQfq]); $constant = F_NAME; // PhpStorm complains if the constant is directly defined in the string below $form = $this->dbArray[$this->dbIndexQfq]->sql("SELECT * FROM `Form` AS f WHERE `f`.`$constant` LIKE ? AND `f`.`deleted`='no'", ROW_EXPECT_1, [$formName], 'Form "' . $formName . '" not found or multiple forms with the same name.'); + // If form operates on Form/FormElement then update form from file (If form was changed, throw exception) + $formChanged = false; + if ($form[F_TABLE_NAME] === TABLE_NAME_FORM) { + $formChanged = FormAsFile::loadFormWithId($recordId, $this->dbArray[$this->dbIndexQfq]); + } elseif ($form[F_TABLE_NAME] === TABLE_NAME_FORM_ELEMENT) { + $formChanged = FormAsFile::loadFormElementWithId($recordId, $this->dbArray[$this->dbIndexQfq]); + } + if($formChanged) { + throw new \UserFormException(json_encode([ + ERROR_MESSAGE_TO_USER => 'Form file was changed.', + ERROR_MESSAGE_TO_DEVELOPER => "Form definition file has been changed. Please close tab and reload the form list and Form-Editor from scratch."]), + ERROR_FORM_NOT_FOUND); + } + $form = $this->checkFormLogMode($form); $form = $this->modeCleanFormConfig($mode, $form); -- GitLab From 7d6ca4d049926f73676edc9e405fc6e84686f706 Mon Sep 17 00:00:00 2001 From: Marc Egger <marc.egger@uzh.ch> Date: Wed, 8 Jul 2020 12:36:40 +0200 Subject: [PATCH 021/195] Refs #10120 Dirty.php: add error hint, FormAsFile.php: fix CWD file path problem when API --- extension/Classes/Core/Form/Dirty.php | 4 +- extension/Classes/Core/Form/FormAsFile.php | 85 +++++++++++++--------- extension/Classes/Core/QuickFormQuery.php | 8 +- 3 files changed, 58 insertions(+), 39 deletions(-) diff --git a/extension/Classes/Core/Form/Dirty.php b/extension/Classes/Core/Form/Dirty.php index 53c1ec00e..e8c829924 100644 --- a/extension/Classes/Core/Form/Dirty.php +++ b/extension/Classes/Core/Form/Dirty.php @@ -286,7 +286,7 @@ class Dirty { $primaryKey = $tableVars[F_PRIMARY_KEY]; $formDirtyMode = $tableVars[F_DIRTY_MODE]; - $record = $this->dbArray[$this->dbIndexData]->sql("SELECT * FROM `$tableName` WHERE `$primaryKey`=?", ROW_EXPECT_1, [$recordId], "Record to lock not found."); + $record = $this->dbArray[$this->dbIndexData]->sql("SELECT * FROM `$tableName` WHERE `$primaryKey`=?", ROW_EXPECT_1, [$recordId], "Record to lock not found. " . FormAsFile::errorHintFormImport($tableName)); # Dirty workaround: setting the 'expired timestamp' minus 1 second guarantees that the client ask for relock always if the timeout is expired. $expire = date('Y-m-d H:i:s', strtotime("+" . $tableVars[F_RECORD_LOCK_TIMEOUT_SECONDS] - 1 . " seconds")); @@ -320,7 +320,7 @@ class Dirty { return false; // If there is no recordHashMd5, the check is not possible. Always return 'not modified' (=ok) } - $record = $this->dbArray[$this->dbIndexData]->sql("SELECT * FROM `$tableName` WHERE `$primaryKey`=?", ROW_EXPECT_1, [$recordId], "Record to lock not found."); + $record = $this->dbArray[$this->dbIndexData]->sql("SELECT * FROM `$tableName` WHERE `$primaryKey`=?", ROW_EXPECT_1, [$recordId], "Record to lock not found. " . FormAsFile::errorHintFormImport($tableName)); $rcMd5 = OnArray::getMd5($record); diff --git a/extension/Classes/Core/Form/FormAsFile.php b/extension/Classes/Core/Form/FormAsFile.php index 9af8f8c80..f48391796 100644 --- a/extension/Classes/Core/Form/FormAsFile.php +++ b/extension/Classes/Core/Form/FormAsFile.php @@ -6,11 +6,14 @@ use IMATHUZH\Qfq\Core\Database\Database; use IMATHUZH\Qfq\Core\Helper\HelperFile; use IMATHUZH\Qfq\Core\Helper\SqlQuery; - +// TODO: Form speichern. siehe zettlr note. <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< NEXT +// TODO: bevor ein form/formelement im form editor gespeichert wird, soll es vom file geladen werden (Save.php). Falls das file importiert wurde, gibt es eine fehlermeldung. +// TODO: anfrage nach dirty, form file ueberpruefen (importieren) +// TODO: ausporbieren was passiert wenn ich in Form-Editor auf speicher druecke nachdem ich in einem anderen tab das geanderte form file in die DB lade. // TODO: form list Report: when form list report is loaded, load new form files into DB and delete removed forms from DB // TODO: Carsten Fragen: Form backups erstellen vor dem delete? // TODO: Maybe: solve reference by ID after file change Problem (might not be a big deal since it only happens on git pull) - // Problem: FormEditor and form list might reference a form by an old id. In that case everything has to be reloaded. That's anoying. + // Problem: FormEditor and form list might reference a form by an old id. In that case everything has to be reloaded. That's annoying. // Variant 1: reference form by name in edit and delete button, not by id (only solver part of the problem) // Variant 2: track old form ids and relay to new form automatically. Track old form ids in new Form column "oldIds" @@ -36,9 +39,24 @@ const FORM_FILE_CONTAINER_NAME = 'containerName_ff'; // key for referencing cont class FormAsFile { + /** + * Multiple errors might occur after a form file import. This hint can be added to such exceptions to help users. + * Only returns non-empty string if the table is either Form of FormElement. + * + * @param string $tableName + * @return string + */ + public static function errorHintFormImport (string $tableName = 'Form'): string + { + $message = ''; + if (in_array($tableName, [TABLE_NAME_FORM, TABLE_NAME_FORM_ELEMENT])) { + $message .= "Hint: Form definition file might have changed. Please reopen the form list and Form-Editor from scratch."; + } + return $message; + } /** - * Wrapper to call self::loadForm(...) with a formElement ID instead of a form name. + * Wrapper to call self::importForm(...) with a formElement ID instead of a form name. * * @param int $formElementId * @param Database $database @@ -47,7 +65,7 @@ class FormAsFile * @throws \DbException * @throws \UserFormException */ - public static function loadFormElementWithId(int $formElementId, Database $database): bool + public static function importFormElementWithId(int $formElementId, Database $database): bool { if ($formElementId === 0) { return false; @@ -61,14 +79,14 @@ class FormAsFile $FE_FORM_ID = FE_FORM_ID; $FE_ID = FE_ID; $formFromDb = $database->sql("SELECT `f`.`$F_ID`, `f`.`$F_NAME` FROM `$TABLE_NAME_FORM` AS f INNER JOIN `$TABLE_NAME_FORM_ELEMENT` AS fe ON f.`$F_ID`=fe.`$FE_FORM_ID` WHERE `fe`.`$FE_ID`=?", ROW_EXPECT_1, - [$formElementId], "Form element with id '$formElementId' not found. This might be because the Form definition file has changed. Please close tab and reload the form list and Form-Editor from scratch."); + [$formElementId], "Form element with id '$formElementId' not found. " . self::errorHintFormImport()); - // load form - return self::loadForm($formFromDb[F_NAME], $database); + // import form + return self::importForm($formFromDb[F_NAME], $database); } /** - * Wrapper to call self::loadForm(...) with an ID instead of a form name. + * Wrapper to call self::importForm(...) with an ID instead of a form name. * * @param int $formId * @param Database $database @@ -77,7 +95,7 @@ class FormAsFile * @throws \DbException * @throws \UserFormException */ - public static function loadFormWithId(int $formId, Database $database): bool + public static function importFormWithId(int $formId, Database $database): bool { if ($formId === 0) { return false; @@ -88,10 +106,10 @@ class FormAsFile $TABLE_NAME_FORM = TABLE_NAME_FORM; $F_ID = F_ID; $formFromDb = $database->sql("SELECT `$F_NAME` FROM `$TABLE_NAME_FORM` AS f WHERE `f`.`$F_ID`=? AND `f`.`deleted`='no'", ROW_EXPECT_1, - [$formId], "Form with id '$formId' not found. This might be because the Form definition file has changed. Please close tab and reload the form list and Form-Editor from scratch."); + [$formId], "Form with id '$formId' not found. " . self::errorHintFormImport()); - // load form - return self::loadForm($formFromDb[F_NAME], $database); + // import form + return self::importForm($formFromDb[F_NAME], $database); } /** @@ -110,20 +128,28 @@ class FormAsFile * @throws \DbException * @throws \UserFormException */ - public static function loadForm(string $formName, Database $database): bool + public static function importForm(string $formName, Database $database): bool { // Get file stats both from file system and DB and exit if they are equal - self::CheckFormNameValid($formName); - $filePath = SYSTEM_FORM_FILE_PATH . '/' . $formName . ".json"; + self::enforceFormNameValid($formName); + $pathFileName = HelperFile::correctRelativePathFileName(SYSTEM_FORM_FILE_PATH . '/' . $formName . ".json"); $fileReadException = new \UserFormException(json_encode([ - ERROR_MESSAGE_TO_USER => 'Form not found.', - ERROR_MESSAGE_TO_DEVELOPER => "Form definition file not found or no permission to read file: '$filePath'"]), + ERROR_MESSAGE_TO_USER => "Form file not found or missing permission: {$formName}.json", + ERROR_MESSAGE_TO_DEVELOPER => "Form definition file not found or no permission to read file: '$pathFileName'"]), ERROR_FORM_NOT_FOUND); - if(!file_exists($filePath)) { + + /////// DEBUG ///////// +// throw new \UserFormException(json_encode([ +// ERROR_MESSAGE_TO_USER => json_encode([$pathFileName, file_exists($pathFileName), getcwd()], JSON_PRETTY_PRINT), +// ERROR_MESSAGE_TO_DEVELOPER => json_encode([$pathFileName, file_exists($pathFileName)], JSON_PRETTY_PRINT) +// ])); + /////////////////////// + + if(!file_exists($pathFileName)) { self::deleteForm($formName, $database); throw $fileReadException; } - $stat = stat($filePath); + $stat = stat($pathFileName); if ($stat === false) { self::deleteForm($formName, $database); throw $fileReadException; @@ -144,7 +170,7 @@ class FormAsFile } // Read form file - $fileContents = file_get_contents($filePath); + $fileContents = file_get_contents($pathFileName); if ($fileContents === false) { self::deleteForm($formName, $database); throw $fileReadException; @@ -189,13 +215,6 @@ class FormAsFile } } return true; - - /////// DEBUG ///////// -// throw new \UserFormException(json_encode([ -// ERROR_MESSAGE_TO_USER => 'Marc debug error', -// ERROR_MESSAGE_TO_DEVELOPER => json_encode([$containerId, $feId], JSON_PRETTY_PRINT) -// ])); - /////////////////////// } /** @@ -212,9 +231,9 @@ class FormAsFile * @throws \DbException * @throws \UserFormException */ - public static function databaseToFile(string $formName, Database $database): void + public static function exportForm(string $formName, Database $database): void { - self::CheckFormNameValid($formName); + self::enforceFormNameValid($formName); // Get form from DB $FORM = TABLE_NAME_FORM; // can't use constants in strings directly @@ -267,12 +286,12 @@ class FormAsFile if (!is_dir(SYSTEM_FORM_FILE_PATH)) { mkdir(SYSTEM_FORM_FILE_PATH, 0777, true); } - $filename = SYSTEM_FORM_FILE_PATH . '/' . $formName . ".json"; - $success = file_put_contents($filename, $formJson); + $pathFileName = HelperFile::correctRelativePathFileName(SYSTEM_FORM_FILE_PATH . '/' . $formName . ".json"); + $success = file_put_contents($pathFileName, $formJson); if ($success === false) { throw new \UserFormException(json_encode([ ERROR_MESSAGE_TO_USER => 'writing file failed', - ERROR_MESSAGE_TO_DEVELOPER => "Can't write to file '$filename'"]), + ERROR_MESSAGE_TO_DEVELOPER => "Can't write to file '$pathFileName'"]), ERROR_IO_WRITE_FILE); } } @@ -283,7 +302,7 @@ class FormAsFile * @param string $formName * @throws \UserFormException */ - private static function CheckFormNameValid(string $formName): void + private static function enforceFormNameValid(string $formName): void { if (!HelperFile::isValidFileName($formName)) { throw new \UserFormException(json_encode([ diff --git a/extension/Classes/Core/QuickFormQuery.php b/extension/Classes/Core/QuickFormQuery.php index 5ee312509..c86c0fa38 100644 --- a/extension/Classes/Core/QuickFormQuery.php +++ b/extension/Classes/Core/QuickFormQuery.php @@ -999,17 +999,17 @@ class QuickFormQuery { } // Load form - FormAsFile::loadForm($formName, $this->dbArray[$this->dbIndexQfq]); + FormAsFile::importForm($formName, $this->dbArray[$this->dbIndexQfq]); $constant = F_NAME; // PhpStorm complains if the constant is directly defined in the string below $form = $this->dbArray[$this->dbIndexQfq]->sql("SELECT * FROM `Form` AS f WHERE `f`.`$constant` LIKE ? AND `f`.`deleted`='no'", ROW_EXPECT_1, [$formName], 'Form "' . $formName . '" not found or multiple forms with the same name.'); - // If form operates on Form/FormElement then update form from file (If form was changed, throw exception) + // If form operates on Form/FormElement then import form file (If form was changed, throw exception) $formChanged = false; if ($form[F_TABLE_NAME] === TABLE_NAME_FORM) { - $formChanged = FormAsFile::loadFormWithId($recordId, $this->dbArray[$this->dbIndexQfq]); + $formChanged = FormAsFile::importFormWithId($recordId, $this->dbArray[$this->dbIndexQfq]); } elseif ($form[F_TABLE_NAME] === TABLE_NAME_FORM_ELEMENT) { - $formChanged = FormAsFile::loadFormElementWithId($recordId, $this->dbArray[$this->dbIndexQfq]); + $formChanged = FormAsFile::importFormElementWithId($recordId, $this->dbArray[$this->dbIndexQfq]); } if($formChanged) { throw new \UserFormException(json_encode([ -- GitLab From 6674f4ae63ec07509ccce76800ca64dcfcf6f075 Mon Sep 17 00:00:00 2001 From: Marc Egger <marc.egger@uzh.ch> Date: Wed, 8 Jul 2020 20:31:15 +0200 Subject: [PATCH 022/195] Refs #10120 export form on save works --- extension/Classes/Core/Form/FormAsFile.php | 234 ++++++++++++++++----- extension/Classes/Core/QuickFormQuery.php | 40 +++- 2 files changed, 216 insertions(+), 58 deletions(-) diff --git a/extension/Classes/Core/Form/FormAsFile.php b/extension/Classes/Core/Form/FormAsFile.php index f48391796..24697d9ba 100644 --- a/extension/Classes/Core/Form/FormAsFile.php +++ b/extension/Classes/Core/Form/FormAsFile.php @@ -6,9 +6,19 @@ use IMATHUZH\Qfq\Core\Database\Database; use IMATHUZH\Qfq\Core\Helper\HelperFile; use IMATHUZH\Qfq\Core\Helper\SqlQuery; -// TODO: Form speichern. siehe zettlr note. <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< NEXT -// TODO: bevor ein form/formelement im form editor gespeichert wird, soll es vom file geladen werden (Save.php). Falls das file importiert wurde, gibt es eine fehlermeldung. +// TODO: test saving of FormElement <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< +// TODO: implement FORM_DELETE in QuickFormQuery.php +// TODO: Form speichern. siehe zettlr note. +// FORM_DELETE: export Form/FormElement +// FORM_REST: +// FORM_LOAD: +// FORM_SAVE: export Form/FormElement +// FORM_UPDATE: (export Form/FormElement) NO, ask carsten +// FORM_DRAG_AND_DROP: export Form/FormElement +// TODO: gibt es UPDATE/INSERT/DELETE statements die an Form/FormElement arbeiten koennen, die nicht nur durch doForm aufgerufen werden? +// TODO: Dies sollte schon erfuellt sein, testen: bevor ein form/formelement im form editor gespeichert wird, soll es vom file geladen werden (Save.php). Falls das file importiert wurde, gibt es eine fehlermeldung. // TODO: anfrage nach dirty, form file ueberpruefen (importieren) +// TODO: Testen: Dirty tabelle ist aussergewoehnlich voll. werden die records nicht abgeraeumt wegen formAsFile? // TODO: ausporbieren was passiert wenn ich in Form-Editor auf speicher druecke nachdem ich in einem anderen tab das geanderte form file in die DB lade. // TODO: form list Report: when form list report is loaded, load new form files into DB and delete removed forms from DB // TODO: Carsten Fragen: Form backups erstellen vor dem delete? @@ -16,8 +26,11 @@ use IMATHUZH\Qfq\Core\Helper\SqlQuery; // Problem: FormEditor and form list might reference a form by an old id. In that case everything has to be reloaded. That's annoying. // Variant 1: reference form by name in edit and delete button, not by id (only solver part of the problem) // Variant 2: track old form ids and relay to new form automatically. Track old form ids in new Form column "oldIds" +// TODO: DONT DO: add column import-modification-date to Form and FormElement and set them to the same as modification date in both exportForm and importForm. compare the two modification dates in the beginning. If the actual modification is after importModification and fileStats are the same in file and in form, then exportForm. +// TODO: DONT DO: what to do if importModificationDate and fileStats have changed? > 1) export Form to new form file named <formName>mergeConflict_timestamp 2) importForm form file, overwrite DB // TODO: BEFOORE PRUDUCTION + // TODO: move formFile code in QuickFormQuery.php into methods in this file as much as possible? // TODO: remove DEBUG blocks // TODO: Form-Editor form name einschraenken auf eindeutige und valide file names // TODO: Form-Editor anpassen: container name muessen eindeutig sein. @@ -29,10 +42,17 @@ use IMATHUZH\Qfq\Core\Helper\SqlQuery; // TODO: Carsten Fragen: add log messages somewhare? ///////////////// JUST A TEST, DELETE ME! ////////////// -// FormAsFile::databaseToFile($formName, $this->dbArray[$this->dbIndexQfq]); -// FormAsFile::FileToDatabase($formName, $this->dbArray[$this->dbIndexQfq]); +// FormAsFile::exportForm($formName, $this->dbArray[$this->dbIndexQfq]); +// FormAsFile::importForm($formName, $this->dbArray[$this->dbIndexQfq]); ///////////////// TEST FINISHED //////////////////////// +/////// DEBUG ///////// +// throw new \UserFormException(json_encode([ +// ERROR_MESSAGE_TO_USER => json_encode([$pathFileName, file_exists($pathFileName), getcwd()], JSON_PRETTY_PRINT), +// ERROR_MESSAGE_TO_DEVELOPER => json_encode([$pathFileName, file_exists($pathFileName)], JSON_PRETTY_PRINT) +// ])); +/////////////////////// + const SYSTEM_FORM_FILE_PATH = 'fileadmin/protected/qfq/form'; // where form specification files are saved and loaded const FORM_FILE_FORM_ELEMENT = 'FormElement_ff'; // Key for FormElements array saved in Form File const FORM_FILE_CONTAINER_NAME = 'containerName_ff'; // key for referencing container FormElements by name in form file @@ -56,60 +76,45 @@ class FormAsFile } /** - * Wrapper to call self::importForm(...) with a formElement ID instead of a form name. + * Wrapper to call self::importForm(...) with an ID instead of a form name. * - * @param int $formElementId + * @param int $formId * @param Database $database * @return bool True if form has been updated. * @throws \CodeException * @throws \DbException * @throws \UserFormException */ - public static function importFormElementWithId(int $formElementId, Database $database): bool + public static function importFormWithId(int $formId, Database $database): bool { - if ($formElementId === 0) { + if ($formId === 0) { return false; } - - // get form name - $F_NAME = F_NAME; - $TABLE_NAME_FORM_ELEMENT = TABLE_NAME_FORM_ELEMENT; - $TABLE_NAME_FORM = TABLE_NAME_FORM; - $F_ID = F_ID; - $FE_FORM_ID = FE_FORM_ID; - $FE_ID = FE_ID; - $formFromDb = $database->sql("SELECT `f`.`$F_ID`, `f`.`$F_NAME` FROM `$TABLE_NAME_FORM` AS f INNER JOIN `$TABLE_NAME_FORM_ELEMENT` AS fe ON f.`$F_ID`=fe.`$FE_FORM_ID` WHERE `fe`.`$FE_ID`=?", ROW_EXPECT_1, - [$formElementId], "Form element with id '$formElementId' not found. " . self::errorHintFormImport()); - - // import form - return self::importForm($formFromDb[F_NAME], $database); + $formName = self::queryFormNameWithId($formId, $database); + return self::importForm($formName, $database); } /** - * Wrapper to call self::importForm(...) with an ID instead of a form name. + * Wrapper to call self::importForm(...) with a formElement ID instead of a form name. * - * @param int $formId + * @param int $formElementId * @param Database $database * @return bool True if form has been updated. * @throws \CodeException * @throws \DbException * @throws \UserFormException */ - public static function importFormWithId(int $formId, Database $database): bool + public static function importFormElementWithId(int $formElementId, Database $database): bool { - if ($formId === 0) { + if ($formElementId === 0) { return false; } // get form name - $F_NAME = F_NAME; - $TABLE_NAME_FORM = TABLE_NAME_FORM; - $F_ID = F_ID; - $formFromDb = $database->sql("SELECT `$F_NAME` FROM `$TABLE_NAME_FORM` AS f WHERE `f`.`$F_ID`=? AND `f`.`deleted`='no'", ROW_EXPECT_1, - [$formId], "Form with id '$formId' not found. " . self::errorHintFormImport()); + $formName = self::queryFormNameWithFormElementId($formElementId, $database); // import form - return self::importForm($formFromDb[F_NAME], $database); + return self::importForm($formName, $database); } /** @@ -132,33 +137,20 @@ class FormAsFile { // Get file stats both from file system and DB and exit if they are equal self::enforceFormNameValid($formName); - $pathFileName = HelperFile::correctRelativePathFileName(SYSTEM_FORM_FILE_PATH . '/' . $formName . ".json"); + $pathFileName = self::formPathFileName($formName); $fileReadException = new \UserFormException(json_encode([ ERROR_MESSAGE_TO_USER => "Form file not found or missing permission: {$formName}.json", ERROR_MESSAGE_TO_DEVELOPER => "Form definition file not found or no permission to read file: '$pathFileName'"]), ERROR_FORM_NOT_FOUND); - - /////// DEBUG ///////// -// throw new \UserFormException(json_encode([ -// ERROR_MESSAGE_TO_USER => json_encode([$pathFileName, file_exists($pathFileName), getcwd()], JSON_PRETTY_PRINT), -// ERROR_MESSAGE_TO_DEVELOPER => json_encode([$pathFileName, file_exists($pathFileName)], JSON_PRETTY_PRINT) -// ])); - /////////////////////// - if(!file_exists($pathFileName)) { self::deleteForm($formName, $database); throw $fileReadException; } - $stat = stat($pathFileName); - if ($stat === false) { + $fileStatsNew = self::formFileStatsJson($pathFileName); + if ($fileStatsNew === false) { self::deleteForm($formName, $database); throw $fileReadException; } - $fileStatsNew = json_encode([ - 'modified' => $stat['mtime'], - 'size' => $stat['size'], - 'inode' => $stat['ino'] - ]); $F_ID = F_ID; // can't use constants in strings directly $F_FILE_STATS = F_FILE_STATS; // can't use constants in strings directly $F_NAME = F_NAME; // can't use constants in strings directly @@ -217,6 +209,42 @@ class FormAsFile return true; } + /** + * Wrapper to call self::exportForm(...) with an ID instead of a form name. + * + * @param int $formId + * @param Database $database + * @throws \CodeException + * @throws \DbException + * @throws \UserFormException + */ + public static function exportFormWithId(int $formId, Database $database): void + { + if ($formId === 0) { + return; + } + $formName = self::queryFormNameWithId($formId, $database); + self::exportForm($formName, $database); + } + + /** + * Wrapper to call self::exportForm(...) with a formElement ID instead of a form name. + * + * @param int $formElementId + * @param Database $database + * @throws \CodeException + * @throws \DbException + * @throws \UserFormException + */ + public static function exportFormElementWithId(int $formElementId, Database $database): void + { + if ($formElementId === 0) { + return; + } + $formName = self::queryFormNameWithFormElementId($formElementId, $database); + self::exportForm($formName, $database); + } + /** * Reads the form from the DB and saves it in the form folder as a form file. * If the form file path does not exist, it is created. @@ -283,17 +311,41 @@ class FormAsFile // write form as JSON to file $form[FORM_FILE_FORM_ELEMENT] = $formElements; $formJson = json_encode($form, JSON_PRETTY_PRINT); - if (!is_dir(SYSTEM_FORM_FILE_PATH)) { - mkdir(SYSTEM_FORM_FILE_PATH, 0777, true); - } - $pathFileName = HelperFile::correctRelativePathFileName(SYSTEM_FORM_FILE_PATH . '/' . $formName . ".json"); + $pathFileName = self::formPathFileName($formName); $success = file_put_contents($pathFileName, $formJson); if ($success === false) { throw new \UserFormException(json_encode([ - ERROR_MESSAGE_TO_USER => 'writing file failed', + ERROR_MESSAGE_TO_USER => "writing form file '{$formName}.json' failed", ERROR_MESSAGE_TO_DEVELOPER => "Can't write to file '$pathFileName'"]), ERROR_IO_WRITE_FILE); } + + // Update column fileStats + $fileStats = self::formFileStatsJson($pathFileName); + list($sql, $parameterArray) = SqlQuery::updateRecord(TABLE_NAME_FORM, [F_FILE_STATS => $fileStats], $formId); + $database->sql($sql, ROW_REGULAR, $parameterArray); + } + + /** + * Throw exception if Form file is not writeable. + * + * @param int $formId + * @param Database $database + * @return void + * @throws \CodeException + * @throws \DbException + * @throws \UserFormException + */ + public static function enforceFormFileWritable(int $formId, Database $database): void + { + $formName = self::queryFormNameWithId($formId, $database); + $pathFileName = self::formPathFileName($formName); + if (!is_writable($pathFileName)) { + throw new \UserFormException(json_encode([ + ERROR_MESSAGE_TO_USER => "Can't write to form file '{$formName}.json'. Check permissions.", + ERROR_MESSAGE_TO_DEVELOPER => "Can't write to file '$pathFileName'."]), + ERROR_IO_WRITE_FILE); + } } /** @@ -381,4 +433,82 @@ class FormAsFile $FE_FORM_ID = FE_FORM_ID; // can't use constants in strings directly $database->sql("DELETE FROM `$TABLE_NAME_FORM_ELEMENT` WHERE `$FE_FORM_ID`=?", ROW_REGULAR, [$formId]); } + + /** + * @param int $formId + * @param Database $database + * @return string + * @throws \CodeException + * @throws \DbException + * @throws \UserFormException + */ + private static function queryFormNameWithId(int $formId, Database $database): string + { + $F_NAME = F_NAME; + $TABLE_NAME_FORM = TABLE_NAME_FORM; + $F_ID = F_ID; + $formFromDb = $database->sql("SELECT `$F_NAME` FROM `$TABLE_NAME_FORM` AS f WHERE `f`.`$F_ID`=? AND `f`.`deleted`='no'", ROW_EXPECT_1, + [$formId], "Form with id '$formId' not found. " . self::errorHintFormImport()); + return $formFromDb[F_NAME]; + } + + /** + * @param int $formElementId + * @param Database $database + * @return string + * @throws \CodeException + * @throws \DbException + * @throws \UserFormException + */ + private static function queryFormNameWithFormElementId(int $formElementId, Database $database): string + { + $F_NAME = F_NAME; + $TABLE_NAME_FORM_ELEMENT = TABLE_NAME_FORM_ELEMENT; + $TABLE_NAME_FORM = TABLE_NAME_FORM; + $F_ID = F_ID; + $FE_FORM_ID = FE_FORM_ID; + $FE_ID = FE_ID; + $formFromDb = $database->sql("SELECT `f`.`$F_NAME` FROM `$TABLE_NAME_FORM` AS f INNER JOIN `$TABLE_NAME_FORM_ELEMENT` AS fe ON f.`$F_ID`=fe.`$FE_FORM_ID` WHERE `fe`.`$FE_ID`=?", ROW_EXPECT_1, + [$formElementId], "Form element with id '$formElementId' not found. " . self::errorHintFormImport()); + return $formFromDb[F_NAME]; + } + + /** + * @param string $pathFileName + * @return false|string + */ + private static function formFileStatsJson(string $pathFileName) + { + $stats = stat($pathFileName); + if ($stats === false) { + return false; + } + return json_encode([ + 'modified' => $stats['mtime'], + 'size' => $stats['size'], + 'inode' => $stats['ino'] + ]); + } + + /** + * Return correct pathFileName of form file relative to current working directory. + * Create path if it doesn't exist. + * + * @param string $formName + * @return string + * @throws \UserFormException + */ + private static function formPathFileName(string $formName): string + { + if (!is_dir(SYSTEM_FORM_FILE_PATH)) { + $success = mkdir(SYSTEM_FORM_FILE_PATH, 0777, true); + if ($success === false) { + throw new \UserFormException(json_encode([ + ERROR_MESSAGE_TO_USER => "Can't create form file path.", + ERROR_MESSAGE_TO_DEVELOPER => "Can't create path: " . SYSTEM_FORM_FILE_PATH]), + ERROR_IO_WRITE_FILE); + } + } + return HelperFile::correctRelativePathFileName(SYSTEM_FORM_FILE_PATH . '/' . $formName . ".json"); + } } \ No newline at end of file diff --git a/extension/Classes/Core/QuickFormQuery.php b/extension/Classes/Core/QuickFormQuery.php index c86c0fa38..6b906ec18 100644 --- a/extension/Classes/Core/QuickFormQuery.php +++ b/extension/Classes/Core/QuickFormQuery.php @@ -422,6 +422,12 @@ class QuickFormQuery { } } + // Make sure form file is writable (before DB changes are made) + if (in_array($this->formSpec[F_TABLE_NAME], [TABLE_NAME_FORM, TABLE_NAME_FORM_ELEMENT]) + && in_array($formModeNew, [FORM_SAVE, FORM_DRAG_AND_DROP, FORM_DELETE])) { + FormAsFile::enforceFormFileWritable($recordId, $this->dbArray[$this->dbIndexQfq]); + } + // For 'new' record always create a new Browser TAB-uniq (for this current form, nowhere else used) SIP. // With such a Browser TAB-uniq SIP, multiple Browser TABs and following repeated NEWs are easily implemented. if ($formMode != FORM_REST) { @@ -620,6 +626,26 @@ class QuickFormQuery { $data = $this->groupElementUpdateEntries($data); } + // export Form to file, if loaded record is a Form/FormElement + switch ($formModeNew) { + case FORM_SAVE: + case FORM_DRAG_AND_DROP: + if (TABLE_NAME_FORM === $this->formSpec[F_TABLE_NAME]) { + FormAsFile::exportFormWithId($recordId, $this->dbArray[$this->dbIndexQfq]); + } elseif (TABLE_NAME_FORM_ELEMENT === $this->formSpec[F_TABLE_NAME]) { + FormAsFile::exportFormElementWithId($recordId, $this->dbArray[$this->dbIndexQfq]); + } + break; + case FORM_DELETE: + if (TABLE_NAME_FORM === $this->formSpec[F_TABLE_NAME]) { + // TODO: delete form file + } elseif (TABLE_NAME_FORM_ELEMENT === $this->formSpec[F_TABLE_NAME]) { + // TODO: find out the formId of the FormElement. should be in store. Or save it in a variable earlier. + // TODO: export Form + } + + } + return $data; } @@ -998,20 +1024,22 @@ class QuickFormQuery { $this->store->setVar(CLIENT_RECORD_ID, $rTmp, STORE_TYPO3); } - // Load form + // Check for form file changes FormAsFile::importForm($formName, $this->dbArray[$this->dbIndexQfq]); + + // Load form $constant = F_NAME; // PhpStorm complains if the constant is directly defined in the string below $form = $this->dbArray[$this->dbIndexQfq]->sql("SELECT * FROM `Form` AS f WHERE `f`.`$constant` LIKE ? AND `f`.`deleted`='no'", ROW_EXPECT_1, [$formName], 'Form "' . $formName . '" not found or multiple forms with the same name.'); - // If form operates on Form/FormElement then import form file (If form was changed, throw exception) - $formChanged = false; + // Import Form from file if loaded record is Form/FormElement (If form file was changed, throw exception) + $throwException = false; if ($form[F_TABLE_NAME] === TABLE_NAME_FORM) { - $formChanged = FormAsFile::importFormWithId($recordId, $this->dbArray[$this->dbIndexQfq]); + $throwException = FormAsFile::importFormWithId($recordId, $this->dbArray[$this->dbIndexQfq]); } elseif ($form[F_TABLE_NAME] === TABLE_NAME_FORM_ELEMENT) { - $formChanged = FormAsFile::importFormElementWithId($recordId, $this->dbArray[$this->dbIndexQfq]); + $throwException = FormAsFile::importFormElementWithId($recordId, $this->dbArray[$this->dbIndexQfq]); } - if($formChanged) { + if($throwException) { throw new \UserFormException(json_encode([ ERROR_MESSAGE_TO_USER => 'Form file was changed.', ERROR_MESSAGE_TO_DEVELOPER => "Form definition file has been changed. Please close tab and reload the form list and Form-Editor from scratch."]), -- GitLab From c5132b1faa11035d03d059dcb12a308f50c2f32a Mon Sep 17 00:00:00 2001 From: Marc Egger <marc.egger@uzh.ch> Date: Thu, 9 Jul 2020 12:06:24 +0200 Subject: [PATCH 023/195] Refs #10120 all basic functionality implemented. Needs testing. --- extension/Classes/Core/Form/FormAsFile.php | 289 ++++++++------------- extension/Classes/Core/QuickFormQuery.php | 56 ++-- 2 files changed, 137 insertions(+), 208 deletions(-) diff --git a/extension/Classes/Core/Form/FormAsFile.php b/extension/Classes/Core/Form/FormAsFile.php index 24697d9ba..1f7dd867f 100644 --- a/extension/Classes/Core/Form/FormAsFile.php +++ b/extension/Classes/Core/Form/FormAsFile.php @@ -6,30 +6,19 @@ use IMATHUZH\Qfq\Core\Database\Database; use IMATHUZH\Qfq\Core\Helper\HelperFile; use IMATHUZH\Qfq\Core\Helper\SqlQuery; -// TODO: test saving of FormElement <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< -// TODO: implement FORM_DELETE in QuickFormQuery.php -// TODO: Form speichern. siehe zettlr note. -// FORM_DELETE: export Form/FormElement -// FORM_REST: -// FORM_LOAD: -// FORM_SAVE: export Form/FormElement -// FORM_UPDATE: (export Form/FormElement) NO, ask carsten -// FORM_DRAG_AND_DROP: export Form/FormElement +// TODO: test deleteing of Form and FormElement <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< +// TODO: ensure that form file is imported if Form is loaded via Rest API // TODO: gibt es UPDATE/INSERT/DELETE statements die an Form/FormElement arbeiten koennen, die nicht nur durch doForm aufgerufen werden? -// TODO: Dies sollte schon erfuellt sein, testen: bevor ein form/formelement im form editor gespeichert wird, soll es vom file geladen werden (Save.php). Falls das file importiert wurde, gibt es eine fehlermeldung. -// TODO: anfrage nach dirty, form file ueberpruefen (importieren) +// TODO: Testen: Dies sollte schon erfuellt sein, testen: bevor ein form/formelement im form editor gespeichert wird, soll es vom file geladen werden (Save.php). Falls das file importiert wurde, gibt es eine fehlermeldung. +// TODO: Testen: anfrage nach dirty, form file ueberpruefen (importieren) // TODO: Testen: Dirty tabelle ist aussergewoehnlich voll. werden die records nicht abgeraeumt wegen formAsFile? -// TODO: ausporbieren was passiert wenn ich in Form-Editor auf speicher druecke nachdem ich in einem anderen tab das geanderte form file in die DB lade. +// TODO: Testen: ausporbieren was passiert wenn ich in Form-Editor auf speicher druecke nachdem ich in einem anderen tab das geanderte form file in die DB lade. // TODO: form list Report: when form list report is loaded, load new form files into DB and delete removed forms from DB -// TODO: Carsten Fragen: Form backups erstellen vor dem delete? -// TODO: Maybe: solve reference by ID after file change Problem (might not be a big deal since it only happens on git pull) - // Problem: FormEditor and form list might reference a form by an old id. In that case everything has to be reloaded. That's annoying. - // Variant 1: reference form by name in edit and delete button, not by id (only solver part of the problem) - // Variant 2: track old form ids and relay to new form automatically. Track old form ids in new Form column "oldIds" -// TODO: DONT DO: add column import-modification-date to Form and FormElement and set them to the same as modification date in both exportForm and importForm. compare the two modification dates in the beginning. If the actual modification is after importModification and fileStats are the same in file and in form, then exportForm. -// TODO: DONT DO: what to do if importModificationDate and fileStats have changed? > 1) export Form to new form file named <formName>mergeConflict_timestamp 2) importForm form file, overwrite DB +// TODO: Carsten Fragen: Form backups erstellen vor deleteFormFile und exportForm? +// TODO: Carsten Fragen: "git rm" anstatt "rm" benutzen falls ordner ein git repo? Einziger unterschied: macht "git add" // TODO: BEFOORE PRUDUCTION + // TODO: add Exception hint as hint instead of in main message? // TODO: move formFile code in QuickFormQuery.php into methods in this file as much as possible? // TODO: remove DEBUG blocks // TODO: Form-Editor form name einschraenken auf eindeutige und valide file names @@ -41,6 +30,16 @@ use IMATHUZH\Qfq\Core\Helper\SqlQuery; // TODO: maybe: update button in form list which removes forms from DB if their file was deleted // TODO: Carsten Fragen: add log messages somewhare? +// TODO: MAYBE + // TODO: Maybe: solve reference by ID after file change Problem (might not be a big deal since it only happens on git pull) + // Problem: FormEditor and form list might reference a form by an old id. In that case everything has to be reloaded. That's annoying. + // Variant 1: reference form by name in edit and delete button, not by id (only solver part of the problem) + // Variant 2: track old form ids and relay to new form automatically. Track old form ids in new Form column "oldIds" + +// TODO: DON'T DO + // TODO: DONT DO: add column import-modification-date to Form and FormElement and set them to the same as modification date in both exportForm and importForm. compare the two modification dates in the beginning. If the actual modification is after importModification and fileStats are the same in file and in form, then exportForm. + // TODO: DONT DO: what to do if importModificationDate and fileStats have changed? > 1) export Form to new form file named <formName>mergeConflict_timestamp 2) importForm form file, overwrite DB + ///////////////// JUST A TEST, DELETE ME! ////////////// // FormAsFile::exportForm($formName, $this->dbArray[$this->dbIndexQfq]); // FormAsFile::importForm($formName, $this->dbArray[$this->dbIndexQfq]); @@ -59,64 +58,6 @@ const FORM_FILE_CONTAINER_NAME = 'containerName_ff'; // key for referencing cont class FormAsFile { - /** - * Multiple errors might occur after a form file import. This hint can be added to such exceptions to help users. - * Only returns non-empty string if the table is either Form of FormElement. - * - * @param string $tableName - * @return string - */ - public static function errorHintFormImport (string $tableName = 'Form'): string - { - $message = ''; - if (in_array($tableName, [TABLE_NAME_FORM, TABLE_NAME_FORM_ELEMENT])) { - $message .= "Hint: Form definition file might have changed. Please reopen the form list and Form-Editor from scratch."; - } - return $message; - } - - /** - * Wrapper to call self::importForm(...) with an ID instead of a form name. - * - * @param int $formId - * @param Database $database - * @return bool True if form has been updated. - * @throws \CodeException - * @throws \DbException - * @throws \UserFormException - */ - public static function importFormWithId(int $formId, Database $database): bool - { - if ($formId === 0) { - return false; - } - $formName = self::queryFormNameWithId($formId, $database); - return self::importForm($formName, $database); - } - - /** - * Wrapper to call self::importForm(...) with a formElement ID instead of a form name. - * - * @param int $formElementId - * @param Database $database - * @return bool True if form has been updated. - * @throws \CodeException - * @throws \DbException - * @throws \UserFormException - */ - public static function importFormElementWithId(int $formElementId, Database $database): bool - { - if ($formElementId === 0) { - return false; - } - - // get form name - $formName = self::queryFormNameWithFormElementId($formElementId, $database); - - // import form - return self::importForm($formName, $database); - } - /** * Remove the form from the DB and insert it using the form file. (only if the form file was changed) * If the form file can't be read, then the form is deleted from the DB and an exception is thrown. @@ -136,10 +77,9 @@ class FormAsFile public static function importForm(string $formName, Database $database): bool { // Get file stats both from file system and DB and exit if they are equal - self::enforceFormNameValid($formName); $pathFileName = self::formPathFileName($formName); $fileReadException = new \UserFormException(json_encode([ - ERROR_MESSAGE_TO_USER => "Form file not found or missing permission: {$formName}.json", + ERROR_MESSAGE_TO_USER => "Form file not found or missing permission: " . baseName($pathFileName), ERROR_MESSAGE_TO_DEVELOPER => "Form definition file not found or no permission to read file: '$pathFileName'"]), ERROR_FORM_NOT_FOUND); if(!file_exists($pathFileName)) { @@ -209,45 +149,10 @@ class FormAsFile return true; } - /** - * Wrapper to call self::exportForm(...) with an ID instead of a form name. - * - * @param int $formId - * @param Database $database - * @throws \CodeException - * @throws \DbException - * @throws \UserFormException - */ - public static function exportFormWithId(int $formId, Database $database): void - { - if ($formId === 0) { - return; - } - $formName = self::queryFormNameWithId($formId, $database); - self::exportForm($formName, $database); - } - - /** - * Wrapper to call self::exportForm(...) with a formElement ID instead of a form name. - * - * @param int $formElementId - * @param Database $database - * @throws \CodeException - * @throws \DbException - * @throws \UserFormException - */ - public static function exportFormElementWithId(int $formElementId, Database $database): void - { - if ($formElementId === 0) { - return; - } - $formName = self::queryFormNameWithFormElementId($formElementId, $database); - self::exportForm($formName, $database); - } - /** * Reads the form from the DB and saves it in the form folder as a form file. * If the form file path does not exist, it is created. + * Updates column fileStats with new stats from new file. * * Container FormElements: The form file uses names instead if ids to reference containers. These references are translated before saving the file. * Ignored columns: The columns 'id', 'name' (only Form table), 'fileStats', 'formId', 'feIdContainer' are not saved in the file. @@ -261,8 +166,6 @@ class FormAsFile */ public static function exportForm(string $formName, Database $database): void { - self::enforceFormNameValid($formName); - // Get form from DB $FORM = TABLE_NAME_FORM; // can't use constants in strings directly $NAME = F_NAME; // can't use constants in strings directly @@ -315,7 +218,7 @@ class FormAsFile $success = file_put_contents($pathFileName, $formJson); if ($success === false) { throw new \UserFormException(json_encode([ - ERROR_MESSAGE_TO_USER => "writing form file '{$formName}.json' failed", + ERROR_MESSAGE_TO_USER => "Writing form file failed: " . baseName($pathFileName), ERROR_MESSAGE_TO_DEVELOPER => "Can't write to file '$pathFileName'"]), ERROR_IO_WRITE_FILE); } @@ -327,40 +230,101 @@ class FormAsFile } /** - * Throw exception if Form file is not writeable. + * Deletes the form file for the given form. * - * @param int $formId - * @param Database $database - * @return void - * @throws \CodeException - * @throws \DbException + * @param $formName * @throws \UserFormException */ - public static function enforceFormFileWritable(int $formId, Database $database): void + public static function deleteFormFile($formName): void { - $formName = self::queryFormNameWithId($formId, $database); + self::enforceFormFileWritable($formName); $pathFileName = self::formPathFileName($formName); - if (!is_writable($pathFileName)) { - throw new \UserFormException(json_encode([ - ERROR_MESSAGE_TO_USER => "Can't write to form file '{$formName}.json'. Check permissions.", - ERROR_MESSAGE_TO_DEVELOPER => "Can't write to file '$pathFileName'."]), - ERROR_IO_WRITE_FILE); + if(file_exists($pathFileName)) { + unlink($pathFileName); } } /** - * Throws an exception if form name is not a valid file name. + * Multiple errors might occur after a form file import. This hint can be added to such exceptions to help users. + * Only returns non-empty string if the table is either Form of FormElement. + * + * @param string $tableName + * @return string + */ + public static function errorHintFormImport (string $tableName = 'Form'): string + { + $message = ''; + if (in_array($tableName, [TABLE_NAME_FORM, TABLE_NAME_FORM_ELEMENT])) { + $message .= "Hint: Form definition file might have changed. Please reopen the form list and Form-Editor from scratch."; + } + return $message; + } + + /** + * Throw exception if form file or form directory is not writeable. * * @param string $formName + * @return void * @throws \UserFormException */ - private static function enforceFormNameValid(string $formName): void + public static function enforceFormFileWritable(string $formName): void { - if (!HelperFile::isValidFileName($formName)) { - throw new \UserFormException(json_encode([ - ERROR_MESSAGE_TO_USER => 'Invalid form name.', - ERROR_MESSAGE_TO_DEVELOPER => "Form name not valid '$formName': Name may only consist of alphanumeric characters and _ . -"]), - ERROR_FORM_INVALID_NAME); + $pathFileName = self::formPathFileName($formName); + if (file_exists($pathFileName)) { + if (!is_writable($pathFileName)) { + throw new \UserFormException(json_encode([ + ERROR_MESSAGE_TO_USER => "Can't write to file: " . baseName($pathFileName), + ERROR_MESSAGE_TO_DEVELOPER => "Can't write to file '$pathFileName'. Check permissions."]), + ERROR_IO_WRITE_FILE); + } + } else { + if (!is_writable(dirname($pathFileName))) { + throw new \UserFormException(json_encode([ + ERROR_MESSAGE_TO_USER => "Can't write to form directory. Check permissions.", + ERROR_MESSAGE_TO_DEVELOPER => "Can't write to directory: " . dirname($pathFileName)]), + ERROR_IO_WRITE_FILE); + } + } + + } + + /** + * Return form name if given record is an existing Form or FormElement. + * Return false otherwise. + * + * @param int $recordId + * @param string $recordTable + * @param Database $database + * @return string formName|false + * @throws \CodeException + * @throws \DbException + * @throws \UserFormException + */ + public static function isFormOrFormElement(int $recordId, string $recordTable, Database $database): string + { + if ($recordId === 0) { + return false; + } + switch ($recordTable) { + case TABLE_NAME_FORM: + $F_NAME = F_NAME; + $TABLE_NAME_FORM = TABLE_NAME_FORM; + $F_ID = F_ID; + $formFromDb = $database->sql("SELECT `$F_NAME` FROM `$TABLE_NAME_FORM` AS f WHERE `f`.`$F_ID`=? AND `f`.`deleted`='no'", ROW_EXPECT_1, + [$recordId], "Form with id '$recordId' not found. " . self::errorHintFormImport()); + return $formFromDb[F_NAME]; + case TABLE_NAME_FORM_ELEMENT: + $F_NAME = F_NAME; + $TABLE_NAME_FORM_ELEMENT = TABLE_NAME_FORM_ELEMENT; + $TABLE_NAME_FORM = TABLE_NAME_FORM; + $F_ID = F_ID; + $FE_FORM_ID = FE_FORM_ID; + $FE_ID = FE_ID; + $formFromDb = $database->sql("SELECT `f`.`$F_NAME` FROM `$TABLE_NAME_FORM` AS f INNER JOIN `$TABLE_NAME_FORM_ELEMENT` AS fe ON f.`$F_ID`=fe.`$FE_FORM_ID` WHERE `fe`.`$FE_ID`=?", ROW_EXPECT_1, + [$recordId], "Form element with id '$recordId' not found. " . self::errorHintFormImport()); + return $formFromDb[F_NAME]; + default: + return false; } } @@ -434,45 +398,6 @@ class FormAsFile $database->sql("DELETE FROM `$TABLE_NAME_FORM_ELEMENT` WHERE `$FE_FORM_ID`=?", ROW_REGULAR, [$formId]); } - /** - * @param int $formId - * @param Database $database - * @return string - * @throws \CodeException - * @throws \DbException - * @throws \UserFormException - */ - private static function queryFormNameWithId(int $formId, Database $database): string - { - $F_NAME = F_NAME; - $TABLE_NAME_FORM = TABLE_NAME_FORM; - $F_ID = F_ID; - $formFromDb = $database->sql("SELECT `$F_NAME` FROM `$TABLE_NAME_FORM` AS f WHERE `f`.`$F_ID`=? AND `f`.`deleted`='no'", ROW_EXPECT_1, - [$formId], "Form with id '$formId' not found. " . self::errorHintFormImport()); - return $formFromDb[F_NAME]; - } - - /** - * @param int $formElementId - * @param Database $database - * @return string - * @throws \CodeException - * @throws \DbException - * @throws \UserFormException - */ - private static function queryFormNameWithFormElementId(int $formElementId, Database $database): string - { - $F_NAME = F_NAME; - $TABLE_NAME_FORM_ELEMENT = TABLE_NAME_FORM_ELEMENT; - $TABLE_NAME_FORM = TABLE_NAME_FORM; - $F_ID = F_ID; - $FE_FORM_ID = FE_FORM_ID; - $FE_ID = FE_ID; - $formFromDb = $database->sql("SELECT `f`.`$F_NAME` FROM `$TABLE_NAME_FORM` AS f INNER JOIN `$TABLE_NAME_FORM_ELEMENT` AS fe ON f.`$F_ID`=fe.`$FE_FORM_ID` WHERE `fe`.`$FE_ID`=?", ROW_EXPECT_1, - [$formElementId], "Form element with id '$formElementId' not found. " . self::errorHintFormImport()); - return $formFromDb[F_NAME]; - } - /** * @param string $pathFileName * @return false|string @@ -500,6 +425,15 @@ class FormAsFile */ private static function formPathFileName(string $formName): string { + // validate form name + if (!HelperFile::isValidFileName($formName)) { + throw new \UserFormException(json_encode([ + ERROR_MESSAGE_TO_USER => 'Invalid form name.', + ERROR_MESSAGE_TO_DEVELOPER => "Reading/Writing Form file failed: Form name '$formName' not valid. Name may only consist of alphanumeric characters and _ . -"]), + ERROR_FORM_INVALID_NAME); + } + + // create form folder path if (!is_dir(SYSTEM_FORM_FILE_PATH)) { $success = mkdir(SYSTEM_FORM_FILE_PATH, 0777, true); if ($success === false) { @@ -509,6 +443,7 @@ class FormAsFile ERROR_IO_WRITE_FILE); } } + return HelperFile::correctRelativePathFileName(SYSTEM_FORM_FILE_PATH . '/' . $formName . ".json"); } } \ No newline at end of file diff --git a/extension/Classes/Core/QuickFormQuery.php b/extension/Classes/Core/QuickFormQuery.php index 6b906ec18..cff634b41 100644 --- a/extension/Classes/Core/QuickFormQuery.php +++ b/extension/Classes/Core/QuickFormQuery.php @@ -423,9 +423,10 @@ class QuickFormQuery { } // Make sure form file is writable (before DB changes are made) - if (in_array($this->formSpec[F_TABLE_NAME], [TABLE_NAME_FORM, TABLE_NAME_FORM_ELEMENT]) - && in_array($formModeNew, [FORM_SAVE, FORM_DRAG_AND_DROP, FORM_DELETE])) { - FormAsFile::enforceFormFileWritable($recordId, $this->dbArray[$this->dbIndexQfq]); + // Note: This can't be done earlier because $formModeNew might be changed in the lines above. + $recordFormName = FormAsFile::isFormOrFormElement($recordId, $this->formSpec[F_TABLE_NAME], $this->dbArray[$this->dbIndexQfq]); + if ($recordFormName !== false && in_array($formModeNew, [FORM_SAVE, FORM_DRAG_AND_DROP, FORM_DELETE])) { + FormAsFile::enforceFormFileWritable($recordFormName); } // For 'new' record always create a new Browser TAB-uniq (for this current form, nowhere else used) SIP. @@ -627,23 +628,19 @@ class QuickFormQuery { } // export Form to file, if loaded record is a Form/FormElement - switch ($formModeNew) { - case FORM_SAVE: - case FORM_DRAG_AND_DROP: - if (TABLE_NAME_FORM === $this->formSpec[F_TABLE_NAME]) { - FormAsFile::exportFormWithId($recordId, $this->dbArray[$this->dbIndexQfq]); - } elseif (TABLE_NAME_FORM_ELEMENT === $this->formSpec[F_TABLE_NAME]) { - FormAsFile::exportFormElementWithId($recordId, $this->dbArray[$this->dbIndexQfq]); - } - break; - case FORM_DELETE: - if (TABLE_NAME_FORM === $this->formSpec[F_TABLE_NAME]) { - // TODO: delete form file - } elseif (TABLE_NAME_FORM_ELEMENT === $this->formSpec[F_TABLE_NAME]) { - // TODO: find out the formId of the FormElement. should be in store. Or save it in a variable earlier. - // TODO: export Form - } - + if ($recordFormName !== false) { + switch ($formModeNew) { + case FORM_SAVE: + case FORM_DRAG_AND_DROP: + FormAsFile::exportForm($recordFormName, $this->dbArray[$this->dbIndexQfq]); + break; + case FORM_DELETE: + if (TABLE_NAME_FORM_ELEMENT === $this->formSpec[F_TABLE_NAME]) { + FormAsFile::exportForm($recordFormName, $this->dbArray[$this->dbIndexQfq]); + } else { + FormAsFile::deleteFormFile($recordFormName); + } + } } return $data; @@ -1033,17 +1030,14 @@ class QuickFormQuery { [$formName], 'Form "' . $formName . '" not found or multiple forms with the same name.'); // Import Form from file if loaded record is Form/FormElement (If form file was changed, throw exception) - $throwException = false; - if ($form[F_TABLE_NAME] === TABLE_NAME_FORM) { - $throwException = FormAsFile::importFormWithId($recordId, $this->dbArray[$this->dbIndexQfq]); - } elseif ($form[F_TABLE_NAME] === TABLE_NAME_FORM_ELEMENT) { - $throwException = FormAsFile::importFormElementWithId($recordId, $this->dbArray[$this->dbIndexQfq]); - } - if($throwException) { - throw new \UserFormException(json_encode([ - ERROR_MESSAGE_TO_USER => 'Form file was changed.', - ERROR_MESSAGE_TO_DEVELOPER => "Form definition file has been changed. Please close tab and reload the form list and Form-Editor from scratch."]), - ERROR_FORM_NOT_FOUND); + $recordFormName = FormAsFile::isFormOrFormElement($recordId, $form[F_TABLE_NAME], $this->dbArray[$this->dbIndexQfq]); + if ($recordFormName !== false) { + if(FormAsFile::importForm($recordFormName, $this->dbArray[$this->dbIndexQfq])) { + throw new \UserFormException(json_encode([ + ERROR_MESSAGE_TO_USER => 'Form file was changed.', + ERROR_MESSAGE_TO_DEVELOPER => "Form definition file has been changed. Please close tab and reload the form list and Form-Editor from scratch."]), + ERROR_FORM_NOT_FOUND); + } } $form = $this->checkFormLogMode($form); -- GitLab From f416e94d90296a318dbafc53c2e1dac34e7b2aaf Mon Sep 17 00:00:00 2001 From: Marc Egger <marc.egger@uzh.ch> Date: Tue, 14 Jul 2020 11:26:54 +0200 Subject: [PATCH 024/195] Refs #10120 fix bug: isFormOrFormElement returned "" instead of false since return type was ": string" --- extension/Classes/Core/Form/FormAsFile.php | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/extension/Classes/Core/Form/FormAsFile.php b/extension/Classes/Core/Form/FormAsFile.php index 1f7dd867f..0e9332019 100644 --- a/extension/Classes/Core/Form/FormAsFile.php +++ b/extension/Classes/Core/Form/FormAsFile.php @@ -26,7 +26,7 @@ use IMATHUZH\Qfq\Core\Helper\SqlQuery; // TODO: add fileStats column to Form schema // TODO: move Constants to Constants.php if this file is actually used // TODO: extract all sql queries and make them reusable - // TODO: write tests + // TODO: write tests (file test https://medium.com/weebly-engineering/phpunit-mocking-the-file-system-using-vfsstream-5d7d79b1eb2a) // TODO: maybe: update button in form list which removes forms from DB if their file was deleted // TODO: Carsten Fragen: add log messages somewhare? @@ -47,8 +47,8 @@ use IMATHUZH\Qfq\Core\Helper\SqlQuery; /////// DEBUG ///////// // throw new \UserFormException(json_encode([ -// ERROR_MESSAGE_TO_USER => json_encode([$pathFileName, file_exists($pathFileName), getcwd()], JSON_PRETTY_PRINT), -// ERROR_MESSAGE_TO_DEVELOPER => json_encode([$pathFileName, file_exists($pathFileName)], JSON_PRETTY_PRINT) +// ERROR_MESSAGE_TO_USER => json_encode([], JSON_PRETTY_PRINT), +// ERROR_MESSAGE_TO_DEVELOPER => json_encode([], JSON_PRETTY_PRINT) // ])); /////////////////////// @@ -300,8 +300,9 @@ class FormAsFile * @throws \DbException * @throws \UserFormException */ - public static function isFormOrFormElement(int $recordId, string $recordTable, Database $database): string + public static function isFormOrFormElement(int $recordId, string $recordTable, Database $database) { + $recordId = intval($recordId); if ($recordId === 0) { return false; } -- GitLab From a9a26973d94d55a046ac56427b05e5d983475664 Mon Sep 17 00:00:00 2001 From: Marc Egger <marc.egger@uzh.ch> Date: Tue, 14 Jul 2020 11:32:25 +0200 Subject: [PATCH 025/195] Refs #10120 coersion to int not necessary. PHP does it automatically due to type hint. --- extension/Classes/Core/Form/FormAsFile.php | 1 - 1 file changed, 1 deletion(-) diff --git a/extension/Classes/Core/Form/FormAsFile.php b/extension/Classes/Core/Form/FormAsFile.php index 0e9332019..55f6cdb14 100644 --- a/extension/Classes/Core/Form/FormAsFile.php +++ b/extension/Classes/Core/Form/FormAsFile.php @@ -302,7 +302,6 @@ class FormAsFile */ public static function isFormOrFormElement(int $recordId, string $recordTable, Database $database) { - $recordId = intval($recordId); if ($recordId === 0) { return false; } -- GitLab From 79def3bf1f385715f06db5afb9d4e2f2f0665066 Mon Sep 17 00:00:00 2001 From: Marc Egger <marc.egger@uzh.ch> Date: Tue, 14 Jul 2020 11:49:51 +0200 Subject: [PATCH 026/195] Refs #10120 add strict_types to make sure the previous bug won't be repeated. --- extension/Classes/Core/Form/FormAsFile.php | 1 + 1 file changed, 1 insertion(+) diff --git a/extension/Classes/Core/Form/FormAsFile.php b/extension/Classes/Core/Form/FormAsFile.php index 55f6cdb14..6431ac575 100644 --- a/extension/Classes/Core/Form/FormAsFile.php +++ b/extension/Classes/Core/Form/FormAsFile.php @@ -1,4 +1,5 @@ <?php +declare(strict_types=1); namespace IMATHUZH\Qfq\Core\Form; -- GitLab From 3ba5f4fed2937e2fd4a955fd8621f96f3cd05205 Mon Sep 17 00:00:00 2001 From: Marc Egger <marc.egger@uzh.ch> Date: Tue, 14 Jul 2020 12:19:12 +0200 Subject: [PATCH 027/195] Refs #10120 add return type to function --- extension/Classes/Core/Form/FormAsFile.php | 10 +++++----- extension/Classes/Core/QuickFormQuery.php | 8 ++++---- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/extension/Classes/Core/Form/FormAsFile.php b/extension/Classes/Core/Form/FormAsFile.php index 6431ac575..587fa07a4 100644 --- a/extension/Classes/Core/Form/FormAsFile.php +++ b/extension/Classes/Core/Form/FormAsFile.php @@ -291,20 +291,20 @@ class FormAsFile /** * Return form name if given record is an existing Form or FormElement. - * Return false otherwise. + * Return null otherwise. * * @param int $recordId * @param string $recordTable * @param Database $database - * @return string formName|false + * @return string formName|null * @throws \CodeException * @throws \DbException * @throws \UserFormException */ - public static function isFormOrFormElement(int $recordId, string $recordTable, Database $database) + public static function formNameFromFormRelatedRecord(int $recordId, string $recordTable, Database $database): ?string { if ($recordId === 0) { - return false; + return null; } switch ($recordTable) { case TABLE_NAME_FORM: @@ -325,7 +325,7 @@ class FormAsFile [$recordId], "Form element with id '$recordId' not found. " . self::errorHintFormImport()); return $formFromDb[F_NAME]; default: - return false; + return null; } } diff --git a/extension/Classes/Core/QuickFormQuery.php b/extension/Classes/Core/QuickFormQuery.php index cff634b41..365364a7d 100644 --- a/extension/Classes/Core/QuickFormQuery.php +++ b/extension/Classes/Core/QuickFormQuery.php @@ -424,8 +424,8 @@ class QuickFormQuery { // Make sure form file is writable (before DB changes are made) // Note: This can't be done earlier because $formModeNew might be changed in the lines above. - $recordFormName = FormAsFile::isFormOrFormElement($recordId, $this->formSpec[F_TABLE_NAME], $this->dbArray[$this->dbIndexQfq]); - if ($recordFormName !== false && in_array($formModeNew, [FORM_SAVE, FORM_DRAG_AND_DROP, FORM_DELETE])) { + $recordFormName = FormAsFile::formNameFromFormRelatedRecord($recordId, $this->formSpec[F_TABLE_NAME], $this->dbArray[$this->dbIndexQfq]); + if ($recordFormName !== null && in_array($formModeNew, [FORM_SAVE, FORM_DRAG_AND_DROP, FORM_DELETE])) { FormAsFile::enforceFormFileWritable($recordFormName); } @@ -1030,8 +1030,8 @@ class QuickFormQuery { [$formName], 'Form "' . $formName . '" not found or multiple forms with the same name.'); // Import Form from file if loaded record is Form/FormElement (If form file was changed, throw exception) - $recordFormName = FormAsFile::isFormOrFormElement($recordId, $form[F_TABLE_NAME], $this->dbArray[$this->dbIndexQfq]); - if ($recordFormName !== false) { + $recordFormName = FormAsFile::formNameFromFormRelatedRecord($recordId, $form[F_TABLE_NAME], $this->dbArray[$this->dbIndexQfq]); + if ($recordFormName !== null) { if(FormAsFile::importForm($recordFormName, $this->dbArray[$this->dbIndexQfq])) { throw new \UserFormException(json_encode([ ERROR_MESSAGE_TO_USER => 'Form file was changed.', -- GitLab From c2b35d31cfaa0dd2ebfafecf5893119f57c34b79 Mon Sep 17 00:00:00 2001 From: Marc Egger <marc.egger@uzh.ch> Date: Tue, 14 Jul 2020 18:16:23 +0200 Subject: [PATCH 028/195] Refs #10120 creating Form/FormElement added --- extension/Classes/Core/Form/FormAsFile.php | 2 +- extension/Classes/Core/QuickFormQuery.php | 14 +++++++++++++- 2 files changed, 14 insertions(+), 2 deletions(-) diff --git a/extension/Classes/Core/Form/FormAsFile.php b/extension/Classes/Core/Form/FormAsFile.php index 587fa07a4..00fb9a01c 100644 --- a/extension/Classes/Core/Form/FormAsFile.php +++ b/extension/Classes/Core/Form/FormAsFile.php @@ -7,7 +7,7 @@ use IMATHUZH\Qfq\Core\Database\Database; use IMATHUZH\Qfq\Core\Helper\HelperFile; use IMATHUZH\Qfq\Core\Helper\SqlQuery; -// TODO: test deleteing of Form and FormElement <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< +// TODO: test creating form and formElement // TODO: ensure that form file is imported if Form is loaded via Rest API // TODO: gibt es UPDATE/INSERT/DELETE statements die an Form/FormElement arbeiten koennen, die nicht nur durch doForm aufgerufen werden? // TODO: Testen: Dies sollte schon erfuellt sein, testen: bevor ein form/formelement im form editor gespeichert wird, soll es vom file geladen werden (Save.php). Falls das file importiert wurde, gibt es eine fehlermeldung. diff --git a/extension/Classes/Core/QuickFormQuery.php b/extension/Classes/Core/QuickFormQuery.php index 365364a7d..7ebca800d 100644 --- a/extension/Classes/Core/QuickFormQuery.php +++ b/extension/Classes/Core/QuickFormQuery.php @@ -425,6 +425,17 @@ class QuickFormQuery { // Make sure form file is writable (before DB changes are made) // Note: This can't be done earlier because $formModeNew might be changed in the lines above. $recordFormName = FormAsFile::formNameFromFormRelatedRecord($recordId, $this->formSpec[F_TABLE_NAME], $this->dbArray[$this->dbIndexQfq]); + if (FORM_SAVE === $formModeNew && intval($recordId) === 0) { + switch ($this->formSpec[F_TABLE_NAME]) { + case TABLE_NAME_FORM: // New Form is being created + $recordFormName = $this->store->getVar(F_NAME, STORE_FORM); + break; + case TABLE_NAME_FORM_ELEMENT: // New FormElement is being created + $formId = $this->store->getVar(FE_FORM_ID, STORE_FORM); + $recordFormName = FormAsFile::formNameFromFormRelatedRecord($formId, TABLE_NAME_FORM, $this->dbArray[$this->dbIndexQfq]); + break; + } + } if ($recordFormName !== null && in_array($formModeNew, [FORM_SAVE, FORM_DRAG_AND_DROP, FORM_DELETE])) { FormAsFile::enforceFormFileWritable($recordFormName); } @@ -628,7 +639,7 @@ class QuickFormQuery { } // export Form to file, if loaded record is a Form/FormElement - if ($recordFormName !== false) { + if ($recordFormName !== null) { switch ($formModeNew) { case FORM_SAVE: case FORM_DRAG_AND_DROP: @@ -640,6 +651,7 @@ class QuickFormQuery { } else { FormAsFile::deleteFormFile($recordFormName); } + break; } } -- GitLab From 9d966f75ca902125224e2b514b849cb2ca0a8425 Mon Sep 17 00:00:00 2001 From: Marc Egger <marc.egger@uzh.ch> Date: Wed, 15 Jul 2020 14:49:50 +0200 Subject: [PATCH 029/195] Refs #10120 allow form name change --- extension/Classes/Core/Form/FormAsFile.php | 18 +++++++++ extension/Classes/Core/QuickFormQuery.php | 44 +++++++++++++--------- 2 files changed, 45 insertions(+), 17 deletions(-) diff --git a/extension/Classes/Core/Form/FormAsFile.php b/extension/Classes/Core/Form/FormAsFile.php index 00fb9a01c..aaffd7a71 100644 --- a/extension/Classes/Core/Form/FormAsFile.php +++ b/extension/Classes/Core/Form/FormAsFile.php @@ -41,6 +41,24 @@ use IMATHUZH\Qfq\Core\Helper\SqlQuery; // TODO: DONT DO: add column import-modification-date to Form and FormElement and set them to the same as modification date in both exportForm and importForm. compare the two modification dates in the beginning. If the actual modification is after importModification and fileStats are the same in file and in form, then exportForm. // TODO: DONT DO: what to do if importModificationDate and fileStats have changed? > 1) export Form to new form file named <formName>mergeConflict_timestamp 2) importForm form file, overwrite DB +// TODO: TESTING + // new form => form file created + // form field change => changed in form file + // form name change => old form file deleted, new form file created + // form delete => form file deleted + + // form file not writeable => all the above abort before changes to DB are made + + // form element create => added to form file + // form element changed => changed in form file + // form element deleted => removed from form file + + // form file name changed => old form invalid, new form works + // form file parameter changed => changed in form editor + // form file form element added => added in form editor + // form file form element changed => changed in form editor + // form file form element removed => removed in form editor + ///////////////// JUST A TEST, DELETE ME! ////////////// // FormAsFile::exportForm($formName, $this->dbArray[$this->dbIndexQfq]); // FormAsFile::importForm($formName, $this->dbArray[$this->dbIndexQfq]); diff --git a/extension/Classes/Core/QuickFormQuery.php b/extension/Classes/Core/QuickFormQuery.php index 7ebca800d..6c3e9b72d 100644 --- a/extension/Classes/Core/QuickFormQuery.php +++ b/extension/Classes/Core/QuickFormQuery.php @@ -424,20 +424,25 @@ class QuickFormQuery { // Make sure form file is writable (before DB changes are made) // Note: This can't be done earlier because $formModeNew might be changed in the lines above. - $recordFormName = FormAsFile::formNameFromFormRelatedRecord($recordId, $this->formSpec[F_TABLE_NAME], $this->dbArray[$this->dbIndexQfq]); - if (FORM_SAVE === $formModeNew && intval($recordId) === 0) { - switch ($this->formSpec[F_TABLE_NAME]) { - case TABLE_NAME_FORM: // New Form is being created - $recordFormName = $this->store->getVar(F_NAME, STORE_FORM); - break; - case TABLE_NAME_FORM_ELEMENT: // New FormElement is being created - $formId = $this->store->getVar(FE_FORM_ID, STORE_FORM); - $recordFormName = FormAsFile::formNameFromFormRelatedRecord($formId, TABLE_NAME_FORM, $this->dbArray[$this->dbIndexQfq]); - break; - } + $formFileNameDB = FormAsFile::formNameFromFormRelatedRecord($recordId, $this->formSpec[F_TABLE_NAME], $this->dbArray[$this->dbIndexQfq]); + switch ($this->formSpec[F_TABLE_NAME]) { + case TABLE_NAME_FORM: // cases covered: new form, existing form, existing form but form name changed + $formFileName = $this->store->getVar(F_NAME, STORE_FORM, SANITIZE_ALLOW_ALNUMX); + $formFileName = $formFileName === false ? $formFileNameDB : $formFileName; + if ($formFileNameDB !== null && $formFileName !== $formFileNameDB && $formModeNew === FORM_SAVE) { + $formFileNameDelete = $formFileNameDB; + FormAsFile::enforceFormFileWritable($formFileNameDelete); // file will be deleted after DB changes + } + break; + case TABLE_NAME_FORM_ELEMENT: // cases covered: new formElement, existing formElement + $formId = $this->store->getVar(FE_FORM_ID, STORE_FORM); + $formFileName = $formId !== false ? FormAsFile::formNameFromFormRelatedRecord($formId, TABLE_NAME_FORM, $this->dbArray[$this->dbIndexQfq]) : $formFileNameDB; + break; + default: + $formFileName = $formFileNameDB; } - if ($recordFormName !== null && in_array($formModeNew, [FORM_SAVE, FORM_DRAG_AND_DROP, FORM_DELETE])) { - FormAsFile::enforceFormFileWritable($recordFormName); + if ($formFileName !== null && in_array($formModeNew, [FORM_SAVE, FORM_DRAG_AND_DROP, FORM_DELETE])) { + FormAsFile::enforceFormFileWritable($formFileName); } // For 'new' record always create a new Browser TAB-uniq (for this current form, nowhere else used) SIP. @@ -639,22 +644,27 @@ class QuickFormQuery { } // export Form to file, if loaded record is a Form/FormElement - if ($recordFormName !== null) { + if ($formFileName !== null) { switch ($formModeNew) { case FORM_SAVE: case FORM_DRAG_AND_DROP: - FormAsFile::exportForm($recordFormName, $this->dbArray[$this->dbIndexQfq]); + FormAsFile::exportForm($formFileName, $this->dbArray[$this->dbIndexQfq]); break; case FORM_DELETE: if (TABLE_NAME_FORM_ELEMENT === $this->formSpec[F_TABLE_NAME]) { - FormAsFile::exportForm($recordFormName, $this->dbArray[$this->dbIndexQfq]); + FormAsFile::exportForm($formFileName, $this->dbArray[$this->dbIndexQfq]); } else { - FormAsFile::deleteFormFile($recordFormName); + FormAsFile::deleteFormFile($formFileName); } break; } } + // delete old form file if form name was changed + if (isset($formFileNameDelete)) { + FormAsFile::deleteFormFile($formFileNameDelete); + } + return $data; } -- GitLab From 2541d843d6adb931f8d5dab3e8320c5995b127d4 Mon Sep 17 00:00:00 2001 From: Marc Egger <marc.egger@uzh.ch> Date: Wed, 15 Jul 2020 15:21:43 +0200 Subject: [PATCH 030/195] Refs #10120 update all forms when report operates on Form/FormElement. (unfinished) --- extension/Classes/Core/Form/FormAsFile.php | 86 ++++++++++++++++++++-- extension/Classes/Core/Helper/OnString.php | 19 +++++ extension/Classes/Core/Report/Report.php | 6 ++ 3 files changed, 106 insertions(+), 5 deletions(-) diff --git a/extension/Classes/Core/Form/FormAsFile.php b/extension/Classes/Core/Form/FormAsFile.php index aaffd7a71..173f8e87d 100644 --- a/extension/Classes/Core/Form/FormAsFile.php +++ b/extension/Classes/Core/Form/FormAsFile.php @@ -5,9 +5,10 @@ namespace IMATHUZH\Qfq\Core\Form; use IMATHUZH\Qfq\Core\Database\Database; use IMATHUZH\Qfq\Core\Helper\HelperFile; +use IMATHUZH\Qfq\Core\Helper\OnString; use IMATHUZH\Qfq\Core\Helper\SqlQuery; -// TODO: test creating form and formElement +// TODO: test form copying, does it create a form file? // TODO: ensure that form file is imported if Form is loaded via Rest API // TODO: gibt es UPDATE/INSERT/DELETE statements die an Form/FormElement arbeiten koennen, die nicht nur durch doForm aufgerufen werden? // TODO: Testen: Dies sollte schon erfuellt sein, testen: bevor ein form/formelement im form editor gespeichert wird, soll es vom file geladen werden (Save.php). Falls das file importiert wurde, gibt es eine fehlermeldung. @@ -347,6 +348,71 @@ class FormAsFile } } + /** + * Returns true if the sql query selects Form or FormElement table + * + * @param string $sql + * @return bool + */ + public static function isFormQuery(string $sql): bool + { + +// $sql = <<<END +// SELECT CONCAT('p:{{pageId:T}}&form=form&r=', f.id) as _pagee, f.id, f.name, f.title, f.tableName, CONCAT('form=form&r=', f.id) as _Paged FROM where +// FormFormElement,Form AS f ORDER BY f.name +// +// SELECT CONCAT('p:{{pageId:T}}&form=form&r=', f.id) as _pagee, f.id, f.name, f.title, f.tableName, CONCAT('form=form&r=', f.id) as _Paged From Order by Form AS f ORDER BY f.name +// +// SELECT CONCAT('p:{{pageId:T}}&form=form&r=', f.id) as _pagee, f.id, f.name, f.title, f.tableName, CONCAT('form=form&r=', f.id) as _Paged FRom having Form AS f ORDER BY f.name +// +// SELECT CONCAT('p:{{pageId:T}}&form=form&r=', f.id) as _pagee, f.id, f.name, f.title, f.tableName, CONCAT('form=form&r=', f.id) as _Paged from Form AS f ORDER BY f.name +//END; + + // find substrings whihch start with FROM and are followed by Form or FormElement + preg_match_all('/(?i)FROM(?-i)(.*?)\b(' . TABLE_NAME_FORM . '|' . TABLE_NAME_FORM_ELEMENT . ')\b/s', $sql, $matches); + + // Check if other keywords are in between FROM and the table name + $keywordsAfterFrom = ['WHERE', 'GROUP BY', 'HAVING', 'WINDOW', 'ORDER BY', 'LIMIT', 'FOR', 'INTO']; + foreach($matches[0] as $match) + { + if(!OnString::containsOneOfWords($keywordsAfterFrom, $match)) { + return true; + } + } + return false; + } + + /** + * Import all form files and delete forms in the DB for which there are not form files. + * + * @throws \UserFormException + */ + public static function updateAllForms(): void + { + + // if form dir does not exist, create it + // get content of form dir (flse => error) + // for each file check if it is json with pathinfo() + // does pathinfo always succeed? + // if a file is json, cut json away and use importForm() + + // get all forms from DB + // delete all forms which are in DB but not in files + + $files = scandir(self::formPath()); + $files = array_diff($files, array('.', '..')); + foreach ($files as $file) { + + } + + /////// DEBUG ///////// + throw new \UserFormException(json_encode([ + ERROR_MESSAGE_TO_USER => json_encode($files, JSON_PRETTY_PRINT), + ERROR_MESSAGE_TO_DEVELOPER => json_encode([], JSON_PRETTY_PRINT) + ])); +/////////////////////// + } + /** * Insert formElement to the given form. * Keys removed before insert: id, formId, feIdContainer @@ -453,16 +519,26 @@ class FormAsFile } // create form folder path - if (!is_dir(SYSTEM_FORM_FILE_PATH)) { - $success = mkdir(SYSTEM_FORM_FILE_PATH, 0777, true); + if (!is_dir(self::formPath())) { + $success = mkdir(self::formPath(), 0777, true); if ($success === false) { throw new \UserFormException(json_encode([ ERROR_MESSAGE_TO_USER => "Can't create form file path.", - ERROR_MESSAGE_TO_DEVELOPER => "Can't create path: " . SYSTEM_FORM_FILE_PATH]), + ERROR_MESSAGE_TO_DEVELOPER => "Can't create path: " . self::formPath()]), ERROR_IO_WRITE_FILE); } } - return HelperFile::correctRelativePathFileName(SYSTEM_FORM_FILE_PATH . '/' . $formName . ".json"); + return self::formPath() . '/' . $formName . ".json"; + } + + /** + * Return the path of the form directory relative to CWD + * + * @return string + */ + private static function formPath(): string + { + return HelperFile::correctRelativePathFileName(SYSTEM_FORM_FILE_PATH); } } \ No newline at end of file diff --git a/extension/Classes/Core/Helper/OnString.php b/extension/Classes/Core/Helper/OnString.php index b5fbec5f7..0f791de11 100644 --- a/extension/Classes/Core/Helper/OnString.php +++ b/extension/Classes/Core/Helper/OnString.php @@ -269,4 +269,23 @@ class OnString { return $form; } + + /** + * Returns true if the subject string contains any of the given words in targets. + * Case insensitive! + * + * @param array $words + * @param string $subject + * @return bool + */ + public static function containsOneOfWords(array $words, string $subject): bool + { + foreach($words as $word) + { + if (preg_match("/\b" . $word . "\b/i", $subject)) { + return true; + } + } + return false; + } } diff --git a/extension/Classes/Core/Report/Report.php b/extension/Classes/Core/Report/Report.php index dda49138a..e37b63300 100644 --- a/extension/Classes/Core/Report/Report.php +++ b/extension/Classes/Core/Report/Report.php @@ -25,6 +25,7 @@ namespace IMATHUZH\Qfq\Core\Report; use IMATHUZH\Qfq\Core\Database\Database; use IMATHUZH\Qfq\Core\Evaluate; +use IMATHUZH\Qfq\Core\Form\FormAsFile; use IMATHUZH\Qfq\Core\Helper\HelperFile; use IMATHUZH\Qfq\Core\Helper\KeyValueStringParser; use IMATHUZH\Qfq\Core\Helper\OnString; @@ -491,6 +492,11 @@ class Report { $this->store->setVar(SYSTEM_SQL_FINAL, $sql, STORE_SYSTEM); + // import form files if changed + if (FormAsFile::isFormQuery($sql)) { + FormAsFile::updateAllForms(); + } + //Execute SQL. All errors have been already catched. unset($result); $result = $this->db->sql($sql, ROW_KEYS, array(), '', $keys, $stat); -- GitLab From 3de494eae00f03cc64e01e5aa505a888dbcd9303 Mon Sep 17 00:00:00 2001 From: Marc Egger <marc.egger@uzh.ch> Date: Wed, 15 Jul 2020 16:41:39 +0200 Subject: [PATCH 031/195] Refs #10120 update all forms when report operates on Form/FormElement. (finished) --- extension/Classes/Core/Form/FormAsFile.php | 148 +++++++++++---------- extension/Classes/Core/Report/Report.php | 4 +- 2 files changed, 78 insertions(+), 74 deletions(-) diff --git a/extension/Classes/Core/Form/FormAsFile.php b/extension/Classes/Core/Form/FormAsFile.php index 173f8e87d..60a71f55e 100644 --- a/extension/Classes/Core/Form/FormAsFile.php +++ b/extension/Classes/Core/Form/FormAsFile.php @@ -31,35 +31,45 @@ use IMATHUZH\Qfq\Core\Helper\SqlQuery; // TODO: write tests (file test https://medium.com/weebly-engineering/phpunit-mocking-the-file-system-using-vfsstream-5d7d79b1eb2a) // TODO: maybe: update button in form list which removes forms from DB if their file was deleted // TODO: Carsten Fragen: add log messages somewhare? + // TODO: Tests: + // new form => form file created + // form field change => changed in form file + // form name change => old form file deleted, new form file created + // form delete => form file deleted + + // form file not writeable => all the above abort before changes to DB are made + + // form element create => added to form file + // form element changed => changed in form file + // form element deleted => removed from form file + + // form file name changed => old form invalid, new form works + // form file parameter changed => changed in form editor + // form file form element added => added in form editor + // form file form element changed => changed in form editor + // form file form element removed => removed in form editor // TODO: MAYBE // TODO: Maybe: solve reference by ID after file change Problem (might not be a big deal since it only happens on git pull) // Problem: FormEditor and form list might reference a form by an old id. In that case everything has to be reloaded. That's annoying. // Variant 1: reference form by name in edit and delete button, not by id (only solver part of the problem) // Variant 2: track old form ids and relay to new form automatically. Track old form ids in new Form column "oldIds" + // TODO: Make unittest for isFormQuery(). Example string: + //$sql = <<<END + //SELECT CONCAT('p:{{pageId:T}}&form=form&r=', f.id) as _pagee, f.id, f.name, f.title, f.tableName, CONCAT('form=form&r=', f.id) as _Paged FROM where + //FormFormElement,Form AS f ORDER BY f.name + // + //SELECT CONCAT('p:{{pageId:T}}&form=form&r=', f.id) as _pagee, f.id, f.name, f.title, f.tableName, CONCAT('form=form&r=', f.id) as _Paged From Order by Form AS f ORDER BY f.name + // + //SELECT CONCAT('p:{{pageId:T}}&form=form&r=', f.id) as _pagee, f.id, f.name, f.title, f.tableName, CONCAT('form=form&r=', f.id) as _Paged FRom having Form AS f ORDER BY f.name + // + //SELECT CONCAT('p:{{pageId:T}}&form=form&r=', f.id) as _pagee, f.id, f.name, f.title, f.tableName, CONCAT('form=form&r=', f.id) as _Paged from Form AS f ORDER BY f.name + //END; // TODO: DON'T DO // TODO: DONT DO: add column import-modification-date to Form and FormElement and set them to the same as modification date in both exportForm and importForm. compare the two modification dates in the beginning. If the actual modification is after importModification and fileStats are the same in file and in form, then exportForm. // TODO: DONT DO: what to do if importModificationDate and fileStats have changed? > 1) export Form to new form file named <formName>mergeConflict_timestamp 2) importForm form file, overwrite DB -// TODO: TESTING - // new form => form file created - // form field change => changed in form file - // form name change => old form file deleted, new form file created - // form delete => form file deleted - - // form file not writeable => all the above abort before changes to DB are made - - // form element create => added to form file - // form element changed => changed in form file - // form element deleted => removed from form file - - // form file name changed => old form invalid, new form works - // form file parameter changed => changed in form editor - // form file form element added => added in form editor - // form file form element changed => changed in form editor - // form file form element removed => removed in form editor - ///////////////// JUST A TEST, DELETE ME! ////////////// // FormAsFile::exportForm($formName, $this->dbArray[$this->dbIndexQfq]); // FormAsFile::importForm($formName, $this->dbArray[$this->dbIndexQfq]); @@ -103,12 +113,12 @@ class FormAsFile ERROR_MESSAGE_TO_DEVELOPER => "Form definition file not found or no permission to read file: '$pathFileName'"]), ERROR_FORM_NOT_FOUND); if(!file_exists($pathFileName)) { - self::deleteForm($formName, $database); + self::deleteFormDB($formName, $database); throw $fileReadException; } $fileStatsNew = self::formFileStatsJson($pathFileName); if ($fileStatsNew === false) { - self::deleteForm($formName, $database); + self::deleteFormDB($formName, $database); throw $fileReadException; } $F_ID = F_ID; // can't use constants in strings directly @@ -124,7 +134,7 @@ class FormAsFile // Read form file $fileContents = file_get_contents($pathFileName); if ($fileContents === false) { - self::deleteForm($formName, $database); + self::deleteFormDB($formName, $database); throw $fileReadException; } $formFromFile = json_decode($fileContents, true); @@ -132,7 +142,7 @@ class FormAsFile // Delete old form from DB if it exists if (array_key_exists(F_ID, $formFromDb)) { $formId = $formFromDb[$F_ID]; - self::deleteFormWithId($formId, $database); + self::deleteFormDBWithId($formId, $database); } // Insert new Form to DB (after filtering allowed columns and adding columns 'name' and 'fileStats') @@ -356,18 +366,6 @@ class FormAsFile */ public static function isFormQuery(string $sql): bool { - -// $sql = <<<END -// SELECT CONCAT('p:{{pageId:T}}&form=form&r=', f.id) as _pagee, f.id, f.name, f.title, f.tableName, CONCAT('form=form&r=', f.id) as _Paged FROM where -// FormFormElement,Form AS f ORDER BY f.name -// -// SELECT CONCAT('p:{{pageId:T}}&form=form&r=', f.id) as _pagee, f.id, f.name, f.title, f.tableName, CONCAT('form=form&r=', f.id) as _Paged From Order by Form AS f ORDER BY f.name -// -// SELECT CONCAT('p:{{pageId:T}}&form=form&r=', f.id) as _pagee, f.id, f.name, f.title, f.tableName, CONCAT('form=form&r=', f.id) as _Paged FRom having Form AS f ORDER BY f.name -// -// SELECT CONCAT('p:{{pageId:T}}&form=form&r=', f.id) as _pagee, f.id, f.name, f.title, f.tableName, CONCAT('form=form&r=', f.id) as _Paged from Form AS f ORDER BY f.name -//END; - // find substrings whihch start with FROM and are followed by Form or FormElement preg_match_all('/(?i)FROM(?-i)(.*?)\b(' . TABLE_NAME_FORM . '|' . TABLE_NAME_FORM_ELEMENT . ')\b/s', $sql, $matches); @@ -385,32 +383,38 @@ class FormAsFile /** * Import all form files and delete forms in the DB for which there are not form files. * + * @param Database $database + * @throws \CodeException + * @throws \DbException * @throws \UserFormException */ - public static function updateAllForms(): void + public static function updateAllForms(Database $database): void { - - // if form dir does not exist, create it - // get content of form dir (flse => error) - // for each file check if it is json with pathinfo() - // does pathinfo always succeed? - // if a file is json, cut json away and use importForm() - - // get all forms from DB - // delete all forms which are in DB but not in files - + // Import all form files $files = scandir(self::formPath()); - $files = array_diff($files, array('.', '..')); + if ($files === false) { + throw new \UserFormException(json_encode([ + ERROR_MESSAGE_TO_USER => "Reading directory failed.", + ERROR_MESSAGE_TO_DEVELOPER => "Can't read directory: " . self::formPath()]), + ERROR_IO_READ_FILE); + } + $formNamesFile = []; foreach ($files as $file) { - + $fileInfo = pathinfo($file); + if ($fileInfo['extension'] === 'json') { + $formNamesFile[] = $fileInfo['filename']; + self::importForm($fileInfo['filename'], $database); + } } - /////// DEBUG ///////// - throw new \UserFormException(json_encode([ - ERROR_MESSAGE_TO_USER => json_encode($files, JSON_PRETTY_PRINT), - ERROR_MESSAGE_TO_DEVELOPER => json_encode([], JSON_PRETTY_PRINT) - ])); -/////////////////////// + // Delete all forms which are in DB but not in files + $NAME = F_NAME; + $FORM = TABLE_NAME_FORM; + $formNamesDB = array_column($database->sql("SELECT `$NAME` FROM `$FORM` ", ROW_REGULAR), $NAME); + $formsToDelete = array_diff($formNamesDB, $formNamesFile); + foreach ($formsToDelete as $formToDelete) { + self::deleteFormDB($formToDelete, $database); + } } /** @@ -452,7 +456,7 @@ class FormAsFile * @throws \DbException * @throws \UserFormException */ - private static function deleteForm(string $formName, Database $database): void + private static function deleteFormDB(string $formName, Database $database): void { $F_ID = F_ID; // can't use constants in strings directly $F_NAME = F_NAME; // can't use constants in strings directly @@ -460,7 +464,7 @@ class FormAsFile $formFromDb = $database->sql("SELECT `$F_ID` FROM `$TABLE_NAME_FORM` AS f WHERE `f`.`$F_NAME` LIKE ? AND `f`.`deleted`='no'", ROW_EXPECT_0_1, [$formName], "Multiple forms with the same name: '$formName'"); if (array_key_exists(F_ID, $formFromDb)) { - self::deleteFormWithId($formFromDb[$F_ID], $database); + self::deleteFormDBWithId($formFromDb[$F_ID], $database); } } @@ -473,7 +477,7 @@ class FormAsFile * @throws \DbException * @throws \UserFormException */ - private static function deleteFormWithId(int $formId, Database $database): void + private static function deleteFormDBWithId(int $formId, Database $database): void { $F_ID = F_ID; // can't use constants in strings directly $TABLE_NAME_FORM = TABLE_NAME_FORM; // can't use constants in strings directly @@ -513,32 +517,32 @@ class FormAsFile // validate form name if (!HelperFile::isValidFileName($formName)) { throw new \UserFormException(json_encode([ - ERROR_MESSAGE_TO_USER => 'Invalid form name.', - ERROR_MESSAGE_TO_DEVELOPER => "Reading/Writing Form file failed: Form name '$formName' not valid. Name may only consist of alphanumeric characters and _ . -"]), + ERROR_MESSAGE_TO_USER => 'Reading/Writing Form file failed.', + ERROR_MESSAGE_TO_DEVELOPER => "Form name '$formName' not valid. Name may only consist of alphanumeric characters and _ . -"]), ERROR_FORM_INVALID_NAME); } - - // create form folder path - if (!is_dir(self::formPath())) { - $success = mkdir(self::formPath(), 0777, true); - if ($success === false) { - throw new \UserFormException(json_encode([ - ERROR_MESSAGE_TO_USER => "Can't create form file path.", - ERROR_MESSAGE_TO_DEVELOPER => "Can't create path: " . self::formPath()]), - ERROR_IO_WRITE_FILE); - } - } - return self::formPath() . '/' . $formName . ".json"; } /** - * Return the path of the form directory relative to CWD + * Return the path of the form directory relative to CWD. + * Create path if it doesn't exist. * * @return string + * @throws \UserFormException */ private static function formPath(): string { - return HelperFile::correctRelativePathFileName(SYSTEM_FORM_FILE_PATH); + $formPath = HelperFile::correctRelativePathFileName(SYSTEM_FORM_FILE_PATH); + if (!is_dir($formPath)) { + $success = mkdir($formPath, 0777, true); + if ($success === false) { + throw new \UserFormException(json_encode([ + ERROR_MESSAGE_TO_USER => "Can't create form file path.", + ERROR_MESSAGE_TO_DEVELOPER => "Can't create path: " . $formPath]), + ERROR_IO_WRITE_FILE); + } + } + return $formPath; } } \ No newline at end of file diff --git a/extension/Classes/Core/Report/Report.php b/extension/Classes/Core/Report/Report.php index e37b63300..436021798 100644 --- a/extension/Classes/Core/Report/Report.php +++ b/extension/Classes/Core/Report/Report.php @@ -492,9 +492,9 @@ class Report { $this->store->setVar(SYSTEM_SQL_FINAL, $sql, STORE_SYSTEM); - // import form files if changed + // import form files if changed + delete Forms without form file if (FormAsFile::isFormQuery($sql)) { - FormAsFile::updateAllForms(); + FormAsFile::updateAllForms($this->db); } //Execute SQL. All errors have been already catched. -- GitLab From a077893196f9c477ae3c90a3b4801e21f1ef7c55 Mon Sep 17 00:00:00 2001 From: Marc Egger <marc.egger@uzh.ch> Date: Wed, 15 Jul 2020 16:57:15 +0200 Subject: [PATCH 032/195] Refs #10120 add docstring --- extension/Classes/Core/Form/FormAsFile.php | 3 +++ 1 file changed, 3 insertions(+) diff --git a/extension/Classes/Core/Form/FormAsFile.php b/extension/Classes/Core/Form/FormAsFile.php index 60a71f55e..c0dd8ebfb 100644 --- a/extension/Classes/Core/Form/FormAsFile.php +++ b/extension/Classes/Core/Form/FormAsFile.php @@ -488,6 +488,9 @@ class FormAsFile } /** + * Return a selection of file stats as a JSON string which serves as a fingerprint of the file. + * If any one of the stats changed the file content was probably changed as well. + * * @param string $pathFileName * @return false|string */ -- GitLab From ae0483aba38a6c143650cdecec02d4234d279407 Mon Sep 17 00:00:00 2001 From: Marc Egger <marc.egger@uzh.ch> Date: Wed, 15 Jul 2020 17:48:57 +0200 Subject: [PATCH 033/195] Refs #10120 when form path is created, export all forms from DB --- extension/Classes/Core/Form/FormAsFile.php | 53 ++++++++++++++++------ extension/Classes/Core/QuickFormQuery.php | 8 ++-- 2 files changed, 42 insertions(+), 19 deletions(-) diff --git a/extension/Classes/Core/Form/FormAsFile.php b/extension/Classes/Core/Form/FormAsFile.php index c0dd8ebfb..feadffce6 100644 --- a/extension/Classes/Core/Form/FormAsFile.php +++ b/extension/Classes/Core/Form/FormAsFile.php @@ -107,7 +107,7 @@ class FormAsFile public static function importForm(string $formName, Database $database): bool { // Get file stats both from file system and DB and exit if they are equal - $pathFileName = self::formPathFileName($formName); + $pathFileName = self::formPathFileName($formName, $database); $fileReadException = new \UserFormException(json_encode([ ERROR_MESSAGE_TO_USER => "Form file not found or missing permission: " . baseName($pathFileName), ERROR_MESSAGE_TO_DEVELOPER => "Form definition file not found or no permission to read file: '$pathFileName'"]), @@ -244,7 +244,7 @@ class FormAsFile // write form as JSON to file $form[FORM_FILE_FORM_ELEMENT] = $formElements; $formJson = json_encode($form, JSON_PRETTY_PRINT); - $pathFileName = self::formPathFileName($formName); + $pathFileName = self::formPathFileName($formName, $database); $success = file_put_contents($pathFileName, $formJson); if ($success === false) { throw new \UserFormException(json_encode([ @@ -263,12 +263,15 @@ class FormAsFile * Deletes the form file for the given form. * * @param $formName + * @param Database $database + * @throws \CodeException + * @throws \DbException * @throws \UserFormException */ - public static function deleteFormFile($formName): void + public static function deleteFormFile($formName, Database $database): void { - self::enforceFormFileWritable($formName); - $pathFileName = self::formPathFileName($formName); + self::enforceFormFileWritable($formName, $database); + $pathFileName = self::formPathFileName($formName, $database); if(file_exists($pathFileName)) { unlink($pathFileName); } @@ -294,12 +297,15 @@ class FormAsFile * Throw exception if form file or form directory is not writeable. * * @param string $formName + * @param Database $database * @return void + * @throws \CodeException + * @throws \DbException * @throws \UserFormException */ - public static function enforceFormFileWritable(string $formName): void + public static function enforceFormFileWritable(string $formName, Database $database): void { - $pathFileName = self::formPathFileName($formName); + $pathFileName = self::formPathFileName($formName, $database); if (file_exists($pathFileName)) { if (!is_writable($pathFileName)) { throw new \UserFormException(json_encode([ @@ -391,11 +397,12 @@ class FormAsFile public static function updateAllForms(Database $database): void { // Import all form files - $files = scandir(self::formPath()); + $formPath = self::formPath($database); + $files = scandir($formPath); if ($files === false) { throw new \UserFormException(json_encode([ ERROR_MESSAGE_TO_USER => "Reading directory failed.", - ERROR_MESSAGE_TO_DEVELOPER => "Can't read directory: " . self::formPath()]), + ERROR_MESSAGE_TO_DEVELOPER => "Can't read directory: " . $formPath]), ERROR_IO_READ_FILE); } $formNamesFile = []; @@ -410,7 +417,7 @@ class FormAsFile // Delete all forms which are in DB but not in files $NAME = F_NAME; $FORM = TABLE_NAME_FORM; - $formNamesDB = array_column($database->sql("SELECT `$NAME` FROM `$FORM` ", ROW_REGULAR), $NAME); + $formNamesDB = array_column($database->sql("SELECT `$NAME` FROM `$FORM`", ROW_REGULAR), $NAME); $formsToDelete = array_diff($formNamesDB, $formNamesFile); foreach ($formsToDelete as $formToDelete) { self::deleteFormDB($formToDelete, $database); @@ -509,13 +516,16 @@ class FormAsFile /** * Return correct pathFileName of form file relative to current working directory. - * Create path if it doesn't exist. + * Create path if it doesn't exist and export all forms from DB. * * @param string $formName + * @param Database $database * @return string + * @throws \CodeException + * @throws \DbException * @throws \UserFormException */ - private static function formPathFileName(string $formName): string + private static function formPathFileName(string $formName, Database $database): string { // validate form name if (!HelperFile::isValidFileName($formName)) { @@ -524,20 +534,25 @@ class FormAsFile ERROR_MESSAGE_TO_DEVELOPER => "Form name '$formName' not valid. Name may only consist of alphanumeric characters and _ . -"]), ERROR_FORM_INVALID_NAME); } - return self::formPath() . '/' . $formName . ".json"; + return self::formPath($database) . '/' . $formName . ".json"; } /** * Return the path of the form directory relative to CWD. - * Create path if it doesn't exist. + * Create path if it doesn't exist and export all forms from DB. * + * @param Database $database * @return string + * @throws \CodeException + * @throws \DbException * @throws \UserFormException */ - private static function formPath(): string + private static function formPath(Database $database): string { $formPath = HelperFile::correctRelativePathFileName(SYSTEM_FORM_FILE_PATH); if (!is_dir($formPath)) { + + // create path $success = mkdir($formPath, 0777, true); if ($success === false) { throw new \UserFormException(json_encode([ @@ -545,6 +560,14 @@ class FormAsFile ERROR_MESSAGE_TO_DEVELOPER => "Can't create path: " . $formPath]), ERROR_IO_WRITE_FILE); } + + // export all forms + $NAME = F_NAME; + $FORM = TABLE_NAME_FORM; + $formNamesDB = array_column($database->sql("SELECT `$NAME` FROM `$FORM`", ROW_REGULAR), $NAME); + foreach ($formNamesDB as $formNameDB) { + self::exportForm($formNameDB, $database); + } } return $formPath; } diff --git a/extension/Classes/Core/QuickFormQuery.php b/extension/Classes/Core/QuickFormQuery.php index 6c3e9b72d..5d505b8c2 100644 --- a/extension/Classes/Core/QuickFormQuery.php +++ b/extension/Classes/Core/QuickFormQuery.php @@ -431,7 +431,7 @@ class QuickFormQuery { $formFileName = $formFileName === false ? $formFileNameDB : $formFileName; if ($formFileNameDB !== null && $formFileName !== $formFileNameDB && $formModeNew === FORM_SAVE) { $formFileNameDelete = $formFileNameDB; - FormAsFile::enforceFormFileWritable($formFileNameDelete); // file will be deleted after DB changes + FormAsFile::enforceFormFileWritable($formFileNameDelete, $this->dbArray[$this->dbIndexQfq]); // file will be deleted after DB changes } break; case TABLE_NAME_FORM_ELEMENT: // cases covered: new formElement, existing formElement @@ -442,7 +442,7 @@ class QuickFormQuery { $formFileName = $formFileNameDB; } if ($formFileName !== null && in_array($formModeNew, [FORM_SAVE, FORM_DRAG_AND_DROP, FORM_DELETE])) { - FormAsFile::enforceFormFileWritable($formFileName); + FormAsFile::enforceFormFileWritable($formFileName, $this->dbArray[$this->dbIndexQfq]); } // For 'new' record always create a new Browser TAB-uniq (for this current form, nowhere else used) SIP. @@ -654,7 +654,7 @@ class QuickFormQuery { if (TABLE_NAME_FORM_ELEMENT === $this->formSpec[F_TABLE_NAME]) { FormAsFile::exportForm($formFileName, $this->dbArray[$this->dbIndexQfq]); } else { - FormAsFile::deleteFormFile($formFileName); + FormAsFile::deleteFormFile($formFileName, $this->dbArray[$this->dbIndexQfq]); } break; } @@ -662,7 +662,7 @@ class QuickFormQuery { // delete old form file if form name was changed if (isset($formFileNameDelete)) { - FormAsFile::deleteFormFile($formFileNameDelete); + FormAsFile::deleteFormFile($formFileNameDelete, $this->dbArray[$this->dbIndexQfq]); } return $data; -- GitLab From ce1a38714b64291965ea4807384c5ad3854bc8cf Mon Sep 17 00:00:00 2001 From: Marc Egger <marc.egger@uzh.ch> Date: Wed, 15 Jul 2020 18:16:27 +0200 Subject: [PATCH 034/195] Refs #10120 add column fileStats to Form Table definition --- extension/Classes/Core/Form/FormAsFile.php | 1 + extension/Classes/Sql/formEditor.sql | 1 + 2 files changed, 2 insertions(+) diff --git a/extension/Classes/Core/Form/FormAsFile.php b/extension/Classes/Core/Form/FormAsFile.php index feadffce6..35ba4bd5f 100644 --- a/extension/Classes/Core/Form/FormAsFile.php +++ b/extension/Classes/Core/Form/FormAsFile.php @@ -18,6 +18,7 @@ use IMATHUZH\Qfq\Core\Helper\SqlQuery; // TODO: form list Report: when form list report is loaded, load new form files into DB and delete removed forms from DB // TODO: Carsten Fragen: Form backups erstellen vor deleteFormFile und exportForm? // TODO: Carsten Fragen: "git rm" anstatt "rm" benutzen falls ordner ein git repo? Einziger unterschied: macht "git add" +// TODO: Carsten Fragen: Form Copy ist broken. Aber jetzt auch unnötig, da man einfach die files kopieren kann. // TODO: BEFOORE PRUDUCTION // TODO: add Exception hint as hint instead of in main message? diff --git a/extension/Classes/Sql/formEditor.sql b/extension/Classes/Sql/formEditor.sql index 5b28fdde7..eb2ac5ad9 100644 --- a/extension/Classes/Sql/formEditor.sql +++ b/extension/Classes/Sql/formEditor.sql @@ -45,6 +45,7 @@ CREATE TABLE IF NOT EXISTS `Form` `deleted` ENUM ('yes', 'no') NOT NULL DEFAULT 'no', `modified` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, `created` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, + `fileStats` VARCHAR(255) NOT NULL DEFAULT '', PRIMARY KEY (`id`), KEY `name` (`name`), -- GitLab From 802ef88d8cd7b0feda094f5d566e1229939417c1 Mon Sep 17 00:00:00 2001 From: Marc Egger <marc.egger@uzh.ch> Date: Thu, 16 Jul 2020 12:33:13 +0200 Subject: [PATCH 035/195] Refs #10120 export forms after all UPDATE statements which are not called by doForm() --- .../Classes/Core/Database/DatabaseUpdate.php | 6 + extension/Classes/Core/Form/DragAndDrop.php | 9 ++ extension/Classes/Core/Form/FormAsFile.php | 119 ++++++++++++++---- extension/Classes/Core/QuickFormQuery.php | 22 ++-- extension/Classes/Core/Report/Report.php | 2 +- 5 files changed, 120 insertions(+), 38 deletions(-) diff --git a/extension/Classes/Core/Database/DatabaseUpdate.php b/extension/Classes/Core/Database/DatabaseUpdate.php index 561bd351c..0ca219971 100644 --- a/extension/Classes/Core/Database/DatabaseUpdate.php +++ b/extension/Classes/Core/Database/DatabaseUpdate.php @@ -8,6 +8,7 @@ namespace IMATHUZH\Qfq\Core\Database; +use IMATHUZH\Qfq\Core\Form\FormAsFile; use IMATHUZH\Qfq\Core\Helper\Logger; use IMATHUZH\Qfq\Core\Store\Store; use IMATHUZH\Qfq\Core\Typo3\T3Handler; @@ -143,6 +144,8 @@ class DatabaseUpdate { if ($dbUpdate === SYSTEM_DB_UPDATE_ALWAYS || ($dbUpdate === SYSTEM_DB_UPDATE_AUTO && $new != $old)) { + FormAsFile::importAllForms($this->db, true); + $newFunctionHash = $this->updateSqlFunctions($versionInfo[QFQ_VERSION_KEY_FUNCTION_HASH] ?? ''); if (null !== $newFunctionHash) { $versionInfo[QFQ_VERSION_KEY_FUNCTION_HASH] = $newFunctionHash; @@ -158,6 +161,8 @@ class DatabaseUpdate { // Finally write the latest version number. $versionInfo[QFQ_VERSION_KEY] = $new; $this->setDatabaseVersion($versionInfo); + + FormAsFIle::exportAllForms($this->db); } if ($old === false) { @@ -167,6 +172,7 @@ class DatabaseUpdate { if (version_compare($old, '19.9.0') === -1) { $this->updateSpecialColumns(); + FormAsFIle::exportAllForms($this->db); } } diff --git a/extension/Classes/Core/Form/DragAndDrop.php b/extension/Classes/Core/Form/DragAndDrop.php index 7c9799c27..2d4cca66a 100644 --- a/extension/Classes/Core/Form/DragAndDrop.php +++ b/extension/Classes/Core/Form/DragAndDrop.php @@ -204,8 +204,17 @@ class DragAndDrop { return $data; } + // Import Form from file if loaded record is Form/FormElement (If form file was changed, throw exception) + // Note: This is here since this code is called outside QuickFormQuery->doForm + $formFileName = FormAsFile::importFormRecordId($id, $tableName, $this->db); + $this->db->sql("UPDATE `$tableName` SET `$orderColumn`=? WHERE `id`=?", ROW_REGULAR, [$ordNew, $id]); + // Export Form file + if ($formFileName !== null) { + FormAsFile::exportForm($formFileName, $this->db); + } + // Converting to string is necessary: JSON detects int else. $data[API_ELEMENT_UPDATE][DND_ORD_HTML_ID_PREFIX . $id][API_ELEMENT_CONTENT] = (string)$ordNew; diff --git a/extension/Classes/Core/Form/FormAsFile.php b/extension/Classes/Core/Form/FormAsFile.php index 35ba4bd5f..48fc810e2 100644 --- a/extension/Classes/Core/Form/FormAsFile.php +++ b/extension/Classes/Core/Form/FormAsFile.php @@ -8,17 +8,22 @@ use IMATHUZH\Qfq\Core\Helper\HelperFile; use IMATHUZH\Qfq\Core\Helper\OnString; use IMATHUZH\Qfq\Core\Helper\SqlQuery; -// TODO: test form copying, does it create a form file? -// TODO: ensure that form file is imported if Form is loaded via Rest API +// TODO: queryFormNames is executed before Form table exists. Add error to sql and make sure this does not happen in DatabaseUpdate.php // TODO: gibt es UPDATE/INSERT/DELETE statements die an Form/FormElement arbeiten koennen, die nicht nur durch doForm aufgerufen werden? + // + +// TODO: Testen: QFQ komplett neu installiert => form dir existiert mit allen form files aktuell. QFQ neu installation mit existierenden forms => alte forms sind noch da. QFQ update => alte forms noch da, updates an FormEditor ersichtlich // TODO: Testen: Dies sollte schon erfuellt sein, testen: bevor ein form/formelement im form editor gespeichert wird, soll es vom file geladen werden (Save.php). Falls das file importiert wurde, gibt es eine fehlermeldung. // TODO: Testen: anfrage nach dirty, form file ueberpruefen (importieren) // TODO: Testen: Dirty tabelle ist aussergewoehnlich voll. werden die records nicht abgeraeumt wegen formAsFile? // TODO: Testen: ausporbieren was passiert wenn ich in Form-Editor auf speicher druecke nachdem ich in einem anderen tab das geanderte form file in die DB lade. -// TODO: form list Report: when form list report is loaded, load new form files into DB and delete removed forms from DB +// TODO: Testen: importAllForms() wird nur ausgefuehrt, wenn der Report Form/FormElement aufruft // TODO: Carsten Fragen: Form backups erstellen vor deleteFormFile und exportForm? // TODO: Carsten Fragen: "git rm" anstatt "rm" benutzen falls ordner ein git repo? Einziger unterschied: macht "git add" // TODO: Carsten Fragen: Form Copy ist broken. Aber jetzt auch unnötig, da man einfach die files kopieren kann. +// TODO: Carsten Fragen: Koennte die column "lastImport" zu Form hinzufuegen. Dieser wird dann manuell zusammen mit "changed" beim import und export gesetzt. Mittels Left Join query mit den created columns von FormElement koennte man in importForm() feststellen, ob sich ein form geaendert hat und dieses expotieren, falls der fingerabdruck des files noch gleich ist. +// TODO: Carsten Fragen: QFQ formulare haben id unter 1000 und user forms ueber 1000. Wird ein QFQ formular neu importiert, erhaelt es aber eine id ueber 1000. ist dies ein problem? +// TODO: Carsten Fragen: ZUERST NOCHMAL GENAU NACHTEILE PRUEFEN: In doForm koennte man auch einfach pauschal importAllForms(enforce writeable=true) und exportAllForms() machen, wenn der geladene record ein Form/Formelement ist. Bei vielen forms koennte es langsam sein. ansonsten sehe ich gerade keine klaren nachteile. // TODO: BEFOORE PRUDUCTION // TODO: add Exception hint as hint instead of in main message? @@ -26,7 +31,7 @@ use IMATHUZH\Qfq\Core\Helper\SqlQuery; // TODO: remove DEBUG blocks // TODO: Form-Editor form name einschraenken auf eindeutige und valide file names // TODO: Form-Editor anpassen: container name muessen eindeutig sein. - // TODO: add fileStats column to Form schema + // TODO: add fileStats column to Form schema and to DatabaseUpdateData.php. Actually formEditor.sql is run in DatabaseUpdate.php after the DatabaseUpdateData.php changes are executed. So is this neccessary? (ASK Carsten) // TODO: move Constants to Constants.php if this file is actually used // TODO: extract all sql queries and make them reusable // TODO: write tests (file test https://medium.com/weebly-engineering/phpunit-mocking-the-file-system-using-vfsstream-5d7d79b1eb2a) @@ -50,6 +55,8 @@ use IMATHUZH\Qfq\Core\Helper\SqlQuery; // form file form element changed => changed in form editor // form file form element removed => removed in form editor + // form folder does not exist but formEditor is opened => form folder is created, all forms exported + // TODO: MAYBE // TODO: Maybe: solve reference by ID after file change Problem (might not be a big deal since it only happens on git pull) // Problem: FormEditor and form list might reference a form by an old id. In that case everything has to be reloaded. That's annoying. @@ -182,9 +189,10 @@ class FormAsFile /** * Reads the form from the DB and saves it in the form folder as a form file. - * If the form file path does not exist, it is created. - * Updates column fileStats with new stats from new file. + * Warning: Overwrites form file without any checks or warning. + * If the form file path does not exist, it is created and all forms are exported. * + * FileStats: After the export the column "fileStats" is updated with new stats from new file. * Container FormElements: The form file uses names instead if ids to reference containers. These references are translated before saving the file. * Ignored columns: The columns 'id', 'name' (only Form table), 'fileStats', 'formId', 'feIdContainer' are not saved in the file. * FormElement order: The formElements are ordered by the 'ord' column before writing them to the file. @@ -260,6 +268,34 @@ class FormAsFile $database->sql($sql, ROW_REGULAR, $parameterArray); } + /** + * Import Form from file if loaded record is Form/FormElement. + * If form file was changed, import it and throw exception. + * If form file is not writeable, throw exception. + * + * @param int $recordId + * @param string $tableName + * @param Database $database + * @return string|null formName|null + * @throws \CodeException + * @throws \DbException + * @throws \UserFormException + */ + public static function importFormRecordId(int $recordId, string $tableName, Database $database): ?string + { + $recordFormName = self::formNameFromFormRelatedRecord($recordId, $tableName, $database); + if ($recordFormName !== null) { + if(self::importForm($recordFormName, $database)) { + throw new \UserFormException(json_encode([ + ERROR_MESSAGE_TO_USER => 'Form file was changed.', + ERROR_MESSAGE_TO_DEVELOPER => "Form definition file has been changed. Please close tab and reload the form list and Form-Editor from scratch."]), + ERROR_FORM_NOT_FOUND); + } + } + self::enforceFormFileWritable($recordFormName, $database); + return $recordFormName; + } + /** * Deletes the form file for the given form. * @@ -274,7 +310,13 @@ class FormAsFile self::enforceFormFileWritable($formName, $database); $pathFileName = self::formPathFileName($formName, $database); if(file_exists($pathFileName)) { - unlink($pathFileName); + $success = unlink($pathFileName); + if ($success === false) { + throw new \UserFormException(json_encode([ + ERROR_MESSAGE_TO_USER => "Deleting form file failed: " . baseName($pathFileName), + ERROR_MESSAGE_TO_DEVELOPER => "Can't delete form file '$pathFileName'"]), + ERROR_IO_WRITE_FILE); + } } } @@ -388,14 +430,15 @@ class FormAsFile } /** - * Import all form files and delete forms in the DB for which there are not form files. + * Import all form files and DELETE forms in the DB for which there are not form files. * * @param Database $database + * @param bool $enforceWritable * @throws \CodeException * @throws \DbException * @throws \UserFormException */ - public static function updateAllForms(Database $database): void + public static function importAllForms(Database $database, bool $enforceWritable = false): void { // Import all form files $formPath = self::formPath($database); @@ -406,25 +449,46 @@ class FormAsFile ERROR_MESSAGE_TO_DEVELOPER => "Can't read directory: " . $formPath]), ERROR_IO_READ_FILE); } - $formNamesFile = []; + $formFileNames = []; foreach ($files as $file) { $fileInfo = pathinfo($file); if ($fileInfo['extension'] === 'json') { - $formNamesFile[] = $fileInfo['filename']; - self::importForm($fileInfo['filename'], $database); + $fileName = $fileInfo['filename']; + $formFileNames[] = $fileName; + self::importForm($fileName, $database); + if ($enforceWritable) { + self::enforceFormFileWritable($fileName, $database); + } } } // Delete all forms which are in DB but not in files - $NAME = F_NAME; - $FORM = TABLE_NAME_FORM; - $formNamesDB = array_column($database->sql("SELECT `$NAME` FROM `$FORM`", ROW_REGULAR), $NAME); - $formsToDelete = array_diff($formNamesDB, $formNamesFile); + $formNamesDB = self::queryAllFormNames($database); + $formsToDelete = array_diff($formNamesDB, $formFileNames); foreach ($formsToDelete as $formToDelete) { self::deleteFormDB($formToDelete, $database); } } + /** + * Export all forms in database to form files. + * Warning: This overwrites form files without any checks or warning. Use cautiously. + * + * Note: Does not delete form files if the corresponding forms are not present in the database. + * + * @param Database $database + * @throws \CodeException + * @throws \DbException + * @throws \UserFormException + */ + public static function exportAllForms(Database $database): void + { + $formNamesDB = self::queryAllFormNames($database); + foreach ($formNamesDB as $formNameDB) { + self::exportForm($formNameDB, $database); + } + } + /** * Insert formElement to the given form. * Keys removed before insert: id, formId, feIdContainer @@ -563,13 +627,24 @@ class FormAsFile } // export all forms - $NAME = F_NAME; - $FORM = TABLE_NAME_FORM; - $formNamesDB = array_column($database->sql("SELECT `$NAME` FROM `$FORM`", ROW_REGULAR), $NAME); - foreach ($formNamesDB as $formNameDB) { - self::exportForm($formNameDB, $database); - } + self::exportAllForms($database); } return $formPath; } + + /** + * Return array of all form names in the Form table. + * + * @param Database $database + * @return array [formName] + * @throws \CodeException + * @throws \DbException + * @throws \UserFormException + */ + private static function queryAllFormNames(Database $database): array + { + $NAME = F_NAME; + $FORM = TABLE_NAME_FORM; + return array_column($database->sql("SELECT `$NAME` FROM `$FORM`", ROW_REGULAR), $NAME); + } } \ No newline at end of file diff --git a/extension/Classes/Core/QuickFormQuery.php b/extension/Classes/Core/QuickFormQuery.php index 5d505b8c2..a22a3f86a 100644 --- a/extension/Classes/Core/QuickFormQuery.php +++ b/extension/Classes/Core/QuickFormQuery.php @@ -424,22 +424,22 @@ class QuickFormQuery { // Make sure form file is writable (before DB changes are made) // Note: This can't be done earlier because $formModeNew might be changed in the lines above. - $formFileNameDB = FormAsFile::formNameFromFormRelatedRecord($recordId, $this->formSpec[F_TABLE_NAME], $this->dbArray[$this->dbIndexQfq]); + $formNameDB = FormAsFile::formNameFromFormRelatedRecord($recordId, $this->formSpec[F_TABLE_NAME], $this->dbArray[$this->dbIndexQfq]); switch ($this->formSpec[F_TABLE_NAME]) { case TABLE_NAME_FORM: // cases covered: new form, existing form, existing form but form name changed $formFileName = $this->store->getVar(F_NAME, STORE_FORM, SANITIZE_ALLOW_ALNUMX); - $formFileName = $formFileName === false ? $formFileNameDB : $formFileName; - if ($formFileNameDB !== null && $formFileName !== $formFileNameDB && $formModeNew === FORM_SAVE) { - $formFileNameDelete = $formFileNameDB; + $formFileName = $formFileName === false ? $formNameDB : $formFileName; + if ($formNameDB !== null && $formFileName !== $formNameDB && $formModeNew === FORM_SAVE) { + $formFileNameDelete = $formNameDB; FormAsFile::enforceFormFileWritable($formFileNameDelete, $this->dbArray[$this->dbIndexQfq]); // file will be deleted after DB changes } break; case TABLE_NAME_FORM_ELEMENT: // cases covered: new formElement, existing formElement $formId = $this->store->getVar(FE_FORM_ID, STORE_FORM); - $formFileName = $formId !== false ? FormAsFile::formNameFromFormRelatedRecord($formId, TABLE_NAME_FORM, $this->dbArray[$this->dbIndexQfq]) : $formFileNameDB; + $formFileName = $formId !== false ? FormAsFile::formNameFromFormRelatedRecord($formId, TABLE_NAME_FORM, $this->dbArray[$this->dbIndexQfq]) : $formNameDB; break; default: - $formFileName = $formFileNameDB; + $formFileName = $formNameDB; } if ($formFileName !== null && in_array($formModeNew, [FORM_SAVE, FORM_DRAG_AND_DROP, FORM_DELETE])) { FormAsFile::enforceFormFileWritable($formFileName, $this->dbArray[$this->dbIndexQfq]); @@ -1052,15 +1052,7 @@ class QuickFormQuery { [$formName], 'Form "' . $formName . '" not found or multiple forms with the same name.'); // Import Form from file if loaded record is Form/FormElement (If form file was changed, throw exception) - $recordFormName = FormAsFile::formNameFromFormRelatedRecord($recordId, $form[F_TABLE_NAME], $this->dbArray[$this->dbIndexQfq]); - if ($recordFormName !== null) { - if(FormAsFile::importForm($recordFormName, $this->dbArray[$this->dbIndexQfq])) { - throw new \UserFormException(json_encode([ - ERROR_MESSAGE_TO_USER => 'Form file was changed.', - ERROR_MESSAGE_TO_DEVELOPER => "Form definition file has been changed. Please close tab and reload the form list and Form-Editor from scratch."]), - ERROR_FORM_NOT_FOUND); - } - } + FormAsFile::importFormRecordId($recordId, $form[F_TABLE_NAME], $this->dbArray[$this->dbIndexQfq]); $form = $this->checkFormLogMode($form); $form = $this->modeCleanFormConfig($mode, $form); diff --git a/extension/Classes/Core/Report/Report.php b/extension/Classes/Core/Report/Report.php index 436021798..ddd1c3f3e 100644 --- a/extension/Classes/Core/Report/Report.php +++ b/extension/Classes/Core/Report/Report.php @@ -494,7 +494,7 @@ class Report { // import form files if changed + delete Forms without form file if (FormAsFile::isFormQuery($sql)) { - FormAsFile::updateAllForms($this->db); + FormAsFile::importAllForms($this->db); } //Execute SQL. All errors have been already catched. -- GitLab From a32a7d3d2b8c9a45e75ea64cde527d95f6dae06c Mon Sep 17 00:00:00 2001 From: Marc Egger <marc.egger@uzh.ch> Date: Thu, 16 Jul 2020 16:14:32 +0200 Subject: [PATCH 036/195] Refs #10120 finetune export and import forms on Database update --- .../Classes/Core/Database/DatabaseUpdate.php | 14 +++- extension/Classes/Core/Form/FormAsFile.php | 82 ++++++++++++------- extension/Classes/Core/Report/Report.php | 2 +- 3 files changed, 67 insertions(+), 31 deletions(-) diff --git a/extension/Classes/Core/Database/DatabaseUpdate.php b/extension/Classes/Core/Database/DatabaseUpdate.php index 0ca219971..4e39c1166 100644 --- a/extension/Classes/Core/Database/DatabaseUpdate.php +++ b/extension/Classes/Core/Database/DatabaseUpdate.php @@ -144,7 +144,10 @@ class DatabaseUpdate { if ($dbUpdate === SYSTEM_DB_UPDATE_ALWAYS || ($dbUpdate === SYSTEM_DB_UPDATE_AUTO && $new != $old)) { - FormAsFile::importAllForms($this->db, true); + if ($old !== false) { + // Import files from form path. (Creates path and exports all forms to it, if it doesn't exist) + FormAsFile::importAllForms($this->db, true, true); + } $newFunctionHash = $this->updateSqlFunctions($versionInfo[QFQ_VERSION_KEY_FUNCTION_HASH] ?? ''); if (null !== $newFunctionHash) { @@ -162,7 +165,14 @@ class DatabaseUpdate { $versionInfo[QFQ_VERSION_KEY] = $new; $this->setDatabaseVersion($versionInfo); - FormAsFIle::exportAllForms($this->db); + if ($old === false) { + // new installation: export native forms + import existing user forms + FormAsFIle::exportAllForms($this->db, false); + FormAsFile::importAllForms($this->db); + } else { + // Export forms + delete files which were removed since the import above + FormAsFIle::exportAllForms($this->db, true); + } } if ($old === false) { diff --git a/extension/Classes/Core/Form/FormAsFile.php b/extension/Classes/Core/Form/FormAsFile.php index 48fc810e2..541f9fe6e 100644 --- a/extension/Classes/Core/Form/FormAsFile.php +++ b/extension/Classes/Core/Form/FormAsFile.php @@ -8,6 +8,7 @@ use IMATHUZH\Qfq\Core\Helper\HelperFile; use IMATHUZH\Qfq\Core\Helper\OnString; use IMATHUZH\Qfq\Core\Helper\SqlQuery; +// TODO: exportAllForms() mit deleteFiles true testen // TODO: queryFormNames is executed before Form table exists. Add error to sql and make sure this does not happen in DatabaseUpdate.php // TODO: gibt es UPDATE/INSERT/DELETE statements die an Form/FormElement arbeiten koennen, die nicht nur durch doForm aufgerufen werden? // @@ -430,43 +431,34 @@ class FormAsFile } /** - * Import all form files and DELETE forms in the DB for which there are not form files. + * Import all form files into the database. + * If the file folder does not exist, it is created and all forms from the DB are exported. * * @param Database $database - * @param bool $enforceWritable + * @param bool $enforceWritable Throw exception if one of the form files is not writable by current user. + * @param bool $deleteFromDB Delete forms from DB if there are no corresponding form files. * @throws \CodeException * @throws \DbException * @throws \UserFormException */ - public static function importAllForms(Database $database, bool $enforceWritable = false): void + public static function importAllForms(Database $database, bool $enforceWritable = false, bool $deleteFromDB = false): void { // Import all form files - $formPath = self::formPath($database); - $files = scandir($formPath); - if ($files === false) { - throw new \UserFormException(json_encode([ - ERROR_MESSAGE_TO_USER => "Reading directory failed.", - ERROR_MESSAGE_TO_DEVELOPER => "Can't read directory: " . $formPath]), - ERROR_IO_READ_FILE); - } - $formFileNames = []; - foreach ($files as $file) { - $fileInfo = pathinfo($file); - if ($fileInfo['extension'] === 'json') { - $fileName = $fileInfo['filename']; - $formFileNames[] = $fileName; - self::importForm($fileName, $database); - if ($enforceWritable) { - self::enforceFormFileWritable($fileName, $database); - } + $formFileNames = self::formFileNames($database); + foreach ($formFileNames as $formFileName) { + self::importForm($formFileName, $database); + if ($enforceWritable) { + self::enforceFormFileWritable($formFileName, $database); } } // Delete all forms which are in DB but not in files - $formNamesDB = self::queryAllFormNames($database); - $formsToDelete = array_diff($formNamesDB, $formFileNames); - foreach ($formsToDelete as $formToDelete) { - self::deleteFormDB($formToDelete, $database); + if ($deleteFromDB) { + $formNamesDB = self::queryAllFormNames($database); + $formsToDelete = array_diff($formNamesDB, $formFileNames); + foreach ($formsToDelete as $formToDelete) { + self::deleteFormDB($formToDelete, $database); + } } } @@ -474,19 +466,25 @@ class FormAsFile * Export all forms in database to form files. * Warning: This overwrites form files without any checks or warning. Use cautiously. * - * Note: Does not delete form files if the corresponding forms are not present in the database. - * * @param Database $database + * @param bool $deleteFiles Delete form files without a corresponding form record in the DB. * @throws \CodeException * @throws \DbException * @throws \UserFormException */ - public static function exportAllForms(Database $database): void + public static function exportAllForms(Database $database, bool $deleteFiles = false): void { $formNamesDB = self::queryAllFormNames($database); foreach ($formNamesDB as $formNameDB) { self::exportForm($formNameDB, $database); } + if ($deleteFiles) { + $formFileNames = self::formFileNames($database); + $filesToDelete = array_diff($formFileNames, $formNamesDB); + foreach ($filesToDelete as $fileToDelete) { + self::deleteFormFile($fileToDelete, $database); + } + } } /** @@ -647,4 +645,32 @@ class FormAsFile $FORM = TABLE_NAME_FORM; return array_column($database->sql("SELECT `$NAME` FROM `$FORM`", ROW_REGULAR), $NAME); } + + /** + * Return list of form file names contained in the form path (without suffix). + * + * @param Database $database + * @return array|false + * @throws \CodeException + * @throws \DbException + * @throws \UserFormException + */ + private static function formFileNames(Database $database): array + { + $formPath = self::formPath($database); + $files = scandir($formPath); + if ($files === false) { + throw new \UserFormException(json_encode([ + ERROR_MESSAGE_TO_USER => "Reading directory failed.", + ERROR_MESSAGE_TO_DEVELOPER => "Can't read directory: " . $formPath]), + ERROR_IO_READ_FILE); + } + return $jsonFileNames = array_reduce($files, function ($result, $file) { + $fileInfo = pathinfo($file); + if ($fileInfo['extension'] === 'json') { + $result[] = $fileInfo['filename']; + } + return $result; + }, []); + } } \ No newline at end of file diff --git a/extension/Classes/Core/Report/Report.php b/extension/Classes/Core/Report/Report.php index ddd1c3f3e..2fa12ade7 100644 --- a/extension/Classes/Core/Report/Report.php +++ b/extension/Classes/Core/Report/Report.php @@ -494,7 +494,7 @@ class Report { // import form files if changed + delete Forms without form file if (FormAsFile::isFormQuery($sql)) { - FormAsFile::importAllForms($this->db); + FormAsFile::importAllForms($this->db, false, true); } //Execute SQL. All errors have been already catched. -- GitLab From 2e7081ee9a91c99630fd67f84f47cad02ab6041e Mon Sep 17 00:00:00 2001 From: Marc Egger <marc.egger@uzh.ch> Date: Thu, 16 Jul 2020 17:34:58 +0200 Subject: [PATCH 037/195] Refs #10120 finished checking for UPDATE/INSERT/DELETE statements which could operate on Form/FormElement --- extension/Classes/Core/Form/FormAsFile.php | 11 ++++------- 1 file changed, 4 insertions(+), 7 deletions(-) diff --git a/extension/Classes/Core/Form/FormAsFile.php b/extension/Classes/Core/Form/FormAsFile.php index 541f9fe6e..431f02de8 100644 --- a/extension/Classes/Core/Form/FormAsFile.php +++ b/extension/Classes/Core/Form/FormAsFile.php @@ -9,16 +9,13 @@ use IMATHUZH\Qfq\Core\Helper\OnString; use IMATHUZH\Qfq\Core\Helper\SqlQuery; // TODO: exportAllForms() mit deleteFiles true testen -// TODO: queryFormNames is executed before Form table exists. Add error to sql and make sure this does not happen in DatabaseUpdate.php -// TODO: gibt es UPDATE/INSERT/DELETE statements die an Form/FormElement arbeiten koennen, die nicht nur durch doForm aufgerufen werden? - // - // TODO: Testen: QFQ komplett neu installiert => form dir existiert mit allen form files aktuell. QFQ neu installation mit existierenden forms => alte forms sind noch da. QFQ update => alte forms noch da, updates an FormEditor ersichtlich // TODO: Testen: Dies sollte schon erfuellt sein, testen: bevor ein form/formelement im form editor gespeichert wird, soll es vom file geladen werden (Save.php). Falls das file importiert wurde, gibt es eine fehlermeldung. // TODO: Testen: anfrage nach dirty, form file ueberpruefen (importieren) // TODO: Testen: Dirty tabelle ist aussergewoehnlich voll. werden die records nicht abgeraeumt wegen formAsFile? // TODO: Testen: ausporbieren was passiert wenn ich in Form-Editor auf speicher druecke nachdem ich in einem anderen tab das geanderte form file in die DB lade. // TODO: Testen: importAllForms() wird nur ausgefuehrt, wenn der Report Form/FormElement aufruft +// TODO: Fix all broken tests... one easy solution? // TODO: Carsten Fragen: Form backups erstellen vor deleteFormFile und exportForm? // TODO: Carsten Fragen: "git rm" anstatt "rm" benutzen falls ordner ein git repo? Einziger unterschied: macht "git add" // TODO: Carsten Fragen: Form Copy ist broken. Aber jetzt auch unnötig, da man einfach die files kopieren kann. @@ -419,7 +416,7 @@ class FormAsFile // find substrings whihch start with FROM and are followed by Form or FormElement preg_match_all('/(?i)FROM(?-i)(.*?)\b(' . TABLE_NAME_FORM . '|' . TABLE_NAME_FORM_ELEMENT . ')\b/s', $sql, $matches); - // Check if other keywords are in between FROM and the table name + // Check if no other SQL keywords are in between FROM and the table name $keywordsAfterFrom = ['WHERE', 'GROUP BY', 'HAVING', 'WINDOW', 'ORDER BY', 'LIMIT', 'FOR', 'INTO']; foreach($matches[0] as $match) { @@ -647,10 +644,10 @@ class FormAsFile } /** - * Return list of form file names contained in the form path (without suffix). + * Return array of form file names contained in the form path (without suffix). * * @param Database $database - * @return array|false + * @return array|false [formName] * @throws \CodeException * @throws \DbException * @throws \UserFormException -- GitLab From 97501ec009cebac784808647654398172c618ff0 Mon Sep 17 00:00:00 2001 From: Marc Egger <marc.egger@uzh.ch> Date: Mon, 20 Jul 2020 17:13:46 +0200 Subject: [PATCH 038/195] Refs #10120 import form on request Dirty & delete stale formElements as a precaution --- extension/Classes/Core/Form/Dirty.php | 15 ++++++----- extension/Classes/Core/Form/FormAsFile.php | 29 +++++++++++++++++++--- 2 files changed, 34 insertions(+), 10 deletions(-) diff --git a/extension/Classes/Core/Form/Dirty.php b/extension/Classes/Core/Form/Dirty.php index e8c829924..86196450e 100644 --- a/extension/Classes/Core/Form/Dirty.php +++ b/extension/Classes/Core/Form/Dirty.php @@ -113,18 +113,21 @@ class Dirty { throw new \CodeException("Missing 'form' in SIP. There might be something broken.", ERROR_DIRTY_MISSING_FORM_IN_SIP); } + // Connect to Database + $this->store = Store::getInstance(); + $this->dbIndexQfq = $this->store->getVar(SYSTEM_DB_INDEX_QFQ, STORE_SYSTEM); + $this->dbIndexData = empty($sipVars[PARAM_DB_INDEX_DATA]) ? $this->store->getVar(SYSTEM_DB_INDEX_DATA, STORE_SYSTEM) : $sipVars[PARAM_DB_INDEX_DATA]; + $this->doDbArray($this->dbIndexData, $this->dbIndexQfq); + + // import form file. If it was changed, throw exception. + FormAsFile::importForm($sipVars[SIP_FORM], $this->dbArray[$this->dbIndexQfq]); + $recordId = empty($sipVars[SIP_RECORD_ID]) ? 0 : $sipVars[SIP_RECORD_ID]; if ($recordId == 0) { // For r=0 (new) , 'dirty' will always succeed. return [API_STATUS => 'success', API_MESSAGE => '']; } - $this->store = Store::getInstance(); - $this->dbIndexQfq = $this->store->getVar(SYSTEM_DB_INDEX_QFQ, STORE_SYSTEM); - - $this->dbIndexData = empty($sipVars[PARAM_DB_INDEX_DATA]) ? $this->store->getVar(SYSTEM_DB_INDEX_DATA, STORE_SYSTEM) : $sipVars[PARAM_DB_INDEX_DATA]; - $this->doDbArray($this->dbIndexData, $this->dbIndexQfq); - $tableVars = $this->dbArray[$this->dbIndexQfq]->sql("SELECT `tableName`, `primaryKey`, `dirtyMode`, `recordLockTimeoutSeconds` FROM `Form` WHERE `name`=?", ROW_EXPECT_1, [$sipVars[SIP_FORM]], "Form not found: '" . $sipVars[SIP_FORM] . "'"); if (empty($tableVars[F_PRIMARY_KEY])) { $tableVars[F_PRIMARY_KEY] = F_PRIMARY_KEY_DEFAULT; diff --git a/extension/Classes/Core/Form/FormAsFile.php b/extension/Classes/Core/Form/FormAsFile.php index 431f02de8..530a619c0 100644 --- a/extension/Classes/Core/Form/FormAsFile.php +++ b/extension/Classes/Core/Form/FormAsFile.php @@ -8,14 +8,18 @@ use IMATHUZH\Qfq\Core\Helper\HelperFile; use IMATHUZH\Qfq\Core\Helper\OnString; use IMATHUZH\Qfq\Core\Helper\SqlQuery; -// TODO: exportAllForms() mit deleteFiles true testen -// TODO: Testen: QFQ komplett neu installiert => form dir existiert mit allen form files aktuell. QFQ neu installation mit existierenden forms => alte forms sind noch da. QFQ update => alte forms noch da, updates an FormEditor ersichtlich -// TODO: Testen: Dies sollte schon erfuellt sein, testen: bevor ein form/formelement im form editor gespeichert wird, soll es vom file geladen werden (Save.php). Falls das file importiert wurde, gibt es eine fehlermeldung. +// TODO: insertForm(): update filestats at the end instead of with form insert +// TODO: Testen: + // QFQ komplett neu installiert => form dir existiert mit allen form files aktuell. + // QFQ neu installation mit existierenden forms => alte forms sind noch da. + // QFQ update => alte forms noch da, updates an FormEditor ersichtlich +// DONE: Testen: bevor ein form/formelement im form editor gespeichert wird, soll es vom file geladen werden (Save.php). Falls das file importiert wurde, gibt es eine fehlermeldung. // TODO: Testen: anfrage nach dirty, form file ueberpruefen (importieren) // TODO: Testen: Dirty tabelle ist aussergewoehnlich voll. werden die records nicht abgeraeumt wegen formAsFile? // TODO: Testen: ausporbieren was passiert wenn ich in Form-Editor auf speicher druecke nachdem ich in einem anderen tab das geanderte form file in die DB lade. // TODO: Testen: importAllForms() wird nur ausgefuehrt, wenn der Report Form/FormElement aufruft // TODO: Fix all broken tests... one easy solution? +// TODO: Carsten Fragen: Habe keine Unittests zu QuickFormQuery->doForm gefunden. Wird nicht getestet. FormAsFile nicht testen oder vielleicht nur mit selenium? // TODO: Carsten Fragen: Form backups erstellen vor deleteFormFile und exportForm? // TODO: Carsten Fragen: "git rm" anstatt "rm" benutzen falls ordner ein git repo? Einziger unterschied: macht "git add" // TODO: Carsten Fragen: Form Copy ist broken. Aber jetzt auch unnötig, da man einfach die files kopieren kann. @@ -145,7 +149,7 @@ class FormAsFile } $formFromFile = json_decode($fileContents, true); - // Delete old form from DB if it exists + // Delete old form with that name from DB if it exists. if (array_key_exists(F_ID, $formFromDb)) { $formId = $formFromDb[$F_ID]; self::deleteFormDBWithId($formId, $database); @@ -162,6 +166,9 @@ class FormAsFile list($sqlFormInsert, $parameterArrayFormInsert) = SqlQuery::insertRecord(TABLE_NAME_FORM, $insertValues); $formId = $database->sql($sqlFormInsert, ROW_REGULAR, $parameterArrayFormInsert); + // Delete stale formElements with the new form id (these should not exist, but better make sure) + self::deleteFormElementsDBWithFormId($formId, $database); + // Insert FormElements to DB and collect container ids $containerIds = []; // array(container_name => id) foreach ($formFromFile[FORM_FILE_FORM_ELEMENT] as &$formElementFromFile) { @@ -549,6 +556,20 @@ class FormAsFile $F_ID = F_ID; // can't use constants in strings directly $TABLE_NAME_FORM = TABLE_NAME_FORM; // can't use constants in strings directly $database->sql("DELETE FROM `$TABLE_NAME_FORM` WHERE `$F_ID`=? LIMIT 1", ROW_REGULAR, [$formId]); + self::deleteFormElementsDBWithFormId($formId, $database); + } + + /** + * Delete form elements with given formId from DB + * + * @param $formId + * @param Database $database + * @throws \CodeException + * @throws \DbException + * @throws \UserFormException + */ + private static function deleteFormElementsDBWithFormId(int $formId, Database $database): void + { $TABLE_NAME_FORM_ELEMENT = TABLE_NAME_FORM_ELEMENT; // can't use constants in strings directly $FE_FORM_ID = FE_FORM_ID; // can't use constants in strings directly $database->sql("DELETE FROM `$TABLE_NAME_FORM_ELEMENT` WHERE `$FE_FORM_ID`=?", ROW_REGULAR, [$formId]); -- GitLab From 0f2659c637b181afc7c5e4aabd7ba742d5ac875e Mon Sep 17 00:00:00 2001 From: Marc Egger <marc.egger@uzh.ch> Date: Tue, 21 Jul 2020 09:22:08 +0200 Subject: [PATCH 039/195] Refs #10120 insertForm(): update filestats at the end instead of with form insert --- extension/Classes/Core/Form/FormAsFile.php | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/extension/Classes/Core/Form/FormAsFile.php b/extension/Classes/Core/Form/FormAsFile.php index 530a619c0..b2a597a4d 100644 --- a/extension/Classes/Core/Form/FormAsFile.php +++ b/extension/Classes/Core/Form/FormAsFile.php @@ -8,7 +8,6 @@ use IMATHUZH\Qfq\Core\Helper\HelperFile; use IMATHUZH\Qfq\Core\Helper\OnString; use IMATHUZH\Qfq\Core\Helper\SqlQuery; -// TODO: insertForm(): update filestats at the end instead of with form insert // TODO: Testen: // QFQ komplett neu installiert => form dir existiert mit allen form files aktuell. // QFQ neu installation mit existierenden forms => alte forms sind noch da. @@ -155,14 +154,13 @@ class FormAsFile self::deleteFormDBWithId($formId, $database); } - // Insert new Form to DB (after filtering allowed columns and adding columns 'name' and 'fileStats') + // Insert new Form to DB (after filtering allowed columns and adding column 'name') $formSchema = $database->getTableDefinition(TABLE_NAME_FORM); $formColumns = array_column($formSchema, 'Field'); $insertValues = array_filter($formFromFile, function ($columnName) use ($formColumns) { return $columnName !== F_ID && in_array($columnName, $formColumns); }, ARRAY_FILTER_USE_KEY); // array(column => value) $insertValues[F_NAME] = $formName; - $insertValues[F_FILE_STATS] = $fileStatsNew; list($sqlFormInsert, $parameterArrayFormInsert) = SqlQuery::insertRecord(TABLE_NAME_FORM, $insertValues); $formId = $database->sql($sqlFormInsert, ROW_REGULAR, $parameterArrayFormInsert); @@ -189,6 +187,11 @@ class FormAsFile $database->sql($sql, ROW_REGULAR, $parameterArray); } } + + // Update column fileStats if everything went well + list($sql, $parameterArray) = SqlQuery::updateRecord(TABLE_NAME_FORM, [F_FILE_STATS => $fileStatsNew], $formId); + $database->sql($sql, ROW_REGULAR, $parameterArray); + return true; } -- GitLab From e8d15ede1456e9ae1c6d6fc4fc8e3f9a376df323 Mon Sep 17 00:00:00 2001 From: Marc Egger <marc.egger@uzh.ch> Date: Tue, 21 Jul 2020 11:05:35 +0200 Subject: [PATCH 040/195] Refs #10120 fix minor bug + remove Git Submodule (was for TOML parser) --- .gitmodules | 6 ------ Makefile | 12 +++--------- extension/Classes/Core/Form/FormAsFile.php | 22 +++++++++++----------- extension/composer.json | 4 +--- 4 files changed, 15 insertions(+), 29 deletions(-) delete mode 100644 .gitmodules diff --git a/.gitmodules b/.gitmodules deleted file mode 100644 index d63402973..000000000 --- a/.gitmodules +++ /dev/null @@ -1,6 +0,0 @@ -[submodule "extension/Submodules/yosymfon-toml-fork"] - path = extension/Submodules/yosymfon-toml-fork - url = https://git.math.uzh.ch/megger/yosymfon-toml-fork -[submodule "extension/Submodules/yosymfony-parser-utils"] - path = extension/Submodules/yosymfony-parser-utils - url = https://github.com/yosymfony/parser-utils diff --git a/Makefile b/Makefile index db30956b4..83a91b5e9 100644 --- a/Makefile +++ b/Makefile @@ -8,7 +8,7 @@ RELEASE_DATE = $(shell date '+%Y%m%d%H%M') GIT_REVISION_SHORT = $(shell git rev-parse --short HEAD || true) GIT_REVISION_LONG = $(shell git rev-parse HEAD || true) -EXTENSION_CONTENT = Classes Submodules Configuration Resources ext_emconf.php ext_localconf.php ext_tables.php ext_icon.png ext_conf_template.txt config-example.qfq.php RELEASE.txt vendor +EXTENSION_CONTENT = Classes Configuration Resources ext_emconf.php ext_localconf.php ext_tables.php ext_icon.png ext_conf_template.txt config-example.qfq.php RELEASE.txt vendor DISTDIR=dist @@ -56,7 +56,7 @@ release: basic build-dist plantuml: cd doc/diagram ; $(MAKE) -bootstrap: git-submodules .npmpackages .plantuml_install .virtual_env +bootstrap: .npmpackages .plantuml_install .virtual_env npm update grunt default @@ -64,7 +64,7 @@ bootstrap: git-submodules .npmpackages .plantuml_install .virtual_env # cd extension/Resources/Private; composer update cd extension; composer update -basic: git-submodules .npmpackages .virtual_env +basic: .npmpackages .virtual_env grunt default # IMPORTANT: install composer with no-dev flag for deployment! cd extension; composer install --no-dev --optimize-autoloader; cd vendor/phpoffice/phpspreadsheet; rm -rf .github bin docs samples .g* .s* .t* C* c* m* p* @@ -132,11 +132,5 @@ doc-local: doc-qfqio: rsync -av "Documentation/_build/html/" root@w16.math.uzh.ch:/var/www/html/qfq/doc/ -git-submodules: - git submodule update --init --recursive - - # always pull submodule changes when using `git pull` - git config submodule.recurse true - git pull diff --git a/extension/Classes/Core/Form/FormAsFile.php b/extension/Classes/Core/Form/FormAsFile.php index b2a597a4d..b0b9d56ab 100644 --- a/extension/Classes/Core/Form/FormAsFile.php +++ b/extension/Classes/Core/Form/FormAsFile.php @@ -8,15 +8,6 @@ use IMATHUZH\Qfq\Core\Helper\HelperFile; use IMATHUZH\Qfq\Core\Helper\OnString; use IMATHUZH\Qfq\Core\Helper\SqlQuery; -// TODO: Testen: - // QFQ komplett neu installiert => form dir existiert mit allen form files aktuell. - // QFQ neu installation mit existierenden forms => alte forms sind noch da. - // QFQ update => alte forms noch da, updates an FormEditor ersichtlich -// DONE: Testen: bevor ein form/formelement im form editor gespeichert wird, soll es vom file geladen werden (Save.php). Falls das file importiert wurde, gibt es eine fehlermeldung. -// TODO: Testen: anfrage nach dirty, form file ueberpruefen (importieren) -// TODO: Testen: Dirty tabelle ist aussergewoehnlich voll. werden die records nicht abgeraeumt wegen formAsFile? -// TODO: Testen: ausporbieren was passiert wenn ich in Form-Editor auf speicher druecke nachdem ich in einem anderen tab das geanderte form file in die DB lade. -// TODO: Testen: importAllForms() wird nur ausgefuehrt, wenn der Report Form/FormElement aufruft // TODO: Fix all broken tests... one easy solution? // TODO: Carsten Fragen: Habe keine Unittests zu QuickFormQuery->doForm gefunden. Wird nicht getestet. FormAsFile nicht testen oder vielleicht nur mit selenium? // TODO: Carsten Fragen: Form backups erstellen vor deleteFormFile und exportForm? @@ -25,6 +16,7 @@ use IMATHUZH\Qfq\Core\Helper\SqlQuery; // TODO: Carsten Fragen: Koennte die column "lastImport" zu Form hinzufuegen. Dieser wird dann manuell zusammen mit "changed" beim import und export gesetzt. Mittels Left Join query mit den created columns von FormElement koennte man in importForm() feststellen, ob sich ein form geaendert hat und dieses expotieren, falls der fingerabdruck des files noch gleich ist. // TODO: Carsten Fragen: QFQ formulare haben id unter 1000 und user forms ueber 1000. Wird ein QFQ formular neu importiert, erhaelt es aber eine id ueber 1000. ist dies ein problem? // TODO: Carsten Fragen: ZUERST NOCHMAL GENAU NACHTEILE PRUEFEN: In doForm koennte man auch einfach pauschal importAllForms(enforce writeable=true) und exportAllForms() machen, wenn der geladene record ein Form/Formelement ist. Bei vielen forms koennte es langsam sein. ansonsten sehe ich gerade keine klaren nachteile. +// TODO: Carsten Fragen: Kann es sein, dass records in Dirty tabelle nicht mehr richtig abegraeumt werden, weil forms die ID wechseln? // TODO: BEFOORE PRUDUCTION // TODO: add Exception hint as hint instead of in main message? @@ -40,7 +32,8 @@ use IMATHUZH\Qfq\Core\Helper\SqlQuery; // TODO: Carsten Fragen: add log messages somewhare? // TODO: Tests: // new form => form file created - // form field change => changed in form file + // form field change editor => changed in form file + // bevor ein form/formelement im form editor gespeichert wird, soll es vom file geladen werden (Save.php). Falls das file importiert wurde, gibt es eine fehlermeldung. // form name change => old form file deleted, new form file created // form delete => form file deleted @@ -55,9 +48,16 @@ use IMATHUZH\Qfq\Core\Helper\SqlQuery; // form file form element added => added in form editor // form file form element changed => changed in form editor // form file form element removed => removed in form editor + // form file changed => request for dirty lock throws exception // form folder does not exist but formEditor is opened => form folder is created, all forms exported + // QFQ komplett neu installiert => form dir existiert mit allen form files aktuell. + // QFQ neu installation mit existierenden forms => alte forms sind noch da, native forms (form, cron usw.) werden ueberschrieben. + // QFQ update => alte forms noch da, updates an FormEditor ersichtlich + + // importAllForms() is executed iff the rendered QFQ report selects Form/FormElement table. + // TODO: MAYBE // TODO: Maybe: solve reference by ID after file change Problem (might not be a big deal since it only happens on git pull) // Problem: FormEditor and form list might reference a form by an old id. In that case everything has to be reloaded. That's annoying. @@ -299,8 +299,8 @@ class FormAsFile ERROR_MESSAGE_TO_DEVELOPER => "Form definition file has been changed. Please close tab and reload the form list and Form-Editor from scratch."]), ERROR_FORM_NOT_FOUND); } + self::enforceFormFileWritable($recordFormName, $database); } - self::enforceFormFileWritable($recordFormName, $database); return $recordFormName; } diff --git a/extension/composer.json b/extension/composer.json index 0fb75a81b..1e0adcf6e 100644 --- a/extension/composer.json +++ b/extension/composer.json @@ -9,9 +9,7 @@ }, "autoload": { "psr-4": { - "IMATHUZH\\Qfq\\": "Classes", - "Yosymfony\\Toml\\": "Submodules/yosymfon-toml-fork/src", - "Yosymfony\\ParserUtils\\": "Submodules/yosymfony-parser-utils/src" + "IMATHUZH\\Qfq\\": "Classes" }, "files": ["Classes/Core/Constants.php", "Classes/Core/Exception/DbException.php", -- GitLab From 3e7b7825bcbd373f43f1df092569d11855db2ae4 Mon Sep 17 00:00:00 2001 From: Marc Egger <marc.egger@uzh.ch> Date: Tue, 21 Jul 2020 11:12:13 +0200 Subject: [PATCH 041/195] remove submodules --- extension/Submodules/yosymfon-toml-fork | 1 - extension/Submodules/yosymfony-parser-utils | 1 - 2 files changed, 2 deletions(-) delete mode 160000 extension/Submodules/yosymfon-toml-fork delete mode 160000 extension/Submodules/yosymfony-parser-utils diff --git a/extension/Submodules/yosymfon-toml-fork b/extension/Submodules/yosymfon-toml-fork deleted file mode 160000 index 1e2325581..000000000 --- a/extension/Submodules/yosymfon-toml-fork +++ /dev/null @@ -1 +0,0 @@ -Subproject commit 1e23255811dc2999fe347e9996c6281938492ed8 diff --git a/extension/Submodules/yosymfony-parser-utils b/extension/Submodules/yosymfony-parser-utils deleted file mode 160000 index 00bec9a12..000000000 --- a/extension/Submodules/yosymfony-parser-utils +++ /dev/null @@ -1 +0,0 @@ -Subproject commit 00bec9a12722b21f2baf7f9db35f127e90c162c9 -- GitLab From 55949995ca258a7d91b1c95762f68e22efa14d90 Mon Sep 17 00:00:00 2001 From: Marc Egger <marc.egger@uzh.ch> Date: Tue, 21 Jul 2020 11:34:10 +0200 Subject: [PATCH 042/195] Refs #10120 remov return type ?string since ? is not supported by the PHP version on webwork16. very sad. --- Makefile | 1 - extension/Classes/Core/Form/FormAsFile.php | 2 +- 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/Makefile b/Makefile index 83a91b5e9..2a0dedb12 100644 --- a/Makefile +++ b/Makefile @@ -133,4 +133,3 @@ doc-qfqio: rsync -av "Documentation/_build/html/" root@w16.math.uzh.ch:/var/www/html/qfq/doc/ - diff --git a/extension/Classes/Core/Form/FormAsFile.php b/extension/Classes/Core/Form/FormAsFile.php index b0b9d56ab..1ea5eee1d 100644 --- a/extension/Classes/Core/Form/FormAsFile.php +++ b/extension/Classes/Core/Form/FormAsFile.php @@ -289,7 +289,7 @@ class FormAsFile * @throws \DbException * @throws \UserFormException */ - public static function importFormRecordId(int $recordId, string $tableName, Database $database): ?string + public static function importFormRecordId(int $recordId, string $tableName, Database $database) { $recordFormName = self::formNameFromFormRelatedRecord($recordId, $tableName, $database); if ($recordFormName !== null) { -- GitLab From 7c4b8766d996886591e06026514a4200baa7c532 Mon Sep 17 00:00:00 2001 From: Marc Egger <marc.egger@uzh.ch> Date: Tue, 21 Jul 2020 12:14:45 +0200 Subject: [PATCH 043/195] Refs #10120 remove return type ?string since ? is not supported by the PHP version of the gitlab runner. very sad. --- extension/Classes/Core/Form/FormAsFile.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/extension/Classes/Core/Form/FormAsFile.php b/extension/Classes/Core/Form/FormAsFile.php index 1ea5eee1d..91392f83f 100644 --- a/extension/Classes/Core/Form/FormAsFile.php +++ b/extension/Classes/Core/Form/FormAsFile.php @@ -387,7 +387,7 @@ class FormAsFile * @throws \DbException * @throws \UserFormException */ - public static function formNameFromFormRelatedRecord(int $recordId, string $recordTable, Database $database): ?string + public static function formNameFromFormRelatedRecord(int $recordId, string $recordTable, Database $database) { if ($recordId === 0) { return null; -- GitLab From 966bace2b1ffce0d85b554d6fc80bb6a541c32bc Mon Sep 17 00:00:00 2001 From: Marc Egger <marc.egger@uzh.ch> Date: Tue, 21 Jul 2020 12:36:37 +0200 Subject: [PATCH 044/195] Refs #10120 remove return type void since it is not supported by the PHP version of the gitlab runner. very sad. --- extension/Classes/Core/Form/FormAsFile.php | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/extension/Classes/Core/Form/FormAsFile.php b/extension/Classes/Core/Form/FormAsFile.php index 91392f83f..1297dd41a 100644 --- a/extension/Classes/Core/Form/FormAsFile.php +++ b/extension/Classes/Core/Form/FormAsFile.php @@ -17,6 +17,8 @@ use IMATHUZH\Qfq\Core\Helper\SqlQuery; // TODO: Carsten Fragen: QFQ formulare haben id unter 1000 und user forms ueber 1000. Wird ein QFQ formular neu importiert, erhaelt es aber eine id ueber 1000. ist dies ein problem? // TODO: Carsten Fragen: ZUERST NOCHMAL GENAU NACHTEILE PRUEFEN: In doForm koennte man auch einfach pauschal importAllForms(enforce writeable=true) und exportAllForms() machen, wenn der geladene record ein Form/Formelement ist. Bei vielen forms koennte es langsam sein. ansonsten sehe ich gerade keine klaren nachteile. // TODO: Carsten Fragen: Kann es sein, dass records in Dirty tabelle nicht mehr richtig abegraeumt werden, weil forms die ID wechseln? +// TODO: Carsten Fragen: Exceptions werden teilweise ohne Developer message angezeigt (API). Deshalb habe ich die Message teilweise in User message getan. +// TODO: Carsten Fragen: PHP version von gitlab runner hochstellen, damit ?string type syntax fuer funktionen erlaubt ist? verhindert einige fehler // TODO: BEFOORE PRUDUCTION // TODO: add Exception hint as hint instead of in main message? @@ -211,7 +213,7 @@ class FormAsFile * @throws \DbException * @throws \UserFormException */ - public static function exportForm(string $formName, Database $database): void + public static function exportForm(string $formName, Database $database) { // Get form from DB $FORM = TABLE_NAME_FORM; // can't use constants in strings directly @@ -313,7 +315,7 @@ class FormAsFile * @throws \DbException * @throws \UserFormException */ - public static function deleteFormFile($formName, Database $database): void + public static function deleteFormFile($formName, Database $database) { self::enforceFormFileWritable($formName, $database); $pathFileName = self::formPathFileName($formName, $database); @@ -354,7 +356,7 @@ class FormAsFile * @throws \DbException * @throws \UserFormException */ - public static function enforceFormFileWritable(string $formName, Database $database): void + public static function enforceFormFileWritable(string $formName, Database $database) { $pathFileName = self::formPathFileName($formName, $database); if (file_exists($pathFileName)) { @@ -448,7 +450,7 @@ class FormAsFile * @throws \DbException * @throws \UserFormException */ - public static function importAllForms(Database $database, bool $enforceWritable = false, bool $deleteFromDB = false): void + public static function importAllForms(Database $database, bool $enforceWritable = false, bool $deleteFromDB = false) { // Import all form files $formFileNames = self::formFileNames($database); @@ -479,7 +481,7 @@ class FormAsFile * @throws \DbException * @throws \UserFormException */ - public static function exportAllForms(Database $database, bool $deleteFiles = false): void + public static function exportAllForms(Database $database, bool $deleteFiles = false) { $formNamesDB = self::queryAllFormNames($database); foreach ($formNamesDB as $formNameDB) { @@ -533,7 +535,7 @@ class FormAsFile * @throws \DbException * @throws \UserFormException */ - private static function deleteFormDB(string $formName, Database $database): void + private static function deleteFormDB(string $formName, Database $database) { $F_ID = F_ID; // can't use constants in strings directly $F_NAME = F_NAME; // can't use constants in strings directly @@ -554,7 +556,7 @@ class FormAsFile * @throws \DbException * @throws \UserFormException */ - private static function deleteFormDBWithId(int $formId, Database $database): void + private static function deleteFormDBWithId(int $formId, Database $database) { $F_ID = F_ID; // can't use constants in strings directly $TABLE_NAME_FORM = TABLE_NAME_FORM; // can't use constants in strings directly @@ -571,7 +573,7 @@ class FormAsFile * @throws \DbException * @throws \UserFormException */ - private static function deleteFormElementsDBWithFormId(int $formId, Database $database): void + private static function deleteFormElementsDBWithFormId(int $formId, Database $database) { $TABLE_NAME_FORM_ELEMENT = TABLE_NAME_FORM_ELEMENT; // can't use constants in strings directly $FE_FORM_ID = FE_FORM_ID; // can't use constants in strings directly -- GitLab From e6a7f746652e3ff4e7d0dd72ed651b71061f1118 Mon Sep 17 00:00:00 2001 From: Marc Egger <marc.egger@uzh.ch> Date: Tue, 21 Jul 2020 12:52:33 +0200 Subject: [PATCH 045/195] Refs #10120 Dirty.php: remove form import since it breaks unittests and it is not important --- extension/Classes/Core/Form/Dirty.php | 15 ++++++--------- extension/Classes/Core/Form/FormAsFile.php | 22 +++++++++++----------- 2 files changed, 17 insertions(+), 20 deletions(-) diff --git a/extension/Classes/Core/Form/Dirty.php b/extension/Classes/Core/Form/Dirty.php index 86196450e..e8c829924 100644 --- a/extension/Classes/Core/Form/Dirty.php +++ b/extension/Classes/Core/Form/Dirty.php @@ -113,21 +113,18 @@ class Dirty { throw new \CodeException("Missing 'form' in SIP. There might be something broken.", ERROR_DIRTY_MISSING_FORM_IN_SIP); } - // Connect to Database - $this->store = Store::getInstance(); - $this->dbIndexQfq = $this->store->getVar(SYSTEM_DB_INDEX_QFQ, STORE_SYSTEM); - $this->dbIndexData = empty($sipVars[PARAM_DB_INDEX_DATA]) ? $this->store->getVar(SYSTEM_DB_INDEX_DATA, STORE_SYSTEM) : $sipVars[PARAM_DB_INDEX_DATA]; - $this->doDbArray($this->dbIndexData, $this->dbIndexQfq); - - // import form file. If it was changed, throw exception. - FormAsFile::importForm($sipVars[SIP_FORM], $this->dbArray[$this->dbIndexQfq]); - $recordId = empty($sipVars[SIP_RECORD_ID]) ? 0 : $sipVars[SIP_RECORD_ID]; if ($recordId == 0) { // For r=0 (new) , 'dirty' will always succeed. return [API_STATUS => 'success', API_MESSAGE => '']; } + $this->store = Store::getInstance(); + $this->dbIndexQfq = $this->store->getVar(SYSTEM_DB_INDEX_QFQ, STORE_SYSTEM); + + $this->dbIndexData = empty($sipVars[PARAM_DB_INDEX_DATA]) ? $this->store->getVar(SYSTEM_DB_INDEX_DATA, STORE_SYSTEM) : $sipVars[PARAM_DB_INDEX_DATA]; + $this->doDbArray($this->dbIndexData, $this->dbIndexQfq); + $tableVars = $this->dbArray[$this->dbIndexQfq]->sql("SELECT `tableName`, `primaryKey`, `dirtyMode`, `recordLockTimeoutSeconds` FROM `Form` WHERE `name`=?", ROW_EXPECT_1, [$sipVars[SIP_FORM]], "Form not found: '" . $sipVars[SIP_FORM] . "'"); if (empty($tableVars[F_PRIMARY_KEY])) { $tableVars[F_PRIMARY_KEY] = F_PRIMARY_KEY_DEFAULT; diff --git a/extension/Classes/Core/Form/FormAsFile.php b/extension/Classes/Core/Form/FormAsFile.php index 1297dd41a..10e8dafa2 100644 --- a/extension/Classes/Core/Form/FormAsFile.php +++ b/extension/Classes/Core/Form/FormAsFile.php @@ -18,7 +18,7 @@ use IMATHUZH\Qfq\Core\Helper\SqlQuery; // TODO: Carsten Fragen: ZUERST NOCHMAL GENAU NACHTEILE PRUEFEN: In doForm koennte man auch einfach pauschal importAllForms(enforce writeable=true) und exportAllForms() machen, wenn der geladene record ein Form/Formelement ist. Bei vielen forms koennte es langsam sein. ansonsten sehe ich gerade keine klaren nachteile. // TODO: Carsten Fragen: Kann es sein, dass records in Dirty tabelle nicht mehr richtig abegraeumt werden, weil forms die ID wechseln? // TODO: Carsten Fragen: Exceptions werden teilweise ohne Developer message angezeigt (API). Deshalb habe ich die Message teilweise in User message getan. -// TODO: Carsten Fragen: PHP version von gitlab runner hochstellen, damit ?string type syntax fuer funktionen erlaubt ist? verhindert einige fehler +// TODO: Carsten Fragen: PHP version von gitlab runner hochstellen, damit ?string und void type syntax fuer funktionen erlaubt ist? verhindert einige fehler // TODO: BEFOORE PRUDUCTION // TODO: add Exception hint as hint instead of in main message? @@ -213,7 +213,7 @@ class FormAsFile * @throws \DbException * @throws \UserFormException */ - public static function exportForm(string $formName, Database $database) + public static function exportForm(string $formName, Database $database) // : void { // Get form from DB $FORM = TABLE_NAME_FORM; // can't use constants in strings directly @@ -291,7 +291,7 @@ class FormAsFile * @throws \DbException * @throws \UserFormException */ - public static function importFormRecordId(int $recordId, string $tableName, Database $database) + public static function importFormRecordId(int $recordId, string $tableName, Database $database) // : ?string { $recordFormName = self::formNameFromFormRelatedRecord($recordId, $tableName, $database); if ($recordFormName !== null) { @@ -315,7 +315,7 @@ class FormAsFile * @throws \DbException * @throws \UserFormException */ - public static function deleteFormFile($formName, Database $database) + public static function deleteFormFile($formName, Database $database) // : void { self::enforceFormFileWritable($formName, $database); $pathFileName = self::formPathFileName($formName, $database); @@ -356,7 +356,7 @@ class FormAsFile * @throws \DbException * @throws \UserFormException */ - public static function enforceFormFileWritable(string $formName, Database $database) + public static function enforceFormFileWritable(string $formName, Database $database) // : void { $pathFileName = self::formPathFileName($formName, $database); if (file_exists($pathFileName)) { @@ -389,7 +389,7 @@ class FormAsFile * @throws \DbException * @throws \UserFormException */ - public static function formNameFromFormRelatedRecord(int $recordId, string $recordTable, Database $database) + public static function formNameFromFormRelatedRecord(int $recordId, string $recordTable, Database $database) // : ?string { if ($recordId === 0) { return null; @@ -450,7 +450,7 @@ class FormAsFile * @throws \DbException * @throws \UserFormException */ - public static function importAllForms(Database $database, bool $enforceWritable = false, bool $deleteFromDB = false) + public static function importAllForms(Database $database, bool $enforceWritable = false, bool $deleteFromDB = false) // : void { // Import all form files $formFileNames = self::formFileNames($database); @@ -481,7 +481,7 @@ class FormAsFile * @throws \DbException * @throws \UserFormException */ - public static function exportAllForms(Database $database, bool $deleteFiles = false) + public static function exportAllForms(Database $database, bool $deleteFiles = false) // : void { $formNamesDB = self::queryAllFormNames($database); foreach ($formNamesDB as $formNameDB) { @@ -535,7 +535,7 @@ class FormAsFile * @throws \DbException * @throws \UserFormException */ - private static function deleteFormDB(string $formName, Database $database) + private static function deleteFormDB(string $formName, Database $database) // : void { $F_ID = F_ID; // can't use constants in strings directly $F_NAME = F_NAME; // can't use constants in strings directly @@ -556,7 +556,7 @@ class FormAsFile * @throws \DbException * @throws \UserFormException */ - private static function deleteFormDBWithId(int $formId, Database $database) + private static function deleteFormDBWithId(int $formId, Database $database) // : void { $F_ID = F_ID; // can't use constants in strings directly $TABLE_NAME_FORM = TABLE_NAME_FORM; // can't use constants in strings directly @@ -573,7 +573,7 @@ class FormAsFile * @throws \DbException * @throws \UserFormException */ - private static function deleteFormElementsDBWithFormId(int $formId, Database $database) + private static function deleteFormElementsDBWithFormId(int $formId, Database $database) // : void { $TABLE_NAME_FORM_ELEMENT = TABLE_NAME_FORM_ELEMENT; // can't use constants in strings directly $FE_FORM_ID = FE_FORM_ID; // can't use constants in strings directly -- GitLab From cf68a1eaae7a93e1d6cf84256d5dd5eeaf9848a6 Mon Sep 17 00:00:00 2001 From: Marc Egger <marc.egger@uzh.ch> Date: Tue, 21 Jul 2020 14:22:30 +0200 Subject: [PATCH 046/195] Refs #10120 add form path to the QFQ extension settings and move constants to constants.php --- extension/Classes/Core/Constants.php | 9 ++++++ extension/Classes/Core/Form/FormAsFile.php | 32 +++++++++------------- extension/Classes/Core/QuickFormQuery.php | 2 +- extension/ext_conf_template.txt | 3 ++ 4 files changed, 26 insertions(+), 20 deletions(-) diff --git a/extension/Classes/Core/Constants.php b/extension/Classes/Core/Constants.php index ecb1e851a..10013027f 100644 --- a/extension/Classes/Core/Constants.php +++ b/extension/Classes/Core/Constants.php @@ -657,6 +657,9 @@ const SYSTEM_THUMBNAIL_DIR_SECURE_DEFAULT = 'fileadmin/protected/qfqThumbnail'; const SYSTEM_THUMBNAIL_DIR_PUBLIC = 'thumbnailDirPublic'; const SYSTEM_THUMBNAIL_DIR_PUBLIC_DEFAULT = 'typo3temp/qfqThumbnail'; +// Form/Report as file +const SYSTEM_QFQ_PROJECT_DIR_SECURE = 'qfqProjectDir'; // where form and report files are saved + const SYSTEM_DOCUMENTATION_QFQ = 'documentation'; const SYSTEM_DOCUMENTATION_QFQ_URL = 'https://docs.qfq.io'; @@ -1074,6 +1077,9 @@ const F_REST_TOKEN = 'restToken'; const CLIENT_REST_ID = '_id'; const CLIENT_REST_FORM = '_form'; +// Form Columns: Only in form file +const F_FILE_FORM_ELEMENT = 'FormElement_ff'; // Key for FormElements array saved in Form File + // FORM_ELEMENT_STATI const FE_MODE_SHOW = 'show'; const FE_MODE_READONLY = 'readonly'; @@ -1150,6 +1156,9 @@ const FE_TRIM_NONE = 'none'; const FE_FILE_TRASH = 'fileTrash'; const FE_FILE_TRASH_TEXT = 'fileTrashText'; +// FormElement Columns: Only in form file +const FE_FILE_CONTAINER_NAME = 'containerName_ff'; // key for referencing container FormElements by name in form file + // Excel Import const FE_IMPORT_TO_TABLE = 'importToTable'; const FE_IMPORT_TO_COLUMNS = 'importToColumns'; diff --git a/extension/Classes/Core/Form/FormAsFile.php b/extension/Classes/Core/Form/FormAsFile.php index 10e8dafa2..78ddf725d 100644 --- a/extension/Classes/Core/Form/FormAsFile.php +++ b/extension/Classes/Core/Form/FormAsFile.php @@ -7,6 +7,7 @@ use IMATHUZH\Qfq\Core\Database\Database; use IMATHUZH\Qfq\Core\Helper\HelperFile; use IMATHUZH\Qfq\Core\Helper\OnString; use IMATHUZH\Qfq\Core\Helper\SqlQuery; +use IMATHUZH\Qfq\Core\Store\Store; // TODO: Fix all broken tests... one easy solution? // TODO: Carsten Fragen: Habe keine Unittests zu QuickFormQuery->doForm gefunden. Wird nicht getestet. FormAsFile nicht testen oder vielleicht nur mit selenium? @@ -19,15 +20,11 @@ use IMATHUZH\Qfq\Core\Helper\SqlQuery; // TODO: Carsten Fragen: Kann es sein, dass records in Dirty tabelle nicht mehr richtig abegraeumt werden, weil forms die ID wechseln? // TODO: Carsten Fragen: Exceptions werden teilweise ohne Developer message angezeigt (API). Deshalb habe ich die Message teilweise in User message getan. // TODO: Carsten Fragen: PHP version von gitlab runner hochstellen, damit ?string und void type syntax fuer funktionen erlaubt ist? verhindert einige fehler +// TODO: Carsten Fragen: Regex fuer erlaubte file names und form names im editor (+ erlauben?): ^([-\.\w]+)$ VS [a-zA-Z0-9._+-]+ +// TODO: Carsten Fragen: Muss die neue Column fileStats von Form tabelle in DatabaseUpdateData.php? Form Editor wird ja sowieso neu eingespielt bei einem update. +// TODO: Carsten Fragen: QFQ as file // TODO: BEFOORE PRUDUCTION - // TODO: add Exception hint as hint instead of in main message? - // TODO: move formFile code in QuickFormQuery.php into methods in this file as much as possible? - // TODO: remove DEBUG blocks - // TODO: Form-Editor form name einschraenken auf eindeutige und valide file names - // TODO: Form-Editor anpassen: container name muessen eindeutig sein. - // TODO: add fileStats column to Form schema and to DatabaseUpdateData.php. Actually formEditor.sql is run in DatabaseUpdate.php after the DatabaseUpdateData.php changes are executed. So is this neccessary? (ASK Carsten) - // TODO: move Constants to Constants.php if this file is actually used // TODO: extract all sql queries and make them reusable // TODO: write tests (file test https://medium.com/weebly-engineering/phpunit-mocking-the-file-system-using-vfsstream-5d7d79b1eb2a) // TODO: maybe: update button in form list which removes forms from DB if their file was deleted @@ -50,7 +47,6 @@ use IMATHUZH\Qfq\Core\Helper\SqlQuery; // form file form element added => added in form editor // form file form element changed => changed in form editor // form file form element removed => removed in form editor - // form file changed => request for dirty lock throws exception // form folder does not exist but formEditor is opened => form folder is created, all forms exported @@ -93,10 +89,6 @@ use IMATHUZH\Qfq\Core\Helper\SqlQuery; // ])); /////////////////////// -const SYSTEM_FORM_FILE_PATH = 'fileadmin/protected/qfq/form'; // where form specification files are saved and loaded -const FORM_FILE_FORM_ELEMENT = 'FormElement_ff'; // Key for FormElements array saved in Form File -const FORM_FILE_CONTAINER_NAME = 'containerName_ff'; // key for referencing container FormElements by name in form file - class FormAsFile { /** @@ -171,7 +163,7 @@ class FormAsFile // Insert FormElements to DB and collect container ids $containerIds = []; // array(container_name => id) - foreach ($formFromFile[FORM_FILE_FORM_ELEMENT] as &$formElementFromFile) { + foreach ($formFromFile[F_FILE_FORM_ELEMENT] as &$formElementFromFile) { $feId = self::insertFormElement($formElementFromFile, $formId, $database); $formElementFromFile[FE_ID] = $feId; if ($formElementFromFile[FE_CLASS] === FE_CLASS_CONTAINER) { @@ -180,9 +172,9 @@ class FormAsFile } // Update container IDs for each form element which has a container name - foreach ($formFromFile[FORM_FILE_FORM_ELEMENT] as &$formElementFromFile) { - if (array_key_exists(FORM_FILE_CONTAINER_NAME, $formElementFromFile)) { - $containerName = $formElementFromFile[FORM_FILE_CONTAINER_NAME]; + foreach ($formFromFile[F_FILE_FORM_ELEMENT] as &$formElementFromFile) { + if (array_key_exists(FE_FILE_CONTAINER_NAME, $formElementFromFile)) { + $containerName = $formElementFromFile[FE_FILE_CONTAINER_NAME]; $containerId = $containerIds[$containerName]; $feId = $formElementFromFile[FE_ID]; list($sql, $parameterArray) = SqlQuery::updateRecord(TABLE_NAME_FORM_ELEMENT, [FE_ID_CONTAINER => $containerId], $feId); @@ -252,7 +244,7 @@ class FormAsFile $formElements = array_map(function ($formElement) use ($containerNames) { $containerId = $formElement[FE_ID_CONTAINER]; if ($containerId !== 0) { - $formElement[FORM_FILE_CONTAINER_NAME] = $containerNames[$containerId]; + $formElement[FE_FILE_CONTAINER_NAME] = $containerNames[$containerId]; } unset($formElement[FE_ID_CONTAINER]); unset($formElement[FE_ID]); @@ -261,7 +253,7 @@ class FormAsFile }, $formElements); // write form as JSON to file - $form[FORM_FILE_FORM_ELEMENT] = $formElements; + $form[F_FILE_FORM_ELEMENT] = $formElements; $formJson = json_encode($form, JSON_PRETTY_PRINT); $pathFileName = self::formPathFileName($formName, $database); $success = file_put_contents($pathFileName, $formJson); @@ -632,10 +624,12 @@ class FormAsFile * @throws \CodeException * @throws \DbException * @throws \UserFormException + * @throws \UserReportException */ private static function formPath(Database $database): string { - $formPath = HelperFile::correctRelativePathFileName(SYSTEM_FORM_FILE_PATH); + $systemQfqProjectDir = Store::getInstance()->getVar(SYSTEM_QFQ_PROJECT_DIR_SECURE, STORE_SYSTEM); + $formPath = HelperFile::correctRelativePathFileName(HelperFile::joinPathFilename($systemQfqProjectDir, 'form')); if (!is_dir($formPath)) { // create path diff --git a/extension/Classes/Core/QuickFormQuery.php b/extension/Classes/Core/QuickFormQuery.php index a22a3f86a..d1e3e114d 100644 --- a/extension/Classes/Core/QuickFormQuery.php +++ b/extension/Classes/Core/QuickFormQuery.php @@ -422,7 +422,7 @@ class QuickFormQuery { } } - // Make sure form file is writable (before DB changes are made) + // FormAsFile: Get the new and the old form file name and make sure both files are writable (before DB changes are made) // Note: This can't be done earlier because $formModeNew might be changed in the lines above. $formNameDB = FormAsFile::formNameFromFormRelatedRecord($recordId, $this->formSpec[F_TABLE_NAME], $this->dbArray[$this->dbIndexQfq]); switch ($this->formSpec[F_TABLE_NAME]) { diff --git a/extension/ext_conf_template.txt b/extension/ext_conf_template.txt index 979b6616d..26c3c29a1 100644 --- a/extension/ext_conf_template.txt +++ b/extension/ext_conf_template.txt @@ -13,6 +13,9 @@ baseUrl = # cat=config/date; type=string; label=Date format:Default is 'dd.mm.yyyy'. Possible options: 'yyyy-mm-dd', 'dd.mm.yyyy' dateFormat = dd.mm.yyyy +# cat=config/config; type=string; label=QFQ project directory:Default is 'fileadmin/protected/qfqProject'. Important: secure the directory (recursive) against direct access. Forms and reports are saved in this directory. +qfqProjectDir = fileadmin/protected/qfqProject + # cat=config/config; type=string; label=Thumbnail directory 'secure':Default is 'fileadmin/protected/qfqThumbnail'. Important: secure the directory (recursive) against direct access. Will be used by a special columnname '_thumbnail'. thumbnailDirSecure = fileadmin/protected/qfqThumbnail -- GitLab From d41f0f743858b8c2e0277fb065b3fc6d748cc8a6 Mon Sep 17 00:00:00 2001 From: Marc Egger <marc.egger@uzh.ch> Date: Tue, 21 Jul 2020 15:39:37 +0200 Subject: [PATCH 047/195] Refs #10120 extract sql queries which are used multiple times --- extension/Classes/Core/Form/FormAsFile.php | 51 ++++++++------------ extension/Classes/Core/Helper/SqlQuery.php | 55 ++++++++++++++++++++++ 2 files changed, 74 insertions(+), 32 deletions(-) diff --git a/extension/Classes/Core/Form/FormAsFile.php b/extension/Classes/Core/Form/FormAsFile.php index 78ddf725d..3d1d71170 100644 --- a/extension/Classes/Core/Form/FormAsFile.php +++ b/extension/Classes/Core/Form/FormAsFile.php @@ -22,13 +22,10 @@ use IMATHUZH\Qfq\Core\Store\Store; // TODO: Carsten Fragen: PHP version von gitlab runner hochstellen, damit ?string und void type syntax fuer funktionen erlaubt ist? verhindert einige fehler // TODO: Carsten Fragen: Regex fuer erlaubte file names und form names im editor (+ erlauben?): ^([-\.\w]+)$ VS [a-zA-Z0-9._+-]+ // TODO: Carsten Fragen: Muss die neue Column fileStats von Form tabelle in DatabaseUpdateData.php? Form Editor wird ja sowieso neu eingespielt bei einem update. -// TODO: Carsten Fragen: QFQ as file +// TODO: Carsten Fragen: add log messages somewhare? // TODO: BEFOORE PRUDUCTION - // TODO: extract all sql queries and make them reusable // TODO: write tests (file test https://medium.com/weebly-engineering/phpunit-mocking-the-file-system-using-vfsstream-5d7d79b1eb2a) - // TODO: maybe: update button in form list which removes forms from DB if their file was deleted - // TODO: Carsten Fragen: add log messages somewhare? // TODO: Tests: // new form => form file created // form field change editor => changed in form file @@ -124,12 +121,9 @@ class FormAsFile self::deleteFormDB($formName, $database); throw $fileReadException; } - $F_ID = F_ID; // can't use constants in strings directly - $F_FILE_STATS = F_FILE_STATS; // can't use constants in strings directly - $F_NAME = F_NAME; // can't use constants in strings directly - $TABLE_NAME_FORM = TABLE_NAME_FORM; // can't use constants in strings directly - $formFromDb = $database->sql("SELECT `$F_ID`, `$F_FILE_STATS` FROM `$TABLE_NAME_FORM` AS f WHERE `f`.`$F_NAME` LIKE ? AND `f`.`deleted`='no'", ROW_EXPECT_0_1, - [$formName], "Multiple forms with the same name: '$formName'"); + list($sql, $parameterArray) = SqlQuery::selectFormByName($formName, [F_ID, F_FILE_STATS]); + $formFromDb = $database->sql($sql, ROW_EXPECT_0_1, + $parameterArray, "Multiple forms with the same name: '$formName'"); if (array_key_exists(F_FILE_STATS, $formFromDb) && $fileStatsNew === $formFromDb[F_FILE_STATS]) { return false; } @@ -144,7 +138,7 @@ class FormAsFile // Delete old form with that name from DB if it exists. if (array_key_exists(F_ID, $formFromDb)) { - $formId = $formFromDb[$F_ID]; + $formId = $formFromDb[F_ID]; self::deleteFormDBWithId($formId, $database); } @@ -208,11 +202,9 @@ class FormAsFile public static function exportForm(string $formName, Database $database) // : void { // Get form from DB - $FORM = TABLE_NAME_FORM; // can't use constants in strings directly - $NAME = F_NAME; // can't use constants in strings directly - $DELETED = F_DELETED; // can't use constants in strings directly - $form = $database->sql("SELECT * FROM `$FORM` AS f WHERE `f`.`$NAME` LIKE ? AND `f`.`$DELETED`='no'", ROW_EXPECT_1, - [$formName], 'Form "' . $formName . '" not found or multiple forms with the same name.'); // array(column name => value) + list($sql, $parameterArray) = SqlQuery::selectFormByName($formName); + $form = $database->sql($sql, ROW_EXPECT_1, + $parameterArray, 'Form "' . $formName . '" not found or multiple forms with the same name.'); // array(column name => value) // Remove columns: id, name, fileStats $formId = $form[F_ID]; @@ -221,11 +213,8 @@ class FormAsFile unset($form[F_FILE_STATS]); // Get formElements from DB - $FORM_ELEMENT = TABLE_NAME_FORM_ELEMENT; // can't use constants in strings directly - $FORM_ID = FE_FORM_ID; // can't use constants in strings directly - $ORD = FE_ORD; // can't use constants in strings directly - $ID = FE_ID; // can't use constants in strings directly - $formElements = $database->sql("SELECT * FROM `$FORM_ELEMENT` AS `fe` WHERE `fe`.`$FORM_ID` = ? ORDER BY `fe`.`$ORD`, `fe`.`$ID`", ROW_REGULAR, [$formId]); // array(array(column name => value)) + list($sql, $parameterArray) = SqlQuery::selectFormElementById($formId); + $formElements = $database->sql($sql, ROW_REGULAR, $parameterArray); // array(array(column name => value)) // Translate container references (id to name) and remove all id columns $containerNames = array_reduce($formElements, function ($result, $formElement) { @@ -388,11 +377,9 @@ class FormAsFile } switch ($recordTable) { case TABLE_NAME_FORM: - $F_NAME = F_NAME; - $TABLE_NAME_FORM = TABLE_NAME_FORM; - $F_ID = F_ID; - $formFromDb = $database->sql("SELECT `$F_NAME` FROM `$TABLE_NAME_FORM` AS f WHERE `f`.`$F_ID`=? AND `f`.`deleted`='no'", ROW_EXPECT_1, - [$recordId], "Form with id '$recordId' not found. " . self::errorHintFormImport()); + list($sql, $parameterArray) = SqlQuery::selectFormById($recordId); + $formFromDb = $database->sql($sql, ROW_EXPECT_1, + $parameterArray, "Form with id '$recordId' not found. " . self::errorHintFormImport()); return $formFromDb[F_NAME]; case TABLE_NAME_FORM_ELEMENT: $F_NAME = F_NAME; @@ -401,6 +388,8 @@ class FormAsFile $F_ID = F_ID; $FE_FORM_ID = FE_FORM_ID; $FE_ID = FE_ID; + + // Select form name by formElement id $formFromDb = $database->sql("SELECT `f`.`$F_NAME` FROM `$TABLE_NAME_FORM` AS f INNER JOIN `$TABLE_NAME_FORM_ELEMENT` AS fe ON f.`$F_ID`=fe.`$FE_FORM_ID` WHERE `fe`.`$FE_ID`=?", ROW_EXPECT_1, [$recordId], "Form element with id '$recordId' not found. " . self::errorHintFormImport()); return $formFromDb[F_NAME]; @@ -529,13 +518,11 @@ class FormAsFile */ private static function deleteFormDB(string $formName, Database $database) // : void { - $F_ID = F_ID; // can't use constants in strings directly - $F_NAME = F_NAME; // can't use constants in strings directly - $TABLE_NAME_FORM = TABLE_NAME_FORM; // can't use constants in strings directly - $formFromDb = $database->sql("SELECT `$F_ID` FROM `$TABLE_NAME_FORM` AS f WHERE `f`.`$F_NAME` LIKE ? AND `f`.`deleted`='no'", ROW_EXPECT_0_1, - [$formName], "Multiple forms with the same name: '$formName'"); + list($sql, $parameterArray) = SqlQuery::selectFormByName($formName, [F_ID]); + $formFromDb = $database->sql($sql, ROW_EXPECT_0_1, + $parameterArray, "Multiple forms with the same name: '$formName'"); if (array_key_exists(F_ID, $formFromDb)) { - self::deleteFormDBWithId($formFromDb[$F_ID], $database); + self::deleteFormDBWithId($formFromDb[F_ID], $database); } } diff --git a/extension/Classes/Core/Helper/SqlQuery.php b/extension/Classes/Core/Helper/SqlQuery.php index 0773ef1e8..b518b84c3 100644 --- a/extension/Classes/Core/Helper/SqlQuery.php +++ b/extension/Classes/Core/Helper/SqlQuery.php @@ -57,4 +57,59 @@ class SqlQuery { $parameterArray = array_values($values); return array($sql, $parameterArray); } + + /** + * @param string $formName + * @param array|null $columnsToSelect + * @return array + */ + public static function selectFormByName(string $formName, array $columnsToSelect = null): array + { + $NAME = F_NAME; // can't use constants in strings directly + $FORM = TABLE_NAME_FORM; + $DELETED = F_DELETED; + $sql = "SELECT " . self::columnListSelect($columnsToSelect) . " FROM `$FORM` AS f WHERE `f`.`$NAME` LIKE ? AND `f`.`$DELETED`='no'"; + return array($sql, [$formName]); + } + + /** + * @param int $fId + * @param array|null $columnsToSelect + * @return array + */ + public static function selectFormById(int $fId, array $columnsToSelect = null): array + { + $FORM = TABLE_NAME_FORM; // can't use constants in strings directly + $ID = F_ID; + $DELETED = F_DELETED; + $sql = "SELECT " . self::columnListSelect($columnsToSelect) . " FROM `$FORM` AS f WHERE `f`.`$ID`=? AND `f`.`$DELETED`='no'"; + return array($sql, [$fId]); + } + + /** + * @param int $feId + * @param array|null $columnsToSelect + * @return array + */ + public static function selectFormElementById(int $feId, array $columnsToSelect = null): array + { + $FORM_ELEMENT = TABLE_NAME_FORM_ELEMENT; // can't use constants in strings directly + $FORM_ID = FE_FORM_ID; + $ORD = FE_ORD; + $ID = FE_ID; + $sql = "SELECT " . self::columnListSelect($columnsToSelect) . " FROM `$FORM_ELEMENT` AS `fe` WHERE `fe`.`$FORM_ID` = ? ORDER BY `fe`.`$ORD`, `fe`.`$ID`"; + return array($sql, [$feId]); + } + + /** + * @param array|null $columns + * @return string + */ + private static function columnListSelect(array $columns = null) { + if ($columns === null) { + return ' * '; + } else { + return '`' . implode('`, `', $columns) . '`'; + } + } } -- GitLab From acd786c5466bb1ac4771b1a263e59b2b940eb667 Mon Sep 17 00:00:00 2001 From: Marc Egger <marc.egger@uzh.ch> Date: Tue, 21 Jul 2020 16:05:05 +0200 Subject: [PATCH 048/195] Refs #10120 remove unnecessary log records in Selenium test application --- docker/db_fixture_qfq.sql | 1 - 1 file changed, 1 deletion(-) diff --git a/docker/db_fixture_qfq.sql b/docker/db_fixture_qfq.sql index 528919e51..3419c072a 100644 --- a/docker/db_fixture_qfq.sql +++ b/docker/db_fixture_qfq.sql @@ -312,7 +312,6 @@ CREATE TABLE `FormSubmitLog` ( LOCK TABLES `FormSubmitLog` WRITE; /*!40000 ALTER TABLE `FormSubmitLog` DISABLE KEYS */; -INSERT INTO `FormSubmitLog` VALUES (1,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_showButton-0\":\"\",\"labelAlign-0\":\"default\",\"forwardMode-0\":\"client\",\"permitNew-0\":\"sip\",\"permitEdit-0\":\"sip\",\"escapeTypeDefault-0\":\"c\",\"dirtyMode-0\":\"exclusive\",\"name-0\":\"person\",\"title-0\":\"\",\"noteInternal-0\":\"\",\"tableName-0\":\"Person\",\"parameterLanguageA-0\":\"\",\"parameterLanguageB-0\":\"\",\"parameterLanguageC-0\":\"\",\"parameterLanguageD-0\":\"\",\"_0_showButton-0\":\"new\",\"_1_showButton-0\":\"delete\",\"_2_showButton-0\":\"close\",\"_3_showButton-0\":\"save\",\"parameter-0\":\"\",\"bsLabelColumns-0\":\"\",\"bsInputColumns-0\":\"\",\"bsNoteColumns-0\":\"\",\"forwardPage-0\":\"\",\"requiredParameterNew-0\":\"\",\"requiredParameterEdit-0\":\"\",\"recordLockTimeoutSeconds-0\":\"900\",\"primaryKey-0\":\"\",\"_sipForTypo3Vars\":\"5c7fcdeac4592\"}','{\"__dbIndexData\":\"1\",\"form\":\"form\",\"r\":\"0\",\"s\":\"5c7fca5da89d3\",\"urlparam\":\"__dbIndexData=1&form=form&r=0\"}','172.17.0.1','','Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:65.0) Gecko/20100101 Firefox/65.0',1,0,1,'475737fdf9ab351faecafce82bfe0379','2019-03-06 13:41:35'),(2,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"enabled-0\":\"yes\",\"dynamicUpdate-0\":\"no\",\"mode-0\":\"show\",\"_h_subrecordOption-0\":\"\",\"encode-0\":\"specialchar\",\"checkType-0\":\"auto\",\"labelAlign-0\":\"default\",\"_h_rowLabelInputNote-0\":\"\",\"feIdContainer-0\":\"\",\"name-0\":\"prename\",\"label-0\":\"\",\"modeSql-0\":\"\",\"class-0\":\"native\",\"type-0\":\"text\",\"parameterLanguageA-0\":\"\",\"parameterLanguageB-0\":\"\",\"parameterLanguageC-0\":\"\",\"parameterLanguageD-0\":\"\",\"checkPattern-0\":\"\",\"ord-0\":\"10\",\"tabindex-0\":\"0\",\"adminNote-0\":\"\",\"size-0\":\"\",\"bsLabelColumns-0\":\"\",\"bsInputColumns-0\":\"\",\"bsNoteColumns-0\":\"\",\"_0_rowLabelInputNote-0\":\"row\",\"_1_rowLabelInputNote-0\":\"label\",\"_2_rowLabelInputNote-0\":\"\\/label\",\"_3_rowLabelInputNote-0\":\"input\",\"_4_rowLabelInputNote-0\":\"\\/input\",\"_5_rowLabelInputNote-0\":\"note\",\"_6_rowLabelInputNote-0\":\"\\/note\",\"_7_rowLabelInputNote-0\":\"\\/row\",\"maxLength-0\":\"\",\"note-0\":\"\",\"tooltip-0\":\"\",\"placeholder-0\":\"\",\"value-0\":\"\",\"sql1-0\":\"\",\"parameter-0\":\"\",\"_sipForTypo3Vars\":\"5c7fd04e44c20\"}','{\"__dbIndexData\":\"1\",\"form\":\"formElement\",\"formId\":\"1000\",\"r\":\"0\",\"s\":\"5c7fd04e4129a\",\"urlparam\":\"__dbIndexData=1&form=formElement&formId=1000&r=0\"}','172.17.0.1','','Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:65.0) Gecko/20100101 Firefox/65.0',2,0,1,'475737fdf9ab351faecafce82bfe0379','2019-03-06 13:51:37'),(3,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"enabled-0\":\"yes\",\"dynamicUpdate-0\":\"no\",\"mode-0\":\"show\",\"_h_subrecordOption-0\":\"\",\"encode-0\":\"specialchar\",\"checkType-0\":\"auto\",\"labelAlign-0\":\"default\",\"_h_rowLabelInputNote-0\":\"\",\"feIdContainer-0\":\"\",\"name-0\":\"surname\",\"label-0\":\"surname\",\"modeSql-0\":\"\",\"class-0\":\"native\",\"type-0\":\"text\",\"parameterLanguageA-0\":\"\",\"parameterLanguageB-0\":\"\",\"parameterLanguageC-0\":\"\",\"parameterLanguageD-0\":\"\",\"checkPattern-0\":\"\",\"ord-0\":\"20\",\"tabindex-0\":\"0\",\"adminNote-0\":\"\",\"size-0\":\"\",\"bsLabelColumns-0\":\"\",\"bsInputColumns-0\":\"\",\"bsNoteColumns-0\":\"\",\"_0_rowLabelInputNote-0\":\"row\",\"_1_rowLabelInputNote-0\":\"label\",\"_2_rowLabelInputNote-0\":\"\\/label\",\"_3_rowLabelInputNote-0\":\"input\",\"_4_rowLabelInputNote-0\":\"\\/input\",\"_5_rowLabelInputNote-0\":\"note\",\"_6_rowLabelInputNote-0\":\"\\/note\",\"_7_rowLabelInputNote-0\":\"\\/row\",\"maxLength-0\":\"\",\"note-0\":\"\",\"tooltip-0\":\"\",\"placeholder-0\":\"\",\"value-0\":\"\",\"sql1-0\":\"\",\"parameter-0\":\"\",\"_sipForTypo3Vars\":\"5c7fd04e44c20\"}','{\"__dbIndexData\":\"1\",\"form\":\"formElement\",\"formId\":\"1000\",\"r\":\"0\",\"s\":\"5c7fd04e4129a\",\"urlparam\":\"__dbIndexData=1&form=formElement&formId=1000&r=0\"}','172.17.0.1','','Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:65.0) Gecko/20100101 Firefox/65.0',2,0,1,'475737fdf9ab351faecafce82bfe0379','2019-03-06 13:51:52'),(4,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"prename-0\":\"hans\",\"surname-0\":\"lauda\",\"_sipForTypo3Vars\":\"5c7fd04946252\"}','{\"__dbIndexData\":\"1\",\"form\":\"person\",\"r\":\"0\",\"s\":\"5c7fd0386d92c\",\"urlparam\":\"__dbIndexData=1&form=person&r=0\"}','172.17.0.1','','Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:65.0) Gecko/20100101 Firefox/65.0',1000,0,2,'475737fdf9ab351faecafce82bfe0379','2019-03-06 13:52:34'),(5,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_showButton-0\":\"\",\"labelAlign-0\":\"default\",\"forwardMode-0\":\"client\",\"permitNew-0\":\"sip\",\"permitEdit-0\":\"sip\",\"escapeTypeDefault-0\":\"c\",\"dirtyMode-0\":\"exclusive\",\"name-0\":\"form-name\",\"title-0\":\"\",\"noteInternal-0\":\"\",\"tableName-0\":\"Dirty\",\"parameterLanguageA-0\":\"\",\"parameterLanguageB-0\":\"\",\"parameterLanguageC-0\":\"\",\"parameterLanguageD-0\":\"\",\"_0_showButton-0\":\"new\",\"_1_showButton-0\":\"delete\",\"_2_showButton-0\":\"close\",\"_3_showButton-0\":\"save\",\"parameter-0\":\"\",\"bsLabelColumns-0\":\"\",\"bsInputColumns-0\":\"\",\"bsNoteColumns-0\":\"\",\"forwardPage-0\":\"\",\"requiredParameterNew-0\":\"\",\"requiredParameterEdit-0\":\"\",\"recordLockTimeoutSeconds-0\":\"900\",\"primaryKey-0\":\"\",\"_sipForTypo3Vars\":\"5c7fd33595fc0\"}','{\"__dbIndexData\":\"1\",\"form\":\"form\",\"r\":\"0\",\"s\":\"5c7fd334320ef\",\"urlparam\":\"__dbIndexData=1&form=form&r=0\"}','172.17.0.1','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.121 Safari/537.36',1,0,1,'5576400e63a37abe4db11a389f8fc3fb','2019-03-06 14:03:35'),(6,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"prename-0\":\"Hans\",\"surname-0\":\"Lauda\",\"_sipForTypo3Vars\":\"5c7fd33c5a57b\"}','{\"__dbIndexData\":\"1\",\"form\":\"person\",\"r\":\"0\",\"s\":\"5c7fd33b123a7\",\"urlparam\":\"__dbIndexData=1&form=person&r=0\"}','172.17.0.1','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.121 Safari/537.36',1000,0,2,'392dd087ba34ad7be1882ec5ac2a47ce','2019-03-06 14:03:41'),(7,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_showButton-0\":\"\",\"labelAlign-0\":\"default\",\"forwardMode-0\":\"client\",\"permitNew-0\":\"sip\",\"permitEdit-0\":\"sip\",\"escapeTypeDefault-0\":\"c\",\"dirtyMode-0\":\"exclusive\",\"name-0\":\"form-name\",\"title-0\":\"\",\"noteInternal-0\":\"\",\"tableName-0\":\"Dirty\",\"parameterLanguageA-0\":\"\",\"parameterLanguageB-0\":\"\",\"parameterLanguageC-0\":\"\",\"parameterLanguageD-0\":\"\",\"_0_showButton-0\":\"new\",\"_1_showButton-0\":\"delete\",\"_2_showButton-0\":\"close\",\"_3_showButton-0\":\"save\",\"parameter-0\":\"\",\"bsLabelColumns-0\":\"\",\"bsInputColumns-0\":\"\",\"bsNoteColumns-0\":\"\",\"forwardPage-0\":\"\",\"requiredParameterNew-0\":\"\",\"requiredParameterEdit-0\":\"\",\"recordLockTimeoutSeconds-0\":\"900\",\"primaryKey-0\":\"\",\"_sipForTypo3Vars\":\"5c7fd3b201190\"}','{\"__dbIndexData\":\"1\",\"form\":\"form\",\"r\":\"0\",\"s\":\"5c7fd3b0702d9\",\"urlparam\":\"__dbIndexData=1&form=form&r=0\"}','172.17.0.1','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.121 Safari/537.36',1,0,1,'48129ce8a5459ae032227ea92e5a0089','2019-03-06 14:05:39'),(8,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"prename-0\":\"Hans\",\"surname-0\":\"Lauda\",\"_sipForTypo3Vars\":\"5c7fd3b91fea4\"}','{\"__dbIndexData\":\"1\",\"form\":\"person\",\"r\":\"0\",\"s\":\"5c7fd3b7c5e7e\",\"urlparam\":\"__dbIndexData=1&form=person&r=0\"}','172.17.0.1','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.121 Safari/537.36',1000,0,2,'bb03f1a35b7ae759510d799b5a095e2f','2019-03-06 14:05:46'),(9,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_showButton-0\":\"\",\"labelAlign-0\":\"default\",\"forwardMode-0\":\"client\",\"permitNew-0\":\"sip\",\"permitEdit-0\":\"sip\",\"escapeTypeDefault-0\":\"c\",\"dirtyMode-0\":\"exclusive\",\"name-0\":\"form-name\",\"title-0\":\"\",\"noteInternal-0\":\"\",\"tableName-0\":\"Dirty\",\"parameterLanguageA-0\":\"\",\"parameterLanguageB-0\":\"\",\"parameterLanguageC-0\":\"\",\"parameterLanguageD-0\":\"\",\"_0_showButton-0\":\"new\",\"_1_showButton-0\":\"delete\",\"_2_showButton-0\":\"close\",\"_3_showButton-0\":\"save\",\"parameter-0\":\"\",\"bsLabelColumns-0\":\"\",\"bsInputColumns-0\":\"\",\"bsNoteColumns-0\":\"\",\"forwardPage-0\":\"\",\"requiredParameterNew-0\":\"\",\"requiredParameterEdit-0\":\"\",\"recordLockTimeoutSeconds-0\":\"900\",\"primaryKey-0\":\"\",\"_sipForTypo3Vars\":\"5c7fd4614146f\"}','{\"__dbIndexData\":\"1\",\"form\":\"form\",\"r\":\"0\",\"s\":\"5c7fd45f86a2e\",\"urlparam\":\"__dbIndexData=1&form=form&r=0\"}','172.17.0.1','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.121 Safari/537.36',1,0,1,'97e8abfd80eae5492a47c08a5c639a7d','2019-03-06 14:08:34'),(10,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"prename-0\":\"Hans\",\"surname-0\":\"Lauda\",\"_sipForTypo3Vars\":\"5c7fd464d98b0\"}','{\"__dbIndexData\":\"1\",\"form\":\"person\",\"r\":\"0\",\"s\":\"5c7fd4640a9af\",\"urlparam\":\"__dbIndexData=1&form=person&r=0\"}','172.17.0.1','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.121 Safari/537.36',1000,0,2,'97e8abfd80eae5492a47c08a5c639a7d','2019-03-06 14:08:37'),(11,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_showButton-0\":\"\",\"labelAlign-0\":\"default\",\"forwardMode-0\":\"client\",\"permitNew-0\":\"sip\",\"permitEdit-0\":\"sip\",\"escapeTypeDefault-0\":\"c\",\"dirtyMode-0\":\"exclusive\",\"name-0\":\"form-name\",\"title-0\":\"\",\"noteInternal-0\":\"\",\"tableName-0\":\"Dirty\",\"parameterLanguageA-0\":\"\",\"parameterLanguageB-0\":\"\",\"parameterLanguageC-0\":\"\",\"parameterLanguageD-0\":\"\",\"_0_showButton-0\":\"new\",\"_1_showButton-0\":\"delete\",\"_2_showButton-0\":\"close\",\"_3_showButton-0\":\"save\",\"parameter-0\":\"\",\"bsLabelColumns-0\":\"\",\"bsInputColumns-0\":\"\",\"bsNoteColumns-0\":\"\",\"forwardPage-0\":\"\",\"requiredParameterNew-0\":\"\",\"requiredParameterEdit-0\":\"\",\"recordLockTimeoutSeconds-0\":\"900\",\"primaryKey-0\":\"\",\"_sipForTypo3Vars\":\"5c7fd481c8eff\"}','{\"__dbIndexData\":\"1\",\"form\":\"form\",\"r\":\"0\",\"s\":\"5c7fd4803504d\",\"urlparam\":\"__dbIndexData=1&form=form&r=0\"}','172.17.0.1','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.121 Safari/537.36',1,0,1,'1774a804ec793e080544c265678e4f8c','2019-03-06 14:09:07'),(12,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"prename-0\":\"Hans\",\"surname-0\":\"Lauda\",\"_sipForTypo3Vars\":\"5c7fd485cdf35\"}','{\"__dbIndexData\":\"1\",\"form\":\"person\",\"r\":\"0\",\"s\":\"5c7fd4852baac\",\"urlparam\":\"__dbIndexData=1&form=person&r=0\"}','172.17.0.1','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.121 Safari/537.36',1000,0,2,'1774a804ec793e080544c265678e4f8c','2019-03-06 14:09:10'),(13,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_showButton-0\":\"\",\"labelAlign-0\":\"default\",\"forwardMode-0\":\"client\",\"permitNew-0\":\"sip\",\"permitEdit-0\":\"sip\",\"escapeTypeDefault-0\":\"c\",\"dirtyMode-0\":\"exclusive\",\"name-0\":\"form-name\",\"title-0\":\"\",\"noteInternal-0\":\"\",\"tableName-0\":\"Dirty\",\"parameterLanguageA-0\":\"\",\"parameterLanguageB-0\":\"\",\"parameterLanguageC-0\":\"\",\"parameterLanguageD-0\":\"\",\"_0_showButton-0\":\"new\",\"_1_showButton-0\":\"delete\",\"_2_showButton-0\":\"close\",\"_3_showButton-0\":\"save\",\"parameter-0\":\"\",\"bsLabelColumns-0\":\"\",\"bsInputColumns-0\":\"\",\"bsNoteColumns-0\":\"\",\"forwardPage-0\":\"\",\"requiredParameterNew-0\":\"\",\"requiredParameterEdit-0\":\"\",\"recordLockTimeoutSeconds-0\":\"900\",\"primaryKey-0\":\"\",\"_sipForTypo3Vars\":\"5c7fd4a793dd0\"}','{\"__dbIndexData\":\"1\",\"form\":\"form\",\"r\":\"0\",\"s\":\"5c7fd4a5856e3\",\"urlparam\":\"__dbIndexData=1&form=form&r=0\"}','172.17.0.1','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.121 Safari/537.36',1,0,1,'3cc31149503917c60f8a727433350f4b','2019-03-06 14:09:45'),(14,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"prename-0\":\"Hans\",\"surname-0\":\"Lauda\",\"_sipForTypo3Vars\":\"5c7fd4ab62e1b\"}','{\"__dbIndexData\":\"1\",\"form\":\"person\",\"r\":\"0\",\"s\":\"5c7fd4aa8af30\",\"urlparam\":\"__dbIndexData=1&form=person&r=0\"}','172.17.0.1','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.121 Safari/537.36',1000,0,2,'3cc31149503917c60f8a727433350f4b','2019-03-06 14:09:48'),(15,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_showButton-0\":\"\",\"labelAlign-0\":\"default\",\"forwardMode-0\":\"client\",\"permitNew-0\":\"sip\",\"permitEdit-0\":\"sip\",\"escapeTypeDefault-0\":\"c\",\"dirtyMode-0\":\"exclusive\",\"name-0\":\"form-name\",\"title-0\":\"\",\"noteInternal-0\":\"\",\"tableName-0\":\"Dirty\",\"parameterLanguageA-0\":\"\",\"parameterLanguageB-0\":\"\",\"parameterLanguageC-0\":\"\",\"parameterLanguageD-0\":\"\",\"_0_showButton-0\":\"new\",\"_1_showButton-0\":\"delete\",\"_2_showButton-0\":\"close\",\"_3_showButton-0\":\"save\",\"parameter-0\":\"\",\"bsLabelColumns-0\":\"\",\"bsInputColumns-0\":\"\",\"bsNoteColumns-0\":\"\",\"forwardPage-0\":\"\",\"requiredParameterNew-0\":\"\",\"requiredParameterEdit-0\":\"\",\"recordLockTimeoutSeconds-0\":\"900\",\"primaryKey-0\":\"\",\"_sipForTypo3Vars\":\"5c7fdbb73eb1d\"}','{\"__dbIndexData\":\"1\",\"form\":\"form\",\"r\":\"0\",\"s\":\"5c7fdbb58b212\",\"urlparam\":\"__dbIndexData=1&form=form&r=0\"}','172.17.0.1','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.121 Safari/537.36',1,0,1,'9771d745a935e12d16cb4b4ba5cdd0f6','2019-03-06 14:39:52'),(16,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"prename-0\":\"Hans\",\"surname-0\":\"Lauda\",\"_sipForTypo3Vars\":\"5c7fdbbb5ec22\"}','{\"__dbIndexData\":\"1\",\"form\":\"person\",\"r\":\"0\",\"s\":\"5c7fdbba6bfb1\",\"urlparam\":\"__dbIndexData=1&form=person&r=0\"}','172.17.0.1','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.121 Safari/537.36',1000,0,2,'9771d745a935e12d16cb4b4ba5cdd0f6','2019-03-06 14:39:56'),(17,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"prename-0\":\"Hans3\",\"surname-0\":\"\",\"_sipForTypo3Vars\":\"5c7fdf5211d56\"}','{\"__dbIndexData\":\"1\",\"form\":\"person\",\"r\":\"0\",\"s\":\"5c7fdf503c9f2\",\"urlparam\":\"__dbIndexData=1&form=person&r=0\"}','172.17.0.1','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.121 Safari/537.36',1000,0,2,'091dcc7419efc1cebdeb4658fbbab44f','2019-03-06 14:55:18'),(18,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"prename-0\":\"sdf\",\"surname-0\":\"\",\"_sipForTypo3Vars\":\"5c7fd04946252\"}','{\"__dbIndexData\":\"1\",\"form\":\"person\",\"r\":\"0\",\"s\":\"5c7fd0386d92c\",\"urlparam\":\"__dbIndexData=1&form=person&r=0\"}','172.17.0.1','','Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:65.0) Gecko/20100101 Firefox/65.0',1000,0,2,'475737fdf9ab351faecafce82bfe0379','2019-03-06 14:55:45'),(19,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"prename-0\":\"sdfdfg\",\"surname-0\":\"\",\"_sipForTypo3Vars\":\"5c7fd04946252\"}','{\"__dbIndexData\":\"1\",\"form\":\"person\",\"r\":\"0\",\"s\":\"5c7fd0386d92c\",\"urlparam\":\"__dbIndexData=1&form=person&r=0\"}','172.17.0.1','','Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:65.0) Gecko/20100101 Firefox/65.0',1000,0,2,'475737fdf9ab351faecafce82bfe0379','2019-03-06 14:55:58'),(20,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"prename-0\":\"Hans3\",\"surname-0\":\"\",\"_sipForTypo3Vars\":\"5c7fdf95824dc\"}','{\"__dbIndexData\":\"1\",\"form\":\"person\",\"r\":\"0\",\"s\":\"5c7fdf93c0748\",\"urlparam\":\"__dbIndexData=1&form=person&r=0\"}','172.17.0.1','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.121 Safari/537.36',1000,0,2,'36d8f8e582b167975ac8dc545ff6106f','2019-03-06 14:56:26'),(21,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_showButton-0\":\"\",\"labelAlign-0\":\"default\",\"forwardMode-0\":\"auto\",\"permitNew-0\":\"sip\",\"permitEdit-0\":\"sip\",\"_h_prestMethod-0\":\"\",\"escapeTypeDefault-0\":\"c\",\"dirtyMode-0\":\"exclusive\",\"name-0\":\"basicForm\",\"title-0\":\"\",\"noteInternal-0\":\"\",\"tableName-0\":\"BasicForm\",\"parameterLanguageA-0\":\"\",\"parameterLanguageB-0\":\"\",\"parameterLanguageC-0\":\"\",\"parameterLanguageD-0\":\"\",\"_0_showButton-0\":\"new\",\"_1_showButton-0\":\"delete\",\"_2_showButton-0\":\"close\",\"_3_showButton-0\":\"save\",\"parameter-0\":\"\",\"bsLabelColumns-0\":\"\",\"bsInputColumns-0\":\"\",\"bsNoteColumns-0\":\"\",\"forwardPage-0\":\"\",\"requiredParameterNew-0\":\"\",\"requiredParameterEdit-0\":\"\",\"recordLockTimeoutSeconds-0\":\"900\",\"primaryKey-0\":\"\",\"_sipForTypo3Vars\":\"5d9c68b529aa9\"}','{\"__dbIndexData\":\"1\",\"form\":\"form\",\"r\":\"0\",\"s\":\"5d9c2f6bde7ca\",\"urlparam\":\"__dbIndexData=1&form=form&r=0\"}','192.168.133.187','','Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:69.0) Gecko/20100101 Firefox/69.0',1,0,1,'bd9ca9c19bc5f064dc211cedfaa063bb','2019-10-08 10:45:34'),(22,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"enabled-0\":\"yes\",\"dynamicUpdate-0\":\"no\",\"mode-0\":\"required\",\"class-0\":\"native\",\"_h_subrecordOption-0\":\"\",\"encode-0\":\"specialchar\",\"checkType-0\":\"auto\",\"labelAlign-0\":\"default\",\"_h_rowLabelInputNote-0\":\"\",\"feIdContainer-0\":\"\",\"name-0\":\"text\",\"label-0\":\"text\",\"modeSql-0\":\"\",\"type-0\":\"text\",\"parameterLanguageA-0\":\"\",\"parameterLanguageB-0\":\"\",\"parameterLanguageC-0\":\"\",\"parameterLanguageD-0\":\"\",\"checkPattern-0\":\"\",\"ord-0\":\"10\",\"adminNote-0\":\"\",\"size-0\":\"\",\"bsLabelColumns-0\":\"\",\"bsInputColumns-0\":\"\",\"bsNoteColumns-0\":\"\",\"_0_rowLabelInputNote-0\":\"row\",\"_1_rowLabelInputNote-0\":\"label\",\"_2_rowLabelInputNote-0\":\"\\/label\",\"_3_rowLabelInputNote-0\":\"input\",\"_4_rowLabelInputNote-0\":\"\\/input\",\"_5_rowLabelInputNote-0\":\"note\",\"_6_rowLabelInputNote-0\":\"\\/note\",\"_7_rowLabelInputNote-0\":\"\\/row\",\"maxLength-0\":\"\",\"note-0\":\"\",\"tooltip-0\":\"\",\"placeholder-0\":\"\",\"value-0\":\"\",\"sql1-0\":\"\",\"parameter-0\":\"\",\"_sipForTypo3Vars\":\"5d9c68b529aa9\"}','{\"__dbIndexData\":\"1\",\"form\":\"formElement\",\"formId\":\"1007\",\"r\":\"0\",\"s\":\"5d9c68cf37aff\",\"urlparam\":\"__dbIndexData=1&form=formElement&formId=1007&r=0\"}','192.168.133.187','','Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:69.0) Gecko/20100101 Firefox/69.0',2,0,1,'bd9ca9c19bc5f064dc211cedfaa063bb','2019-10-08 10:46:38'),(23,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"21d01488f4b15525125ece7c400ee37f\",\"text-1\":\"hello worldaa\",\"_sipForTypo3Vars\":\"5d9c6134f30ea\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"1\",\"s\":\"5d9c697d6c5ed\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=1\"}','192.168.133.187','','Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:69.0) Gecko/20100101 Firefox/69.0',1007,1,3,'bd9ca9c19bc5f064dc211cedfaa063bb','2019-10-08 10:48:38'),(24,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"enabled-0\":\"yes\",\"dynamicUpdate-0\":\"no\",\"mode-0\":\"required\",\"class-0\":\"native\",\"_h_subrecordOption-0\":\"\",\"encode-0\":\"specialchar\",\"checkType-0\":\"digit\",\"labelAlign-0\":\"default\",\"_h_rowLabelInputNote-0\":\"\",\"feIdContainer-0\":\"\",\"name-0\":\"number\",\"label-0\":\"number\",\"modeSql-0\":\"\",\"type-0\":\"text\",\"parameterLanguageA-0\":\"\",\"parameterLanguageB-0\":\"\",\"parameterLanguageC-0\":\"\",\"parameterLanguageD-0\":\"\",\"checkPattern-0\":\"\",\"ord-0\":\"20\",\"adminNote-0\":\"\",\"size-0\":\"\",\"bsLabelColumns-0\":\"\",\"bsInputColumns-0\":\"\",\"bsNoteColumns-0\":\"\",\"_0_rowLabelInputNote-0\":\"row\",\"_1_rowLabelInputNote-0\":\"label\",\"_2_rowLabelInputNote-0\":\"\\/label\",\"_3_rowLabelInputNote-0\":\"input\",\"_4_rowLabelInputNote-0\":\"\\/input\",\"_5_rowLabelInputNote-0\":\"note\",\"_6_rowLabelInputNote-0\":\"\\/note\",\"_7_rowLabelInputNote-0\":\"\\/row\",\"maxLength-0\":\"\",\"note-0\":\"\",\"tooltip-0\":\"\",\"placeholder-0\":\"\",\"value-0\":\"\",\"sql1-0\":\"\",\"parameter-0\":\"\",\"_sipForTypo3Vars\":\"5d9c3dcd7fb28\"}','{\"__dbIndexData\":\"1\",\"form\":\"formElement\",\"formId\":\"1007\",\"r\":\"0\",\"s\":\"5d9c68cf37aff\",\"urlparam\":\"__dbIndexData=1&form=formElement&formId=1007&r=0\"}','192.168.133.187','','Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:69.0) Gecko/20100101 Firefox/69.0',2,0,1,'bd9ca9c19bc5f064dc211cedfaa063bb','2019-10-08 10:56:32'),(25,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"efab7bade87470cbcb36d7531bcea594\",\"text-1\":\"hello worldaa\",\"number-1\":\"32\",\"_sipForTypo3Vars\":\"5d9c3cad536b0\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"1\",\"s\":\"5d9c697d6c5ed\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=1\"}','192.168.133.187','','Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:69.0) Gecko/20100101 Firefox/69.0',1007,1,3,'bd9ca9c19bc5f064dc211cedfaa063bb','2019-10-08 10:56:58'),(26,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"enabled-0\":\"yes\",\"dynamicUpdate-0\":\"no\",\"mode-0\":\"required\",\"class-0\":\"native\",\"_h_subrecordOption-0\":\"\",\"encode-0\":\"specialchar\",\"checkType-0\":\"auto\",\"labelAlign-0\":\"default\",\"_h_rowLabelInputNote-0\":\"\",\"feIdContainer-0\":\"\",\"name-0\":\"date\",\"label-0\":\"date\",\"modeSql-0\":\"\",\"type-0\":\"date\",\"parameterLanguageA-0\":\"\",\"parameterLanguageB-0\":\"\",\"parameterLanguageC-0\":\"\",\"parameterLanguageD-0\":\"\",\"checkPattern-0\":\"\",\"ord-0\":\"30\",\"adminNote-0\":\"\",\"size-0\":\"\",\"bsLabelColumns-0\":\"\",\"bsInputColumns-0\":\"\",\"bsNoteColumns-0\":\"\",\"_0_rowLabelInputNote-0\":\"row\",\"_1_rowLabelInputNote-0\":\"label\",\"_2_rowLabelInputNote-0\":\"\\/label\",\"_3_rowLabelInputNote-0\":\"input\",\"_4_rowLabelInputNote-0\":\"\\/input\",\"_5_rowLabelInputNote-0\":\"note\",\"_6_rowLabelInputNote-0\":\"\\/note\",\"_7_rowLabelInputNote-0\":\"\\/row\",\"maxLength-0\":\"\",\"note-0\":\"\",\"tooltip-0\":\"\",\"placeholder-0\":\"\",\"value-0\":\"\",\"sql1-0\":\"\",\"parameter-0\":\"\",\"_sipForTypo3Vars\":\"5d9c3dcd7fb28\"}','{\"__dbIndexData\":\"1\",\"form\":\"formElement\",\"formId\":\"1007\",\"r\":\"0\",\"s\":\"5d9c68cf37aff\",\"urlparam\":\"__dbIndexData=1&form=formElement&formId=1007&r=0\"}','192.168.133.187','','Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:69.0) Gecko/20100101 Firefox/69.0',2,0,1,'bd9ca9c19bc5f064dc211cedfaa063bb','2019-10-08 11:17:49'),(27,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"enabled-0\":\"yes\",\"dynamicUpdate-0\":\"no\",\"mode-0\":\"required\",\"class-0\":\"native\",\"_h_subrecordOption-0\":\"\",\"encode-0\":\"specialchar\",\"checkType-0\":\"auto\",\"labelAlign-0\":\"default\",\"_h_rowLabelInputNote-0\":\"\",\"feIdContainer-0\":\"\",\"name-0\":\"datetime\",\"label-0\":\"datetime\",\"modeSql-0\":\"\",\"type-0\":\"datetime\",\"parameterLanguageA-0\":\"\",\"parameterLanguageB-0\":\"\",\"parameterLanguageC-0\":\"\",\"parameterLanguageD-0\":\"\",\"checkPattern-0\":\"\",\"ord-0\":\"40\",\"adminNote-0\":\"\",\"size-0\":\"\",\"bsLabelColumns-0\":\"\",\"bsInputColumns-0\":\"\",\"bsNoteColumns-0\":\"\",\"_0_rowLabelInputNote-0\":\"row\",\"_1_rowLabelInputNote-0\":\"label\",\"_2_rowLabelInputNote-0\":\"\\/label\",\"_3_rowLabelInputNote-0\":\"input\",\"_4_rowLabelInputNote-0\":\"\\/input\",\"_5_rowLabelInputNote-0\":\"note\",\"_6_rowLabelInputNote-0\":\"\\/note\",\"_7_rowLabelInputNote-0\":\"\\/row\",\"maxLength-0\":\"\",\"note-0\":\"\",\"tooltip-0\":\"\",\"placeholder-0\":\"\",\"value-0\":\"\",\"sql1-0\":\"\",\"parameter-0\":\"\",\"_sipForTypo3Vars\":\"5d9c3dcd7fb28\"}','{\"form\":\"formElement\",\"formId\":\"1007\",\"r\":\"0\",\"s\":\"5d9c68d29fb04\",\"urlparam\":\"form=formElement&formId=1007&r=0\"}','192.168.133.187','','Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:69.0) Gecko/20100101 Firefox/69.0',2,0,1,'bd9ca9c19bc5f064dc211cedfaa063bb','2019-10-08 11:18:08'),(28,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"enabled-0\":\"yes\",\"dynamicUpdate-0\":\"no\",\"mode-0\":\"required\",\"class-0\":\"native\",\"_h_subrecordOption-0\":\"\",\"encode-0\":\"specialchar\",\"checkType-0\":\"auto\",\"labelAlign-0\":\"default\",\"_h_rowLabelInputNote-0\":\"\",\"feIdContainer-0\":\"\",\"name-0\":\"decimal\",\"label-0\":\"decimal\",\"modeSql-0\":\"\",\"type-0\":\"text\",\"parameterLanguageA-0\":\"\",\"parameterLanguageB-0\":\"\",\"parameterLanguageC-0\":\"\",\"parameterLanguageD-0\":\"\",\"checkPattern-0\":\"\",\"ord-0\":\"50\",\"adminNote-0\":\"\",\"size-0\":\"\",\"bsLabelColumns-0\":\"\",\"bsInputColumns-0\":\"\",\"bsNoteColumns-0\":\"\",\"_0_rowLabelInputNote-0\":\"row\",\"_1_rowLabelInputNote-0\":\"label\",\"_2_rowLabelInputNote-0\":\"\\/label\",\"_3_rowLabelInputNote-0\":\"input\",\"_4_rowLabelInputNote-0\":\"\\/input\",\"_5_rowLabelInputNote-0\":\"note\",\"_6_rowLabelInputNote-0\":\"\\/note\",\"_7_rowLabelInputNote-0\":\"\\/row\",\"maxLength-0\":\"\",\"note-0\":\"\",\"tooltip-0\":\"\",\"placeholder-0\":\"\",\"value-0\":\"\",\"sql1-0\":\"\",\"parameter-0\":\"\",\"_sipForTypo3Vars\":\"5d9c3dcd7fb28\"}','{\"form\":\"formElement\",\"formId\":\"1007\",\"r\":\"0\",\"s\":\"5d9c68d29fb04\",\"urlparam\":\"form=formElement&formId=1007&r=0\"}','192.168.133.187','','Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:69.0) Gecko/20100101 Firefox/69.0',2,0,1,'bd9ca9c19bc5f064dc211cedfaa063bb','2019-10-08 11:18:38'),(29,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"4e49ad05529344a8c0ee4090446e35cd\",\"enabled-500\":\"yes\",\"dynamicUpdate-500\":\"no\",\"mode-500\":\"required\",\"class-500\":\"native\",\"_h_subrecordOption-500\":\"\",\"encode-500\":\"specialchar\",\"checkType-500\":\"numerical\",\"labelAlign-500\":\"default\",\"_h_rowLabelInputNote-500\":\"\",\"feIdContainer-500\":\"\",\"name-500\":\"decimal\",\"label-500\":\"decimal\",\"modeSql-500\":\"\",\"type-500\":\"text\",\"parameterLanguageA-500\":\"\",\"parameterLanguageB-500\":\"\",\"parameterLanguageC-500\":\"\",\"parameterLanguageD-500\":\"\",\"checkPattern-500\":\"\",\"ord-500\":\"50\",\"adminNote-500\":\"\",\"size-500\":\"\",\"bsLabelColumns-500\":\"\",\"bsInputColumns-500\":\"\",\"bsNoteColumns-500\":\"\",\"_0_rowLabelInputNote-500\":\"row\",\"_1_rowLabelInputNote-500\":\"label\",\"_2_rowLabelInputNote-500\":\"\\/label\",\"_3_rowLabelInputNote-500\":\"input\",\"_4_rowLabelInputNote-500\":\"\\/input\",\"_5_rowLabelInputNote-500\":\"note\",\"_6_rowLabelInputNote-500\":\"\\/note\",\"_7_rowLabelInputNote-500\":\"\\/row\",\"maxLength-500\":\"\",\"note-500\":\"\",\"tooltip-500\":\"\",\"placeholder-500\":\"\",\"value-500\":\"\",\"sql1-500\":\"\",\"parameter-500\":\"\",\"_sipForTypo3Vars\":\"5d9c3dcd7fb28\"}','{\"form\":\"formElement\",\"formId\":\"1007\",\"r\":\"500\",\"s\":\"5d9c708ee436e\",\"urlparam\":\"form=formElement&formId=1007&r=500\"}','192.168.133.187','','Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:69.0) Gecko/20100101 Firefox/69.0',2,500,1,'bd9ca9c19bc5f064dc211cedfaa063bb','2019-10-08 11:18:59'),(30,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"enabled-0\":\"yes\",\"dynamicUpdate-0\":\"no\",\"mode-0\":\"required\",\"class-0\":\"native\",\"_h_subrecordOption-0\":\"\",\"encode-0\":\"specialchar\",\"checkType-0\":\"auto\",\"labelAlign-0\":\"default\",\"_h_rowLabelInputNote-0\":\"\",\"feIdContainer-0\":\"\",\"name-0\":\"enum\",\"label-0\":\"enum\",\"modeSql-0\":\"\",\"type-0\":\"select\",\"parameterLanguageA-0\":\"\",\"parameterLanguageB-0\":\"\",\"parameterLanguageC-0\":\"\",\"parameterLanguageD-0\":\"\",\"checkPattern-0\":\"\",\"ord-0\":\"60\",\"adminNote-0\":\"\",\"size-0\":\"\",\"bsLabelColumns-0\":\"\",\"bsInputColumns-0\":\"\",\"bsNoteColumns-0\":\"\",\"_0_rowLabelInputNote-0\":\"row\",\"_1_rowLabelInputNote-0\":\"label\",\"_2_rowLabelInputNote-0\":\"\\/label\",\"_3_rowLabelInputNote-0\":\"input\",\"_4_rowLabelInputNote-0\":\"\\/input\",\"_5_rowLabelInputNote-0\":\"note\",\"_6_rowLabelInputNote-0\":\"\\/note\",\"_7_rowLabelInputNote-0\":\"\\/row\",\"maxLength-0\":\"\",\"note-0\":\"\",\"tooltip-0\":\"\",\"placeholder-0\":\"\",\"value-0\":\"\",\"sql1-0\":\"\",\"parameter-0\":\"\",\"_sipForTypo3Vars\":\"5d9c3dcd7fb28\"}','{\"form\":\"formElement\",\"formId\":\"1007\",\"r\":\"0\",\"s\":\"5d9c68d29fb04\",\"urlparam\":\"form=formElement&formId=1007&r=0\"}','192.168.133.187','','Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:69.0) Gecko/20100101 Firefox/69.0',2,0,1,'bd9ca9c19bc5f064dc211cedfaa063bb','2019-10-08 11:19:35'),(31,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"fe269c74b26a2383bf5869a66559dd05\",\"text-2\":\"whats up?\",\"number-2\":\"11\",\"date-2\":\"23.10.2019\",\"datetime-2\":\"23.10.2019 05:12\",\"decimal-2\":\"1.12\",\"enum-2\":\"second option\",\"_sipForTypo3Vars\":\"5d9c3cad536b0\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"2\",\"s\":\"5d9c697d6c770\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=2\"}','192.168.133.187','','Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:69.0) Gecko/20100101 Firefox/69.0',1007,2,3,'bd9ca9c19bc5f064dc211cedfaa063bb','2019-10-08 11:29:44'),(32,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"f71c640e65a3b0de8d37e62b2178b645\",\"text-2\":\"whats up?\",\"number-2\":\"11\",\"date-2\":\"23.10.2019\",\"datetime-2\":\"23.10.2019 05:12\",\"decimal-2\":\"1.12\",\"enum-2\":\"second option\",\"_sipForTypo3Vars\":\"5d9c3cad536b0\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"2\",\"s\":\"5d9c697d6c770\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=2\"}','192.168.133.187','','Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:69.0) Gecko/20100101 Firefox/69.0',1007,2,3,'bd9ca9c19bc5f064dc211cedfaa063bb','2019-10-08 11:30:26'),(33,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"text-0\":\"g2g3\",\"number-0\":\"32\",\"date-0\":\"01.01.2019\",\"datetime-0\":\"01.01.2019 00:00\",\"decimal-0\":\"1.23\",\"enum-0\":\"third option\",\"_sipForTypo3Vars\":\"5d9c3cad536b0\"}','{\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5d9c697f8b543\",\"urlparam\":\"form=basicForm&r=0\"}','192.168.133.187','','Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:69.0) Gecko/20100101 Firefox/69.0',1007,0,3,'bd9ca9c19bc5f064dc211cedfaa063bb','2019-10-08 11:33:39'),(34,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"2b1770b68a237c02508b1f357ddd60f4\",\"text-4\":\"g2g3\",\"number-4\":\"32\",\"date-4\":\"01.01.2019\",\"datetime-4\":\"01.01.2019 00:00\",\"decimal-4\":\"1.23\",\"enum-4\":\"third option\",\"_sipForTypo3Vars\":\"5d9c3cad536b0\"}','{\"form\":\"basicForm\",\"r\":\"4\",\"s\":\"5d9c741372242\",\"urlparam\":\"form=basicForm&r=4\"}','192.168.133.187','','Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:69.0) Gecko/20100101 Firefox/69.0',1007,4,3,'bd9ca9c19bc5f064dc211cedfaa063bb','2019-10-08 11:33:49'),(35,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"2b1770b68a237c02508b1f357ddd60f4\",\"text-4\":\"g2g3\",\"number-4\":\"32\",\"date-4\":\"01.01.2019\",\"datetime-4\":\"01.01.2019 00:00\",\"decimal-4\":\"1.23\",\"enum-4\":\"third option\",\"_sipForTypo3Vars\":\"5d9c3cad536b0\"}','{\"form\":\"basicForm\",\"r\":\"4\",\"s\":\"5d9c741372242\",\"urlparam\":\"form=basicForm&r=4\"}','192.168.133.187','','Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:69.0) Gecko/20100101 Firefox/69.0',1007,4,3,'bd9ca9c19bc5f064dc211cedfaa063bb','2019-10-08 11:33:57'),(36,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"text-0\":\"test44218\",\"number-0\":\"111\",\"date-0\":\"03.03.2188\",\"datetime-0\":\"03.03.2188 12:01\",\"decimal-0\":\"18294.22\",\"enum-0\":\"second option\",\"_sipForTypo3Vars\":\"5d9c85b4d29d6\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5d9c85b3ce207\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.187','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.90 Safari/537.36',1007,0,3,'469c1f131b11c1cb3c75ed067411eb6c','2019-10-08 12:48:54'),(37,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"text-0\":\"test44218\",\"number-0\":\"111\",\"date-0\":\"03.03.2188\",\"datetime-0\":\"03.03.2188 12:01\",\"decimal-0\":\"18294.22\",\"enum-0\":\"second option\",\"_sipForTypo3Vars\":\"5d9c85e09187d\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5d9c85df877f4\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.187','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.90 Safari/537.36',1007,0,3,'bfdc804fc5cb7317c4e4a76ec96d91d5','2019-10-08 12:49:38'),(38,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"text-0\":\"test44218\",\"number-0\":\"111\",\"date-0\":\"03.03.2188\",\"datetime-0\":\"03.03.2188 12:01\",\"decimal-0\":\"18294.22\",\"enum-0\":\"second option\",\"_sipForTypo3Vars\":\"5d9c865aa5fba\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5d9c8659aaf61\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.187','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.90 Safari/537.36',1007,0,3,'37f238c73585e4a9cb2c89e6faba687b','2019-10-08 12:51:40'),(39,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"text-0\":\"test44218\",\"number-0\":\"111\",\"date-0\":\"03.03.2188\",\"datetime-0\":\"03.03.2188 12:01\",\"decimal-0\":\"18294.22\",\"enum-0\":\"second option\",\"_sipForTypo3Vars\":\"5d9c866eb03de\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5d9c866da33d0\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.187','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.90 Safari/537.36',1007,0,3,'80f951feb02087ebfd02835038653362','2019-10-08 12:52:00'),(40,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"text-0\":\"test44218\",\"number-0\":\"111\",\"date-0\":\"03.03.2188\",\"datetime-0\":\"03.03.2188 12:01\",\"decimal-0\":\"18294.22\",\"enum-0\":\"second option\",\"_sipForTypo3Vars\":\"5d9c86ce1de18\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5d9c86cd3eecd\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.187','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.90 Safari/537.36',1007,0,3,'17e1774231cbcf66db7b437d088aa102','2019-10-08 12:53:35'),(41,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"text-0\":\"test44218\",\"number-0\":\"111\",\"date-0\":\"03.03.2188\",\"datetime-0\":\"03.03.2188 12:01\",\"decimal-0\":\"18294.22\",\"enum-0\":\"second option\",\"_sipForTypo3Vars\":\"5d9c87105bd5d\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5d9c870f60e59\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.187','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.90 Safari/537.36',1007,0,3,'3522871b26aa7484840f13e0d3fb586e','2019-10-08 12:54:41'),(42,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"text-0\":\"test44218\",\"number-0\":\"111\",\"date-0\":\"03.03.2188\",\"datetime-0\":\"03.03.2188 12:01\",\"decimal-0\":\"18294.22\",\"enum-0\":\"second option\",\"_sipForTypo3Vars\":\"5d9c872de6092\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5d9c872cd3cbe\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.187','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.90 Safari/537.36',1007,0,3,'673e0c8c3e724eec9eb08dff56bbd96e','2019-10-08 12:55:11'),(43,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"text-0\":\"test44218\",\"number-0\":\"111\",\"date-0\":\"03.03.2188\",\"datetime-0\":\"03.03.2188 12:01\",\"decimal-0\":\"18294.22\",\"enum-0\":\"second option\",\"_sipForTypo3Vars\":\"5d9c87d12c737\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5d9c87d0299eb\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.187','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.90 Safari/537.36',1007,0,3,'c74a4a8b4f33b93cfef4bcfe19a1e97d','2019-10-08 12:58:00'),(44,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"text-0\":\"test44218\",\"number-0\":\"111\",\"date-0\":\"03.03.2188\",\"datetime-0\":\"03.03.2188 12:01\",\"decimal-0\":\"18294.22\",\"enum-0\":\"second option\",\"_sipForTypo3Vars\":\"5d9c886b346bb\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5d9c8869ca7a5\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.187','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.90 Safari/537.36',1007,0,3,'3261db2887298897a4fffd1d44f47869','2019-10-08 13:00:31'),(45,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"text-0\":\"test44218\",\"number-0\":\"111\",\"date-0\":\"03.03.2188\",\"datetime-0\":\"03.03.2188 12:01\",\"decimal-0\":\"18294.22\",\"enum-0\":\"second option\",\"_sipForTypo3Vars\":\"5d9c887f23ab4\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5d9c887e0d6ad\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.187','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.90 Safari/537.36',1007,0,3,'6879b2f16bce9a23f9b1c4a8bf0d2fbc','2019-10-08 13:00:51'),(46,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"text-0\":\"test44218\",\"number-0\":\"111\",\"date-0\":\"03.03.2188\",\"datetime-0\":\"03.03.2188 12:01\",\"decimal-0\":\"18294.22\",\"enum-0\":\"second option\",\"_sipForTypo3Vars\":\"5d9c890718a74\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5d9c890636b2e\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.187','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.90 Safari/537.36',1007,0,3,'a0d1e74066b9ba4c339c2e95a5b4ea49','2019-10-08 13:03:07'),(47,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"text-0\":\"test44218\",\"number-0\":\"111\",\"date-0\":\"03.03.2188\",\"datetime-0\":\"03.03.2188 12:01\",\"decimal-0\":\"18294.22\",\"enum-0\":\"second option\",\"_sipForTypo3Vars\":\"5d9c8922d7169\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5d9c8921e4c9d\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.187','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.90 Safari/537.36',1007,0,3,'14b2752925ff066d485d2fa015a5ec28','2019-10-08 13:03:35'),(48,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"text-0\":\"test44218\",\"number-0\":\"111\",\"date-0\":\"03.03.2188\",\"datetime-0\":\"03.03.2188 12:01\",\"decimal-0\":\"18294.22\",\"enum-0\":\"second option\",\"_sipForTypo3Vars\":\"5d9c89518a59f\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5d9c895092a8f\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.187','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.90 Safari/537.36',1007,0,3,'2a3959e6e71620244624430c79b2fee8','2019-10-08 13:04:21'),(49,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"text-0\":\"test44218\",\"number-0\":\"111\",\"date-0\":\"03.03.2188\",\"datetime-0\":\"03.03.2188 12:01\",\"decimal-0\":\"18294.22\",\"enum-0\":\"second option\",\"_sipForTypo3Vars\":\"5d9c89847605c\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5d9c89836d3cb\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.187','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.90 Safari/537.36',1007,0,3,'51c2da4d4aab66e12cc4ef0b9cc72d0c','2019-10-08 13:05:13'),(50,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"text-0\":\"test44218\",\"number-0\":\"111\",\"date-0\":\"03.03.2188\",\"datetime-0\":\"03.03.2188 12:01\",\"decimal-0\":\"18294.22\",\"enum-0\":\"second option\",\"_sipForTypo3Vars\":\"5d9c899a53d1e\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5d9c89993312e\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.187','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.90 Safari/537.36',1007,0,3,'8d37a850a0345578040d0a0fd06e9f5e','2019-10-08 13:05:34'),(51,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"text-0\":\"test44218\",\"number-0\":\"111\",\"date-0\":\"03.03.2188\",\"datetime-0\":\"03.03.2188 12:01\",\"decimal-0\":\"18294.22\",\"enum-0\":\"second option\",\"_sipForTypo3Vars\":\"5d9c89ac4278b\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5d9c89ab628b7\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.187','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.90 Safari/537.36',1007,0,3,'eeadd812cf6e5bcbcc3193d8a75c5b0d','2019-10-08 13:05:52'),(52,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"text-0\":\"test44218\",\"number-0\":\"111\",\"date-0\":\"03.03.2188\",\"datetime-0\":\"03.03.2188 12:01\",\"decimal-0\":\"18294.22\",\"enum-0\":\"second option\",\"_sipForTypo3Vars\":\"5d9c89c124b49\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5d9c89c01c8d2\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.187','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.90 Safari/537.36',1007,0,3,'701fbd0ae2979e8ae6ebd5c014586f69','2019-10-08 13:06:13'),(53,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"text-0\":\"test44218\",\"number-0\":\"111\",\"date-0\":\"03.03.2188\",\"datetime-0\":\"03.03.2188 12:01\",\"decimal-0\":\"18294.22\",\"enum-0\":\"second option\",\"_sipForTypo3Vars\":\"5d9c89d96fd2b\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5d9c89d826b65\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.187','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.90 Safari/537.36',1007,0,3,'f62f2d42d5d5cbfcfcb2ead77140a6c5','2019-10-08 13:06:37'),(54,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"text-0\":\"test44218\",\"number-0\":\"111\",\"date-0\":\"03.03.2188\",\"datetime-0\":\"03.03.2188 12:01:00\",\"decimal-0\":\"18294.22\",\"enum-0\":\"second option\",\"_sipForTypo3Vars\":\"5d9c89f6a0454\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5d9c89f5aa407\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.187','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.90 Safari/537.36',1007,0,3,'fc1d94dfd9dffc41a0ee0b5a4a0185e6','2019-10-08 13:07:06'),(55,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"text-0\":\"test44218\",\"number-0\":\"111\",\"date-0\":\"03.03.2188\",\"datetime-0\":\"03.03.2188 12:01:00\",\"decimal-0\":\"18294.22\",\"enum-0\":\"second option\",\"_sipForTypo3Vars\":\"5d9c8a58a0603\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5d9c8a579fa23\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.187','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.90 Safari/537.36',1007,0,3,'24bed6647891742325f2762318406304','2019-10-08 13:08:45'),(56,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"text-0\":\"test44218\",\"number-0\":\"111\",\"date-0\":\"03.03.2188\",\"datetime-0\":\"03.03.2188 12:01:00\",\"decimal-0\":\"18294.22\",\"enum-0\":\"second option\",\"_sipForTypo3Vars\":\"5d9c922c94408\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5d9c922b54826\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.187','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.90 Safari/537.36',1007,0,3,'4c34f4587ec42373d2a162b9eae8598d','2019-10-08 13:42:09'),(57,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"text-0\":\"test44218\",\"number-0\":\"111\",\"date-0\":\"03.03.2188\",\"datetime-0\":\"03.03.2188 12:01:00\",\"decimal-0\":\"18294.22\",\"enum-0\":\"second option\",\"_sipForTypo3Vars\":\"5d9c93ee45014\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5d9c93ed46b1d\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.187','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.90 Safari/537.36',1007,0,3,'2b286bfa2dd5f232af59476758e029b9','2019-10-08 13:49:35'),(58,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"text-0\":\"test44218\",\"number-0\":\"111\",\"date-0\":\"03.03.2188\",\"datetime-0\":\"03.03.2188 12:01:00\",\"decimal-0\":\"18294.22\",\"enum-0\":\"second option\",\"_sipForTypo3Vars\":\"5d9c940a77305\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5d9c94094a463\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.187','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.90 Safari/537.36',1007,0,3,'f2827d4933d5e57cb1a9bef429faab98','2019-10-08 13:50:04'),(59,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"text-0\":\"test44218\",\"number-0\":\"111\",\"date-0\":\"03.03.2188\",\"datetime-0\":\"03.03.2188 12:01:00\",\"decimal-0\":\"18294.22\",\"enum-0\":\"second option\",\"_sipForTypo3Vars\":\"5d9c9426da28a\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5d9c942609617\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.187','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.90 Safari/537.36',1007,0,3,'07384fa3183f1a3bd5a52acdbba536f6','2019-10-08 13:50:34'),(60,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"text-0\":\"PeGgEOr2Vng4niRXDCv5q4otQZao4UBR\",\"number-0\":\"111\",\"date-0\":\"03.03.2188\",\"datetime-0\":\"03.03.2188 12:01:00\",\"decimal-0\":\"18294.22\",\"enum-0\":\"second option\",\"_sipForTypo3Vars\":\"5d9d821758d71\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5d9d82166459f\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.187','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.90 Safari/537.36',1007,0,3,'5fcc71a7be302a23a93a5e7deb31cfce','2019-10-09 06:45:47'),(61,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"text-0\":\"dnojWFljzCeVAYQpQujYfB0Mfs4PZzEK\",\"number-0\":\"111\",\"date-0\":\"03.03.2188\",\"datetime-0\":\"03.03.2188 12:01:00\",\"decimal-0\":\"18294.22\",\"enum-0\":\"second option\",\"_sipForTypo3Vars\":\"5d9d8665ade46\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5d9d8664b3c7f\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.187','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.90 Safari/537.36',1007,0,3,'c8dc5c7a98d65bc8a43ea0305b31e543','2019-10-09 07:04:09'),(62,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"text-0\":\"DgiDxycVkAQBlxhH1TD85AzdmGUmtZTI\",\"number-0\":\"111\",\"date-0\":\"03.03.2188\",\"datetime-0\":\"03.03.2188 12:01:00\",\"decimal-0\":\"18294.22\",\"enum-0\":\"second option\",\"_sipForTypo3Vars\":\"5d9d86a88f0b4\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5d9d86a7bb3ea\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.187','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.90 Safari/537.36',1007,0,3,'a0932bc7f378242d3c5070c4cdb79434','2019-10-09 07:05:16'),(63,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"text-0\":\"qsQfpbIdj6dgRBygrTSmrWpVGuAU5scA\",\"number-0\":\"111\",\"date-0\":\"03.03.2188\",\"datetime-0\":\"03.03.2188 12:01:00\",\"decimal-0\":\"18294.22\",\"enum-0\":\"second option\",\"_sipForTypo3Vars\":\"5d9d9f373a539\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5d9d9f363595f\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.187','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.90 Safari/537.36',1007,0,3,'cf35af08ef44853c82798e5cf6015741','2019-10-09 08:50:03'),(64,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"text-0\":\"kxJvnFQ4QBXeMqXHJvzCyRqrjwGjfci1\",\"number-0\":\"111\",\"date-0\":\"03.03.2188\",\"datetime-0\":\"03.03.2188 12:01:00\",\"decimal-0\":\"18294.22\",\"enum-0\":\"second option\",\"_sipForTypo3Vars\":\"5d9da44eaa272\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5d9da44db20d7\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.187','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.90 Safari/537.36',1007,0,3,'e5512fdaeaadb34c5c8bf4f06efbbd0c','2019-10-09 09:11:47'),(65,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"enabled-0\":\"yes\",\"dynamicUpdate-0\":\"no\",\"mode-0\":\"required\",\"class-0\":\"native\",\"_h_subrecordOption-0\":\"\",\"encode-0\":\"specialchar\",\"checkType-0\":\"auto\",\"labelAlign-0\":\"default\",\"_h_rowLabelInputNote-0\":\"\",\"feIdContainer-0\":\"\",\"name-0\":\"radio\",\"label-0\":\"radio\",\"modeSql-0\":\"\",\"type-0\":\"radio\",\"parameterLanguageA-0\":\"\",\"parameterLanguageB-0\":\"\",\"parameterLanguageC-0\":\"\",\"parameterLanguageD-0\":\"\",\"checkPattern-0\":\"\",\"ord-0\":\"70\",\"adminNote-0\":\"\",\"size-0\":\"\",\"bsLabelColumns-0\":\"\",\"bsInputColumns-0\":\"\",\"bsNoteColumns-0\":\"\",\"_0_rowLabelInputNote-0\":\"row\",\"_1_rowLabelInputNote-0\":\"label\",\"_2_rowLabelInputNote-0\":\"\\/label\",\"_3_rowLabelInputNote-0\":\"input\",\"_4_rowLabelInputNote-0\":\"\\/input\",\"_5_rowLabelInputNote-0\":\"note\",\"_6_rowLabelInputNote-0\":\"\\/note\",\"_7_rowLabelInputNote-0\":\"\\/row\",\"maxLength-0\":\"\",\"note-0\":\"\",\"tooltip-0\":\"\",\"placeholder-0\":\"\",\"value-0\":\"\",\"sql1-0\":\"\",\"parameter-0\":\"\",\"_sipForTypo3Vars\":\"5d9da877ca5e3\"}','{\"__dbIndexData\":\"1\",\"form\":\"formElement\",\"formId\":\"1007\",\"r\":\"0\",\"s\":\"5d9da877c6194\",\"urlparam\":\"__dbIndexData=1&form=formElement&formId=1007&r=0\"}','192.168.133.187','','Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:69.0) Gecko/20100101 Firefox/69.0',2,0,1,'bd9ca9c19bc5f064dc211cedfaa063bb','2019-10-09 09:30:13'),(66,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"ce8fd6c800b02c1e5f301deb53542a1b\",\"text-1\":\"hello worldaa\",\"number-1\":\"32\",\"date-1\":\"08.10.2019\",\"datetime-1\":\"08.10.2019 12:00\",\"decimal-1\":\"11.00\",\"enum-1\":\"first option\",\"radio-1\":\"option b\",\"_sipForTypo3Vars\":\"5d9da86af157e\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"1\",\"s\":\"5d9da608c75e1\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=1\"}','192.168.133.187','','Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:69.0) Gecko/20100101 Firefox/69.0',1007,1,3,'bd9ca9c19bc5f064dc211cedfaa063bb','2019-10-09 09:30:25'),(67,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"text-0\":\"miQfLLofoc3FyyEOaDU7qvzCEXkvxdoA\",\"number-0\":\"111\",\"date-0\":\"03.03.2188\",\"datetime-0\":\"03.03.2188 12:01:00\",\"decimal-0\":\"18294.22\",\"enum-0\":\"second option\",\"radio-0\":\"option c\",\"_sipForTypo3Vars\":\"5d9da9c1c0db8\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5d9da9c098413\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.187','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.90 Safari/537.36',1007,0,3,'0bfbe0419851d134a5489fe055deaea3','2019-10-09 09:35:04'),(68,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"text-0\":\"a\",\"number-0\":\"1\",\"date-0\":\"01.01.2019\",\"datetime-0\":\"01.01.2019 00:00:00\",\"decimal-0\":\"0.0\",\"enum-0\":\"first option\",\"radio-0\":\"\",\"_sipForTypo3Vars\":\"5d9da86af157e\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5d9da608c6fa1\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.187','','Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:69.0) Gecko/20100101 Firefox/69.0',1007,0,3,'bd9ca9c19bc5f064dc211cedfaa063bb','2019-10-09 09:36:16'),(69,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"text-0\":\"a\",\"number-0\":\"1\",\"date-0\":\"01.01.2019\",\"datetime-0\":\"01.01.2019 00:00:00\",\"decimal-0\":\"0.0\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"_sipForTypo3Vars\":\"5d9da86af157e\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5d9da608c6fa1\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.187','','Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:69.0) Gecko/20100101 Firefox/69.0',1007,0,3,'bd9ca9c19bc5f064dc211cedfaa063bb','2019-10-09 09:38:26'),(70,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"text-0\":\"a\",\"number-0\":\"1\",\"date-0\":\"01.01.2019\",\"datetime-0\":\"01.01.2019 00:00\",\"decimal-0\":\"1.0\",\"enum-0\":\"first option\",\"radio-0\":\"\",\"_sipForTypo3Vars\":\"5d9da86af157e\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5d9da608c6fa1\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.187','','Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:69.0) Gecko/20100101 Firefox/69.0',1007,0,3,'bd9ca9c19bc5f064dc211cedfaa063bb','2019-10-09 10:14:16'),(71,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"text-0\":\"a\",\"number-0\":\"1\",\"date-0\":\"01.01.2019\",\"datetime-0\":\"01.01.2019 00:00\",\"decimal-0\":\"1.0\",\"enum-0\":\"first option\",\"radio-0\":\"option c\",\"_sipForTypo3Vars\":\"5d9da86af157e\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5d9da608c6fa1\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.187','','Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:69.0) Gecko/20100101 Firefox/69.0',1007,0,3,'bd9ca9c19bc5f064dc211cedfaa063bb','2019-10-09 10:18:07'),(72,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"enabled-0\":\"yes\",\"dynamicUpdate-0\":\"no\",\"mode-0\":\"required\",\"class-0\":\"native\",\"_h_subrecordOption-0\":\"\",\"encode-0\":\"specialchar\",\"checkType-0\":\"auto\",\"labelAlign-0\":\"default\",\"_h_rowLabelInputNote-0\":\"\",\"feIdContainer-0\":\"\",\"name-0\":\"checkbox\",\"label-0\":\"checkbox\",\"modeSql-0\":\"\",\"type-0\":\"checkbox\",\"parameterLanguageA-0\":\"\",\"parameterLanguageB-0\":\"\",\"parameterLanguageC-0\":\"\",\"parameterLanguageD-0\":\"\",\"checkPattern-0\":\"\",\"ord-0\":\"80\",\"adminNote-0\":\"\",\"size-0\":\"\",\"bsLabelColumns-0\":\"\",\"bsInputColumns-0\":\"\",\"bsNoteColumns-0\":\"\",\"_0_rowLabelInputNote-0\":\"row\",\"_1_rowLabelInputNote-0\":\"label\",\"_2_rowLabelInputNote-0\":\"\\/label\",\"_3_rowLabelInputNote-0\":\"input\",\"_4_rowLabelInputNote-0\":\"\\/input\",\"_5_rowLabelInputNote-0\":\"note\",\"_6_rowLabelInputNote-0\":\"\\/note\",\"_7_rowLabelInputNote-0\":\"\\/row\",\"maxLength-0\":\"\",\"note-0\":\"\",\"tooltip-0\":\"\",\"placeholder-0\":\"\",\"value-0\":\"\",\"sql1-0\":\"\",\"parameter-0\":\"\",\"_sipForTypo3Vars\":\"5d9da877ca5e3\"}','{\"__dbIndexData\":\"1\",\"form\":\"formElement\",\"formId\":\"1007\",\"r\":\"0\",\"s\":\"5d9da877c6194\",\"urlparam\":\"__dbIndexData=1&form=formElement&formId=1007&r=0\"}','192.168.133.187','','Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:69.0) Gecko/20100101 Firefox/69.0',2,0,1,'bd9ca9c19bc5f064dc211cedfaa063bb','2019-10-09 11:44:18'),(73,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"9af7452321a3502f093a212a0615e150\",\"_h_checkbox-36\":\"\",\"text-36\":\"a\",\"number-36\":\"1\",\"date-36\":\"01.01.2019\",\"datetime-36\":\"01.01.2019 00:00\",\"decimal-36\":\"1.00\",\"enum-36\":\"first option\",\"radio-36\":\"option c\",\"_0_checkbox-36\":\"1\",\"_1_checkbox-36\":\"2\",\"_2_checkbox-36\":\"3\",\"_sipForTypo3Vars\":\"5d9da86af157e\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"36\",\"s\":\"5d9db3df33863\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=36\"}','192.168.133.187','','Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:69.0) Gecko/20100101 Firefox/69.0',1007,36,3,'bd9ca9c19bc5f064dc211cedfaa063bb','2019-10-09 11:47:03'),(74,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"87eed47d21bb5d8f0901ee42eed712a9\",\"_h_checkbox-36\":\"\",\"text-36\":\"a\",\"number-36\":\"1\",\"date-36\":\"01.01.2019\",\"datetime-36\":\"01.01.2019 00:00\",\"decimal-36\":\"1.00\",\"enum-36\":\"first option\",\"radio-36\":\"option c\",\"_0_checkbox-36\":\"1\",\"_1_checkbox-36\":\"2\",\"_2_checkbox-36\":\"3\",\"_sipForTypo3Vars\":\"5d9da86af157e\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"36\",\"s\":\"5d9db3df33863\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=36\"}','192.168.133.187','','Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:69.0) Gecko/20100101 Firefox/69.0',1007,36,3,'bd9ca9c19bc5f064dc211cedfaa063bb','2019-10-09 11:47:18'),(75,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d92312c08a22dcb155fe909c2440029b\",\"enabled-503\":\"yes\",\"dynamicUpdate-503\":\"no\",\"mode-503\":\"show\",\"class-503\":\"native\",\"_h_subrecordOption-503\":\"\",\"encode-503\":\"specialchar\",\"checkType-503\":\"auto\",\"labelAlign-503\":\"default\",\"_h_rowLabelInputNote-503\":\"\",\"feIdContainer-503\":\"\",\"name-503\":\"checkbox\",\"label-503\":\"checkbox\",\"modeSql-503\":\"\",\"type-503\":\"checkbox\",\"parameterLanguageA-503\":\"\",\"parameterLanguageB-503\":\"\",\"parameterLanguageC-503\":\"\",\"parameterLanguageD-503\":\"\",\"checkPattern-503\":\"\",\"ord-503\":\"80\",\"adminNote-503\":\"\",\"size-503\":\"\",\"bsLabelColumns-503\":\"\",\"bsInputColumns-503\":\"\",\"bsNoteColumns-503\":\"\",\"_0_rowLabelInputNote-503\":\"row\",\"_1_rowLabelInputNote-503\":\"label\",\"_2_rowLabelInputNote-503\":\"\\/label\",\"_3_rowLabelInputNote-503\":\"input\",\"_4_rowLabelInputNote-503\":\"\\/input\",\"_5_rowLabelInputNote-503\":\"note\",\"_6_rowLabelInputNote-503\":\"\\/note\",\"_7_rowLabelInputNote-503\":\"\\/row\",\"maxLength-503\":\"\",\"note-503\":\"\",\"tooltip-503\":\"\",\"placeholder-503\":\"\",\"value-503\":\"\",\"sql1-503\":\"\",\"parameter-503\":\"\",\"_sipForTypo3Vars\":\"5d9da877ca5e3\"}','{\"__dbIndexData\":\"1\",\"form\":\"formElement\",\"formId\":\"1007\",\"r\":\"503\",\"s\":\"5d9dc812c895e\",\"urlparam\":\"__dbIndexData=1&form=formElement&formId=1007&r=503\"}','192.168.133.187','','Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:69.0) Gecko/20100101 Firefox/69.0',2,503,1,'bd9ca9c19bc5f064dc211cedfaa063bb','2019-10-09 12:03:04'),(76,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"7d61a3030557ce0cb63c4b65aad9e422\",\"_h_checkbox-1\":\"\",\"text-1\":\"hello worldaa\",\"number-1\":\"32\",\"date-1\":\"08.10.2019\",\"datetime-1\":\"08.10.2019 12:00\",\"decimal-1\":\"11.00\",\"enum-1\":\"first option\",\"radio-1\":\"option b\",\"_1_checkbox-1\":\"2\",\"_sipForTypo3Vars\":\"5d9da86af157e\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"1\",\"s\":\"5d9da608c75e1\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=1\"}','192.168.133.187','','Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:69.0) Gecko/20100101 Firefox/69.0',1007,1,3,'bd9ca9c19bc5f064dc211cedfaa063bb','2019-10-09 12:03:17'),(77,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"643708390635ad3d2bbd367bf22fc49a\",\"_h_checkbox-4\":\"\",\"text-4\":\"g2g3\",\"number-4\":\"32\",\"date-4\":\"01.01.2019\",\"datetime-4\":\"01.01.2019 00:00\",\"decimal-4\":\"1.23\",\"enum-4\":\"third option\",\"radio-4\":\"option a\",\"_0_checkbox-4\":\"1\",\"_2_checkbox-4\":\"3\",\"_sipForTypo3Vars\":\"5d9da86af157e\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"4\",\"s\":\"5d9da608c7a7a\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=4\"}','192.168.133.187','','Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:69.0) Gecko/20100101 Firefox/69.0',1007,4,3,'bd9ca9c19bc5f064dc211cedfaa063bb','2019-10-09 12:09:02'),(78,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"1ed58838a65e1eec73e57cb965eed54e\",\"_h_checkbox-4\":\"\",\"text-4\":\"g2g3\",\"number-4\":\"32\",\"date-4\":\"01.01.2019\",\"datetime-4\":\"01.01.2019 00:00\",\"decimal-4\":\"1.23\",\"enum-4\":\"third option\",\"radio-4\":\"option a\",\"_0_checkbox-4\":\"1\",\"_2_checkbox-4\":\"3\",\"_sipForTypo3Vars\":\"5d9da86af157e\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"4\",\"s\":\"5d9da608c7a7a\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=4\"}','192.168.133.187','','Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:69.0) Gecko/20100101 Firefox/69.0',1007,4,3,'bd9ca9c19bc5f064dc211cedfaa063bb','2019-10-09 12:09:13'),(79,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"kroG0RvIeG9Gk2qNfxqzuKXCpzgEist6\",\"number-0\":\"111\",\"date-0\":\"03.03.2188\",\"datetime-0\":\"03.03.2188 12:01:00\",\"decimal-0\":\"18294.22\",\"enum-0\":\"second option\",\"radio-0\":\"option c\",\"_0_checkbox-0\":\"1\",\"_2_checkbox-0\":\"3\",\"_sipForTypo3Vars\":\"5d9de808a613e\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5d9de8078294f\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.187','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.90 Safari/537.36',1007,0,3,'5a5ff6b7a40955ef433b2df2e6919e8b','2019-10-09 14:00:45'),(80,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"ybi7LOqS9fkMwL1k8Tnk6pUtbokgfXdT\",\"number-0\":\"111\",\"date-0\":\"03.03.2188\",\"datetime-0\":\"03.03.2188 12:01:00\",\"decimal-0\":\"18294.22\",\"enum-0\":\"second option\",\"radio-0\":\"option c\",\"_0_checkbox-0\":\"1\",\"_2_checkbox-0\":\"3\",\"_sipForTypo3Vars\":\"5d9de89ee7c14\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5d9de89da92c6\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.187','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.90 Safari/537.36',1007,0,3,'234fb74c4d1b8503ef03a9685bf0da13','2019-10-09 14:03:16'),(81,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"A\",\"number-0\":\"1\",\"date-0\":\"01.01.2019\",\"datetime-0\":\"01.01.2019 00:00\",\"decimal-0\":\"1.4\",\"enum-0\":\"first option\",\"radio-0\":\"\",\"_sipForTypo3Vars\":\"5d9ed1ad75f78\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5d9ed1ab2e5a6\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.187','','Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:69.0) Gecko/20100101 Firefox/69.0',1007,0,3,'bd9ca9c19bc5f064dc211cedfaa063bb','2019-10-10 06:38:08'),(82,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"A\",\"number-0\":\"1\",\"date-0\":\"01.01.2019\",\"datetime-0\":\"01.01.2019 00:00\",\"decimal-0\":\"1.4\",\"enum-0\":\"first option\",\"radio-0\":\"\",\"_sipForTypo3Vars\":\"5d9ed1ad75f78\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5d9ed1ab2e5a6\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.187','','Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:69.0) Gecko/20100101 Firefox/69.0',1007,0,3,'bd9ca9c19bc5f064dc211cedfaa063bb','2019-10-10 06:38:15'),(83,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"A\",\"number-0\":\"1\",\"date-0\":\"01.01.2019\",\"datetime-0\":\"01.01.2019 00:00\",\"decimal-0\":\"1.4\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"_sipForTypo3Vars\":\"5d9ed1ad75f78\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5d9ed1ab2e5a6\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.187','','Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:69.0) Gecko/20100101 Firefox/69.0',1007,0,3,'bd9ca9c19bc5f064dc211cedfaa063bb','2019-10-10 06:38:21'),(84,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"4BlJavjSKn2RVWcC4RxedCpxYC0JjEYv\",\"number-0\":\"111\",\"date-0\":\"03.03.2188\",\"datetime-0\":\"03.03.2188 12:01:00\",\"decimal-0\":\"18294.22\",\"enum-0\":\"second option\",\"radio-0\":\"option c\",\"_0_checkbox-0\":\"1\",\"_2_checkbox-0\":\"3\",\"_sipForTypo3Vars\":\"5d9ed8991ac94\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5d9ed8980f047\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.187','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.90 Safari/537.36',1007,0,3,'464148338c8ae57c6a47d8517305dece','2019-10-10 07:07:10'),(85,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"ucd7AUr5LTyWL5ohHfRHThOBbMewK19G\",\"number-0\":\"111\",\"date-0\":\"03.03.2188\",\"datetime-0\":\"03.03.2188 12:01:00\",\"decimal-0\":\"18294.22\",\"enum-0\":\"second option\",\"radio-0\":\"option c\",\"_0_checkbox-0\":\"1\",\"_2_checkbox-0\":\"3\",\"_sipForTypo3Vars\":\"5d9ed90f70db1\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5d9ed90e5f867\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.187','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.90 Safari/537.36',1007,0,3,'d6e76b6ef8410d2029cf8731f89c57a4','2019-10-10 07:09:08'),(86,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"RZAgOIjeshzuLTvTmL7BDxhoCj8NyHsB\",\"number-0\":\"111\",\"date-0\":\"03.03.2188\",\"datetime-0\":\"03.03.2188 12:01:00\",\"decimal-0\":\"18294.22\",\"enum-0\":\"second option\",\"radio-0\":\"option c\",\"_0_checkbox-0\":\"1\",\"_2_checkbox-0\":\"3\",\"_sipForTypo3Vars\":\"5d9ed94feb704\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5d9ed94eceb02\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.187','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.90 Safari/537.36',1007,0,3,'a9bea518c4bcc2654419667cf0d65642','2019-10-10 07:10:13'),(87,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"cXAApX4QhQCnJhoKsMSHY1nxQJ0mpiTX\",\"number-0\":\"1359396900\",\"date-0\":\"03.03.2188\",\"datetime-0\":\"03.03.2188 12:01:00\",\"decimal-0\":\"18294.22\",\"enum-0\":\"second option\",\"radio-0\":\"option c\",\"_0_checkbox-0\":\"1\",\"_2_checkbox-0\":\"3\",\"_sipForTypo3Vars\":\"5d9ed94feb704\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5d9ed94eceb02\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.187','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.90 Safari/537.36',1007,0,3,'a9bea518c4bcc2654419667cf0d65642','2019-10-10 07:10:18'),(88,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"Wxrh6dPlL14j3yHZuKrkeaZtoFSvhOUA\",\"number-0\":\"111\",\"date-0\":\"03.03.2188\",\"datetime-0\":\"03.03.2188 12:01:00\",\"decimal-0\":\"18294.22\",\"enum-0\":\"second option\",\"radio-0\":\"option c\",\"_0_checkbox-0\":\"1\",\"_2_checkbox-0\":\"3\",\"_sipForTypo3Vars\":\"5d9ed9b69a857\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5d9ed9b5a7ace\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.187','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.90 Safari/537.36',1007,0,3,'25dc28218dbfcbae3baa758e14c7f6bb','2019-10-10 07:11:55'),(89,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"SyOwEFBnhjU64Z9mkmdZv5b4wbUrA1Hf\",\"number-0\":\"1718359937\",\"date-0\":\"03.03.2188\",\"datetime-0\":\"03.03.2188 12:01:00\",\"decimal-0\":\"18294.22\",\"enum-0\":\"second option\",\"radio-0\":\"option c\",\"_0_checkbox-0\":\"1\",\"_2_checkbox-0\":\"3\",\"_sipForTypo3Vars\":\"5d9ed9b69a857\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5d9ed9b5a7ace\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.187','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.90 Safari/537.36',1007,0,3,'25dc28218dbfcbae3baa758e14c7f6bb','2019-10-10 07:12:00'),(90,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"dM5DptHEs1N8dwKuxfp6puSCanSX2Fsu\",\"number-0\":\"111\",\"date-0\":\"03.03.2188\",\"datetime-0\":\"03.03.2188 12:01:00\",\"decimal-0\":\"18294.22\",\"enum-0\":\"second option\",\"radio-0\":\"option c\",\"_0_checkbox-0\":\"1\",\"_2_checkbox-0\":\"3\",\"_sipForTypo3Vars\":\"5d9eda41590cd\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5d9eda4050be3\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.187','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.90 Safari/537.36',1007,0,3,'db6497108a7d093919215401b720c136','2019-10-10 07:14:14'),(91,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"xnl1Zz0Wc8RqdPm5w6Nb040PYXTApoB5\",\"number-0\":\"111\",\"date-0\":\"03.03.2188\",\"datetime-0\":\"03.03.2188 12:01:00\",\"decimal-0\":\"18294.22\",\"enum-0\":\"second option\",\"radio-0\":\"option c\",\"_0_checkbox-0\":\"1\",\"_2_checkbox-0\":\"3\",\"_sipForTypo3Vars\":\"5d9edada25f66\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5d9edad91afbf\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.187','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.90 Safari/537.36',1007,0,3,'7cc660bf2c4dd83f8371ab547a02b057','2019-10-10 07:16:47'),(92,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"xOWIBSsHZa6DWZIvRgiMssqEE2I9Vjbi\",\"number-0\":\"1661469822\",\"date-0\":\"03.03.2188\",\"datetime-0\":\"03.03.2188 12:01:00\",\"decimal-0\":\"18294.22\",\"enum-0\":\"second option\",\"radio-0\":\"option c\",\"_0_checkbox-0\":\"1\",\"_2_checkbox-0\":\"3\",\"_sipForTypo3Vars\":\"5d9edada25f66\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5d9edad91afbf\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.187','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.90 Safari/537.36',1007,0,3,'7cc660bf2c4dd83f8371ab547a02b057','2019-10-10 07:16:51'),(93,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"Qn20TMvvPv2Uny7f9HKzFQ5V4E27J5dY\",\"number-0\":\"1123067359\",\"date-0\":\"03.03.2188\",\"datetime-0\":\"03.03.2188 12:01:00\",\"decimal-0\":\"18294.22\",\"enum-0\":\"second option\",\"radio-0\":\"option c\",\"_0_checkbox-0\":\"1\",\"_2_checkbox-0\":\"3\",\"_sipForTypo3Vars\":\"5d9edb1aa94ac\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5d9edb19cfff7\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.187','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.90 Safari/537.36',1007,0,3,'ec53ef93cb3419f2cd29bc3c0630f646','2019-10-10 07:17:51'),(94,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"maEFfdtqwVnXy6F3xrsGIsW2F0hjP8GY\",\"number-0\":\"739496912\",\"date-0\":\"03.03.2188\",\"datetime-0\":\"03.03.2188 12:01:00\",\"decimal-0\":\"18294.22\",\"enum-0\":\"second option\",\"radio-0\":\"option c\",\"_0_checkbox-0\":\"1\",\"_2_checkbox-0\":\"3\",\"_sipForTypo3Vars\":\"5d9edb1aa94ac\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5d9edb19cfff7\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.187','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.90 Safari/537.36',1007,0,3,'ec53ef93cb3419f2cd29bc3c0630f646','2019-10-10 07:17:55'),(95,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"wJisSabI2YjMMEyYot5lxt22scXUqIl7\",\"number-0\":\"1393674294\",\"date-0\":\"03.03.2188\",\"datetime-0\":\"03.03.2188 12:01:00\",\"decimal-0\":\"18294.22\",\"enum-0\":\"second option\",\"radio-0\":\"option c\",\"_0_checkbox-0\":\"1\",\"_2_checkbox-0\":\"3\",\"_sipForTypo3Vars\":\"5d9edb699bada\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5d9edb688fa90\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.187','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.90 Safari/537.36',1007,0,3,'dce46a6330c20df8ab03fc734bc63a1c','2019-10-10 07:19:11'),(96,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"y81xvCVrIxxyW0z6xhIWgfZvlNuxOnXu\",\"number-0\":\"1038470132\",\"date-0\":\"03.03.2188\",\"datetime-0\":\"03.03.2188 12:01:00\",\"decimal-0\":\"18294.22\",\"enum-0\":\"second option\",\"radio-0\":\"option c\",\"_0_checkbox-0\":\"1\",\"_2_checkbox-0\":\"3\",\"_sipForTypo3Vars\":\"5d9edb699bada\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5d9edb688fa90\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.187','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.90 Safari/537.36',1007,0,3,'dce46a6330c20df8ab03fc734bc63a1c','2019-10-10 07:19:16'),(97,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"ofUEREI8qjWVYLmc78p7CpbcJw1iWlIs\",\"number-0\":\"582242840\",\"date-0\":\"03.03.2188\",\"datetime-0\":\"03.03.2188 12:01:00\",\"decimal-0\":\"18294.22\",\"enum-0\":\"second option\",\"radio-0\":\"option c\",\"_0_checkbox-0\":\"1\",\"_2_checkbox-0\":\"3\",\"_sipForTypo3Vars\":\"5d9edbb328d6d\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5d9edbb1e3596\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.187','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.90 Safari/537.36',1007,0,3,'2740e66785d430d6c814be7e9cbfcc06','2019-10-10 07:20:25'),(98,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"sPMPpZyuvCFnj8kRcBhEYMmCNbjNwS1R\",\"number-0\":\"1832549972\",\"date-0\":\"03.03.2188\",\"datetime-0\":\"03.03.2188 12:01:00\",\"decimal-0\":\"18294.22\",\"enum-0\":\"second option\",\"radio-0\":\"option c\",\"_0_checkbox-0\":\"1\",\"_2_checkbox-0\":\"3\",\"_sipForTypo3Vars\":\"5d9edbb328d6d\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5d9edbb1e3596\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.187','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.90 Safari/537.36',1007,0,3,'2740e66785d430d6c814be7e9cbfcc06','2019-10-10 07:20:30'),(99,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"WiVwaUTZx03oJGc1BgRFiPBp4wOJPqL6\",\"number-0\":\"2126411155\",\"date-0\":\"03.03.2188\",\"datetime-0\":\"03.03.2188 12:01:00\",\"decimal-0\":\"18294.22\",\"enum-0\":\"second option\",\"radio-0\":\"option c\",\"_0_checkbox-0\":\"1\",\"_2_checkbox-0\":\"3\",\"_sipForTypo3Vars\":\"5d9edd88ed06d\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5d9edd87b7abf\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.187','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.90 Safari/537.36',1007,0,3,'6a4cc6acd694c1b403e006ad9c6e56be','2019-10-10 07:28:11'),(100,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"zBifOrqjLmrLBLinqSGDW4X0ASF7NDWF\",\"number-0\":\"1442756075\",\"date-0\":\"03.03.2188\",\"datetime-0\":\"03.03.2188 12:01:00\",\"decimal-0\":\"18294.22\",\"enum-0\":\"second option\",\"radio-0\":\"option c\",\"_0_checkbox-0\":\"1\",\"_2_checkbox-0\":\"3\",\"_sipForTypo3Vars\":\"5d9ede1eb95c3\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5d9ede1da1071\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.187','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.90 Safari/537.36',1007,0,3,'c5533d95d0490484e5df60f9c85c4fe6','2019-10-10 07:30:44'),(101,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"O4v02ftC9CSi8qM11EbRrj7aExoj0sMi\",\"number-0\":\"1508378790\",\"date-0\":\"03.03.2188\",\"datetime-0\":\"03.03.2188 12:01:00\",\"decimal-0\":\"18294.22\",\"enum-0\":\"second option\",\"radio-0\":\"option c\",\"_0_checkbox-0\":\"1\",\"_2_checkbox-0\":\"3\",\"_sipForTypo3Vars\":\"5d9ede1eb95c3\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5d9ede1da1071\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.187','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.90 Safari/537.36',1007,0,3,'c5533d95d0490484e5df60f9c85c4fe6','2019-10-10 07:30:48'),(102,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"X4S8wkEzQ5pYT3hqJ7c4DfgSRDrFfyVg\",\"number-0\":\"1502359727\",\"date-0\":\"03.03.2188\",\"datetime-0\":\"03.03.2188 12:01:00\",\"decimal-0\":\"18294.22\",\"enum-0\":\"second option\",\"radio-0\":\"option c\",\"_0_checkbox-0\":\"1\",\"_2_checkbox-0\":\"3\",\"_sipForTypo3Vars\":\"5d9ee8ebceae6\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5d9ee8eabc6b5\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.204','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.90 Safari/537.36',1007,0,3,'755b4a229b9253e43817bc216b388162','2019-10-10 08:16:52'),(103,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"dtyVTVlrGEorsuUN22EBw78yG7RaBMOm\",\"number-0\":\"716840947\",\"date-0\":\"03.03.2188\",\"datetime-0\":\"03.03.2188 12:01:00\",\"decimal-0\":\"18294.22\",\"enum-0\":\"second option\",\"radio-0\":\"option c\",\"_0_checkbox-0\":\"1\",\"_2_checkbox-0\":\"3\",\"_sipForTypo3Vars\":\"5d9ee8ebceae6\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5d9ee8eabc6b5\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.204','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.90 Safari/537.36',1007,0,3,'755b4a229b9253e43817bc216b388162','2019-10-10 08:16:57'),(104,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"wvut0Eoj89T5BAVXyDglA9KZO1DwDt9I\",\"number-0\":\"564357752\",\"date-0\":\"03.03.2188\",\"datetime-0\":\"03.03.2188 12:01:00\",\"decimal-0\":\"18294.22\",\"enum-0\":\"second option\",\"radio-0\":\"option c\",\"_0_checkbox-0\":\"1\",\"_2_checkbox-0\":\"3\",\"_sipForTypo3Vars\":\"5d9eebd8a9a21\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5d9eebd7a0030\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.204','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.90 Safari/537.36',1007,0,3,'d9d69221d829686483e95597a3fa3652','2019-10-10 08:29:20'),(105,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"X2ec75ThbOJhKjhAnkubIocRAV4I3Yo9\",\"number-0\":\"1189550687\",\"date-0\":\"03.03.2188\",\"datetime-0\":\"03.03.2188 12:01:00\",\"decimal-0\":\"18294.22\",\"enum-0\":\"second option\",\"radio-0\":\"option c\",\"_0_checkbox-0\":\"1\",\"_2_checkbox-0\":\"3\",\"_sipForTypo3Vars\":\"5d9eebd8a9a21\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5d9eebd7a0030\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.204','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.90 Safari/537.36',1007,0,3,'d9d69221d829686483e95597a3fa3652','2019-10-10 08:29:25'),(106,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"Kdmmwz4nFw5n1hkb98gFV5QUYPtgGCa2\",\"number-0\":\"114658417\",\"date-0\":\"03.03.2188\",\"datetime-0\":\"03.03.2188 12:01:00\",\"decimal-0\":\"18294.22\",\"enum-0\":\"second option\",\"radio-0\":\"option c\",\"_0_checkbox-0\":\"1\",\"_2_checkbox-0\":\"3\",\"_sipForTypo3Vars\":\"5d9eebf608c31\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5d9eebf51238f\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.204','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.90 Safari/537.36',1007,0,3,'1880c12c331ac21a6ab540acafda818b','2019-10-10 08:29:49'),(107,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"JHFBgP8Vz2PinbzB1E9vHXEkAIBXXwuA\",\"number-0\":\"1339220863\",\"date-0\":\"03.03.2188\",\"datetime-0\":\"03.03.2188 12:01:00\",\"decimal-0\":\"18294.22\",\"enum-0\":\"second option\",\"radio-0\":\"option c\",\"_0_checkbox-0\":\"1\",\"_2_checkbox-0\":\"3\",\"_sipForTypo3Vars\":\"5d9eebf608c31\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5d9eebf51238f\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.204','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.90 Safari/537.36',1007,0,3,'1880c12c331ac21a6ab540acafda818b','2019-10-10 08:29:54'),(108,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"tmDNADRm6KDrRnMfDCdRgO2O6AnTjI7Q\",\"number-0\":\"1181565485\",\"date-0\":\"03.03.2188\",\"datetime-0\":\"03.03.2188 12:01:00\",\"decimal-0\":\"18294.22\",\"enum-0\":\"second option\",\"radio-0\":\"option c\",\"_0_checkbox-0\":\"1\",\"_2_checkbox-0\":\"3\",\"_sipForTypo3Vars\":\"5d9eecf15642c\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5d9eecefd5786\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.204','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.90 Safari/537.36',1007,0,3,'16a2cd163338c062549a645672b03289','2019-10-10 08:34:01'),(109,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"kfPtOxBSTBoxV62MdYPtbfJdyDEBhcfp\",\"number-0\":\"1354217553\",\"date-0\":\"03.03.2188\",\"datetime-0\":\"03.03.2188 12:01:00\",\"decimal-0\":\"18294.22\",\"enum-0\":\"second option\",\"radio-0\":\"option c\",\"_0_checkbox-0\":\"1\",\"_2_checkbox-0\":\"3\",\"_sipForTypo3Vars\":\"5d9eecf15642c\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5d9eecefd5786\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.204','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.90 Safari/537.36',1007,0,3,'16a2cd163338c062549a645672b03289','2019-10-10 08:34:05'),(110,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"6X8jN9sduFopzFBPWYTshWsxRW5IlSyH\",\"number-0\":\"1577632750\",\"date-0\":\"03.03.2188\",\"datetime-0\":\"03.03.2188 12:01:00\",\"decimal-0\":\"18294.22\",\"enum-0\":\"second option\",\"radio-0\":\"option c\",\"_0_checkbox-0\":\"1\",\"_2_checkbox-0\":\"3\",\"_sipForTypo3Vars\":\"5d9eed54cd318\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5d9eed53b3cf1\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.204','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.90 Safari/537.36',1007,0,3,'1996383942808b5e99517549d286f604','2019-10-10 08:35:40'),(111,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"00MtAHwZaMzb78tpE0j8WUnQE4nopx5O\",\"number-0\":\"1684935630\",\"date-0\":\"03.03.2188\",\"datetime-0\":\"03.03.2188 12:01:00\",\"decimal-0\":\"18294.22\",\"enum-0\":\"second option\",\"radio-0\":\"option c\",\"_0_checkbox-0\":\"1\",\"_2_checkbox-0\":\"3\",\"_sipForTypo3Vars\":\"5d9eed54cd318\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5d9eed53b3cf1\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.204','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.90 Safari/537.36',1007,0,3,'1996383942808b5e99517549d286f604','2019-10-10 08:35:45'),(112,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"ca158552a08e181e9cb54d23b45a9b9d\",\"_h_checkbox-67\":\"\",\"text-67\":\"00MtAHwZaMzb78tpE0j8WUnQE4nopx5O\",\"number-67\":\"1081124456\",\"date-67\":\"03.03.2188\",\"datetime-67\":\"03.03.2188 12:01\",\"decimal-67\":\"18294.22\",\"enum-67\":\"second option\",\"radio-67\":\"option c\",\"_0_checkbox-67\":\"1\",\"_2_checkbox-67\":\"3\",\"_sipForTypo3Vars\":\"5d9eed629bc60\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"67\",\"s\":\"5d9eed6164e77\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=67\"}','192.168.133.204','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.90 Safari/537.36',1007,67,1,'1996383942808b5e99517549d286f604','2019-10-10 08:35:47'),(113,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"1nGM8C2C4aNLmupOnobfFCSQSonq4729\",\"number-0\":\"105394293\",\"date-0\":\"03.03.2188\",\"datetime-0\":\"03.03.2188 12:01:00\",\"decimal-0\":\"18294.22\",\"enum-0\":\"second option\",\"radio-0\":\"option c\",\"_0_checkbox-0\":\"1\",\"_2_checkbox-0\":\"3\",\"_sipForTypo3Vars\":\"5d9ef27f6a4c3\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5d9ef27e59009\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.204','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.90 Safari/537.36',1007,0,3,'778aefa4fadfe9a9c2b278b9b7be6085','2019-10-10 08:57:43'),(114,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"96NonPoPtXsKOT5fGSYTBUdaIiRV8pkh\",\"number-0\":\"1835889863\",\"date-0\":\"03.03.2188\",\"datetime-0\":\"03.03.2188 12:01:00\",\"decimal-0\":\"18294.22\",\"enum-0\":\"second option\",\"radio-0\":\"option c\",\"_0_checkbox-0\":\"1\",\"_2_checkbox-0\":\"3\",\"_sipForTypo3Vars\":\"5d9ef27f6a4c3\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5d9ef27e59009\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.204','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.90 Safari/537.36',1007,0,3,'778aefa4fadfe9a9c2b278b9b7be6085','2019-10-10 08:57:48'),(115,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"e9d319066c67fb0bde79539f45ce8cc2\",\"_h_checkbox-69\":\"\",\"text-69\":\"96NonPoPtXsKOT5fGSYTBUdaIiRV8pkh\",\"number-69\":\"2022164198\",\"date-69\":\"03.03.2188\",\"datetime-69\":\"03.03.2188 12:01\",\"decimal-69\":\"18294.22\",\"enum-69\":\"second option\",\"radio-69\":\"option c\",\"_0_checkbox-69\":\"1\",\"_2_checkbox-69\":\"3\",\"_sipForTypo3Vars\":\"5d9ef28d27930\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"69\",\"s\":\"5d9ef28c1da17\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=69\"}','192.168.133.204','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.90 Safari/537.36',1007,69,1,'778aefa4fadfe9a9c2b278b9b7be6085','2019-10-10 08:57:49'),(116,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"RFGJpPAQtutMy6im6n4YosKXVeSW95jy\",\"number-0\":\"816602013\",\"date-0\":\"03.03.2188\",\"datetime-0\":\"03.03.2188 12:01:00\",\"decimal-0\":\"18294.22\",\"enum-0\":\"second option\",\"radio-0\":\"option c\",\"_0_checkbox-0\":\"1\",\"_2_checkbox-0\":\"3\",\"_sipForTypo3Vars\":\"5d9ef4a42b15e\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5d9ef4a321a0a\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.204','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.90 Safari/537.36',1007,0,3,'7a7557ec1ac1d9981e80890da5e6ac60','2019-10-10 09:06:52'),(117,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"RCKJGnow4hSunJ4fnigjP3mR65Kr186S\",\"number-0\":\"1974174182\",\"date-0\":\"03.03.2188\",\"datetime-0\":\"03.03.2188 12:01:00\",\"decimal-0\":\"18294.22\",\"enum-0\":\"second option\",\"radio-0\":\"option c\",\"_0_checkbox-0\":\"1\",\"_2_checkbox-0\":\"3\",\"_sipForTypo3Vars\":\"5d9ef4a42b15e\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5d9ef4a321a0a\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.204','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.90 Safari/537.36',1007,0,3,'7a7557ec1ac1d9981e80890da5e6ac60','2019-10-10 09:06:57'),(118,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"f76696d90077ce621a781faf26aa65c9\",\"_h_checkbox-71\":\"\",\"text-71\":\"RCKJGnow4hSunJ4fnigjP3mR65Kr186S\",\"number-71\":\"2102729646\",\"date-71\":\"03.03.2188\",\"datetime-71\":\"03.03.2188 12:01\",\"decimal-71\":\"18294.22\",\"enum-71\":\"second option\",\"radio-71\":\"option c\",\"_0_checkbox-71\":\"1\",\"_2_checkbox-71\":\"3\",\"_sipForTypo3Vars\":\"5d9ef4b298776\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"71\",\"s\":\"5d9ef4b170d11\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=71\"}','192.168.133.204','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.90 Safari/537.36',1007,71,1,'7a7557ec1ac1d9981e80890da5e6ac60','2019-10-10 09:06:59'),(119,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"iD76DgYIPkkmKvsEnjynktrmoZ5jgVqL\",\"number-0\":\"702463120\",\"date-0\":\"03.03.2188\",\"datetime-0\":\"03.03.2188 12:01:00\",\"decimal-0\":\"18294.22\",\"enum-0\":\"second option\",\"radio-0\":\"option c\",\"_0_checkbox-0\":\"1\",\"_2_checkbox-0\":\"3\",\"_sipForTypo3Vars\":\"5d9ef5cb6b483\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5d9ef5ca8cfd3\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.204','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.90 Safari/537.36',1007,0,3,'71e6e4669002c959dc2ea6399768dc06','2019-10-10 09:11:47'),(120,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"BalzUM73uiM4xY32IBgMm4mvyb35lQly\",\"number-0\":\"1935217602\",\"date-0\":\"03.03.2188\",\"datetime-0\":\"03.03.2188 12:01:00\",\"decimal-0\":\"18294.22\",\"enum-0\":\"second option\",\"radio-0\":\"option c\",\"_0_checkbox-0\":\"1\",\"_2_checkbox-0\":\"3\",\"_sipForTypo3Vars\":\"5d9ef5cb6b483\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5d9ef5ca8cfd3\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.204','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.90 Safari/537.36',1007,0,3,'71e6e4669002c959dc2ea6399768dc06','2019-10-10 09:11:51'),(121,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"a97ca2923843d7190f424e93a31c05a6\",\"_h_checkbox-73\":\"\",\"text-73\":\"BalzUM73uiM4xY32IBgMm4mvyb35lQly\",\"number-73\":\"423760742\",\"date-73\":\"03.03.2188\",\"datetime-73\":\"03.03.2188 12:01\",\"decimal-73\":\"18294.22\",\"enum-73\":\"second option\",\"radio-73\":\"option c\",\"_0_checkbox-73\":\"1\",\"_2_checkbox-73\":\"3\",\"_sipForTypo3Vars\":\"5d9ef5d84a2d9\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"73\",\"s\":\"5d9ef5d753348\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=73\"}','192.168.133.204','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.90 Safari/537.36',1007,73,1,'71e6e4669002c959dc2ea6399768dc06','2019-10-10 09:11:52'),(122,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"sgaNjuuztwXtrT3jUw6oJxdaJ7RqNdEk\",\"number-0\":\"2114072679\",\"date-0\":\"03.03.2188\",\"datetime-0\":\"03.03.2188 12:01:00\",\"decimal-0\":\"18294.22\",\"enum-0\":\"second option\",\"radio-0\":\"option c\",\"_0_checkbox-0\":\"1\",\"_2_checkbox-0\":\"3\",\"_sipForTypo3Vars\":\"5d9ef7afec653\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5d9ef7aed5027\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.204','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.90 Safari/537.36',1007,0,3,'563b88a753f48f3f3519b9e999eec63c','2019-10-10 09:19:52'),(123,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"hZQOvNZ74pNS1P4Ulp2FnrZoujfmhCrf\",\"number-0\":\"610515060\",\"date-0\":\"03.03.2188\",\"datetime-0\":\"03.03.2188 12:01:00\",\"decimal-0\":\"18294.22\",\"enum-0\":\"second option\",\"radio-0\":\"option c\",\"_0_checkbox-0\":\"1\",\"_2_checkbox-0\":\"3\",\"_sipForTypo3Vars\":\"5d9ef7afec653\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5d9ef7aed5027\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.204','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.90 Safari/537.36',1007,0,3,'563b88a753f48f3f3519b9e999eec63c','2019-10-10 09:19:57'),(124,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"026af36a44b4c8ba789a2410ab921d2f\",\"_h_checkbox-75\":\"\",\"text-75\":\"hZQOvNZ74pNS1P4Ulp2FnrZoujfmhCrf\",\"number-75\":\"1655026773\",\"date-75\":\"03.03.2188\",\"datetime-75\":\"03.03.2188 12:01\",\"decimal-75\":\"18294.22\",\"enum-75\":\"second option\",\"radio-75\":\"option c\",\"_0_checkbox-75\":\"1\",\"_2_checkbox-75\":\"3\",\"_sipForTypo3Vars\":\"5d9ef7be3fdf2\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"75\",\"s\":\"5d9ef7bd29ef7\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=75\"}','192.168.133.204','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.90 Safari/537.36',1007,75,1,'563b88a753f48f3f3519b9e999eec63c','2019-10-10 09:19:58'),(125,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"825piCAVfobMEAQj9KxsZNT55QPL1ok8\",\"number-0\":\"1370498782\",\"date-0\":\"03.03.2188\",\"datetime-0\":\"03.03.2188 12:01:00\",\"decimal-0\":\"18294.22\",\"enum-0\":\"second option\",\"radio-0\":\"option c\",\"_0_checkbox-0\":\"1\",\"_2_checkbox-0\":\"3\",\"_sipForTypo3Vars\":\"5d9ef914113b4\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5d9ef9130eeb3\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.204','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.90 Safari/537.36',1007,0,3,'c1fcea4f36cb416dbf83c74ceac1b9b2','2019-10-10 09:25:48'),(126,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"ftWsslezVsoYEOFyZj9l5RFbt7gCeW2u\",\"number-0\":\"582709143\",\"date-0\":\"03.03.2188\",\"datetime-0\":\"03.03.2188 12:01:00\",\"decimal-0\":\"18294.22\",\"enum-0\":\"second option\",\"radio-0\":\"option c\",\"_0_checkbox-0\":\"1\",\"_2_checkbox-0\":\"3\",\"_sipForTypo3Vars\":\"5d9ef914113b4\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5d9ef9130eeb3\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.204','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.90 Safari/537.36',1007,0,3,'c1fcea4f36cb416dbf83c74ceac1b9b2','2019-10-10 09:25:52'),(127,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"b5ef481f7e25ed3c6964004798635969\",\"_h_checkbox-77\":\"\",\"text-77\":\"ftWsslezVsoYEOFyZj9l5RFbt7gCeW2u\",\"number-77\":\"2146076096\",\"date-77\":\"03.03.2188\",\"datetime-77\":\"03.03.2188 12:01\",\"decimal-77\":\"18294.22\",\"enum-77\":\"second option\",\"radio-77\":\"option c\",\"_0_checkbox-77\":\"1\",\"_2_checkbox-77\":\"3\",\"_sipForTypo3Vars\":\"5d9ef921ee8a3\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"77\",\"s\":\"5d9ef920d0724\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=77\"}','192.168.133.204','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.90 Safari/537.36',1007,77,1,'c1fcea4f36cb416dbf83c74ceac1b9b2','2019-10-10 09:25:54'),(128,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"AX1aUHZIZ9yrkxYsenouC66UXyEuWfOA\",\"number-0\":\"1068607675\",\"date-0\":\"03.03.2188\",\"datetime-0\":\"03.03.2188 12:01:00\",\"decimal-0\":\"18294.22\",\"enum-0\":\"second option\",\"radio-0\":\"option c\",\"_0_checkbox-0\":\"1\",\"_2_checkbox-0\":\"3\",\"_sipForTypo3Vars\":\"5d9ef95863e4c\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5d9ef9575c389\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.204','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.90 Safari/537.36',1007,0,3,'d9b6663e373108ad574c75f3b40be42d','2019-10-10 09:26:58'),(129,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"dyOQjHL1EeFrR4kfiP5mr1vQeELw5pF0\",\"number-0\":\"738466810\",\"date-0\":\"03.03.2188\",\"datetime-0\":\"03.03.2188 12:01:00\",\"decimal-0\":\"18294.22\",\"enum-0\":\"second option\",\"radio-0\":\"option c\",\"_0_checkbox-0\":\"1\",\"_2_checkbox-0\":\"3\",\"_sipForTypo3Vars\":\"5d9ef95863e4c\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5d9ef9575c389\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.204','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.90 Safari/537.36',1007,0,3,'d9b6663e373108ad574c75f3b40be42d','2019-10-10 09:27:03'),(130,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"53d1f9c088b439f72116d1e3c440a893\",\"_h_checkbox-79\":\"\",\"text-79\":\"dyOQjHL1EeFrR4kfiP5mr1vQeELw5pF0\",\"number-79\":\"1075563796\",\"date-79\":\"03.03.2188\",\"datetime-79\":\"03.03.2188 12:01\",\"decimal-79\":\"18294.22\",\"enum-79\":\"second option\",\"radio-79\":\"option c\",\"_0_checkbox-79\":\"1\",\"_2_checkbox-79\":\"3\",\"_sipForTypo3Vars\":\"5d9ef968394c5\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"79\",\"s\":\"5d9ef9672b4ce\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=79\"}','192.168.133.204','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.90 Safari/537.36',1007,79,1,'d9b6663e373108ad574c75f3b40be42d','2019-10-10 09:27:04'),(131,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"vc21FDJjeQDcLfPEzyPmzjvXuq74sbdH\",\"number-0\":\"1974529829\",\"date-0\":\"03.03.2188\",\"datetime-0\":\"03.03.2188 12:01:00\",\"decimal-0\":\"18294.22\",\"enum-0\":\"second option\",\"radio-0\":\"option c\",\"_0_checkbox-0\":\"1\",\"_2_checkbox-0\":\"3\",\"_sipForTypo3Vars\":\"5d9f03cbcbc24\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5d9f03ca9dc22\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.204','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.90 Safari/537.36',1007,0,3,'cb3416ece7154e88ac4cb464d90002f0','2019-10-10 10:11:35'),(132,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"uQc1JD2wIqc04HFF5t3yL074mDrUYKO7\",\"number-0\":\"431356264\",\"date-0\":\"03.03.2188\",\"datetime-0\":\"03.03.2188 12:01:00\",\"decimal-0\":\"18294.22\",\"enum-0\":\"second option\",\"radio-0\":\"option c\",\"_0_checkbox-0\":\"1\",\"_2_checkbox-0\":\"3\",\"_sipForTypo3Vars\":\"5d9f03cbcbc24\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5d9f03ca9dc22\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.204','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.90 Safari/537.36',1007,0,3,'cb3416ece7154e88ac4cb464d90002f0','2019-10-10 10:11:40'),(133,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"341d22d776d711d2e1411dc2f561a962\",\"_h_checkbox-81\":\"\",\"text-81\":\"uQc1JD2wIqc04HFF5t3yL074mDrUYKO7\",\"number-81\":\"79569373\",\"date-81\":\"03.03.2188\",\"datetime-81\":\"03.03.2188 12:01\",\"decimal-81\":\"18294.22\",\"enum-81\":\"second option\",\"radio-81\":\"option c\",\"_0_checkbox-81\":\"1\",\"_2_checkbox-81\":\"3\",\"_sipForTypo3Vars\":\"5d9f03ddc4ee9\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"81\",\"s\":\"5d9f03dc804dc\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=81\"}','192.168.133.204','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.90 Safari/537.36',1007,81,1,'cb3416ece7154e88ac4cb464d90002f0','2019-10-10 10:11:42'),(134,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"FdNDtpgD47OBzaIY8x7BED1QoXSjOWSf\",\"number-0\":\"1380629312\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option b\",\"_2_checkbox-0\":\"3\",\"_sipForTypo3Vars\":\"5d9f0ad86f552\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5d9f0ad74fd8d\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.204','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.90 Safari/537.36',1007,0,3,'a68b19a9be8e66facfd611420164ec39','2019-10-10 10:41:30'),(135,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"ZbmbPniVA5ZioMaiwVOLLpunGwZMYguJ\",\"number-0\":\"671683952\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option b\",\"_2_checkbox-0\":\"3\",\"_sipForTypo3Vars\":\"5d9f0e2925bb3\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5d9f0e280ea41\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.204','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.90 Safari/537.36',1007,0,3,'f1eaf18f2c7300310442e8b9a5d97ddd','2019-10-10 10:55:43'),(136,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"vsrxEqHwd0Ab0WMxbH7sBgGfi62DeF9J\",\"number-0\":\"865176940\",\"date-0\":\"03.03.2188\",\"datetime-0\":\"03.03.2188 12:01:00\",\"decimal-0\":\"18294.22\",\"enum-0\":\"second option\",\"radio-0\":\"option c\",\"_0_checkbox-0\":\"1\",\"_2_checkbox-0\":\"3\",\"_sipForTypo3Vars\":\"5d9f0e2925bb3\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5d9f0e280ea41\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.204','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.90 Safari/537.36',1007,0,3,'f1eaf18f2c7300310442e8b9a5d97ddd','2019-10-10 10:55:47'),(137,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"edb827dd8effa195092cfb551913ee32\",\"_h_checkbox-84\":\"\",\"text-84\":\"vsrxEqHwd0Ab0WMxbH7sBgGfi62DeF9J\",\"number-84\":\"1219422328\",\"date-84\":\"03.03.2188\",\"datetime-84\":\"03.03.2188 12:01\",\"decimal-84\":\"18294.22\",\"enum-84\":\"second option\",\"radio-84\":\"option c\",\"_0_checkbox-84\":\"1\",\"_2_checkbox-84\":\"3\",\"_sipForTypo3Vars\":\"5d9f0e352da8c\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"84\",\"s\":\"5d9f0e33e51ed\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=84\"}','192.168.133.204','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.90 Safari/537.36',1007,84,1,'f1eaf18f2c7300310442e8b9a5d97ddd','2019-10-10 10:55:49'),(138,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"HvobekKS3osp3dY5NGra4fMzUZP8QCHP\",\"number-0\":\"1130240837\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option b\",\"_2_checkbox-0\":\"3\",\"_sipForTypo3Vars\":\"5d9f10748aa50\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5d9f10737df10\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.204','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.90 Safari/537.36',1007,0,3,'afd85b43fd73fb0ff104f7ccd232d504','2019-10-10 11:05:28'),(139,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"IxemYeeEI40XVin99rkzFCWNWjW1Tl1m\",\"number-0\":\"853783428\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option b\",\"_2_checkbox-0\":\"3\",\"_sipForTypo3Vars\":\"5d9f10748aa50\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5d9f10737df10\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.204','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.90 Safari/537.36',1007,0,3,'afd85b43fd73fb0ff104f7ccd232d504','2019-10-10 11:05:32'),(140,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"Qqd9knaSSs4busYaGsP1yD7leIpK4BDW\",\"number-0\":\"1394660403\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option b\",\"_2_checkbox-0\":\"3\",\"_sipForTypo3Vars\":\"5d9f10a4bc1cd\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5d9f10a3cb062\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.204','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.90 Safari/537.36',1007,0,3,'394f42f4c8842ee603d04e3c4887579f','2019-10-10 11:06:16'),(141,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"o4MtMEmptLTXR0tNkAeXLAC57Cpz4Sus\",\"number-0\":\"154253458\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option b\",\"_2_checkbox-0\":\"3\",\"_sipForTypo3Vars\":\"5d9f10a4bc1cd\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5d9f10a3cb062\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.204','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.90 Safari/537.36',1007,0,3,'394f42f4c8842ee603d04e3c4887579f','2019-10-10 11:06:20'),(142,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"31f9645db86194c6a2e338527d39de35\",\"_h_checkbox-88\":\"\",\"text-88\":\"dCEegcMK9VL99v8cBzqVin1twYWY5BBf\",\"number-88\":\"205147586\",\"date-88\":\"01.01.2188\",\"datetime-88\":\"02.02.2188 01:08\",\"decimal-88\":\"12.84\",\"enum-88\":\"first option\",\"radio-88\":\"option b\",\"_2_checkbox-88\":\"3\",\"_sipForTypo3Vars\":\"5d9f10ae46f8a\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"88\",\"s\":\"5d9f10ace5eff\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=88\"}','192.168.133.204','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.90 Safari/537.36',1007,88,1,'394f42f4c8842ee603d04e3c4887579f','2019-10-10 11:06:23'),(143,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"7GgJFWedjUuK8SIYIJVpNH0j0VTGye3o\",\"number-0\":\"306826564\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option b\",\"_2_checkbox-0\":\"3\",\"_sipForTypo3Vars\":\"5d9f1112860aa\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5d9f1111798e7\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.204','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.90 Safari/537.36',1007,0,3,'02a4412dcfbdc9385037145ae9c196ba','2019-10-10 11:08:06'),(144,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"faB1mU94uk0aharDWjbygvWDvNtkeKBN\",\"number-0\":\"497110475\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option b\",\"_2_checkbox-0\":\"3\",\"_sipForTypo3Vars\":\"5d9f1112860aa\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5d9f1111798e7\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.204','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.90 Safari/537.36',1007,0,3,'02a4412dcfbdc9385037145ae9c196ba','2019-10-10 11:08:10'),(145,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d0183dd0ce80b58ca6458a9504610e8d\",\"_h_checkbox-90\":\"\",\"text-90\":\"LetBi1WzSX6FPSoj8mq1cD2Se7c2Cp36\",\"number-90\":\"1623267857\",\"date-90\":\"01.01.2188\",\"datetime-90\":\"02.02.2188 01:08\",\"decimal-90\":\"12.84\",\"enum-90\":\"first option\",\"radio-90\":\"option b\",\"_2_checkbox-90\":\"3\",\"_sipForTypo3Vars\":\"5d9f111b7544b\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"90\",\"s\":\"5d9f111a6889e\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=90\"}','192.168.133.204','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.90 Safari/537.36',1007,90,1,'02a4412dcfbdc9385037145ae9c196ba','2019-10-10 11:08:12'),(146,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"9dY9qyIkPp0YvvpupzkTFiDfe39cSrva\",\"number-0\":\"322309396\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option b\",\"_2_checkbox-0\":\"3\",\"_sipForTypo3Vars\":\"5d9f1e2f88515\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5d9f1e2e931f4\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.204','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.90 Safari/537.36',1007,0,3,'108c6c50b5f392e17fce1318c8b5e100','2019-10-10 12:04:03'),(147,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"0wJJ7pgeuumOgr6LazMhVtCUOecNk8JZ\",\"number-0\":\"1656794622\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option b\",\"_2_checkbox-0\":\"3\",\"_sipForTypo3Vars\":\"5d9f1e2f88515\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5d9f1e2e931f4\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.204','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.90 Safari/537.36',1007,0,3,'108c6c50b5f392e17fce1318c8b5e100','2019-10-10 12:04:08'),(148,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"08a8536b57fc66ffca6f7eecc9630624\",\"_h_checkbox-92\":\"\",\"text-92\":\"iHSgWQflFjEscf7qWMwWU2Ti53ITy5ge\",\"number-92\":\"408614278\",\"date-92\":\"01.01.2188\",\"datetime-92\":\"02.02.2188 01:08\",\"decimal-92\":\"12.84\",\"enum-92\":\"first option\",\"radio-92\":\"option b\",\"_2_checkbox-92\":\"3\",\"_sipForTypo3Vars\":\"5d9f1e39aac0b\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"92\",\"s\":\"5d9f1e3847506\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=92\"}','192.168.133.204','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.90 Safari/537.36',1007,92,1,'108c6c50b5f392e17fce1318c8b5e100','2019-10-10 12:04:11'),(149,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"KuATjlQSRAzM3LLgzMmIkcGvN6zMC51D\",\"number-0\":\"1882819715\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option b\",\"_2_checkbox-0\":\"3\",\"_sipForTypo3Vars\":\"5d9f246d8e909\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5d9f246c7d1d1\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.204','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.90 Safari/537.36',1007,0,3,'3c93c85020ded53ac8e02cba843ec72f','2019-10-10 12:30:42'),(150,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"dpSXTsX3ht9XncfpIhhSpmpSxQxDl9PL\",\"number-0\":\"247943560\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option b\",\"_2_checkbox-0\":\"3\",\"_sipForTypo3Vars\":\"5d9f246d8e909\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5d9f246c7d1d1\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.204','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.90 Safari/537.36',1007,0,3,'3c93c85020ded53ac8e02cba843ec72f','2019-10-10 12:30:47'),(151,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"16a05147be109338433c11a25dbdf921\",\"_h_checkbox-94\":\"\",\"text-94\":\"p81GmdRspjCe27ZlEWkmvKATyDnLmkbp\",\"number-94\":\"220641000\",\"date-94\":\"01.01.2188\",\"datetime-94\":\"02.02.2188 01:08\",\"decimal-94\":\"12.84\",\"enum-94\":\"first option\",\"radio-94\":\"option b\",\"_2_checkbox-94\":\"3\",\"_sipForTypo3Vars\":\"5d9f2479309c4\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"94\",\"s\":\"5d9f2477bc147\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=94\"}','192.168.133.204','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.90 Safari/537.36',1007,94,1,'3c93c85020ded53ac8e02cba843ec72f','2019-10-10 12:30:50'),(152,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"1C1gGmb6uCn4h4ZLgqgu4iT1PeNV82Pq\",\"number-0\":\"936619211\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option b\",\"_2_checkbox-0\":\"3\",\"_sipForTypo3Vars\":\"5d9f24ee08ba9\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5d9f24ecb808b\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.204','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.90 Safari/537.36',1007,0,3,'348a3ea6675c383c1e9a39b93da2d31c','2019-10-10 12:32:50'),(153,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"E9JKqLGshh6qP7q5Vwx0TIF7x8LM9wQA\",\"number-0\":\"338887043\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option b\",\"_2_checkbox-0\":\"3\",\"_sipForTypo3Vars\":\"5d9f24ee08ba9\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5d9f24ecb808b\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.204','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.90 Safari/537.36',1007,0,3,'348a3ea6675c383c1e9a39b93da2d31c','2019-10-10 12:32:55'),(154,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"4ed036789186d128f0d8839c6c696056\",\"_h_checkbox-96\":\"\",\"text-96\":\"lTe3LmxzfiIaE0vPqTilKQnynuSmIUvb\",\"number-96\":\"2133234920\",\"date-96\":\"01.01.2188\",\"datetime-96\":\"02.02.2188 01:08\",\"decimal-96\":\"12.84\",\"enum-96\":\"first option\",\"radio-96\":\"option b\",\"_2_checkbox-96\":\"3\",\"_sipForTypo3Vars\":\"5d9f24f924ee5\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"96\",\"s\":\"5d9f24f7e98e4\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=96\"}','192.168.133.204','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.90 Safari/537.36',1007,96,1,'348a3ea6675c383c1e9a39b93da2d31c','2019-10-10 12:32:58'),(155,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"7ZfELoHzXiIqvOh9nqQc668EBGCTWZOx\",\"number-0\":\"967551276\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option b\",\"_2_checkbox-0\":\"3\",\"_sipForTypo3Vars\":\"5d9f25123afda\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5d9f2510c6412\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.204','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.90 Safari/537.36',1007,0,3,'d148df8e44ed3dfad8fc428a18749ce7','2019-10-10 12:33:27'),(156,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"VglN65lAadJW0OGTnDBtiHsCnpb4RgZD\",\"number-0\":\"1000927147\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option b\",\"_2_checkbox-0\":\"3\",\"_sipForTypo3Vars\":\"5d9f25123afda\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5d9f2510c6412\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.204','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.90 Safari/537.36',1007,0,3,'d148df8e44ed3dfad8fc428a18749ce7','2019-10-10 12:33:32'),(157,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"ad2f6100b9122d9945cfe8cca4d1f5d0\",\"_h_checkbox-98\":\"\",\"text-98\":\"gwPXYADXRhITq9B9eNOC8Eg3obHLv4iZ\",\"number-98\":\"121171379\",\"date-98\":\"01.01.2188\",\"datetime-98\":\"02.02.2188 01:08\",\"decimal-98\":\"12.84\",\"enum-98\":\"first option\",\"radio-98\":\"option b\",\"_2_checkbox-98\":\"3\",\"_sipForTypo3Vars\":\"5d9f251d741cf\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"98\",\"s\":\"5d9f251c43a0f\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=98\"}','192.168.133.204','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.90 Safari/537.36',1007,98,1,'d148df8e44ed3dfad8fc428a18749ce7','2019-10-10 12:33:35'),(158,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"uIz81JLpIWssAzdKBLj62513sIMyc63Y\",\"number-0\":\"978198633\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option b\",\"_2_checkbox-0\":\"3\",\"_sipForTypo3Vars\":\"5d9f25476a439\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5d9f254636912\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.204','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.90 Safari/537.36',1007,0,3,'d1eb6a86cf25358eaa394302c7c23a73','2019-10-10 12:34:19'),(159,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"ckGqOxkjV2RtuaqiDEcVtAqTmqeqcSMU\",\"number-0\":\"1686641660\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option b\",\"_2_checkbox-0\":\"3\",\"_sipForTypo3Vars\":\"5d9f25476a439\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5d9f254636912\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.204','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.90 Safari/537.36',1007,0,3,'d1eb6a86cf25358eaa394302c7c23a73','2019-10-10 12:34:24'),(160,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d2c151fac9aed22dd77dcb74502e5c93\",\"_h_checkbox-100\":\"\",\"text-100\":\"g2CRUtxSeaLgf8dDcLfAOBGPy8Tf66NT\",\"number-100\":\"242430042\",\"date-100\":\"01.01.2188\",\"datetime-100\":\"02.02.2188 01:08\",\"decimal-100\":\"12.84\",\"enum-100\":\"first option\",\"radio-100\":\"option b\",\"_2_checkbox-100\":\"3\",\"_sipForTypo3Vars\":\"5d9f255224a54\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"100\",\"s\":\"5d9f2550cdf4c\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=100\"}','192.168.133.204','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.90 Safari/537.36',1007,100,1,'d1eb6a86cf25358eaa394302c7c23a73','2019-10-10 12:34:27'),(161,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"zGJFAQPainM0HkCkP28uyBgUKYOD1rzn\",\"number-0\":\"1890858580\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option b\",\"_2_checkbox-0\":\"3\",\"_sipForTypo3Vars\":\"5d9f25ff9e87a\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5d9f25fe95c72\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.204','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.90 Safari/537.36',1007,0,3,'e3facce041c5a3cddae2e7b051e48e9a','2019-10-10 12:37:23'),(162,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"4Roz3eYmLxiMw9ntOAFxtSb0GRuuniv3\",\"number-0\":\"1954697598\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option b\",\"_2_checkbox-0\":\"3\",\"_sipForTypo3Vars\":\"5d9f25ff9e87a\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5d9f25fe95c72\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.204','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.90 Safari/537.36',1007,0,3,'e3facce041c5a3cddae2e7b051e48e9a','2019-10-10 12:37:28'),(163,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"098f44ce5963813e4c957ff38f827d65\",\"_h_checkbox-102\":\"\",\"text-102\":\"0ImZn1peCRzLTQmO2Oh9niXWxrndIMGI\",\"number-102\":\"1881365283\",\"date-102\":\"01.01.2188\",\"datetime-102\":\"02.02.2188 01:08\",\"decimal-102\":\"12.84\",\"enum-102\":\"first option\",\"radio-102\":\"option b\",\"_2_checkbox-102\":\"3\",\"_sipForTypo3Vars\":\"5d9f260a21e2a\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"102\",\"s\":\"5d9f2608c7bcb\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=102\"}','192.168.133.204','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.90 Safari/537.36',1007,102,1,'e3facce041c5a3cddae2e7b051e48e9a','2019-10-10 12:37:31'),(164,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"OStd8BgEPEOlZrq6P6l56mWMrVq9lnTL\",\"number-0\":\"713581203\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option b\",\"_2_checkbox-0\":\"3\",\"_sipForTypo3Vars\":\"5d9f267df0d76\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5d9f267cbb4f3\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.204','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.90 Safari/537.36',1007,0,3,'dc4d1ccd15d08d0239b901685263522b','2019-10-10 12:39:30'),(165,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"P8DHvwG4PASYFE5Dfk7b9bAKgJQeECJX\",\"number-0\":\"332743020\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option b\",\"_2_checkbox-0\":\"3\",\"_sipForTypo3Vars\":\"5d9f267df0d76\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5d9f267cbb4f3\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.204','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.90 Safari/537.36',1007,0,3,'dc4d1ccd15d08d0239b901685263522b','2019-10-10 12:39:35'),(166,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"0680e130ccc29770b1d6011377ef380c\",\"_h_checkbox-104\":\"\",\"text-104\":\"swoOr7FpFh5xel29SvtSvWwPrYxWvG8k\",\"number-104\":\"619148385\",\"date-104\":\"01.01.2188\",\"datetime-104\":\"02.02.2188 01:08\",\"decimal-104\":\"12.84\",\"enum-104\":\"first option\",\"radio-104\":\"option b\",\"_2_checkbox-104\":\"3\",\"_sipForTypo3Vars\":\"5d9f2688a609e\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"104\",\"s\":\"5d9f26878fa00\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=104\"}','192.168.133.204','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.90 Safari/537.36',1007,104,1,'dc4d1ccd15d08d0239b901685263522b','2019-10-10 12:39:38'),(167,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"some test data\",\"number-0\":\"1234567890\",\"date-0\":\"01.01.9999\",\"datetime-0\":\"31.12.2019 00:00\",\"decimal-0\":\"1\",\"enum-0\":\"second option\",\"radio-0\":\"option b\",\"_0_checkbox-0\":\"1\",\"_2_checkbox-0\":\"3\",\"_sipForTypo3Vars\":\"5d9eda9bb9d10\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5d9ed1ab2e5a6\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.204','','Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:69.0) Gecko/20100101 Firefox/69.0',1007,0,3,'bd9ca9c19bc5f064dc211cedfaa063bb','2019-10-10 14:19:00'),(168,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"0eeZqRHjeNtHPSbqubAo5m7JA5Vjo1lg\",\"number-0\":\"1523903402\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option b\",\"_2_checkbox-0\":\"3\",\"_sipForTypo3Vars\":\"5da02732e1a92\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5da02731c8382\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.204','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36',1007,0,3,'df51f60f3311b43e506f46337042ad18','2019-10-11 06:54:46'),(169,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"dCGeyt7djq60tK8O65Ari24RivCT9lI8\",\"number-0\":\"1081334026\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option b\",\"_2_checkbox-0\":\"3\",\"_sipForTypo3Vars\":\"5da02732e1a92\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5da02731c8382\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.204','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36',1007,0,3,'df51f60f3311b43e506f46337042ad18','2019-10-11 06:54:51'),(170,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"7f86319a24c042ab0c46cc8eb13489e0\",\"_h_checkbox-107\":\"\",\"text-107\":\"yhsfqaRe2J8K8zjcogqxRWeafjnmGTT5\",\"number-107\":\"1083539554\",\"date-107\":\"01.01.2188\",\"datetime-107\":\"02.02.2188 01:08\",\"decimal-107\":\"12.84\",\"enum-107\":\"first option\",\"radio-107\":\"option b\",\"_2_checkbox-107\":\"3\",\"_sipForTypo3Vars\":\"5da0273cc7802\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"107\",\"s\":\"5da0273b711ab\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=107\"}','192.168.133.204','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36',1007,107,1,'df51f60f3311b43e506f46337042ad18','2019-10-11 06:54:54'),(171,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"M6aqdxzyMWAdNghQF8fbha7nLNOwuZwr\",\"number-0\":\"1063580911\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option b\",\"_2_checkbox-0\":\"3\",\"_sipForTypo3Vars\":\"5da0275899e9f\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5da0275771d7a\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.204','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36',1007,0,3,'5a343ebeb5ead27758ba03854769eb50','2019-10-11 06:55:24'),(172,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"GuQFTN3yB3dHDIfvJZ8tzgYuaNZ2WZPM\",\"number-0\":\"1985275601\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option b\",\"_2_checkbox-0\":\"3\",\"_sipForTypo3Vars\":\"5da0275899e9f\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5da0275771d7a\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.204','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36',1007,0,3,'5a343ebeb5ead27758ba03854769eb50','2019-10-11 06:55:28'),(173,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"10b617013b8b41da5d0d1fd035b3f53e\",\"_h_checkbox-109\":\"\",\"text-109\":\"cHbgBPQwhswHXld6hpcdzINTeVMNUW6L\",\"number-109\":\"1472883557\",\"date-109\":\"01.01.2188\",\"datetime-109\":\"02.02.2188 01:08\",\"decimal-109\":\"12.84\",\"enum-109\":\"first option\",\"radio-109\":\"option b\",\"_2_checkbox-109\":\"3\",\"_sipForTypo3Vars\":\"5da027614c313\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"109\",\"s\":\"5da02760624cb\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=109\"}','192.168.133.204','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36',1007,109,1,'5a343ebeb5ead27758ba03854769eb50','2019-10-11 06:55:30'),(174,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"8tBejqJM7DPkRa3QBjOluWW7Cir6aFUH\",\"number-0\":\"1623593466\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option b\",\"_2_checkbox-0\":\"3\",\"_sipForTypo3Vars\":\"5da038967f827\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5da0389596537\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.204','','Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:69.0) Gecko/20100101 Firefox/69.0',1007,0,3,'f1bd6d4ca3168213ecf11421ff97bcc0','2019-10-11 08:08:57'),(175,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"sp6OJ5G7q9b5kd2RUrroWRxg3fJK5vaJ\",\"number-0\":\"113650103\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option b\",\"_2_checkbox-0\":\"3\",\"_sipForTypo3Vars\":\"5da038967f827\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5da0389596537\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.204','','Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:69.0) Gecko/20100101 Firefox/69.0',1007,0,3,'f1bd6d4ca3168213ecf11421ff97bcc0','2019-10-11 08:09:02'),(176,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"84bb1ad3d745afa565b73afb2d0c50fe\",\"_h_checkbox-111\":\"\",\"text-111\":\"GekJVsA1k7KiB2Wf2sK4NRjS06LLvihg\",\"number-111\":\"678675816\",\"date-111\":\"01.01.2188\",\"datetime-111\":\"02.02.2188 01:08\",\"decimal-111\":\"12.84\",\"enum-111\":\"first option\",\"radio-111\":\"option b\",\"_2_checkbox-111\":\"3\",\"_sipForTypo3Vars\":\"5da0389f5918e\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"111\",\"s\":\"5da0389e08884\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=111\"}','192.168.133.204','','Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:69.0) Gecko/20100101 Firefox/69.0',1007,111,1,'f1bd6d4ca3168213ecf11421ff97bcc0','2019-10-11 08:09:04'),(177,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"u2x32QIef7QKJ7jhNQOhtkRrcoADKsaD\",\"number-0\":\"1368718169\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option b\",\"_2_checkbox-0\":\"3\",\"_sipForTypo3Vars\":\"5da03b1d3b445\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5da03b1c54009\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.204','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36',1007,0,3,'85821fb6cd0aeb1a8e54587a40a0ee3d','2019-10-11 08:19:44'),(178,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"QX8WhYPvPPasXx7HCx9SRg6crpOZudvE\",\"number-0\":\"1930391414\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option b\",\"_2_checkbox-0\":\"3\",\"_sipForTypo3Vars\":\"5da03b1d3b445\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5da03b1c54009\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.204','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36',1007,0,3,'85821fb6cd0aeb1a8e54587a40a0ee3d','2019-10-11 08:19:48'),(179,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"c8bf0e68155d14699ad60b1eb6791382\",\"_h_checkbox-113\":\"\",\"text-113\":\"BlPJXj7TywdG6z1CkJxddg6DMyTuAVEM\",\"number-113\":\"1736256107\",\"date-113\":\"01.01.2188\",\"datetime-113\":\"02.02.2188 01:08\",\"decimal-113\":\"12.84\",\"enum-113\":\"first option\",\"radio-113\":\"option b\",\"_2_checkbox-113\":\"3\",\"_sipForTypo3Vars\":\"5da03b261f65b\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"113\",\"s\":\"5da03b24ba039\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=113\"}','192.168.133.204','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36',1007,113,1,'85821fb6cd0aeb1a8e54587a40a0ee3d','2019-10-11 08:19:51'),(180,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"qEDXkABbutlJpv9EBOFxMmb0ODhPTrCE\",\"number-0\":\"1311294828\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option b\",\"_2_checkbox-0\":\"3\",\"_sipForTypo3Vars\":\"5da03b868c213\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5da03b856c2e5\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.204','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36',1007,0,3,'8b2a6dc129d1980c14ec127d99729a6f','2019-10-11 08:21:30'),(181,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"cOc2IAFZnS50L6z1QQFS2gsNSfuQtLhb\",\"number-0\":\"446537652\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option b\",\"_2_checkbox-0\":\"3\",\"_sipForTypo3Vars\":\"5da03b868c213\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5da03b856c2e5\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.204','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36',1007,0,3,'8b2a6dc129d1980c14ec127d99729a6f','2019-10-11 08:21:34'),(182,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d7821772ad13f46d9dbd0f7060e37d94\",\"_h_checkbox-115\":\"\",\"text-115\":\"OrJtv42Y2hpt906tV1z3W5YoGKOVnbhy\",\"number-115\":\"1540713240\",\"date-115\":\"01.01.2188\",\"datetime-115\":\"02.02.2188 01:08\",\"decimal-115\":\"12.84\",\"enum-115\":\"first option\",\"radio-115\":\"option b\",\"_2_checkbox-115\":\"3\",\"_sipForTypo3Vars\":\"5da03b8fdcc23\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"115\",\"s\":\"5da03b8e9cc52\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=115\"}','192.168.133.204','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36',1007,115,1,'8b2a6dc129d1980c14ec127d99729a6f','2019-10-11 08:21:37'),(183,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"LjovVcGdlcCqDSkcH7qkXEgyPHpqsoLJ\",\"number-0\":\"1690582018\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option b\",\"_2_checkbox-0\":\"3\",\"_sipForTypo3Vars\":\"5da03bd7c3799\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5da03bd6ddecb\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.204','','Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:69.0) Gecko/20100101 Firefox/69.0',1007,0,3,'40e5ff73e6da6ae6402f3b0fd4e9327a','2019-10-11 08:22:50'),(184,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"MFMmZVxtE1z7XZ9rVfQVt4W31OIHi0gQ\",\"number-0\":\"653080761\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option b\",\"_2_checkbox-0\":\"3\",\"_sipForTypo3Vars\":\"5da03bd7c3799\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5da03bd6ddecb\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.204','','Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:69.0) Gecko/20100101 Firefox/69.0',1007,0,3,'40e5ff73e6da6ae6402f3b0fd4e9327a','2019-10-11 08:22:54'),(185,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"e3225a6e0b5ab63de6d969eaa0e498a9\",\"_h_checkbox-117\":\"\",\"text-117\":\"61vvosC2reD919aRZJZ38fvDmOq0o8D6\",\"number-117\":\"184930592\",\"date-117\":\"01.01.2188\",\"datetime-117\":\"02.02.2188 01:08\",\"decimal-117\":\"12.84\",\"enum-117\":\"first option\",\"radio-117\":\"option b\",\"_2_checkbox-117\":\"3\",\"_sipForTypo3Vars\":\"5da03bdfdab07\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"117\",\"s\":\"5da03bdebe31a\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=117\"}','192.168.133.204','','Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:69.0) Gecko/20100101 Firefox/69.0',1007,117,1,'40e5ff73e6da6ae6402f3b0fd4e9327a','2019-10-11 08:22:57'),(186,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"OmB0IA22AKLkqaIMJWsZbfTXug5QRtHF\",\"number-0\":\"392819054\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option b\",\"_2_checkbox-0\":\"3\",\"_sipForTypo3Vars\":\"5da03c1148ecb\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5da03c10664d1\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.204','','Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:69.0) Gecko/20100101 Firefox/69.0',1007,0,3,'86320536dce5b0d2608d12987b6c8261','2019-10-11 08:23:48'),(187,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"25DagpgnGkC6YDEQFwghwvu2xSOmRspA\",\"number-0\":\"1540600811\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option b\",\"_2_checkbox-0\":\"3\",\"_sipForTypo3Vars\":\"5da03c1148ecb\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5da03c10664d1\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.204','','Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:69.0) Gecko/20100101 Firefox/69.0',1007,0,3,'86320536dce5b0d2608d12987b6c8261','2019-10-11 08:23:52'),(188,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"b5d04b2c3c98efce9e9ca44dd3e99ba2\",\"_h_checkbox-119\":\"\",\"text-119\":\"JhXzFVG891uyfMQCGUxL5qo8d0EvtZz0\",\"number-119\":\"1850724836\",\"date-119\":\"01.01.2188\",\"datetime-119\":\"02.02.2188 01:08\",\"decimal-119\":\"12.84\",\"enum-119\":\"first option\",\"radio-119\":\"option b\",\"_2_checkbox-119\":\"3\",\"_sipForTypo3Vars\":\"5da03c1951e35\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"119\",\"s\":\"5da03c183d0eb\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=119\"}','192.168.133.204','','Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:69.0) Gecko/20100101 Firefox/69.0',1007,119,1,'86320536dce5b0d2608d12987b6c8261','2019-10-11 08:23:54'),(189,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"MMFpLeVL7Cwd4Idzn9uQ97HAlnq8iWny\",\"number-0\":\"143182827\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option b\",\"_2_checkbox-0\":\"3\",\"_sipForTypo3Vars\":\"5da03c39c5c0d\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5da03c38dde5b\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.204','','Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:69.0) Gecko/20100101 Firefox/69.0',1007,0,3,'7dd0938053d30c3aea56442774827af8','2019-10-11 08:24:28'),(190,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"SQZrLr6MHRcDOxM4Em5oqt0vv8ESvidJ\",\"number-0\":\"1234531486\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option b\",\"_2_checkbox-0\":\"3\",\"_sipForTypo3Vars\":\"5da03c39c5c0d\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5da03c38dde5b\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.204','','Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:69.0) Gecko/20100101 Firefox/69.0',1007,0,3,'7dd0938053d30c3aea56442774827af8','2019-10-11 08:24:32'),(191,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"559ebf8ffe49d3bc098892d6bc0ae9ba\",\"_h_checkbox-121\":\"\",\"text-121\":\"yUB2rwugpkuAVDLg7AGhUFg9b5rQAaos\",\"number-121\":\"1949420649\",\"date-121\":\"01.01.2188\",\"datetime-121\":\"02.02.2188 01:08\",\"decimal-121\":\"12.84\",\"enum-121\":\"first option\",\"radio-121\":\"option b\",\"_2_checkbox-121\":\"3\",\"_sipForTypo3Vars\":\"5da03c41d3c19\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"121\",\"s\":\"5da03c40b9f04\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=121\"}','192.168.133.204','','Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:69.0) Gecko/20100101 Firefox/69.0',1007,121,1,'7dd0938053d30c3aea56442774827af8','2019-10-11 08:24:34'),(192,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"ihj0sWFiBmGQXdNDv3YNbElztmyEWGsF\",\"number-0\":\"1894923963\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option b\",\"_2_checkbox-0\":\"3\",\"_sipForTypo3Vars\":\"5da03e02e787b\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5da03e020eee1\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.204','','Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:69.0) Gecko/20100101 Firefox/69.0',1007,0,3,'140d9920b054411c66bcb237fe9889e4','2019-10-11 08:32:06'),(193,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"76VLDoz3i1O8ICj7p7EVDQYYHi9yuZ2j\",\"number-0\":\"979789087\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option b\",\"_2_checkbox-0\":\"3\",\"_sipForTypo3Vars\":\"5da03e02e787b\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5da03e020eee1\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.204','','Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:69.0) Gecko/20100101 Firefox/69.0',1007,0,3,'140d9920b054411c66bcb237fe9889e4','2019-10-11 08:32:10'),(194,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"759ed788d79fdcee9c4cd0bd98471bd8\",\"_h_checkbox-123\":\"\",\"text-123\":\"sBHi1mDfehXoYy8kjYwrA2U9jehatp8g\",\"number-123\":\"216943544\",\"date-123\":\"01.01.2188\",\"datetime-123\":\"02.02.2188 01:08\",\"decimal-123\":\"12.84\",\"enum-123\":\"first option\",\"radio-123\":\"option b\",\"_2_checkbox-123\":\"3\",\"_sipForTypo3Vars\":\"5da03e0b9c770\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"123\",\"s\":\"5da03e0a89b21\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=123\"}','192.168.133.204','','Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:69.0) Gecko/20100101 Firefox/69.0',1007,123,1,'140d9920b054411c66bcb237fe9889e4','2019-10-11 08:32:12'),(195,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"Hd2y8wPSVWhrLYzH5opQmPTphmOkWzXt\",\"number-0\":\"1651070611\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option b\",\"_2_checkbox-0\":\"3\",\"_sipForTypo3Vars\":\"5da03e2d5caf1\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5da03e2c5c88c\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.204','','Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:69.0) Gecko/20100101 Firefox/69.0',1007,0,3,'fc1b8f8c9f2bdd8bac85751ff9215d53','2019-10-11 08:32:48'),(196,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"9KVbT4oS4kYFgZn91FgZl2pJBaMlzK7s\",\"number-0\":\"1403160338\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option b\",\"_2_checkbox-0\":\"3\",\"_sipForTypo3Vars\":\"5da03e2d5caf1\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5da03e2c5c88c\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.204','','Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:69.0) Gecko/20100101 Firefox/69.0',1007,0,3,'fc1b8f8c9f2bdd8bac85751ff9215d53','2019-10-11 08:32:52'),(197,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"303966222ad42f2766540bab6a62004d\",\"_h_checkbox-125\":\"\",\"text-125\":\"tundYlCSbM68CqqAdLYYY1Sf7qEZyejn\",\"number-125\":\"1868054946\",\"date-125\":\"01.01.2188\",\"datetime-125\":\"02.02.2188 01:08\",\"decimal-125\":\"12.84\",\"enum-125\":\"first option\",\"radio-125\":\"option b\",\"_2_checkbox-125\":\"3\",\"_sipForTypo3Vars\":\"5da03e353e107\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"125\",\"s\":\"5da03e3435ec1\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=125\"}','192.168.133.204','','Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:69.0) Gecko/20100101 Firefox/69.0',1007,125,1,'fc1b8f8c9f2bdd8bac85751ff9215d53','2019-10-11 08:32:54'),(198,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"KG82devWQl702ZNPLTG6NewH3e7upNdx\",\"number-0\":\"1984984385\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option b\",\"_2_checkbox-0\":\"3\",\"_sipForTypo3Vars\":\"5da0413826c27\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5da041373e339\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.204','','Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:69.0) Gecko/20100101 Firefox/69.0',1007,0,3,'d88b27f3bb21b477e05de07b77d428b9','2019-10-11 08:45:47'),(199,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"eQzj8G0N07IG9sRQgqMV5jYqiMV8MWOi\",\"number-0\":\"1173820870\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option b\",\"_2_checkbox-0\":\"3\",\"_sipForTypo3Vars\":\"5da0413826c27\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5da041373e339\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.204','','Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:69.0) Gecko/20100101 Firefox/69.0',1007,0,3,'d88b27f3bb21b477e05de07b77d428b9','2019-10-11 08:45:51'),(200,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"34355e892a06332849334a06f40a38ea\",\"_h_checkbox-127\":\"\",\"text-127\":\"BpcofllhE1GbUlMdMv2qHEGV2eDmTdTS\",\"number-127\":\"2144867466\",\"date-127\":\"01.01.2188\",\"datetime-127\":\"02.02.2188 01:08\",\"decimal-127\":\"12.84\",\"enum-127\":\"first option\",\"radio-127\":\"option b\",\"_2_checkbox-127\":\"3\",\"_sipForTypo3Vars\":\"5da041403f0e4\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"127\",\"s\":\"5da0413f20c01\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=127\"}','192.168.133.204','','Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:69.0) Gecko/20100101 Firefox/69.0',1007,127,1,'d88b27f3bb21b477e05de07b77d428b9','2019-10-11 08:45:53'),(201,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"RvyMwGQr9PqtZaUrvzxY23xoNXqikcmJ\",\"number-0\":\"1668155649\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option b\",\"_2_checkbox-0\":\"3\",\"_sipForTypo3Vars\":\"5da04162efe93\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5da04162235fd\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.204','','Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:69.0) Gecko/20100101 Firefox/69.0',1007,0,3,'98b8acdf96e68b8b13b96cdc5d4c8720','2019-10-11 08:46:30'),(202,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"hzLavsGbXOaYkcQurlmdjlHpCrddqGy2\",\"number-0\":\"1382261811\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option b\",\"_2_checkbox-0\":\"3\",\"_sipForTypo3Vars\":\"5da04162efe93\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5da04162235fd\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.204','','Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:69.0) Gecko/20100101 Firefox/69.0',1007,0,3,'98b8acdf96e68b8b13b96cdc5d4c8720','2019-10-11 08:46:33'),(203,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"20b00ae50b75413ffe03b1b1e7f2f9b4\",\"_h_checkbox-129\":\"\",\"text-129\":\"nhpF9cCHZrOtyfetxemVAvQGXgHWABou\",\"number-129\":\"2072194036\",\"date-129\":\"01.01.2188\",\"datetime-129\":\"02.02.2188 01:08\",\"decimal-129\":\"12.84\",\"enum-129\":\"first option\",\"radio-129\":\"option b\",\"_2_checkbox-129\":\"3\",\"_sipForTypo3Vars\":\"5da0416af04cb\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"129\",\"s\":\"5da04169d29d2\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=129\"}','192.168.133.204','','Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:69.0) Gecko/20100101 Firefox/69.0',1007,129,1,'98b8acdf96e68b8b13b96cdc5d4c8720','2019-10-11 08:46:36'),(204,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"PpHXdc3EDLzhJBMrCjgdt4jSMZokZEhi\",\"number-0\":\"434544585\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option b\",\"_2_checkbox-0\":\"3\",\"_sipForTypo3Vars\":\"5da041a827cfd\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5da041a73b818\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.204','','Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:69.0) Gecko/20100101 Firefox/69.0',1007,0,3,'57e06ae27a7cc7d7be816549e4cc4a84','2019-10-11 08:47:39'),(205,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"h3U2CJZXa5VYnd6nCNk0FA4uPVAXCH6o\",\"number-0\":\"966578920\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option b\",\"_2_checkbox-0\":\"3\",\"_sipForTypo3Vars\":\"5da041a827cfd\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5da041a73b818\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.204','','Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:69.0) Gecko/20100101 Firefox/69.0',1007,0,3,'57e06ae27a7cc7d7be816549e4cc4a84','2019-10-11 08:47:43'),(206,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"cee2102cbe063ec5d18e302e81804378\",\"_h_checkbox-131\":\"\",\"text-131\":\"KesibheKX5k3nLvqGWLis7v9RyWKP99o\",\"number-131\":\"1267085260\",\"date-131\":\"01.01.2188\",\"datetime-131\":\"02.02.2188 01:08\",\"decimal-131\":\"12.84\",\"enum-131\":\"first option\",\"radio-131\":\"option b\",\"_2_checkbox-131\":\"3\",\"_sipForTypo3Vars\":\"5da041b08ec50\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"131\",\"s\":\"5da041af64c11\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=131\"}','192.168.133.204','','Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:69.0) Gecko/20100101 Firefox/69.0',1007,131,1,'57e06ae27a7cc7d7be816549e4cc4a84','2019-10-11 08:47:45'),(207,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"DUacDkpfsBvCsOqjfsG43tNTGJPWnhKI\",\"number-0\":\"118317995\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option b\",\"_2_checkbox-0\":\"3\",\"_sipForTypo3Vars\":\"5da041d031bf2\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5da041cf1f4d4\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.204','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36',1007,0,3,'d9be8a332d51e0bb4dd2fce2504e317d','2019-10-11 08:48:19'),(208,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"HgCwHWdIOiTziHIAws61RyrfXtIt755m\",\"number-0\":\"1728308942\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option b\",\"_2_checkbox-0\":\"3\",\"_sipForTypo3Vars\":\"5da041d031bf2\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5da041cf1f4d4\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.204','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36',1007,0,3,'d9be8a332d51e0bb4dd2fce2504e317d','2019-10-11 08:48:23'),(209,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"28ec5e120841c7aa42b6001d16d76bbb\",\"_h_checkbox-133\":\"\",\"text-133\":\"89PeUopoP69hE82yRKS61XcRo7fLKbiO\",\"number-133\":\"748093838\",\"date-133\":\"01.01.2188\",\"datetime-133\":\"02.02.2188 01:08\",\"decimal-133\":\"12.84\",\"enum-133\":\"first option\",\"radio-133\":\"option b\",\"_2_checkbox-133\":\"3\",\"_sipForTypo3Vars\":\"5da041d90bc73\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"133\",\"s\":\"5da041d7deccc\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=133\"}','192.168.133.204','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36',1007,133,1,'d9be8a332d51e0bb4dd2fce2504e317d','2019-10-11 08:48:26'),(210,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"xyyM0JGKf6e4BMCKts5cvrBvpgrBshpm\",\"number-0\":\"2082920385\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option b\",\"_2_checkbox-0\":\"3\",\"_sipForTypo3Vars\":\"5da045128f656\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5da0451185bf4\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.204','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36',1007,0,3,'f8ec799c45ffa6877b55dc8c8d8c47fe','2019-10-11 09:02:14'),(211,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"w6ZJuT4UVkcyUNxcqDDLoFQJDKmIOj2U\",\"number-0\":\"2124086078\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option b\",\"_2_checkbox-0\":\"3\",\"_sipForTypo3Vars\":\"5da045128f656\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5da0451185bf4\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.204','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36',1007,0,3,'f8ec799c45ffa6877b55dc8c8d8c47fe','2019-10-11 09:02:19'),(212,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"fb0dc3dac746641c7aa2fb39bf4d2d93\",\"_h_checkbox-135\":\"\",\"text-135\":\"tG75xkJwMo8n58FWFbxiXQ9KOsVOMU6n\",\"number-135\":\"242673188\",\"date-135\":\"01.01.2188\",\"datetime-135\":\"02.02.2188 01:08\",\"decimal-135\":\"12.84\",\"enum-135\":\"first option\",\"radio-135\":\"option b\",\"_2_checkbox-135\":\"3\",\"_sipForTypo3Vars\":\"5da0451cb09bc\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"135\",\"s\":\"5da0451b40a0e\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=135\"}','192.168.133.204','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36',1007,135,1,'f8ec799c45ffa6877b55dc8c8d8c47fe','2019-10-11 09:02:21'),(213,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"NXa3R0fAe3E4MstvKI7n9GXsALoyWasg\",\"number-0\":\"724976004\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option b\",\"_2_checkbox-0\":\"3\",\"_sipForTypo3Vars\":\"5da07140ade4f\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5da0713fa52d3\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.204','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36',1007,0,3,'4c1a2f1d5afacbc9e1c6f47769f89e49','2019-10-11 12:10:44'),(214,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"gHl6gwpb2LKvo8p75lxEtd9IzjOHl74A\",\"number-0\":\"121353190\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option b\",\"_2_checkbox-0\":\"3\",\"_sipForTypo3Vars\":\"5da07140ade4f\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5da0713fa52d3\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.204','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36',1007,0,3,'4c1a2f1d5afacbc9e1c6f47769f89e49','2019-10-11 12:10:48'),(215,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"e8b5ba357d4d08367d075697c3bcedcf\",\"_h_checkbox-137\":\"\",\"text-137\":\"q8vAJhFUBs9UZH9XNFL0t581HneEEhSi\",\"number-137\":\"602177163\",\"date-137\":\"01.01.2188\",\"datetime-137\":\"02.02.2188 01:08\",\"decimal-137\":\"12.84\",\"enum-137\":\"first option\",\"radio-137\":\"option b\",\"_2_checkbox-137\":\"3\",\"_sipForTypo3Vars\":\"5da0714a59ca8\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"137\",\"s\":\"5da0714900348\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=137\"}','192.168.133.204','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36',1007,137,1,'4c1a2f1d5afacbc9e1c6f47769f89e49','2019-10-11 12:10:51'),(216,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"mEDiWmmwjkX3jEtVna8aZZP3nOe0Htej\",\"number-0\":\"1648438537\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option b\",\"_2_checkbox-0\":\"3\",\"_sipForTypo3Vars\":\"5da071778ca27\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5da071767956c\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.204','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36',1007,0,3,'b9f017e3cf77cce3dab562f7525ebcb5','2019-10-11 12:11:39'),(217,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"IuH6SQJbxKuMQoMdvYrKW1Lgi2Wxnt1g\",\"number-0\":\"1623227727\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option b\",\"_2_checkbox-0\":\"3\",\"_sipForTypo3Vars\":\"5da071778ca27\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5da071767956c\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.204','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36',1007,0,3,'b9f017e3cf77cce3dab562f7525ebcb5','2019-10-11 12:11:44'),(218,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"c515e6d7c33eaf4c4e55f610c2439490\",\"_h_checkbox-139\":\"\",\"text-139\":\"m97qKKx1G5YadlIOZ3O6IoRy0zI3LtcK\",\"number-139\":\"1316517234\",\"date-139\":\"01.01.2188\",\"datetime-139\":\"02.02.2188 01:08\",\"decimal-139\":\"12.84\",\"enum-139\":\"first option\",\"radio-139\":\"option b\",\"_2_checkbox-139\":\"3\",\"_sipForTypo3Vars\":\"5da07181c8453\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"139\",\"s\":\"5da07180451dc\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=139\"}','192.168.133.204','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36',1007,139,1,'b9f017e3cf77cce3dab562f7525ebcb5','2019-10-11 12:11:47'),(219,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"FXGknBTcW6oNkB0n48PjI7CXSnCSkncG\",\"number-0\":\"2120724732\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option b\",\"_2_checkbox-0\":\"3\",\"_sipForTypo3Vars\":\"5da072b54f217\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5da072b3d9efd\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.204','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36',1007,0,3,'5b3ec6a522856ab3ac663d145ed26f5e','2019-10-11 12:16:57'),(220,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"BpsU4OJlVVOPxR6T9KI1axg8PfI1nscy\",\"number-0\":\"1622571132\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option b\",\"_2_checkbox-0\":\"3\",\"_sipForTypo3Vars\":\"5da072b54f217\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5da072b3d9efd\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.204','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36',1007,0,3,'5b3ec6a522856ab3ac663d145ed26f5e','2019-10-11 12:17:03'),(221,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"3aafeaac8ae39ba7eaae8b025f3830fc\",\"_h_checkbox-141\":\"\",\"text-141\":\"kdcpXkj9Xg6A842IJcQKe735fOV69xfl\",\"number-141\":\"619373264\",\"date-141\":\"01.01.2188\",\"datetime-141\":\"02.02.2188 01:08\",\"decimal-141\":\"12.84\",\"enum-141\":\"first option\",\"radio-141\":\"option b\",\"_2_checkbox-141\":\"3\",\"_sipForTypo3Vars\":\"5da072c0f3c68\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"141\",\"s\":\"5da072bf782c7\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=141\"}','192.168.133.204','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36',1007,141,1,'5b3ec6a522856ab3ac663d145ed26f5e','2019-10-11 12:17:06'),(222,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"MzHejOk1A7oCcru5ZrteCfzbxwCMiQt0\",\"number-0\":\"865819393\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option b\",\"_2_checkbox-0\":\"3\",\"_sipForTypo3Vars\":\"5da078ad102d5\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5da078abbbd6e\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.204','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36',1007,0,3,'572a7249daba4b9a1c919f4d95c81768','2019-10-11 12:42:25'),(223,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"r9urZY2hrJMNGQaZETSPXIoeLjp5flZL\",\"number-0\":\"1065909087\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option b\",\"_2_checkbox-0\":\"3\",\"_sipForTypo3Vars\":\"5da07a1e83ed3\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5da07a1d7a1a8\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.204','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36',1007,0,3,'8687e8f418c56abd3a8d082d3e5c83b4','2019-10-11 12:48:34'),(224,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"6pFFqs4IvwgO4a096IaIUMBBMwrSZrdd\",\"number-0\":\"6335278\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option b\",\"_2_checkbox-0\":\"3\",\"_sipForTypo3Vars\":\"5da07a1e83ed3\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5da07a1d7a1a8\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.204','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36',1007,0,3,'8687e8f418c56abd3a8d082d3e5c83b4','2019-10-11 12:48:39'),(225,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"807a8e48afd1e72725ec86a05d6a16bd\",\"_h_checkbox-144\":\"\",\"text-144\":\"7ESrRN9YYW3nKSfGmKquh2fyLISOBwLH\",\"number-144\":\"1493407724\",\"date-144\":\"01.01.2188\",\"datetime-144\":\"02.02.2188 01:08\",\"decimal-144\":\"12.84\",\"enum-144\":\"first option\",\"radio-144\":\"option b\",\"_2_checkbox-144\":\"3\",\"_sipForTypo3Vars\":\"5da07a290b5e4\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"144\",\"s\":\"5da07a27ae0eb\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=144\"}','192.168.133.204','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36',1007,144,1,'8687e8f418c56abd3a8d082d3e5c83b4','2019-10-11 12:48:42'),(226,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"scvDzHIyj3VmJ99cEUaPWf4IpLMIhi3T\",\"number-0\":\"757725380\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option b\",\"_2_checkbox-0\":\"3\",\"_sipForTypo3Vars\":\"5da08128321e5\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5da08127279e4\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.204','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36',1007,0,3,'2c944174dcc6ef66e07473696721f058','2019-10-11 13:18:36'),(227,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"Kz0TqNyj2udj1uPH1SkszP0TjKHEeIp5\",\"number-0\":\"1970043800\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option b\",\"_2_checkbox-0\":\"3\",\"_sipForTypo3Vars\":\"5da08128321e5\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5da08127279e4\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.204','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36',1007,0,3,'2c944174dcc6ef66e07473696721f058','2019-10-11 13:18:42'),(228,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"8362159a08b071d1d22010cf0a8bc896\",\"_h_checkbox-146\":\"\",\"text-146\":\"EOqANrrnXXyR8E11OK6ER8iCzoSnDo9r\",\"number-146\":\"1038228665\",\"date-146\":\"01.01.2188\",\"datetime-146\":\"02.02.2188 01:08\",\"decimal-146\":\"12.84\",\"enum-146\":\"first option\",\"radio-146\":\"option b\",\"_2_checkbox-146\":\"3\",\"_sipForTypo3Vars\":\"5da081335f9e2\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"146\",\"s\":\"5da08132177cb\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=146\"}','192.168.133.204','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36',1007,146,1,'2c944174dcc6ef66e07473696721f058','2019-10-11 13:18:45'),(229,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"F9FDwqxYM9HN2yvCxKQWV7mQ6EMdzbJY\",\"number-0\":\"746674285\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option b\",\"_2_checkbox-0\":\"3\",\"_sipForTypo3Vars\":\"5da08553de549\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5da08552dd6cf\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.204','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36',1007,0,3,'1357cbaa01a88d41a7b6188e0592f03a','2019-10-11 13:36:23'),(230,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"cIcSyZcLgi89lKIStz8ntHOU2x2ODEv4\",\"number-0\":\"930476576\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option b\",\"_2_checkbox-0\":\"3\",\"_sipForTypo3Vars\":\"5da08553de549\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5da08552dd6cf\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.204','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36',1007,0,3,'1357cbaa01a88d41a7b6188e0592f03a','2019-10-11 13:36:28'),(231,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"ii6e4ZkmNPe9u6Pp2t40unNPlfEw0eNW\",\"number-0\":\"929594117\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option b\",\"_2_checkbox-0\":\"3\",\"_sipForTypo3Vars\":\"5da0870fc8a28\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5da0870e9c277\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.204','','Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:69.0) Gecko/20100101 Firefox/69.0',1007,0,3,'563552509d0e9858e4c695fb8839f5d1','2019-10-11 13:43:48'),(232,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"0xRjxdHWGC6hm3Jow9OcfwRuSw2fMq3o\",\"number-0\":\"1584155120\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option b\",\"_2_checkbox-0\":\"3\",\"_sipForTypo3Vars\":\"5da0870fc8a28\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5da0870e9c277\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.204','','Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:69.0) Gecko/20100101 Firefox/69.0',1007,0,3,'563552509d0e9858e4c695fb8839f5d1','2019-10-11 13:43:53'),(233,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"c4c8f6db42a680d1bfa9ae1bbaa22523\",\"_h_checkbox-150\":\"\",\"text-150\":\"IXWBLjjSaPYGwHq6y6b2t7wCApAIjmZp\",\"number-150\":\"905962891\",\"date-150\":\"01.01.2188\",\"datetime-150\":\"02.02.2188 01:08\",\"decimal-150\":\"12.84\",\"enum-150\":\"first option\",\"radio-150\":\"option b\",\"_2_checkbox-150\":\"3\",\"_sipForTypo3Vars\":\"5da0871aaaaf6\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"150\",\"s\":\"5da087193bfcb\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=150\"}','192.168.133.204','','Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:69.0) Gecko/20100101 Firefox/69.0',1007,150,1,'563552509d0e9858e4c695fb8839f5d1','2019-10-11 13:43:56'),(234,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"gdYYUH7fUUqX5mdnQUcINqEEtadv2C2E\",\"number-0\":\"923767833\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option b\",\"_2_checkbox-0\":\"3\",\"_sipForTypo3Vars\":\"5da087343f360\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5da0873306446\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.204','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36',1007,0,3,'aaa650a04496fa091cdf45e78f344798','2019-10-11 13:44:24'),(235,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"p66Hwg1KkHyZbtufgZiTnKgRyigmYylR\",\"number-0\":\"1682968079\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option b\",\"_2_checkbox-0\":\"3\",\"_sipForTypo3Vars\":\"5da087343f360\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5da0873306446\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.204','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36',1007,0,3,'aaa650a04496fa091cdf45e78f344798','2019-10-11 13:44:29'),(236,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"ccdb5ccc336349a54d9bf002732d7748\",\"_h_checkbox-152\":\"\",\"text-152\":\"onTpBoLHmp3xUD7di61Cem97yiKvGOFz\",\"number-152\":\"594818693\",\"date-152\":\"01.01.2188\",\"datetime-152\":\"02.02.2188 01:08\",\"decimal-152\":\"12.84\",\"enum-152\":\"first option\",\"radio-152\":\"option b\",\"_2_checkbox-152\":\"3\",\"_sipForTypo3Vars\":\"5da0873e39a71\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"152\",\"s\":\"5da0873d15d50\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=152\"}','192.168.133.204','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36',1007,152,1,'aaa650a04496fa091cdf45e78f344798','2019-10-11 13:44:31'),(237,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"JU8mtufjY0pUpvprkU9O1FQ8dEG2YCxw\",\"number-0\":\"669384578\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option b\",\"_2_checkbox-0\":\"3\",\"_sipForTypo3Vars\":\"5da08c0fbee58\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5da08c0e93d15\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.204','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36',1007,0,3,'ef378e5f276d4c3d10bf77c82d37dd53','2019-10-11 14:05:07'),(238,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"ELobeaS4MNq18pS6lCTgGpUKKTE0Bvra\",\"number-0\":\"2105044469\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option b\",\"_2_checkbox-0\":\"3\",\"_sipForTypo3Vars\":\"5da08c0fbee58\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5da08c0e93d15\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.204','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36',1007,0,3,'ef378e5f276d4c3d10bf77c82d37dd53','2019-10-11 14:05:13'),(239,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"93a12036fa9a20778ddb345f66cb8da0\",\"_h_checkbox-154\":\"\",\"text-154\":\"rLZWFrM3VkYoJhGrZ86RUhyZTxB2k5Lj\",\"number-154\":\"51748582\",\"date-154\":\"01.01.2188\",\"datetime-154\":\"02.02.2188 01:08\",\"decimal-154\":\"12.84\",\"enum-154\":\"first option\",\"radio-154\":\"option b\",\"_2_checkbox-154\":\"3\",\"_sipForTypo3Vars\":\"5da08c1a961c0\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"154\",\"s\":\"5da08c19522b6\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=154\"}','192.168.133.204','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36',1007,154,1,'ef378e5f276d4c3d10bf77c82d37dd53','2019-10-11 14:05:16'),(240,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"4YRTERENpGOOXN63oSc16T2lOhgeyYSR\",\"number-0\":\"462008079\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option b\",\"_2_checkbox-0\":\"3\",\"_sipForTypo3Vars\":\"5da08c2c98e9b\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5da08c2b7348f\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.204','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36',1007,0,3,'b7bb40a55db83f438a8e2d119ae76b91','2019-10-11 14:05:36'),(241,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"LMpUQrUa0SxZRuwt5gSwznAW0mEnWOtN\",\"number-0\":\"1283447956\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option b\",\"_2_checkbox-0\":\"3\",\"_sipForTypo3Vars\":\"5da08c2c98e9b\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5da08c2b7348f\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.204','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36',1007,0,3,'b7bb40a55db83f438a8e2d119ae76b91','2019-10-11 14:05:41'),(242,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"5c1d60a4976a43cf29ca5caf1b864e83\",\"_h_checkbox-156\":\"\",\"text-156\":\"BZt4a53knXcauC9blLyiAhgrkqeDMGnZ\",\"number-156\":\"1298592424\",\"date-156\":\"01.01.2188\",\"datetime-156\":\"02.02.2188 01:08\",\"decimal-156\":\"12.84\",\"enum-156\":\"first option\",\"radio-156\":\"option b\",\"_2_checkbox-156\":\"3\",\"_sipForTypo3Vars\":\"5da08c368c9f5\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"156\",\"s\":\"5da08c3544e95\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=156\"}','192.168.133.204','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36',1007,156,1,'b7bb40a55db83f438a8e2d119ae76b91','2019-10-11 14:05:44'),(243,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"krfTilgyulNpap8MAHn795hUoiYFkaai\",\"number-0\":\"1648488143\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option b\",\"_2_checkbox-0\":\"3\",\"_sipForTypo3Vars\":\"5daff2d2b6368\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5daff2d1d3066\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.70 Safari/537.36',1007,0,3,'f62bafbd6ac32bdf3b21696c20057cac','2019-10-23 06:27:34'),(244,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"Nt6c0g9MqvGulZE1MmEVo2TdqBMeUzcD\",\"number-0\":\"744205343\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option b\",\"_2_checkbox-0\":\"3\",\"_sipForTypo3Vars\":\"5daff2d2b6368\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5daff2d1d3066\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.70 Safari/537.36',1007,0,3,'f62bafbd6ac32bdf3b21696c20057cac','2019-10-23 06:27:38'),(245,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"4dcb10ce1aaadf7b11fcb01fad78f4c8\",\"_h_checkbox-158\":\"\",\"text-158\":\"Ln9Sw5DBZNaojolytCxPAZXrKbAr07pO\",\"number-158\":\"672379075\",\"date-158\":\"01.01.2188\",\"datetime-158\":\"02.02.2188 01:08\",\"decimal-158\":\"12.84\",\"enum-158\":\"first option\",\"radio-158\":\"option b\",\"_2_checkbox-158\":\"3\",\"_sipForTypo3Vars\":\"5daff2dbd08c8\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"158\",\"s\":\"5daff2da6f293\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=158\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.70 Safari/537.36',1007,158,1,'f62bafbd6ac32bdf3b21696c20057cac','2019-10-23 06:27:40'),(246,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"qzgvnalhhCrQil0xjJuoOEx2jusOwoIJ\",\"number-0\":\"1317307977\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option b\",\"_2_checkbox-0\":\"3\",\"_sipForTypo3Vars\":\"5daff2f82540c\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5daff2f73306a\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.70 Safari/537.36',1007,0,3,'616cfda8c989751efded8920009f64e5','2019-10-23 06:28:11'),(247,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"wKQ6myQ2vubVkCT7j4CeR1Xk3Pg8WlQd\",\"number-0\":\"1108421876\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option b\",\"_2_checkbox-0\":\"3\",\"_sipForTypo3Vars\":\"5daff2f82540c\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5daff2f73306a\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.70 Safari/537.36',1007,0,3,'616cfda8c989751efded8920009f64e5','2019-10-23 06:28:15'),(248,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"17396f31c928121233b74119b8ecbab4\",\"_h_checkbox-160\":\"\",\"text-160\":\"KnMOtlaRmSw4gfbAPjnJyjKq1c2p3hs1\",\"number-160\":\"845410772\",\"date-160\":\"01.01.2188\",\"datetime-160\":\"02.02.2188 01:08\",\"decimal-160\":\"12.84\",\"enum-160\":\"first option\",\"radio-160\":\"option b\",\"_2_checkbox-160\":\"3\",\"_sipForTypo3Vars\":\"5daff3012e40b\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"160\",\"s\":\"5daff2ff707fa\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=160\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.70 Safari/537.36',1007,160,1,'616cfda8c989751efded8920009f64e5','2019-10-23 06:28:18'),(249,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"NBffcBuF91aNtxETzYijmvRKSqspm719\",\"number-0\":\"1764782954\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option b\",\"_2_checkbox-0\":\"3\",\"_sipForTypo3Vars\":\"5daff33bdbc0e\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5daff33b1b81a\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,0,3,'15d4c28c3feb9d348373677a86b60bcd','2019-10-23 06:29:18'),(250,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"0NGSshcZbhn3EcR6fP4ddUQZL2zvLRx1\",\"number-0\":\"1086068752\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option b\",\"_2_checkbox-0\":\"3\",\"_sipForTypo3Vars\":\"5daff33bdbc0e\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5daff33b1b81a\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,0,3,'15d4c28c3feb9d348373677a86b60bcd','2019-10-23 06:29:21'),(251,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"oO0fef1Cs2gnOyVDyR93ZOnLWjRyqbnq\",\"number-0\":\"1076811326\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option b\",\"_2_checkbox-0\":\"3\",\"_sipForTypo3Vars\":\"5daff377a95fc\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5daff376c5546\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,0,3,'b830d72f09b4928996c7ec062c36b703','2019-10-23 06:30:18'),(252,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"3OjWNynRWgBERCjQFsPJySNJXTIAkvDD\",\"number-0\":\"526086711\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option b\",\"_2_checkbox-0\":\"3\",\"_sipForTypo3Vars\":\"5daff377a95fc\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5daff376c5546\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,0,3,'b830d72f09b4928996c7ec062c36b703','2019-10-23 06:30:21'),(253,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"6305635d89079ed2dc6a9ca5936edbaf\",\"_h_checkbox-164\":\"\",\"text-164\":\"8c36EkPnsSKrDqGjLBRtvdRy9Dnm2fuP\",\"number-164\":\"1621513482\",\"date-164\":\"01.01.2188\",\"datetime-164\":\"02.02.2188 01:08\",\"decimal-164\":\"12.84\",\"enum-164\":\"first option\",\"radio-164\":\"option b\",\"_2_checkbox-164\":\"3\",\"_sipForTypo3Vars\":\"5daff37de48b8\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"164\",\"s\":\"5daff37d28a4f\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=164\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,164,1,'b830d72f09b4928996c7ec062c36b703','2019-10-23 06:30:22'),(254,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"enabled-0\":\"yes\",\"dynamicUpdate-0\":\"no\",\"mode-0\":\"show\",\"class-0\":\"container\",\"_h_subrecordOption-0\":\"\",\"encode-0\":\"specialchar\",\"checkType-0\":\"auto\",\"labelAlign-0\":\"default\",\"_h_rowLabelInputNote-0\":\"\",\"feIdContainer-0\":\"\",\"name-0\":\"pill1\",\"label-0\":\"pill1\",\"modeSql-0\":\"\",\"type-0\":\"pill\",\"parameterLanguageA-0\":\"\",\"parameterLanguageB-0\":\"\",\"parameterLanguageC-0\":\"\",\"parameterLanguageD-0\":\"\",\"checkPattern-0\":\"\",\"ord-0\":\"90\",\"adminNote-0\":\"\",\"size-0\":\"\",\"bsLabelColumns-0\":\"\",\"bsInputColumns-0\":\"\",\"bsNoteColumns-0\":\"\",\"_0_rowLabelInputNote-0\":\"row\",\"_1_rowLabelInputNote-0\":\"label\",\"_2_rowLabelInputNote-0\":\"\\/label\",\"_3_rowLabelInputNote-0\":\"input\",\"_4_rowLabelInputNote-0\":\"\\/input\",\"_5_rowLabelInputNote-0\":\"note\",\"_6_rowLabelInputNote-0\":\"\\/note\",\"_7_rowLabelInputNote-0\":\"\\/row\",\"maxLength-0\":\"\",\"note-0\":\"\",\"tooltip-0\":\"\",\"placeholder-0\":\"\",\"value-0\":\"\",\"sql1-0\":\"\",\"parameter-0\":\"\",\"_sipForTypo3Vars\":\"5daff470694b5\"}','{\"__dbIndexData\":\"1\",\"form\":\"formElement\",\"formId\":\"1007\",\"r\":\"0\",\"s\":\"5daff470647d0\",\"urlparam\":\"__dbIndexData=1&form=formElement&formId=1007&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:69.0) Gecko/20100101 Firefox/69.0',2,0,1,'83228dfc9b11c970e5af54a8d48eca25','2019-10-23 06:35:04'),(255,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"c2187205bc856ebf75ba416c6083df66\",\"enabled-503\":\"yes\",\"dynamicUpdate-503\":\"no\",\"mode-503\":\"show\",\"class-503\":\"native\",\"_h_subrecordOption-503\":\"\",\"encode-503\":\"specialchar\",\"checkType-503\":\"auto\",\"labelAlign-503\":\"default\",\"_h_rowLabelInputNote-503\":\"\",\"feIdContainer-503\":\"504\",\"name-503\":\"checkbox\",\"label-503\":\"checkbox\",\"modeSql-503\":\"\",\"type-503\":\"checkbox\",\"parameterLanguageA-503\":\"\",\"parameterLanguageB-503\":\"\",\"parameterLanguageC-503\":\"\",\"parameterLanguageD-503\":\"\",\"checkPattern-503\":\"\",\"ord-503\":\"80\",\"adminNote-503\":\"\",\"size-503\":\"\",\"bsLabelColumns-503\":\"\",\"bsInputColumns-503\":\"\",\"bsNoteColumns-503\":\"\",\"_0_rowLabelInputNote-503\":\"row\",\"_1_rowLabelInputNote-503\":\"label\",\"_2_rowLabelInputNote-503\":\"\\/label\",\"_3_rowLabelInputNote-503\":\"input\",\"_4_rowLabelInputNote-503\":\"\\/input\",\"_5_rowLabelInputNote-503\":\"note\",\"_6_rowLabelInputNote-503\":\"\\/note\",\"_7_rowLabelInputNote-503\":\"\\/row\",\"maxLength-503\":\"\",\"note-503\":\"\",\"tooltip-503\":\"\",\"placeholder-503\":\"\",\"value-503\":\"\",\"sql1-503\":\"\",\"parameter-503\":\"\",\"_sipForTypo3Vars\":\"5daff470694b5\"}','{\"__dbIndexData\":\"1\",\"form\":\"formElement\",\"formId\":\"1007\",\"r\":\"503\",\"s\":\"5daff47065f9a\",\"urlparam\":\"__dbIndexData=1&form=formElement&formId=1007&r=503\"}','192.168.133.203','','Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:69.0) Gecko/20100101 Firefox/69.0',2,503,1,'83228dfc9b11c970e5af54a8d48eca25','2019-10-23 06:35:46'),(256,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d1104000445192245decca699f26850a\",\"enabled-502\":\"yes\",\"dynamicUpdate-502\":\"no\",\"mode-502\":\"required\",\"class-502\":\"native\",\"_h_subrecordOption-502\":\"\",\"encode-502\":\"specialchar\",\"checkType-502\":\"auto\",\"labelAlign-502\":\"default\",\"_h_rowLabelInputNote-502\":\"\",\"feIdContainer-502\":\"504\",\"name-502\":\"radio\",\"label-502\":\"radio\",\"modeSql-502\":\"\",\"type-502\":\"radio\",\"parameterLanguageA-502\":\"\",\"parameterLanguageB-502\":\"\",\"parameterLanguageC-502\":\"\",\"parameterLanguageD-502\":\"\",\"checkPattern-502\":\"\",\"ord-502\":\"70\",\"adminNote-502\":\"\",\"size-502\":\"\",\"bsLabelColumns-502\":\"\",\"bsInputColumns-502\":\"\",\"bsNoteColumns-502\":\"\",\"_0_rowLabelInputNote-502\":\"row\",\"_1_rowLabelInputNote-502\":\"label\",\"_2_rowLabelInputNote-502\":\"\\/label\",\"_3_rowLabelInputNote-502\":\"input\",\"_4_rowLabelInputNote-502\":\"\\/input\",\"_5_rowLabelInputNote-502\":\"note\",\"_6_rowLabelInputNote-502\":\"\\/note\",\"_7_rowLabelInputNote-502\":\"\\/row\",\"maxLength-502\":\"\",\"note-502\":\"\",\"tooltip-502\":\"\",\"placeholder-502\":\"\",\"value-502\":\"\",\"sql1-502\":\"\",\"parameter-502\":\"\",\"_sipForTypo3Vars\":\"5daff470694b5\"}','{\"__dbIndexData\":\"1\",\"form\":\"formElement\",\"formId\":\"1007\",\"r\":\"502\",\"s\":\"5daff47065e99\",\"urlparam\":\"__dbIndexData=1&form=formElement&formId=1007&r=502\"}','192.168.133.203','','Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:69.0) Gecko/20100101 Firefox/69.0',2,502,1,'83228dfc9b11c970e5af54a8d48eca25','2019-10-23 06:36:00'),(257,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"s6y2RaWP43VQufGH8mAsY5vkB2KYh6Bm\",\"number-0\":\"415579295\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option b\",\"_2_checkbox-0\":\"3\",\"_sipForTypo3Vars\":\"5daff52017005\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5daff51f3acc3\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:69.0) Gecko/20100101 Firefox/69.0',1007,0,3,'faeb6142893aa9c8c47f375994b2fd0c','2019-10-23 06:37:22'),(258,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"awduKM9DQLcZODEGxAnz46ND4PLG2uVR\",\"number-0\":\"1208151822\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option b\",\"_2_checkbox-0\":\"3\",\"_sipForTypo3Vars\":\"5daff52017005\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5daff51f3acc3\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:69.0) Gecko/20100101 Firefox/69.0',1007,0,3,'faeb6142893aa9c8c47f375994b2fd0c','2019-10-23 06:37:26'),(259,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d856a0bab03c53822b6edf29fd6535d9\",\"_h_checkbox-166\":\"\",\"text-166\":\"IyIufWAfqyy71MOf2ffXuk0EVvwh6KMZ\",\"number-166\":\"1365008146\",\"date-166\":\"01.01.2188\",\"datetime-166\":\"02.02.2188 01:08\",\"decimal-166\":\"12.84\",\"enum-166\":\"first option\",\"radio-166\":\"option b\",\"_2_checkbox-166\":\"3\",\"_sipForTypo3Vars\":\"5daff527acb18\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"166\",\"s\":\"5daff526aeb77\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=166\"}','192.168.133.203','','Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:69.0) Gecko/20100101 Firefox/69.0',1007,166,1,'faeb6142893aa9c8c47f375994b2fd0c','2019-10-23 06:37:28'),(260,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"317a2aefe00ab4eaaf1c62c09f3c8e81\",\"enabled-501\":\"yes\",\"dynamicUpdate-501\":\"no\",\"mode-501\":\"required\",\"class-501\":\"native\",\"_h_subrecordOption-501\":\"\",\"encode-501\":\"specialchar\",\"checkType-501\":\"auto\",\"labelAlign-501\":\"default\",\"_h_rowLabelInputNote-501\":\"\",\"feIdContainer-501\":\"504\",\"name-501\":\"enum\",\"label-501\":\"enum\",\"modeSql-501\":\"\",\"type-501\":\"select\",\"parameterLanguageA-501\":\"\",\"parameterLanguageB-501\":\"\",\"parameterLanguageC-501\":\"\",\"parameterLanguageD-501\":\"\",\"checkPattern-501\":\"\",\"ord-501\":\"60\",\"adminNote-501\":\"\",\"size-501\":\"\",\"bsLabelColumns-501\":\"\",\"bsInputColumns-501\":\"\",\"bsNoteColumns-501\":\"\",\"_0_rowLabelInputNote-501\":\"row\",\"_1_rowLabelInputNote-501\":\"label\",\"_2_rowLabelInputNote-501\":\"\\/label\",\"_3_rowLabelInputNote-501\":\"input\",\"_4_rowLabelInputNote-501\":\"\\/input\",\"_5_rowLabelInputNote-501\":\"note\",\"_6_rowLabelInputNote-501\":\"\\/note\",\"_7_rowLabelInputNote-501\":\"\\/row\",\"maxLength-501\":\"\",\"note-501\":\"\",\"tooltip-501\":\"\",\"placeholder-501\":\"\",\"value-501\":\"\",\"sql1-501\":\"\",\"parameter-501\":\"\",\"_sipForTypo3Vars\":\"5daff470694b5\"}','{\"__dbIndexData\":\"1\",\"form\":\"formElement\",\"formId\":\"1007\",\"r\":\"501\",\"s\":\"5daff47065d21\",\"urlparam\":\"__dbIndexData=1&form=formElement&formId=1007&r=501\"}','192.168.133.203','','Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:69.0) Gecko/20100101 Firefox/69.0',2,501,1,'83228dfc9b11c970e5af54a8d48eca25','2019-10-23 06:38:00'),(261,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"73d168e170fecd64f9e91c34f540c6b2\",\"enabled-500\":\"yes\",\"dynamicUpdate-500\":\"no\",\"mode-500\":\"required\",\"class-500\":\"native\",\"_h_subrecordOption-500\":\"\",\"encode-500\":\"specialchar\",\"checkType-500\":\"numerical\",\"labelAlign-500\":\"default\",\"_h_rowLabelInputNote-500\":\"\",\"feIdContainer-500\":\"504\",\"name-500\":\"decimal\",\"label-500\":\"decimal\",\"modeSql-500\":\"\",\"type-500\":\"text\",\"parameterLanguageA-500\":\"\",\"parameterLanguageB-500\":\"\",\"parameterLanguageC-500\":\"\",\"parameterLanguageD-500\":\"\",\"checkPattern-500\":\"\",\"ord-500\":\"50\",\"adminNote-500\":\"\",\"size-500\":\"\",\"bsLabelColumns-500\":\"\",\"bsInputColumns-500\":\"\",\"bsNoteColumns-500\":\"\",\"_0_rowLabelInputNote-500\":\"row\",\"_1_rowLabelInputNote-500\":\"label\",\"_2_rowLabelInputNote-500\":\"\\/label\",\"_3_rowLabelInputNote-500\":\"input\",\"_4_rowLabelInputNote-500\":\"\\/input\",\"_5_rowLabelInputNote-500\":\"note\",\"_6_rowLabelInputNote-500\":\"\\/note\",\"_7_rowLabelInputNote-500\":\"\\/row\",\"maxLength-500\":\"\",\"note-500\":\"\",\"tooltip-500\":\"\",\"placeholder-500\":\"\",\"value-500\":\"\",\"sql1-500\":\"\",\"parameter-500\":\"\",\"_sipForTypo3Vars\":\"5daff470694b5\"}','{\"__dbIndexData\":\"1\",\"form\":\"formElement\",\"formId\":\"1007\",\"r\":\"500\",\"s\":\"5daff47065c19\",\"urlparam\":\"__dbIndexData=1&form=formElement&formId=1007&r=500\"}','192.168.133.203','','Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:69.0) Gecko/20100101 Firefox/69.0',2,500,1,'83228dfc9b11c970e5af54a8d48eca25','2019-10-23 06:38:08'),(262,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"1cb1bbe7d5477d53e3d9eaca60e2a38d\",\"enabled-499\":\"yes\",\"dynamicUpdate-499\":\"no\",\"mode-499\":\"required\",\"class-499\":\"native\",\"_h_subrecordOption-499\":\"\",\"encode-499\":\"specialchar\",\"checkType-499\":\"auto\",\"labelAlign-499\":\"default\",\"_h_rowLabelInputNote-499\":\"\",\"feIdContainer-499\":\"504\",\"name-499\":\"datetime\",\"label-499\":\"datetime\",\"modeSql-499\":\"\",\"type-499\":\"datetime\",\"parameterLanguageA-499\":\"\",\"parameterLanguageB-499\":\"\",\"parameterLanguageC-499\":\"\",\"parameterLanguageD-499\":\"\",\"checkPattern-499\":\"\",\"ord-499\":\"40\",\"adminNote-499\":\"\",\"size-499\":\"\",\"bsLabelColumns-499\":\"\",\"bsInputColumns-499\":\"\",\"bsNoteColumns-499\":\"\",\"_0_rowLabelInputNote-499\":\"row\",\"_1_rowLabelInputNote-499\":\"label\",\"_2_rowLabelInputNote-499\":\"\\/label\",\"_3_rowLabelInputNote-499\":\"input\",\"_4_rowLabelInputNote-499\":\"\\/input\",\"_5_rowLabelInputNote-499\":\"note\",\"_6_rowLabelInputNote-499\":\"\\/note\",\"_7_rowLabelInputNote-499\":\"\\/row\",\"maxLength-499\":\"\",\"note-499\":\"\",\"tooltip-499\":\"\",\"placeholder-499\":\"\",\"value-499\":\"\",\"sql1-499\":\"\",\"parameter-499\":\"\",\"_sipForTypo3Vars\":\"5daff470694b5\"}','{\"__dbIndexData\":\"1\",\"form\":\"formElement\",\"formId\":\"1007\",\"r\":\"499\",\"s\":\"5daff47065b0c\",\"urlparam\":\"__dbIndexData=1&form=formElement&formId=1007&r=499\"}','192.168.133.203','','Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:69.0) Gecko/20100101 Firefox/69.0',2,499,1,'83228dfc9b11c970e5af54a8d48eca25','2019-10-23 06:38:16'),(263,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"20cf8585f8c88c8dcc5f807f605943c2\",\"enabled-498\":\"yes\",\"dynamicUpdate-498\":\"no\",\"mode-498\":\"required\",\"class-498\":\"native\",\"_h_subrecordOption-498\":\"\",\"encode-498\":\"specialchar\",\"checkType-498\":\"auto\",\"labelAlign-498\":\"default\",\"_h_rowLabelInputNote-498\":\"\",\"feIdContainer-498\":\"504\",\"name-498\":\"date\",\"label-498\":\"date\",\"modeSql-498\":\"\",\"type-498\":\"date\",\"parameterLanguageA-498\":\"\",\"parameterLanguageB-498\":\"\",\"parameterLanguageC-498\":\"\",\"parameterLanguageD-498\":\"\",\"checkPattern-498\":\"\",\"ord-498\":\"30\",\"adminNote-498\":\"\",\"size-498\":\"\",\"bsLabelColumns-498\":\"\",\"bsInputColumns-498\":\"\",\"bsNoteColumns-498\":\"\",\"_0_rowLabelInputNote-498\":\"row\",\"_1_rowLabelInputNote-498\":\"label\",\"_2_rowLabelInputNote-498\":\"\\/label\",\"_3_rowLabelInputNote-498\":\"input\",\"_4_rowLabelInputNote-498\":\"\\/input\",\"_5_rowLabelInputNote-498\":\"note\",\"_6_rowLabelInputNote-498\":\"\\/note\",\"_7_rowLabelInputNote-498\":\"\\/row\",\"maxLength-498\":\"\",\"note-498\":\"\",\"tooltip-498\":\"\",\"placeholder-498\":\"\",\"value-498\":\"\",\"sql1-498\":\"\",\"parameter-498\":\"\",\"_sipForTypo3Vars\":\"5daff470694b5\"}','{\"__dbIndexData\":\"1\",\"form\":\"formElement\",\"formId\":\"1007\",\"r\":\"498\",\"s\":\"5daff470659c6\",\"urlparam\":\"__dbIndexData=1&form=formElement&formId=1007&r=498\"}','192.168.133.203','','Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:69.0) Gecko/20100101 Firefox/69.0',2,498,1,'83228dfc9b11c970e5af54a8d48eca25','2019-10-23 06:38:24'),(264,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"c744f077e7eca248d4d5d41c5a55c8f6\",\"enabled-497\":\"yes\",\"dynamicUpdate-497\":\"no\",\"mode-497\":\"required\",\"class-497\":\"native\",\"_h_subrecordOption-497\":\"\",\"encode-497\":\"specialchar\",\"checkType-497\":\"digit\",\"labelAlign-497\":\"default\",\"_h_rowLabelInputNote-497\":\"\",\"feIdContainer-497\":\"504\",\"name-497\":\"number\",\"label-497\":\"number\",\"modeSql-497\":\"\",\"type-497\":\"text\",\"parameterLanguageA-497\":\"\",\"parameterLanguageB-497\":\"\",\"parameterLanguageC-497\":\"\",\"parameterLanguageD-497\":\"\",\"checkPattern-497\":\"\",\"ord-497\":\"20\",\"adminNote-497\":\"\",\"size-497\":\"\",\"bsLabelColumns-497\":\"\",\"bsInputColumns-497\":\"\",\"bsNoteColumns-497\":\"\",\"_0_rowLabelInputNote-497\":\"row\",\"_1_rowLabelInputNote-497\":\"label\",\"_2_rowLabelInputNote-497\":\"\\/label\",\"_3_rowLabelInputNote-497\":\"input\",\"_4_rowLabelInputNote-497\":\"\\/input\",\"_5_rowLabelInputNote-497\":\"note\",\"_6_rowLabelInputNote-497\":\"\\/note\",\"_7_rowLabelInputNote-497\":\"\\/row\",\"maxLength-497\":\"\",\"note-497\":\"\",\"tooltip-497\":\"\",\"placeholder-497\":\"\",\"value-497\":\"\",\"sql1-497\":\"\",\"parameter-497\":\"\",\"_sipForTypo3Vars\":\"5daff470694b5\"}','{\"__dbIndexData\":\"1\",\"form\":\"formElement\",\"formId\":\"1007\",\"r\":\"497\",\"s\":\"5daff47065896\",\"urlparam\":\"__dbIndexData=1&form=formElement&formId=1007&r=497\"}','192.168.133.203','','Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:69.0) Gecko/20100101 Firefox/69.0',2,497,1,'83228dfc9b11c970e5af54a8d48eca25','2019-10-23 06:38:32'),(265,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"7d0c6159ffb5efd4955173509710a695\",\"enabled-496\":\"yes\",\"dynamicUpdate-496\":\"no\",\"mode-496\":\"required\",\"class-496\":\"native\",\"_h_subrecordOption-496\":\"\",\"encode-496\":\"specialchar\",\"checkType-496\":\"auto\",\"labelAlign-496\":\"default\",\"_h_rowLabelInputNote-496\":\"\",\"feIdContainer-496\":\"504\",\"name-496\":\"text\",\"label-496\":\"text\",\"modeSql-496\":\"\",\"type-496\":\"text\",\"parameterLanguageA-496\":\"\",\"parameterLanguageB-496\":\"\",\"parameterLanguageC-496\":\"\",\"parameterLanguageD-496\":\"\",\"checkPattern-496\":\"\",\"ord-496\":\"10\",\"adminNote-496\":\"\",\"size-496\":\"\",\"bsLabelColumns-496\":\"\",\"bsInputColumns-496\":\"\",\"bsNoteColumns-496\":\"\",\"_0_rowLabelInputNote-496\":\"row\",\"_1_rowLabelInputNote-496\":\"label\",\"_2_rowLabelInputNote-496\":\"\\/label\",\"_3_rowLabelInputNote-496\":\"input\",\"_4_rowLabelInputNote-496\":\"\\/input\",\"_5_rowLabelInputNote-496\":\"note\",\"_6_rowLabelInputNote-496\":\"\\/note\",\"_7_rowLabelInputNote-496\":\"\\/row\",\"maxLength-496\":\"\",\"note-496\":\"\",\"tooltip-496\":\"\",\"placeholder-496\":\"\",\"value-496\":\"\",\"sql1-496\":\"\",\"parameter-496\":\"\",\"_sipForTypo3Vars\":\"5daff470694b5\"}','{\"__dbIndexData\":\"1\",\"form\":\"formElement\",\"formId\":\"1007\",\"r\":\"496\",\"s\":\"5daff470656c4\",\"urlparam\":\"__dbIndexData=1&form=formElement&formId=1007&r=496\"}','192.168.133.203','','Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:69.0) Gecko/20100101 Firefox/69.0',2,496,1,'83228dfc9b11c970e5af54a8d48eca25','2019-10-23 06:38:40'),(266,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"enabled-0\":\"yes\",\"dynamicUpdate-0\":\"no\",\"mode-0\":\"show\",\"class-0\":\"container\",\"_h_subrecordOption-0\":\"\",\"encode-0\":\"specialchar\",\"checkType-0\":\"auto\",\"labelAlign-0\":\"default\",\"_h_rowLabelInputNote-0\":\"\",\"feIdContainer-0\":\"\",\"name-0\":\"pill2\",\"label-0\":\"pill2\",\"modeSql-0\":\"\",\"type-0\":\"pill\",\"parameterLanguageA-0\":\"\",\"parameterLanguageB-0\":\"\",\"parameterLanguageC-0\":\"\",\"parameterLanguageD-0\":\"\",\"checkPattern-0\":\"\",\"ord-0\":\"100\",\"adminNote-0\":\"\",\"size-0\":\"\",\"bsLabelColumns-0\":\"\",\"bsInputColumns-0\":\"\",\"bsNoteColumns-0\":\"\",\"_0_rowLabelInputNote-0\":\"row\",\"_1_rowLabelInputNote-0\":\"label\",\"_2_rowLabelInputNote-0\":\"\\/label\",\"_3_rowLabelInputNote-0\":\"input\",\"_4_rowLabelInputNote-0\":\"\\/input\",\"_5_rowLabelInputNote-0\":\"note\",\"_6_rowLabelInputNote-0\":\"\\/note\",\"_7_rowLabelInputNote-0\":\"\\/row\",\"maxLength-0\":\"\",\"note-0\":\"\",\"tooltip-0\":\"\",\"placeholder-0\":\"\",\"value-0\":\"\",\"sql1-0\":\"\",\"parameter-0\":\"\",\"_sipForTypo3Vars\":\"5daff470694b5\"}','{\"__dbIndexData\":\"1\",\"form\":\"formElement\",\"formId\":\"1007\",\"r\":\"0\",\"s\":\"5daff470647d0\",\"urlparam\":\"__dbIndexData=1&form=formElement&formId=1007&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:69.0) Gecko/20100101 Firefox/69.0',2,0,1,'83228dfc9b11c970e5af54a8d48eca25','2019-10-23 06:39:05'),(267,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"FMiBD7qlyZIc4CLnd0APdzZRyXjYE7op\",\"number-0\":\"921840946\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option b\",\"_2_checkbox-0\":\"3\",\"_sipForTypo3Vars\":\"5daff5b77c667\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5daff5b6ac6c8\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,0,3,'26ea851b12f50ee1c55fff57da8e484c','2019-10-23 06:39:54'),(268,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"qjC7HflFszt6MPKCAfyOQsGutvwOKToA\",\"number-0\":\"1463423153\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option b\",\"_2_checkbox-0\":\"3\",\"_sipForTypo3Vars\":\"5daff5b77c667\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5daff5b6ac6c8\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,0,3,'26ea851b12f50ee1c55fff57da8e484c','2019-10-23 06:39:57'),(269,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"89a916bef6dee386e558a0e9b9646226\",\"_h_checkbox-168\":\"\",\"text-168\":\"hbhGdNNleQraAnAXuIV6bfEll6rJDDiT\",\"number-168\":\"2071276670\",\"date-168\":\"01.01.2188\",\"datetime-168\":\"02.02.2188 01:08\",\"decimal-168\":\"12.84\",\"enum-168\":\"first option\",\"radio-168\":\"option b\",\"_2_checkbox-168\":\"3\",\"_sipForTypo3Vars\":\"5daff5bdd8287\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"168\",\"s\":\"5daff5bd398e2\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=168\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,168,1,'26ea851b12f50ee1c55fff57da8e484c','2019-10-23 06:39:58'),(270,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"JQoMUkGhRR1LkO3mogXIFGzu5PUhE9UA\",\"number-0\":\"1350102589\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option b\",\"_2_checkbox-0\":\"3\",\"_sipForTypo3Vars\":\"5daff5cb9750f\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5daff5cac2486\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,0,3,'ab72c86e158625376a20522ca2cbe176','2019-10-23 06:40:14'),(271,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"n4nPy5N8Ccb7ke5yuBFt55Qolg7nDxSj\",\"number-0\":\"584030561\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option b\",\"_2_checkbox-0\":\"3\",\"_sipForTypo3Vars\":\"5daff5cb9750f\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5daff5cac2486\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,0,3,'ab72c86e158625376a20522ca2cbe176','2019-10-23 06:40:17'),(272,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"c9646413434638056f61ba2e1bc8ed43\",\"_h_checkbox-170\":\"\",\"text-170\":\"nd4zu7jhKcl2MCqFMDsDeHgxSrl5wQ3Z\",\"number-170\":\"883826563\",\"date-170\":\"01.01.2188\",\"datetime-170\":\"02.02.2188 01:08\",\"decimal-170\":\"12.84\",\"enum-170\":\"first option\",\"radio-170\":\"option b\",\"_2_checkbox-170\":\"3\",\"_sipForTypo3Vars\":\"5daff5d20f757\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"170\",\"s\":\"5daff5d13f4b5\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=170\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,170,1,'ab72c86e158625376a20522ca2cbe176','2019-10-23 06:40:19'),(273,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"14g3cv1uqnvYh7rZMENjhYfBmsvJfHkF\",\"number-0\":\"205209437\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option b\",\"_2_checkbox-0\":\"3\",\"_sipForTypo3Vars\":\"5daff5dff1e69\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5daff5df22beb\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,0,3,'ac8236bb8f1469068a4be15392daf932','2019-10-23 06:40:34'),(274,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"u7Qs98vWQPBXBNq6FUlMZpCMjtqog2lS\",\"number-0\":\"450315496\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option b\",\"_2_checkbox-0\":\"3\",\"_sipForTypo3Vars\":\"5daff5dff1e69\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5daff5df22beb\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,0,3,'ac8236bb8f1469068a4be15392daf932','2019-10-23 06:40:37'),(275,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"a7b59c633d539ed8349cf49e448c145f\",\"_h_checkbox-172\":\"\",\"text-172\":\"0fw0pd7ANgZ2KhWLn0eKQriUF0KJJEpo\",\"number-172\":\"1443142856\",\"date-172\":\"01.01.2188\",\"datetime-172\":\"02.02.2188 01:08\",\"decimal-172\":\"12.84\",\"enum-172\":\"first option\",\"radio-172\":\"option b\",\"_2_checkbox-172\":\"3\",\"_sipForTypo3Vars\":\"5daff5e64b697\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"172\",\"s\":\"5daff5e580211\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=172\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,172,1,'ac8236bb8f1469068a4be15392daf932','2019-10-23 06:40:39'),(276,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"qjBsiVttuAww6x4UWTQrvZmh8w0IlHMh\",\"number-0\":\"1538199319\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option b\",\"_2_checkbox-0\":\"3\",\"_sipForTypo3Vars\":\"5daff5f3237fc\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5daff5f229312\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,0,3,'1840394acd36028dd281ba24be5ce114','2019-10-23 06:40:53'),(277,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"o0yE6kqqSwPW8m9OW4G8b3qfWXFhV3um\",\"number-0\":\"1199966014\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option b\",\"_2_checkbox-0\":\"3\",\"_sipForTypo3Vars\":\"5daff5f3237fc\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5daff5f229312\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,0,3,'1840394acd36028dd281ba24be5ce114','2019-10-23 06:40:56'),(278,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"48c864321436cba3d78d8e5116045c95\",\"_h_checkbox-174\":\"\",\"text-174\":\"hNzj8wvuMASgozAFgeJEIjEwJMlg0uzP\",\"number-174\":\"1356513688\",\"date-174\":\"01.01.2188\",\"datetime-174\":\"02.02.2188 01:08\",\"decimal-174\":\"12.84\",\"enum-174\":\"first option\",\"radio-174\":\"option b\",\"_2_checkbox-174\":\"3\",\"_sipForTypo3Vars\":\"5daff5f958e46\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"174\",\"s\":\"5daff5f89780a\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=174\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,174,1,'1840394acd36028dd281ba24be5ce114','2019-10-23 06:40:58'),(279,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"dzQvN4iP6qFhoYOThfnDdXfrY80dY0iD\",\"number-0\":\"2012434777\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option b\",\"_2_checkbox-0\":\"3\",\"_sipForTypo3Vars\":\"5daff6e9a10a6\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5daff6e8d09f7\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,0,3,'69df9be846ed8bd60e849cb382b067d7','2019-10-23 06:45:00'),(280,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"snN23nfYseOzpd5p5DIZsYbLnVnEPFCU\",\"number-0\":\"543226867\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option b\",\"_2_checkbox-0\":\"3\",\"_sipForTypo3Vars\":\"5daff6e9a10a6\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5daff6e8d09f7\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,0,3,'69df9be846ed8bd60e849cb382b067d7','2019-10-23 06:45:03'),(281,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"b3f2346c0ce6960a16b85a6bea031591\",\"_h_checkbox-176\":\"\",\"text-176\":\"ThfyPpLeeRNDRARsVZxf98icnFsYzltq\",\"number-176\":\"176891708\",\"date-176\":\"01.01.2188\",\"datetime-176\":\"02.02.2188 01:08\",\"decimal-176\":\"12.84\",\"enum-176\":\"first option\",\"radio-176\":\"option b\",\"_2_checkbox-176\":\"3\",\"_sipForTypo3Vars\":\"5daff6f010aec\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"176\",\"s\":\"5daff6ef59e36\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=176\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,176,1,'69df9be846ed8bd60e849cb382b067d7','2019-10-23 06:45:05'),(282,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"6FM5uxoiQlxlCShieTJ5HAqIaRmp21lD\",\"number-0\":\"984460192\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option b\",\"_2_checkbox-0\":\"3\",\"_sipForTypo3Vars\":\"5daff6ff34c6d\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5daff6fe4b587\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.70 Safari/537.36',1007,0,3,'80e58a064c4ff3b2db1a5bd1d5726cb2','2019-10-23 06:45:22'),(283,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"KJvj0sjWfdBSwuI2dl3ujCS1S6DP8nK5\",\"number-0\":\"1999258101\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option b\",\"_2_checkbox-0\":\"3\",\"_sipForTypo3Vars\":\"5daff6ff34c6d\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5daff6fe4b587\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.70 Safari/537.36',1007,0,3,'80e58a064c4ff3b2db1a5bd1d5726cb2','2019-10-23 06:45:26'),(284,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"63ee2f0e7b83315b0728f937162232ae\",\"_h_checkbox-178\":\"\",\"text-178\":\"ywXF7KFGHdxVts7NCoSceaeJ5uRAh4R7\",\"number-178\":\"1783536920\",\"date-178\":\"01.01.2188\",\"datetime-178\":\"02.02.2188 01:08\",\"decimal-178\":\"12.84\",\"enum-178\":\"first option\",\"radio-178\":\"option b\",\"_2_checkbox-178\":\"3\",\"_sipForTypo3Vars\":\"5daff707bb620\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"178\",\"s\":\"5daff7071062f\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=178\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.70 Safari/537.36',1007,178,1,'80e58a064c4ff3b2db1a5bd1d5726cb2','2019-10-23 06:45:29'),(285,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"PsYHyZjiP3DiQwMUATtMU3iyKEJxLYBs\",\"number-0\":\"1660201415\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option b\",\"_2_checkbox-0\":\"3\",\"_sipForTypo3Vars\":\"5daff781c9682\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5daff780f2d69\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,0,3,'186d3397b444c851172f0822a0e99d61','2019-10-23 06:47:32'),(286,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"gO6ecauGoZt7bj1Evm2zUJh9Ods6c6IK\",\"number-0\":\"1606952537\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option b\",\"_2_checkbox-0\":\"3\",\"_sipForTypo3Vars\":\"5daff781c9682\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5daff780f2d69\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,0,3,'186d3397b444c851172f0822a0e99d61','2019-10-23 06:47:35'),(287,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"28198718e40ae520d3b4b4dc5556fbd6\",\"_h_checkbox-180\":\"\",\"text-180\":\"gXjSlzUdOFlh4OiPWUIK2Jw3nBsi4r7o\",\"number-180\":\"1212155220\",\"date-180\":\"01.01.2188\",\"datetime-180\":\"02.02.2188 01:08\",\"decimal-180\":\"12.84\",\"enum-180\":\"first option\",\"radio-180\":\"option b\",\"_2_checkbox-180\":\"3\",\"_sipForTypo3Vars\":\"5daff78833d26\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"180\",\"s\":\"5daff78776184\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=180\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,180,1,'186d3397b444c851172f0822a0e99d61','2019-10-23 06:47:37'),(288,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"ev2DSB6fBGYSRb6Pl7mStO8ynT99ienv\",\"number-0\":\"64709396\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option b\",\"_2_checkbox-0\":\"3\",\"_sipForTypo3Vars\":\"5daff7ae65bfb\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5daff7ada0bb4\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,0,3,'424695866a3647d8ee8e3a7785ba6d48','2019-10-23 06:48:16'),(289,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"mrvTLlrkkV6EqnnNrLMOf8jiitL3LA5S\",\"number-0\":\"2045820259\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option b\",\"_2_checkbox-0\":\"3\",\"_sipForTypo3Vars\":\"5daff7ae65bfb\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5daff7ada0bb4\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,0,3,'424695866a3647d8ee8e3a7785ba6d48','2019-10-23 06:48:19'),(290,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"53e2e0e7cfc09fdf516475f9ba9ae4a9\",\"_h_checkbox-182\":\"\",\"text-182\":\"YFFFN9o3WWPIFRAdXBTNberlgJz3iswG\",\"number-182\":\"713938869\",\"date-182\":\"01.01.2188\",\"datetime-182\":\"02.02.2188 01:08\",\"decimal-182\":\"12.84\",\"enum-182\":\"first option\",\"radio-182\":\"option b\",\"_2_checkbox-182\":\"3\",\"_sipForTypo3Vars\":\"5daff7b4aeca0\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"182\",\"s\":\"5daff7b3eb159\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=182\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,182,1,'424695866a3647d8ee8e3a7785ba6d48','2019-10-23 06:48:21'),(291,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"9atC7XNrkFiIFEBRTcAqeRiPgif13Dq8\",\"number-0\":\"2124292885\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option b\",\"_2_checkbox-0\":\"3\",\"_sipForTypo3Vars\":\"5daff80f25b46\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5daff80e4c7d5\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,0,3,'522addcefdf6974f2c66122af7501a9a','2019-10-23 06:49:53'),(292,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"tVCDYEhlup2bOy04XPvTdWryQmJqSfbL\",\"number-0\":\"1740592094\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option b\",\"_2_checkbox-0\":\"3\",\"_sipForTypo3Vars\":\"5daff821bd488\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5daff820ee1b2\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,0,3,'14efcb1ea28cbba92c1a9cde65372ea3','2019-10-23 06:50:12'),(293,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"AoJ6S5Hphh1SwrhlXCz0tTn7M8Nekj2r\",\"number-0\":\"1911434522\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option b\",\"_2_checkbox-0\":\"3\",\"_sipForTypo3Vars\":\"5daff821bd488\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5daff820ee1b2\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,0,3,'14efcb1ea28cbba92c1a9cde65372ea3','2019-10-23 06:50:15'),(294,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"75c5c4a9c19acfbc944d8a202e6d0d8c\",\"_h_checkbox-185\":\"\",\"text-185\":\"GlVZbWvMhf5tIrvnvaSjBDDxbhunXPDu\",\"number-185\":\"1585184678\",\"date-185\":\"01.01.2188\",\"datetime-185\":\"02.02.2188 01:08\",\"decimal-185\":\"12.84\",\"enum-185\":\"first option\",\"radio-185\":\"option b\",\"_2_checkbox-185\":\"3\",\"_sipForTypo3Vars\":\"5daff8285d3c6\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"185\",\"s\":\"5daff8278d668\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=185\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,185,1,'14efcb1ea28cbba92c1a9cde65372ea3','2019-10-23 06:50:17'),(295,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"fOOq4PNLnfNlXM1R6EZzRjdAiYzSx4Xn\",\"number-0\":\"755084938\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option b\",\"_2_checkbox-0\":\"3\",\"_sipForTypo3Vars\":\"5daff83863889\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5daff837799d6\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.70 Safari/537.36',1007,0,3,'6ae5ec9ceaec84f34f4583354636b2d9','2019-10-23 06:50:35'),(296,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"jMSYLDFWKJ8Q0a5Esx3UoUbInWmZeLAt\",\"number-0\":\"538527484\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option b\",\"_2_checkbox-0\":\"3\",\"_sipForTypo3Vars\":\"5daffab5d3f93\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5daffab50a223\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:69.0) Gecko/20100101 Firefox/69.0',1007,0,3,'8b995f173eb4b0ba3ca4d29e6c4ac869','2019-10-23 07:01:12'),(297,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"DsvooqUGt3P8D3SSfwJw9GIbDz0JdQkK\",\"number-0\":\"956513294\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option b\",\"_2_checkbox-0\":\"3\",\"_sipForTypo3Vars\":\"5daffab5d3f93\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5daffab50a223\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:69.0) Gecko/20100101 Firefox/69.0',1007,0,3,'8b995f173eb4b0ba3ca4d29e6c4ac869','2019-10-23 07:01:16'),(298,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"58502f2880099187f8752dddd195bd78\",\"_h_checkbox-188\":\"\",\"text-188\":\"lXi1TG2xrfmkUWCNM43GgLalITBU9SjS\",\"number-188\":\"1044614820\",\"date-188\":\"01.01.2188\",\"datetime-188\":\"02.02.2188 01:08\",\"decimal-188\":\"12.84\",\"enum-188\":\"first option\",\"radio-188\":\"option b\",\"_2_checkbox-188\":\"3\",\"_sipForTypo3Vars\":\"5daffabdb48bb\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"188\",\"s\":\"5daffabcb03d1\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=188\"}','192.168.133.203','','Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:69.0) Gecko/20100101 Firefox/69.0',1007,188,1,'8b995f173eb4b0ba3ca4d29e6c4ac869','2019-10-23 07:01:18'),(299,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"Q416LQaTjM3yqNC8K7VzfRDtWvXdDgH1\",\"number-0\":\"1872376762\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option b\",\"_2_checkbox-0\":\"3\",\"_sipForTypo3Vars\":\"5db0014f988b3\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db0014ebbfe2\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,0,3,'ac15cc175dbc467c62f0568984b11da8','2019-10-23 07:29:22'),(300,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"UkdxzYhSH5zJxBqmawcDOFA5R1PNVQ2e\",\"number-0\":\"614005812\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option b\",\"_2_checkbox-0\":\"3\",\"_sipForTypo3Vars\":\"5db0014f988b3\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db0014ebbfe2\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,0,3,'ac15cc175dbc467c62f0568984b11da8','2019-10-23 07:29:25'),(301,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d35f274c44ed2cbd266d05c8856ebd1f\",\"_h_checkbox-190\":\"\",\"text-190\":\"ZaDHb92Sr1ylIIEC8VAYoufJLnVA1tMQ\",\"number-190\":\"1139257020\",\"date-190\":\"01.01.2188\",\"datetime-190\":\"02.02.2188 01:08\",\"decimal-190\":\"12.84\",\"enum-190\":\"first option\",\"radio-190\":\"option b\",\"_2_checkbox-190\":\"3\",\"_sipForTypo3Vars\":\"5db00156344d8\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"190\",\"s\":\"5db001556bb50\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=190\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,190,1,'ac15cc175dbc467c62f0568984b11da8','2019-10-23 07:29:27'),(302,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"JyZOku2I1vCvxDCQSP36koYgqxrKLCrF\",\"number-0\":\"412859923\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option b\",\"_2_checkbox-0\":\"3\",\"_sipForTypo3Vars\":\"5db0025af2669\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db0025a2c06f\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,0,3,'62e76120adc90b2b2e2082e65b982e8b','2019-10-23 07:33:49'),(303,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"ufdXBwy2z38RUrRDrgqmhU7ZIJ6jmgqf\",\"number-0\":\"1952146620\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option b\",\"_2_checkbox-0\":\"3\",\"_sipForTypo3Vars\":\"5db0025af2669\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db0025a2c06f\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,0,3,'62e76120adc90b2b2e2082e65b982e8b','2019-10-23 07:33:52'),(304,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"5d89503e49303f2688b5161cb8141080\",\"_h_checkbox-192\":\"\",\"text-192\":\"bi7AeiUr43C2V5cc5fldJB5ovTCwAOP3\",\"number-192\":\"884372205\",\"date-192\":\"01.01.2188\",\"datetime-192\":\"02.02.2188 01:08\",\"decimal-192\":\"12.84\",\"enum-192\":\"first option\",\"radio-192\":\"option b\",\"_2_checkbox-192\":\"3\",\"_sipForTypo3Vars\":\"5db0026183376\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"192\",\"s\":\"5db00260b591b\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=192\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,192,1,'62e76120adc90b2b2e2082e65b982e8b','2019-10-23 07:33:54'),(305,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"X1zQL4fX2a6EU5IFwFdaVOVRb2sFFWNv\",\"number-0\":\"2079981248\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option b\",\"_2_checkbox-0\":\"3\",\"_sipForTypo3Vars\":\"5db002d327d3a\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db002d24fcea\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,0,3,'ade8feb668e75f22c637b78ad26ccc24','2019-10-23 07:35:49'),(306,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"0pBXMeQFCgVFG9zYxvP6rdRoVqnz840D\",\"number-0\":\"2018249740\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option b\",\"_2_checkbox-0\":\"3\",\"_sipForTypo3Vars\":\"5db002d327d3a\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db002d24fcea\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,0,3,'ade8feb668e75f22c637b78ad26ccc24','2019-10-23 07:35:52'),(307,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"e4f5af5a2a4625409b3952a58092cec7\",\"_h_checkbox-194\":\"\",\"text-194\":\"9BWG1WNahYa4en1PctV5fSN7jF5hSV4F\",\"number-194\":\"88510273\",\"date-194\":\"01.01.2188\",\"datetime-194\":\"02.02.2188 01:08\",\"decimal-194\":\"12.84\",\"enum-194\":\"first option\",\"radio-194\":\"option b\",\"_2_checkbox-194\":\"3\",\"_sipForTypo3Vars\":\"5db002d97f7d9\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"194\",\"s\":\"5db002d8bb267\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=194\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,194,1,'ade8feb668e75f22c637b78ad26ccc24','2019-10-23 07:35:54'),(308,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"AYuBFy9ECd4TrszI02Xq75tyzTJ92zff\",\"number-0\":\"1895647763\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option b\",\"_2_checkbox-0\":\"3\",\"_sipForTypo3Vars\":\"5db003600dbdf\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db0035f2dd76\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,0,3,'5782301382de31af1df3f82647f55337','2019-10-23 07:38:10'),(309,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"FSAInj8tKApFzHQ1RrpMU2kFhLpYqvaf\",\"number-0\":\"1283352305\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option b\",\"_2_checkbox-0\":\"3\",\"_sipForTypo3Vars\":\"5db003600dbdf\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db0035f2dd76\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,0,3,'5782301382de31af1df3f82647f55337','2019-10-23 07:38:13'),(310,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"9e17484058c71c8509264983957704e9\",\"_h_checkbox-196\":\"\",\"text-196\":\"I82NsjRDrbF02TWbhw9p5oBeTD854WK3\",\"number-196\":\"40649672\",\"date-196\":\"01.01.2188\",\"datetime-196\":\"02.02.2188 01:08\",\"decimal-196\":\"12.84\",\"enum-196\":\"first option\",\"radio-196\":\"option b\",\"_2_checkbox-196\":\"3\",\"_sipForTypo3Vars\":\"5db003666737e\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"196\",\"s\":\"5db00365a4600\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=196\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,196,1,'5782301382de31af1df3f82647f55337','2019-10-23 07:38:15'),(311,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"ifMHBw45tvh2SSsWQe9HWRGzvz66e5OR\",\"number-0\":\"1323285008\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"_sipForTypo3Vars\":\"5db006dd388e0\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db006dc4679f\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.70 Safari/537.36',1007,0,3,'f25270f5c9cecc1429f381bb8f5d5a13','2019-10-23 07:53:04'),(312,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"IO2CuS3iaelkcwfqqOtusKxPZE9FRfvt\",\"number-0\":\"1578424781\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"_sipForTypo3Vars\":\"5db007099523d\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db007089bf66\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.70 Safari/537.36',1007,0,3,'8ff880d3400bc46d3f290244cc00570e','2019-10-23 07:53:51'),(313,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"safsda\",\"number-0\":\"1\",\"date-0\":\"01.01.2009\",\"datetime-0\":\"01.01.2009 00:00\",\"decimal-0\":\"213.8\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"_sipForTypo3Vars\":\"5daff1653c921\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5daff15d928f0\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:69.0) Gecko/20100101 Firefox/69.0',1007,0,3,'83228dfc9b11c970e5af54a8d48eca25','2019-10-23 07:54:31'),(314,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"1QaC8Oej8u7ZsIJBZQxWfkdyVTfQw6mR\",\"number-0\":\"1689902054\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"_sipForTypo3Vars\":\"5db00a8a42c15\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db00a8952814\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.70 Safari/537.36',1007,0,3,'3901f7cc0a1ce1f57bd08ec1b5119cba','2019-10-23 08:08:45'),(315,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"kv8YsV8KOzBtClCeHOUft6FqKZubo7Tc\",\"number-0\":\"832515247\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"_sipForTypo3Vars\":\"5db00a8a42c15\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db00a8952814\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.70 Safari/537.36',1007,0,3,'3901f7cc0a1ce1f57bd08ec1b5119cba','2019-10-23 08:08:49'),(316,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"a04a814c1e88f114e2dce3fb4796da4c\",\"_h_checkbox-201\":\"\",\"text-201\":\"n4QGQqHPX8N0cav4dw6LdwmV8Nc9ZaIA\",\"number-201\":\"2092106777\",\"date-201\":\"01.01.2188\",\"datetime-201\":\"02.02.2188 01:08\",\"decimal-201\":\"12.84\",\"enum-201\":\"first option\",\"radio-201\":\"option a\",\"_sipForTypo3Vars\":\"5db00a9255dbd\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"201\",\"s\":\"5db00a91442ea\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=201\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.70 Safari/537.36',1007,201,1,'3901f7cc0a1ce1f57bd08ec1b5119cba','2019-10-23 08:08:51'),(317,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"TNIp5L1FqkDUIxbc3Jun2boFCCi6apoN\",\"number-0\":\"1226487263\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"_sipForTypo3Vars\":\"5db012e5dc49f\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db012e4a52d0\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.70 Safari/537.36',1007,0,3,'a20180d9048ee78e12366abc4eb83790','2019-10-23 08:44:25'),(318,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"2iFQciHK0SJgrpyPWQRCFP7rfXHjNLBD\",\"number-0\":\"136492573\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"_sipForTypo3Vars\":\"5db01554494e6\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db0155339938\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.70 Safari/537.36',1007,0,3,'b439392c509bb86c986120b1078c7618','2019-10-23 08:54:48'),(319,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"qYhCME8dFFELf6OvLPdq3bUdUKJ4JDsX\",\"number-0\":\"1353601418\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"_sipForTypo3Vars\":\"5db01554494e6\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db0155339938\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.70 Safari/537.36',1007,0,3,'b439392c509bb86c986120b1078c7618','2019-10-23 08:54:52'),(320,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"82423cda41322982b2a3da6560dda4c4\",\"_h_checkbox-204\":\"\",\"text-204\":\"WjhOb6r8HzyhJXxVariFLkjlWqrUCByD\",\"number-204\":\"1693707379\",\"date-204\":\"01.01.2188\",\"datetime-204\":\"02.02.2188 01:08\",\"decimal-204\":\"12.84\",\"enum-204\":\"first option\",\"radio-204\":\"option a\",\"_sipForTypo3Vars\":\"5db0155e24621\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"204\",\"s\":\"5db0155cbd196\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=204\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.70 Safari/537.36',1007,204,1,'b439392c509bb86c986120b1078c7618','2019-10-23 08:54:55'),(321,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"enabled-0\":\"yes\",\"dynamicUpdate-0\":\"no\",\"mode-0\":\"show\",\"class-0\":\"native\",\"_h_subrecordOption-0\":\"\",\"encode-0\":\"specialchar\",\"checkType-0\":\"auto\",\"labelAlign-0\":\"default\",\"_h_rowLabelInputNote-0\":\"\",\"feIdContainer-0\":\"504\",\"name-0\":\"pill_text\",\"label-0\":\"pill_text\",\"modeSql-0\":\"\",\"type-0\":\"text\",\"parameterLanguageA-0\":\"\",\"parameterLanguageB-0\":\"\",\"parameterLanguageC-0\":\"\",\"parameterLanguageD-0\":\"\",\"checkPattern-0\":\"\",\"ord-0\":\"110\",\"adminNote-0\":\"\",\"size-0\":\"\",\"bsLabelColumns-0\":\"\",\"bsInputColumns-0\":\"\",\"bsNoteColumns-0\":\"\",\"_0_rowLabelInputNote-0\":\"row\",\"_1_rowLabelInputNote-0\":\"label\",\"_2_rowLabelInputNote-0\":\"\\/label\",\"_3_rowLabelInputNote-0\":\"input\",\"_4_rowLabelInputNote-0\":\"\\/input\",\"_5_rowLabelInputNote-0\":\"note\",\"_6_rowLabelInputNote-0\":\"\\/note\",\"_7_rowLabelInputNote-0\":\"\\/row\",\"maxLength-0\":\"\",\"note-0\":\"\",\"tooltip-0\":\"\",\"placeholder-0\":\"\",\"value-0\":\"\",\"sql1-0\":\"\",\"parameter-0\":\"\",\"_sipForTypo3Vars\":\"5db01166f20c1\"}','{\"__dbIndexData\":\"1\",\"form\":\"formElement\",\"formId\":\"1007\",\"r\":\"0\",\"s\":\"5daff470647d0\",\"urlparam\":\"__dbIndexData=1&form=formElement&formId=1007&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:69.0) Gecko/20100101 Firefox/69.0',2,0,1,'83228dfc9b11c970e5af54a8d48eca25','2019-10-23 10:15:43'),(322,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"9af4979dac21d7e4fc5025f551ce46ec\",\"enabled-506\":\"yes\",\"dynamicUpdate-506\":\"no\",\"mode-506\":\"show\",\"class-506\":\"native\",\"_h_subrecordOption-506\":\"\",\"encode-506\":\"specialchar\",\"checkType-506\":\"auto\",\"labelAlign-506\":\"default\",\"_h_rowLabelInputNote-506\":\"\",\"feIdContainer-506\":\"505\",\"name-506\":\"pill_text\",\"label-506\":\"pill_text\",\"modeSql-506\":\"\",\"type-506\":\"text\",\"parameterLanguageA-506\":\"\",\"parameterLanguageB-506\":\"\",\"parameterLanguageC-506\":\"\",\"parameterLanguageD-506\":\"\",\"checkPattern-506\":\"\",\"ord-506\":\"110\",\"adminNote-506\":\"\",\"size-506\":\"\",\"bsLabelColumns-506\":\"\",\"bsInputColumns-506\":\"\",\"bsNoteColumns-506\":\"\",\"_0_rowLabelInputNote-506\":\"row\",\"_1_rowLabelInputNote-506\":\"label\",\"_2_rowLabelInputNote-506\":\"\\/label\",\"_3_rowLabelInputNote-506\":\"input\",\"_4_rowLabelInputNote-506\":\"\\/input\",\"_5_rowLabelInputNote-506\":\"note\",\"_6_rowLabelInputNote-506\":\"\\/note\",\"_7_rowLabelInputNote-506\":\"\\/row\",\"maxLength-506\":\"\",\"note-506\":\"\",\"tooltip-506\":\"\",\"placeholder-506\":\"\",\"value-506\":\"\",\"sql1-506\":\"\",\"parameter-506\":\"\",\"_sipForTypo3Vars\":\"5daff470694b5\"}','{\"__dbIndexData\":\"1\",\"form\":\"formElement\",\"formId\":\"1007\",\"r\":\"506\",\"s\":\"5db0284f9cb0e\",\"urlparam\":\"__dbIndexData=1&form=formElement&formId=1007&r=506\"}','192.168.133.203','','Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:69.0) Gecko/20100101 Firefox/69.0',2,506,1,'83228dfc9b11c970e5af54a8d48eca25','2019-10-23 10:18:03'),(323,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"sgCEo9F4GKheYw6dKITdk9coN4x7Sfqo\",\"number-0\":\"1391819459\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"pill_text-0\":\"\",\"_sipForTypo3Vars\":\"5db028ef61299\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db028ee1b667\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.70 Safari/537.36',1007,0,3,'af477cd9a59776469737aa1d33b16d35','2019-10-23 10:18:26'),(324,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"xsjBhgDYzxcyX9tPGVuk9GCAyn4wBoS1\",\"number-0\":\"1240677384\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"pill_text-0\":\"\",\"_sipForTypo3Vars\":\"5db028ef61299\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db028ee1b667\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.70 Safari/537.36',1007,0,3,'af477cd9a59776469737aa1d33b16d35','2019-10-23 10:18:30'),(325,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d583c8cf9791ffd6781a5e9d19e051a4\",\"_h_checkbox-206\":\"\",\"text-206\":\"gID5SK63q3ewBbzNFoaVRngYWs1Wd1xs\",\"number-206\":\"1949476235\",\"date-206\":\"01.01.2188\",\"datetime-206\":\"02.02.2188 01:08\",\"decimal-206\":\"12.84\",\"enum-206\":\"first option\",\"radio-206\":\"option a\",\"pill_text-206\":\"\",\"_sipForTypo3Vars\":\"5db028f870fcf\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"206\",\"s\":\"5db028f6f2f70\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=206\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.70 Safari/537.36',1007,206,1,'af477cd9a59776469737aa1d33b16d35','2019-10-23 10:18:33'),(326,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"4AOl8R044eMOcRomPN5sIrFCopKT2xWY\",\"number-0\":\"1231949490\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"pill_text-0\":\"\",\"_sipForTypo3Vars\":\"5db02abe60b9f\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db02abd67c42\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.70 Safari/537.36',1007,0,3,'d1f9834c19ab7d81f62bc70768d9b998','2019-10-23 10:26:09'),(327,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"oKfmMAph5oScEgBu8YVhJvyxVpdCIPSc\",\"number-0\":\"1729314920\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"pill_text-0\":\"\",\"_sipForTypo3Vars\":\"5db02abe60b9f\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db02abd67c42\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.70 Safari/537.36',1007,0,3,'d1f9834c19ab7d81f62bc70768d9b998','2019-10-23 10:26:13'),(328,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"6e8467e23cc37a3c342fa2ef6c9898c0\",\"_h_checkbox-208\":\"\",\"text-208\":\"i73gi5OQ4I6JQOF5sxW8fsfkAf9u9IfW\",\"number-208\":\"2133797654\",\"date-208\":\"01.01.2188\",\"datetime-208\":\"02.02.2188 01:08\",\"decimal-208\":\"12.84\",\"enum-208\":\"first option\",\"radio-208\":\"option a\",\"pill_text-208\":\"\",\"_sipForTypo3Vars\":\"5db02ac72fb7f\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"208\",\"s\":\"5db02ac5e0e96\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=208\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.70 Safari/537.36',1007,208,1,'d1f9834c19ab7d81f62bc70768d9b998','2019-10-23 10:26:16'),(329,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"GBEozi6yA0sWZmwbqN3HZQJtSNsTnngq\",\"number-0\":\"938246553\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"pill_text-0\":\"\",\"_sipForTypo3Vars\":\"5db02af8aa9f0\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db02af783e32\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.70 Safari/537.36',1007,0,3,'e7d347e1c34108b29efb74a14ae378bd','2019-10-23 10:27:08'),(330,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"Fq7lmwQmLmbPLRlDfM3Y9CVbeQHn8sFU\",\"number-0\":\"1977011282\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"pill_text-0\":\"\",\"_sipForTypo3Vars\":\"5db02af8aa9f0\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db02af783e32\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.70 Safari/537.36',1007,0,3,'e7d347e1c34108b29efb74a14ae378bd','2019-10-23 10:27:12'),(331,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"97744b7053e64d2c67acc3ab62d5f1e0\",\"_h_checkbox-210\":\"\",\"text-210\":\"xM4pwef0JTr8XCJx3M2KPelEy0eEYHcm\",\"number-210\":\"460277585\",\"date-210\":\"01.01.2188\",\"datetime-210\":\"02.02.2188 01:08\",\"decimal-210\":\"12.84\",\"enum-210\":\"first option\",\"radio-210\":\"option a\",\"pill_text-210\":\"\",\"_sipForTypo3Vars\":\"5db02b018fbf6\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"210\",\"s\":\"5db02b00707c8\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=210\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.70 Safari/537.36',1007,210,1,'e7d347e1c34108b29efb74a14ae378bd','2019-10-23 10:27:14'),(332,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"BNdUPLyDkheO4qJs83YP0KhUtbjBeCwG\",\"number-0\":\"67437295\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"pill_text-0\":\"9pxV902y02thenyg75gePsZxGDrmGg8o\",\"_sipForTypo3Vars\":\"5db02af8aa9f0\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db02af783e32\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.70 Safari/537.36',1007,0,3,'e7d347e1c34108b29efb74a14ae378bd','2019-10-23 10:27:21'),(333,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"gJuuwLoiUPo2Qiw5eXUFkQi1hVre5mfJ\",\"number-0\":\"1940360411\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"pill_text-0\":\"\",\"_sipForTypo3Vars\":\"5db0326982df5\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db0326891f1d\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.70 Safari/537.36',1007,0,3,'2e1449c4fa730e8218b82136748d83fc','2019-10-23 10:58:53'),(334,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"rZjUgdN4i6p5kt91p5LIWfaIpueLMk97\",\"number-0\":\"474007823\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"pill_text-0\":\"\",\"_sipForTypo3Vars\":\"5db0326982df5\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db0326891f1d\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.70 Safari/537.36',1007,0,3,'2e1449c4fa730e8218b82136748d83fc','2019-10-23 10:58:57'),(335,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"78f364ed9e0b8a218596f6e4b8e6e65b\",\"_h_checkbox-213\":\"\",\"text-213\":\"upWRbmXKU87d4eBEjVTAZtkt9SLkq4J6\",\"number-213\":\"1461402865\",\"date-213\":\"01.01.2188\",\"datetime-213\":\"02.02.2188 01:08\",\"decimal-213\":\"12.84\",\"enum-213\":\"first option\",\"radio-213\":\"option a\",\"pill_text-213\":\"\",\"_sipForTypo3Vars\":\"5db0327272931\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"213\",\"s\":\"5db03271548c8\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=213\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.70 Safari/537.36',1007,213,1,'2e1449c4fa730e8218b82136748d83fc','2019-10-23 10:58:59'),(336,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"w86AvydHYvNodVE3lXlmZzALjkdt6bXc\",\"number-0\":\"1032043856\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"pill_text-0\":\"\",\"_sipForTypo3Vars\":\"5db0329cec9bb\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db0329bb89ab\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.70 Safari/537.36',1007,0,3,'bfa320b7146a4d09933ebd8cb8517c13','2019-10-23 10:59:44'),(337,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"btQeebO92gxgeWcUxgZsW9ewf3RCUeBU\",\"number-0\":\"664670040\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"pill_text-0\":\"\",\"_sipForTypo3Vars\":\"5db0329cec9bb\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db0329bb89ab\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.70 Safari/537.36',1007,0,3,'bfa320b7146a4d09933ebd8cb8517c13','2019-10-23 10:59:47'),(338,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"1ae6372b5030236411ef1616f4b31837\",\"_h_checkbox-215\":\"\",\"text-215\":\"GqS79cO6ncOxZvUW00PlFtR2Uvh8AFc9\",\"number-215\":\"2050516075\",\"date-215\":\"01.01.2188\",\"datetime-215\":\"02.02.2188 01:08\",\"decimal-215\":\"12.84\",\"enum-215\":\"first option\",\"radio-215\":\"option a\",\"pill_text-215\":\"\",\"_sipForTypo3Vars\":\"5db032a49cc4c\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"215\",\"s\":\"5db032a3a396d\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=215\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.70 Safari/537.36',1007,215,1,'bfa320b7146a4d09933ebd8cb8517c13','2019-10-23 10:59:50'),(339,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"SDRhuZjvzBYDicH8DlwWXoZZzNRsjhRg\",\"number-0\":\"1752187949\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"pill_text-0\":\"dqcWo6W3VFnDv8sRRCRdCEH2EZhuljAf\",\"_sipForTypo3Vars\":\"5db0329cec9bb\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db0329bb89ab\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.70 Safari/537.36',1007,0,3,'bfa320b7146a4d09933ebd8cb8517c13','2019-10-23 10:59:54'),(340,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"k8i1ZDTY5OB5R7UUzp1B1hWz6byu4kOg\",\"number-0\":\"356518027\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"pill_text-0\":\"\",\"_sipForTypo3Vars\":\"5db032bbe7954\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db032babde35\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.70 Safari/537.36',1007,0,3,'443dab1cbb5a63e34e071a1537d812d6','2019-10-23 11:00:15'),(341,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"z8tY9WQ4NQooH2IcS9IAMHMUPKGIPcsM\",\"number-0\":\"304492175\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"pill_text-0\":\"\",\"_sipForTypo3Vars\":\"5db032bbe7954\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db032babde35\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.70 Safari/537.36',1007,0,3,'443dab1cbb5a63e34e071a1537d812d6','2019-10-23 11:00:19'),(342,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"c0aec0ca11eecb0cac5db0d676aed6dc\",\"_h_checkbox-218\":\"\",\"text-218\":\"AM1qZzUnpJQJoboVhM8WOqdgGbftPbPj\",\"number-218\":\"161037\",\"date-218\":\"01.01.2188\",\"datetime-218\":\"02.02.2188 01:08\",\"decimal-218\":\"12.84\",\"enum-218\":\"first option\",\"radio-218\":\"option a\",\"pill_text-218\":\"\",\"_sipForTypo3Vars\":\"5db032c45c059\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"218\",\"s\":\"5db032c364a0d\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=218\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.70 Safari/537.36',1007,218,1,'443dab1cbb5a63e34e071a1537d812d6','2019-10-23 11:00:21'),(343,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"FNgbrheOLSG6CD7xZkb4mx3orLqBt2Pk\",\"number-0\":\"1024278353\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"pill_text-0\":\"\",\"_sipForTypo3Vars\":\"5db03d2f19216\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db03d2e18d28\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.70 Safari/537.36',1007,0,3,'4ba8c1ca6ecd7bf14b9126cc0742b391','2019-10-23 11:44:50'),(344,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"i9lnqJW5b79XcD1cVHs56ajSHT0dlOyI\",\"number-0\":\"173130520\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"pill_text-0\":\"\",\"_sipForTypo3Vars\":\"5db03d2f19216\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db03d2e18d28\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.70 Safari/537.36',1007,0,3,'4ba8c1ca6ecd7bf14b9126cc0742b391','2019-10-23 11:44:54'),(345,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"68bd706072253a6b091bf9b41f43a787\",\"_h_checkbox-220\":\"\",\"text-220\":\"91WDs55C2iZShqmjctlTfnonFGYZhwiL\",\"number-220\":\"590916700\",\"date-220\":\"01.01.2188\",\"datetime-220\":\"02.02.2188 01:08\",\"decimal-220\":\"12.84\",\"enum-220\":\"first option\",\"radio-220\":\"option a\",\"pill_text-220\":\"\",\"_sipForTypo3Vars\":\"5db03d38063de\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"220\",\"s\":\"5db03d36bd99b\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=220\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.70 Safari/537.36',1007,220,1,'4ba8c1ca6ecd7bf14b9126cc0742b391','2019-10-23 11:44:57'),(346,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"kACZCWmjZm2brGDBwIyhMS3BQxNSE8Dc\",\"number-0\":\"1886029335\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"pill_text-0\":\"SgjdwWYz6iOJU87rKX02ayCJLIwuBii7\",\"_sipForTypo3Vars\":\"5db03d2f19216\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db03d2e18d28\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.70 Safari/537.36',1007,0,3,'4ba8c1ca6ecd7bf14b9126cc0742b391','2019-10-23 11:45:02'),(347,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"NZpZfUREuUKk585tH4n6K8pQKc23yCoW\",\"number-0\":\"1904061637\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"pill_text-0\":\"\",\"_sipForTypo3Vars\":\"5db03f4158548\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db03f407cefc\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,0,3,'aad72a2925eb9d90e05b0bf63fd97df3','2019-10-23 11:53:40'),(348,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"xXiMeioIlOTXAIvpw95TpcTO8KWQ3hv0\",\"number-0\":\"2133076516\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"pill_text-0\":\"\",\"_sipForTypo3Vars\":\"5db03f4158548\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db03f407cefc\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,0,3,'aad72a2925eb9d90e05b0bf63fd97df3','2019-10-23 11:53:43'),(349,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"fc2e6114d3293b9caf55ca2f28228565\",\"_h_checkbox-223\":\"\",\"text-223\":\"xEX30RmtWcG2gAugPTLwexx994BvBRFB\",\"number-223\":\"739671420\",\"date-223\":\"01.01.2188\",\"datetime-223\":\"02.02.2188 01:08\",\"decimal-223\":\"12.84\",\"enum-223\":\"first option\",\"radio-223\":\"option a\",\"pill_text-223\":\"\",\"_sipForTypo3Vars\":\"5db03f4878521\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"223\",\"s\":\"5db03f47a0253\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=223\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,223,1,'aad72a2925eb9d90e05b0bf63fd97df3','2019-10-23 11:53:45'),(350,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"jTv92HO41HYGIlWTOnBG70q0OKsbYu7k\",\"number-0\":\"280789705\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"pill_text-0\":\"YhHUPa68xb1Nzjx9ogNxnXhE2VIk37Iy\",\"_sipForTypo3Vars\":\"5db03f4158548\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db03f407cefc\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,0,3,'aad72a2925eb9d90e05b0bf63fd97df3','2019-10-23 11:53:49'),(351,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"hFOYYle5qtnGqjBymwS2CWRwCaekhmeA\",\"number-0\":\"1314065904\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"pill_text-0\":\"\",\"_sipForTypo3Vars\":\"5db03f5e280dd\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db03f5d4daf3\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,0,3,'27a902aabfa70aa50e4245f450a3b601','2019-10-23 11:54:08'),(352,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"3cPHPqbE8SuZEL47U3LowFzrit8xzhXz\",\"number-0\":\"1737381119\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"pill_text-0\":\"\",\"_sipForTypo3Vars\":\"5db03f5e280dd\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db03f5d4daf3\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,0,3,'27a902aabfa70aa50e4245f450a3b601','2019-10-23 11:54:12'),(353,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"fb470a77083b1659627b152481f677cf\",\"_h_checkbox-226\":\"\",\"text-226\":\"zZVcvLzb1U4l2xWLN6nhhiGt6Hq2oyhD\",\"number-226\":\"1100698923\",\"date-226\":\"01.01.2188\",\"datetime-226\":\"02.02.2188 01:08\",\"decimal-226\":\"12.84\",\"enum-226\":\"first option\",\"radio-226\":\"option a\",\"pill_text-226\":\"\",\"_sipForTypo3Vars\":\"5db03f6512ab4\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"226\",\"s\":\"5db03f6447403\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=226\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,226,1,'27a902aabfa70aa50e4245f450a3b601','2019-10-23 11:54:14'),(354,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"w8vem7gDdcoPdZvC2ZjNhxasacbgB0TS\",\"number-0\":\"392696025\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"pill_text-0\":\"LXqLgLaV5SIKVkrSG3yG1Bd8qIi822lW\",\"_sipForTypo3Vars\":\"5db03f5e280dd\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db03f5d4daf3\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,0,3,'27a902aabfa70aa50e4245f450a3b601','2019-10-23 11:54:18'),(355,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"1YxRPlOjcs7zZtJdIRuOP0oJju9T5Vcn\",\"number-0\":\"2025419682\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"pill_text-0\":\"\",\"_sipForTypo3Vars\":\"5db03fb44f5f8\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db03fb35c55b\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:69.0) Gecko/20100101 Firefox/69.0',1007,0,3,'f565c0395403012f3a33e982085deeee','2019-10-23 11:55:35'),(356,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"FASdloRs952q4SmmOGT0KOO647gUQ7Pf\",\"number-0\":\"1384551731\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"pill_text-0\":\"\",\"_sipForTypo3Vars\":\"5db03fb44f5f8\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db03fb35c55b\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:69.0) Gecko/20100101 Firefox/69.0',1007,0,3,'f565c0395403012f3a33e982085deeee','2019-10-23 11:55:39'),(357,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"2eb5bba35d12e5fafeb7cddff48534de\",\"_h_checkbox-229\":\"\",\"text-229\":\"muRN9Wi9JPE9KxWcYTFTWqGx1Ditjp4b\",\"number-229\":\"1335617560\",\"date-229\":\"01.01.2188\",\"datetime-229\":\"02.02.2188 01:08\",\"decimal-229\":\"12.84\",\"enum-229\":\"first option\",\"radio-229\":\"option a\",\"pill_text-229\":\"\",\"_sipForTypo3Vars\":\"5db03fbcafc47\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"229\",\"s\":\"5db03fbb7e4d0\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=229\"}','192.168.133.203','','Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:69.0) Gecko/20100101 Firefox/69.0',1007,229,1,'f565c0395403012f3a33e982085deeee','2019-10-23 11:55:41'),(358,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"cA7EtJm978nx25cVsq9cEolktnSklwkG\",\"number-0\":\"1186146332\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"pill_text-0\":\"YQ7ZTCgclpGTt5U3F30PEEQXI0TZ27S0\",\"_sipForTypo3Vars\":\"5db03fb44f5f8\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db03fb35c55b\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:69.0) Gecko/20100101 Firefox/69.0',1007,0,3,'f565c0395403012f3a33e982085deeee','2019-10-23 11:55:45'),(359,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"Xi3ojIh6bU9HWqghjVXjIGbK9f3qHKCA\",\"number-0\":\"498703643\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"pill_text-0\":\"\",\"_sipForTypo3Vars\":\"5db03fd91ef5e\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db03fd834aad\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,0,3,'e8a4c051cd7fc788f6b30e36cf28d88b','2019-10-23 11:56:11'),(360,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"Yoxbv4gvDuCYyDDXTNJ82fEmrcaXesDx\",\"number-0\":\"309087420\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"pill_text-0\":\"\",\"_sipForTypo3Vars\":\"5db03fd91ef5e\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db03fd834aad\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,0,3,'e8a4c051cd7fc788f6b30e36cf28d88b','2019-10-23 11:56:15'),(361,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"3a25cdbbd549c7916d10012c7a8dc72e\",\"_h_checkbox-232\":\"\",\"text-232\":\"I3uga4LMX6A4ANPk3nbtfrf5UCII08lY\",\"number-232\":\"323901951\",\"date-232\":\"01.01.2188\",\"datetime-232\":\"02.02.2188 01:08\",\"decimal-232\":\"12.84\",\"enum-232\":\"first option\",\"radio-232\":\"option a\",\"pill_text-232\":\"\",\"_sipForTypo3Vars\":\"5db03fe032f69\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"232\",\"s\":\"5db03fdf58ba4\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=232\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,232,1,'e8a4c051cd7fc788f6b30e36cf28d88b','2019-10-23 11:56:17'),(362,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"vvOieZnBaYhq8O1vcybQ6YDyrtlGkenZ\",\"number-0\":\"945660033\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"pill_text-0\":\"ui2XZStNjmr7nV4vljQy24rgk3D5qEmf\",\"_sipForTypo3Vars\":\"5db03fd91ef5e\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db03fd834aad\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,0,3,'e8a4c051cd7fc788f6b30e36cf28d88b','2019-10-23 11:56:21'),(363,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"OT0d4Q4OGyGWG8tQshrq3WRgbTVufT54\",\"number-0\":\"1994220855\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"pill_text-0\":\"\",\"_sipForTypo3Vars\":\"5db044d9a5c05\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db044d8c813f\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,0,3,'2efa37a6a7e18f9db025d36afb561693','2019-10-23 12:17:32'),(364,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"OSehEflowDUSIyEwNHHvnDBefK6uIggh\",\"number-0\":\"4785118\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"pill_text-0\":\"\",\"_sipForTypo3Vars\":\"5db044d9a5c05\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db044d8c813f\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,0,3,'2efa37a6a7e18f9db025d36afb561693','2019-10-23 12:17:35'),(365,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d2c150e8005ce1decf4a370ca814c863\",\"_h_checkbox-235\":\"\",\"text-235\":\"IOS8MZWlIc5ILNa3ZHp3iSr5mJpzzccm\",\"number-235\":\"97345274\",\"date-235\":\"01.01.2188\",\"datetime-235\":\"02.02.2188 01:08\",\"decimal-235\":\"12.84\",\"enum-235\":\"first option\",\"radio-235\":\"option a\",\"pill_text-235\":\"\",\"_sipForTypo3Vars\":\"5db044e06186f\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"235\",\"s\":\"5db044df8bd9c\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=235\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,235,1,'2efa37a6a7e18f9db025d36afb561693','2019-10-23 12:17:37'),(366,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"mF7Mk68u1uqVkAqjifgUVfOOTzky9bGU\",\"number-0\":\"919810434\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"pill_text-0\":\"pdTtSnobNU5sfmLrZCn05dQLSaOkNYLz\",\"_sipForTypo3Vars\":\"5db044d9a5c05\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db044d8c813f\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,0,3,'2efa37a6a7e18f9db025d36afb561693','2019-10-23 12:17:41'),(367,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"Syb8vXC7vNnGBBwCvoK1NOc8lNEoY3uV\",\"number-0\":\"128147937\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"pill_text-0\":\"\",\"_sipForTypo3Vars\":\"5db044f83a80d\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db044f752c96\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,0,3,'8883e437c93f5de8ab049df6366bab6a','2019-10-23 12:18:03'),(368,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"2X6ZOinO3J2RX0L0CmKtEF8SzVCZKexe\",\"number-0\":\"600113410\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"pill_text-0\":\"\",\"_sipForTypo3Vars\":\"5db044f83a80d\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db044f752c96\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,0,3,'8883e437c93f5de8ab049df6366bab6a','2019-10-23 12:18:06'),(369,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"ea01be704149401f9354aca3ba4582f5\",\"_h_checkbox-238\":\"\",\"text-238\":\"D0LXqqMzJ6RBPMody9KrvQ9vSv0emEid\",\"number-238\":\"786075114\",\"date-238\":\"01.01.2188\",\"datetime-238\":\"02.02.2188 01:08\",\"decimal-238\":\"12.84\",\"enum-238\":\"first option\",\"radio-238\":\"option a\",\"pill_text-238\":\"\",\"_sipForTypo3Vars\":\"5db044ff3fdcf\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"238\",\"s\":\"5db044fe5de58\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=238\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,238,1,'8883e437c93f5de8ab049df6366bab6a','2019-10-23 12:18:08'),(370,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"9tW90rEGecwjusENo8aP19VPFiQv4VYu\",\"number-0\":\"223946459\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"pill_text-0\":\"FD8p2xVMDQQIyyVyNEkaOEvqXkTYIBqb\",\"_sipForTypo3Vars\":\"5db044f83a80d\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db044f752c96\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,0,3,'8883e437c93f5de8ab049df6366bab6a','2019-10-23 12:18:12'),(371,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"75k7GiBYLyS1QhTXKS7S9v0jemCbNcT6\",\"number-0\":\"225240158\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"pill_text-0\":\"\",\"_sipForTypo3Vars\":\"5db0480232184\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db048014ec40\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,0,3,'3df8446c08b8a14d150e53a509c1a7ac','2019-10-23 12:31:00'),(372,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"yenUJD483Efe7omf7AhzdZWGOQzsiEBz\",\"number-0\":\"470665373\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"pill_text-0\":\"\",\"_sipForTypo3Vars\":\"5db0480232184\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db048014ec40\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,0,3,'3df8446c08b8a14d150e53a509c1a7ac','2019-10-23 12:31:04'),(373,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d4a9cf0c577969efa91e89b910ad5f1d\",\"_h_checkbox-241\":\"\",\"text-241\":\"dzhudwsTrvj5KALvPCrAkN6SaAfPYztu\",\"number-241\":\"2086315779\",\"date-241\":\"01.01.2188\",\"datetime-241\":\"02.02.2188 01:08\",\"decimal-241\":\"12.84\",\"enum-241\":\"first option\",\"radio-241\":\"option a\",\"pill_text-241\":\"\",\"_sipForTypo3Vars\":\"5db04808db20b\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"241\",\"s\":\"5db048082610b\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=241\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,241,1,'3df8446c08b8a14d150e53a509c1a7ac','2019-10-23 12:31:06'),(374,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"3KmZ6Xsv40PPJ4iYp04bkTdygufUxG1n\",\"number-0\":\"2119231841\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"pill_text-0\":\"lA7wb8mtkoPT3IJcZfF67j9T9LbG6sd2\",\"_sipForTypo3Vars\":\"5db0480232184\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db048014ec40\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,0,3,'3df8446c08b8a14d150e53a509c1a7ac','2019-10-23 12:31:09'),(375,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"TGa9Wb1BG4zUQIPqYHzqAPp1OkD31jpP\",\"number-0\":\"5005496\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"pill_text-0\":\"\",\"_sipForTypo3Vars\":\"5db0483153776\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db0483066739\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:69.0) Gecko/20100101 Firefox/69.0',1007,0,3,'c90eb23746c9ac982140f10fcf863f74','2019-10-23 12:31:48'),(376,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"YwyvyAk31mk7eRDzyfPhZ9a4Pl525yrE\",\"number-0\":\"1591852554\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"pill_text-0\":\"\",\"_sipForTypo3Vars\":\"5db0483153776\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db0483066739\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:69.0) Gecko/20100101 Firefox/69.0',1007,0,3,'c90eb23746c9ac982140f10fcf863f74','2019-10-23 12:31:51'),(377,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"a1c41e63160395673e3b0a5bff0f66af\",\"_h_checkbox-244\":\"\",\"text-244\":\"5nHKwIBMaaI0jB9FpT5P0XOIPtZ0wKul\",\"number-244\":\"1945891195\",\"date-244\":\"01.01.2188\",\"datetime-244\":\"02.02.2188 01:08\",\"decimal-244\":\"12.84\",\"enum-244\":\"first option\",\"radio-244\":\"option a\",\"pill_text-244\":\"\",\"_sipForTypo3Vars\":\"5db04838e1293\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"244\",\"s\":\"5db04837bed6a\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=244\"}','192.168.133.203','','Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:69.0) Gecko/20100101 Firefox/69.0',1007,244,1,'c90eb23746c9ac982140f10fcf863f74','2019-10-23 12:31:53'),(378,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"lc4DhSRYesaf4CE5AQwbbS0N5gQDPjw1\",\"number-0\":\"1481648724\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"pill_text-0\":\"mNALTKQsWRRQejai0H2cY1x1jAgzHjqK\",\"_sipForTypo3Vars\":\"5db0483153776\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db0483066739\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:69.0) Gecko/20100101 Firefox/69.0',1007,0,3,'c90eb23746c9ac982140f10fcf863f74','2019-10-23 12:31:57'),(379,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"7aXpOJsATSszXfJSyBoO0IMl4bS0F1Vf\",\"number-0\":\"54452366\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"pill_text-0\":\"\",\"_sipForTypo3Vars\":\"5db0495daa249\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db0495ccbd72\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:69.0) Gecko/20100101 Firefox/69.0',1007,0,3,'6ceb9107484e4539805e7e56213a90f0','2019-10-23 12:36:48'),(380,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"jeSKO7WCzNZ7unKsrZpdZVzdRDzqkWy5\",\"number-0\":\"1613849868\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"pill_text-0\":\"\",\"_sipForTypo3Vars\":\"5db0495daa249\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db0495ccbd72\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:69.0) Gecko/20100101 Firefox/69.0',1007,0,3,'6ceb9107484e4539805e7e56213a90f0','2019-10-23 12:36:52'),(381,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"7fe559d4d92aca50dd1699717e3bcfa5\",\"_h_checkbox-247\":\"\",\"text-247\":\"VwtcjzFJ9JhEk6zQmEfFqrQYyjhlizdh\",\"number-247\":\"1091943773\",\"date-247\":\"01.01.2188\",\"datetime-247\":\"02.02.2188 01:08\",\"decimal-247\":\"12.84\",\"enum-247\":\"first option\",\"radio-247\":\"option a\",\"pill_text-247\":\"\",\"_sipForTypo3Vars\":\"5db0496577eb1\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"247\",\"s\":\"5db0496450d6e\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=247\"}','192.168.133.203','','Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:69.0) Gecko/20100101 Firefox/69.0',1007,247,1,'6ceb9107484e4539805e7e56213a90f0','2019-10-23 12:36:54'),(382,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"jjDzyRcnsC4YvLyk4Y6Ykc4WoeAI5Jro\",\"number-0\":\"1388348493\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"pill_text-0\":\"1uSfq9aglvFZ9wZ48VkfZOpyn8KXOz6H\",\"_sipForTypo3Vars\":\"5db0495daa249\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db0495ccbd72\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:69.0) Gecko/20100101 Firefox/69.0',1007,0,3,'6ceb9107484e4539805e7e56213a90f0','2019-10-23 12:36:58'),(383,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"7Y2z5WMoeJPAbyKKZzWotzkffOcFccUd\",\"number-0\":\"30528479\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"pill_text-0\":\"\",\"_sipForTypo3Vars\":\"5db049b365a35\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db049b273367\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:69.0) Gecko/20100101 Firefox/69.0',1007,0,3,'b9b64a3970aa755e6909af69d8d5c18c','2019-10-23 12:38:14'),(384,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"3DEWHqAWIvyuh2QaCdMRqam7lSHqbBdB\",\"number-0\":\"1865085697\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"pill_text-0\":\"\",\"_sipForTypo3Vars\":\"5db049b365a35\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db049b273367\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:69.0) Gecko/20100101 Firefox/69.0',1007,0,3,'b9b64a3970aa755e6909af69d8d5c18c','2019-10-23 12:38:17'),(385,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"47428ffa284b8546f7fcc86a0797e9ee\",\"_h_checkbox-250\":\"\",\"text-250\":\"WjyYrCCKIdrrB64VWGRiLkdIvwuoN5zy\",\"number-250\":\"652290381\",\"date-250\":\"01.01.2188\",\"datetime-250\":\"02.02.2188 01:08\",\"decimal-250\":\"12.84\",\"enum-250\":\"first option\",\"radio-250\":\"option a\",\"pill_text-250\":\"\",\"_sipForTypo3Vars\":\"5db049bb0a427\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"250\",\"s\":\"5db049b9db7ee\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=250\"}','192.168.133.203','','Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:69.0) Gecko/20100101 Firefox/69.0',1007,250,1,'b9b64a3970aa755e6909af69d8d5c18c','2019-10-23 12:38:20'),(386,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"cIAofwEIeod0NQcuGBuJSJ5cMqD6BGkC\",\"number-0\":\"816467383\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"pill_text-0\":\"EDgn4q1bKZwWaOkdkDQcb2lUNMJHC5kG\",\"_sipForTypo3Vars\":\"5db049b365a35\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db049b273367\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:69.0) Gecko/20100101 Firefox/69.0',1007,0,3,'b9b64a3970aa755e6909af69d8d5c18c','2019-10-23 12:38:24'),(387,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"1XjhysDTrZJnn2kgctexlwk11q0jjJTU\",\"number-0\":\"698006028\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"pill_text-0\":\"\",\"_sipForTypo3Vars\":\"5db049f00e2a7\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db049ef37543\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:69.0) Gecko/20100101 Firefox/69.0',1007,0,3,'530893c856e45ac7ffe7969064784083','2019-10-23 12:39:14'),(388,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"cVdOt9NaqSEmT5GCCAiuOHsbsKQotdLj\",\"number-0\":\"327205025\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"pill_text-0\":\"\",\"_sipForTypo3Vars\":\"5db049f00e2a7\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db049ef37543\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:69.0) Gecko/20100101 Firefox/69.0',1007,0,3,'530893c856e45ac7ffe7969064784083','2019-10-23 12:39:18'),(389,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"f1099a1b04f2535b84315b31c083b0fa\",\"_h_checkbox-253\":\"\",\"text-253\":\"pqo9JTERIqUQFJO1zB6Nb4Y5WYRkusNo\",\"number-253\":\"1510949029\",\"date-253\":\"01.01.2188\",\"datetime-253\":\"02.02.2188 01:08\",\"decimal-253\":\"12.84\",\"enum-253\":\"first option\",\"radio-253\":\"option a\",\"pill_text-253\":\"\",\"_sipForTypo3Vars\":\"5db049f7ee734\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"253\",\"s\":\"5db049f6dc09b\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=253\"}','192.168.133.203','','Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:69.0) Gecko/20100101 Firefox/69.0',1007,253,1,'530893c856e45ac7ffe7969064784083','2019-10-23 12:39:20'),(390,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"oOtCTgwZqtc2myOdxYoqosSbbWErUy2Q\",\"number-0\":\"191166121\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"pill_text-0\":\"amRuWPoMpdK9hcvcldwjAieJpzNiRr54\",\"_sipForTypo3Vars\":\"5db049f00e2a7\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db049ef37543\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:69.0) Gecko/20100101 Firefox/69.0',1007,0,3,'530893c856e45ac7ffe7969064784083','2019-10-23 12:39:24'),(391,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"RzAgOCpJxIG6uDkMUPtZPD46noTf9dym\",\"number-0\":\"811046006\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"pill_text-0\":\"\",\"_sipForTypo3Vars\":\"5db04ae24e271\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db04ae16a649\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:69.0) Gecko/20100101 Firefox/69.0',1007,0,3,'3cfe35f0da61d18471cb6b7ebe71033f','2019-10-23 12:43:17'),(392,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"agBwCRON7WKAAcoJOH61Heak7JPWw5mS\",\"number-0\":\"1544713354\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"pill_text-0\":\"\",\"_sipForTypo3Vars\":\"5db04ae24e271\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db04ae16a649\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:69.0) Gecko/20100101 Firefox/69.0',1007,0,3,'3cfe35f0da61d18471cb6b7ebe71033f','2019-10-23 12:43:20'),(393,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"3d89054ac60f0914216636546d8814df\",\"_h_checkbox-256\":\"\",\"text-256\":\"5F081p7PHGIf1K0bRWbscUUtQQepId2c\",\"number-256\":\"549482525\",\"date-256\":\"01.01.2188\",\"datetime-256\":\"02.02.2188 01:08\",\"decimal-256\":\"12.84\",\"enum-256\":\"first option\",\"radio-256\":\"option a\",\"pill_text-256\":\"\",\"_sipForTypo3Vars\":\"5db04ae9f2fc5\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"256\",\"s\":\"5db04ae8d7792\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=256\"}','192.168.133.203','','Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:69.0) Gecko/20100101 Firefox/69.0',1007,256,1,'3cfe35f0da61d18471cb6b7ebe71033f','2019-10-23 12:43:23'),(394,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"aSaG7ARR77pemLuN6nawNi1tCDL2oj7h\",\"number-0\":\"1027319726\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"pill_text-0\":\"OBaUzOVc4Wvz9kX78fwcviQxLm9kZOxg\",\"_sipForTypo3Vars\":\"5db04ae24e271\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db04ae16a649\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:69.0) Gecko/20100101 Firefox/69.0',1007,0,3,'3cfe35f0da61d18471cb6b7ebe71033f','2019-10-23 12:43:27'),(395,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"59wZMj2lfRHqhhYQMgJ5k86MeDSMpJwX\",\"number-0\":\"1930212611\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"pill_text-0\":\"\",\"_sipForTypo3Vars\":\"5db04b285a146\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db04b276cfdb\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:69.0) Gecko/20100101 Firefox/69.0',1007,0,3,'04cde52f4984207cab35ff5fc789bf78','2019-10-23 12:44:27'),(396,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"FWUKhq5jegOSNkT1qaFPuGQKoSW5QdoB\",\"number-0\":\"953050622\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"pill_text-0\":\"\",\"_sipForTypo3Vars\":\"5db04b285a146\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db04b276cfdb\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:69.0) Gecko/20100101 Firefox/69.0',1007,0,3,'04cde52f4984207cab35ff5fc789bf78','2019-10-23 12:44:30'),(397,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"87e97d84f885e4e7a5c494c092b16d24\",\"_h_checkbox-259\":\"\",\"text-259\":\"nsaYsppbR0Im6vsAdYeDKV5aYQG9AZlq\",\"number-259\":\"1652499148\",\"date-259\":\"01.01.2188\",\"datetime-259\":\"02.02.2188 01:08\",\"decimal-259\":\"12.84\",\"enum-259\":\"first option\",\"radio-259\":\"option a\",\"pill_text-259\":\"\",\"_sipForTypo3Vars\":\"5db04b2ff28a6\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"259\",\"s\":\"5db04b2ed79df\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=259\"}','192.168.133.203','','Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:69.0) Gecko/20100101 Firefox/69.0',1007,259,1,'04cde52f4984207cab35ff5fc789bf78','2019-10-23 12:44:32'),(398,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"JokPfIA8a2QrlPsVtzhfmZnrQuHZUG3p\",\"number-0\":\"1291051534\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"pill_text-0\":\"Giho8TSDou3VoZrFYUgOqT4rTpSwBCb3\",\"_sipForTypo3Vars\":\"5db04b285a146\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db04b276cfdb\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:69.0) Gecko/20100101 Firefox/69.0',1007,0,3,'04cde52f4984207cab35ff5fc789bf78','2019-10-23 12:44:36'),(399,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"ITVsgfpWZmSwT3AtDXYJMf0jEmAz282O\",\"number-0\":\"1320224832\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"pill_text-0\":\"\",\"_sipForTypo3Vars\":\"5db04baaf36f8\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db04baa273cf\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:69.0) Gecko/20100101 Firefox/69.0',1007,0,3,'ff03ef9ab616c4547b32ec2f1e4d0eec','2019-10-23 12:46:37'),(400,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"752m3JHXFq60Ttklcai6EAkSxnExGBSq\",\"number-0\":\"2059884612\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"pill_text-0\":\"\",\"_sipForTypo3Vars\":\"5db04baaf36f8\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db04baa273cf\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:69.0) Gecko/20100101 Firefox/69.0',1007,0,3,'ff03ef9ab616c4547b32ec2f1e4d0eec','2019-10-23 12:46:41'),(401,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"5fbd82e4e9e486db1b26e37fe5bf55df\",\"_h_checkbox-262\":\"\",\"text-262\":\"h1gASS1dmPf1lUx0DLy5kzTz0Of7JgOQ\",\"number-262\":\"1926999587\",\"date-262\":\"01.01.2188\",\"datetime-262\":\"02.02.2188 01:08\",\"decimal-262\":\"12.84\",\"enum-262\":\"first option\",\"radio-262\":\"option a\",\"pill_text-262\":\"\",\"_sipForTypo3Vars\":\"5db04bb303809\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"262\",\"s\":\"5db04bb1efaf3\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=262\"}','192.168.133.203','','Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:69.0) Gecko/20100101 Firefox/69.0',1007,262,1,'ff03ef9ab616c4547b32ec2f1e4d0eec','2019-10-23 12:46:44'),(402,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"X4IatGn3zpfxyHjDW6EfXbCTbrCSn1f1\",\"number-0\":\"1487517114\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"pill_text-0\":\"ET1i2ORBYf9Ird2bvWLFPRba7XQdBYwW\",\"_sipForTypo3Vars\":\"5db04baaf36f8\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db04baa273cf\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:69.0) Gecko/20100101 Firefox/69.0',1007,0,3,'ff03ef9ab616c4547b32ec2f1e4d0eec','2019-10-23 12:46:48'),(403,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"mFBW2kHlWuRc70HszxNwXRWMLDOuPALc\",\"number-0\":\"421871076\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"pill_text-0\":\"\",\"_sipForTypo3Vars\":\"5db04c00b5da7\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db04bffcaef3\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:69.0) Gecko/20100101 Firefox/69.0',1007,0,3,'d90451995f53e644efdcdeb123dd21e2','2019-10-23 12:48:03'),(404,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"PSPYFapicP8vrxOi4HdNNw1LwOAI55sn\",\"number-0\":\"1651351338\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"pill_text-0\":\"\",\"_sipForTypo3Vars\":\"5db04c00b5da7\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db04bffcaef3\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:69.0) Gecko/20100101 Firefox/69.0',1007,0,3,'d90451995f53e644efdcdeb123dd21e2','2019-10-23 12:48:07'),(405,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"2ca724952fa6051635ab4393d7cf2f80\",\"_h_checkbox-265\":\"\",\"text-265\":\"uk7jnbfghRlLZRwf6wNlZQXSAy3LbdiM\",\"number-265\":\"598039334\",\"date-265\":\"01.01.2188\",\"datetime-265\":\"02.02.2188 01:08\",\"decimal-265\":\"12.84\",\"enum-265\":\"first option\",\"radio-265\":\"option a\",\"pill_text-265\":\"\",\"_sipForTypo3Vars\":\"5db04c088beec\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"265\",\"s\":\"5db04c0769d36\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=265\"}','192.168.133.203','','Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:69.0) Gecko/20100101 Firefox/69.0',1007,265,1,'d90451995f53e644efdcdeb123dd21e2','2019-10-23 12:48:09'),(406,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"mCPN1arOes9UBwqxcfL4CelD9tDFTF0f\",\"number-0\":\"1387446138\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"pill_text-0\":\"74idTepv4g4nQRXTr7ks8Zi4wfd4TRrD\",\"_sipForTypo3Vars\":\"5db04c00b5da7\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db04bffcaef3\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:69.0) Gecko/20100101 Firefox/69.0',1007,0,3,'d90451995f53e644efdcdeb123dd21e2','2019-10-23 12:48:13'),(407,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"dTiPZCAtdJtD4Ggb6XPj2aaxJUXddNrf\",\"number-0\":\"456691499\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"pill_text-0\":\"\",\"_sipForTypo3Vars\":\"5db04cb183d17\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db04cb0a4be9\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,0,3,'6d3fe9eb3f7c1efdbf8ee03aae94b6ab','2019-10-23 12:51:00'),(408,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"use3mWlVHgcUbG3rERjDebWeueAtIBQu\",\"number-0\":\"1120271326\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"pill_text-0\":\"\",\"_sipForTypo3Vars\":\"5db04cb183d17\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db04cb0a4be9\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,0,3,'6d3fe9eb3f7c1efdbf8ee03aae94b6ab','2019-10-23 12:51:03'),(409,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"73e3fdfb544ee9aba4a1cfbe3fa5d4cb\",\"_h_checkbox-268\":\"\",\"text-268\":\"SMyPb204tactGlPmpBDP5O2Iy1Gs8a2o\",\"number-268\":\"1993578857\",\"date-268\":\"01.01.2188\",\"datetime-268\":\"02.02.2188 01:08\",\"decimal-268\":\"12.84\",\"enum-268\":\"first option\",\"radio-268\":\"option a\",\"pill_text-268\":\"\",\"_sipForTypo3Vars\":\"5db04cb887aef\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"268\",\"s\":\"5db04cb7b3104\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=268\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,268,1,'6d3fe9eb3f7c1efdbf8ee03aae94b6ab','2019-10-23 12:51:05'),(410,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"jiNK4c7bACHPL8zeg4ydt99Npt0ojfiU\",\"number-0\":\"1956943123\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"pill_text-0\":\"JJKhdKI08wTXtOj2rAEvvUT3nTLbyK5h\",\"_sipForTypo3Vars\":\"5db04cb183d17\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db04cb0a4be9\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,0,3,'6d3fe9eb3f7c1efdbf8ee03aae94b6ab','2019-10-23 12:51:09'),(411,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"PbOiK4fHm8QMcjsXNntKpH3G51e3pTwR\",\"number-0\":\"477380298\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"pill_text-0\":\"\",\"_sipForTypo3Vars\":\"5db0548f1a7a0\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db0548da413b\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,0,3,'85b44e7932f93ede380c63a61611c383','2019-10-23 13:24:33'),(412,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"WVxOXMKOI4C4bx6s9s2yBUOjb9vPyKzY\",\"number-0\":\"63698287\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"pill_text-0\":\"\",\"_sipForTypo3Vars\":\"5db0548f1a7a0\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db0548da413b\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,0,3,'85b44e7932f93ede380c63a61611c383','2019-10-23 13:24:37'),(413,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"40c4439af94851816e71c7c4cbe0369f\",\"_h_checkbox-271\":\"\",\"text-271\":\"xYan9RhroSstKQ5r9djVaOTCUMab5tex\",\"number-271\":\"1419058181\",\"date-271\":\"01.01.2188\",\"datetime-271\":\"02.02.2188 01:08\",\"decimal-271\":\"12.84\",\"enum-271\":\"first option\",\"radio-271\":\"option a\",\"pill_text-271\":\"\",\"_sipForTypo3Vars\":\"5db05495d36bd\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"271\",\"s\":\"5db054950dff7\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=271\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,271,1,'85b44e7932f93ede380c63a61611c383','2019-10-23 13:24:39'),(414,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"rjVbmlLm7GTRlUEeYH8r7w0IP6grHrhi\",\"number-0\":\"931039025\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"pill_text-0\":\"W5vGfipijQTk9XEKe5TnPvhpIgzY14Ag\",\"_sipForTypo3Vars\":\"5db0548f1a7a0\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db0548da413b\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,0,3,'85b44e7932f93ede380c63a61611c383','2019-10-23 13:24:42'),(415,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"t0QHnO80HNgax0MQJMFQKbdx2NRjUKaS\",\"number-0\":\"623738577\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"pill_text-0\":\"\",\"_sipForTypo3Vars\":\"5db05500b9355\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db054ffcf567\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.70 Safari/537.36',1007,0,3,'99d569a939531041dd9e25906e208604','2019-10-23 13:26:28'),(416,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"wVZfmZR18AqE48jZKir0xbZMYj1vcSrj\",\"number-0\":\"48833882\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"pill_text-0\":\"\",\"_sipForTypo3Vars\":\"5db05500b9355\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db054ffcf567\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.70 Safari/537.36',1007,0,3,'99d569a939531041dd9e25906e208604','2019-10-23 13:26:32'),(417,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"4a67fc9a75d154bdee2dd2654cad4350\",\"_h_checkbox-274\":\"\",\"text-274\":\"Zcjf1STsONmFqDsiYPhRY6vmP5xp4m23\",\"number-274\":\"284707224\",\"date-274\":\"01.01.2188\",\"datetime-274\":\"02.02.2188 01:08\",\"decimal-274\":\"12.84\",\"enum-274\":\"first option\",\"radio-274\":\"option a\",\"pill_text-274\":\"\",\"_sipForTypo3Vars\":\"5db05509ae446\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"274\",\"s\":\"5db0550886359\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=274\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.70 Safari/537.36',1007,274,1,'99d569a939531041dd9e25906e208604','2019-10-23 13:26:35'),(418,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"ZTv4XDMDmtoEpcuenJDCkaiM2eaPH2dl\",\"number-0\":\"676621979\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"pill_text-0\":\"00hzVI0Lh6TByBKgjdEsrQmBF9Sx6Cx3\",\"_sipForTypo3Vars\":\"5db05500b9355\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db054ffcf567\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.70 Safari/537.36',1007,0,3,'99d569a939531041dd9e25906e208604','2019-10-23 13:26:39'),(419,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"olKzgKNkSHBy1NE1mMT83DFnyTRczwlt\",\"number-0\":\"637183607\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"pill_text-0\":\"\",\"_sipForTypo3Vars\":\"5db0557f695c7\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db0557d91dc8\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.70 Safari/537.36',1007,0,3,'7d4bb65a6f4df6db9f6ff6a2d5e302dc','2019-10-23 13:28:34'),(420,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"CtgNWvkKR66wsd1z2lxvfxle8enlamBq\",\"number-0\":\"1273497644\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"pill_text-0\":\"\",\"_sipForTypo3Vars\":\"5db0557f695c7\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db0557d91dc8\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.70 Safari/537.36',1007,0,3,'7d4bb65a6f4df6db9f6ff6a2d5e302dc','2019-10-23 13:28:38'),(421,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d213fa6596872e5f6e8a9b0019bd12b3\",\"_h_checkbox-277\":\"\",\"text-277\":\"x8u8SenwDTeEYnYPxKKMFYwiOV4irZG5\",\"number-277\":\"1532994466\",\"date-277\":\"01.01.2188\",\"datetime-277\":\"02.02.2188 01:08\",\"decimal-277\":\"12.84\",\"enum-277\":\"first option\",\"radio-277\":\"option a\",\"pill_text-277\":\"\",\"_sipForTypo3Vars\":\"5db05587b650c\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"277\",\"s\":\"5db05586b021e\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=277\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.70 Safari/537.36',1007,277,1,'7d4bb65a6f4df6db9f6ff6a2d5e302dc','2019-10-23 13:28:41'),(422,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"hMm5pPHia4IcdoKhJ55MTTlvWILs7UfS\",\"number-0\":\"422569599\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"pill_text-0\":\"CHs0pSnKzMYvNTOXtVisbwidaBjfElpK\",\"_sipForTypo3Vars\":\"5db0557f695c7\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db0557d91dc8\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.70 Safari/537.36',1007,0,3,'7d4bb65a6f4df6db9f6ff6a2d5e302dc','2019-10-23 13:28:45'),(423,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"dUBnCjSGPCPvRVPVMKRg3Un7UqKFecrc\",\"number-0\":\"24907581\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"pill_text-0\":\"\",\"_sipForTypo3Vars\":\"5db0585b21ef5\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db0585a3f6db\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,0,3,'ec9ec585336926affae4de4b4447b840','2019-10-23 13:40:45'),(424,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"sjOU6zrTIKHcTUaI1qMc7PQXPF2bvp3n\",\"number-0\":\"603306645\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"pill_text-0\":\"\",\"_sipForTypo3Vars\":\"5db0585b21ef5\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db0585a3f6db\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,0,3,'ec9ec585336926affae4de4b4447b840','2019-10-23 13:40:48'),(425,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"84cd903ff69df13703ab8b0e1f4c8170\",\"_h_checkbox-280\":\"\",\"text-280\":\"sYA5Um3cDtUmRSKAJbVSNbZYTqKWHQhi\",\"number-280\":\"961050243\",\"date-280\":\"01.01.2188\",\"datetime-280\":\"02.02.2188 01:08\",\"decimal-280\":\"12.84\",\"enum-280\":\"first option\",\"radio-280\":\"option a\",\"pill_text-280\":\"\",\"_sipForTypo3Vars\":\"5db05861b7379\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"280\",\"s\":\"5db05860e0f9f\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=280\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,280,1,'ec9ec585336926affae4de4b4447b840','2019-10-23 13:40:50'),(426,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"hCtxLkRs9FdsunAdpxEbFdUygfGYu812\",\"number-0\":\"444678159\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"pill_text-0\":\"q0K9d5DXeVWu7Vlr9OBIfi23QFdUL1DC\",\"_sipForTypo3Vars\":\"5db0585b21ef5\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db0585a3f6db\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,0,3,'ec9ec585336926affae4de4b4447b840','2019-10-23 13:40:54'),(427,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"hlxXJWIWtPoDDiQlj7LuwIscY3xPYTy6\",\"number-0\":\"85670102\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"pill_text-0\":\"\",\"_sipForTypo3Vars\":\"5db05ab8c3343\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db05ab7e7e3b\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,0,3,'b754670329083738e4601a997405083c','2019-10-23 13:50:51'),(428,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"MbnIKfsn650jl8hvvEA18p5Sx7mb8gaf\",\"number-0\":\"1237521983\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"pill_text-0\":\"\",\"_sipForTypo3Vars\":\"5db05ab8c3343\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db05ab7e7e3b\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,0,3,'b754670329083738e4601a997405083c','2019-10-23 13:50:54'),(429,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"e93ed6bac14dd36d10c3cb750bb7b85c\",\"_h_checkbox-283\":\"\",\"text-283\":\"G0OMpeyVhQNVwDYjut56biX9P1GO0k9Q\",\"number-283\":\"281923819\",\"date-283\":\"01.01.2188\",\"datetime-283\":\"02.02.2188 01:08\",\"decimal-283\":\"12.84\",\"enum-283\":\"first option\",\"radio-283\":\"option a\",\"pill_text-283\":\"\",\"_sipForTypo3Vars\":\"5db05abf9fe60\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"283\",\"s\":\"5db05abec633b\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=283\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,283,1,'b754670329083738e4601a997405083c','2019-10-23 13:50:56'),(430,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"M7D2BLqL7w9LNWt0DIepHbfB8dxyH6E7\",\"number-0\":\"646267839\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"pill_text-0\":\"tFRMnpAjHU52kdByVfiTfY0p4bt2l7mz\",\"_sipForTypo3Vars\":\"5db05ab8c3343\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db05ab7e7e3b\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,0,3,'b754670329083738e4601a997405083c','2019-10-23 13:51:00'),(431,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"MuaYdy0LhHo9aF0lvleDS2Aa0Dc6Eorn\",\"number-0\":\"1541851221\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"pill_text-0\":\"\",\"_sipForTypo3Vars\":\"5db05adbe52ac\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db05adaeb81c\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,0,3,'668d95827781fb261ea32e14f9bcfb0a','2019-10-23 13:51:26'),(432,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"KlojRkCnLZA62FWYRZOWvMKlDql1Q5JP\",\"number-0\":\"865485452\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"pill_text-0\":\"\",\"_sipForTypo3Vars\":\"5db05adbe52ac\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db05adaeb81c\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,0,3,'668d95827781fb261ea32e14f9bcfb0a','2019-10-23 13:51:29'),(433,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"f0e39dd9c050b31c100ad16dcba321c9\",\"_h_checkbox-286\":\"\",\"text-286\":\"0LjNU4Sru0qgHzVvKCVXddC8nd1lvbdB\",\"number-286\":\"551849497\",\"date-286\":\"01.01.2188\",\"datetime-286\":\"02.02.2188 01:08\",\"decimal-286\":\"12.84\",\"enum-286\":\"first option\",\"radio-286\":\"option a\",\"pill_text-286\":\"\",\"_sipForTypo3Vars\":\"5db05ae299d1d\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"286\",\"s\":\"5db05ae1bd728\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=286\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,286,1,'668d95827781fb261ea32e14f9bcfb0a','2019-10-23 13:51:31'),(434,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"tJW6rzonLsCAt5W3SF5jX5lDbRaXUXje\",\"number-0\":\"1836778158\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"pill_text-0\":\"rNwaDrVZVU2eJIImCJBl16NtFalxfmgX\",\"_sipForTypo3Vars\":\"5db05adbe52ac\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db05adaeb81c\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,0,3,'668d95827781fb261ea32e14f9bcfb0a','2019-10-23 13:51:35'),(435,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"lLfI5YAQTW6NE11SywobE6CxXcgxHiH3\",\"number-0\":\"1005853806\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"pill_text-0\":\"\",\"_sipForTypo3Vars\":\"5db05afc2dbb5\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db05afb4c466\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,0,3,'4d367804e5dc78d1ca4465ca99b2a4d3','2019-10-23 13:51:58'),(436,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"3a1623AtEYIoN5hB8LiDmlvK66NoZOF3\",\"number-0\":\"668655155\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"pill_text-0\":\"\",\"_sipForTypo3Vars\":\"5db05b0ece671\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db05b0e0a5d0\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,0,3,'2e7b187528bd9cebcca671519e60899d','2019-10-23 13:52:17'),(437,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"pMCQV7ctIZtaQeQvdL17EofQ3nNiPoRa\",\"number-0\":\"1342807158\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"pill_text-0\":\"\",\"_sipForTypo3Vars\":\"5db05b0ece671\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db05b0e0a5d0\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,0,3,'2e7b187528bd9cebcca671519e60899d','2019-10-23 13:52:20'),(438,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d23fe2912dd8528c705393f5c03dcbdc\",\"_h_checkbox-290\":\"\",\"text-290\":\"bmOYVIuGHInlI1evdhFpmhpCg2KrqWUv\",\"number-290\":\"761654953\",\"date-290\":\"01.01.2188\",\"datetime-290\":\"02.02.2188 01:08\",\"decimal-290\":\"12.84\",\"enum-290\":\"first option\",\"radio-290\":\"option a\",\"pill_text-290\":\"\",\"_sipForTypo3Vars\":\"5db05b15b043c\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"290\",\"s\":\"5db05b14d849b\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=290\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,290,1,'2e7b187528bd9cebcca671519e60899d','2019-10-23 13:52:22'),(439,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"qCVai15PklpdP3okcTIZjf0BVMXHGMqF\",\"number-0\":\"1152435392\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"pill_text-0\":\"hG6rdVykKKWypwZuMsXiRzdT57JI5QvI\",\"_sipForTypo3Vars\":\"5db05b0ece671\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db05b0e0a5d0\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,0,3,'2e7b187528bd9cebcca671519e60899d','2019-10-23 13:52:26'),(440,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"rXtCH618TV5nmweC4EgiJSmF940bdoBQ\",\"number-0\":\"2025410779\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"pill_text-0\":\"\",\"_sipForTypo3Vars\":\"5db05b3364a60\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db05b328d2b9\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,0,3,'8d82ba183334ad790104573ddcdaf859','2019-10-23 13:52:54'),(441,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"JHIdG4ERS3vCJ34BOuwIrgvimEMqxAC1\",\"number-0\":\"918226204\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"pill_text-0\":\"\",\"_sipForTypo3Vars\":\"5db05b3364a60\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db05b328d2b9\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,0,3,'8d82ba183334ad790104573ddcdaf859','2019-10-23 13:52:57'),(442,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"8ea972ccfcbdaf22d2b09a256734e7dc\",\"_h_checkbox-293\":\"\",\"text-293\":\"frEH2oR14HaoHp1bN8JdDItZXCpvS58B\",\"number-293\":\"924828384\",\"date-293\":\"01.01.2188\",\"datetime-293\":\"02.02.2188 01:08\",\"decimal-293\":\"12.84\",\"enum-293\":\"first option\",\"radio-293\":\"option a\",\"pill_text-293\":\"\",\"_sipForTypo3Vars\":\"5db05b3a06e81\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"293\",\"s\":\"5db05b3943ab6\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=293\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,293,1,'8d82ba183334ad790104573ddcdaf859','2019-10-23 13:52:59'),(443,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"YHFkTOhNTCbgDzhlImRNj2YscvQrOr6I\",\"number-0\":\"967634309\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"pill_text-0\":\"BcYaMznCMvK6kBYMfG2JamnBf7LdRRuh\",\"_sipForTypo3Vars\":\"5db05b3364a60\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db05b328d2b9\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,0,3,'8d82ba183334ad790104573ddcdaf859','2019-10-23 13:53:02'),(444,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"GkcRiWwPxK1uncVmjBnv8oscKwBeLFmt\",\"number-0\":\"353203378\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"pill_text-0\":\"\",\"_sipForTypo3Vars\":\"5db05ba218208\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db05ba1460b4\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,0,3,'ed544bcb59a0c12da05ac8e377991805','2019-10-23 13:54:44'),(445,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"kdooOj3x8sGgy3V88rRyN2xXSLsKhKNq\",\"number-0\":\"418084880\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"pill_text-0\":\"\",\"_sipForTypo3Vars\":\"5db05ba218208\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db05ba1460b4\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,0,3,'ed544bcb59a0c12da05ac8e377991805','2019-10-23 13:54:48'),(446,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"42b322d8aa040597452e58c5757995a5\",\"_h_checkbox-296\":\"\",\"text-296\":\"oRSVPxxc241pnJdKhH5sUvlIKt5W8rYw\",\"number-296\":\"106747781\",\"date-296\":\"01.01.2188\",\"datetime-296\":\"02.02.2188 01:08\",\"decimal-296\":\"12.84\",\"enum-296\":\"first option\",\"radio-296\":\"option a\",\"pill_text-296\":\"\",\"_sipForTypo3Vars\":\"5db05ba90b7fa\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"296\",\"s\":\"5db05ba83eb7a\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=296\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,296,1,'ed544bcb59a0c12da05ac8e377991805','2019-10-23 13:54:50'),(447,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"R6HFzg9Cj6d2pzaQGjF4AmaQnhwMgS6I\",\"number-0\":\"1828461012\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"pill_text-0\":\"8h4hD06kHwWmdyYVVRZ3yFqqsJMIyKlw\",\"_sipForTypo3Vars\":\"5db05ba218208\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db05ba1460b4\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,0,3,'ed544bcb59a0c12da05ac8e377991805','2019-10-23 13:54:53'),(448,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"6tXh7UwC6VnsgvNSfYViFmgmAfi7OvWL\",\"number-0\":\"1666046812\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"pill_text-0\":\"\",\"_sipForTypo3Vars\":\"5db05c5f32108\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db05c5e63303\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,0,3,'e3c3c2fdb66e73f66c04ab1e8085fc15','2019-10-23 13:57:53'),(449,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"HsQEiNBYeyDz7QzUFgF63R4bzTjkPeg1\",\"number-0\":\"339174861\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"pill_text-0\":\"\",\"_sipForTypo3Vars\":\"5db05c5f32108\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db05c5e63303\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,0,3,'e3c3c2fdb66e73f66c04ab1e8085fc15','2019-10-23 13:57:57'),(450,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"dcRL8wNSoPvwwTuatYEvgRU95iGMSmwn\",\"number-0\":\"331235705\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"pill_text-0\":\"\",\"_sipForTypo3Vars\":\"5db05c6ca66a4\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db05c6bbb657\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,0,3,'b49b3559f3eeb6a0a1ece81f66f1c63c','2019-10-23 13:58:07'),(451,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"H0e25ckG6yuOIz3HcEuPvPAVrZhYVOaU\",\"number-0\":\"1296104496\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"pill_text-0\":\"\",\"_sipForTypo3Vars\":\"5db05c6ca66a4\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db05c6bbb657\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,0,3,'b49b3559f3eeb6a0a1ece81f66f1c63c','2019-10-23 13:58:10'),(452,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"80899ee98eea48f2fa356c514a9f2bde\",\"_h_checkbox-301\":\"\",\"text-301\":\"0eZkbf8Jpjay1A538q4GI88UexCaLsEw\",\"number-301\":\"1359676293\",\"date-301\":\"01.01.2188\",\"datetime-301\":\"02.02.2188 01:08\",\"decimal-301\":\"12.84\",\"enum-301\":\"first option\",\"radio-301\":\"option a\",\"pill_text-301\":\"\",\"_sipForTypo3Vars\":\"5db05c7363b2e\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"301\",\"s\":\"5db05c7298e57\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=301\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,301,1,'b49b3559f3eeb6a0a1ece81f66f1c63c','2019-10-23 13:58:12'),(453,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"jg5PGBlDOku3sEUGbVVOcAgLlpgGHRdM\",\"number-0\":\"181473879\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"pill_text-0\":\"Jc75EmIgTUTIDSuPHCjoLEgM7cutssZN\",\"_sipForTypo3Vars\":\"5db05c6ca66a4\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db05c6bbb657\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,0,3,'b49b3559f3eeb6a0a1ece81f66f1c63c','2019-10-23 13:58:16'),(454,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"knFbH5krxaDl0rniTHuLAouXpjjhDOTW\",\"number-0\":\"1008515406\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"pill_text-0\":\"\",\"_sipForTypo3Vars\":\"5db05d104b46c\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db05d0f72a50\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,0,3,'ec9fea668fd4e941805642b37f666df8','2019-10-23 14:00:51'),(455,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"0IWuFd4rFrcM0c3IoERVysdNrs35Ngj5\",\"number-0\":\"2017963326\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"pill_text-0\":\"\",\"_sipForTypo3Vars\":\"5db05d104b46c\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db05d0f72a50\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,0,3,'ec9fea668fd4e941805642b37f666df8','2019-10-23 14:00:54'),(456,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"6aa6c2a2c44d30130cb1420508404f06\",\"_h_checkbox-304\":\"\",\"text-304\":\"0ahIh0XKtv7rrXrrwZtErB0lx0TcTtLS\",\"number-304\":\"2124631082\",\"date-304\":\"01.01.2188\",\"datetime-304\":\"02.02.2188 01:08\",\"decimal-304\":\"12.84\",\"enum-304\":\"first option\",\"radio-304\":\"option a\",\"pill_text-304\":\"\",\"_sipForTypo3Vars\":\"5db05d1736235\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"304\",\"s\":\"5db05d16611fb\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=304\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,304,1,'ec9fea668fd4e941805642b37f666df8','2019-10-23 14:00:56'),(457,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"rWbm3M99N8FL93FdA6RFW3o25pqBsiAh\",\"number-0\":\"204900485\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"pill_text-0\":\"PB4fILSXrHJl3QAwjxkVD7ktJvGt60Aj\",\"_sipForTypo3Vars\":\"5db05d104b46c\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db05d0f72a50\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,0,3,'ec9fea668fd4e941805642b37f666df8','2019-10-23 14:01:00'),(458,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"rkgGox5BEs0KWfG3QjneatE53sXKIqF2\",\"number-0\":\"1553132682\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"pill_text-0\":\"\",\"_sipForTypo3Vars\":\"5db05d29b0a76\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db05d28cada0\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,0,3,'7b44ba356f0dde7b0b23baab8c011bc3','2019-10-23 14:01:16'),(459,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"dogPOYdjUo1g1wBnR4Q7kaZmrXmrovkM\",\"number-0\":\"2037195639\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"pill_text-0\":\"\",\"_sipForTypo3Vars\":\"5db05d29b0a76\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db05d28cada0\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,0,3,'7b44ba356f0dde7b0b23baab8c011bc3','2019-10-23 14:01:19'),(460,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"7d6d5060eafab995f3517da3d2fe5b14\",\"_h_checkbox-307\":\"\",\"text-307\":\"k1wGONA36aqoCqtnRgpTE5IEXtSha2mF\",\"number-307\":\"156462573\",\"date-307\":\"01.01.2188\",\"datetime-307\":\"02.02.2188 01:08\",\"decimal-307\":\"12.84\",\"enum-307\":\"first option\",\"radio-307\":\"option a\",\"pill_text-307\":\"\",\"_sipForTypo3Vars\":\"5db05d305e196\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"307\",\"s\":\"5db05d2f8c12e\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=307\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,307,1,'7b44ba356f0dde7b0b23baab8c011bc3','2019-10-23 14:01:21'),(461,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"hwIvas6ZxwoELQuHcdoJxOQRZi6STnEC\",\"number-0\":\"1146574025\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"pill_text-0\":\"tp32zM8OqtOzTp7SvVXwt0rdTsa8kyhC\",\"_sipForTypo3Vars\":\"5db05d29b0a76\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db05d28cada0\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,0,3,'7b44ba356f0dde7b0b23baab8c011bc3','2019-10-23 14:01:25'),(462,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"SJCtT8Lc0Xoj8RtNrW34DliWuUd0ic5Z\",\"number-0\":\"1141952867\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"pill_text-0\":\"\",\"_sipForTypo3Vars\":\"5db05d4cd954f\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db05d4c0b94c\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,0,3,'b1600070c31bb145d12db8664c82efb0','2019-10-23 14:01:51'),(463,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"jsyfyDKtOw6glyLmX0NF6XO6NB9AUv3Q\",\"number-0\":\"878822001\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"pill_text-0\":\"\",\"_sipForTypo3Vars\":\"5db05d4cd954f\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db05d4c0b94c\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,0,3,'b1600070c31bb145d12db8664c82efb0','2019-10-23 14:01:55'),(464,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"6f910f6b88dbb0792e37c6784c71e43c\",\"_h_checkbox-310\":\"\",\"text-310\":\"1zrOyUAXXrYiZQZeRMHwQbO2qxGhDG3g\",\"number-310\":\"904412135\",\"date-310\":\"01.01.2188\",\"datetime-310\":\"02.02.2188 01:08\",\"decimal-310\":\"12.84\",\"enum-310\":\"first option\",\"radio-310\":\"option a\",\"pill_text-310\":\"\",\"_sipForTypo3Vars\":\"5db05d53c496d\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"310\",\"s\":\"5db05d5309683\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=310\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,310,1,'b1600070c31bb145d12db8664c82efb0','2019-10-23 14:01:57'),(465,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"fBELDX4FabW7v3mQd7d4CNOtGBr5pT38\",\"number-0\":\"78059792\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"pill_text-0\":\"cNBh28IjWSFuKx7ssJrblLDiPwrMP0bb\",\"_sipForTypo3Vars\":\"5db05d4cd954f\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db05d4c0b94c\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,0,3,'b1600070c31bb145d12db8664c82efb0','2019-10-23 14:02:00'),(466,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"Vuc9glo2XxUm0vYjZoTr2tvHAgA8uMYo\",\"number-0\":\"389490332\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"pill_text-0\":\"\",\"_sipForTypo3Vars\":\"5db05e12dba71\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db05e1200f24\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,0,3,'76d6ffbbebf43e66e3509aabddbff5c7','2019-10-23 14:05:09'),(467,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"zeInwpQunRXpjT2CqC0kdwMcFb9RnVK4\",\"number-0\":\"88725389\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"pill_text-0\":\"\",\"_sipForTypo3Vars\":\"5db05e12dba71\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db05e1200f24\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,0,3,'76d6ffbbebf43e66e3509aabddbff5c7','2019-10-23 14:05:13'),(468,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"cea1d0ffd842338e487694ae30a4dff5\",\"_h_checkbox-313\":\"\",\"text-313\":\"sn9kdq7licFrgIFkDeNkNiF8W38OfiVG\",\"number-313\":\"1686702968\",\"date-313\":\"01.01.2188\",\"datetime-313\":\"02.02.2188 01:08\",\"decimal-313\":\"12.84\",\"enum-313\":\"first option\",\"radio-313\":\"option a\",\"pill_text-313\":\"\",\"_sipForTypo3Vars\":\"5db05e1a221ea\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"313\",\"s\":\"5db05e193d560\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=313\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,313,1,'76d6ffbbebf43e66e3509aabddbff5c7','2019-10-23 14:05:15'),(469,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"Qk1L0yAZ5youwnzBvrEMYsoICmYajV1z\",\"number-0\":\"1093218484\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"pill_text-0\":\"Fn3nqmfRsbdvsHZa8uxB0EEeCYu3Nbn0\",\"_sipForTypo3Vars\":\"5db05e12dba71\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db05e1200f24\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,0,3,'76d6ffbbebf43e66e3509aabddbff5c7','2019-10-23 14:05:19'),(470,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"wbThsLoXbv9PdqnEmMSOLxzHp2iqi2rB\",\"number-0\":\"2032556500\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"pill_text-0\":\"\",\"_sipForTypo3Vars\":\"5db05f7b5adba\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db05f7a6193b\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,0,3,'79b79ac368986e849d04ad73351cb3dc','2019-10-23 14:11:10'),(471,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"XCZCWe4F2fLUBJ0Ju1fatkMmG6RbWmAc\",\"number-0\":\"800480515\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"pill_text-0\":\"\",\"_sipForTypo3Vars\":\"5db05f7b5adba\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db05f7a6193b\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,0,3,'79b79ac368986e849d04ad73351cb3dc','2019-10-23 14:11:14'),(472,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"db780bf5b0e34af16bc0d13eed4e546e\",\"_h_checkbox-316\":\"\",\"text-316\":\"yO92pehaUkI9IyDgNh45NjfMG7LBdqPo\",\"number-316\":\"795462908\",\"date-316\":\"01.01.2188\",\"datetime-316\":\"02.02.2188 01:08\",\"decimal-316\":\"12.84\",\"enum-316\":\"first option\",\"radio-316\":\"option a\",\"pill_text-316\":\"\",\"_sipForTypo3Vars\":\"5db05f82ca273\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"316\",\"s\":\"5db05f820a068\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=316\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,316,1,'79b79ac368986e849d04ad73351cb3dc','2019-10-23 14:11:16'),(473,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"KHvVjyNwxFlKkUcOctEk7H8IerejWKfm\",\"number-0\":\"1129395866\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"pill_text-0\":\"URW6uGm2cLnRjJ0tvGIuu834WNOcqYQx\",\"_sipForTypo3Vars\":\"5db05f7b5adba\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db05f7a6193b\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,0,3,'79b79ac368986e849d04ad73351cb3dc','2019-10-23 14:11:20'),(474,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"ay8igjod4FyJstUyEVvtyto4Sbx89R5N\",\"number-0\":\"2079489941\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"pill_text-0\":\"\",\"_sipForTypo3Vars\":\"5db0638bc3417\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db0638adb527\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,0,3,'7a76ff89d15b8a2d6c2dbe22e39f2f83','2019-10-23 14:28:30'),(475,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"CCTXgZ6sM5qtA5WGDYtymj99fVEFKFPX\",\"number-0\":\"153210529\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"pill_text-0\":\"\",\"_sipForTypo3Vars\":\"5db0638bc3417\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db0638adb527\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,0,3,'7a76ff89d15b8a2d6c2dbe22e39f2f83','2019-10-23 14:28:33'),(476,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d39825235dedfe105f1183da3f8e1dbe\",\"_h_checkbox-319\":\"\",\"text-319\":\"QT0b5OFa6Seg1ad6Prjv8TxE5yw9gE20\",\"number-319\":\"1500919725\",\"date-319\":\"01.01.2188\",\"datetime-319\":\"02.02.2188 01:08\",\"decimal-319\":\"12.84\",\"enum-319\":\"first option\",\"radio-319\":\"option a\",\"pill_text-319\":\"\",\"_sipForTypo3Vars\":\"5db063928bd2b\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"319\",\"s\":\"5db06391bb3f4\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=319\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,319,1,'7a76ff89d15b8a2d6c2dbe22e39f2f83','2019-10-23 14:28:35'),(477,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"LA2GBrYXuJ5mdptrxo1MHUc7AP3Egwdz\",\"number-0\":\"1181430234\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"pill_text-0\":\"GqQQrqbK07EkNsdRrVx3a1gbhPhORvhO\",\"_sipForTypo3Vars\":\"5db0638bc3417\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db0638adb527\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,0,3,'7a76ff89d15b8a2d6c2dbe22e39f2f83','2019-10-23 14:28:39'),(478,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"1sREgKn57qtUEab1kjWuCftQ4SdzG2d1\",\"number-0\":\"809803834\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"pill_text-0\":\"\",\"_sipForTypo3Vars\":\"5db064284eb68\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db064276994c\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,0,3,'464c2dea7b04c385565212f2603f8999','2019-10-23 14:31:07'),(479,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"SNr9VoiP6Py7pMiturUZVm3tO7PzANtB\",\"number-0\":\"851459136\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"pill_text-0\":\"\",\"_sipForTypo3Vars\":\"5db064284eb68\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db064276994c\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,0,3,'464c2dea7b04c385565212f2603f8999','2019-10-23 14:31:10'),(480,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"fe2e34b9cd68cc10de629b253f567ae2\",\"_h_checkbox-322\":\"\",\"text-322\":\"cCqtWW3IVAmpcz6GTU5rOSaoXNwoOOck\",\"number-322\":\"545779913\",\"date-322\":\"01.01.2188\",\"datetime-322\":\"02.02.2188 01:08\",\"decimal-322\":\"12.84\",\"enum-322\":\"first option\",\"radio-322\":\"option a\",\"pill_text-322\":\"\",\"_sipForTypo3Vars\":\"5db0642f1e208\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"322\",\"s\":\"5db0642e4b1bc\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=322\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,322,1,'464c2dea7b04c385565212f2603f8999','2019-10-23 14:31:12'),(481,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"AwDpzxkhR2E7iQnVdq6EOdyCmh0Uz4Ti\",\"number-0\":\"1683870864\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"pill_text-0\":\"3qkjQkY4swrDNULxTiPhtWLPjwz4MN3E\",\"_sipForTypo3Vars\":\"5db064284eb68\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db064276994c\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,0,3,'464c2dea7b04c385565212f2603f8999','2019-10-23 14:31:15'),(482,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"FwYkoFtC6Umfc37zr0ntwpRuFGifdloH\",\"number-0\":\"1315005728\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"pill_text-0\":\"\",\"_sipForTypo3Vars\":\"5db0644ad3232\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db06449f0014\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,0,3,'0138e2c44a3684cdb4839e9c1c3ab282','2019-10-23 14:31:41'),(483,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"XcpGByYjIV7F1TN0RghnG4TKdRV1tYrB\",\"number-0\":\"741273883\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"pill_text-0\":\"\",\"_sipForTypo3Vars\":\"5db0644ad3232\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db06449f0014\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,0,3,'0138e2c44a3684cdb4839e9c1c3ab282','2019-10-23 14:31:45'),(484,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"584921c70209fea26d854c8584082aef\",\"_h_checkbox-325\":\"\",\"text-325\":\"0AgZEhGbyG3HhlgSJ4YdaZB495g3AIyo\",\"number-325\":\"1801096983\",\"date-325\":\"01.01.2188\",\"datetime-325\":\"02.02.2188 01:08\",\"decimal-325\":\"12.84\",\"enum-325\":\"first option\",\"radio-325\":\"option a\",\"pill_text-325\":\"\",\"_sipForTypo3Vars\":\"5db06451c6dba\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"325\",\"s\":\"5db064510717c\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=325\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,325,1,'0138e2c44a3684cdb4839e9c1c3ab282','2019-10-23 14:31:47'),(485,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"EMhiPMkpjGhPvQpGj6SJH6nL9LeVz3gv\",\"number-0\":\"636875914\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"pill_text-0\":\"1mOR6GAF1ivQQE1Qb9ewFVexcelJjBqb\",\"_sipForTypo3Vars\":\"5db0644ad3232\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db06449f0014\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,0,3,'0138e2c44a3684cdb4839e9c1c3ab282','2019-10-23 14:31:50'),(486,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"dqOGBqACujq7jkuz7nHizt4xt0rgheD7\",\"number-0\":\"1487893983\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"pill_text-0\":\"\",\"_sipForTypo3Vars\":\"5db0647243e68\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db064715c251\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,0,3,'53ba8c07b7486d82ddd9c1b0aece0049','2019-10-23 14:32:21'),(487,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"g23mvIMfA3hujrhkBU1jUFx2PujHWZB4\",\"number-0\":\"1584501262\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"pill_text-0\":\"\",\"_sipForTypo3Vars\":\"5db0647243e68\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db064715c251\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,0,3,'53ba8c07b7486d82ddd9c1b0aece0049','2019-10-23 14:32:24'),(488,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"f6e686ba167c7812c5b902ffae56a668\",\"_h_checkbox-328\":\"\",\"text-328\":\"lNwarRfAs4YnWRmZwV0Auv3LeBupdYG6\",\"number-328\":\"425911163\",\"date-328\":\"01.01.2188\",\"datetime-328\":\"02.02.2188 01:08\",\"decimal-328\":\"12.84\",\"enum-328\":\"first option\",\"radio-328\":\"option a\",\"pill_text-328\":\"\",\"_sipForTypo3Vars\":\"5db064792e4ea\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"328\",\"s\":\"5db064785dac6\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=328\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,328,1,'53ba8c07b7486d82ddd9c1b0aece0049','2019-10-23 14:32:26'),(489,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"i5drpry4XKFGJByLMYszIn2AVGSa2Zfz\",\"number-0\":\"668562824\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"pill_text-0\":\"SWt9oZXHmIak7p8NkWo70Joql5Y1E7pT\",\"_sipForTypo3Vars\":\"5db0647243e68\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db064715c251\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,0,3,'53ba8c07b7486d82ddd9c1b0aece0049','2019-10-23 14:32:30'),(490,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"7XfTchSPzfMo1untvOaYIV0kAQrJbQ1o\",\"number-0\":\"6372602\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"pill_text-0\":\"\",\"_sipForTypo3Vars\":\"5db064deba298\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db064dde00cf\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,0,3,'031755571862838a064e6e420c1a1c90','2019-10-23 14:34:09'),(491,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"RzWD2Aec7FZzmmvK2FIkYI1ucpjDXVeu\",\"number-0\":\"1826299995\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"pill_text-0\":\"\",\"_sipForTypo3Vars\":\"5db064deba298\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db064dde00cf\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,0,3,'031755571862838a064e6e420c1a1c90','2019-10-23 14:34:12'),(492,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"e2356dcf680a5ae519bb3de122b173c0\",\"_h_checkbox-331\":\"\",\"text-331\":\"fLJftCNaHnIvI61lhu9hFYezsPsiAG7i\",\"number-331\":\"1763683973\",\"date-331\":\"01.01.2188\",\"datetime-331\":\"02.02.2188 01:08\",\"decimal-331\":\"12.84\",\"enum-331\":\"first option\",\"radio-331\":\"option a\",\"pill_text-331\":\"\",\"_sipForTypo3Vars\":\"5db064e56a32c\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"331\",\"s\":\"5db064e49a5d7\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=331\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,331,1,'031755571862838a064e6e420c1a1c90','2019-10-23 14:34:14'),(493,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"0ZOdZDgnOdldlMwQF7pe5WdG6Er3knwl\",\"number-0\":\"1085881330\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"pill_text-0\":\"VFirrGTe8XGkcnSsnTh3sIKDSAPksDhs\",\"_sipForTypo3Vars\":\"5db064deba298\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db064dde00cf\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,0,3,'031755571862838a064e6e420c1a1c90','2019-10-23 14:34:18'),(494,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"PsE3pm6IZ0AMyN5qL4IoH6oHe7cnCuap\",\"number-0\":\"2010980646\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"pill_text-0\":\"\",\"_sipForTypo3Vars\":\"5db0652d208d5\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db0652c367b2\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,0,3,'7ba1eb5d305dcf13f90232cf84117aff','2019-10-23 14:35:27'),(495,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"8Pn6gg48tTkEefwUuJIMyuHTd7tUuXc5\",\"number-0\":\"1006714442\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"pill_text-0\":\"\",\"_sipForTypo3Vars\":\"5db0652d208d5\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db0652c367b2\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,0,3,'7ba1eb5d305dcf13f90232cf84117aff','2019-10-23 14:35:31'),(496,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"fac376efdfc35c0872e3548435e80c14\",\"_h_checkbox-334\":\"\",\"text-334\":\"gaOTvBu2xhFzHoumB3Rjy6co2xxwa8Do\",\"number-334\":\"272528337\",\"date-334\":\"01.01.2188\",\"datetime-334\":\"02.02.2188 01:08\",\"decimal-334\":\"12.84\",\"enum-334\":\"first option\",\"radio-334\":\"option a\",\"pill_text-334\":\"\",\"_sipForTypo3Vars\":\"5db065340faba\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"334\",\"s\":\"5db0653344729\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=334\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,334,1,'7ba1eb5d305dcf13f90232cf84117aff','2019-10-23 14:35:33'),(497,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"0CA4LXK4lg8MWCzLgpr0sDon9g97TLTE\",\"number-0\":\"1976140138\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"pill_text-0\":\"hLjdHsqfLTQcDyaiE0wM6wpVEaUe8xDk\",\"_sipForTypo3Vars\":\"5db0652d208d5\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db0652c367b2\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,0,3,'7ba1eb5d305dcf13f90232cf84117aff','2019-10-23 14:35:37'),(498,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"ivSUfFKRpLY03wUtGVL1TcF7P5roVepB\",\"number-0\":\"1189574519\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"pill_text-0\":\"\",\"_sipForTypo3Vars\":\"5db0654d788af\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db0654c94c51\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,0,3,'e3eb8fbfc3ee3d0a66611622f65afab5','2019-10-23 14:36:00'),(499,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"Lf8j4iTf0P346Pz4U88pJTFhzNTRIfk2\",\"number-0\":\"2035336478\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"pill_text-0\":\"\",\"_sipForTypo3Vars\":\"5db0654d788af\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db0654c94c51\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,0,3,'e3eb8fbfc3ee3d0a66611622f65afab5','2019-10-23 14:36:03'),(500,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"4420e2a1887428a4ad21b4c1f16cfc01\",\"_h_checkbox-337\":\"\",\"text-337\":\"u7GlmA1IMd8UNENLhD3YC7Qmwg03QhoS\",\"number-337\":\"58417984\",\"date-337\":\"01.01.2188\",\"datetime-337\":\"02.02.2188 01:08\",\"decimal-337\":\"12.84\",\"enum-337\":\"first option\",\"radio-337\":\"option a\",\"pill_text-337\":\"\",\"_sipForTypo3Vars\":\"5db0655469875\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"337\",\"s\":\"5db0655391c19\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=337\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,337,1,'e3eb8fbfc3ee3d0a66611622f65afab5','2019-10-23 14:36:05'),(501,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"8tnncSoolAP2GQasn1KOvBiJ9Su6gFPW\",\"number-0\":\"1713705568\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"pill_text-0\":\"iEvFsL1zUmwYEoZyT5JrNS0p88dvJPvr\",\"_sipForTypo3Vars\":\"5db0654d788af\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db0654c94c51\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,0,3,'e3eb8fbfc3ee3d0a66611622f65afab5','2019-10-23 14:36:09'),(502,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"qkhtirdc7C7atztkrSQzLpxwK8qycBIe\",\"number-0\":\"1517377957\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"pill_text-0\":\"\",\"_sipForTypo3Vars\":\"5db065a36031a\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db065a285b63\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,0,3,'be4fa09cbbb3c89ddfff5ef4f6299919','2019-10-23 14:37:26'),(503,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"HmlkA6PXHOoc37HnIAVJWlOjLCkJBWM4\",\"number-0\":\"1274198033\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"pill_text-0\":\"\",\"_sipForTypo3Vars\":\"5db065a36031a\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db065a285b63\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,0,3,'be4fa09cbbb3c89ddfff5ef4f6299919','2019-10-23 14:37:29'),(504,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"db80fe4a366ad9fc02c312ac0f47f819\",\"_h_checkbox-340\":\"\",\"text-340\":\"HY0naRfwmjPmwXeSE43uapIKtQP0qKQg\",\"number-340\":\"1021009945\",\"date-340\":\"01.01.2188\",\"datetime-340\":\"02.02.2188 01:08\",\"decimal-340\":\"12.84\",\"enum-340\":\"first option\",\"radio-340\":\"option a\",\"pill_text-340\":\"\",\"_sipForTypo3Vars\":\"5db065aa6fd54\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"340\",\"s\":\"5db065a996e55\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=340\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,340,1,'be4fa09cbbb3c89ddfff5ef4f6299919','2019-10-23 14:37:31'),(505,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"2O6vB8Fq9bJp1D15d3he3rdYtMaoUkwz\",\"number-0\":\"784544335\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"pill_text-0\":\"NtwoOFHdJFwubRp4VuMV6IHsuPseyhBg\",\"_sipForTypo3Vars\":\"5db065a36031a\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db065a285b63\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,0,3,'be4fa09cbbb3c89ddfff5ef4f6299919','2019-10-23 14:37:36'),(506,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"YUhUfPwXSQvxa9wKMTEcRMy1tS4HwniE\",\"number-0\":\"599145127\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"pill_text-0\":\"\",\"_sipForTypo3Vars\":\"5db065ba6dfd3\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db065b987260\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,0,3,'4e36be835a62768e336160c563af46ec','2019-10-23 14:37:49'),(507,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"eZJ0XlNzoFHgkFF8NDwKpAfU1rL427m0\",\"number-0\":\"1395422435\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"pill_text-0\":\"\",\"_sipForTypo3Vars\":\"5db065c3beec0\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db065c2ea2bb\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,0,3,'ecb23a53055b966d82a90e3a13e0d56e','2019-10-23 14:37:58'),(508,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"0Wn4e0Wcv2OzJYoY7h7wif6uDZBaEXmW\",\"number-0\":\"325206613\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"pill_text-0\":\"\",\"_sipForTypo3Vars\":\"5db065c3beec0\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db065c2ea2bb\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,0,3,'ecb23a53055b966d82a90e3a13e0d56e','2019-10-23 14:38:01'),(509,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"e0e7176cc92f13e233c7cf31ef9904eb\",\"_h_checkbox-344\":\"\",\"text-344\":\"CGfQShuxoazavzijn7OIO5F67iG328t7\",\"number-344\":\"779253276\",\"date-344\":\"01.01.2188\",\"datetime-344\":\"02.02.2188 01:08\",\"decimal-344\":\"12.84\",\"enum-344\":\"first option\",\"radio-344\":\"option a\",\"pill_text-344\":\"\",\"_sipForTypo3Vars\":\"5db065ca80ff8\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"344\",\"s\":\"5db065c994c7a\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=344\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,344,1,'ecb23a53055b966d82a90e3a13e0d56e','2019-10-23 14:38:03'),(510,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"Gz4xAvzFtcoU5FXafQEWGircuP4HSqRY\",\"number-0\":\"257847928\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"pill_text-0\":\"XsZZ1YxelLtJ26fFHq0s6mZNziBGkf1e\",\"_sipForTypo3Vars\":\"5db065c3beec0\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db065c2ea2bb\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,0,3,'ecb23a53055b966d82a90e3a13e0d56e','2019-10-23 14:38:07'),(511,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"CGe60G1KBB6BprcfO6WVCkRGTxjEjKFG\",\"number-0\":\"764977400\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"pill_text-0\":\"\",\"_sipForTypo3Vars\":\"5db0669f4930a\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db0669e61d4f\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,0,3,'d11440f0622af37056164e46ac764526','2019-10-23 14:41:37'),(512,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"Q7r2IDOFk8wxSZGse2jftFo8ExW7XkCL\",\"number-0\":\"1451619384\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"pill_text-0\":\"\",\"_sipForTypo3Vars\":\"5db0669f4930a\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db0669e61d4f\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,0,3,'d11440f0622af37056164e46ac764526','2019-10-23 14:41:41'),(513,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"c344056849d73618462045ee1604b006\",\"_h_checkbox-347\":\"\",\"text-347\":\"jOAKF8BzxtkTsp0eukAjWRw38DpMgasq\",\"number-347\":\"703008981\",\"date-347\":\"01.01.2188\",\"datetime-347\":\"02.02.2188 01:08\",\"decimal-347\":\"12.84\",\"enum-347\":\"first option\",\"radio-347\":\"option a\",\"pill_text-347\":\"\",\"_sipForTypo3Vars\":\"5db066a5e1b23\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"347\",\"s\":\"5db066a5286e9\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=347\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,347,1,'d11440f0622af37056164e46ac764526','2019-10-23 14:41:43'),(514,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"rBrPONXblIyEGk957q2VZyjsZFHUe3Lq\",\"number-0\":\"1927078925\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"pill_text-0\":\"VBx2rrBbL3Gy4S7E0ZTk5OAQn662pcN4\",\"_sipForTypo3Vars\":\"5db0669f4930a\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db0669e61d4f\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,0,3,'d11440f0622af37056164e46ac764526','2019-10-23 14:41:46'),(515,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"7xyV4jl9dV9gmleNrhXbJVvsTcLj0jjg\",\"number-0\":\"564882342\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"pill_text-0\":\"\",\"_sipForTypo3Vars\":\"5db066efb25b1\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db066eedb362\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,0,3,'1e76561890ebcc62423bf0bf75589925','2019-10-23 14:42:58'),(516,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"8Q3FaG7fldl2oKNkvetfCExXtzU5988C\",\"number-0\":\"87741520\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"pill_text-0\":\"\",\"_sipForTypo3Vars\":\"5db066efb25b1\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db066eedb362\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,0,3,'1e76561890ebcc62423bf0bf75589925','2019-10-23 14:43:01'),(517,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"67788041c9bdad3004f8dabe964f82f3\",\"_h_checkbox-350\":\"\",\"text-350\":\"bOEOXQYidt3hMnSb8ZU8pdIEKOUphl3g\",\"number-350\":\"1125740832\",\"date-350\":\"01.01.2188\",\"datetime-350\":\"02.02.2188 01:08\",\"decimal-350\":\"12.84\",\"enum-350\":\"first option\",\"radio-350\":\"option a\",\"pill_text-350\":\"\",\"_sipForTypo3Vars\":\"5db066f6b5006\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"350\",\"s\":\"5db066f5e83d2\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=350\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,350,1,'1e76561890ebcc62423bf0bf75589925','2019-10-23 14:43:03'),(518,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"Ph7LR5wssPttFVfPwe9zMtdbiU5syONF\",\"number-0\":\"1153716566\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"pill_text-0\":\"5daSEVKzl6h7m3M9BebWUPY0ffthvpAW\",\"_sipForTypo3Vars\":\"5db066efb25b1\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db066eedb362\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,0,3,'1e76561890ebcc62423bf0bf75589925','2019-10-23 14:43:07'),(519,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"0tXnw599gxRa8BqvQt1OYa6sQz9kOYRc\",\"number-0\":\"684182256\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"pill_text-0\":\"\",\"_sipForTypo3Vars\":\"5db067b3b5886\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db067b2d5913\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,0,3,'f2d9a67f505f82e79237f2a20f7ee8b4','2019-10-23 14:46:14'),(520,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"3TDeXR9Q4ArL3gpZM691InUbg9Nn6ujs\",\"number-0\":\"959125476\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"pill_text-0\":\"\",\"_sipForTypo3Vars\":\"5db067b3b5886\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db067b2d5913\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,0,3,'f2d9a67f505f82e79237f2a20f7ee8b4','2019-10-23 14:46:17'),(521,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"bd73e8129ac7997cc255446fb643c6aa\",\"_h_checkbox-353\":\"\",\"text-353\":\"UjBzu3z2ZFxDYiL1m07IpVSu0RgegyeC\",\"number-353\":\"524410520\",\"date-353\":\"01.01.2188\",\"datetime-353\":\"02.02.2188 01:08\",\"decimal-353\":\"12.84\",\"enum-353\":\"first option\",\"radio-353\":\"option a\",\"pill_text-353\":\"\",\"_sipForTypo3Vars\":\"5db067ba834c0\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"353\",\"s\":\"5db067b9af3f0\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=353\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,353,1,'f2d9a67f505f82e79237f2a20f7ee8b4','2019-10-23 14:46:19'),(522,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"IlvxNQlpZXmHmbOe90QfXij570O1NHy3\",\"number-0\":\"1121296783\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"pill_text-0\":\"naIwgvHjI9ypz0r9DIVtEBmeqPV0THrU\",\"_sipForTypo3Vars\":\"5db067b3b5886\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db067b2d5913\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,0,3,'f2d9a67f505f82e79237f2a20f7ee8b4','2019-10-23 14:46:23'),(523,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"EjOOmzcw0b1dKmOCCT6Nul5r1bRFhXtg\",\"number-0\":\"1423602619\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"pill_text-0\":\"\",\"_sipForTypo3Vars\":\"5db06a6e9feea\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db06a6d7d4ee\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,0,3,'a9d371fd5e969d3dcb8f3771fec33856','2019-10-23 14:57:53'),(524,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"zGonZzZBKpclWvSdvQ4OZ3RV8Jqj7TOt\",\"number-0\":\"2086175649\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"pill_text-0\":\"\",\"_sipForTypo3Vars\":\"5db06a6e9feea\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db06a6d7d4ee\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,0,3,'a9d371fd5e969d3dcb8f3771fec33856','2019-10-23 14:57:56'),(525,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"950599fd03895430de9c5b97fd9ea356\",\"_h_checkbox-356\":\"\",\"text-356\":\"RCWtZXJFinxDA0fPeRNO8DNiZWfLkVpO\",\"number-356\":\"876199615\",\"date-356\":\"01.01.2188\",\"datetime-356\":\"02.02.2188 01:08\",\"decimal-356\":\"12.84\",\"enum-356\":\"first option\",\"radio-356\":\"option a\",\"pill_text-356\":\"\",\"_sipForTypo3Vars\":\"5db06a75535e4\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"356\",\"s\":\"5db06a748b194\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=356\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,356,1,'a9d371fd5e969d3dcb8f3771fec33856','2019-10-23 14:57:58'),(526,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"37FFumRiFRkig6IY3Z72KCp8igrFeOrQ\",\"number-0\":\"1260884331\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"pill_text-0\":\"jA83c73viiVxRdTSCpAoubxbuV1nHdLm\",\"_sipForTypo3Vars\":\"5db06a6e9feea\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db06a6d7d4ee\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,0,3,'a9d371fd5e969d3dcb8f3771fec33856','2019-10-23 14:58:02'),(527,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"IHQtL5iYo6kndVwJfZ8CuafJLctsqTWx\",\"number-0\":\"1644436451\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"pill_text-0\":\"\",\"_sipForTypo3Vars\":\"5db1427d56270\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db1427c7807a\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,0,3,'48aeb8884743c7ea189e4c17e76a3c35','2019-10-24 06:19:44'),(528,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"PwENTtOjCoTXfLpOhShN8T6gdxnGWCYk\",\"number-0\":\"1537295900\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"pill_text-0\":\"\",\"_sipForTypo3Vars\":\"5db1427d56270\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db1427c7807a\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,0,3,'48aeb8884743c7ea189e4c17e76a3c35','2019-10-24 06:19:47'),(529,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"b1d4763165bb8eed577ad31f10749000\",\"_h_checkbox-359\":\"\",\"text-359\":\"xQ6OCV6oZq0iYHRyiTUPFE1hpNBw3XGC\",\"number-359\":\"823723482\",\"date-359\":\"01.01.2188\",\"datetime-359\":\"02.02.2188 01:08\",\"decimal-359\":\"12.84\",\"enum-359\":\"first option\",\"radio-359\":\"option a\",\"pill_text-359\":\"\",\"_sipForTypo3Vars\":\"5db1428405a62\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"359\",\"s\":\"5db14283436cc\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=359\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,359,1,'48aeb8884743c7ea189e4c17e76a3c35','2019-10-24 06:19:49'),(530,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"zSzD7SwQGxxdR0fBh13wvgm6WMYJih8s\",\"number-0\":\"1699903524\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"pill_text-0\":\"ROodm1qfCyGYRsmccP5p6AxiwCBasdgL\",\"_sipForTypo3Vars\":\"5db1427d56270\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db1427c7807a\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,0,3,'48aeb8884743c7ea189e4c17e76a3c35','2019-10-24 06:19:52'),(531,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"mslJcAvu49bz9U0HLgoAy3iTxzUNewtB\",\"number-0\":\"472706663\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"pill_text-0\":\"\",\"_sipForTypo3Vars\":\"5db147517098e\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db147508a037\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,0,3,'a702d25262c38799c09ce480c2c51779','2019-10-24 06:40:20'),(532,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"LkoacQluwHSggMvhBtrYXcUYN16jCUzu\",\"number-0\":\"1941054672\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"pill_text-0\":\"\",\"_sipForTypo3Vars\":\"5db147517098e\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db147508a037\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,0,3,'a702d25262c38799c09ce480c2c51779','2019-10-24 06:40:23'),(533,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"f3c26af9c6b0ec509f07d518d4a8ad19\",\"_h_checkbox-362\":\"\",\"text-362\":\"BTXJG1lEp5DYISVah29jr62nIFECH5Ww\",\"number-362\":\"1908767998\",\"date-362\":\"01.01.2188\",\"datetime-362\":\"02.02.2188 01:08\",\"decimal-362\":\"12.84\",\"enum-362\":\"first option\",\"radio-362\":\"option a\",\"pill_text-362\":\"\",\"_sipForTypo3Vars\":\"5db1475890f95\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"362\",\"s\":\"5db14757c7975\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=362\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,362,1,'a702d25262c38799c09ce480c2c51779','2019-10-24 06:40:25'),(534,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"2UP2ZxLoUpQJtyuWIf4weszkVp5oU5N9\",\"number-0\":\"149889065\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"pill_text-0\":\"DVnSw1qXoNMAwqljVfiPvRtuD3J1OcVs\",\"_sipForTypo3Vars\":\"5db147517098e\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db147508a037\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,0,3,'a702d25262c38799c09ce480c2c51779','2019-10-24 06:40:29'),(535,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"enabled-0\":\"yes\",\"dynamicUpdate-0\":\"no\",\"mode-0\":\"show\",\"class-0\":\"native\",\"_h_subrecordOption-0\":\"\",\"encode-0\":\"specialchar\",\"checkType-0\":\"auto\",\"labelAlign-0\":\"default\",\"_h_rowLabelInputNote-0\":\"\",\"feIdContainer-0\":\"505\",\"name-0\":\"file\",\"label-0\":\"File Upload\",\"modeSql-0\":\"\",\"type-0\":\"upload\",\"parameterLanguageA-0\":\"\",\"parameterLanguageB-0\":\"\",\"parameterLanguageC-0\":\"\",\"parameterLanguageD-0\":\"\",\"checkPattern-0\":\"\",\"ord-0\":\"120\",\"adminNote-0\":\"\",\"size-0\":\"\",\"bsLabelColumns-0\":\"\",\"bsInputColumns-0\":\"\",\"bsNoteColumns-0\":\"\",\"_0_rowLabelInputNote-0\":\"row\",\"_1_rowLabelInputNote-0\":\"label\",\"_2_rowLabelInputNote-0\":\"\\/label\",\"_3_rowLabelInputNote-0\":\"input\",\"_4_rowLabelInputNote-0\":\"\\/input\",\"_5_rowLabelInputNote-0\":\"note\",\"_6_rowLabelInputNote-0\":\"\\/note\",\"_7_rowLabelInputNote-0\":\"\\/row\",\"maxLength-0\":\"\",\"note-0\":\"\",\"tooltip-0\":\"\",\"placeholder-0\":\"\",\"value-0\":\"\",\"sql1-0\":\"\",\"parameter-0\":\"accept = application\\/pdf,text\\/plain\\r\\n\\r\\nfileDestination={{ SELECT CONCAT(\'fileadmin\\/{{id:R}}_{{filename}}\') }}\\r\\n\\r\\ndownloadButton = t:{{SELECT SUBSTRING(\'{{file:R}}\', LOCATE(\'_\', \'{{file:R}}\')+1) }}\\r\\nmaxFileSize = \'1M\'\",\"_sipForTypo3Vars\":\"5db144e6d8e73\"}','{\"__dbIndexData\":\"1\",\"form\":\"formElement\",\"formId\":\"1007\",\"r\":\"0\",\"s\":\"5db1450975530\",\"urlparam\":\"__dbIndexData=1&form=formElement&formId=1007&r=0\"}','192.168.133.204','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36',2,0,1,'a72e32ab22455538aad79b6fe67a8bab','2019-10-24 06:41:59'),(536,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"sdf\",\"number-0\":\"4\",\"date-0\":\"04.08.92\",\"datetime-0\":\"02.02.92 02:00\",\"decimal-0\":\"0.2\",\"enum-0\":\"second option\",\"radio-0\":\"option a\",\"pill_text-0\":\"\",\"file-0\":\"5db147bc54c02\",\"_sipForTypo3Vars\":\"5db1450703e05\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db145059e47b\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.204','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36',1007,0,3,'a72e32ab22455538aad79b6fe67a8bab','2019-10-24 06:42:51'),(537,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"niKHGoRYIyurvnfPTmR9Eiwulhk6FuKt\",\"number-0\":\"1873697532\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"pill_text-0\":\"\",\"file-0\":\"5db1482d6e4bc\",\"_sipForTypo3Vars\":\"5db1482ca1700\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db1482bce316\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,0,3,'61339264cc5c12e7cd8c739d87dd5219','2019-10-24 06:43:59'),(538,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"CBO47S5YWfC5VeKaD94GsZ5hNwLq60Bw\",\"number-0\":\"1777956534\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"pill_text-0\":\"\",\"file-0\":\"5db14830ab109\",\"_sipForTypo3Vars\":\"5db1482ca1700\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db1482bce316\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,0,3,'61339264cc5c12e7cd8c739d87dd5219','2019-10-24 06:44:02'),(539,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"c14e71f508ea05a8812866cf50f6120b\",\"_h_checkbox-366\":\"\",\"text-366\":\"EG0jid3UwrVsUMCU4bhj0pKAoPr0jA47\",\"number-366\":\"607159708\",\"date-366\":\"01.01.2188\",\"datetime-366\":\"02.02.2188 01:08\",\"decimal-366\":\"12.84\",\"enum-366\":\"first option\",\"radio-366\":\"option a\",\"pill_text-366\":\"\",\"file-366\":\"5db1483368849\",\"_sipForTypo3Vars\":\"5db1483368912\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"366\",\"s\":\"5db1483293078\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=366\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,366,1,'61339264cc5c12e7cd8c739d87dd5219','2019-10-24 06:44:04'),(540,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"MoNAUcvaG8qDMBapsCfOxnWWuzoDucVd\",\"number-0\":\"616580660\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"pill_text-0\":\"Pk467lOSzTnzByM8KE5vs7PtdGIoCbEx\",\"file-0\":\"5db14835bde23\",\"_sipForTypo3Vars\":\"5db1482ca1700\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db1482bce316\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,0,3,'61339264cc5c12e7cd8c739d87dd5219','2019-10-24 06:44:08'),(541,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"3re4sMv1Mvb1Wvm79AqlC3qaxT47nNVt\",\"number-0\":\"851885309\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"pill_text-0\":\"\",\"file-0\":\"5db149d683a44\",\"_sipForTypo3Vars\":\"5db149d55f288\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db149d45ed8d\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.70 Safari/537.36',1007,0,3,'f148e6a69fed05b730037f8e5a078fec','2019-10-24 06:51:04'),(542,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"OcFpRb0BSWAXqrJi0P7rZJI8a6rTBUhY\",\"number-0\":\"431895282\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"pill_text-0\":\"\",\"file-0\":\"5db149dad8fe4\",\"_sipForTypo3Vars\":\"5db149d55f288\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db149d45ed8d\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.70 Safari/537.36',1007,0,3,'f148e6a69fed05b730037f8e5a078fec','2019-10-24 06:51:08'),(543,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"ee5d4ed3fb0f1ffbcffd05406bae7614\",\"_h_checkbox-369\":\"\",\"text-369\":\"KRUuqHPitzs9PUH1c2WTacoT8YUkTFJG\",\"number-369\":\"1195338690\",\"date-369\":\"01.01.2188\",\"datetime-369\":\"02.02.2188 01:08\",\"decimal-369\":\"12.84\",\"enum-369\":\"first option\",\"radio-369\":\"option a\",\"pill_text-369\":\"\",\"file-369\":\"5db149de348ab\",\"_sipForTypo3Vars\":\"5db149de34996\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"369\",\"s\":\"5db149dcdf9d5\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=369\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.70 Safari/537.36',1007,369,1,'f148e6a69fed05b730037f8e5a078fec','2019-10-24 06:51:11'),(544,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"GTBFniTTLSP5XaQXHElLUt0AS3bdK8ov\",\"number-0\":\"1541131116\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"pill_text-0\":\"6c37WlLhTHmHbyB2PJnYuk7tyUE5CoTR\",\"file-0\":\"5db149e196813\",\"_sipForTypo3Vars\":\"5db149d55f288\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db149d45ed8d\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.70 Safari/537.36',1007,0,3,'f148e6a69fed05b730037f8e5a078fec','2019-10-24 06:51:19'),(545,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"9bae8c4a02b13aa64e5a517411512728\",\"_h_checkbox-364\":\"\",\"text-364\":\"sdf\",\"number-364\":\"4\",\"date-364\":\"04.08.1992\",\"datetime-364\":\"02.02.1992 02:00\",\"decimal-364\":\"0.20\",\"enum-364\":\"second option\",\"radio-364\":\"option a\",\"pill_text-364\":\"\",\"file-364\":\"5db14a49130a2\",\"_sipForTypo3Vars\":\"5db144e6d8e73\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"364\",\"s\":\"5db147eb2f042\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=364\"}','192.168.133.204','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36',1007,364,1,'a72e32ab22455538aad79b6fe67a8bab','2019-10-24 06:53:04'),(546,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"c9914a4a60fc65754909ed3de0c15907\",\"enabled-507\":\"yes\",\"dynamicUpdate-507\":\"no\",\"mode-507\":\"show\",\"class-507\":\"native\",\"_h_subrecordOption-507\":\"\",\"encode-507\":\"specialchar\",\"checkType-507\":\"auto\",\"labelAlign-507\":\"default\",\"_h_rowLabelInputNote-507\":\"\",\"feIdContainer-507\":\"505\",\"name-507\":\"file\",\"label-507\":\"File Upload\",\"modeSql-507\":\"\",\"type-507\":\"upload\",\"parameterLanguageA-507\":\"\",\"parameterLanguageB-507\":\"\",\"parameterLanguageC-507\":\"\",\"parameterLanguageD-507\":\"\",\"checkPattern-507\":\"\",\"ord-507\":\"120\",\"adminNote-507\":\"\",\"size-507\":\"\",\"bsLabelColumns-507\":\"\",\"bsInputColumns-507\":\"\",\"bsNoteColumns-507\":\"\",\"_0_rowLabelInputNote-507\":\"row\",\"_1_rowLabelInputNote-507\":\"label\",\"_2_rowLabelInputNote-507\":\"\\/label\",\"_3_rowLabelInputNote-507\":\"input\",\"_4_rowLabelInputNote-507\":\"\\/input\",\"_5_rowLabelInputNote-507\":\"note\",\"_6_rowLabelInputNote-507\":\"\\/note\",\"_7_rowLabelInputNote-507\":\"\\/row\",\"maxLength-507\":\"\",\"note-507\":\"\",\"tooltip-507\":\"\",\"placeholder-507\":\"\",\"value-507\":\"\",\"sql1-507\":\"\",\"parameter-507\":\"accept = application\\/pdf,text\\/plain\\r\\n\\r\\nfileDestination={{ SELECT CONCAT(\'fileadmin\\/{{id:R}}_{{filename}}\') }}\\r\\n\\r\\ndownloadButton = t:{{SELECT SUBSTRING(\'{{file:R}}\', LOCATE(\'_\', \'{{file:R}}\')+1) }}\\r\\nmaxFileSize = \'10K\'\",\"_sipForTypo3Vars\":\"5db144e6d8e73\"}','{\"__dbIndexData\":\"1\",\"form\":\"formElement\",\"formId\":\"1007\",\"r\":\"507\",\"s\":\"5db147b766d96\",\"urlparam\":\"__dbIndexData=1&form=formElement&formId=1007&r=507\"}','192.168.133.204','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36',2,507,1,'a72e32ab22455538aad79b6fe67a8bab','2019-10-24 06:59:09'),(547,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"PiPwa2iBQo5CyDVJlayIDH7V2hvWA60S\",\"number-0\":\"1285408995\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"pill_text-0\":\"\",\"file-0\":\"5db15584bf8bd\",\"_sipForTypo3Vars\":\"5db15583f365e\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db1558308ade\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,0,3,'5d452627c93fb2afd08fbab58fe96aae','2019-10-24 07:40:54'),(548,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"WQ9NH7o17brlFU5L707vWVkUEJKYOwVO\",\"number-0\":\"513994507\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"pill_text-0\":\"\",\"file-0\":\"5db155880fd9f\",\"_sipForTypo3Vars\":\"5db15583f365e\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db1558308ade\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,0,3,'5d452627c93fb2afd08fbab58fe96aae','2019-10-24 07:40:57'),(549,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"7793fde640d2b544f04d6519fabe3379\",\"_h_checkbox-372\":\"\",\"text-372\":\"nJLbu7S4rBGIPe19iw605CQ4w6S5LhcB\",\"number-372\":\"2131619580\",\"date-372\":\"01.01.2188\",\"datetime-372\":\"02.02.2188 01:08\",\"decimal-372\":\"12.84\",\"enum-372\":\"first option\",\"radio-372\":\"option a\",\"pill_text-372\":\"\",\"file-372\":\"5db1558ab1194\",\"_sipForTypo3Vars\":\"5db1558ab1283\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"372\",\"s\":\"5db15589db684\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=372\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,372,1,'5d452627c93fb2afd08fbab58fe96aae','2019-10-24 07:40:59'),(550,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"uv7hlwRsfDIuylpe5F1X3oN5YBZL9mg9\",\"number-0\":\"1397998224\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"pill_text-0\":\"ioKG33NNoUK89CxDD5mzbSoHVy36qYct\",\"file-0\":\"5db1558d0dd55\",\"_sipForTypo3Vars\":\"5db15583f365e\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db1558308ade\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,0,3,'5d452627c93fb2afd08fbab58fe96aae','2019-10-24 07:41:03'),(551,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"xFDDFnbM6Fmhw3uByHnr5yByPJUHYmaa\",\"number-0\":\"1145923369\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"pill_text-0\":\"\",\"file-0\":\"5db155c5b80c5\",\"_sipForTypo3Vars\":\"5db155c4e5dce\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db155c41916a\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,0,3,'179cff500fef23c69bb3dd1a30df0cb4','2019-10-24 07:41:59'),(552,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"oD5a1WivmYEGIoTdRo755wqiI3CLM4Dw\",\"number-0\":\"1435460461\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"pill_text-0\":\"\",\"file-0\":\"5db155c9059bd\",\"_sipForTypo3Vars\":\"5db155c4e5dce\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db155c41916a\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,0,3,'179cff500fef23c69bb3dd1a30df0cb4','2019-10-24 07:42:02'),(553,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d0b50bdd87cff2a00f9609d9531cf98a\",\"_h_checkbox-375\":\"\",\"text-375\":\"pA9W4Tizwz0vcULc6yxoah1UWySYffKQ\",\"number-375\":\"1630966403\",\"date-375\":\"01.01.2188\",\"datetime-375\":\"02.02.2188 01:08\",\"decimal-375\":\"12.84\",\"enum-375\":\"first option\",\"radio-375\":\"option a\",\"pill_text-375\":\"\",\"file-375\":\"5db155cba77b2\",\"_sipForTypo3Vars\":\"5db155cba7898\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"375\",\"s\":\"5db155cadf5d7\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=375\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,375,1,'179cff500fef23c69bb3dd1a30df0cb4','2019-10-24 07:42:04'),(554,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"esy6hXVoSZJlxGJqmI2PLDt2QFbrMLqF\",\"number-0\":\"755927980\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"pill_text-0\":\"5FR1DlOJ3fPKhKIdrbicUmSwGaR5UuOe\",\"file-0\":\"5db155ce01891\",\"_sipForTypo3Vars\":\"5db155c4e5dce\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db155c41916a\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,0,3,'179cff500fef23c69bb3dd1a30df0cb4','2019-10-24 07:42:08'),(555,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"FEJ0oEio9NlKLMoruyCl8GNHPF2rlOch\",\"number-0\":\"955633741\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"pill_text-0\":\"Dr0FN89LRo4MHhb9tfTxAxyNg0O1MYyo\",\"file-0\":\"5db155d7b18ba\",\"_sipForTypo3Vars\":\"5db155c4e5dce\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db155c41916a\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,0,3,'179cff500fef23c69bb3dd1a30df0cb4','2019-10-24 07:42:18'),(556,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"vz4XYc79SagPBDhoiFKhQxU8JxPOHy3y\",\"number-0\":\"1039322877\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"pill_text-0\":\"\",\"file-0\":\"5db1567e1ee64\",\"_sipForTypo3Vars\":\"5db1567d40bd7\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db1567c51712\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,0,3,'f142bbd6c6ffd8619e37dee3c86d9387','2019-10-24 07:45:03'),(557,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"UgV1IOK4vwIhnguqeH5PVxDOetV2MWeD\",\"number-0\":\"804464148\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"pill_text-0\":\"\",\"file-0\":\"5db1568179c6c\",\"_sipForTypo3Vars\":\"5db1567d40bd7\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db1567c51712\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,0,3,'f142bbd6c6ffd8619e37dee3c86d9387','2019-10-24 07:45:07'),(558,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"a4c45535e56b1df67cfc4aced3736658\",\"_h_checkbox-379\":\"\",\"text-379\":\"hN0LLsSQNCqTdso81qrsWP50CuFAU9np\",\"number-379\":\"1296753725\",\"date-379\":\"01.01.2188\",\"datetime-379\":\"02.02.2188 01:08\",\"decimal-379\":\"12.84\",\"enum-379\":\"first option\",\"radio-379\":\"option a\",\"pill_text-379\":\"\",\"file-379\":\"5db1568436f69\",\"_sipForTypo3Vars\":\"5db1568437046\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"379\",\"s\":\"5db156835d16f\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=379\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,379,1,'f142bbd6c6ffd8619e37dee3c86d9387','2019-10-24 07:45:09'),(559,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"w5qyAXxzadWApHHEtjktVBKJK5fw5i63\",\"number-0\":\"1238472704\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"pill_text-0\":\"hwnglVJM1Ixp3wjF47tCilLvxHrYACj8\",\"file-0\":\"5db15686a3685\",\"_sipForTypo3Vars\":\"5db1567d40bd7\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db1567c51712\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,0,3,'f142bbd6c6ffd8619e37dee3c86d9387','2019-10-24 07:45:13'),(560,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"lldn5IABAEo5b0vmJnhUmC1HYTOuhaSN\",\"number-0\":\"553277610\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"pill_text-0\":\"\",\"file-0\":\"5db156906653a\",\"_sipForTypo3Vars\":\"5db1567d40bd7\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db1567c51712\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,0,3,'f142bbd6c6ffd8619e37dee3c86d9387','2019-10-24 07:45:22'),(561,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"F6O1XporkkLxRGqU3cYTPim51kOFMkbE\",\"number-0\":\"657384310\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"pill_text-0\":\"\",\"file-0\":\"5db156b27261c\",\"_sipForTypo3Vars\":\"5db156b124c00\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db156afe98cf\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.70 Safari/537.36',1007,0,3,'de8070af5ffffa0974e72490ab7bd9c4','2019-10-24 07:45:56'),(562,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"KQ5d5Nc7JG7qZnGBTBQ87gy5KPH6sMfu\",\"number-0\":\"855402690\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"pill_text-0\":\"\",\"file-0\":\"5db156b6c649d\",\"_sipForTypo3Vars\":\"5db156b124c00\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db156afe98cf\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.70 Safari/537.36',1007,0,3,'de8070af5ffffa0974e72490ab7bd9c4','2019-10-24 07:46:00'),(563,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"72dace1b39929bbeb43ea3734edd2841\",\"_h_checkbox-383\":\"\",\"text-383\":\"HDgzh7Vgn785GcmR5lJewPcGo3sNA4PE\",\"number-383\":\"367367233\",\"date-383\":\"01.01.2188\",\"datetime-383\":\"02.02.2188 01:08\",\"decimal-383\":\"12.84\",\"enum-383\":\"first option\",\"radio-383\":\"option a\",\"pill_text-383\":\"\",\"file-383\":\"5db156ba2c161\",\"_sipForTypo3Vars\":\"5db156ba2c237\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"383\",\"s\":\"5db156b8bca8c\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=383\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.70 Safari/537.36',1007,383,1,'de8070af5ffffa0974e72490ab7bd9c4','2019-10-24 07:46:03'),(564,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"3VqajuO0jGdAS6ynTr0hZh08XIQp9r0g\",\"number-0\":\"1235498310\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"pill_text-0\":\"CWE6wLiaWTjZIwx9zzQjbh0NoZXtyXGl\",\"file-0\":\"5db156bd28570\",\"_sipForTypo3Vars\":\"5db156b124c00\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db156afe98cf\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.70 Safari/537.36',1007,0,3,'de8070af5ffffa0974e72490ab7bd9c4','2019-10-24 07:46:07'),(565,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"lMgmhGoCirgLqiYeY5I4mwM5KjNGZG3h\",\"number-0\":\"60447130\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"pill_text-0\":\"\",\"file-0\":\"5db156c906b3a\",\"_sipForTypo3Vars\":\"5db156b124c00\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db156afe98cf\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.70 Safari/537.36',1007,0,3,'de8070af5ffffa0974e72490ab7bd9c4','2019-10-24 07:46:19'),(566,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"p9rRXGpMWTcKbNgWgX9Oe2uMVycvXd98\",\"number-0\":\"1728705347\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"pill_text-0\":\"\",\"file-0\":\"5db15700a4f87\",\"_sipForTypo3Vars\":\"5db156ffcefd6\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db156fee556b\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,0,3,'86b0625320bdc1a0fa760db81d21e9e2','2019-10-24 07:47:14'),(567,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"76DmRAqbALfOqIkaii6MBhMJ1tFiVOUd\",\"number-0\":\"636118623\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"pill_text-0\":\"\",\"file-0\":\"5db15703eff7e\",\"_sipForTypo3Vars\":\"5db156ffcefd6\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db156fee556b\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,0,3,'86b0625320bdc1a0fa760db81d21e9e2','2019-10-24 07:47:17'),(568,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"4d1b2dcc6860dba2e53ecb258a426ea2\",\"_h_checkbox-387\":\"\",\"text-387\":\"fNusED3fMDFnlm9SD55Y46xpdHK58RtN\",\"number-387\":\"2139132178\",\"date-387\":\"01.01.2188\",\"datetime-387\":\"02.02.2188 01:08\",\"decimal-387\":\"12.84\",\"enum-387\":\"first option\",\"radio-387\":\"option a\",\"pill_text-387\":\"\",\"file-387\":\"5db15706b2ec8\",\"_sipForTypo3Vars\":\"5db15706b2fcf\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"387\",\"s\":\"5db15705dde00\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=387\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,387,1,'86b0625320bdc1a0fa760db81d21e9e2','2019-10-24 07:47:19'),(569,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"ne5YPXTH8CSuLENk4FOTYOfuCdKwI5Qc\",\"number-0\":\"1935050546\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"pill_text-0\":\"kzDbMnK6PkLZlmvNLAlC2bnGmbDPMQ3B\",\"file-0\":\"5db1570909662\",\"_sipForTypo3Vars\":\"5db156ffcefd6\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db156fee556b\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,0,3,'86b0625320bdc1a0fa760db81d21e9e2','2019-10-24 07:47:23'),(570,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"628dBnmAfbalNHKCRYh0dV1PBy5ooWan\",\"number-0\":\"538553108\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"pill_text-0\":\"\",\"file-0\":\"5db157e3641e0\",\"_sipForTypo3Vars\":\"5db157e2923cb\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db157e1b7d24\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,0,3,'b49491dbd625b10234eb03f4e48f1eb1','2019-10-24 07:51:01'),(571,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"cdOo02d7JW7wYSE0OLgIMGDYhU8LH65y\",\"number-0\":\"688002104\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"pill_text-0\":\"\",\"file-0\":\"5db157e6a99d7\",\"_sipForTypo3Vars\":\"5db157e2923cb\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db157e1b7d24\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,0,3,'b49491dbd625b10234eb03f4e48f1eb1','2019-10-24 07:51:04'),(572,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"60335d64b5eac70a6e416ade5c41a2aa\",\"_h_checkbox-390\":\"\",\"text-390\":\"PPuAgQ1zy2KZVjYQaNtHyw7EmsNsAWFI\",\"number-390\":\"769407872\",\"date-390\":\"01.01.2188\",\"datetime-390\":\"02.02.2188 01:08\",\"decimal-390\":\"12.84\",\"enum-390\":\"first option\",\"radio-390\":\"option a\",\"pill_text-390\":\"\",\"file-390\":\"5db157e944725\",\"_sipForTypo3Vars\":\"5db157e9447fd\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"390\",\"s\":\"5db157e881ac2\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=390\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,390,1,'b49491dbd625b10234eb03f4e48f1eb1','2019-10-24 07:51:06'),(573,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"2Qyv4kNSYnLTjOw2ZcyuzaooTDoagoR6\",\"number-0\":\"75897714\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"pill_text-0\":\"Kv1fviG46M3pq41t6tSl0KMDKwhFm2xL\",\"file-0\":\"5db157eb9e3d8\",\"_sipForTypo3Vars\":\"5db157e2923cb\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db157e1b7d24\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,0,3,'b49491dbd625b10234eb03f4e48f1eb1','2019-10-24 07:51:10'),(574,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"SJSH7CAOZggeWzA4NYeNgmlikrq5Z2on\",\"number-0\":\"703816027\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"pill_text-0\":\"\",\"file-0\":\"5db157f58c1fa\",\"_sipForTypo3Vars\":\"5db157e2923cb\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db157e1b7d24\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,0,3,'b49491dbd625b10234eb03f4e48f1eb1','2019-10-24 07:51:19'),(575,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"anz272oyRaVsMBxFNjvpnxiw9KynaHlh\",\"number-0\":\"681052235\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"pill_text-0\":\"\",\"file-0\":\"5db15913ceccb\",\"_sipForTypo3Vars\":\"5db159130a67e\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db1591236d3c\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,0,3,'2a49866ac4963a5e60f93e9044fe8542','2019-10-24 07:56:05'),(576,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"QbSwLhqv3wtxEYv0TNK84rq9GfQbipt1\",\"number-0\":\"1073159159\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"pill_text-0\":\"\",\"file-0\":\"5db159171549b\",\"_sipForTypo3Vars\":\"5db159130a67e\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db1591236d3c\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,0,3,'2a49866ac4963a5e60f93e9044fe8542','2019-10-24 07:56:08'),(577,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"5e630c18bb4f900ae095c18656e62409\",\"_h_checkbox-394\":\"\",\"text-394\":\"l56JPVMZpLHWPjWXrVqfXNIOyVlvBbmJ\",\"number-394\":\"38059859\",\"date-394\":\"01.01.2188\",\"datetime-394\":\"02.02.2188 01:08\",\"decimal-394\":\"12.84\",\"enum-394\":\"first option\",\"radio-394\":\"option a\",\"pill_text-394\":\"\",\"file-394\":\"5db15919b2227\",\"_sipForTypo3Vars\":\"5db15919b2334\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"394\",\"s\":\"5db15918ded0b\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=394\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,394,1,'2a49866ac4963a5e60f93e9044fe8542','2019-10-24 07:56:10'),(578,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"GHrSox0V2ndpdkV6Hy5jhLBgVRaJRKOX\",\"number-0\":\"1688975430\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"pill_text-0\":\"HuhM0u3WaiFh33eMJgbHLvzxiN3grhF0\",\"file-0\":\"5db1591c16b73\",\"_sipForTypo3Vars\":\"5db159130a67e\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db1591236d3c\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,0,3,'2a49866ac4963a5e60f93e9044fe8542','2019-10-24 07:56:14'),(579,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"C2ILBjoQB7Vln3iHEDnZXZKitlguvqzu\",\"number-0\":\"1937788470\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"pill_text-0\":\"\",\"file-0\":\"5db15950b73a8\",\"_sipForTypo3Vars\":\"5db1595000f42\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db1594f2660d\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,0,3,'ce2e4c88b1961fa44c7897258c3f3ee3','2019-10-24 07:57:06'),(580,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"jnR4ATGwbmsXUOYtKXryyt5rhsqweC6E\",\"number-0\":\"1919788263\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"pill_text-0\":\"\",\"file-0\":\"5db15953e8867\",\"_sipForTypo3Vars\":\"5db1595000f42\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db1594f2660d\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,0,3,'ce2e4c88b1961fa44c7897258c3f3ee3','2019-10-24 07:57:09'),(581,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"05e4b73c1d26824794b99f42f3875d99\",\"_h_checkbox-397\":\"\",\"text-397\":\"fw18Hu4tpkAW9NbqCzLTvpN9bEWno7RQ\",\"number-397\":\"843189017\",\"date-397\":\"01.01.2188\",\"datetime-397\":\"02.02.2188 01:08\",\"decimal-397\":\"12.84\",\"enum-397\":\"first option\",\"radio-397\":\"option a\",\"pill_text-397\":\"\",\"file-397\":\"5db1595685746\",\"_sipForTypo3Vars\":\"5db15956858a8\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"397\",\"s\":\"5db15955ba992\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=397\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,397,1,'ce2e4c88b1961fa44c7897258c3f3ee3','2019-10-24 07:57:11'),(582,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"R2cn4IGMjKzN769WbVyUMGfCbyOlGt3k\",\"number-0\":\"2048783002\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"pill_text-0\":\"9ck6Qf0a9z2mQMUPvW8NmOQCHwb8bhIh\",\"file-0\":\"5db15959038f8\",\"_sipForTypo3Vars\":\"5db1595000f42\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db1594f2660d\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,0,3,'ce2e4c88b1961fa44c7897258c3f3ee3','2019-10-24 07:57:15'),(583,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"4OUJO4dSW8Aq7fgZavCQsmr3ZN6lFKx2\",\"number-0\":\"912764438\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"pill_text-0\":\"\",\"file-0\":\"5db15962bdb09\",\"_sipForTypo3Vars\":\"5db1595000f42\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db1594f2660d\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,0,3,'ce2e4c88b1961fa44c7897258c3f3ee3','2019-10-24 07:57:24'),(584,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"tCuBGccv761T4pqDoAcCJsPXUBgltNQV\",\"number-0\":\"1183026895\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"pill_text-0\":\"\",\"file-0\":\"5db15a9768787\",\"_sipForTypo3Vars\":\"5db15a96228b7\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db15a9532baa\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,0,3,'632243166b682fe397c4e70a76ba5c41','2019-10-24 08:02:33'),(585,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d16714d48608e4f3b331f70ddec548ab\",\"_h_checkbox-400\":\"\",\"text-400\":\"B3BidPNF7nyviHjSmHE61P4O5PLE9A8a\",\"number-400\":\"969370179\",\"date-400\":\"01.01.2188\",\"datetime-400\":\"02.02.2188 01:08\",\"decimal-400\":\"12.84\",\"enum-400\":\"first option\",\"radio-400\":\"option a\",\"pill_text-400\":\"\",\"file-400\":\"5db15a9a0e9ad\",\"_sipForTypo3Vars\":\"5db15a9a0ea8b\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"400\",\"s\":\"5db15a993f711\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=400\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,400,1,'632243166b682fe397c4e70a76ba5c41','2019-10-24 08:02:35'),(586,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"RFtOGK9oNL6Cknz4XPDI2rM1HcmTiCXl\",\"number-0\":\"1014299537\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"pill_text-0\":\"9qPB893wpUQHkK6PgrQGo6XQyZIh6oIc\",\"file-0\":\"5db15a9c64e48\",\"_sipForTypo3Vars\":\"5db15a96228b7\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db15a9532baa\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,0,3,'632243166b682fe397c4e70a76ba5c41','2019-10-24 08:02:38'),(587,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"8I1SIRgY9ypBvxFUBxg9QrrSu4khd6cf\",\"number-0\":\"1670781845\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"pill_text-0\":\"\",\"file-0\":\"5db15aa631d85\",\"_sipForTypo3Vars\":\"5db15a96228b7\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db15a9532baa\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,0,3,'632243166b682fe397c4e70a76ba5c41','2019-10-24 08:02:48'),(588,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"BKfC4Rmn3xxckNaRPmnOWjRob2zlm3tc\",\"number-0\":\"1898545818\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"pill_text-0\":\"\",\"file-0\":\"5db15ae0ba795\",\"_sipForTypo3Vars\":\"5db15adfe1e43\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db15adf190d0\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,0,3,'e126eb29b63e24283df8178b87d03421','2019-10-24 08:03:46'),(589,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"WTPDV9F8VOAlUKXqs1km6D3bulNJJneE\",\"number-0\":\"677870431\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"pill_text-0\":\"\",\"file-0\":\"5db15ae432cfb\",\"_sipForTypo3Vars\":\"5db15adfe1e43\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db15adf190d0\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,0,3,'e126eb29b63e24283df8178b87d03421','2019-10-24 08:03:50'),(590,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"8e1d45829b6878a84e63cfb464705000\",\"_h_checkbox-404\":\"\",\"text-404\":\"rujJCw2RyjKAOpmZ3rYstr9kKVHpkI7Q\",\"number-404\":\"282768741\",\"date-404\":\"01.01.2188\",\"datetime-404\":\"02.02.2188 01:08\",\"decimal-404\":\"12.84\",\"enum-404\":\"first option\",\"radio-404\":\"option a\",\"pill_text-404\":\"\",\"file-404\":\"5db15ae6cfb6b\",\"_sipForTypo3Vars\":\"5db15ae6cfc48\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"404\",\"s\":\"5db15ae60f8aa\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=404\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,404,1,'e126eb29b63e24283df8178b87d03421','2019-10-24 08:03:52'),(591,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"ajyNhNvlNdxhYENWUzX5ljSsJZDs0p37\",\"number-0\":\"1512159908\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"pill_text-0\":\"TAk09E6rMSb98SmhcPxJ76dAIko94OQh\",\"file-0\":\"5db15ae9425ff\",\"_sipForTypo3Vars\":\"5db15adfe1e43\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db15adf190d0\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,0,3,'e126eb29b63e24283df8178b87d03421','2019-10-24 08:03:55'),(592,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"CU5qlmfhY64Yrza8l9n2qfTS36d2q3kJ\",\"number-0\":\"2075919192\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"pill_text-0\":\"\",\"file-0\":\"5db15af34e23f\",\"_sipForTypo3Vars\":\"5db15adfe1e43\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db15adf190d0\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,0,3,'e126eb29b63e24283df8178b87d03421','2019-10-24 08:04:05'),(593,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"8ADhYJs19NxFSiJxwzLXHgMaeA7c7KQb\",\"number-0\":\"1261554333\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"pill_text-0\":\"\",\"file-0\":\"5db15b38091a5\",\"_sipForTypo3Vars\":\"5db15b3733862\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db15b364b1ed\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,0,3,'05c00c7066fd1672af7ad3e46549b27a','2019-10-24 08:05:13'),(594,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"wAromdOkhNpUlv5wW0hzhwDi3aot1Wd9\",\"number-0\":\"986831617\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"pill_text-0\":\"\",\"file-0\":\"5db15b3b5b5ef\",\"_sipForTypo3Vars\":\"5db15b3733862\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db15b364b1ed\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,0,3,'05c00c7066fd1672af7ad3e46549b27a','2019-10-24 08:05:17'),(595,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"43cd674723090b6a98f4cdd898efe817\",\"_h_checkbox-408\":\"\",\"text-408\":\"6Mi12FfLdU713mLBTQrb8H3zghoz3lWo\",\"number-408\":\"1477692531\",\"date-408\":\"01.01.2188\",\"datetime-408\":\"02.02.2188 01:08\",\"decimal-408\":\"12.84\",\"enum-408\":\"first option\",\"radio-408\":\"option a\",\"pill_text-408\":\"\",\"file-408\":\"5db15b3e2cfef\",\"_sipForTypo3Vars\":\"5db15b3e2d0d5\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"408\",\"s\":\"5db15b3d5fe9b\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=408\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,408,1,'05c00c7066fd1672af7ad3e46549b27a','2019-10-24 08:05:19'),(596,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"MI555L8MT280ThkerOvNfEmFPSmajkZB\",\"number-0\":\"1742947355\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"pill_text-0\":\"SD5bLZr7C2FmBxcTBIn6BrNWhMSyUvg9\",\"file-0\":\"5db15b409b60d\",\"_sipForTypo3Vars\":\"5db15b3733862\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db15b364b1ed\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,0,3,'05c00c7066fd1672af7ad3e46549b27a','2019-10-24 08:05:23'),(597,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"bLzY9koEyMk9meCeUdAmV43RpFWps51E\",\"number-0\":\"1392527849\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"pill_text-0\":\"\",\"file-0\":\"5db15b4a8e49d\",\"_sipForTypo3Vars\":\"5db15b3733862\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db15b364b1ed\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,0,3,'05c00c7066fd1672af7ad3e46549b27a','2019-10-24 08:05:32'),(598,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"86DQF9JJGWfROuHvPlbdodttj4zQkPt1\",\"number-0\":\"1807369048\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"pill_text-0\":\"\",\"file-0\":\"5db15b82c148f\",\"_sipForTypo3Vars\":\"5db15b81ea3a6\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db15b8115d67\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,0,3,'39818ab9cdf16ac21fd6b84f13a5c0c2','2019-10-24 08:06:28'),(599,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"C8ap0ZRtV0h25qIfWXERBWRtpl6zvGYX\",\"number-0\":\"1932455875\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"pill_text-0\":\"\",\"file-0\":\"5db15b8618b6b\",\"_sipForTypo3Vars\":\"5db15b81ea3a6\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db15b8115d67\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,0,3,'39818ab9cdf16ac21fd6b84f13a5c0c2','2019-10-24 08:06:31'),(600,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d8729dcc45cad7c1b2126a8056122da3\",\"_h_checkbox-412\":\"\",\"text-412\":\"RfmjWzH96YhprfQLs6lFID95ImsgioTV\",\"number-412\":\"1166976388\",\"date-412\":\"01.01.2188\",\"datetime-412\":\"02.02.2188 01:08\",\"decimal-412\":\"12.84\",\"enum-412\":\"first option\",\"radio-412\":\"option a\",\"pill_text-412\":\"\",\"file-412\":\"5db15b88b55eb\",\"_sipForTypo3Vars\":\"5db15b88b56cd\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"412\",\"s\":\"5db15b87ea57a\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=412\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,412,1,'39818ab9cdf16ac21fd6b84f13a5c0c2','2019-10-24 08:06:33'),(601,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"rfXuyT6yL0pnWUCoviWKNjhQd01gZ7we\",\"number-0\":\"745153182\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"pill_text-0\":\"Ih19PM7ao9CfN9h7bEODDU5hiQm07DYr\",\"file-0\":\"5db15b8b0e5ea\",\"_sipForTypo3Vars\":\"5db15b81ea3a6\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db15b8115d67\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,0,3,'39818ab9cdf16ac21fd6b84f13a5c0c2','2019-10-24 08:06:37'),(602,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"La6MH19liRdOmzbW7RxeZ4BNu933T1qP\",\"number-0\":\"1271249841\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"pill_text-0\":\"\",\"file-0\":\"5db15b952dbd3\",\"_sipForTypo3Vars\":\"5db15b81ea3a6\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db15b8115d67\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,0,3,'39818ab9cdf16ac21fd6b84f13a5c0c2','2019-10-24 08:06:47'),(603,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"gVjXSbuelCjXEIbmEHnNpymjCAfZnK1z\",\"number-0\":\"1342435251\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"pill_text-0\":\"\",\"file-0\":\"5db15b98c9aba\",\"_sipForTypo3Vars\":\"5db15b81ea3a6\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db15b8115d67\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,0,3,'39818ab9cdf16ac21fd6b84f13a5c0c2','2019-10-24 08:06:50'),(604,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"C92SxzFgXm1dUacMY9xY7cPnBvvmSOWI\",\"number-0\":\"1701946996\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"pill_text-0\":\"\",\"file-0\":\"5db15bc3ab790\",\"_sipForTypo3Vars\":\"5db15bc2c9739\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db15bc1e48c1\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,0,3,'9f12c7e300655f5058e3cb41c39822b6','2019-10-24 08:07:33'),(605,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"dobPwfkCQQW7iHlOrKrtp3ny9ZqZ4uz4\",\"number-0\":\"32606875\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"pill_text-0\":\"\",\"file-0\":\"5db15bc73ffb5\",\"_sipForTypo3Vars\":\"5db15bc2c9739\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db15bc1e48c1\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,0,3,'9f12c7e300655f5058e3cb41c39822b6','2019-10-24 08:07:37'),(606,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"34d6597df9c025bc990a0b3cf58febea\",\"_h_checkbox-417\":\"\",\"text-417\":\"RZ7p0UzLLoU15E5BXkQ1golyMT25gUMA\",\"number-417\":\"167749461\",\"date-417\":\"01.01.2188\",\"datetime-417\":\"02.02.2188 01:08\",\"decimal-417\":\"12.84\",\"enum-417\":\"first option\",\"radio-417\":\"option a\",\"pill_text-417\":\"\",\"file-417\":\"5db15bc9e790d\",\"_sipForTypo3Vars\":\"5db15bc9e79e9\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"417\",\"s\":\"5db15bc923283\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=417\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,417,1,'9f12c7e300655f5058e3cb41c39822b6','2019-10-24 08:07:39'),(607,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"9NPoEGeAof78KbLZ9CVg8Q0HDGrSRwse\",\"number-0\":\"1379393773\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"pill_text-0\":\"ax0o5OfFBACMC0nyJ64B9LzellG5Vgri\",\"file-0\":\"5db15bcc6696e\",\"_sipForTypo3Vars\":\"5db15bc2c9739\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db15bc1e48c1\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,0,3,'9f12c7e300655f5058e3cb41c39822b6','2019-10-24 08:07:43'),(608,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"q0QiNOPwYC41pA0vPeztN4UtHJ26o3Ov\",\"number-0\":\"1372506030\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"pill_text-0\":\"\",\"file-0\":\"5db15bd679f3c\",\"_sipForTypo3Vars\":\"5db15bc2c9739\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db15bc1e48c1\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,0,3,'9f12c7e300655f5058e3cb41c39822b6','2019-10-24 08:07:52'),(609,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"frjl79K8MU7DFTzuNDQxZd8xDu9EFsTp\",\"number-0\":\"1816048800\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"pill_text-0\":\"\",\"file-0\":\"5db15bda0d56e\",\"_sipForTypo3Vars\":\"5db15bc2c9739\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db15bc1e48c1\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,0,3,'9f12c7e300655f5058e3cb41c39822b6','2019-10-24 08:07:56'),(610,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"AmQxcK3hVjntqeia51fkYXwj4Q3y1dTv\",\"number-0\":\"1540483130\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"pill_text-0\":\"\",\"file-0\":\"5db15c445913f\",\"_sipForTypo3Vars\":\"5db15c4338cd5\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db15c424034e\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.70 Safari/537.36',1007,0,3,'d62a202e103e0375f5011a577fe72860','2019-10-24 08:09:42'),(611,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"4DssO1MpMAzvgVUHz6GB8zugDZoAvLJX\",\"number-0\":\"638774501\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"pill_text-0\":\"\",\"file-0\":\"5db15c48486aa\",\"_sipForTypo3Vars\":\"5db15c4338cd5\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db15c424034e\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.70 Safari/537.36',1007,0,3,'d62a202e103e0375f5011a577fe72860','2019-10-24 08:09:46'),(612,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"ea42df607fe1d720e6b217d584c10ebf\",\"_h_checkbox-422\":\"\",\"text-422\":\"htRSiUs5e5AToTHSxlwO73ZXtRuy16Zh\",\"number-422\":\"1704438029\",\"date-422\":\"01.01.2188\",\"datetime-422\":\"02.02.2188 01:08\",\"decimal-422\":\"12.84\",\"enum-422\":\"first option\",\"radio-422\":\"option a\",\"pill_text-422\":\"\",\"file-422\":\"5db15c4b45d43\",\"_sipForTypo3Vars\":\"5db15c4b45e46\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"422\",\"s\":\"5db15c4a36ede\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=422\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.70 Safari/537.36',1007,422,1,'d62a202e103e0375f5011a577fe72860','2019-10-24 08:09:48'),(613,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"JSZGVsDpgSdDd7XAQME4Hkw2tnJZJQ7R\",\"number-0\":\"754509159\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"pill_text-0\":\"qsLtba8V3qw7LuwGN5sbaO2IUvHqpEQN\",\"file-0\":\"5db15c4df2a80\",\"_sipForTypo3Vars\":\"5db15c4338cd5\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db15c424034e\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.70 Safari/537.36',1007,0,3,'d62a202e103e0375f5011a577fe72860','2019-10-24 08:09:52'),(614,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"XIDMa6G01dyCI1u1z2poQBFoQkk3VuW8\",\"number-0\":\"1581756280\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"pill_text-0\":\"\",\"file-0\":\"5db15c58cef91\",\"_sipForTypo3Vars\":\"5db15c4338cd5\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db15c424034e\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.70 Safari/537.36',1007,0,3,'d62a202e103e0375f5011a577fe72860','2019-10-24 08:10:03'),(615,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"b4giPMBd5jMir8MpcRsc6CxWiSzdB0Fi\",\"number-0\":\"1042703024\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"pill_text-0\":\"\",\"file-0\":\"5db15c5cef0cc\",\"_sipForTypo3Vars\":\"5db15c4338cd5\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db15c424034e\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.70 Safari/537.36',1007,0,3,'d62a202e103e0375f5011a577fe72860','2019-10-24 08:10:07'),(616,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"5Wt6jTvfW2JIYQUio1tRABJ94LPWePYV\",\"number-0\":\"2088611784\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"pill_text-0\":\"\",\"file-0\":\"5db15c8adce93\",\"_sipForTypo3Vars\":\"5db15c89784e9\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db15c889403b\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.70 Safari/537.36',1007,0,3,'81a931ef385e1cf854d24f09f332360d','2019-10-24 08:10:52'),(617,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"BTZ9HZve77MArTVZIrq6grJ2L8hQmj6a\",\"number-0\":\"1718872038\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"pill_text-0\":\"\",\"file-0\":\"5db15c8f17ae4\",\"_sipForTypo3Vars\":\"5db15c89784e9\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db15c889403b\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.70 Safari/537.36',1007,0,3,'81a931ef385e1cf854d24f09f332360d','2019-10-24 08:10:57'),(618,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"edb43479f3c14a48db12bb9f52555cf9\",\"_h_checkbox-427\":\"\",\"text-427\":\"stHANXZCHj01hYSxSqOHGbyscdt2ABWe\",\"number-427\":\"1794751132\",\"date-427\":\"01.01.2188\",\"datetime-427\":\"02.02.2188 01:08\",\"decimal-427\":\"12.84\",\"enum-427\":\"first option\",\"radio-427\":\"option a\",\"pill_text-427\":\"\",\"file-427\":\"5db15c925bd20\",\"_sipForTypo3Vars\":\"5db15c925be0e\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"427\",\"s\":\"5db15c912d90a\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=427\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.70 Safari/537.36',1007,427,1,'81a931ef385e1cf854d24f09f332360d','2019-10-24 08:10:59'),(619,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"fVqBSg9ddck0l4kVk1iM73wP1tQsYyc1\",\"number-0\":\"1055249012\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"pill_text-0\":\"VDibRHE3nHHZdQmUvpQ4O1lsWsWecKA2\",\"file-0\":\"5db15c9561a56\",\"_sipForTypo3Vars\":\"5db15c89784e9\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db15c889403b\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.70 Safari/537.36',1007,0,3,'81a931ef385e1cf854d24f09f332360d','2019-10-24 08:11:04'),(620,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"1D9mpMkUEaVyyguu4V1QFZCdw9nvLKfN\",\"number-0\":\"182547820\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"pill_text-0\":\"\",\"file-0\":\"5db15ca155e3c\",\"_sipForTypo3Vars\":\"5db15c89784e9\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db15c889403b\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.70 Safari/537.36',1007,0,3,'81a931ef385e1cf854d24f09f332360d','2019-10-24 08:11:15'),(621,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"mNV8KNZRBHoOxM3mn1bhRRaXTENU9Lvm\",\"number-0\":\"236958185\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"pill_text-0\":\"\",\"file-0\":\"5db15ca60e162\",\"_sipForTypo3Vars\":\"5db15c89784e9\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db15c889403b\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.70 Safari/537.36',1007,0,3,'81a931ef385e1cf854d24f09f332360d','2019-10-24 08:11:25'),(622,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"f672d5e8e6b55fb3495a751096b3f1cb\",\"enabled-507\":\"yes\",\"dynamicUpdate-507\":\"no\",\"mode-507\":\"show\",\"class-507\":\"native\",\"_h_subrecordOption-507\":\"\",\"encode-507\":\"specialchar\",\"checkType-507\":\"auto\",\"labelAlign-507\":\"default\",\"_h_rowLabelInputNote-507\":\"\",\"feIdContainer-507\":\"505\",\"name-507\":\"file\",\"label-507\":\"File Upload\",\"modeSql-507\":\"\",\"type-507\":\"upload\",\"parameterLanguageA-507\":\"\",\"parameterLanguageB-507\":\"\",\"parameterLanguageC-507\":\"\",\"parameterLanguageD-507\":\"\",\"checkPattern-507\":\"\",\"ord-507\":\"120\",\"adminNote-507\":\"\",\"size-507\":\"\",\"bsLabelColumns-507\":\"\",\"bsInputColumns-507\":\"\",\"bsNoteColumns-507\":\"\",\"_0_rowLabelInputNote-507\":\"row\",\"_1_rowLabelInputNote-507\":\"label\",\"_2_rowLabelInputNote-507\":\"\\/label\",\"_3_rowLabelInputNote-507\":\"input\",\"_4_rowLabelInputNote-507\":\"\\/input\",\"_5_rowLabelInputNote-507\":\"note\",\"_6_rowLabelInputNote-507\":\"\\/note\",\"_7_rowLabelInputNote-507\":\"\\/row\",\"maxLength-507\":\"\",\"note-507\":\"\",\"tooltip-507\":\"\",\"placeholder-507\":\"\",\"value-507\":\"\",\"sql1-507\":\"\",\"parameter-507\":\"accept = *.txt\\r\\n\\r\\nfileDestination={{ SELECT CONCAT(\'fileadmin\\/{{id:R}}_{{filename}}\') }}\\r\\n\\r\\ndownloadButton = t:{{SELECT SUBSTRING(\'{{file:R}}\', LOCATE(\'_\', \'{{file:R}}\')+1) }}\\r\\nmaxFileSize = \'10K\'\",\"_sipForTypo3Vars\":\"5db15d8134147\"}','{\"__dbIndexData\":\"1\",\"form\":\"formElement\",\"formId\":\"1007\",\"r\":\"507\",\"s\":\"5db14a8448378\",\"urlparam\":\"__dbIndexData=1&form=formElement&formId=1007&r=507\"}','192.168.133.203','','Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:69.0) Gecko/20100101 Firefox/69.0',2,507,1,'83228dfc9b11c970e5af54a8d48eca25','2019-10-24 08:15:35'),(623,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"MhhU2FOE7ZYhYQgRge46XHveX9dWddGV\",\"number-0\":\"285493046\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"pill_text-0\":\"\",\"file-0\":\"5db15db632a17\",\"_sipForTypo3Vars\":\"5db15db4e0b8b\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db15db3b210d\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.70 Safari/537.36',1007,0,3,'006b9eb169578f126ddcdb5576043e1b','2019-10-24 08:15:52'),(624,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"S30eZ34GyuME50oFlbiyEorh18lCM1Mj\",\"number-0\":\"440803707\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"pill_text-0\":\"\",\"file-0\":\"5db15dba25fbf\",\"_sipForTypo3Vars\":\"5db15db4e0b8b\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db15db3b210d\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.70 Safari/537.36',1007,0,3,'006b9eb169578f126ddcdb5576043e1b','2019-10-24 08:15:56'),(625,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"db9ec897a538b8b3539eb37ac8bc3208\",\"_h_checkbox-432\":\"\",\"text-432\":\"mZn4NwOZlul4HTDmHTqPfo1ZI818bOl7\",\"number-432\":\"400171060\",\"date-432\":\"01.01.2188\",\"datetime-432\":\"02.02.2188 01:08\",\"decimal-432\":\"12.84\",\"enum-432\":\"first option\",\"radio-432\":\"option a\",\"pill_text-432\":\"\",\"file-432\":\"5db15dbd35b73\",\"_sipForTypo3Vars\":\"5db15dbd35c59\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"432\",\"s\":\"5db15dbc0f7f6\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=432\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.70 Safari/537.36',1007,432,1,'006b9eb169578f126ddcdb5576043e1b','2019-10-24 08:15:58'),(626,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"Zj1F51JWznAxgIRtvsoFqg9GSBd00WK2\",\"number-0\":\"663649698\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"pill_text-0\":\"edQ66tgZh7uK936fsZw8SGcjIYzlcUeP\",\"file-0\":\"5db15dc04addf\",\"_sipForTypo3Vars\":\"5db15db4e0b8b\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db15db3b210d\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.70 Safari/537.36',1007,0,3,'006b9eb169578f126ddcdb5576043e1b','2019-10-24 08:16:03'),(627,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"Igvtm88ctmcTzcTbyh0eDY4zRRX8HJzF\",\"number-0\":\"836294282\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"pill_text-0\":\"\",\"file-0\":\"5db15ea5c8dda\",\"_sipForTypo3Vars\":\"5db15ea4a5c1c\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db15ea39cf38\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.70 Safari/537.36',1007,0,3,'3c20e8be46f10f37febbb6171394ff65','2019-10-24 08:19:51'),(628,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"hiMoXlsHvstYmnRi379yKAuNA2MC7IDO\",\"number-0\":\"993955648\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"pill_text-0\":\"\",\"file-0\":\"5db15ea9b9a43\",\"_sipForTypo3Vars\":\"5db15ea4a5c1c\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db15ea39cf38\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.70 Safari/537.36',1007,0,3,'3c20e8be46f10f37febbb6171394ff65','2019-10-24 08:19:55'),(629,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"f4d95651ab3ab5264d647d67565b4d79\",\"_h_checkbox-435\":\"\",\"text-435\":\"TgRKDv8dXEXG8huO88HXHw8ermyemVwO\",\"number-435\":\"318219758\",\"date-435\":\"01.01.2188\",\"datetime-435\":\"02.02.2188 01:08\",\"decimal-435\":\"12.84\",\"enum-435\":\"first option\",\"radio-435\":\"option a\",\"pill_text-435\":\"\",\"file-435\":\"5db15ead08e8e\",\"_sipForTypo3Vars\":\"5db15ead08f62\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"435\",\"s\":\"5db15eabcea3b\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=435\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.70 Safari/537.36',1007,435,1,'3c20e8be46f10f37febbb6171394ff65','2019-10-24 08:19:58'),(630,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"RVGko3N7ZMBDWZtBlAqT7dcW7dVNUwH5\",\"number-0\":\"1860457787\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"pill_text-0\":\"Nx4JSyjDx4wDls3naqOjfIloXOVWhp4T\",\"file-0\":\"5db15eafe0f6b\",\"_sipForTypo3Vars\":\"5db15ea4a5c1c\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db15ea39cf38\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.70 Safari/537.36',1007,0,3,'3c20e8be46f10f37febbb6171394ff65','2019-10-24 08:20:02'),(631,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"AFBj4O3nh97YmdoRqL3jw0SQQ1joIan0\",\"number-0\":\"1747507258\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"pill_text-0\":\"\",\"file-0\":\"5db15ef2bdd4a\",\"_sipForTypo3Vars\":\"5db15ef159d02\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db15ef0671aa\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.70 Safari/537.36',1007,0,3,'5961896885556d27d7b8e1cfd36f4330','2019-10-24 08:21:09'),(632,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"ema4gdwmmDdjdYHebKWoXrUwBjRYM4bT\",\"number-0\":\"795418488\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"pill_text-0\":\"\",\"file-0\":\"5db15ef72bf71\",\"_sipForTypo3Vars\":\"5db15ef159d02\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db15ef0671aa\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.70 Safari/537.36',1007,0,3,'5961896885556d27d7b8e1cfd36f4330','2019-10-24 08:21:13'),(633,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"b4b305c4f8235d00396b21711f81adcb\",\"_h_checkbox-438\":\"\",\"text-438\":\"VPU3t5X6pTQbDRIRoWAY407pV4jTzhsN\",\"number-438\":\"850335092\",\"date-438\":\"01.01.2188\",\"datetime-438\":\"02.02.2188 01:08\",\"decimal-438\":\"12.84\",\"enum-438\":\"first option\",\"radio-438\":\"option a\",\"pill_text-438\":\"\",\"file-438\":\"5db15efa4bd19\",\"_sipForTypo3Vars\":\"5db15efa4bdfb\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"438\",\"s\":\"5db15ef92bb39\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=438\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.70 Safari/537.36',1007,438,1,'5961896885556d27d7b8e1cfd36f4330','2019-10-24 08:21:15'),(634,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"m3IhprVNyRV7LcEq7fUAm9c9yUvKgHhk\",\"number-0\":\"773838740\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"pill_text-0\":\"3DBXTOikj60aJQfoBlsTxVLSZHpaOfXV\",\"file-0\":\"5db15efd6314a\",\"_sipForTypo3Vars\":\"5db15ef159d02\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db15ef0671aa\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.70 Safari/537.36',1007,0,3,'5961896885556d27d7b8e1cfd36f4330','2019-10-24 08:21:20'),(635,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"FiQdJlHREjSdiJQatZTnDMPFhJCJMkld\",\"number-0\":\"791750497\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"pill_text-0\":\"\",\"file-0\":\"5db15f5e6c474\",\"_sipForTypo3Vars\":\"5db15f5e6c56f\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db15f5d7354f\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.70 Safari/537.36',1007,0,3,'3072bd7f5b993fa78e280c66f5e87ded','2019-10-24 08:23:02'),(636,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"Md1GMe2nrdDhMQIcGeJpSYYYf8FMCXny\",\"number-0\":\"392559583\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"pill_text-0\":\"\",\"file-0\":\"5db15fa36572f\",\"_sipForTypo3Vars\":\"5db15fa365845\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db15fa26f9dc\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.70 Safari/537.36',1007,0,3,'7de81b270d44f821615be01bd82ccc07','2019-10-24 08:24:12'),(637,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"jyEhEawdSoCLjJLDMt5ESXbxH4nUwDDC\",\"number-0\":\"876748365\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"pill_text-0\":\"\",\"file-0\":\"5db15fd70adb0\",\"_sipForTypo3Vars\":\"5db15fd70ae97\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db15fd61a6b7\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.70 Safari/537.36',1007,0,3,'f55a3b6814e5b5ef0e97b6115fc15cf5','2019-10-24 08:24:59'),(638,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"yQPqlDZfDirC8UzEcN3CGWlqJTQzIO8y\",\"number-0\":\"534905185\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"pill_text-0\":\"\",\"file-0\":\"5db15ff460bf9\",\"_sipForTypo3Vars\":\"5db15ff460cd6\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db15ff380cca\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.70 Safari/537.36',1007,0,3,'e8a2b8d670c6f6f1b0181c11f0263df2','2019-10-24 08:25:29'),(639,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"Gt5z1UOdO3Ep5US9ri10fF6qb7eHxH36\",\"number-0\":\"872013464\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"pill_text-0\":\"\",\"file-0\":\"5db160129d78d\",\"_sipForTypo3Vars\":\"5db160129d8b0\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db16011a4648\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.70 Safari/537.36',1007,0,3,'e5f2f50f58bcf708300fcbba28139b85','2019-10-24 08:25:58'),(640,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"vfVM4F4p1QzjU7uWqTaCAEBXAlZ7eRJe\",\"number-0\":\"1240188014\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"pill_text-0\":\"\",\"file-0\":\"5db1603e3595d\",\"_sipForTypo3Vars\":\"5db1603e35b70\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db1603d36b92\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.70 Safari/537.36',1007,0,3,'36201c2040b92654a3124136966a3a8c','2019-10-24 08:26:41'),(641,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"gfqqwKGbCva41EtuBA5jT18Mt08h2bcH\",\"number-0\":\"856523071\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"pill_text-0\":\"\",\"file-0\":\"5db160a2547f6\",\"_sipForTypo3Vars\":\"5db160a188833\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db160a0b912f\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,0,3,'6bca32d3a9b77d1fe487acbd5c5acdf6','2019-10-24 08:28:20'),(642,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"ufWy2kNklFGkXUNFaVhLLNJ5NkbQLAGO\",\"number-0\":\"610597151\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"pill_text-0\":\"\",\"file-0\":\"5db160a59c4b8\",\"_sipForTypo3Vars\":\"5db160a188833\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db160a0b912f\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,0,3,'6bca32d3a9b77d1fe487acbd5c5acdf6','2019-10-24 08:28:23'),(643,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"ede6db9b9dc57bf9b3dad1bd220ee635\",\"_h_checkbox-447\":\"\",\"text-447\":\"jQj6Qusuupnd6fzOnByLb3qxxhoADcP6\",\"number-447\":\"1756770007\",\"date-447\":\"01.01.2188\",\"datetime-447\":\"02.02.2188 01:08\",\"decimal-447\":\"12.84\",\"enum-447\":\"first option\",\"radio-447\":\"option a\",\"pill_text-447\":\"\",\"file-447\":\"5db160a83e5bc\",\"_sipForTypo3Vars\":\"5db160a83e68a\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"447\",\"s\":\"5db160a772e21\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=447\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,447,1,'6bca32d3a9b77d1fe487acbd5c5acdf6','2019-10-24 08:28:25'),(644,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"ERjZxdbLT2YrB3465meXuIqYyowCPtQv\",\"number-0\":\"33360149\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"pill_text-0\":\"naORujiMjDcwmZLGrilgq7rg6PaA5g0O\",\"file-0\":\"5db160aa94fee\",\"_sipForTypo3Vars\":\"5db160a188833\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db160a0b912f\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,0,3,'6bca32d3a9b77d1fe487acbd5c5acdf6','2019-10-24 08:28:28'),(645,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"XxiVFGIlXsOHz56MvP9cs7psJz4shnlW\",\"number-0\":\"1509181399\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"pill_text-0\":\"\",\"file-0\":\"5db160cf56220\",\"_sipForTypo3Vars\":\"5db160ce830ee\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db160cd94303\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,0,3,'ea43a9a4776987e4000acfa00bf900ad','2019-10-24 08:29:05'),(646,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"9AG9RNzrqNYXZGKtz4iYzMlPrY2E3VCC\",\"number-0\":\"736412574\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"pill_text-0\":\"\",\"file-0\":\"5db160d2adf44\",\"_sipForTypo3Vars\":\"5db160ce830ee\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db160cd94303\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,0,3,'ea43a9a4776987e4000acfa00bf900ad','2019-10-24 08:29:08'),(647,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"fc679de15fbfa753b46d2f7f98993699\",\"_h_checkbox-450\":\"\",\"text-450\":\"z5iTjjoV8YbfencdOOUT708rCIrRAxWJ\",\"number-450\":\"242235406\",\"date-450\":\"01.01.2188\",\"datetime-450\":\"02.02.2188 01:08\",\"decimal-450\":\"12.84\",\"enum-450\":\"first option\",\"radio-450\":\"option a\",\"pill_text-450\":\"\",\"file-450\":\"5db160d55ced5\",\"_sipForTypo3Vars\":\"5db160d55cfa1\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"450\",\"s\":\"5db160d48bc41\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=450\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,450,1,'ea43a9a4776987e4000acfa00bf900ad','2019-10-24 08:29:10'),(648,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"AvAWEJwB0TXtenxVrM5SpbTQGsNgm3ap\",\"number-0\":\"2002321303\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"pill_text-0\":\"8HehMP9h8npwAOk3UksxcytztwVx8CHp\",\"file-0\":\"5db160d7acf0f\",\"_sipForTypo3Vars\":\"5db160ce830ee\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db160cd94303\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,0,3,'ea43a9a4776987e4000acfa00bf900ad','2019-10-24 08:29:14'),(649,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"w2K4LEB3gocc9vYRrpYZPNxLm6Xrs1WI\",\"number-0\":\"1460677966\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"pill_text-0\":\"\",\"file-0\":\"5db160f91fa88\",\"_sipForTypo3Vars\":\"5db160f854d45\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db160f77a262\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,0,3,'a8786ab215eeecf822687743aa1691ba','2019-10-24 08:29:46'),(650,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"chfPqnzmfatV8cu9kqpU4oB1lQ6VlVab\",\"number-0\":\"1966462666\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"pill_text-0\":\"\",\"file-0\":\"5db160fc63205\",\"_sipForTypo3Vars\":\"5db160f854d45\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db160f77a262\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,0,3,'a8786ab215eeecf822687743aa1691ba','2019-10-24 08:29:50'),(651,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"1279e32f127038ba92b4452408f042da\",\"_h_checkbox-453\":\"\",\"text-453\":\"ntjH2J4Oto9fm8iUndWBwCeENo9ulUyH\",\"number-453\":\"776590623\",\"date-453\":\"01.01.2188\",\"datetime-453\":\"02.02.2188 01:08\",\"decimal-453\":\"12.84\",\"enum-453\":\"first option\",\"radio-453\":\"option a\",\"pill_text-453\":\"\",\"file-453\":\"5db160ff011a7\",\"_sipForTypo3Vars\":\"5db160ff01295\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"453\",\"s\":\"5db160fe395e8\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=453\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,453,1,'a8786ab215eeecf822687743aa1691ba','2019-10-24 08:29:52'),(652,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"Cu86iJyB04M09fMRroo8GoBAgrM8V1Lc\",\"number-0\":\"1336856507\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"pill_text-0\":\"DXcjkDzNcBqLPeLnSI049VuY8Lbi11f3\",\"file-0\":\"5db161014e014\",\"_sipForTypo3Vars\":\"5db160f854d45\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db160f77a262\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,0,3,'a8786ab215eeecf822687743aa1691ba','2019-10-24 08:29:55'),(653,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"5asss8jkOzMQDTCzxNWfM85XftH6pk0c\",\"number-0\":\"820472000\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"pill_text-0\":\"\",\"file-0\":\"5db16145b83c5\",\"_sipForTypo3Vars\":\"5db16145b84b3\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db1614483e8d\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,0,3,'f2d76050857de7f90530d779927622a3','2019-10-24 08:31:05'),(654,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"ca1978963f501ad624ddc37a6f44716e\",\"enabled-507\":\"yes\",\"dynamicUpdate-507\":\"no\",\"mode-507\":\"show\",\"class-507\":\"native\",\"_h_subrecordOption-507\":\"\",\"encode-507\":\"specialchar\",\"checkType-507\":\"auto\",\"labelAlign-507\":\"default\",\"_h_rowLabelInputNote-507\":\"\",\"feIdContainer-507\":\"505\",\"name-507\":\"file\",\"label-507\":\"File Upload\",\"modeSql-507\":\"\",\"type-507\":\"upload\",\"parameterLanguageA-507\":\"\",\"parameterLanguageB-507\":\"\",\"parameterLanguageC-507\":\"\",\"parameterLanguageD-507\":\"\",\"checkPattern-507\":\"\",\"ord-507\":\"120\",\"adminNote-507\":\"\",\"size-507\":\"\",\"bsLabelColumns-507\":\"\",\"bsInputColumns-507\":\"\",\"bsNoteColumns-507\":\"\",\"_0_rowLabelInputNote-507\":\"row\",\"_1_rowLabelInputNote-507\":\"label\",\"_2_rowLabelInputNote-507\":\"\\/label\",\"_3_rowLabelInputNote-507\":\"input\",\"_4_rowLabelInputNote-507\":\"\\/input\",\"_5_rowLabelInputNote-507\":\"note\",\"_6_rowLabelInputNote-507\":\"\\/note\",\"_7_rowLabelInputNote-507\":\"\\/row\",\"maxLength-507\":\"\",\"note-507\":\"\",\"tooltip-507\":\"\",\"placeholder-507\":\"\",\"value-507\":\"\",\"sql1-507\":\"\",\"parameter-507\":\"accept = .txt\\r\\n\\r\\nfileDestination={{ SELECT CONCAT(\'fileadmin\\/{{id:R}}_{{filename}}\') }}\\r\\n\\r\\ndownloadButton = t:{{SELECT SUBSTRING(\'{{file:R}}\', LOCATE(\'_\', \'{{file:R}}\')+1) }}\\r\\nmaxFileSize = \'10K\'\",\"_sipForTypo3Vars\":\"5db15d8134147\"}','{\"__dbIndexData\":\"1\",\"form\":\"formElement\",\"formId\":\"1007\",\"r\":\"507\",\"s\":\"5db14a8448378\",\"urlparam\":\"__dbIndexData=1&form=formElement&formId=1007&r=507\"}','192.168.133.203','','Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:69.0) Gecko/20100101 Firefox/69.0',2,507,1,'83228dfc9b11c970e5af54a8d48eca25','2019-10-24 08:35:06'),(655,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"DSRBLTPbzgbUWTZcn09esal6aowKMtR2\",\"number-0\":\"1326753694\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"pill_text-0\":\"\",\"file-0\":\"5db1624340cd0\",\"_sipForTypo3Vars\":\"5db1624340db4\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db1624259e5d\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.70 Safari/537.36',1007,0,3,'3cfb9ea2ede17ae40a4c27bca550d621','2019-10-24 08:35:17'),(656,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"W73PFWnsnTHdcyclgg00NZEDaGIfaYhz\",\"number-0\":\"1220112044\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"pill_text-0\":\"\",\"file-0\":\"5db1626fea633\",\"_sipForTypo3Vars\":\"5db1626eac79e\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db1626d9008e\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.70 Safari/537.36',1007,0,3,'f7a7844e6a1bc1d0efb8aaa042290b55','2019-10-24 08:36:02'),(657,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"PojEkodSXp7K26vBXlJlFTW6oFksJq1h\",\"number-0\":\"1411883330\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"pill_text-0\":\"\",\"file-0\":\"5db1627451b2e\",\"_sipForTypo3Vars\":\"5db1626eac79e\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db1626d9008e\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.70 Safari/537.36',1007,0,3,'f7a7844e6a1bc1d0efb8aaa042290b55','2019-10-24 08:36:06'),(658,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"ed225e64a528fcbc13bbc493062f3602\",\"_h_checkbox-458\":\"\",\"text-458\":\"Nj0SQ1zDIzGL5dRDJZR4H3nFKC2oi7mr\",\"number-458\":\"956894598\",\"date-458\":\"01.01.2188\",\"datetime-458\":\"02.02.2188 01:08\",\"decimal-458\":\"12.84\",\"enum-458\":\"first option\",\"radio-458\":\"option a\",\"pill_text-458\":\"\",\"file-458\":\"5db162773f33f\",\"_sipForTypo3Vars\":\"5db162773f4b0\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"458\",\"s\":\"5db162764ac59\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=458\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.70 Safari/537.36',1007,458,1,'f7a7844e6a1bc1d0efb8aaa042290b55','2019-10-24 08:36:08'),(659,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"UG1pKLUcy7y0dN7noxT0Lkvlk\",\"number-0\":\"278254368\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"pill_text-0\":\"1jyUsJW9jDCzVR9u5BrVIeH90BjQptu6\",\"file-0\":\"5db1627a33a28\",\"_sipForTypo3Vars\":\"5db1626eac79e\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db1626d9008e\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.70 Safari/537.36',1007,0,3,'f7a7844e6a1bc1d0efb8aaa042290b55','2019-10-24 08:36:12'),(660,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"B5d1P08jiGMui1iK20gqbWknU0NsoVnd\",\"number-0\":\"1050089123\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"pill_text-0\":\"\",\"file-0\":\"5db16284721c8\",\"_sipForTypo3Vars\":\"5db1626eac79e\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db1626d9008e\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.70 Safari/537.36',1007,0,3,'f7a7844e6a1bc1d0efb8aaa042290b55','2019-10-24 08:36:22'),(661,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"T56pjlfu89UPIRcOL7kRQzpqLbUsL4bH\",\"number-0\":\"942225976\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"pill_text-0\":\"\",\"file-0\":\"5db16288a8b77\",\"_sipForTypo3Vars\":\"5db1626eac79e\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db1626d9008e\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.70 Safari/537.36',1007,0,3,'f7a7844e6a1bc1d0efb8aaa042290b55','2019-10-24 08:36:29'),(662,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"tY33GMVe7e72BKproSDGqtr8waslv6B3\",\"number-0\":\"170106550\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"pill_text-0\":\"\",\"file-0\":\"5db162c5e320a\",\"_sipForTypo3Vars\":\"5db162c48d706\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db162c35ee2d\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.70 Safari/537.36',1007,0,3,'187c4d6db81dfb2f98a1fe96736cfa6e','2019-10-24 08:37:27'),(663,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"XDA40MB54RoCsvjfmK8WmDFTjk9dnSOG\",\"number-0\":\"581839711\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"pill_text-0\":\"\",\"file-0\":\"5db162ca116be\",\"_sipForTypo3Vars\":\"5db162c48d706\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db162c35ee2d\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.70 Safari/537.36',1007,0,3,'187c4d6db81dfb2f98a1fe96736cfa6e','2019-10-24 08:37:32'),(664,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"6de6d87371f8fdd04b5ff33e5667bb8a\",\"_h_checkbox-463\":\"\",\"text-463\":\"AjveKlmTubhxHKt5Ta3AYOh5GsOxgqzh\",\"number-463\":\"599572879\",\"date-463\":\"01.01.2188\",\"datetime-463\":\"02.02.2188 01:08\",\"decimal-463\":\"12.84\",\"enum-463\":\"first option\",\"radio-463\":\"option a\",\"pill_text-463\":\"\",\"file-463\":\"5db162cd6ec93\",\"_sipForTypo3Vars\":\"5db162cd6edbe\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"463\",\"s\":\"5db162cc52360\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=463\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.70 Safari/537.36',1007,463,1,'187c4d6db81dfb2f98a1fe96736cfa6e','2019-10-24 08:37:34'),(665,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"El2ZKY5GHi32s68OOBZktPDV8Wvt6SuH\",\"number-0\":\"2035755839\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"pill_text-0\":\"sEvQ3kq5qcMQYiRR0Mtsay28lOkz59Gs\",\"file-0\":\"5db162d085fec\",\"_sipForTypo3Vars\":\"5db162c48d706\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db162c35ee2d\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.70 Safari/537.36',1007,0,3,'187c4d6db81dfb2f98a1fe96736cfa6e','2019-10-24 08:37:39'),(666,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"eph83V33lfVeCVfFyr4K1GLh2zLSxLtd\",\"number-0\":\"806518975\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"pill_text-0\":\"\",\"file-0\":\"5db162dc32615\",\"_sipForTypo3Vars\":\"5db162c48d706\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db162c35ee2d\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.70 Safari/537.36',1007,0,3,'187c4d6db81dfb2f98a1fe96736cfa6e','2019-10-24 08:37:50'),(667,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"WeJVJABuJsTE4rEEc4LeVGpTtdmzkSQH\",\"number-0\":\"1688209097\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"pill_text-0\":\"\",\"file-0\":\"5db162e0d231c\",\"_sipForTypo3Vars\":\"5db162c48d706\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db162c35ee2d\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.70 Safari/537.36',1007,0,3,'187c4d6db81dfb2f98a1fe96736cfa6e','2019-10-24 08:37:57'),(668,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"7651d2456f49adb2598bf39157709d84\",\"enabled-507\":\"yes\",\"dynamicUpdate-507\":\"no\",\"mode-507\":\"show\",\"class-507\":\"native\",\"_h_subrecordOption-507\":\"\",\"encode-507\":\"specialchar\",\"checkType-507\":\"auto\",\"labelAlign-507\":\"default\",\"_h_rowLabelInputNote-507\":\"\",\"feIdContainer-507\":\"505\",\"name-507\":\"file\",\"label-507\":\"File Upload\",\"modeSql-507\":\"\",\"type-507\":\"upload\",\"parameterLanguageA-507\":\"\",\"parameterLanguageB-507\":\"\",\"parameterLanguageC-507\":\"\",\"parameterLanguageD-507\":\"\",\"checkPattern-507\":\"\",\"ord-507\":\"120\",\"adminNote-507\":\"\",\"size-507\":\"\",\"bsLabelColumns-507\":\"\",\"bsInputColumns-507\":\"\",\"bsNoteColumns-507\":\"\",\"_0_rowLabelInputNote-507\":\"row\",\"_1_rowLabelInputNote-507\":\"label\",\"_2_rowLabelInputNote-507\":\"\\/label\",\"_3_rowLabelInputNote-507\":\"input\",\"_4_rowLabelInputNote-507\":\"\\/input\",\"_5_rowLabelInputNote-507\":\"note\",\"_6_rowLabelInputNote-507\":\"\\/note\",\"_7_rowLabelInputNote-507\":\"\\/row\",\"maxLength-507\":\"\",\"note-507\":\"\",\"tooltip-507\":\"\",\"placeholder-507\":\"\",\"value-507\":\"\",\"sql1-507\":\"\",\"parameter-507\":\"accept = .txt\\r\\n\\r\\nfileDestination={{ SELECT CONCAT(\'fileadmin\\/{{id:R}}_{{filename}}\') }}\\r\\n\\r\\ndownloadButton = t:{{SELECT SUBSTRING(\'{{file:R}}\', LOCATE(\'_\', \'{{file:R}}\')+1) }}\\r\\nmaxFileSize = \'64B\'\",\"_sipForTypo3Vars\":\"5db15d8134147\"}','{\"__dbIndexData\":\"1\",\"form\":\"formElement\",\"formId\":\"1007\",\"r\":\"507\",\"s\":\"5db14a8448378\",\"urlparam\":\"__dbIndexData=1&form=formElement&formId=1007&r=507\"}','192.168.133.203','','Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:69.0) Gecko/20100101 Firefox/69.0',2,507,1,'83228dfc9b11c970e5af54a8d48eca25','2019-10-24 08:39:16'),(669,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"7f672b2fca6ee73ba1b93ed300361aae\",\"_h_checkbox-459\":\"\",\"text-459\":\"UG1pKLUcy7y0dN7noxT0Lkvlk\",\"number-459\":\"278254368\",\"date-459\":\"01.01.2188\",\"datetime-459\":\"02.02.2188 01:08\",\"decimal-459\":\"12.84\",\"enum-459\":\"first option\",\"radio-459\":\"option a\",\"pill_text-459\":\"1jyUsJW9jDCzVR9u5BrVIeH90BjQptu6\",\"file-459\":\"5db163386d28a\",\"_sipForTypo3Vars\":\"5db15d8134147\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"459\",\"s\":\"5db16336117b4\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=459\"}','192.168.133.203','','Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:69.0) Gecko/20100101 Firefox/69.0',1007,459,1,'83228dfc9b11c970e5af54a8d48eca25','2019-10-24 08:39:26'),(670,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"RHvEnEexShrrpgCeRjV1E6dEIF23uy6T\",\"number-0\":\"1161010673\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"pill_text-0\":\"\",\"file-0\":\"5db163c4058e6\",\"_sipForTypo3Vars\":\"5db163c2c52ce\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db163c1c117d\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.70 Safari/537.36',1007,0,3,'ead77b0d572b945749a94aabd370cc25','2019-10-24 08:41:42'),(671,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"K32aKR614y3hC8MSiFfIICWpdoBUr521\",\"number-0\":\"2085556490\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"pill_text-0\":\"\",\"file-0\":\"5db163c84f74c\",\"_sipForTypo3Vars\":\"5db163c2c52ce\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db163c1c117d\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.70 Safari/537.36',1007,0,3,'ead77b0d572b945749a94aabd370cc25','2019-10-24 08:41:46'),(672,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"ae88288d9bd360812e88eccd7d514218\",\"_h_checkbox-468\":\"\",\"text-468\":\"JHD2pTbArENFVy6P6kOtA5LBToSQJLKp\",\"number-468\":\"722677428\",\"date-468\":\"01.01.2188\",\"datetime-468\":\"02.02.2188 01:08\",\"decimal-468\":\"12.84\",\"enum-468\":\"first option\",\"radio-468\":\"option a\",\"pill_text-468\":\"\",\"file-468\":\"5db163cb71dc9\",\"_sipForTypo3Vars\":\"5db163cb71e9a\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"468\",\"s\":\"5db163ca3dc72\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=468\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.70 Safari/537.36',1007,468,1,'ead77b0d572b945749a94aabd370cc25','2019-10-24 08:41:48'),(673,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"1c98sPRf9ghdxjmZgiey2g49rXg6NrBv\",\"number-0\":\"368222809\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"pill_text-0\":\"P8BuLiyw1EfnyiACdArkVLsLWViLpdd1\",\"file-0\":\"5db163cea672c\",\"_sipForTypo3Vars\":\"5db163c2c52ce\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db163c1c117d\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.70 Safari/537.36',1007,0,3,'ead77b0d572b945749a94aabd370cc25','2019-10-24 08:41:53'),(674,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"eev5Ov6vLkhLbXvGpoLu3F8M9ZQ2OiqA\",\"number-0\":\"725492984\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"pill_text-0\":\"\",\"file-0\":\"5db163da0ead1\",\"_sipForTypo3Vars\":\"5db163c2c52ce\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db163c1c117d\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.70 Safari/537.36',1007,0,3,'ead77b0d572b945749a94aabd370cc25','2019-10-24 08:42:04'),(675,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"p2qO5QYHl4nrYzkBERJc6ycAqZZajkOA\",\"number-0\":\"286900588\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"pill_text-0\":\"\",\"file-0\":\"5db163de8388a\",\"_sipForTypo3Vars\":\"5db163c2c52ce\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db163c1c117d\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.70 Safari/537.36',1007,0,3,'ead77b0d572b945749a94aabd370cc25','2019-10-24 08:42:10'),(676,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"v9B1wevCcZCuPZDhfsXrGJTNanAGlmYT\",\"number-0\":\"2059800387\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"pill_text-0\":\"\",\"file-0\":\"5db163e543638\",\"_sipForTypo3Vars\":\"5db163c2c52ce\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db163c1c117d\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.70 Safari/537.36',1007,0,3,'ead77b0d572b945749a94aabd370cc25','2019-10-24 08:42:17'),(677,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"tQc7nnTOIOc2TSyQvhCyBBeVDV4MSHuz\",\"number-0\":\"614586746\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"pill_text-0\":\"\",\"file-0\":\"5db164118bd63\",\"_sipForTypo3Vars\":\"5db164118be3f\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db1641099632\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.70 Safari/537.36',1007,0,3,'e0e91789b616da0ba542fd94370d2402','2019-10-24 08:43:02'),(678,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"ubXlV2UUN5XVdJTqIUhuqzVCGyxtjx0d\",\"number-0\":\"383557029\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"pill_text-0\":\"\",\"file-0\":\"5db164347f12f\",\"_sipForTypo3Vars\":\"5db16433a7e67\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db16432923b2\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,0,3,'e62940429a6a258f9e295ce7e3584c33','2019-10-24 08:43:34'),(679,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"IfrVOXQJq8gmfWQWoPfsRhp2FspHszeJ\",\"number-0\":\"2003999193\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"pill_text-0\":\"\",\"file-0\":\"5db16437bcb5c\",\"_sipForTypo3Vars\":\"5db16433a7e67\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db16432923b2\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,0,3,'e62940429a6a258f9e295ce7e3584c33','2019-10-24 08:43:37'),(680,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"4f3177167195daa5fa322ef21a3163a7\",\"_h_checkbox-475\":\"\",\"text-475\":\"12pf47jcV3CUxbNHO1JG4vuxBFLq6fFs\",\"number-475\":\"1155712852\",\"date-475\":\"01.01.2188\",\"datetime-475\":\"02.02.2188 01:08\",\"decimal-475\":\"12.84\",\"enum-475\":\"first option\",\"radio-475\":\"option a\",\"pill_text-475\":\"\",\"file-475\":\"5db1643a5fa2d\",\"_sipForTypo3Vars\":\"5db1643a5fb38\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"475\",\"s\":\"5db16439978d2\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=475\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,475,1,'e62940429a6a258f9e295ce7e3584c33','2019-10-24 08:43:39'),(681,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"LaiHbTvkDYZP00Ejjr4MpsczIYw8sIuk\",\"number-0\":\"423895230\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"pill_text-0\":\"\",\"file-0\":\"5db1647200cd8\",\"_sipForTypo3Vars\":\"5db1647131ea9\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db16470433c4\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,0,3,'425426737d93cbd907bf7545d806d248','2019-10-24 08:44:35'),(682,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"cntpw\",\"number-0\":\"416840918\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"pill_text-0\":\"\",\"file-0\":\"5db164b567fb1\",\"_sipForTypo3Vars\":\"5db164b453f2e\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db164b34a7d3\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.70 Safari/537.36',1007,0,3,'995c6d7bd2d89eb67490cfcc4564bbed','2019-10-24 08:45:43'),(683,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"8O2sHg41VKZbGbccAuBMbZIqszFrURKd\",\"number-0\":\"123859952\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"pill_text-0\":\"\",\"file-0\":\"5db164b8835c7\",\"_sipForTypo3Vars\":\"5db164b453f2e\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db164b34a7d3\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.70 Safari/537.36',1007,0,3,'995c6d7bd2d89eb67490cfcc4564bbed','2019-10-24 08:45:46'),(684,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"70696752806a3e1ba67a5ae4cd3a0705\",\"_h_checkbox-478\":\"\",\"text-478\":\"RE8ygOvtpf5dJWA4k0F4DdUOj0bLHyiG\",\"number-478\":\"953796525\",\"date-478\":\"01.01.2188\",\"datetime-478\":\"02.02.2188 01:08\",\"decimal-478\":\"12.84\",\"enum-478\":\"first option\",\"radio-478\":\"option a\",\"pill_text-478\":\"\",\"file-478\":\"5db164bb62a5b\",\"_sipForTypo3Vars\":\"5db164bb62b3d\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"478\",\"s\":\"5db164ba6958c\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=478\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.70 Safari/537.36',1007,478,1,'995c6d7bd2d89eb67490cfcc4564bbed','2019-10-24 08:45:48'),(685,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"bcBIxEScm3Ut5mnRJulli3WEaDSAUT8B\",\"number-0\":\"1563359425\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"pill_text-0\":\"hW1bGxNuR8bWWUPoXPocPJKxPdNZe3vV\",\"file-0\":\"5db164be44a5d\",\"_sipForTypo3Vars\":\"5db164b453f2e\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db164b34a7d3\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.70 Safari/537.36',1007,0,3,'995c6d7bd2d89eb67490cfcc4564bbed','2019-10-24 08:45:52'),(686,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"Vdsal0fGaU8oodJNU20Z2sZRotBernl9\",\"number-0\":\"1452973565\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"pill_text-0\":\"\",\"file-0\":\"5db164f73263f\",\"_sipForTypo3Vars\":\"5db164f651737\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db164f55ffe1\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,0,3,'1e2bbbd0669e7ae173518fd932a73eb9','2019-10-24 08:46:49'),(687,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"yz0ZInuOiZaVb9GzYHvjJNELSjySdYyG\",\"number-0\":\"576939468\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"pill_text-0\":\"\",\"file-0\":\"5db164fa85f52\",\"_sipForTypo3Vars\":\"5db164f651737\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db164f55ffe1\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,0,3,'1e2bbbd0669e7ae173518fd932a73eb9','2019-10-24 08:46:52'),(688,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"57a8839fcc6a06da9d05a90267631725\",\"_h_checkbox-481\":\"\",\"text-481\":\"RMrpzmTzBsAptJ8SeoWYpaDKUU6Vxiiv\",\"number-481\":\"1662329309\",\"date-481\":\"01.01.2188\",\"datetime-481\":\"02.02.2188 01:08\",\"decimal-481\":\"12.84\",\"enum-481\":\"first option\",\"radio-481\":\"option a\",\"pill_text-481\":\"\",\"file-481\":\"5db164fd73e45\",\"_sipForTypo3Vars\":\"5db164fd73f13\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"481\",\"s\":\"5db164fc9459b\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=481\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,481,1,'1e2bbbd0669e7ae173518fd932a73eb9','2019-10-24 08:46:54'),(689,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"tSfIe5BNde0Fm8ZjiY2bcjxBV3XLTZQg\",\"number-0\":\"202176002\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"pill_text-0\":\"1NT7oPNeS2WjpMeAJFHobzqEERr96A4u\",\"file-0\":\"5db164ffd64d5\",\"_sipForTypo3Vars\":\"5db164f651737\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db164f55ffe1\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,0,3,'1e2bbbd0669e7ae173518fd932a73eb9','2019-10-24 08:46:58'),(690,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"9YkO3oSKYyoX7iSMmIpgnQy0vtSVDxsN\",\"number-0\":\"1767530670\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"pill_text-0\":\"\",\"file-0\":\"5db16509c4e8b\",\"_sipForTypo3Vars\":\"5db164f651737\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db164f55ffe1\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,0,3,'1e2bbbd0669e7ae173518fd932a73eb9','2019-10-24 08:47:07'),(691,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"aliwckeSOjLrThdVKHx36lwvPGstxLrZ\",\"number-0\":\"1958547058\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"pill_text-0\":\"\",\"file-0\":\"5db1650d62afb\",\"_sipForTypo3Vars\":\"5db164f651737\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db164f55ffe1\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,0,3,'1e2bbbd0669e7ae173518fd932a73eb9','2019-10-24 08:47:13'),(692,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"XA4e1MhZXYfJVK3ajrJS3YXdSGqYtgs9\",\"number-0\":\"900035736\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"pill_text-0\":\"\",\"file-0\":\"5db16512f2213\",\"_sipForTypo3Vars\":\"5db164f651737\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db164f55ffe1\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,0,3,'1e2bbbd0669e7ae173518fd932a73eb9','2019-10-24 08:47:19'),(693,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"u3cDNm1hjatnPLjbA6fyPdqjyKBVKzk1\",\"number-0\":\"406813614\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"pill_text-0\":\"\",\"file-0\":\"5db16543bc7f2\",\"_sipForTypo3Vars\":\"5db16542e1c4f\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db1654215123\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,0,3,'b9ba953cd99c723d691d61eacdc7f92e','2019-10-24 08:48:05'),(694,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"DXI7kyqvwW4HVnNf9qHqxvnIcOIYr6GN\",\"number-0\":\"1967177991\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"pill_text-0\":\"\",\"file-0\":\"5db16546f3bac\",\"_sipForTypo3Vars\":\"5db16542e1c4f\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db1654215123\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,0,3,'b9ba953cd99c723d691d61eacdc7f92e','2019-10-24 08:48:08'),(695,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"e2fd6d01d1b94649180bcf748ca8776c\",\"_h_checkbox-487\":\"\",\"text-487\":\"nYP8epkH9WekcgjbnBTLT666lJwIcuzJ\",\"number-487\":\"1520307483\",\"date-487\":\"01.01.2188\",\"datetime-487\":\"02.02.2188 01:08\",\"decimal-487\":\"12.84\",\"enum-487\":\"first option\",\"radio-487\":\"option a\",\"pill_text-487\":\"\",\"file-487\":\"5db16549ac08f\",\"_sipForTypo3Vars\":\"5db16549ac198\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"487\",\"s\":\"5db16548d9aea\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=487\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,487,1,'b9ba953cd99c723d691d61eacdc7f92e','2019-10-24 08:48:10'),(696,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"ZHPnOBpZ7dPG64CfCls55AJWb5Y1sHrZ\",\"number-0\":\"911476118\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"pill_text-0\":\"lJmmzyHiiLLXSwcdkCDnzqRNAvrDCfIe\",\"file-0\":\"5db1654c0853e\",\"_sipForTypo3Vars\":\"5db16542e1c4f\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db1654215123\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,0,3,'b9ba953cd99c723d691d61eacdc7f92e','2019-10-24 08:48:14'),(697,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"2PbBKEpPdFq3vEM0xfYubhvZJl5eIZzj\",\"number-0\":\"1026234355\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"pill_text-0\":\"\",\"file-0\":\"5db16555ea4dc\",\"_sipForTypo3Vars\":\"5db16542e1c4f\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db1654215123\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,0,3,'b9ba953cd99c723d691d61eacdc7f92e','2019-10-24 08:48:24'),(698,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"0wsWliGT1NHqQZHqncc50YjcPqoQlUL9\",\"number-0\":\"1375194563\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"pill_text-0\":\"\",\"file-0\":\"5db165597d6f9\",\"_sipForTypo3Vars\":\"5db16542e1c4f\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db1654215123\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,0,3,'b9ba953cd99c723d691d61eacdc7f92e','2019-10-24 08:48:29'),(699,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"VUFsqjbyiF41ECoe8fKXUmhkGV0uDa8q\",\"number-0\":\"1884503256\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"pill_text-0\":\"\",\"file-0\":\"5db1655f1abc0\",\"_sipForTypo3Vars\":\"5db16542e1c4f\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db1654215123\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,0,3,'b9ba953cd99c723d691d61eacdc7f92e','2019-10-24 08:48:35'),(700,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"Ef96DECn6LdnuYDas3KKnk0YRfgyjctJ\",\"number-0\":\"1597615670\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"pill_text-0\":\"\",\"file-0\":\"5db1658199c50\",\"_sipForTypo3Vars\":\"5db16580cfd90\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db1658004768\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,0,3,'9f8ef6290955a06d0eb1ff42c6659a7c','2019-10-24 08:49:07'),(701,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"VJP9PBbjrW5ze9BeU6YJi8sOZHt2FJvp\",\"number-0\":\"982275866\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"pill_text-0\":\"\",\"file-0\":\"5db16584cb1c4\",\"_sipForTypo3Vars\":\"5db16580cfd90\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db1658004768\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,0,3,'9f8ef6290955a06d0eb1ff42c6659a7c','2019-10-24 08:49:10'),(702,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"ab2f7545ee63bf71aff43db1b0404200\",\"_h_checkbox-493\":\"\",\"text-493\":\"J1k9h7Zy4WkpGf5WmWnRUxqApC2PsQwE\",\"number-493\":\"251031004\",\"date-493\":\"01.01.2188\",\"datetime-493\":\"02.02.2188 01:08\",\"decimal-493\":\"12.84\",\"enum-493\":\"first option\",\"radio-493\":\"option a\",\"pill_text-493\":\"\",\"file-493\":\"5db1658769e04\",\"_sipForTypo3Vars\":\"5db1658769ef0\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"493\",\"s\":\"5db16586a2ec5\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=493\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,493,1,'9f8ef6290955a06d0eb1ff42c6659a7c','2019-10-24 08:49:12'),(703,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"zdfrxvRNXIpHo50IUjbFuASfAclIwZUR\",\"number-0\":\"1706731444\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"pill_text-0\":\"TJYsibZCGDPcFTi1HAXVMWLY9Zil9CYg\",\"file-0\":\"5db16589aea81\",\"_sipForTypo3Vars\":\"5db16580cfd90\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db1658004768\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,0,3,'9f8ef6290955a06d0eb1ff42c6659a7c','2019-10-24 08:49:16'),(704,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"5BBqveZkl9qtPmO8nLPrwA2sJLcyooiH\",\"number-0\":\"146979532\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"pill_text-0\":\"\",\"file-0\":\"5db165935ea03\",\"_sipForTypo3Vars\":\"5db16580cfd90\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db1658004768\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,0,3,'9f8ef6290955a06d0eb1ff42c6659a7c','2019-10-24 08:49:25'),(705,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"9E2D5yw9GIbrXjtM9Hrk1vqyR6Tir5Y5\",\"number-0\":\"337240715\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"pill_text-0\":\"\",\"file-0\":\"5db16597006e5\",\"_sipForTypo3Vars\":\"5db16580cfd90\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db1658004768\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,0,3,'9f8ef6290955a06d0eb1ff42c6659a7c','2019-10-24 08:49:31'),(706,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"7SvDzVIzm3eHwbxekOHmOIJacfavRjGT\",\"number-0\":\"271639318\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"pill_text-0\":\"\",\"file-0\":\"5db1659caa4c4\",\"_sipForTypo3Vars\":\"5db16580cfd90\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db1658004768\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,0,3,'9f8ef6290955a06d0eb1ff42c6659a7c','2019-10-24 08:49:36'),(707,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"cYYolKxilzFMFTSOotrL95gTxrDYTW6E\",\"number-0\":\"1938870251\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"pill_text-0\":\"\",\"file-0\":\"5db1673940a0b\",\"_sipForTypo3Vars\":\"5db16738624be\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db167376705e\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,0,3,'9d67983d90efa403e050ebab3cecd9ea','2019-10-24 08:56:27'),(708,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"OlXY7BDuSsgmCeewN9e5FPmp5sQVkzju\",\"number-0\":\"551408745\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"pill_text-0\":\"\",\"file-0\":\"5db1673c8b2e8\",\"_sipForTypo3Vars\":\"5db16738624be\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db167376705e\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,0,3,'9d67983d90efa403e050ebab3cecd9ea','2019-10-24 08:56:30'),(709,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"37df73ce22b156cbd31e50c2466541d3\",\"_h_checkbox-499\":\"\",\"text-499\":\"cCeZeddD3echeJFhTqNkfUbbqyoWx5GR\",\"number-499\":\"2083673469\",\"date-499\":\"01.01.2188\",\"datetime-499\":\"02.02.2188 01:08\",\"decimal-499\":\"12.84\",\"enum-499\":\"first option\",\"radio-499\":\"option a\",\"pill_text-499\":\"\",\"file-499\":\"5db1673f23170\",\"_sipForTypo3Vars\":\"5db1673f23245\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"499\",\"s\":\"5db1673e5373c\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=499\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,499,1,'9d67983d90efa403e050ebab3cecd9ea','2019-10-24 08:56:32'),(710,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"llKDavAYSWG7PvBeJwgIQKgp485DmN2s\",\"number-0\":\"1960356686\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"pill_text-0\":\"9on8Gpc5WaQjc1td39ffmIiqbqv8Y55Y\",\"file-0\":\"5db167417a452\",\"_sipForTypo3Vars\":\"5db16738624be\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db167376705e\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,0,3,'9d67983d90efa403e050ebab3cecd9ea','2019-10-24 08:56:35'),(711,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"G37004gVAeh1Sg0YxSYFlwxjj5M1Bkem\",\"number-0\":\"921785415\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"pill_text-0\":\"\",\"file-0\":\"5db1674b0e438\",\"_sipForTypo3Vars\":\"5db16738624be\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db167376705e\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,0,3,'9d67983d90efa403e050ebab3cecd9ea','2019-10-24 08:56:45'),(712,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"jGLeZrUFdpLszOiJ2YVpI4hi3ho4OB0g\",\"number-0\":\"1461579132\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"pill_text-0\":\"\",\"file-0\":\"5db1674e95f8c\",\"_sipForTypo3Vars\":\"5db16738624be\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db167376705e\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,0,3,'9d67983d90efa403e050ebab3cecd9ea','2019-10-24 08:56:50'),(713,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"N28hXHdtIDLgzczBapHloHaXamtZO15C\",\"number-0\":\"1586911343\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"pill_text-0\":\"\",\"file-0\":\"5db167544f7f4\",\"_sipForTypo3Vars\":\"5db16738624be\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db167376705e\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,0,3,'9d67983d90efa403e050ebab3cecd9ea','2019-10-24 08:56:56'),(714,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"vHGNUEIvLVgW6JcjDrbdYcBrpASQd5OJ\",\"number-0\":\"1018719625\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"pill_text-0\":\"\",\"file-0\":\"5db16aac027a3\",\"_sipForTypo3Vars\":\"5db16aab29784\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db16aaa44061\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,0,3,'4f175539c20d60ddda3ca0f651fac763','2019-10-24 09:11:10'),(715,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"291SfLDUPBVs8Qfb0w230NSYX4XISdBZ\",\"number-0\":\"1930272307\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"pill_text-0\":\"\",\"file-0\":\"5db16aaf873e7\",\"_sipForTypo3Vars\":\"5db16aab29784\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db16aaa44061\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,0,3,'4f175539c20d60ddda3ca0f651fac763','2019-10-24 09:11:13'),(716,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d718e950ced4272d97b03eb65717f449\",\"_h_checkbox-505\":\"\",\"text-505\":\"186NP0zqtGB00JBroJGio5F2DSiaiKSv\",\"number-505\":\"909217145\",\"date-505\":\"01.01.2188\",\"datetime-505\":\"02.02.2188 01:08\",\"decimal-505\":\"12.84\",\"enum-505\":\"first option\",\"radio-505\":\"option a\",\"pill_text-505\":\"\",\"file-505\":\"5db16ab21a241\",\"_sipForTypo3Vars\":\"5db16ab21a39a\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"505\",\"s\":\"5db16ab153feb\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=505\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,505,1,'4f175539c20d60ddda3ca0f651fac763','2019-10-24 09:11:15'),(717,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"5qdDB3rD407UKtynJs5MJQ8sXJXUQ4gn\",\"number-0\":\"194623589\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"pill_text-0\":\"bcdeKqyXQVX2Yy5t6HZOvco4TnySmVkq\",\"file-0\":\"5db16ab4652f4\",\"_sipForTypo3Vars\":\"5db16aab29784\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db16aaa44061\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,0,3,'4f175539c20d60ddda3ca0f651fac763','2019-10-24 09:11:18'),(718,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"9dR6xMCS3mFilbyvkGr21VXQwmd6RKbC\",\"number-0\":\"839601628\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"pill_text-0\":\"\",\"file-0\":\"5db16abde5b7f\",\"_sipForTypo3Vars\":\"5db16aab29784\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db16aaa44061\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,0,3,'4f175539c20d60ddda3ca0f651fac763','2019-10-24 09:11:28'),(719,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"dz3UpSvaMv4xjorp5fzHc6uJKzIJDWi2\",\"number-0\":\"1404693667\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"pill_text-0\":\"\",\"file-0\":\"5db16ac169467\",\"_sipForTypo3Vars\":\"5db16aab29784\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db16aaa44061\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,0,3,'4f175539c20d60ddda3ca0f651fac763','2019-10-24 09:11:33'),(720,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"6fou32EwpHAMiCwE6qvlCvhHUc3StDrP\",\"number-0\":\"1237686502\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"pill_text-0\":\"\",\"file-0\":\"5db16ac7336d2\",\"_sipForTypo3Vars\":\"5db16aab29784\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db16aaa44061\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,0,3,'4f175539c20d60ddda3ca0f651fac763','2019-10-24 09:11:39'),(721,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"LO4IwBlUg0JU62E7x1lSWMcRRsWueoI2\",\"number-0\":\"2062840189\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"pill_text-0\":\"\",\"file-0\":\"5db17cd8c52f2\",\"_sipForTypo3Vars\":\"5db17cd7f3c19\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db17cd719c2a\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,0,3,'3d201c5972ae36c467613ac13c76baf3','2019-10-24 10:28:42'),(722,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"893ThZJIGcHMUWCJ5vglgS2UCZEnKM0W\",\"number-0\":\"1764892292\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"pill_text-0\":\"\",\"file-0\":\"5db17cdc34c0a\",\"_sipForTypo3Vars\":\"5db17cd7f3c19\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db17cd719c2a\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,0,3,'3d201c5972ae36c467613ac13c76baf3','2019-10-24 10:28:46'),(723,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"hn82zQhnXh72poN6L0jfcoTq1jT65s9h\",\"number-0\":\"1558582740\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"pill_text-0\":\"\",\"file-0\":\"5db17ced0e6c1\",\"_sipForTypo3Vars\":\"5db17cec49020\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db17ceb5cd46\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,0,3,'e5eee26a1b659e56fff775a5e41688bb','2019-10-24 10:29:02'),(724,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"eDTXvWGVHrEo4RBwsSON3STd9vbYMuTF\",\"number-0\":\"1347208198\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"pill_text-0\":\"\",\"file-0\":\"5db17cf035c3c\",\"_sipForTypo3Vars\":\"5db17cec49020\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db17ceb5cd46\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,0,3,'e5eee26a1b659e56fff775a5e41688bb','2019-10-24 10:29:06'),(725,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"261860529dce6920a7b60f443885c67f\",\"_h_checkbox-513\":\"\",\"text-513\":\"8iIdC13QTG58jP79rrSc2x6QgbT2nzXs\",\"number-513\":\"1264089693\",\"date-513\":\"01.01.2188\",\"datetime-513\":\"02.02.2188 01:08\",\"decimal-513\":\"12.84\",\"enum-513\":\"first option\",\"radio-513\":\"option a\",\"pill_text-513\":\"\",\"file-513\":\"5db17cf2cd4f7\",\"_sipForTypo3Vars\":\"5db17cf2cd605\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"513\",\"s\":\"5db17cf2151b5\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=513\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,513,1,'e5eee26a1b659e56fff775a5e41688bb','2019-10-24 10:29:08'),(726,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"vKmkzeIp66XQkCCGhNoB1ULoK8e1nKZ6\",\"number-0\":\"546211406\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"pill_text-0\":\"dGaDGhNqU9Crrep78m0qPorDWfBB9zjC\",\"file-0\":\"5db17cf4a4c70\",\"_sipForTypo3Vars\":\"5db17cec49020\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db17ceb5cd46\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,0,3,'e5eee26a1b659e56fff775a5e41688bb','2019-10-24 10:29:11'),(727,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"efYnesqqVfomtMiYBPbBXQDOhqtAtrhP\",\"number-0\":\"701519288\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"pill_text-0\":\"\",\"file-0\":\"5db17cfe9845f\",\"_sipForTypo3Vars\":\"5db17cec49020\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db17ceb5cd46\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,0,3,'e5eee26a1b659e56fff775a5e41688bb','2019-10-24 10:29:20'),(728,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"sRSDaF1owBInAqsnRRMofeWIngNwVYuD\",\"number-0\":\"76981416\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"pill_text-0\":\"\",\"file-0\":\"5db17d022de53\",\"_sipForTypo3Vars\":\"5db17cec49020\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db17ceb5cd46\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,0,3,'e5eee26a1b659e56fff775a5e41688bb','2019-10-24 10:29:26'),(729,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"Ln8tpfKjYlsaQ1VQCjWQ6423BbUlnU8J\",\"number-0\":\"916365534\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"pill_text-0\":\"\",\"file-0\":\"5db17d07b9624\",\"_sipForTypo3Vars\":\"5db17cec49020\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db17ceb5cd46\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,0,3,'e5eee26a1b659e56fff775a5e41688bb','2019-10-24 10:29:31'),(730,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"zsjRtysdb0UdzD1SDkeYpDeblKkHT9Q4\",\"number-0\":\"1434562747\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"pill_text-0\":\"\",\"file-0\":\"5db17d3dad02f\",\"_sipForTypo3Vars\":\"5db17d3c5550a\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db17d3b63a07\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.70 Safari/537.36',1007,0,3,'26e20c3778d2b653250b7575db1e2e41','2019-10-24 10:30:24'),(731,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"4G2VjcfUvY1mGamwDP3pccQq8wu2nb0Y\",\"number-0\":\"609355213\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"pill_text-0\":\"\",\"file-0\":\"5db17d4242fe4\",\"_sipForTypo3Vars\":\"5db17d3c5550a\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db17d3b63a07\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.70 Safari/537.36',1007,0,3,'26e20c3778d2b653250b7575db1e2e41','2019-10-24 10:30:28'),(732,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"28389a22d896bb1d7e9a0922583ee26b\",\"_h_checkbox-519\":\"\",\"text-519\":\"0ys7EgQU6J4q1W8T6tvQZWyAw3YqLT0b\",\"number-519\":\"153958829\",\"date-519\":\"01.01.2188\",\"datetime-519\":\"02.02.2188 01:08\",\"decimal-519\":\"12.84\",\"enum-519\":\"first option\",\"radio-519\":\"option a\",\"pill_text-519\":\"\",\"file-519\":\"5db17d456dd9d\",\"_sipForTypo3Vars\":\"5db17d456de7d\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"519\",\"s\":\"5db17d443fcbe\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=519\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.70 Safari/537.36',1007,519,1,'26e20c3778d2b653250b7575db1e2e41','2019-10-24 10:30:30'),(733,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"7xAAePNAEK0zgSOvaZ529scueVE2M6Se\",\"number-0\":\"926729699\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"pill_text-0\":\"cVjy6bSe9EnNnxZ2NA2h8NYVkq0P1xES\",\"file-0\":\"5db17d48732e2\",\"_sipForTypo3Vars\":\"5db17d3c5550a\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db17d3b63a07\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.70 Safari/537.36',1007,0,3,'26e20c3778d2b653250b7575db1e2e41','2019-10-24 10:30:35'),(734,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"EvzEr0yDxjHszW9NKFjjMGdibVIzupmk\",\"number-0\":\"79110406\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"pill_text-0\":\"\",\"file-0\":\"5db17d576f0fe\",\"_sipForTypo3Vars\":\"5db17d3c5550a\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db17d3b63a07\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.70 Safari/537.36',1007,0,3,'26e20c3778d2b653250b7575db1e2e41','2019-10-24 10:30:49'),(735,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"pDUkVDEIRfD9e956lL3Yrclz2Nk2ih9V\",\"number-0\":\"1598122993\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"pill_text-0\":\"\",\"file-0\":\"5db17d5c27bb8\",\"_sipForTypo3Vars\":\"5db17d3c5550a\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db17d3b63a07\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.70 Safari/537.36',1007,0,3,'26e20c3778d2b653250b7575db1e2e41','2019-10-24 10:30:56'),(736,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"iOn1Rs902QMzPr5uQlWDbUt95mNzYomH\",\"number-0\":\"377605983\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"pill_text-0\":\"\",\"file-0\":\"5db17d6275974\",\"_sipForTypo3Vars\":\"5db17d3c5550a\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db17d3b63a07\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.70 Safari/537.36',1007,0,3,'26e20c3778d2b653250b7575db1e2e41','2019-10-24 10:31:02'),(737,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"3l686lvsLxxf55d3NhPqniiRGie2upKi\",\"number-0\":\"2079583719\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"pill_text-0\":\"\",\"file-0\":\"5db17d7003758\",\"_sipForTypo3Vars\":\"5db17d6f3b83f\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db17d6e68532\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,0,3,'5ae5f2deb6909a7343f670a398edd5b1','2019-10-24 10:31:14'),(738,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"1smdFaMXTt0Pet4QyWjQWEdO6e5faFt2\",\"number-0\":\"1086539381\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"pill_text-0\":\"\",\"file-0\":\"5db17d7381bb8\",\"_sipForTypo3Vars\":\"5db17d6f3b83f\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db17d6e68532\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,0,3,'5ae5f2deb6909a7343f670a398edd5b1','2019-10-24 10:31:17'),(739,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"3b6ba373676dfed645bb977cd1eb2441\",\"_h_checkbox-525\":\"\",\"text-525\":\"RKWt3oEnTcqRt1m9LPf7D77GqW0K1du2\",\"number-525\":\"909005235\",\"date-525\":\"01.01.2188\",\"datetime-525\":\"02.02.2188 01:08\",\"decimal-525\":\"12.84\",\"enum-525\":\"first option\",\"radio-525\":\"option a\",\"pill_text-525\":\"\",\"file-525\":\"5db17d762eadc\",\"_sipForTypo3Vars\":\"5db17d762ebb7\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"525\",\"s\":\"5db17d755cfd8\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=525\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,525,1,'5ae5f2deb6909a7343f670a398edd5b1','2019-10-24 10:31:19'),(740,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"lcC45DAtD4BQBLUwuZDqReL95jz0UpNQ\",\"number-0\":\"45026584\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"pill_text-0\":\"jZhY87fVHVUNScaUNw7NQ2N35BngYXeO\",\"file-0\":\"5db17d78928e5\",\"_sipForTypo3Vars\":\"5db17d6f3b83f\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db17d6e68532\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,0,3,'5ae5f2deb6909a7343f670a398edd5b1','2019-10-24 10:31:23'),(741,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"ZpgmMyGlIuEz20nkkIiGFhERu61vyC9R\",\"number-0\":\"1841847094\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"pill_text-0\":\"\",\"file-0\":\"5db17d829f664\",\"_sipForTypo3Vars\":\"5db17d6f3b83f\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db17d6e68532\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,0,3,'5ae5f2deb6909a7343f670a398edd5b1','2019-10-24 10:31:32'),(742,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"UPjG7sleyNDhZ6OBXjokZHyLcxXpOCrt\",\"number-0\":\"1570278097\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"pill_text-0\":\"\",\"file-0\":\"5db17d865586e\",\"_sipForTypo3Vars\":\"5db17d6f3b83f\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db17d6e68532\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,0,3,'5ae5f2deb6909a7343f670a398edd5b1','2019-10-24 10:31:38'),(743,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"ZxtZfK6DPZaGqruv5n5TgJclYrT87kXb\",\"number-0\":\"1165798017\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"pill_text-0\":\"\",\"file-0\":\"5db17d8bed6d6\",\"_sipForTypo3Vars\":\"5db17d6f3b83f\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db17d6e68532\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,0,3,'5ae5f2deb6909a7343f670a398edd5b1','2019-10-24 10:31:44'),(744,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"ixZ3B4XJRruiSO715jZSh4M9PdCRrLKV\",\"number-0\":\"677292815\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"pill_text-0\":\"\",\"file-0\":\"5db1835e9f043\",\"_sipForTypo3Vars\":\"5db1835dd7c41\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db1835cf215c\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,0,3,'7f1e8e5cfa046e6bded631f6b36b8462','2019-10-24 10:56:32'),(745,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"gSlgIGGpopET4wMVLy4jxx4XAe6TVrPA\",\"number-0\":\"788038443\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"pill_text-0\":\"\",\"file-0\":\"5db18361e23e7\",\"_sipForTypo3Vars\":\"5db1835dd7c41\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db1835cf215c\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,0,3,'7f1e8e5cfa046e6bded631f6b36b8462','2019-10-24 10:56:35'),(746,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"c364e766d40e4a8ddd4ca34c0296a548\",\"_h_checkbox-531\":\"\",\"text-531\":\"YyUOFMI22GU8uLyzQi7EZBt7dZHWQFqj\",\"number-531\":\"1464008258\",\"date-531\":\"01.01.2188\",\"datetime-531\":\"02.02.2188 01:08\",\"decimal-531\":\"12.84\",\"enum-531\":\"first option\",\"radio-531\":\"option a\",\"pill_text-531\":\"\",\"file-531\":\"5db1836480543\",\"_sipForTypo3Vars\":\"5db1836480620\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"531\",\"s\":\"5db18363b35c7\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=531\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,531,1,'7f1e8e5cfa046e6bded631f6b36b8462','2019-10-24 10:56:37'),(747,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"5fs6zP0l63RPBKQuqkJ0YSvwRXJbR38Y\",\"number-0\":\"1553182669\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"pill_text-0\":\"Ao4TDOPt3dVFzM9e4UUpFOrTF9iopKOR\",\"file-0\":\"5db18366ecbe9\",\"_sipForTypo3Vars\":\"5db1835dd7c41\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db1835cf215c\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,0,3,'7f1e8e5cfa046e6bded631f6b36b8462','2019-10-24 10:56:41'),(748,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"futNGrzACbIi3WPcvgRY8rlEhZ3f7yT3\",\"number-0\":\"1163728501\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"pill_text-0\":\"\",\"file-0\":\"5db183706c2e3\",\"_sipForTypo3Vars\":\"5db1835dd7c41\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db1835cf215c\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,0,3,'7f1e8e5cfa046e6bded631f6b36b8462','2019-10-24 10:56:50'),(749,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"BJWrfW08uhH6bzPHh9LrivgENTjpuATj\",\"number-0\":\"1561154257\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"pill_text-0\":\"\",\"file-0\":\"5db18373e1c4b\",\"_sipForTypo3Vars\":\"5db1835dd7c41\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db1835cf215c\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,0,3,'7f1e8e5cfa046e6bded631f6b36b8462','2019-10-24 10:56:56'),(750,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"lqaiDemyo9hbzgPajo3rFbwuqrbF340o\",\"number-0\":\"423984987\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"pill_text-0\":\"\",\"file-0\":\"5db1837963a21\",\"_sipForTypo3Vars\":\"5db1835dd7c41\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db1835cf215c\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,0,3,'7f1e8e5cfa046e6bded631f6b36b8462','2019-10-24 10:57:01'),(751,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"ZhiZgUaxQGv70PVr2rZ2W8FnILvifNom\",\"number-0\":\"744531361\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"pill_text-0\":\"\",\"file-0\":\"5db1846993f73\",\"_sipForTypo3Vars\":\"5db18468c28ea\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db18467e274b\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,0,3,'98359d703277e9ffb6dbdadbda8def25','2019-10-24 11:00:59'),(752,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"lovUblQn4PnsjPq23nuJfDPzyMFuSWAw\",\"number-0\":\"1820037282\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"pill_text-0\":\"\",\"file-0\":\"5db1846cc8b6e\",\"_sipForTypo3Vars\":\"5db18468c28ea\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db18467e274b\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,0,3,'98359d703277e9ffb6dbdadbda8def25','2019-10-24 11:01:02'),(753,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"64b35235d94baf4874e2fcc6fb458d01\",\"_h_checkbox-537\":\"\",\"text-537\":\"wVjOpcy7HSirZ0cslHioRjpRIuRXSqb3\",\"number-537\":\"184373249\",\"date-537\":\"01.01.2188\",\"datetime-537\":\"02.02.2188 01:08\",\"decimal-537\":\"12.84\",\"enum-537\":\"first option\",\"radio-537\":\"option a\",\"pill_text-537\":\"\",\"file-537\":\"5db1846f98122\",\"_sipForTypo3Vars\":\"5db1846f981f1\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"537\",\"s\":\"5db1846ec7853\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=537\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,537,1,'98359d703277e9ffb6dbdadbda8def25','2019-10-24 11:01:04'),(754,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"LcV0HibAFJvz7kNm8s4JVt0GcEi6J2ze\",\"number-0\":\"1910013498\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"pill_text-0\":\"qXDpeEdfkKGoObRAuKgqWQDdY9CczE51\",\"file-0\":\"5db18472218c5\",\"_sipForTypo3Vars\":\"5db18468c28ea\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db18467e274b\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,0,3,'98359d703277e9ffb6dbdadbda8def25','2019-10-24 11:01:08'),(755,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"VNCdhJkAXvJSf22ZnuOPtBmqMCAfxhKJ\",\"number-0\":\"2026391133\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"pill_text-0\":\"\",\"file-0\":\"5db1847c1ed34\",\"_sipForTypo3Vars\":\"5db18468c28ea\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db18467e274b\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,0,3,'98359d703277e9ffb6dbdadbda8def25','2019-10-24 11:01:18'),(756,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"QgFpyxAUD5X8z3ESx09CUPuNG6IvBJbD\",\"number-0\":\"1580234626\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"pill_text-0\":\"\",\"file-0\":\"5db1847fca068\",\"_sipForTypo3Vars\":\"5db18468c28ea\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db18467e274b\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,0,3,'98359d703277e9ffb6dbdadbda8def25','2019-10-24 11:01:24'),(757,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"5mQELhzGJfk1u8re5vcXZGYBOc7YydPM\",\"number-0\":\"1133183762\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"pill_text-0\":\"\",\"file-0\":\"5db18485b3ecf\",\"_sipForTypo3Vars\":\"5db18468c28ea\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db18467e274b\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,0,3,'98359d703277e9ffb6dbdadbda8def25','2019-10-24 11:01:30'),(758,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"6ve2zAkECEgcZ0wl4cn9cVhH65FWRHfv\",\"number-0\":\"678105073\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"pill_text-0\":\"\",\"file-0\":\"5db18515e853c\",\"_sipForTypo3Vars\":\"5db185150ae0d\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db1851434f50\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,0,3,'a5ca07bdefd4656c857fac607438642c','2019-10-24 11:03:51'),(759,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"ukbKNMs2tWRx5v9J0fpzvZZjcsU20IU3\",\"number-0\":\"1725849194\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"pill_text-0\":\"\",\"file-0\":\"5db185197070a\",\"_sipForTypo3Vars\":\"5db185150ae0d\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db1851434f50\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,0,3,'a5ca07bdefd4656c857fac607438642c','2019-10-24 11:03:55'),(760,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"18918038a05ddaedd018b78d18913e5b\",\"_h_checkbox-543\":\"\",\"text-543\":\"2JVIdn9t36lF2WxIW4tezx1K4JWgYX7W\",\"number-543\":\"628801751\",\"date-543\":\"01.01.2188\",\"datetime-543\":\"02.02.2188 01:08\",\"decimal-543\":\"12.84\",\"enum-543\":\"first option\",\"radio-543\":\"option a\",\"pill_text-543\":\"\",\"file-543\":\"5db1851c294ec\",\"_sipForTypo3Vars\":\"5db1851c295d2\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"543\",\"s\":\"5db1851b4f97b\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=543\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,543,1,'a5ca07bdefd4656c857fac607438642c','2019-10-24 11:03:57'),(761,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"g1fKKW7ggUdlrPJZHg8jEi6u254Mdxvb\",\"number-0\":\"2137088891\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"pill_text-0\":\"cWM4KooCWmTlfvEzIp2Es2NwOoV0Tipx\",\"file-0\":\"5db1851e77421\",\"_sipForTypo3Vars\":\"5db185150ae0d\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db1851434f50\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,0,3,'a5ca07bdefd4656c857fac607438642c','2019-10-24 11:04:01'),(762,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"GZzkRTXaVuNv32DxbJEafDNVCiz5Ckp8\",\"number-0\":\"1911262334\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"pill_text-0\":\"\",\"file-0\":\"5db18528722a9\",\"_sipForTypo3Vars\":\"5db185150ae0d\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db1851434f50\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,0,3,'a5ca07bdefd4656c857fac607438642c','2019-10-24 11:04:10'),(763,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"oD0yTqStwNJIJJ7PckEIwv5IzTxMHxMh\",\"number-0\":\"1857109395\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"pill_text-0\":\"\",\"file-0\":\"5db1852c00fca\",\"_sipForTypo3Vars\":\"5db185150ae0d\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db1851434f50\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,0,3,'a5ca07bdefd4656c857fac607438642c','2019-10-24 11:04:16'),(764,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"PVOZ7Y8WCL6xQLqHMDSD9HgNgOOzxGOH\",\"number-0\":\"1610770171\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"pill_text-0\":\"\",\"file-0\":\"5db1853192ec9\",\"_sipForTypo3Vars\":\"5db185150ae0d\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db1851434f50\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,0,3,'a5ca07bdefd4656c857fac607438642c','2019-10-24 11:04:21'),(765,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"mRtIDtYKQ8X5pvzUtCM0zOXxZZkQmY6R\",\"number-0\":\"754727056\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"pill_text-0\":\"\",\"file-0\":\"5db1853da7e26\",\"_sipForTypo3Vars\":\"5db1853cddb43\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db1853c0a624\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,0,3,'982a7f714bac26520aec3ed16c9bd13b','2019-10-24 11:04:31'),(766,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"qVSAB5Juy7jEAFajNhIYg1Re7IeQda8R\",\"number-0\":\"863505410\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"pill_text-0\":\"\",\"file-0\":\"5db18540ec736\",\"_sipForTypo3Vars\":\"5db1853cddb43\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db1853c0a624\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,0,3,'982a7f714bac26520aec3ed16c9bd13b','2019-10-24 11:04:34'),(767,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"05495611dea2a03d23e369a8e8b2bc29\",\"_h_checkbox-549\":\"\",\"text-549\":\"plgOCFj1dNGt9b9ZvifTGo5booN7a0Fs\",\"number-549\":\"846956694\",\"date-549\":\"01.01.2188\",\"datetime-549\":\"02.02.2188 01:08\",\"decimal-549\":\"12.84\",\"enum-549\":\"first option\",\"radio-549\":\"option a\",\"pill_text-549\":\"\",\"file-549\":\"5db185438c25d\",\"_sipForTypo3Vars\":\"5db185438c32f\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"549\",\"s\":\"5db18542ba230\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=549\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,549,1,'982a7f714bac26520aec3ed16c9bd13b','2019-10-24 11:04:36'),(768,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"gxNBWkX4VKTczgz3DCXutbCeuWYnODGi\",\"number-0\":\"1913792242\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"pill_text-0\":\"BGZhUfRFpfPVcObaGg9LngtxdCwnumGm\",\"file-0\":\"5db18545da536\",\"_sipForTypo3Vars\":\"5db1853cddb43\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db1853c0a624\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,0,3,'982a7f714bac26520aec3ed16c9bd13b','2019-10-24 11:04:40'),(769,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"udNgEVvjMwev2JsIhKbbU8WGjPHZ3nwU\",\"number-0\":\"973589307\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"pill_text-0\":\"\",\"file-0\":\"5db1854fb443b\",\"_sipForTypo3Vars\":\"5db1853cddb43\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db1853c0a624\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,0,3,'982a7f714bac26520aec3ed16c9bd13b','2019-10-24 11:04:49'),(770,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"b0EPxUR0m5a9oQln8Yq94NE7FJY1VHML\",\"number-0\":\"2110144059\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"pill_text-0\":\"\",\"file-0\":\"5db18553486d2\",\"_sipForTypo3Vars\":\"5db1853cddb43\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db1853c0a624\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,0,3,'982a7f714bac26520aec3ed16c9bd13b','2019-10-24 11:04:55'),(771,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"eJzK4jTG5cFtFT9Qivut6lMG7k0SlYzx\",\"number-0\":\"656891081\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"pill_text-0\":\"\",\"file-0\":\"5db18558e4deb\",\"_sipForTypo3Vars\":\"5db1853cddb43\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db1853c0a624\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,0,3,'982a7f714bac26520aec3ed16c9bd13b','2019-10-24 11:05:01'),(772,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"IRpJrEMROxQIdBq2wYBxwpder1sYRZxM\",\"number-0\":\"1172534038\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"pill_text-0\":\"\",\"file-0\":\"5db1856b7fa19\",\"_sipForTypo3Vars\":\"5db1856ab171e\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db18569dad43\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,0,3,'bcfb6b683793ed94669e190bc9e188c1','2019-10-24 11:05:17'),(773,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"vorOYr5cNZsarMQJcRS1svSEvuMUWE0E\",\"number-0\":\"109947981\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"pill_text-0\":\"\",\"file-0\":\"5db1856ee227f\",\"_sipForTypo3Vars\":\"5db1856ab171e\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db18569dad43\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,0,3,'bcfb6b683793ed94669e190bc9e188c1','2019-10-24 11:05:20'),(774,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"fb87b3476f55515f8f2b57cee2771ca0\",\"_h_checkbox-555\":\"\",\"text-555\":\"dhTroGol3NQHrZJpcuVxDBRANsjrKKEF\",\"number-555\":\"434120275\",\"date-555\":\"01.01.2188\",\"datetime-555\":\"02.02.2188 01:08\",\"decimal-555\":\"12.84\",\"enum-555\":\"first option\",\"radio-555\":\"option a\",\"pill_text-555\":\"\",\"file-555\":\"5db18571b4606\",\"_sipForTypo3Vars\":\"5db18571b4703\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"555\",\"s\":\"5db18570de215\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=555\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,555,1,'bcfb6b683793ed94669e190bc9e188c1','2019-10-24 11:05:22'),(775,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"S2KzAlQlSYrKh1Pe79Ig0exhyUV4wZea\",\"number-0\":\"2073239856\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"pill_text-0\":\"7N9d7bKvTmVi6lcPt45uXPC37M4qLRnD\",\"file-0\":\"5db1857434ecf\",\"_sipForTypo3Vars\":\"5db1856ab171e\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db18569dad43\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,0,3,'bcfb6b683793ed94669e190bc9e188c1','2019-10-24 11:05:26'),(776,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"y1FTL34lk3i17pVsmVlkLiZz8sI49vZ6\",\"number-0\":\"942438935\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"pill_text-0\":\"\",\"file-0\":\"5db1857e6af5c\",\"_sipForTypo3Vars\":\"5db1856ab171e\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db18569dad43\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,0,3,'bcfb6b683793ed94669e190bc9e188c1','2019-10-24 11:05:36'),(777,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"EsTODq2ke7mOkfVVBaQxHTKKhCaBIsV4\",\"number-0\":\"1484129161\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"pill_text-0\":\"\",\"file-0\":\"5db1858223bdc\",\"_sipForTypo3Vars\":\"5db1856ab171e\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db18569dad43\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,0,3,'bcfb6b683793ed94669e190bc9e188c1','2019-10-24 11:05:42'),(778,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"vNPHPvEuIXLpev4JdSRBi2IjjKN8zrdg\",\"number-0\":\"620099165\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"pill_text-0\":\"\",\"file-0\":\"5db18587db2aa\",\"_sipForTypo3Vars\":\"5db1856ab171e\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db18569dad43\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,0,3,'bcfb6b683793ed94669e190bc9e188c1','2019-10-24 11:05:48'),(779,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"L9JrofHmAqm86cQ6MjMp4QDVXxKktaRe\",\"number-0\":\"1093713759\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"pill_text-0\":\"\",\"file-0\":\"5db185a3b2b7e\",\"_sipForTypo3Vars\":\"5db185a2e7865\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db185a1f3873\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,0,3,'67da75078d939ac66971e8a15b8acf0e','2019-10-24 11:06:13'),(780,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"abNrzG2hs8BJRZtAucLPf8Xb9SvFbAO1\",\"number-0\":\"517436791\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"pill_text-0\":\"\",\"file-0\":\"5db185a744fce\",\"_sipForTypo3Vars\":\"5db185a2e7865\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db185a1f3873\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,0,3,'67da75078d939ac66971e8a15b8acf0e','2019-10-24 11:06:17'),(781,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"5ea3d8bf435adf441c0ff6617887c421\",\"_h_checkbox-561\":\"\",\"text-561\":\"L7NdFAMXR96y9HsquSoJFwnkDcq27vQP\",\"number-561\":\"1298972507\",\"date-561\":\"01.01.2188\",\"datetime-561\":\"02.02.2188 01:08\",\"decimal-561\":\"12.84\",\"enum-561\":\"first option\",\"radio-561\":\"option a\",\"pill_text-561\":\"\",\"file-561\":\"5db185aa261db\",\"_sipForTypo3Vars\":\"5db185aa26317\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"561\",\"s\":\"5db185a946b7f\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=561\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,561,1,'67da75078d939ac66971e8a15b8acf0e','2019-10-24 11:06:19'),(782,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"66stRdvPW52R10ypZnjJaT0LAXqNwE91\",\"number-0\":\"1950484099\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"pill_text-0\":\"YBiFZvC7ffUIgCwGqQU6S4BdPwfct2L5\",\"file-0\":\"5db185ac8c6b7\",\"_sipForTypo3Vars\":\"5db185a2e7865\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db185a1f3873\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,0,3,'67da75078d939ac66971e8a15b8acf0e','2019-10-24 11:06:23'),(783,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"3RhUQwVHX2XDsQOXDbyWBOAqz05vQeaK\",\"number-0\":\"1684301965\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"pill_text-0\":\"\",\"file-0\":\"5db185b6e3d88\",\"_sipForTypo3Vars\":\"5db185a2e7865\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db185a1f3873\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,0,3,'67da75078d939ac66971e8a15b8acf0e','2019-10-24 11:06:33'),(784,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"ro5juDxmnBQNFom9vbQGpeSrNEKlcdR6\",\"number-0\":\"872653340\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"pill_text-0\":\"\",\"file-0\":\"5db185bac213b\",\"_sipForTypo3Vars\":\"5db185a2e7865\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db185a1f3873\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,0,3,'67da75078d939ac66971e8a15b8acf0e','2019-10-24 11:06:39'),(785,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"rMrRlCfCUP54yFt6qzBMbANQoszQw5ww\",\"number-0\":\"2040656730\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"pill_text-0\":\"\",\"file-0\":\"5db185c0854f1\",\"_sipForTypo3Vars\":\"5db185a2e7865\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db185a1f3873\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,0,3,'67da75078d939ac66971e8a15b8acf0e','2019-10-24 11:06:44'),(786,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"pLLGkExPk6XhodbyMf4hiaeafvQN9kaA\",\"number-0\":\"523812909\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"pill_text-0\":\"\",\"file-0\":\"5db185d84f119\",\"_sipForTypo3Vars\":\"5db185d6d77e7\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db185d5f3299\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:70.0) Gecko/20100101 Firefox/70.0',1007,0,3,'83ee60f5fb26b13949e75149182df3d2','2019-10-24 11:07:05'),(787,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"bjx3tulzID4bqRVPjQzje6ZDPlTwYrCR\",\"number-0\":\"5171196\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"pill_text-0\":\"\",\"file-0\":\"5db185dbef023\",\"_sipForTypo3Vars\":\"5db185d6d77e7\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db185d5f3299\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:70.0) Gecko/20100101 Firefox/70.0',1007,0,3,'83ee60f5fb26b13949e75149182df3d2','2019-10-24 11:07:09'),(788,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"7ac0d58ef79c530c603ca487d2a8eea2\",\"_h_checkbox-567\":\"\",\"text-567\":\"S66AhwixI4xeFc1mjg6F1v0MJvE2pT9e\",\"number-567\":\"1443216602\",\"date-567\":\"01.01.2188\",\"datetime-567\":\"02.02.2188 01:08\",\"decimal-567\":\"12.84\",\"enum-567\":\"first option\",\"radio-567\":\"option a\",\"pill_text-567\":\"\",\"file-567\":\"5db185deb8a6f\",\"_sipForTypo3Vars\":\"5db185deb8b35\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"567\",\"s\":\"5db185dd97f24\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=567\"}','192.168.133.203','','Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:70.0) Gecko/20100101 Firefox/70.0',1007,567,1,'83ee60f5fb26b13949e75149182df3d2','2019-10-24 11:07:11'),(789,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"rqQovICd22JdYA0XudTSRhFbPkUr4Fnq\",\"number-0\":\"1990015138\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"pill_text-0\":\"MEP0XbT5XnwWCvdCbHZ3KIXva1PIRVzJ\",\"file-0\":\"5db185e170a2a\",\"_sipForTypo3Vars\":\"5db185d6d77e7\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db185d5f3299\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:70.0) Gecko/20100101 Firefox/70.0',1007,0,3,'83ee60f5fb26b13949e75149182df3d2','2019-10-24 11:07:15'),(790,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"Vin2ZOTkFQ0hAwVXVnX0NMeyQlCrBoCy\",\"number-0\":\"1616520981\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"pill_text-0\":\"\",\"file-0\":\"5db185ec740ef\",\"_sipForTypo3Vars\":\"5db185d6d77e7\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db185d5f3299\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:70.0) Gecko/20100101 Firefox/70.0',1007,0,3,'83ee60f5fb26b13949e75149182df3d2','2019-10-24 11:07:26'),(791,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"97M1JAXKK8OHniELKFoNBaj03PVOUqk6\",\"number-0\":\"736637139\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"pill_text-0\":\"\",\"file-0\":\"5db185f085043\",\"_sipForTypo3Vars\":\"5db185d6d77e7\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db185d5f3299\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:70.0) Gecko/20100101 Firefox/70.0',1007,0,3,'83ee60f5fb26b13949e75149182df3d2','2019-10-24 11:07:32'),(792,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"JDCnjNgCRrrpkUvIe64vDROmP4pzi1Iu\",\"number-0\":\"1769774383\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"pill_text-0\":\"\",\"file-0\":\"5db185f6b84b6\",\"_sipForTypo3Vars\":\"5db185d6d77e7\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db185d5f3299\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:70.0) Gecko/20100101 Firefox/70.0',1007,0,3,'83ee60f5fb26b13949e75149182df3d2','2019-10-24 11:07:38'),(793,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"eHQvTDT7ATMIz8aM3gyCQST8smxSdo3D\",\"number-0\":\"154145201\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"pill_text-0\":\"\",\"file-0\":\"5db18620e3a88\",\"_sipForTypo3Vars\":\"5db1862009b38\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db1861f334e8\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,0,3,'afe3e5a40e637620c44b93af148a6daa','2019-10-24 11:08:18'),(794,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"pSj3791DSZTYQsy11Lnb7DDhoyy57oyw\",\"number-0\":\"1006385259\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"pill_text-0\":\"\",\"file-0\":\"5db186243edd8\",\"_sipForTypo3Vars\":\"5db1862009b38\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db1861f334e8\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,0,3,'afe3e5a40e637620c44b93af148a6daa','2019-10-24 11:08:22'),(795,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"c582c80c591d5b7f4b3def8ef7de50f0\",\"_h_checkbox-573\":\"\",\"text-573\":\"CSyPvVizmCj7EaP1MFmjcFVYRFiNkBMV\",\"number-573\":\"1808097299\",\"date-573\":\"01.01.2188\",\"datetime-573\":\"02.02.2188 01:08\",\"decimal-573\":\"12.84\",\"enum-573\":\"first option\",\"radio-573\":\"option a\",\"pill_text-573\":\"\",\"file-573\":\"5db18626cff6e\",\"_sipForTypo3Vars\":\"5db18626d0053\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"573\",\"s\":\"5db186261a1dd\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=573\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,573,1,'afe3e5a40e637620c44b93af148a6daa','2019-10-24 11:08:24'),(796,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"4axon3CR2y0jMrX750VGx91t6LlrgLMx\",\"number-0\":\"1857727087\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"pill_text-0\":\"xL7JMshZQTBDThZAbB7TV9nwq900GDCZ\",\"file-0\":\"5db186293940d\",\"_sipForTypo3Vars\":\"5db1862009b38\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db1861f334e8\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,0,3,'afe3e5a40e637620c44b93af148a6daa','2019-10-24 11:08:27'),(797,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"V0GoEvFEsj6eXLEpncO5CMxg42dgPSZq\",\"number-0\":\"1007255360\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"pill_text-0\":\"\",\"file-0\":\"5db1863338005\",\"_sipForTypo3Vars\":\"5db1862009b38\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db1861f334e8\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,0,3,'afe3e5a40e637620c44b93af148a6daa','2019-10-24 11:08:37'),(798,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"jecZBV5XCIFCOhaVsdwM0zFf99K689z7\",\"number-0\":\"1930812789\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"pill_text-0\":\"\",\"file-0\":\"5db18636b1683\",\"_sipForTypo3Vars\":\"5db1862009b38\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db1861f334e8\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,0,3,'afe3e5a40e637620c44b93af148a6daa','2019-10-24 11:08:42'),(799,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"MkxMpclsaFHdmBMcF1p6KHRckDABocvt\",\"number-0\":\"1338468217\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"pill_text-0\":\"\",\"file-0\":\"5db1863c71530\",\"_sipForTypo3Vars\":\"5db1862009b38\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db1861f334e8\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,0,3,'afe3e5a40e637620c44b93af148a6daa','2019-10-24 11:08:48'),(800,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"CMvEgl0w6xLvaRlJEC5VLD2Q4rHEaMZK\",\"number-0\":\"1753370847\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"pill_text-0\":\"\",\"file-0\":\"5db1865d3c1b6\",\"_sipForTypo3Vars\":\"5db1865c6a644\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db1865b30557\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,0,3,'e14a8697398a66b7f91eb88ff257a3a9','2019-10-24 11:09:19'),(801,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"lAFLR2wlzVya2Qb4KQeErAtqF6Xf0kt0\",\"number-0\":\"1026499050\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"pill_text-0\":\"\",\"file-0\":\"5db186608b75b\",\"_sipForTypo3Vars\":\"5db1865c6a644\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db1865b30557\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,0,3,'e14a8697398a66b7f91eb88ff257a3a9','2019-10-24 11:09:22'),(802,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"ae46f576938d49b1265d8263bb5adba2\",\"_h_checkbox-579\":\"\",\"text-579\":\"vzMB2CcYiGsJAzvYyRpJYuCNo9akgLPD\",\"number-579\":\"453024608\",\"date-579\":\"01.01.2188\",\"datetime-579\":\"02.02.2188 01:08\",\"decimal-579\":\"12.84\",\"enum-579\":\"first option\",\"radio-579\":\"option a\",\"pill_text-579\":\"\",\"file-579\":\"5db18663397c2\",\"_sipForTypo3Vars\":\"5db1866339898\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"579\",\"s\":\"5db186626832d\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=579\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,579,1,'e14a8697398a66b7f91eb88ff257a3a9','2019-10-24 11:09:24'),(803,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"43QAsRiFURGeyRjpzEa6p4vUMCcuAQLa\",\"number-0\":\"1014256832\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"pill_text-0\":\"F9ZyFWKbfrHmqDCMIaUvFmyPK6ktJhNK\",\"file-0\":\"5db18665a448e\",\"_sipForTypo3Vars\":\"5db1865c6a644\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db1865b30557\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,0,3,'e14a8697398a66b7f91eb88ff257a3a9','2019-10-24 11:09:28'),(804,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"OPTIyAY6D9WCzPvxdJqh1LMzYeQnL6FZ\",\"number-0\":\"1897159948\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"pill_text-0\":\"\",\"file-0\":\"5db1866f84cab\",\"_sipForTypo3Vars\":\"5db1865c6a644\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db1865b30557\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,0,3,'e14a8697398a66b7f91eb88ff257a3a9','2019-10-24 11:09:37'),(805,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"TFxrA05iSQ4zz28YI2gQZCzAwOXnCglO\",\"number-0\":\"748266149\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"pill_text-0\":\"\",\"file-0\":\"5db186733282d\",\"_sipForTypo3Vars\":\"5db1865c6a644\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db1865b30557\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,0,3,'e14a8697398a66b7f91eb88ff257a3a9','2019-10-24 11:09:43'),(806,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"srcq0ktgxPKlJgrAq2iHZedmBzcmIyuz\",\"number-0\":\"1632411310\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"pill_text-0\":\"\",\"file-0\":\"5db18678c3785\",\"_sipForTypo3Vars\":\"5db1865c6a644\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db1865b30557\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,0,3,'e14a8697398a66b7f91eb88ff257a3a9','2019-10-24 11:09:49'),(807,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"8uavDpG34yTpWPCVZiq4hIxmgmYnx8Pp\",\"number-0\":\"1360613967\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"pill_text-0\":\"\",\"file-0\":\"5db186ef6cf87\",\"_sipForTypo3Vars\":\"5db186ee9b7e4\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db186edc136c\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,0,3,'d95587d08e9a471328d8149c77e9977b','2019-10-24 11:11:45'),(808,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"d5TsKxBJ1foOogPexwGd9Km9Zn8hJt6m\",\"number-0\":\"412915358\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"pill_text-0\":\"\",\"file-0\":\"5db186f2b61f8\",\"_sipForTypo3Vars\":\"5db186ee9b7e4\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db186edc136c\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,0,3,'d95587d08e9a471328d8149c77e9977b','2019-10-24 11:11:48'),(809,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"7da812ae1ef38b87886cd95d84415678\",\"_h_checkbox-585\":\"\",\"text-585\":\"024abSoShNBPlOSVa5d49dV4abse9eWT\",\"number-585\":\"1945967711\",\"date-585\":\"01.01.2188\",\"datetime-585\":\"02.02.2188 01:08\",\"decimal-585\":\"12.84\",\"enum-585\":\"first option\",\"radio-585\":\"option a\",\"pill_text-585\":\"\",\"file-585\":\"5db186f569156\",\"_sipForTypo3Vars\":\"5db186f56926a\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"585\",\"s\":\"5db186f49bdfb\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=585\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,585,1,'d95587d08e9a471328d8149c77e9977b','2019-10-24 11:11:50'),(810,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"CtsChJxGRZ2VKkA4dSnBGBDtZf6lK5yR\",\"number-0\":\"1925002699\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"pill_text-0\":\"29T1HhUsg9UHwMZ6gDzxBjW165wy80At\",\"file-0\":\"5db186f7c3380\",\"_sipForTypo3Vars\":\"5db186ee9b7e4\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db186edc136c\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,0,3,'d95587d08e9a471328d8149c77e9977b','2019-10-24 11:11:54'),(811,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"LcbFHEeYQVs7rUO3ooCAIJW5GHV02LEN\",\"number-0\":\"1272688222\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"pill_text-0\":\"\",\"file-0\":\"5db18701832ca\",\"_sipForTypo3Vars\":\"5db186ee9b7e4\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db186edc136c\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,0,3,'d95587d08e9a471328d8149c77e9977b','2019-10-24 11:12:03'),(812,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"vCgK3sQpAwiNVKuFS46IlkH7zhOdjhvv\",\"number-0\":\"175120850\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"pill_text-0\":\"\",\"file-0\":\"5db187053fc89\",\"_sipForTypo3Vars\":\"5db186ee9b7e4\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db186edc136c\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,0,3,'d95587d08e9a471328d8149c77e9977b','2019-10-24 11:12:09'),(813,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"8V20VdmWYGO04iJ7ps50gAxRDBPgpSrc\",\"number-0\":\"778623295\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"pill_text-0\":\"\",\"file-0\":\"5db1870ad6439\",\"_sipForTypo3Vars\":\"5db186ee9b7e4\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db186edc136c\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,0,3,'d95587d08e9a471328d8149c77e9977b','2019-10-24 11:12:15'),(814,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"NNZThCR5MmL59Vp0dFyXjXanGL5Gw9je\",\"number-0\":\"971172462\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"pill_text-0\":\"\",\"file-0\":\"5db1873263c6f\",\"_sipForTypo3Vars\":\"5db187319a514\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db18730c66fe\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,0,3,'79f2b10fc9fc23d1e04798a594fe25f7','2019-10-24 11:12:52'),(815,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"294NLt3JxuXMIT3lTLSvSjgLFs2wryB7\",\"number-0\":\"343821870\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"pill_text-0\":\"\",\"file-0\":\"5db18735acb9c\",\"_sipForTypo3Vars\":\"5db187319a514\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db18730c66fe\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,0,3,'79f2b10fc9fc23d1e04798a594fe25f7','2019-10-24 11:12:55'),(816,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d8317b23ae0f6cefa0c2d7ee545b14ed\",\"_h_checkbox-591\":\"\",\"text-591\":\"xvIMrfTVLKyXv8909RVcsFCylr5LWjEU\",\"number-591\":\"2093920220\",\"date-591\":\"01.01.2188\",\"datetime-591\":\"02.02.2188 01:08\",\"decimal-591\":\"12.84\",\"enum-591\":\"first option\",\"radio-591\":\"option a\",\"pill_text-591\":\"\",\"file-591\":\"5db187384cd43\",\"_sipForTypo3Vars\":\"5db187384cea2\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"591\",\"s\":\"5db187377b583\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=591\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,591,1,'79f2b10fc9fc23d1e04798a594fe25f7','2019-10-24 11:12:57'),(817,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"EqwWPooXFeNnY643aNtqUgMFxEygW6GB\",\"number-0\":\"1125188783\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"pill_text-0\":\"upWZmkLpXjX40HckKkVyTrOS45OavuCL\",\"file-0\":\"5db1873ab1c6b\",\"_sipForTypo3Vars\":\"5db187319a514\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db18730c66fe\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,0,3,'79f2b10fc9fc23d1e04798a594fe25f7','2019-10-24 11:13:01'),(818,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"G03lOe4cdyFCXURe8hXucnAA1fySKUYp\",\"number-0\":\"281346452\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"pill_text-0\":\"\",\"file-0\":\"5db1874486938\",\"_sipForTypo3Vars\":\"5db187319a514\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db18730c66fe\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,0,3,'79f2b10fc9fc23d1e04798a594fe25f7','2019-10-24 11:13:10'),(819,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"oB2o0JupiZqAxRBFVa4GjPVZzA6UXP2K\",\"number-0\":\"1386410765\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"pill_text-0\":\"\",\"file-0\":\"5db187483e153\",\"_sipForTypo3Vars\":\"5db187319a514\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db18730c66fe\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,0,3,'79f2b10fc9fc23d1e04798a594fe25f7','2019-10-24 11:13:16'),(820,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"O15ilPaCY9QwSgMOlBnUdzUceJthGnAr\",\"number-0\":\"742779689\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"pill_text-0\":\"\",\"file-0\":\"5db1874df10eb\",\"_sipForTypo3Vars\":\"5db187319a514\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db18730c66fe\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,0,3,'79f2b10fc9fc23d1e04798a594fe25f7','2019-10-24 11:13:22'),(821,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"AlilO1vxy7FyEA7UlswoROPH2klbsupk\",\"number-0\":\"1190371086\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"pill_text-0\":\"\",\"file-0\":\"5db187eed9c4c\",\"_sipForTypo3Vars\":\"5db187ee08e78\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db187ed1eb73\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,0,3,'b6b7c257e5f71b04f00096fa6876154f','2019-10-24 11:16:00'),(822,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"lSl345f3OgSpYz9839WGQ4x38spqGKvM\",\"number-0\":\"313154617\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"pill_text-0\":\"\",\"file-0\":\"5db187f25547b\",\"_sipForTypo3Vars\":\"5db187ee08e78\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db187ed1eb73\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,0,3,'b6b7c257e5f71b04f00096fa6876154f','2019-10-24 11:16:04'),(823,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"ee44090ec68b4d427004925e91f104e7\",\"_h_checkbox-597\":\"\",\"text-597\":\"tOGxCTmlOsWpIDiz63JRjIvTi3f5I7Zn\",\"number-597\":\"1156539711\",\"date-597\":\"01.01.2188\",\"datetime-597\":\"02.02.2188 01:08\",\"decimal-597\":\"12.84\",\"enum-597\":\"first option\",\"radio-597\":\"option a\",\"pill_text-597\":\"\",\"file-597\":\"5db187f50d2e7\",\"_sipForTypo3Vars\":\"5db187f50d3b5\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"597\",\"s\":\"5db187f435c3e\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=597\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,597,1,'b6b7c257e5f71b04f00096fa6876154f','2019-10-24 11:16:06'),(824,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"JyQFw7F8F2iiDwJtdDh7Ok19NLEje9Fu\",\"number-0\":\"1846927759\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"pill_text-0\":\"Wvcr9sCBnrNQrkWfjb1SbD2hrvW1W5vx\",\"file-0\":\"5db187f779378\",\"_sipForTypo3Vars\":\"5db187ee08e78\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db187ed1eb73\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,0,3,'b6b7c257e5f71b04f00096fa6876154f','2019-10-24 11:16:09'),(825,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"HQBL3giYCbgwtykE4MlFajfWg8wajhfM\",\"number-0\":\"764873741\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"pill_text-0\":\"\",\"file-0\":\"5db1880120e72\",\"_sipForTypo3Vars\":\"5db187ee08e78\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db187ed1eb73\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,0,3,'b6b7c257e5f71b04f00096fa6876154f','2019-10-24 11:16:19'),(826,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"B9JgQiBWIPUo4rjfY7mGhqgQe729Ixzj\",\"number-0\":\"1618562134\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"pill_text-0\":\"\",\"file-0\":\"5db18804aeaf1\",\"_sipForTypo3Vars\":\"5db187ee08e78\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db187ed1eb73\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,0,3,'b6b7c257e5f71b04f00096fa6876154f','2019-10-24 11:16:24'),(827,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"ggpEYSAOKcbsjTfNPIMe8DPuQJcSv1aZ\",\"number-0\":\"1008950816\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"pill_text-0\":\"\",\"file-0\":\"5db1880a519fe\",\"_sipForTypo3Vars\":\"5db187ee08e78\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db187ed1eb73\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,0,3,'b6b7c257e5f71b04f00096fa6876154f','2019-10-24 11:16:30'),(828,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"RdgqBDjAo9hr161X7qBxKDsv4lPXWcVK\",\"number-0\":\"2006571792\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"pill_text-0\":\"\",\"file-0\":\"5db18824a69d1\",\"_sipForTypo3Vars\":\"5db18823c72c2\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db18822db100\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,0,3,'ba68669b391818c643043f6b9471b60c','2019-10-24 11:16:54'),(829,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"gVH9sSmJyNrdCK1rOjAInztQAwrFGBVe\",\"number-0\":\"279475271\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"pill_text-0\":\"\",\"file-0\":\"5db188286e47b\",\"_sipForTypo3Vars\":\"5db18823c72c2\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db18822db100\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,0,3,'ba68669b391818c643043f6b9471b60c','2019-10-24 11:16:58'),(830,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"cdcfd64e23bc80e2ee70cab23755c525\",\"_h_checkbox-603\":\"\",\"text-603\":\"5b27ERo9GwWwZkTQPKti0bAz19O9ggp9\",\"number-603\":\"989649749\",\"date-603\":\"01.01.2188\",\"datetime-603\":\"02.02.2188 01:08\",\"decimal-603\":\"12.84\",\"enum-603\":\"first option\",\"radio-603\":\"option a\",\"pill_text-603\":\"\",\"file-603\":\"5db1882b2de40\",\"_sipForTypo3Vars\":\"5db1882b2df20\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"603\",\"s\":\"5db1882a4d2ff\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=603\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,603,1,'ba68669b391818c643043f6b9471b60c','2019-10-24 11:17:00'),(831,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"e87eUdAQKGGWjHWg83Hx9u8KoUpDmZeR\",\"number-0\":\"557080042\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"pill_text-0\":\"DlPcTB7Rsqs9MDmS2lLeOFVElzagO8Jt\",\"file-0\":\"5db1882d80f06\",\"_sipForTypo3Vars\":\"5db18823c72c2\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db18822db100\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,0,3,'ba68669b391818c643043f6b9471b60c','2019-10-24 11:17:04'),(832,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"OdRT2t6sFjKy8T7mZ8WpuCYKovNYHszY\",\"number-0\":\"2043391185\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"pill_text-0\":\"\",\"file-0\":\"5db18837edd55\",\"_sipForTypo3Vars\":\"5db18823c72c2\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db18822db100\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,0,3,'ba68669b391818c643043f6b9471b60c','2019-10-24 11:17:14'),(833,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"ojDb7sJQj4wR3XV6pYi6NCxnXpN92POP\",\"number-0\":\"17304307\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"pill_text-0\":\"\",\"file-0\":\"5db1883bc342f\",\"_sipForTypo3Vars\":\"5db18823c72c2\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db18822db100\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,0,3,'ba68669b391818c643043f6b9471b60c','2019-10-24 11:17:19'),(834,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"N67g3YQY4RkKo7HQM01AdnPGrHLvownO\",\"number-0\":\"2005118827\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"pill_text-0\":\"\",\"file-0\":\"5db188417206c\",\"_sipForTypo3Vars\":\"5db18823c72c2\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db18822db100\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,0,3,'ba68669b391818c643043f6b9471b60c','2019-10-24 11:17:25'),(835,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"FQ0mPezgizBTKRto7sfbYbKG8JiGcw0R\",\"number-0\":\"2517703\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"pill_text-0\":\"\",\"file-0\":\"5db188e1e5aba\",\"_sipForTypo3Vars\":\"5db188e11184a\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db188e03a7b1\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,0,3,'349c791e1d9578f04bbc5562749ba614','2019-10-24 11:20:03'),(836,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"Er6WxrNz7iVNCw4d1e8gXNvIcbPbH4JI\",\"number-0\":\"826750437\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"pill_text-0\":\"\",\"file-0\":\"5db188e54ab4a\",\"_sipForTypo3Vars\":\"5db188e11184a\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db188e03a7b1\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,0,3,'349c791e1d9578f04bbc5562749ba614','2019-10-24 11:20:07'),(837,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"31b77918cdd9be1ce04fd537706616e4\",\"_h_checkbox-609\":\"\",\"text-609\":\"N7poK2VDn038wrclfFx1yhFv0x3w7H11\",\"number-609\":\"224476222\",\"date-609\":\"01.01.2188\",\"datetime-609\":\"02.02.2188 01:08\",\"decimal-609\":\"12.84\",\"enum-609\":\"first option\",\"radio-609\":\"option a\",\"pill_text-609\":\"\",\"file-609\":\"5db188e7f3bcb\",\"_sipForTypo3Vars\":\"5db188e7f3c99\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"609\",\"s\":\"5db188e72ef9a\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=609\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,609,1,'349c791e1d9578f04bbc5562749ba614','2019-10-24 11:20:09'),(838,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"sbasuFDIZOC62EkRAN9Wlx3lFfQOHzkO\",\"number-0\":\"931170561\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"pill_text-0\":\"7WBNdOLnXxkzQmLa357yKvtTFeKHiSlf\",\"file-0\":\"5db188ea50f60\",\"_sipForTypo3Vars\":\"5db188e11184a\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db188e03a7b1\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,0,3,'349c791e1d9578f04bbc5562749ba614','2019-10-24 11:20:12'),(839,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"QJ4saYFOX29Pz3lN939Mghv0gyPR270m\",\"number-0\":\"1994107592\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"pill_text-0\":\"\",\"file-0\":\"5db188f4260ad\",\"_sipForTypo3Vars\":\"5db188e11184a\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db188e03a7b1\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,0,3,'349c791e1d9578f04bbc5562749ba614','2019-10-24 11:20:22'),(840,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"SmLLZiLVCB0Xer8CvjPGjgF3ww0tf6ve\",\"number-0\":\"320507127\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"pill_text-0\":\"\",\"file-0\":\"5db188f7d7e35\",\"_sipForTypo3Vars\":\"5db188e11184a\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db188e03a7b1\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,0,3,'349c791e1d9578f04bbc5562749ba614','2019-10-24 11:20:28'),(841,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"GpnYIlskFSgZKxdbkrmJwKmIF5z7GkMO\",\"number-0\":\"826344644\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"pill_text-0\":\"\",\"file-0\":\"5db188fda680f\",\"_sipForTypo3Vars\":\"5db188e11184a\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db188e03a7b1\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,0,3,'349c791e1d9578f04bbc5562749ba614','2019-10-24 11:20:33'),(842,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"Ge1ZwvzuNKwKJA6CzBs3esSTfm4pq3JB\",\"number-0\":\"297840644\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"pill_text-0\":\"\",\"file-0\":\"5db18934a4078\",\"_sipForTypo3Vars\":\"5db18933cb0dc\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db18932f39ae\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,0,3,'1c1f4ce09ead2ed1bab88a0cd3bf1e2e','2019-10-24 11:21:26'),(843,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"w31KADAPT2XrnpnOkWQvSPkxE5Mbmw7j\",\"number-0\":\"23934329\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"pill_text-0\":\"\",\"file-0\":\"5db189380b3e1\",\"_sipForTypo3Vars\":\"5db18933cb0dc\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db18932f39ae\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,0,3,'1c1f4ce09ead2ed1bab88a0cd3bf1e2e','2019-10-24 11:21:29'),(844,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"6e5d26e3a285abcf224e037ebb34cef6\",\"_h_checkbox-615\":\"\",\"text-615\":\"jOn1bARKcdjcIG5bZemhs6efJ4JXbR7z\",\"number-615\":\"1341998787\",\"date-615\":\"01.01.2188\",\"datetime-615\":\"02.02.2188 01:08\",\"decimal-615\":\"12.84\",\"enum-615\":\"first option\",\"radio-615\":\"option a\",\"pill_text-615\":\"\",\"file-615\":\"5db1893a913a4\",\"_sipForTypo3Vars\":\"5db1893a91486\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"615\",\"s\":\"5db18939ca5b9\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=615\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,615,1,'1c1f4ce09ead2ed1bab88a0cd3bf1e2e','2019-10-24 11:21:31'),(845,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"p1vT9d7Gy2NO93ylEwM5qAl6eKIkXwOw\",\"number-0\":\"260516822\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"pill_text-0\":\"7HPC5Q57mpEW3cmoMPQr6ve8qNxd9uvP\",\"file-0\":\"5db1893cea4ab\",\"_sipForTypo3Vars\":\"5db18933cb0dc\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db18932f39ae\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,0,3,'1c1f4ce09ead2ed1bab88a0cd3bf1e2e','2019-10-24 11:21:35'),(846,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"ojR2cTomifPcOMd6ZPBNrsF2yyqI3009\",\"number-0\":\"1096123979\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"pill_text-0\":\"\",\"file-0\":\"5db18946a7ed9\",\"_sipForTypo3Vars\":\"5db18933cb0dc\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db18932f39ae\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,0,3,'1c1f4ce09ead2ed1bab88a0cd3bf1e2e','2019-10-24 11:21:44'),(847,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"JU1wFAPlrFovIuDGoXkZzmrZJxYAtLu6\",\"number-0\":\"236599501\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"pill_text-0\":\"\",\"file-0\":\"5db1894a4b50f\",\"_sipForTypo3Vars\":\"5db18933cb0dc\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db18932f39ae\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,0,3,'1c1f4ce09ead2ed1bab88a0cd3bf1e2e','2019-10-24 11:21:50'),(848,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"rcIj2KkWB6btDnmHkTcTI8mKBM5U74nB\",\"number-0\":\"1303905089\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"pill_text-0\":\"\",\"file-0\":\"5db1894fda9d5\",\"_sipForTypo3Vars\":\"5db18933cb0dc\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db18932f39ae\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,0,3,'1c1f4ce09ead2ed1bab88a0cd3bf1e2e','2019-10-24 11:21:55'),(849,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"47cd7e0b66f40de37f3e0d3af22b7f62\",\"enabled-502\":\"yes\",\"dynamicUpdate-502\":\"yes\",\"mode-502\":\"required\",\"class-502\":\"native\",\"_h_subrecordOption-502\":\"\",\"encode-502\":\"specialchar\",\"checkType-502\":\"auto\",\"labelAlign-502\":\"default\",\"_h_rowLabelInputNote-502\":\"\",\"feIdContainer-502\":\"504\",\"name-502\":\"radio\",\"label-502\":\"radio\",\"modeSql-502\":\"\",\"type-502\":\"radio\",\"parameterLanguageA-502\":\"\",\"parameterLanguageB-502\":\"\",\"parameterLanguageC-502\":\"\",\"parameterLanguageD-502\":\"\",\"checkPattern-502\":\"\",\"ord-502\":\"70\",\"adminNote-502\":\"\",\"size-502\":\"\",\"bsLabelColumns-502\":\"\",\"bsInputColumns-502\":\"\",\"bsNoteColumns-502\":\"\",\"_0_rowLabelInputNote-502\":\"row\",\"_1_rowLabelInputNote-502\":\"label\",\"_2_rowLabelInputNote-502\":\"\\/label\",\"_3_rowLabelInputNote-502\":\"input\",\"_4_rowLabelInputNote-502\":\"\\/input\",\"_5_rowLabelInputNote-502\":\"note\",\"_6_rowLabelInputNote-502\":\"\\/note\",\"_7_rowLabelInputNote-502\":\"\\/row\",\"maxLength-502\":\"\",\"note-502\":\"\",\"tooltip-502\":\"\",\"placeholder-502\":\"\",\"value-502\":\"\",\"sql1-502\":\"\",\"parameter-502\":\"\",\"_sipForTypo3Vars\":\"5db18fc7a09b3\"}','{\"__dbIndexData\":\"1\",\"form\":\"formElement\",\"formId\":\"1007\",\"r\":\"502\",\"s\":\"5db18fbfbfdd4\",\"urlparam\":\"__dbIndexData=1&form=formElement&formId=1007&r=502\"}','192.168.133.204','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36',2,502,1,'a72e32ab22455538aad79b6fe67a8bab','2019-10-24 11:49:33'),(850,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"enabled-0\":\"yes\",\"dynamicUpdate-0\":\"yes\",\"mode-0\":\"show\",\"class-0\":\"native\",\"_h_subrecordOption-0\":\"\",\"encode-0\":\"specialchar\",\"checkType-0\":\"auto\",\"labelAlign-0\":\"default\",\"_h_rowLabelInputNote-0\":\"\",\"feIdContainer-0\":\"504\",\"name-0\":\"dynamicUpdate\",\"label-0\":\"Dynamic Update\",\"modeSql-0\":\"{{SELECT IF( \'{{radio:FR:alnumx}}\'=\'option c\' ,\'required\', \'hidden\' ) }}\",\"type-0\":\"text\",\"parameterLanguageA-0\":\"\",\"parameterLanguageB-0\":\"\",\"parameterLanguageC-0\":\"\",\"parameterLanguageD-0\":\"\",\"checkPattern-0\":\"\",\"ord-0\":\"130\",\"adminNote-0\":\"\",\"size-0\":\"\",\"bsLabelColumns-0\":\"\",\"bsInputColumns-0\":\"\",\"bsNoteColumns-0\":\"\",\"_0_rowLabelInputNote-0\":\"row\",\"_1_rowLabelInputNote-0\":\"label\",\"_2_rowLabelInputNote-0\":\"\\/label\",\"_3_rowLabelInputNote-0\":\"input\",\"_4_rowLabelInputNote-0\":\"\\/input\",\"_5_rowLabelInputNote-0\":\"note\",\"_6_rowLabelInputNote-0\":\"\\/note\",\"_7_rowLabelInputNote-0\":\"\\/row\",\"maxLength-0\":\"\",\"note-0\":\"\",\"tooltip-0\":\"\",\"placeholder-0\":\"\",\"value-0\":\"\",\"sql1-0\":\"\",\"parameter-0\":\"\",\"_sipForTypo3Vars\":\"5db18fc7a09b3\"}','{\"__dbIndexData\":\"1\",\"form\":\"formElement\",\"formId\":\"1007\",\"r\":\"0\",\"s\":\"5db18fd109a0e\",\"urlparam\":\"__dbIndexData=1&form=formElement&formId=1007&r=0\"}','192.168.133.204','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36',2,0,1,'a72e32ab22455538aad79b6fe67a8bab','2019-10-24 11:59:03'),(851,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"a5bb36d5b70412b72074fd52eb18fc62\",\"enabled-508\":\"yes\",\"dynamicUpdate-508\":\"yes\",\"mode-508\":\"show\",\"class-508\":\"native\",\"_h_subrecordOption-508\":\"\",\"encode-508\":\"specialchar\",\"checkType-508\":\"auto\",\"labelAlign-508\":\"default\",\"_h_rowLabelInputNote-508\":\"\",\"feIdContainer-508\":\"504\",\"name-508\":\"dynamicUpdate\",\"label-508\":\"dynamic update\",\"modeSql-508\":\"{{SELECT IF( \'{{radio:FR:alnumx}}\'=\'option c\' ,\'required\', \'hidden\' ) }}\",\"type-508\":\"text\",\"parameterLanguageA-508\":\"\",\"parameterLanguageB-508\":\"\",\"parameterLanguageC-508\":\"\",\"parameterLanguageD-508\":\"\",\"checkPattern-508\":\"\",\"ord-508\":\"130\",\"adminNote-508\":\"\",\"size-508\":\"\",\"bsLabelColumns-508\":\"\",\"bsInputColumns-508\":\"\",\"bsNoteColumns-508\":\"\",\"_0_rowLabelInputNote-508\":\"row\",\"_1_rowLabelInputNote-508\":\"label\",\"_2_rowLabelInputNote-508\":\"\\/label\",\"_3_rowLabelInputNote-508\":\"input\",\"_4_rowLabelInputNote-508\":\"\\/input\",\"_5_rowLabelInputNote-508\":\"note\",\"_6_rowLabelInputNote-508\":\"\\/note\",\"_7_rowLabelInputNote-508\":\"\\/row\",\"maxLength-508\":\"\",\"note-508\":\"\",\"tooltip-508\":\"\",\"placeholder-508\":\"\",\"value-508\":\"\",\"sql1-508\":\"\",\"parameter-508\":\"\",\"_sipForTypo3Vars\":\"5db18fc7a09b3\"}','{\"__dbIndexData\":\"1\",\"form\":\"formElement\",\"formId\":\"1007\",\"r\":\"508\",\"s\":\"5db192076b60a\",\"urlparam\":\"__dbIndexData=1&form=formElement&formId=1007&r=508\"}','192.168.133.204','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36',2,508,1,'a72e32ab22455538aad79b6fe67a8bab','2019-10-24 11:59:28'),(852,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"as\",\"number-0\":\"3\",\"date-0\":\"04.08.92\",\"datetime-0\":\"02.02.92 02:00\",\"decimal-0\":\"0.2\",\"enum-0\":\"second option\",\"radio-0\":\"option c\",\"dynamicUpdate-0\":\"a\",\"_0_checkbox-0\":\"1\",\"pill_text-0\":\"\",\"file-0\":\"5db1927a36695\",\"_sipForTypo3Vars\":\"5db18fbfc0906\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db18fb002d04\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.204','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36',1007,0,3,'a72e32ab22455538aad79b6fe67a8bab','2019-10-24 12:01:19'),(853,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"7fdb95bc31a59223936d247a612e92ab\",\"_h_checkbox-620\":\"\",\"text-620\":\"as\",\"number-620\":\"3\",\"date-620\":\"04.08.1992\",\"datetime-620\":\"02.02.1992 02:00\",\"decimal-620\":\"0.20\",\"enum-620\":\"second option\",\"radio-620\":\"option b\",\"dynamicUpdate-620\":\"a\",\"_0_checkbox-620\":\"1\",\"pill_text-620\":\"\",\"file-620\":\"5db192f0a34e7\",\"_sipForTypo3Vars\":\"5db192ee47b18\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"620\",\"s\":\"5db192c9803b0\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=620\"}','192.168.133.203','','Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:69.0) Gecko/20100101 Firefox/69.0',1007,620,1,'83228dfc9b11c970e5af54a8d48eca25','2019-10-24 12:03:18'),(854,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d75f2a558068d04c418a46676d832354\",\"_h_checkbox-620\":\"\",\"text-620\":\"as\",\"number-620\":\"3\",\"date-620\":\"04.08.1992\",\"datetime-620\":\"02.02.1992 02:00\",\"decimal-620\":\"0.20\",\"enum-620\":\"second option\",\"radio-620\":\"option b\",\"dynamicUpdate-620\":\"\",\"_0_checkbox-620\":\"1\",\"pill_text-620\":\"\",\"file-620\":\"5db1931121edd\",\"_sipForTypo3Vars\":\"5db192ee47b18\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"620\",\"s\":\"5db192c9803b0\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=620\"}','192.168.133.203','','Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:69.0) Gecko/20100101 Firefox/69.0',1007,620,1,'83228dfc9b11c970e5af54a8d48eca25','2019-10-24 12:03:46'),(855,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"a170rm3Edly5FVPF479Ef6IRJwEv1Xdw\",\"number-0\":\"997555022\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"dynamicUpdate-0\":\"\",\"pill_text-0\":\"\",\"file-0\":\"5db1941d2c10b\",\"_sipForTypo3Vars\":\"5db1941c5e45f\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db1941b752f7\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,0,3,'93fff081f2f49ba288880664580f8fab','2019-10-24 12:07:59'),(856,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"2k8CUbCjM3KR8porAXJE0jchQZacd8PT\",\"number-0\":\"744470972\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"dynamicUpdate-0\":\"\",\"pill_text-0\":\"\",\"file-0\":\"5db194208a954\",\"_sipForTypo3Vars\":\"5db1941c5e45f\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db1941b752f7\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,0,3,'93fff081f2f49ba288880664580f8fab','2019-10-24 12:08:02'),(857,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"aa6dac57087ac514bce3db8ff003ca89\",\"_h_checkbox-622\":\"\",\"text-622\":\"n8gOMhiLKck7bFsKOriOp0roQMvLCow7\",\"number-622\":\"804152860\",\"date-622\":\"01.01.2188\",\"datetime-622\":\"02.02.2188 01:08\",\"decimal-622\":\"12.84\",\"enum-622\":\"first option\",\"radio-622\":\"option a\",\"dynamicUpdate-622\":\"\",\"pill_text-622\":\"\",\"file-622\":\"5db194233dc12\",\"_sipForTypo3Vars\":\"5db194233dd27\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"622\",\"s\":\"5db194226988c\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=622\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,622,1,'93fff081f2f49ba288880664580f8fab','2019-10-24 12:08:04'),(858,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"66zZHao3E4ZT7waEZmG6Z0PCNcU9Txby\",\"number-0\":\"1194430750\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"dynamicUpdate-0\":\"\",\"pill_text-0\":\"gzwBF2cr4c8iGyHn88H75tKDTx3YTmel\",\"file-0\":\"5db194259155e\",\"_sipForTypo3Vars\":\"5db1941c5e45f\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db1941b752f7\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,0,3,'93fff081f2f49ba288880664580f8fab','2019-10-24 12:08:07'),(859,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"NV149KScNQSdxJAkiFHRB8nz6QN602Bm\",\"number-0\":\"397532113\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"dynamicUpdate-0\":\"\",\"pill_text-0\":\"\",\"file-0\":\"5db1942f432c4\",\"_sipForTypo3Vars\":\"5db1941c5e45f\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db1941b752f7\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,0,3,'93fff081f2f49ba288880664580f8fab','2019-10-24 12:08:17'),(860,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"nrdElGXRnL8gqU9g5R9V8c2eOBjShann\",\"number-0\":\"1623745885\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"dynamicUpdate-0\":\"\",\"pill_text-0\":\"\",\"file-0\":\"5db19432c8bfd\",\"_sipForTypo3Vars\":\"5db1941c5e45f\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db1941b752f7\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,0,3,'93fff081f2f49ba288880664580f8fab','2019-10-24 12:08:22'),(861,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"yZnx8ySBjaTTgxNkaJ52XJ4KSEwXRz0q\",\"number-0\":\"1425990730\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"dynamicUpdate-0\":\"\",\"pill_text-0\":\"\",\"file-0\":\"5db194385c5bc\",\"_sipForTypo3Vars\":\"5db1941c5e45f\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db1941b752f7\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,0,3,'93fff081f2f49ba288880664580f8fab','2019-10-24 12:08:28'),(862,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"sdfas\",\"number-0\":\"2\",\"date-0\":\"01.01.2019\",\"datetime-0\":\"01.01.2019 00:00\",\"decimal-0\":\"1\",\"enum-0\":\"second option\",\"radio-0\":\"option a\",\"dynamicUpdate-0\":\"\",\"_0_checkbox-0\":\"1\",\"_1_checkbox-0\":\"2\",\"pill_text-0\":\"\",\"file-0\":\"5db1969e3e326\",\"_sipForTypo3Vars\":\"5db1969e3e492\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db17d2bd397a\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:69.0) Gecko/20100101 Firefox/69.0',1007,0,3,'83228dfc9b11c970e5af54a8d48eca25','2019-10-24 12:19:01'),(863,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"e7f62d5b619302b570cb1ddfd68ffebc\",\"_h_checkbox-627\":\"\",\"text-627\":\"sdfas\",\"number-627\":\"2\",\"date-627\":\"01.01.2019\",\"datetime-627\":\"01.01.2019 00:00\",\"decimal-627\":\"1.00\",\"enum-627\":\"second option\",\"radio-627\":\"option c\",\"dynamicUpdate-627\":\"fasdfsa\",\"_0_checkbox-627\":\"1\",\"_1_checkbox-627\":\"2\",\"pill_text-627\":\"\",\"file-627\":\"5db196c38420a\",\"_sipForTypo3Vars\":\"5db196c3843b9\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"627\",\"s\":\"5db196b520b55\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=627\"}','192.168.133.203','','Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:69.0) Gecko/20100101 Firefox/69.0',1007,627,1,'83228dfc9b11c970e5af54a8d48eca25','2019-10-24 12:19:25'),(864,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"fbDHRLGWpI80hma1tnHnAHARobnI8RVe\",\"number-0\":\"304661191\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option c\",\"dynamicUpdate-0\":\"ailzWr6o5RJvjl7suvGFb3qq6Ohzk3xW\",\"pill_text-0\":\"\",\"file-0\":\"5db1994045362\",\"_sipForTypo3Vars\":\"5db1994045432\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db1993f22fa6\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.70 Safari/537.36',1007,0,3,'d8a28cfb40f5d87c9b166d0d8f42182b','2019-10-24 12:29:59'),(865,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"Ikq4ymuSryyfMvRS36mM0wXASA9o9RHS\",\"number-0\":\"1979500082\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option c\",\"dynamicUpdate-0\":\"96sVGmLl8WZ2QzdeqSwZedkHrA3kwpJp\",\"pill_text-0\":\"\",\"file-0\":\"5db1997437600\",\"_sipForTypo3Vars\":\"5db19974376cf\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db199734e66c\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.70 Safari/537.36',1007,0,3,'cf972684599361b1a5b07490fbc26be3','2019-10-24 12:30:52'),(866,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"oPP6sLhMxlreFqne411sQ4LD9A4cnhpZ\",\"number-0\":\"1061160645\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option c\",\"dynamicUpdate-0\":\"CdcMFDuMIULW5Co4Xn1oEtMLcP9jvChP\",\"pill_text-0\":\"\",\"file-0\":\"5db199aae19b6\",\"_sipForTypo3Vars\":\"5db199aae1a89\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db199a9ef4e4\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.70 Safari/537.36',1007,0,3,'5b382d8b93c342ebce2fd77a2aee67b2','2019-10-24 12:31:46'),(867,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"sieOllFUTSO392IigDw0KlXMfsPNpQZl\",\"number-0\":\"321733672\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option c\",\"dynamicUpdate-0\":\"vLxowosLoFeL4LOmM7cjjGf1XTEoYKLy\",\"pill_text-0\":\"\",\"file-0\":\"5db199d5bc69e\",\"_sipForTypo3Vars\":\"5db199d5bc76a\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db199d4df958\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.70 Safari/537.36',1007,0,3,'8ef1846f28291935665bba986d6e300b','2019-10-24 12:32:24'),(868,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"V4MrnBiKEfHFxnV8vuACKQtMbx0kqDCw\",\"number-0\":\"1114830989\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option c\",\"dynamicUpdate-0\":\"D7fPA9X3\",\"pill_text-0\":\"\",\"file-0\":\"5db199f889863\",\"_sipForTypo3Vars\":\"5db199f889969\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db199f793807\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.70 Safari/537.36',1007,0,3,'1c5b11ba6ab87bfa1ec05c30fcb90e02','2019-10-24 12:32:59'),(869,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"FNFUNX7ECdapbGlLAfYMNUTjhrzfMrEm\",\"number-0\":\"1584997066\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option c\",\"dynamicUpdate-0\":\"tybVBEHL\",\"pill_text-0\":\"\",\"file-0\":\"5db19a07f1923\",\"_sipForTypo3Vars\":\"5db19a07f19f0\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db19a07090a4\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.70 Safari/537.36',1007,0,3,'a9fb7a56a3a6cbb3ed3cf9919c3c2f22','2019-10-24 12:33:14'),(870,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"yigS3Euqal7LccsRP26kGlD9g0z7wuH8\",\"number-0\":\"929148145\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option c\",\"dynamicUpdate-0\":\"SdH0L5hxiybWCxgjXG3z8jLKkoKzzsnO\",\"pill_text-0\":\"\",\"file-0\":\"5db19a23e0f08\",\"_sipForTypo3Vars\":\"5db19a23e104b\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db19a22d9db6\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.70 Safari/537.36',1007,0,3,'3726d71cbcb2c186cd5e2fb2f25d4c65','2019-10-24 12:33:42'),(871,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"JFYlXvPGcpVFEtS4gpIrUcBiarveqqq3\",\"number-0\":\"1456337716\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option c\",\"dynamicUpdate-0\":\"8N3cP3gPc0pzTmAeglRCyukzPmd16kkT\",\"pill_text-0\":\"\",\"file-0\":\"5db19a558e7f6\",\"_sipForTypo3Vars\":\"5db19a558e8c4\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db19a54a801f\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.70 Safari/537.36',1007,0,3,'0383ee2682c88f09106c976c30ce72db','2019-10-24 12:34:32'),(872,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"S1jSzrhXIdVUEcBkqKA325UT8obFgnGs\",\"number-0\":\"376489728\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"dynamicUpdate-0\":\"\",\"pill_text-0\":\"\",\"file-0\":\"5db19aab9c6f6\",\"_sipForTypo3Vars\":\"5db19aaad68a1\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db19aaa0ab55\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,0,3,'98e181db9d71ac094de8ba9f6677f260','2019-10-24 12:35:57'),(873,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"9vEbnAQqMMw8QUabSgfjkY8KKeZnkpmK\",\"number-0\":\"282724891\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"dynamicUpdate-0\":\"\",\"pill_text-0\":\"\",\"file-0\":\"5db19aaedd873\",\"_sipForTypo3Vars\":\"5db19aaad68a1\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db19aaa0ab55\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,0,3,'98e181db9d71ac094de8ba9f6677f260','2019-10-24 12:36:00'),(874,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"e1efddd6fb0773e8131d12600d161ef4\",\"_h_checkbox-637\":\"\",\"text-637\":\"zohYQ0ljoko9eV88aKhJC6XHN4e5rkdn\",\"number-637\":\"1340905948\",\"date-637\":\"01.01.2188\",\"datetime-637\":\"02.02.2188 01:08\",\"decimal-637\":\"12.84\",\"enum-637\":\"first option\",\"radio-637\":\"option a\",\"dynamicUpdate-637\":\"\",\"pill_text-637\":\"\",\"file-637\":\"5db19ab18184b\",\"_sipForTypo3Vars\":\"5db19ab181928\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"637\",\"s\":\"5db19ab0a8801\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=637\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,637,1,'98e181db9d71ac094de8ba9f6677f260','2019-10-24 12:36:02'),(875,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"gvXQCcWVbgx9ssBdlPFtq8CRxTk67ORS\",\"number-0\":\"59760032\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"dynamicUpdate-0\":\"\",\"pill_text-0\":\"B6oT8Xi0ZTKtBnAdwc0qAp7Nfg9WbtRc\",\"file-0\":\"5db19ab3e3d04\",\"_sipForTypo3Vars\":\"5db19aaad68a1\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db19aaa0ab55\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,0,3,'98e181db9d71ac094de8ba9f6677f260','2019-10-24 12:36:06'),(876,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"cCY1AEfic9xqvBgn4MbCIJTOmKRv4smv\",\"number-0\":\"197487514\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option c\",\"dynamicUpdate-0\":\"DCt8EpbfOolr26r3SKilAIz4ZvfBkqlJ\",\"pill_text-0\":\"\",\"file-0\":\"5db19abd745fa\",\"_sipForTypo3Vars\":\"5db19aaad68a1\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db19aaa0ab55\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,0,3,'98e181db9d71ac094de8ba9f6677f260','2019-10-24 12:36:15'),(877,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"OGqDXZcHCnIybsig0lNhPs2i0Eg9LUfE\",\"number-0\":\"1519278458\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"dynamicUpdate-0\":\"\",\"pill_text-0\":\"\",\"file-0\":\"5db19ac12b34f\",\"_sipForTypo3Vars\":\"5db19aaad68a1\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db19aaa0ab55\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,0,3,'98e181db9d71ac094de8ba9f6677f260','2019-10-24 12:36:19'),(878,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"TFglhrmUS2mA4ua0BKrYzn6HxMCwRP3U\",\"number-0\":\"1930264014\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"dynamicUpdate-0\":\"\",\"pill_text-0\":\"\",\"file-0\":\"5db19ac484d97\",\"_sipForTypo3Vars\":\"5db19aaad68a1\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db19aaa0ab55\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,0,3,'98e181db9d71ac094de8ba9f6677f260','2019-10-24 12:36:24'),(879,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"P190QQogZBa1mOd3WTHYtvnV9xlyMOUn\",\"number-0\":\"1486121906\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"dynamicUpdate-0\":\"\",\"pill_text-0\":\"\",\"file-0\":\"5db19ac9cb8f4\",\"_sipForTypo3Vars\":\"5db19aaad68a1\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db19aaa0ab55\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,0,3,'98e181db9d71ac094de8ba9f6677f260','2019-10-24 12:36:29'),(880,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"YgJpvLiDTONHoyqybVb0kkzozmHZ5Cd6\",\"number-0\":\"1128204949\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"dynamicUpdate-0\":\"\",\"pill_text-0\":\"\",\"file-0\":\"5db19f7ac4859\",\"_sipForTypo3Vars\":\"5db19f79df055\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db19f79041a9\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,0,3,'70bf70f4a83d6ea3276f6f95bee7e116','2019-10-24 12:56:28'),(881,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"KRuDHtam4rpnrNLnEoY20KjbzghlsKOr\",\"number-0\":\"824179000\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"dynamicUpdate-0\":\"\",\"pill_text-0\":\"\",\"file-0\":\"5db19f7e18c2e\",\"_sipForTypo3Vars\":\"5db19f79df055\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db19f79041a9\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,0,3,'70bf70f4a83d6ea3276f6f95bee7e116','2019-10-24 12:56:31'),(882,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"58ccd4ffd21012c77352dde354d2c74a\",\"_h_checkbox-644\":\"\",\"text-644\":\"LLwd6rPOPmeVufmH4g9SlDVWdGazsA8d\",\"number-644\":\"267339174\",\"date-644\":\"01.01.2188\",\"datetime-644\":\"02.02.2188 01:08\",\"decimal-644\":\"12.84\",\"enum-644\":\"first option\",\"radio-644\":\"option a\",\"dynamicUpdate-644\":\"\",\"pill_text-644\":\"\",\"file-644\":\"5db19f80ae290\",\"_sipForTypo3Vars\":\"5db19f80ae371\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"644\",\"s\":\"5db19f7fda25e\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=644\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,644,1,'70bf70f4a83d6ea3276f6f95bee7e116','2019-10-24 12:56:33'),(883,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"gvDWhi8COo5sYQm2rsShUB01Di7iJCGV\",\"number-0\":\"1209506955\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"dynamicUpdate-0\":\"\",\"pill_text-0\":\"SgySoTqpw7SVBKBYdIOHZeT7J0YOYC89\",\"file-0\":\"5db19f82edbe1\",\"_sipForTypo3Vars\":\"5db19f79df055\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db19f79041a9\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,0,3,'70bf70f4a83d6ea3276f6f95bee7e116','2019-10-24 12:56:37'),(884,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"gEy9nXST4UO7JtPthNiExWNGst1AK9jm\",\"number-0\":\"710751760\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option c\",\"dynamicUpdate-0\":\"GNGYlDiy2uDquUzfziAFhP6NsCIRFUk5\",\"pill_text-0\":\"\",\"file-0\":\"5db19f8c88276\",\"_sipForTypo3Vars\":\"5db19f79df055\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db19f79041a9\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,0,3,'70bf70f4a83d6ea3276f6f95bee7e116','2019-10-24 12:56:46'),(885,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"vHE2IHDaYah9GZrhRCGFlGN27dTrYeJh\",\"number-0\":\"1300634744\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"dynamicUpdate-0\":\"\",\"pill_text-0\":\"\",\"file-0\":\"5db19f905789e\",\"_sipForTypo3Vars\":\"5db19f79df055\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db19f79041a9\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,0,3,'70bf70f4a83d6ea3276f6f95bee7e116','2019-10-24 12:56:50'),(886,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"a8rsCoVkCGHXAoseAXaiozx5TxFP0f6g\",\"number-0\":\"299721782\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"dynamicUpdate-0\":\"\",\"pill_text-0\":\"\",\"file-0\":\"5db19f93d5606\",\"_sipForTypo3Vars\":\"5db19f79df055\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db19f79041a9\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,0,3,'70bf70f4a83d6ea3276f6f95bee7e116','2019-10-24 12:56:56'),(887,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"tp7WFVzFQl1hu4yoaSJAx89PYl90YVl3\",\"number-0\":\"1530074037\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"dynamicUpdate-0\":\"\",\"pill_text-0\":\"\",\"file-0\":\"5db19f9973035\",\"_sipForTypo3Vars\":\"5db19f79df055\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db19f79041a9\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,0,3,'70bf70f4a83d6ea3276f6f95bee7e116','2019-10-24 12:57:01'),(888,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"E118dCOWkyVdkgof2I9JCSJ6LbAekG5m\",\"number-0\":\"1779075497\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"dynamicUpdate-0\":\"\",\"pill_text-0\":\"\",\"file-0\":\"5db1a1f015da8\",\"_sipForTypo3Vars\":\"5db1a1ef4e366\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db1a1ee6225e\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,0,3,'b705ca3b90547993dabe354f8d38f89b','2019-10-24 13:06:57'),(889,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"EljpbAv44GdxoDj8AhYkOhaHI3BOILGl\",\"number-0\":\"898761210\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"dynamicUpdate-0\":\"\",\"pill_text-0\":\"\",\"file-0\":\"5db1a1f352b00\",\"_sipForTypo3Vars\":\"5db1a1ef4e366\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db1a1ee6225e\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,0,3,'b705ca3b90547993dabe354f8d38f89b','2019-10-24 13:07:01'),(890,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"bcf08de7ee656074106adcb4525853da\",\"_h_checkbox-651\":\"\",\"text-651\":\"W2iHkvHprJrh8ZZdOEs9LMcHUGNKTEPB\",\"number-651\":\"1552537076\",\"date-651\":\"01.01.2188\",\"datetime-651\":\"02.02.2188 01:08\",\"decimal-651\":\"12.84\",\"enum-651\":\"first option\",\"radio-651\":\"option a\",\"dynamicUpdate-651\":\"\",\"pill_text-651\":\"\",\"file-651\":\"5db1a1f5da1e8\",\"_sipForTypo3Vars\":\"5db1a1f5da2ed\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"651\",\"s\":\"5db1a1f517a0d\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=651\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,651,1,'b705ca3b90547993dabe354f8d38f89b','2019-10-24 13:07:03'),(891,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"4aXVvImuRvqRAIksMqsNOJBmEjph7UsQ\",\"number-0\":\"1433989763\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"dynamicUpdate-0\":\"\",\"pill_text-0\":\"vj2KA1vXswkmnRCOfxxhIuR3QOVq08zM\",\"file-0\":\"5db1a1f84baac\",\"_sipForTypo3Vars\":\"5db1a1ef4e366\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db1a1ee6225e\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,0,3,'b705ca3b90547993dabe354f8d38f89b','2019-10-24 13:07:06'),(892,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"mkfPHeXYamx8YwVrhi6ZmTqfD8k5dBFf\",\"number-0\":\"72156988\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option c\",\"dynamicUpdate-0\":\"V4A3VjD0ZDpuiLAJVJ6gOimvcvYXLsiZ\",\"pill_text-0\":\"\",\"file-0\":\"5db1a201c6264\",\"_sipForTypo3Vars\":\"5db1a1ef4e366\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db1a1ee6225e\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,0,3,'b705ca3b90547993dabe354f8d38f89b','2019-10-24 13:07:16'),(893,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"qMtIyRyAGlfpIm33hnAfAKtN1jnocZ7s\",\"number-0\":\"34060324\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"dynamicUpdate-0\":\"\",\"pill_text-0\":\"\",\"file-0\":\"5db1a2059bbef\",\"_sipForTypo3Vars\":\"5db1a1ef4e366\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db1a1ee6225e\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,0,3,'b705ca3b90547993dabe354f8d38f89b','2019-10-24 13:07:19'),(894,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"xbwcxqmuZ18ukz8fDnt3d3oIELcAGKoC\",\"number-0\":\"758944289\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"dynamicUpdate-0\":\"\",\"pill_text-0\":\"\",\"file-0\":\"5db1a2090dc35\",\"_sipForTypo3Vars\":\"5db1a1ef4e366\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db1a1ee6225e\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,0,3,'b705ca3b90547993dabe354f8d38f89b','2019-10-24 13:07:25'),(895,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"JJbJWBRaw0XzZuxQqIQJ5lAjH5trgscH\",\"number-0\":\"1263484510\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"dynamicUpdate-0\":\"\",\"pill_text-0\":\"\",\"file-0\":\"5db1a20e76b1a\",\"_sipForTypo3Vars\":\"5db1a1ef4e366\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db1a1ee6225e\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,0,3,'b705ca3b90547993dabe354f8d38f89b','2019-10-24 13:07:30'),(896,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"8KsqW8aYaKVihitQyp9mFW5Z8QT9CDbi\",\"number-0\":\"260603503\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"dynamicUpdate-0\":\"\",\"pill_text-0\":\"\",\"file-0\":\"5db1ac3fe2460\",\"_sipForTypo3Vars\":\"5db1ac3f2b0f1\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db1ac3e38f4f\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,0,3,'e3bddf3369245b0ed1717fd5a26bc31a','2019-10-24 13:50:57'),(897,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"Z5A24mD9dWyYtEx1qehoWzwg19CvMLAn\",\"number-0\":\"1698405002\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"dynamicUpdate-0\":\"\",\"pill_text-0\":\"\",\"file-0\":\"5db1ac43241e3\",\"_sipForTypo3Vars\":\"5db1ac3f2b0f1\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db1ac3e38f4f\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,0,3,'e3bddf3369245b0ed1717fd5a26bc31a','2019-10-24 13:51:00'),(898,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"69d801ca3a4113eb2a84b7ee09e82bce\",\"_h_checkbox-658\":\"\",\"text-658\":\"FAA2ck8NnK9HOraKIOhjDQkZIVycR4ch\",\"number-658\":\"1314686284\",\"date-658\":\"01.01.2188\",\"datetime-658\":\"02.02.2188 01:08\",\"decimal-658\":\"12.84\",\"enum-658\":\"first option\",\"radio-658\":\"option a\",\"dynamicUpdate-658\":\"\",\"pill_text-658\":\"\",\"file-658\":\"5db1ac45c661d\",\"_sipForTypo3Vars\":\"5db1ac45c66e8\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"658\",\"s\":\"5db1ac44efd00\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=658\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,658,1,'e3bddf3369245b0ed1717fd5a26bc31a','2019-10-24 13:51:03'),(899,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"1OfeD9MZZuMpux8svsH7XrmBDQ5j62VX\",\"number-0\":\"949424199\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"dynamicUpdate-0\":\"\",\"pill_text-0\":\"Y0rS4s2xjjaZQeu3WBti592m4DqTYLsj\",\"file-0\":\"5db1ac48248db\",\"_sipForTypo3Vars\":\"5db1ac3f2b0f1\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db1ac3e38f4f\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,0,3,'e3bddf3369245b0ed1717fd5a26bc31a','2019-10-24 13:51:06'),(900,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"XaqQxZ3Y8WWHKWFtcEx9Q3FgrmGMApbR\",\"number-0\":\"1263958922\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option c\",\"dynamicUpdate-0\":\"OEDdCrPSIDn4LueLePTre2ZMZrCgp1tr\",\"pill_text-0\":\"\",\"file-0\":\"5db1ac51deef9\",\"_sipForTypo3Vars\":\"5db1ac3f2b0f1\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db1ac3e38f4f\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,0,3,'e3bddf3369245b0ed1717fd5a26bc31a','2019-10-24 13:51:16'),(901,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"KZc9yDMifZH0v1RGkHpw9GHTmPEk5Dnz\",\"number-0\":\"1639168161\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"dynamicUpdate-0\":\"\",\"pill_text-0\":\"\",\"file-0\":\"5db1ac55a51d8\",\"_sipForTypo3Vars\":\"5db1ac3f2b0f1\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db1ac3e38f4f\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,0,3,'e3bddf3369245b0ed1717fd5a26bc31a','2019-10-24 13:51:19'),(902,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"45Ra59aLiPTCWxBpUeQKy5pphDNkPiIY\",\"number-0\":\"2070776033\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"dynamicUpdate-0\":\"\",\"pill_text-0\":\"\",\"file-0\":\"5db1ac5908bf2\",\"_sipForTypo3Vars\":\"5db1ac3f2b0f1\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db1ac3e38f4f\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,0,3,'e3bddf3369245b0ed1717fd5a26bc31a','2019-10-24 13:51:25'),(903,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"PIbxZlxS9aIHmWSNVhyssze8UeQcs3yy\",\"number-0\":\"1931108977\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"dynamicUpdate-0\":\"\",\"pill_text-0\":\"\",\"file-0\":\"5db1ac5e79ce3\",\"_sipForTypo3Vars\":\"5db1ac3f2b0f1\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db1ac3e38f4f\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,0,3,'e3bddf3369245b0ed1717fd5a26bc31a','2019-10-24 13:51:30'),(904,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"LCPldXaOAhbu7s5Ont2GfVkTVXm4oBB0\",\"number-0\":\"1218983685\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"dynamicUpdate-0\":\"\",\"pill_text-0\":\"\",\"file-0\":\"5db1ae5fc0d3b\",\"_sipForTypo3Vars\":\"5db1ae5ee9e32\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db1ae5e0f086\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,0,3,'64bcef47fb1402470fb404d42a879783','2019-10-24 14:00:01'),(905,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"Cz78RfZbGciyZ8wPbAwiVT9JXOwGQ2al\",\"number-0\":\"444674874\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"dynamicUpdate-0\":\"\",\"pill_text-0\":\"\",\"file-0\":\"5db1ae6344fec\",\"_sipForTypo3Vars\":\"5db1ae5ee9e32\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db1ae5e0f086\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,0,3,'64bcef47fb1402470fb404d42a879783','2019-10-24 14:00:05'),(906,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d21face0db5d6386e01508d9cfe5a976\",\"_h_checkbox-665\":\"\",\"text-665\":\"hFBPdIKBXgE4B2Bbd8HyGmDqobBAber0\",\"number-665\":\"801524327\",\"date-665\":\"01.01.2188\",\"datetime-665\":\"02.02.2188 01:08\",\"decimal-665\":\"12.84\",\"enum-665\":\"first option\",\"radio-665\":\"option a\",\"dynamicUpdate-665\":\"\",\"pill_text-665\":\"\",\"file-665\":\"5db1ae6630ac4\",\"_sipForTypo3Vars\":\"5db1ae6630b8f\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"665\",\"s\":\"5db1ae6551978\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=665\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,665,1,'64bcef47fb1402470fb404d42a879783','2019-10-24 14:00:07'),(907,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"QRuBSLC4rSyLYibUeRCwfxpUObJEBiiJ\",\"number-0\":\"252128428\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"dynamicUpdate-0\":\"\",\"pill_text-0\":\"YlT6z1nUjORwLfZ4rEnYooApbkZhYAlV\",\"file-0\":\"5db1ae68a0091\",\"_sipForTypo3Vars\":\"5db1ae5ee9e32\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db1ae5e0f086\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,0,3,'64bcef47fb1402470fb404d42a879783','2019-10-24 14:00:11'),(908,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"dCns09FolwDvHrvuWpZUjkIdfWlCrA05\",\"number-0\":\"1071907332\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option c\",\"dynamicUpdate-0\":\"YhQvLRigdstwgEz29v3ZMcRrpO1Wps9A\",\"pill_text-0\":\"\",\"file-0\":\"5db1ae724a9cd\",\"_sipForTypo3Vars\":\"5db1ae5ee9e32\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db1ae5e0f086\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,0,3,'64bcef47fb1402470fb404d42a879783','2019-10-24 14:00:20'),(909,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"Z9two8QASQKj1uoDj5I8sDrEcRIKFYoR\",\"number-0\":\"687450618\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"dynamicUpdate-0\":\"\",\"pill_text-0\":\"\",\"file-0\":\"5db1ae760f546\",\"_sipForTypo3Vars\":\"5db1ae5ee9e32\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db1ae5e0f086\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,0,3,'64bcef47fb1402470fb404d42a879783','2019-10-24 14:00:24'),(910,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"MREHPxQYgKDRNDTR3y98jsu8cGJ1hENa\",\"number-0\":\"786097056\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"dynamicUpdate-0\":\"\",\"pill_text-0\":\"\",\"file-0\":\"5db1ae797a68b\",\"_sipForTypo3Vars\":\"5db1ae5ee9e32\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db1ae5e0f086\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,0,3,'64bcef47fb1402470fb404d42a879783','2019-10-24 14:00:29'),(911,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"SKrptqDoEldeyDuLiQGPGJnSwlN436eB\",\"number-0\":\"1797265440\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"dynamicUpdate-0\":\"\",\"pill_text-0\":\"\",\"file-0\":\"5db1ae7f266d4\",\"_sipForTypo3Vars\":\"5db1ae5ee9e32\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db1ae5e0f086\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,0,3,'64bcef47fb1402470fb404d42a879783','2019-10-24 14:00:35'),(912,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"xtOJPgt5KvlC0sDIobfcuBpNasRzGcj9\",\"number-0\":\"416220995\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"dynamicUpdate-0\":\"\",\"pill_text-0\":\"\",\"file-0\":\"5db29c8dcde4d\",\"_sipForTypo3Vars\":\"5db29c8d040a3\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db29c8c2abe3\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,0,3,'221a4a1d02842b0b08b82f21e6f33750','2019-10-25 06:56:15'),(913,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"Z5b8Ya8NI3wBw7fWYf6g5yj0sntRU1bo\",\"number-0\":\"1757711962\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"dynamicUpdate-0\":\"\",\"pill_text-0\":\"\",\"file-0\":\"5db29c9147790\",\"_sipForTypo3Vars\":\"5db29c8d040a3\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db29c8c2abe3\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,0,3,'221a4a1d02842b0b08b82f21e6f33750','2019-10-25 06:56:19'),(914,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"c7fd7514fdb7e247b0adaf38f3da4999\",\"_h_checkbox-672\":\"\",\"text-672\":\"EtDzu6EobSZQB5B7nBnBfkM3t1vtXMIM\",\"number-672\":\"944637842\",\"date-672\":\"01.01.2188\",\"datetime-672\":\"02.02.2188 01:08\",\"decimal-672\":\"12.84\",\"enum-672\":\"first option\",\"radio-672\":\"option a\",\"dynamicUpdate-672\":\"\",\"pill_text-672\":\"\",\"file-672\":\"5db29c9427f17\",\"_sipForTypo3Vars\":\"5db29c9427fec\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"672\",\"s\":\"5db29c93239b5\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=672\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,672,1,'221a4a1d02842b0b08b82f21e6f33750','2019-10-25 06:56:21'),(915,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"BLxg1fwHa4Stik5YXY9kR6R84p0HEjqQ\",\"number-0\":\"2096972797\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"dynamicUpdate-0\":\"\",\"pill_text-0\":\"30vQdgiZwld3I5VwzlsxIGHjonptIzI9\",\"file-0\":\"5db29c968a0d5\",\"_sipForTypo3Vars\":\"5db29c8d040a3\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db29c8c2abe3\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,0,3,'221a4a1d02842b0b08b82f21e6f33750','2019-10-25 06:56:24'),(916,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"nXnY6WoTUHKzTtkRhWPNchXzzoKV7t9j\",\"number-0\":\"1793983812\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option c\",\"dynamicUpdate-0\":\"ZcH6UylbonC1xmQBzkElOJpHxNzVgIbS\",\"pill_text-0\":\"\",\"file-0\":\"5db29ca02c767\",\"_sipForTypo3Vars\":\"5db29c8d040a3\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db29c8c2abe3\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,0,3,'221a4a1d02842b0b08b82f21e6f33750','2019-10-25 06:56:34'),(917,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"JSBM0Uzxg6waD0qBh8UzrxU5xP4iuM4r\",\"number-0\":\"1622738437\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"dynamicUpdate-0\":\"\",\"pill_text-0\":\"\",\"file-0\":\"5db29ca406762\",\"_sipForTypo3Vars\":\"5db29c8d040a3\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db29c8c2abe3\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,0,3,'221a4a1d02842b0b08b82f21e6f33750','2019-10-25 06:56:38'),(918,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"T9hUpEI7Q4p7pwr518YuyUi5mH9FYZeh\",\"number-0\":\"1067098113\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"dynamicUpdate-0\":\"\",\"pill_text-0\":\"\",\"file-0\":\"5db29ca78550e\",\"_sipForTypo3Vars\":\"5db29c8d040a3\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db29c8c2abe3\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,0,3,'221a4a1d02842b0b08b82f21e6f33750','2019-10-25 06:56:43'),(919,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"R2AcqAYkgZXVX8WMUnnl0pbEXiGVFBu0\",\"number-0\":\"1157989791\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"dynamicUpdate-0\":\"\",\"pill_text-0\":\"\",\"file-0\":\"5db29cad38aa5\",\"_sipForTypo3Vars\":\"5db29c8d040a3\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db29c8c2abe3\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,0,3,'221a4a1d02842b0b08b82f21e6f33750','2019-10-25 06:56:49'),(920,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"hwUdmdZTybhbRSihgjsIXgRrvqwPeNEe\",\"number-0\":\"654326598\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"dynamicUpdate-0\":\"\",\"pill_text-0\":\"\",\"file-0\":\"5db29d9ad5e2f\",\"_sipForTypo3Vars\":\"5db29d9a0157f\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db29d992de3d\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,0,3,'c258140649b6d25565aadca0b08793b9','2019-10-25 07:00:44'),(921,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"lYG7Zm8zXNhOfpFCYiNCXWUzLi0hrQw4\",\"number-0\":\"290449248\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"dynamicUpdate-0\":\"\",\"pill_text-0\":\"\",\"file-0\":\"5db29d9e3babb\",\"_sipForTypo3Vars\":\"5db29d9a0157f\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db29d992de3d\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,0,3,'c258140649b6d25565aadca0b08793b9','2019-10-25 07:00:47'),(922,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"c5f1a32cbab956017809d4f0d6cd3191\",\"_h_checkbox-679\":\"\",\"text-679\":\"zydWLkEwl1pzIX2p7CregtAaVhotjnK0\",\"number-679\":\"703406665\",\"date-679\":\"01.01.2188\",\"datetime-679\":\"02.02.2188 01:08\",\"decimal-679\":\"12.84\",\"enum-679\":\"first option\",\"radio-679\":\"option a\",\"dynamicUpdate-679\":\"\",\"pill_text-679\":\"\",\"file-679\":\"5db29da0bfba7\",\"_sipForTypo3Vars\":\"5db29da0bfd1f\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"679\",\"s\":\"5db29da0018e6\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=679\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,679,1,'c258140649b6d25565aadca0b08793b9','2019-10-25 07:00:50'),(923,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"RKnu0Nb5BUhx4zp1z9szviniWmuk0Lht\",\"number-0\":\"951924233\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"dynamicUpdate-0\":\"\",\"pill_text-0\":\"QV6cM8p5rZGJaCjYWfVKxlZlugw19OHD\",\"file-0\":\"5db29da32490f\",\"_sipForTypo3Vars\":\"5db29d9a0157f\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db29d992de3d\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,0,3,'c258140649b6d25565aadca0b08793b9','2019-10-25 07:00:53'),(924,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"7sw47VC4ivdunFcxTocatuiokEAEHOZK\",\"number-0\":\"483900265\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option c\",\"dynamicUpdate-0\":\"fqfylVsXIoQqYx4MjkEzjTJn4w6hnm0U\",\"pill_text-0\":\"\",\"file-0\":\"5db29dad195bd\",\"_sipForTypo3Vars\":\"5db29d9a0157f\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db29d992de3d\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,0,3,'c258140649b6d25565aadca0b08793b9','2019-10-25 07:01:03'),(925,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"Q5Rd2XpwlTc0E3WX2PvyWB2kQWiDws1J\",\"number-0\":\"1262670063\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"dynamicUpdate-0\":\"\",\"pill_text-0\":\"\",\"file-0\":\"5db29db1324dc\",\"_sipForTypo3Vars\":\"5db29d9a0157f\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db29d992de3d\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,0,3,'c258140649b6d25565aadca0b08793b9','2019-10-25 07:01:07'),(926,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"cTrRBoEODL3Izt2dqjJtU4iSnJ8bh3As\",\"number-0\":\"1915105677\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"dynamicUpdate-0\":\"\",\"pill_text-0\":\"\",\"file-0\":\"5db29db4cad0c\",\"_sipForTypo3Vars\":\"5db29d9a0157f\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db29d992de3d\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,0,3,'c258140649b6d25565aadca0b08793b9','2019-10-25 07:01:13'),(927,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"daTJh3Sas86YPBPLtbgwzuNjuB8Jgvb3\",\"number-0\":\"2133367441\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"dynamicUpdate-0\":\"\",\"pill_text-0\":\"\",\"file-0\":\"5db29dba76e4f\",\"_sipForTypo3Vars\":\"5db29d9a0157f\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db29d992de3d\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,0,3,'c258140649b6d25565aadca0b08793b9','2019-10-25 07:01:18'),(928,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"wvDOYwseLqkyJUlDBe2pefFasgJvYcAA\",\"number-0\":\"1754413117\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"dynamicUpdate-0\":\"\",\"pill_text-0\":\"\",\"file-0\":\"5db29dc89677f\",\"_sipForTypo3Vars\":\"5db29dc7b44a7\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db29dc6d1576\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,0,3,'b251ae315e4d08d5aaf8e061e2d1ad85','2019-10-25 07:01:30'),(929,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"bwoOy5F5xAT3eYaWZNzu1igSiPdGxDey\",\"number-0\":\"1553425385\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"dynamicUpdate-0\":\"\",\"pill_text-0\":\"\",\"file-0\":\"5db29dcbf09bf\",\"_sipForTypo3Vars\":\"5db29dc7b44a7\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db29dc6d1576\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,0,3,'b251ae315e4d08d5aaf8e061e2d1ad85','2019-10-25 07:01:33'),(930,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d77bdae66f39b5e4ad4db80a772a6451\",\"_h_checkbox-686\":\"\",\"text-686\":\"fem5V4mt6oCYuBrJ21H9BymGhISuv3AC\",\"number-686\":\"1017470150\",\"date-686\":\"01.01.2188\",\"datetime-686\":\"02.02.2188 01:08\",\"decimal-686\":\"12.84\",\"enum-686\":\"first option\",\"radio-686\":\"option a\",\"dynamicUpdate-686\":\"\",\"pill_text-686\":\"\",\"file-686\":\"5db29dcec19d7\",\"_sipForTypo3Vars\":\"5db29dcec1ae9\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"686\",\"s\":\"5db29dcde8289\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=686\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,686,1,'b251ae315e4d08d5aaf8e061e2d1ad85','2019-10-25 07:01:36'),(931,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"tq9c01DcqrzjfQhGGKwqpXhKlp7Ak83X\",\"number-0\":\"1940533510\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"dynamicUpdate-0\":\"\",\"pill_text-0\":\"qwhx2q3TMLfpmF5zP5gFSDmu8jKzVB5G\",\"file-0\":\"5db29dd13add4\",\"_sipForTypo3Vars\":\"5db29dc7b44a7\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db29dc6d1576\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,0,3,'b251ae315e4d08d5aaf8e061e2d1ad85','2019-10-25 07:01:39'),(932,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"tYlfAJufK9GCqDVMHyo76Tw4lSBgsg0w\",\"number-0\":\"763058757\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"dynamicUpdate-0\":\"\",\"pill_text-0\":\"\",\"file-0\":\"5db29ddaf03d8\",\"_sipForTypo3Vars\":\"5db29dda3b285\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db29dd96b74a\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,0,3,'964b4fc7fcaf2a59d945f2a40fd4058f','2019-10-25 07:01:48'),(933,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"cCM3tD2yxYEqb3gDHKPhFpqi9IuzSpOy\",\"number-0\":\"618697818\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"dynamicUpdate-0\":\"\",\"pill_text-0\":\"\",\"file-0\":\"5db29dde34585\",\"_sipForTypo3Vars\":\"5db29dda3b285\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db29dd96b74a\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,0,3,'964b4fc7fcaf2a59d945f2a40fd4058f','2019-10-25 07:01:52'),(934,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"61d5f9ec37207bc37197fa2f376ab60a\",\"_h_checkbox-689\":\"\",\"text-689\":\"VjASZEzBrJFHFqVwBi1rulLRTk5lRzRl\",\"number-689\":\"1299615598\",\"date-689\":\"01.01.2188\",\"datetime-689\":\"02.02.2188 01:08\",\"decimal-689\":\"12.84\",\"enum-689\":\"first option\",\"radio-689\":\"option a\",\"dynamicUpdate-689\":\"\",\"pill_text-689\":\"\",\"file-689\":\"5db29de0c44eb\",\"_sipForTypo3Vars\":\"5db29de0c4667\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"689\",\"s\":\"5db29de004a08\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=689\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,689,1,'964b4fc7fcaf2a59d945f2a40fd4058f','2019-10-25 07:01:54'),(935,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"MFAwE2RybukjydlnWY1DprOdWRsHuFWz\",\"number-0\":\"1315890901\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"dynamicUpdate-0\":\"\",\"pill_text-0\":\"Dv168eGh82NosjH7zVYzPGKYEpJ4F4lV\",\"file-0\":\"5db29de3360dc\",\"_sipForTypo3Vars\":\"5db29dda3b285\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db29dd96b74a\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,0,3,'964b4fc7fcaf2a59d945f2a40fd4058f','2019-10-25 07:01:57'),(936,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"Mc8Fe835y4ImKBwgZtGaeq9NQZBiWGRu\",\"number-0\":\"340181715\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option c\",\"dynamicUpdate-0\":\"C2p7IVMwxt7Y8AtRuZ1yGb2Fe4XBKpF3\",\"pill_text-0\":\"\",\"file-0\":\"5db29ded22e32\",\"_sipForTypo3Vars\":\"5db29dda3b285\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db29dd96b74a\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,0,3,'964b4fc7fcaf2a59d945f2a40fd4058f','2019-10-25 07:02:07'),(937,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"DqS4ouTJoBMeQUKJa6TeBuASWNCxbsse\",\"number-0\":\"1638435596\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"dynamicUpdate-0\":\"\",\"pill_text-0\":\"\",\"file-0\":\"5db29df6b4ae9\",\"_sipForTypo3Vars\":\"5db29df5db971\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db29df503b45\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,0,3,'8fbad8d7d0c2e37101f6aab8224aeb30','2019-10-25 07:02:16'),(938,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"LCURfvT6Zc2BftNjoAUqf2TKGDD6Wlrj\",\"number-0\":\"2138833608\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"dynamicUpdate-0\":\"\",\"pill_text-0\":\"\",\"file-0\":\"5db29df9e0131\",\"_sipForTypo3Vars\":\"5db29df5db971\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db29df503b45\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,0,3,'8fbad8d7d0c2e37101f6aab8224aeb30','2019-10-25 07:02:19'),(939,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"8761377258d85aed22d3246a88b3836e\",\"_h_checkbox-693\":\"\",\"text-693\":\"TiyKhUKfkM2fVwFKkRC9oPknaBpICu4E\",\"number-693\":\"1913748382\",\"date-693\":\"01.01.2188\",\"datetime-693\":\"02.02.2188 01:08\",\"decimal-693\":\"12.84\",\"enum-693\":\"first option\",\"radio-693\":\"option a\",\"dynamicUpdate-693\":\"\",\"pill_text-693\":\"\",\"file-693\":\"5db29dfcadc40\",\"_sipForTypo3Vars\":\"5db29dfcadd20\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"693\",\"s\":\"5db29dfbd0e85\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=693\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,693,1,'8fbad8d7d0c2e37101f6aab8224aeb30','2019-10-25 07:02:21'),(940,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"kIgHePRRw8x3dleE72CEE9EAMBPWaNgC\",\"number-0\":\"133336405\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"dynamicUpdate-0\":\"\",\"pill_text-0\":\"4A2zgLDx39FTcJWaHb7Ev2Vns1Lr3KFf\",\"file-0\":\"5db29dff23743\",\"_sipForTypo3Vars\":\"5db29df5db971\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db29df503b45\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,0,3,'8fbad8d7d0c2e37101f6aab8224aeb30','2019-10-25 07:02:25'),(941,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"5saYEmdtn2PosT988CIaSGe3Zk0eUbYM\",\"number-0\":\"1280406938\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option c\",\"dynamicUpdate-0\":\"9QO8dzryVt2CF2riulwikird3UB52dzK\",\"pill_text-0\":\"\",\"file-0\":\"5db29e0924872\",\"_sipForTypo3Vars\":\"5db29df5db971\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db29df503b45\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,0,3,'8fbad8d7d0c2e37101f6aab8224aeb30','2019-10-25 07:02:35'),(942,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"0LvTLjtP4hZ1HliBqNpi9p6QE9L2xThL\",\"number-0\":\"387180654\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"dynamicUpdate-0\":\"\",\"pill_text-0\":\"\",\"file-0\":\"5db29e0d00078\",\"_sipForTypo3Vars\":\"5db29df5db971\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db29df503b45\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,0,3,'8fbad8d7d0c2e37101f6aab8224aeb30','2019-10-25 07:02:39'),(943,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"rryGcGEuxUWXMPD9vIqrQ8VeG0Iv4l2x\",\"number-0\":\"395277637\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"dynamicUpdate-0\":\"\",\"pill_text-0\":\"\",\"file-0\":\"5db29e108cfd4\",\"_sipForTypo3Vars\":\"5db29df5db971\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db29df503b45\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,0,3,'8fbad8d7d0c2e37101f6aab8224aeb30','2019-10-25 07:02:44'),(944,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"4pOh6CsyA50C7lyuPiJsEey225TBk88j\",\"number-0\":\"787036123\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"dynamicUpdate-0\":\"\",\"pill_text-0\":\"\",\"file-0\":\"5db29e1a7ced6\",\"_sipForTypo3Vars\":\"5db29e19a7e8a\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db29e18b787f\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,0,3,'cd0038ff3e9955964ee237602669c1f9','2019-10-25 07:02:52'),(945,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"CkR8mNQr1vuUbSeXfGnb2mGFAE9dZnUB\",\"number-0\":\"1838447284\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"dynamicUpdate-0\":\"\",\"pill_text-0\":\"\",\"file-0\":\"5db29e1dd0c64\",\"_sipForTypo3Vars\":\"5db29e19a7e8a\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db29e18b787f\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,0,3,'cd0038ff3e9955964ee237602669c1f9','2019-10-25 07:02:55'),(946,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"f8e88532d11fa980757471652b43dd41\",\"_h_checkbox-699\":\"\",\"text-699\":\"PHQYR9OJRqtvQSCAaidDfuOQKzfxCwv3\",\"number-699\":\"1972375389\",\"date-699\":\"01.01.2188\",\"datetime-699\":\"02.02.2188 01:08\",\"decimal-699\":\"12.84\",\"enum-699\":\"first option\",\"radio-699\":\"option a\",\"dynamicUpdate-699\":\"\",\"pill_text-699\":\"\",\"file-699\":\"5db29e20b2121\",\"_sipForTypo3Vars\":\"5db29e20b222d\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"699\",\"s\":\"5db29e1fd2e48\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=699\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,699,1,'cd0038ff3e9955964ee237602669c1f9','2019-10-25 07:02:58'),(947,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"60iNpIOr8QfY9pjxofeOpN5SHgTMOAmY\",\"number-0\":\"2146860964\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"dynamicUpdate-0\":\"\",\"pill_text-0\":\"uFtM4S4tyw7zx3AE69aLbITYBsLJ6Wee\",\"file-0\":\"5db29e232935d\",\"_sipForTypo3Vars\":\"5db29e19a7e8a\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db29e18b787f\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,0,3,'cd0038ff3e9955964ee237602669c1f9','2019-10-25 07:03:01'),(948,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"uw5w0V3X9Wxb8L3UT1wYpb5QOXWjlDpf\",\"number-0\":\"1207480680\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"dynamicUpdate-0\":\"\",\"pill_text-0\":\"\",\"file-0\":\"5db29e2b27de5\",\"_sipForTypo3Vars\":\"5db29e2a52141\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db29e2981d14\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,0,3,'a4b7f588333ffcaa9901c22410ac32d9','2019-10-25 07:03:09'),(949,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"UalZitmdRcInNnFSjHpkWLmdqHpLSoNr\",\"number-0\":\"1100337083\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"dynamicUpdate-0\":\"\",\"pill_text-0\":\"\",\"file-0\":\"5db29e2e68746\",\"_sipForTypo3Vars\":\"5db29e2a52141\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db29e2981d14\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,0,3,'a4b7f588333ffcaa9901c22410ac32d9','2019-10-25 07:03:12'),(950,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"141f66567541ba64c5f6547132314aa1\",\"_h_checkbox-702\":\"\",\"text-702\":\"qGaVSLQuPFP3ddnHSLUAjl9JGoe7U0Af\",\"number-702\":\"72932963\",\"date-702\":\"01.01.2188\",\"datetime-702\":\"02.02.2188 01:08\",\"decimal-702\":\"12.84\",\"enum-702\":\"first option\",\"radio-702\":\"option a\",\"dynamicUpdate-702\":\"\",\"pill_text-702\":\"\",\"file-702\":\"5db29e312d98f\",\"_sipForTypo3Vars\":\"5db29e312da80\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"702\",\"s\":\"5db29e304d958\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=702\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,702,1,'a4b7f588333ffcaa9901c22410ac32d9','2019-10-25 07:03:14'),(951,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"rbCcmmaOYkyU6PtBI4wgSMM3aEmfnFI2\",\"number-0\":\"1664500610\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"dynamicUpdate-0\":\"\",\"pill_text-0\":\"AYWrdcQuHuqM93KSrr7diLxsS3oAeNc5\",\"file-0\":\"5db29e338c7d1\",\"_sipForTypo3Vars\":\"5db29e2a52141\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db29e2981d14\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,0,3,'a4b7f588333ffcaa9901c22410ac32d9','2019-10-25 07:03:18'),(952,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"bYQOYsHu4ZnoCiz1boy1VSfA2NqMFpPs\",\"number-0\":\"266600724\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option c\",\"dynamicUpdate-0\":\"iLd04fHrgjeUQBLFnp5dWMlMY7cD0F4i\",\"pill_text-0\":\"\",\"file-0\":\"5db29e3d94846\",\"_sipForTypo3Vars\":\"5db29e2a52141\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db29e2981d14\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,0,3,'a4b7f588333ffcaa9901c22410ac32d9','2019-10-25 07:03:28'),(953,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"78ANQh4Sqhomw60cDBtMb0SwXuxqOzrS\",\"number-0\":\"1167246714\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"dynamicUpdate-0\":\"\",\"pill_text-0\":\"\",\"file-0\":\"5db29e41770dd\",\"_sipForTypo3Vars\":\"5db29e2a52141\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db29e2981d14\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,0,3,'a4b7f588333ffcaa9901c22410ac32d9','2019-10-25 07:03:31'),(954,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"hRUmiKuVYJp8YUWzQMczXs4kpQUUkEJn\",\"number-0\":\"2021402283\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"dynamicUpdate-0\":\"\",\"pill_text-0\":\"\",\"file-0\":\"5db29e451be8c\",\"_sipForTypo3Vars\":\"5db29e2a52141\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db29e2981d14\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,0,3,'a4b7f588333ffcaa9901c22410ac32d9','2019-10-25 07:03:37'),(955,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"xuLHuWXCDhv0dAnKCnT8bw1cCiLf175r\",\"number-0\":\"817314115\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"dynamicUpdate-0\":\"\",\"pill_text-0\":\"\",\"file-0\":\"5db29e4a9f757\",\"_sipForTypo3Vars\":\"5db29e2a52141\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db29e2981d14\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,0,3,'a4b7f588333ffcaa9901c22410ac32d9','2019-10-25 07:03:42'),(956,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"liKmqVlLh85LTx2iXNSoNOKJzuZRNICW\",\"number-0\":\"111075528\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"dynamicUpdate-0\":\"\",\"pill_text-0\":\"\",\"file-0\":\"5db29f76da241\",\"_sipForTypo3Vars\":\"5db29f76055c3\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db29f75281f4\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,0,3,'e3d936af6c885a792b9074d5eee873cc','2019-10-25 07:08:40'),(957,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"WpXdXjIfnvwRmSAiRYbdy06QVdIVvf7N\",\"number-0\":\"789201305\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"dynamicUpdate-0\":\"\",\"pill_text-0\":\"\",\"file-0\":\"5db29f7a3a987\",\"_sipForTypo3Vars\":\"5db29f76055c3\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db29f75281f4\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,0,3,'e3d936af6c885a792b9074d5eee873cc','2019-10-25 07:08:44'),(958,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"6c51eb278d2d863fb0a254d17a330bea\",\"_h_checkbox-709\":\"\",\"text-709\":\"SBI6BsScZAep6mn30V3Y5e8vdVGxZCT8\",\"number-709\":\"1847125931\",\"date-709\":\"01.01.2188\",\"datetime-709\":\"02.02.2188 01:08\",\"decimal-709\":\"12.84\",\"enum-709\":\"first option\",\"radio-709\":\"option a\",\"dynamicUpdate-709\":\"\",\"pill_text-709\":\"\",\"file-709\":\"5db29f7ce10e8\",\"_sipForTypo3Vars\":\"5db29f7ce11fc\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"709\",\"s\":\"5db29f7c145bc\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=709\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,709,1,'e3d936af6c885a792b9074d5eee873cc','2019-10-25 07:08:46'),(959,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"AXTJBHGrLox0ygkXagkFJV3taAQXdSMl\",\"number-0\":\"100902872\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"dynamicUpdate-0\":\"\",\"pill_text-0\":\"Z3aDOBdXQ4s2ipspXd9VZ1vVzHH3xp0S\",\"file-0\":\"5db29f7f4902d\",\"_sipForTypo3Vars\":\"5db29f76055c3\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db29f75281f4\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,0,3,'e3d936af6c885a792b9074d5eee873cc','2019-10-25 07:08:49'),(960,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"rgKeXToDakRMTaxMWo1zpp4NiT02RMHn\",\"number-0\":\"1207456232\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"dynamicUpdate-0\":\"\",\"pill_text-0\":\"\",\"file-0\":\"5db29fc1bb362\",\"_sipForTypo3Vars\":\"5db29fc0e603a\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db29fc0110bc\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,0,3,'1ddfe56f2eefd4dfeb05f271597849e9','2019-10-25 07:09:55'),(961,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"H2xqUT095AsG8C5OzDrM3WNZEU5sOfE4\",\"number-0\":\"2092031289\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"dynamicUpdate-0\":\"\",\"pill_text-0\":\"\",\"file-0\":\"5db29fc53b6e6\",\"_sipForTypo3Vars\":\"5db29fc0e603a\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db29fc0110bc\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,0,3,'1ddfe56f2eefd4dfeb05f271597849e9','2019-10-25 07:09:59'),(962,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"8d81df25314ebf7b9071de55d00e233f\",\"_h_checkbox-712\":\"\",\"text-712\":\"6W8fKeUybJXEIMv2vAfARjACepbV7HWS\",\"number-712\":\"1268566742\",\"date-712\":\"01.01.2188\",\"datetime-712\":\"02.02.2188 01:08\",\"decimal-712\":\"12.84\",\"enum-712\":\"first option\",\"radio-712\":\"option a\",\"dynamicUpdate-712\":\"\",\"pill_text-712\":\"\",\"file-712\":\"5db29fc7e6fac\",\"_sipForTypo3Vars\":\"5db29fc7e7073\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"712\",\"s\":\"5db29fc720948\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=712\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,712,1,'1ddfe56f2eefd4dfeb05f271597849e9','2019-10-25 07:10:01'),(963,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"UE5TbVS5rvQx7xMuWWLi9mzkNbHM4FFU\",\"number-0\":\"667661679\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"dynamicUpdate-0\":\"\",\"pill_text-0\":\"Lo6pAUUvptcqcWJJlc2GTaiiD6okqXDi\",\"file-0\":\"5db29fca713f0\",\"_sipForTypo3Vars\":\"5db29fc0e603a\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db29fc0110bc\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,0,3,'1ddfe56f2eefd4dfeb05f271597849e9','2019-10-25 07:10:05'),(964,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"9kcLF531IIN56S04xJTXFPGMqcZccn4c\",\"number-0\":\"2119457514\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option c\",\"dynamicUpdate-0\":\"fnQbRGtNB7cPM8etOTYTCJnThvTcebMD\",\"pill_text-0\":\"\",\"file-0\":\"5db29fd47be18\",\"_sipForTypo3Vars\":\"5db29fc0e603a\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db29fc0110bc\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,0,3,'1ddfe56f2eefd4dfeb05f271597849e9','2019-10-25 07:10:15'),(965,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"EyqtrnnR0HTduwq2dltRqzAXUQJX6yWv\",\"number-0\":\"1942459107\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"dynamicUpdate-0\":\"\",\"pill_text-0\":\"\",\"file-0\":\"5db29fd8bfa00\",\"_sipForTypo3Vars\":\"5db29fc0e603a\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db29fc0110bc\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,0,3,'1ddfe56f2eefd4dfeb05f271597849e9','2019-10-25 07:10:19'),(966,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"MaOTPwL2DZMoUOQZc0MKmvcB3J2sbhSA\",\"number-0\":\"1538120455\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"dynamicUpdate-0\":\"\",\"pill_text-0\":\"\",\"file-0\":\"5db29fdcbb14f\",\"_sipForTypo3Vars\":\"5db29fc0e603a\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db29fc0110bc\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,0,3,'1ddfe56f2eefd4dfeb05f271597849e9','2019-10-25 07:10:25'),(967,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"6h7LNjNnkuuSMU03ADk0gZe7FV4SS7eI\",\"number-0\":\"441124972\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"dynamicUpdate-0\":\"\",\"pill_text-0\":\"\",\"file-0\":\"5db29fe27d895\",\"_sipForTypo3Vars\":\"5db29fc0e603a\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db29fc0110bc\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,0,3,'1ddfe56f2eefd4dfeb05f271597849e9','2019-10-25 07:10:30'),(968,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"qybtRSNr2t6etEnfysPYrDBYw4wK3jJC\",\"number-0\":\"170379910\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"dynamicUpdate-0\":\"\",\"pill_text-0\":\"\",\"file-0\":\"5db2a0e41a094\",\"_sipForTypo3Vars\":\"5db2a0e33bb68\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db2a0e255cd4\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,0,3,'1ce9843b13c1767be0106f91a2028aaf','2019-10-25 07:14:46'),(969,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"evFAU3apitU4WN9IWX89bVh6VzVQ5JDp\",\"number-0\":\"604602408\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"dynamicUpdate-0\":\"\",\"pill_text-0\":\"\",\"file-0\":\"5db2a0e796535\",\"_sipForTypo3Vars\":\"5db2a0e33bb68\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db2a0e255cd4\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,0,3,'1ce9843b13c1767be0106f91a2028aaf','2019-10-25 07:14:49'),(970,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"ad7107d350290382c117685f704e6651\",\"_h_checkbox-719\":\"\",\"text-719\":\"bJjyGesszYwUb2mq501L9ZFL5geSIO5S\",\"number-719\":\"454278257\",\"date-719\":\"01.01.2188\",\"datetime-719\":\"02.02.2188 01:08\",\"decimal-719\":\"12.84\",\"enum-719\":\"first option\",\"radio-719\":\"option a\",\"dynamicUpdate-719\":\"\",\"pill_text-719\":\"\",\"file-719\":\"5db2a0ea46fb4\",\"_sipForTypo3Vars\":\"5db2a0ea47086\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"719\",\"s\":\"5db2a0e96a454\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=719\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,719,1,'1ce9843b13c1767be0106f91a2028aaf','2019-10-25 07:14:51'),(971,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"vztI6Xnz8FocDQKFkswHlburLEUyb0nV\",\"number-0\":\"1039591248\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"dynamicUpdate-0\":\"\",\"pill_text-0\":\"hylng3B9U9VLe7WNfKLEZn2upPGST7tF\",\"file-0\":\"5db2a0ecb88c8\",\"_sipForTypo3Vars\":\"5db2a0e33bb68\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db2a0e255cd4\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,0,3,'1ce9843b13c1767be0106f91a2028aaf','2019-10-25 07:14:55'),(972,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"mrUziKpwS0mTwjO3qYOChdtu3SO1Awcj\",\"number-0\":\"480020667\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"dynamicUpdate-0\":\"\",\"pill_text-0\":\"\",\"file-0\":\"5db2a10d77e0f\",\"_sipForTypo3Vars\":\"5db2a10ca3c2b\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db2a10bc3fc6\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,0,3,'2fcdaac64da0ef38978134b8041b7774','2019-10-25 07:15:27'),(973,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"rMncOXKCHIDzY6rMUnS01QgofsDPy8ey\",\"number-0\":\"941585886\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"dynamicUpdate-0\":\"\",\"pill_text-0\":\"\",\"file-0\":\"5db2a110cf54f\",\"_sipForTypo3Vars\":\"5db2a10ca3c2b\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db2a10bc3fc6\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,0,3,'2fcdaac64da0ef38978134b8041b7774','2019-10-25 07:15:30'),(974,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"5cfe86a23aac2ea393b96bd1e9a6ef27\",\"_h_checkbox-722\":\"\",\"text-722\":\"qOkMQCALqahlOAFFFGLIzQQk4ykmCIVH\",\"number-722\":\"1603988272\",\"date-722\":\"01.01.2188\",\"datetime-722\":\"02.02.2188 01:08\",\"decimal-722\":\"12.84\",\"enum-722\":\"first option\",\"radio-722\":\"option a\",\"dynamicUpdate-722\":\"\",\"pill_text-722\":\"\",\"file-722\":\"5db2a1137ca83\",\"_sipForTypo3Vars\":\"5db2a1137cb47\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"722\",\"s\":\"5db2a112b9299\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=722\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,722,1,'2fcdaac64da0ef38978134b8041b7774','2019-10-25 07:15:32'),(975,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"IAxlpbcXYdNiB12llpFsFReujZHsKh50\",\"number-0\":\"314715709\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"dynamicUpdate-0\":\"\",\"pill_text-0\":\"qJL4JucNaUe3zvXpSZNA11IaipX35sLY\",\"file-0\":\"5db2a115f34e7\",\"_sipForTypo3Vars\":\"5db2a10ca3c2b\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db2a10bc3fc6\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,0,3,'2fcdaac64da0ef38978134b8041b7774','2019-10-25 07:15:36'),(976,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"o1lHiTOMZl2gHvbMoeajMUGzQOYnqB5c\",\"number-0\":\"1721178356\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option c\",\"dynamicUpdate-0\":\"wuuEhu9RNHI7ZyC9qwqNz6DOIE1xwy9E\",\"pill_text-0\":\"\",\"file-0\":\"5db2a11fe9406\",\"_sipForTypo3Vars\":\"5db2a10ca3c2b\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db2a10bc3fc6\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,0,3,'2fcdaac64da0ef38978134b8041b7774','2019-10-25 07:15:46'),(977,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"mbbCXgUBh7kdxL506W7n8l3zrXdDM1Qo\",\"number-0\":\"131929108\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"dynamicUpdate-0\":\"\",\"pill_text-0\":\"\",\"file-0\":\"5db2a123d411c\",\"_sipForTypo3Vars\":\"5db2a10ca3c2b\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db2a10bc3fc6\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,0,3,'2fcdaac64da0ef38978134b8041b7774','2019-10-25 07:15:49'),(978,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"KZSg1042Sr5e6w987b9p832BH67ZmhRl\",\"number-0\":\"6362911\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"dynamicUpdate-0\":\"\",\"pill_text-0\":\"\",\"file-0\":\"5db2a1276dea1\",\"_sipForTypo3Vars\":\"5db2a10ca3c2b\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db2a10bc3fc6\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,0,3,'2fcdaac64da0ef38978134b8041b7774','2019-10-25 07:15:55'),(979,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"PyWYP1JoMqLl1BwWV61fmZvkXybSCRuT\",\"number-0\":\"105988934\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"dynamicUpdate-0\":\"\",\"pill_text-0\":\"\",\"file-0\":\"5db2a12d05be9\",\"_sipForTypo3Vars\":\"5db2a10ca3c2b\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db2a10bc3fc6\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,0,3,'2fcdaac64da0ef38978134b8041b7774','2019-10-25 07:16:01'),(980,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"9cYPQINloWSzcNIK2q6Kn4B1I2HnRaqS\",\"number-0\":\"14419128\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"dynamicUpdate-0\":\"\",\"pill_text-0\":\"\",\"file-0\":\"5db2a18c49ade\",\"_sipForTypo3Vars\":\"5db2a18b6749a\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db2a18a75fe1\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,0,3,'14de7d2d98dc4d47e6fc1ea8f80cc16e','2019-10-25 07:17:34'),(981,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"4tsdRlyEsdJyERTCgOMdTLbgF3m0i6mh\",\"number-0\":\"106471228\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"dynamicUpdate-0\":\"\",\"pill_text-0\":\"\",\"file-0\":\"5db2a18fd9fc1\",\"_sipForTypo3Vars\":\"5db2a18b6749a\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db2a18a75fe1\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,0,3,'14de7d2d98dc4d47e6fc1ea8f80cc16e','2019-10-25 07:17:37'),(982,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"f44019261dc873686d9003a46937d043\",\"_h_checkbox-729\":\"\",\"text-729\":\"NGHTN0EcXeeaS3fzI0LNGvfxUbBFbaaa\",\"number-729\":\"84130561\",\"date-729\":\"01.01.2188\",\"datetime-729\":\"02.02.2188 01:08\",\"decimal-729\":\"12.84\",\"enum-729\":\"first option\",\"radio-729\":\"option a\",\"dynamicUpdate-729\":\"\",\"pill_text-729\":\"\",\"file-729\":\"5db2a192858de\",\"_sipForTypo3Vars\":\"5db2a192859b7\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"729\",\"s\":\"5db2a191a7a17\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=729\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,729,1,'14de7d2d98dc4d47e6fc1ea8f80cc16e','2019-10-25 07:17:39'),(983,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"zK3BIybN7BdYg6ejJBHl4IhO3addrYds\",\"number-0\":\"1543796408\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"dynamicUpdate-0\":\"\",\"pill_text-0\":\"Fwzb4TxtSvBtfGvlzZ6SDVa9hbHrccNs\",\"file-0\":\"5db2a1950039b\",\"_sipForTypo3Vars\":\"5db2a18b6749a\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db2a18a75fe1\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,0,3,'14de7d2d98dc4d47e6fc1ea8f80cc16e','2019-10-25 07:17:43'),(984,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"pIEArtzWDzxtjNjDDqDhCpx99AtmEcEw\",\"number-0\":\"1635809771\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option c\",\"dynamicUpdate-0\":\"IZzl1TjmKtdNRdpuNd7bWcg7xualoose\",\"pill_text-0\":\"\",\"file-0\":\"5db2a19ea75c5\",\"_sipForTypo3Vars\":\"5db2a18b6749a\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db2a18a75fe1\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,0,3,'14de7d2d98dc4d47e6fc1ea8f80cc16e','2019-10-25 07:17:53'),(985,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"Z01E0TpxhrPL6cgfsIrarPvIzU9t6n6j\",\"number-0\":\"322985479\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"dynamicUpdate-0\":\"\",\"pill_text-0\":\"\",\"file-0\":\"5db2a1a2a96a4\",\"_sipForTypo3Vars\":\"5db2a18b6749a\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db2a18a75fe1\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,0,3,'14de7d2d98dc4d47e6fc1ea8f80cc16e','2019-10-25 07:17:56'),(986,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"kmvdXonzt7k0uiUmeL0aXUF4v9MUWpM6\",\"number-0\":\"1742836774\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"dynamicUpdate-0\":\"\",\"pill_text-0\":\"\",\"file-0\":\"5db2a1a6578c0\",\"_sipForTypo3Vars\":\"5db2a18b6749a\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db2a18a75fe1\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,0,3,'14de7d2d98dc4d47e6fc1ea8f80cc16e','2019-10-25 07:18:02'),(987,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"NSjRakbCPcePNVGze6OUvpmUl3V1CpVb\",\"number-0\":\"1484686962\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"dynamicUpdate-0\":\"\",\"pill_text-0\":\"\",\"file-0\":\"5db2a1ac20e7d\",\"_sipForTypo3Vars\":\"5db2a18b6749a\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db2a18a75fe1\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,0,3,'14de7d2d98dc4d47e6fc1ea8f80cc16e','2019-10-25 07:18:08'),(988,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"5HMca4mpmyTJEYgy6aDhZNd5IptIYJzk\",\"number-0\":\"1655887268\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"dynamicUpdate-0\":\"\",\"pill_text-0\":\"\",\"file-0\":\"5db2a1e6892d0\",\"_sipForTypo3Vars\":\"5db2a1e58c858\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db2a1e49e1c5\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,0,3,'31a979fc7a38341a0b8958b85c766f00','2019-10-25 07:19:04'),(989,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"Nss3bvV9IoxNZHPoMJ7McpQ4QDbR3TIw\",\"number-0\":\"421594291\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"dynamicUpdate-0\":\"\",\"pill_text-0\":\"\",\"file-0\":\"5db2a1e9f350b\",\"_sipForTypo3Vars\":\"5db2a1e58c858\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db2a1e49e1c5\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,0,3,'31a979fc7a38341a0b8958b85c766f00','2019-10-25 07:19:07'),(990,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"72d9312ec4b726c382d297cbb976480f\",\"_h_checkbox-736\":\"\",\"text-736\":\"HHHsg6d9cRet9DbCHEpkOYLYmlYs2ESt\",\"number-736\":\"639656567\",\"date-736\":\"01.01.2188\",\"datetime-736\":\"02.02.2188 01:08\",\"decimal-736\":\"12.84\",\"enum-736\":\"first option\",\"radio-736\":\"option a\",\"dynamicUpdate-736\":\"\",\"pill_text-736\":\"\",\"file-736\":\"5db2a1eca8903\",\"_sipForTypo3Vars\":\"5db2a1eca89cb\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"736\",\"s\":\"5db2a1ebd3229\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=736\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,736,1,'31a979fc7a38341a0b8958b85c766f00','2019-10-25 07:19:09'),(991,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"KjDb5TIOJm2AfmehQQNC4P4h4mN8HDkH\",\"number-0\":\"1320970176\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"dynamicUpdate-0\":\"\",\"pill_text-0\":\"YLfvyhLhfWsP2W5PgfzzGKppEQdFTNVx\",\"file-0\":\"5db2a1ef2ed2f\",\"_sipForTypo3Vars\":\"5db2a1e58c858\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db2a1e49e1c5\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,0,3,'31a979fc7a38341a0b8958b85c766f00','2019-10-25 07:19:13'),(992,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"nITZkybOlArdq0w6K9tmFM940hx1GCVF\",\"number-0\":\"1722426851\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option c\",\"dynamicUpdate-0\":\"iPtYBB87BBuTjcKB1hX3K7C0h490psMg\",\"pill_text-0\":\"\",\"file-0\":\"5db2a1f9203b6\",\"_sipForTypo3Vars\":\"5db2a1e58c858\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db2a1e49e1c5\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,0,3,'31a979fc7a38341a0b8958b85c766f00','2019-10-25 07:19:23'),(993,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"vbmhQuOnIB564SN05vQGkedndiUehPmw\",\"number-0\":\"2109466998\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"dynamicUpdate-0\":\"\",\"pill_text-0\":\"\",\"file-0\":\"5db2a1fd2d548\",\"_sipForTypo3Vars\":\"5db2a1e58c858\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db2a1e49e1c5\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,0,3,'31a979fc7a38341a0b8958b85c766f00','2019-10-25 07:19:27'),(994,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"rD4qHe6QRh7YRzprqLgmnQUOkcpW5Uw2\",\"number-0\":\"1836873692\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"dynamicUpdate-0\":\"\",\"pill_text-0\":\"\",\"file-0\":\"5db2a200c00cc\",\"_sipForTypo3Vars\":\"5db2a1e58c858\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db2a1e49e1c5\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,0,3,'31a979fc7a38341a0b8958b85c766f00','2019-10-25 07:19:32'),(995,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"LCQbn6927USgssnFosQwKfqNMPLQgkSR\",\"number-0\":\"2042033516\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"dynamicUpdate-0\":\"\",\"pill_text-0\":\"\",\"file-0\":\"5db2a20656d9c\",\"_sipForTypo3Vars\":\"5db2a1e58c858\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db2a1e49e1c5\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,0,3,'31a979fc7a38341a0b8958b85c766f00','2019-10-25 07:19:38'),(996,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"ITEqsQdZjZ6UyUVUIiokKj3XCEBfkf7U\",\"number-0\":\"1717100153\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"dynamicUpdate-0\":\"\",\"pill_text-0\":\"\",\"file-0\":\"5db2a29524862\",\"_sipForTypo3Vars\":\"5db2a2944e5a9\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db2a29370729\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,0,3,'9a95f59241b61881419d08010b2ff530','2019-10-25 07:21:59'),(997,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"DBjEQxd39VNK7XdMzdNTIWFivvBNIG0U\",\"number-0\":\"1448869347\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"dynamicUpdate-0\":\"\",\"pill_text-0\":\"\",\"file-0\":\"5db2a2988cb6f\",\"_sipForTypo3Vars\":\"5db2a2944e5a9\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db2a29370729\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,0,3,'9a95f59241b61881419d08010b2ff530','2019-10-25 07:22:02'),(998,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d3fc5b896c131d17ec6b685078599850\",\"_h_checkbox-743\":\"\",\"text-743\":\"gm7lgEPaVbtpiiwkY0pxbvQiaS1Sfxoa\",\"number-743\":\"1020897634\",\"date-743\":\"01.01.2188\",\"datetime-743\":\"02.02.2188 01:08\",\"decimal-743\":\"12.84\",\"enum-743\":\"first option\",\"radio-743\":\"option a\",\"dynamicUpdate-743\":\"\",\"pill_text-743\":\"\",\"file-743\":\"5db2a29b73a88\",\"_sipForTypo3Vars\":\"5db2a29b73b70\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"743\",\"s\":\"5db2a29a97053\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=743\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,743,1,'9a95f59241b61881419d08010b2ff530','2019-10-25 07:22:04'),(999,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"8Plcg6ss1ow1f43HAJKhvCxa59gRFato\",\"number-0\":\"1711382032\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"dynamicUpdate-0\":\"\",\"pill_text-0\":\"CVL9BgiPpTuRMeF3bCzghdd8pOhBCKlY\",\"file-0\":\"5db2a29dd4183\",\"_sipForTypo3Vars\":\"5db2a2944e5a9\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db2a29370729\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,0,3,'9a95f59241b61881419d08010b2ff530','2019-10-25 07:22:08'),(1000,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"ocTmJb6exudYeGqm60LQS4w2UzOUlVCA\",\"number-0\":\"455024868\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option c\",\"dynamicUpdate-0\":\"ocT9cGKhDle14yHpXSggJ4SQk8HdHuzj\",\"pill_text-0\":\"\",\"file-0\":\"5db2a2a7d8e09\",\"_sipForTypo3Vars\":\"5db2a2944e5a9\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db2a29370729\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,0,3,'9a95f59241b61881419d08010b2ff530','2019-10-25 07:22:18'),(1001,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"7lhaEo5X0nmyfxBMJQ5FxVL2Wr4YnQKf\",\"number-0\":\"1373296845\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"dynamicUpdate-0\":\"\",\"pill_text-0\":\"\",\"file-0\":\"5db2a2abec936\",\"_sipForTypo3Vars\":\"5db2a2944e5a9\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db2a29370729\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,0,3,'9a95f59241b61881419d08010b2ff530','2019-10-25 07:22:22'),(1002,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"vJsy9ajeeNsAIdXtYkDL4tZfEOhK817B\",\"number-0\":\"1487268032\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"dynamicUpdate-0\":\"\",\"pill_text-0\":\"\",\"file-0\":\"5db2a2af91ddd\",\"_sipForTypo3Vars\":\"5db2a2944e5a9\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db2a29370729\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,0,3,'9a95f59241b61881419d08010b2ff530','2019-10-25 07:22:27'),(1003,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"UlkPrmyUD4mSDCLfCGi8ydQ3rVytz7K6\",\"number-0\":\"972447194\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"dynamicUpdate-0\":\"\",\"pill_text-0\":\"\",\"file-0\":\"5db2a2b54addb\",\"_sipForTypo3Vars\":\"5db2a2944e5a9\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db2a29370729\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,0,3,'9a95f59241b61881419d08010b2ff530','2019-10-25 07:22:33'),(1004,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"8sHamnnKB3uWrWlyDrktXNrWvIv1SCVs\",\"number-0\":\"1344123242\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"dynamicUpdate-0\":\"\",\"pill_text-0\":\"\",\"file-0\":\"5db2a2db431db\",\"_sipForTypo3Vars\":\"5db2a2da622f2\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db2a2d96319c\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,0,3,'4f9f92e26d21006ad6d22c9fed6a369b','2019-10-25 07:23:09'),(1005,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"CNH4V7oz3ZHlJCg1NAbTAwNuI6nh1ASN\",\"number-0\":\"779737746\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"dynamicUpdate-0\":\"\",\"pill_text-0\":\"\",\"file-0\":\"5db2a2dea8e4b\",\"_sipForTypo3Vars\":\"5db2a2da622f2\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db2a2d96319c\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,0,3,'4f9f92e26d21006ad6d22c9fed6a369b','2019-10-25 07:23:12'),(1006,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"fb078cd143a971a6a0f2ad7e4db6a96f\",\"_h_checkbox-750\":\"\",\"text-750\":\"3q8LnKF4LNEttMVLnWuCMEWbMmkYotDP\",\"number-750\":\"1907984758\",\"date-750\":\"01.01.2188\",\"datetime-750\":\"02.02.2188 01:08\",\"decimal-750\":\"12.84\",\"enum-750\":\"first option\",\"radio-750\":\"option a\",\"dynamicUpdate-750\":\"\",\"pill_text-750\":\"\",\"file-750\":\"5db2a2e170e3a\",\"_sipForTypo3Vars\":\"5db2a2e170f3d\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"750\",\"s\":\"5db2a2e094bef\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=750\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,750,1,'4f9f92e26d21006ad6d22c9fed6a369b','2019-10-25 07:23:14'),(1007,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"jybnyijINyo09gICEH1AyU565esIuVWr\",\"number-0\":\"151988418\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"dynamicUpdate-0\":\"\",\"pill_text-0\":\"lXUzhsma3akCvJ30uU9u6GWr5yjEaETW\",\"file-0\":\"5db2a2e3ec2de\",\"_sipForTypo3Vars\":\"5db2a2da622f2\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db2a2d96319c\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,0,3,'4f9f92e26d21006ad6d22c9fed6a369b','2019-10-25 07:23:18'),(1008,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"LwgLkxilMghR8OFjVV8QZHoiRF948Kvz\",\"number-0\":\"839375246\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option c\",\"dynamicUpdate-0\":\"RtUquEOW4gtG8zKxxn8DtQxLhyTl02h9\",\"pill_text-0\":\"\",\"file-0\":\"5db2a2edcf785\",\"_sipForTypo3Vars\":\"5db2a2da622f2\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db2a2d96319c\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,0,3,'4f9f92e26d21006ad6d22c9fed6a369b','2019-10-25 07:23:28'),(1009,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"CuUG9VeJ1wfgnDpzsIrp7Wt62biVgEnf\",\"number-0\":\"321903232\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"dynamicUpdate-0\":\"\",\"pill_text-0\":\"\",\"file-0\":\"5db2a2f1c15ab\",\"_sipForTypo3Vars\":\"5db2a2da622f2\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db2a2d96319c\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,0,3,'4f9f92e26d21006ad6d22c9fed6a369b','2019-10-25 07:23:31'),(1010,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"lhBc5eGVVHjhDx2hGgCmNGwPg6lNHYx5\",\"number-0\":\"281772135\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"dynamicUpdate-0\":\"\",\"pill_text-0\":\"\",\"file-0\":\"5db2a2f55f890\",\"_sipForTypo3Vars\":\"5db2a2da622f2\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db2a2d96319c\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,0,3,'4f9f92e26d21006ad6d22c9fed6a369b','2019-10-25 07:23:37'),(1011,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"A324QWEexNgZcpQ480aBLmRD1j5L2npL\",\"number-0\":\"1019731987\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"dynamicUpdate-0\":\"\",\"pill_text-0\":\"\",\"file-0\":\"5db2a2fae6949\",\"_sipForTypo3Vars\":\"5db2a2da622f2\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db2a2d96319c\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,0,3,'4f9f92e26d21006ad6d22c9fed6a369b','2019-10-25 07:23:43'),(1012,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"NiX7IZmuG0sOCyII2qHKsMK6jvMNyF8b\",\"number-0\":\"1362201327\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"dynamicUpdate-0\":\"\",\"pill_text-0\":\"\",\"file-0\":\"5db2a370a1d9c\",\"_sipForTypo3Vars\":\"5db2a36fa6bfa\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db2a36ebac5a\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,0,3,'e4527429f9ad7c0c29f9ae460a839f8f','2019-10-25 07:25:38'),(1013,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"IfE5Ow2PCo4EpQLwZDzKi54gabEr0bKK\",\"number-0\":\"1417360368\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"dynamicUpdate-0\":\"\",\"pill_text-0\":\"\",\"file-0\":\"5db2a37459f82\",\"_sipForTypo3Vars\":\"5db2a36fa6bfa\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db2a36ebac5a\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,0,3,'e4527429f9ad7c0c29f9ae460a839f8f','2019-10-25 07:25:42'),(1014,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"f510022659eb3c03e21e3c6231a1fab7\",\"_h_checkbox-757\":\"\",\"text-757\":\"NNUgceGa24Ss3BbSDIO9wntyBusLzsKc\",\"number-757\":\"547493520\",\"date-757\":\"01.01.2188\",\"datetime-757\":\"02.02.2188 01:08\",\"decimal-757\":\"12.84\",\"enum-757\":\"first option\",\"radio-757\":\"option a\",\"dynamicUpdate-757\":\"\",\"pill_text-757\":\"\",\"file-757\":\"5db2a3770d910\",\"_sipForTypo3Vars\":\"5db2a3770d9df\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"757\",\"s\":\"5db2a37647821\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=757\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,757,1,'e4527429f9ad7c0c29f9ae460a839f8f','2019-10-25 07:25:44'),(1015,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"NNdjrYZBpoHalJBDnm8o8Jb0Vu1J0bIm\",\"number-0\":\"1641555663\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"dynamicUpdate-0\":\"\",\"pill_text-0\":\"QdHzkTZsOmxQ24ehaxKloKfYUjvgZlRw\",\"file-0\":\"5db2a3796a7ab\",\"_sipForTypo3Vars\":\"5db2a36fa6bfa\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db2a36ebac5a\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,0,3,'e4527429f9ad7c0c29f9ae460a839f8f','2019-10-25 07:25:47'),(1016,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"bWF3rXbYQQCrv5euL1LfkBAC3HmoM0hJ\",\"number-0\":\"1374509106\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option c\",\"dynamicUpdate-0\":\"ENJOXmMIbymHr6K47r9nvAIVScJsadk4\",\"pill_text-0\":\"\",\"file-0\":\"5db2a383468d6\",\"_sipForTypo3Vars\":\"5db2a36fa6bfa\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db2a36ebac5a\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,0,3,'e4527429f9ad7c0c29f9ae460a839f8f','2019-10-25 07:25:57'),(1017,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"yGfrGuorHlDvYcyARNIMD6GQ3DQb4qOp\",\"number-0\":\"606927683\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"dynamicUpdate-0\":\"\",\"pill_text-0\":\"\",\"file-0\":\"5db2a387266fb\",\"_sipForTypo3Vars\":\"5db2a36fa6bfa\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db2a36ebac5a\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,0,3,'e4527429f9ad7c0c29f9ae460a839f8f','2019-10-25 07:26:01'),(1018,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"I2kRGO3LjtTij9feJ8kkT1oAR8gaOsVD\",\"number-0\":\"917992678\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"dynamicUpdate-0\":\"\",\"pill_text-0\":\"\",\"file-0\":\"5db2a38ab3868\",\"_sipForTypo3Vars\":\"5db2a36fa6bfa\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db2a36ebac5a\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,0,3,'e4527429f9ad7c0c29f9ae460a839f8f','2019-10-25 07:26:06'),(1019,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"VDMt1wecsqYLT2ooifJfIQA5jnTjN0Tl\",\"number-0\":\"1604743868\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"dynamicUpdate-0\":\"\",\"pill_text-0\":\"\",\"file-0\":\"5db2a39061a6b\",\"_sipForTypo3Vars\":\"5db2a36fa6bfa\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db2a36ebac5a\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,0,3,'e4527429f9ad7c0c29f9ae460a839f8f','2019-10-25 07:26:12'),(1020,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"ep8FBKIQ7JeSckLSgIt8NQzCOn4b0ATs\",\"number-0\":\"709442379\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"dynamicUpdate-0\":\"\",\"pill_text-0\":\"\",\"file-0\":\"5db2a3d40a598\",\"_sipForTypo3Vars\":\"5db2a3d334a60\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db2a3d239a40\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,0,3,'32018a19437ad4218f080821a492cb66','2019-10-25 07:27:18'),(1021,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"iF1Zf7GMAGBxgSurH7zRKd78PJ13ZgJu\",\"number-0\":\"734958249\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"dynamicUpdate-0\":\"\",\"pill_text-0\":\"\",\"file-0\":\"5db2a3d7965e7\",\"_sipForTypo3Vars\":\"5db2a3d334a60\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db2a3d239a40\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,0,3,'32018a19437ad4218f080821a492cb66','2019-10-25 07:27:21'),(1022,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"3e5b777bb6f6da6a306cea46f3ee41c0\",\"_h_checkbox-764\":\"\",\"text-764\":\"vA6AHVP7sra6CKdatt53w3Ojct9EvOuk\",\"number-764\":\"1441320064\",\"date-764\":\"01.01.2188\",\"datetime-764\":\"02.02.2188 01:08\",\"decimal-764\":\"12.84\",\"enum-764\":\"first option\",\"radio-764\":\"option a\",\"dynamicUpdate-764\":\"\",\"pill_text-764\":\"\",\"file-764\":\"5db2a3da89c34\",\"_sipForTypo3Vars\":\"5db2a3da89d20\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"764\",\"s\":\"5db2a3d9b3a86\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=764\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,764,1,'32018a19437ad4218f080821a492cb66','2019-10-25 07:27:23'),(1023,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"F8kAFnsEuHfvfuoxFWrxdeOc2GzyvmC8\",\"number-0\":\"1402526533\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"dynamicUpdate-0\":\"\",\"pill_text-0\":\"KusFrMf2obC8jqXtG3Ua31b0PIfj7Ns3\",\"file-0\":\"5db2a3dd1b3a4\",\"_sipForTypo3Vars\":\"5db2a3d334a60\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db2a3d239a40\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,0,3,'32018a19437ad4218f080821a492cb66','2019-10-25 07:27:27'),(1024,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"4YkIMcDKH2SwkbWQtkRW5MzwWF5CXvnf\",\"number-0\":\"1325556421\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option c\",\"dynamicUpdate-0\":\"RGJ9fTHwHZdXumSqC7uSAnJzC6r0JiVl\",\"pill_text-0\":\"\",\"file-0\":\"5db2a3e72ce02\",\"_sipForTypo3Vars\":\"5db2a3d334a60\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db2a3d239a40\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,0,3,'32018a19437ad4218f080821a492cb66','2019-10-25 07:27:37'),(1025,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"5rtPjdgrZ3izsCrwsrwdknDSuFYhb0ec\",\"number-0\":\"1843707151\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"dynamicUpdate-0\":\"\",\"pill_text-0\":\"\",\"file-0\":\"5db2a3eb35926\",\"_sipForTypo3Vars\":\"5db2a3d334a60\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db2a3d239a40\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,0,3,'32018a19437ad4218f080821a492cb66','2019-10-25 07:27:41'),(1026,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"FL8GcDdONmsjy5FZ1gDmTuFxQ58GmwEZ\",\"number-0\":\"860762140\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"dynamicUpdate-0\":\"\",\"pill_text-0\":\"\",\"file-0\":\"5db2a3eeef5ef\",\"_sipForTypo3Vars\":\"5db2a3d334a60\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db2a3d239a40\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,0,3,'32018a19437ad4218f080821a492cb66','2019-10-25 07:27:47'),(1027,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"mqt57nDT9np7zavTq76TVjRqeprOdB5O\",\"number-0\":\"1062816018\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"dynamicUpdate-0\":\"\",\"pill_text-0\":\"\",\"file-0\":\"5db2a3f4d3159\",\"_sipForTypo3Vars\":\"5db2a3d334a60\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db2a3d239a40\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,0,3,'32018a19437ad4218f080821a492cb66','2019-10-25 07:27:53'),(1028,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"Sk7V3gEMj7kus5BR8jPmi734xeptxlTk\",\"number-0\":\"772223411\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"dynamicUpdate-0\":\"\",\"pill_text-0\":\"\",\"file-0\":\"5db2a68e2f55e\",\"_sipForTypo3Vars\":\"5db2a68d45407\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db2a68c64915\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,0,3,'790a6675ac3587705c4082130c19f883','2019-10-25 07:38:56'),(1029,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"d2blA1pa1KMsJ1q1ams9I8Wo2adbo4P3\",\"number-0\":\"821089912\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"dynamicUpdate-0\":\"\",\"pill_text-0\":\"\",\"file-0\":\"5db2a691813dd\",\"_sipForTypo3Vars\":\"5db2a68d45407\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db2a68c64915\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,0,3,'790a6675ac3587705c4082130c19f883','2019-10-25 07:38:59'),(1030,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"e9674038f7cee8e9d8ab4aa5128626ca\",\"_h_checkbox-771\":\"\",\"text-771\":\"OrcVERgM7NaQ095434Zm724iL4vtPuGf\",\"number-771\":\"382269975\",\"date-771\":\"01.01.2188\",\"datetime-771\":\"02.02.2188 01:08\",\"decimal-771\":\"12.84\",\"enum-771\":\"first option\",\"radio-771\":\"option a\",\"dynamicUpdate-771\":\"\",\"pill_text-771\":\"\",\"file-771\":\"5db2a69427d2e\",\"_sipForTypo3Vars\":\"5db2a69427df8\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"771\",\"s\":\"5db2a69355888\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=771\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,771,1,'790a6675ac3587705c4082130c19f883','2019-10-25 07:39:01'),(1031,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"cFJkRGx5noESAyIvswfF7ZmdSVGzG2O2\",\"number-0\":\"1778678001\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"dynamicUpdate-0\":\"\",\"pill_text-0\":\"9K9cC3kenWmpxK5wY9SDUrBkds0mFD57\",\"file-0\":\"5db2a6968b466\",\"_sipForTypo3Vars\":\"5db2a68d45407\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db2a68c64915\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,0,3,'790a6675ac3587705c4082130c19f883','2019-10-25 07:39:05'),(1032,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"Il70nu60WMSTzKL5ZlMlzW4PS2xukGLd\",\"number-0\":\"618790447\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"dynamicUpdate-0\":\"\",\"pill_text-0\":\"\",\"file-0\":\"5db2a6e0e4b5f\",\"_sipForTypo3Vars\":\"5db2a6dfd2b62\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db2a6df05174\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.70 Safari/537.36',1007,0,3,'d462cafd467168400e3989c1f7cfa9f8','2019-10-25 07:40:18'),(1033,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"q20cszm7L7jlW7eLefteDE6TvKx7UjV9\",\"number-0\":\"1085431290\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"dynamicUpdate-0\":\"\",\"pill_text-0\":\"\",\"file-0\":\"5db2a6e4bbeb3\",\"_sipForTypo3Vars\":\"5db2a6dfd2b62\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db2a6df05174\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.70 Safari/537.36',1007,0,3,'d462cafd467168400e3989c1f7cfa9f8','2019-10-25 07:40:22'),(1034,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"a430ea8e42c464c0ce7785a90a9cc92e\",\"_h_checkbox-774\":\"\",\"text-774\":\"cRVHXr5svflz31FAcQZ6jWOlLbSKKDfq\",\"number-774\":\"1803028867\",\"date-774\":\"01.01.2188\",\"datetime-774\":\"02.02.2188 01:08\",\"decimal-774\":\"12.84\",\"enum-774\":\"first option\",\"radio-774\":\"option a\",\"dynamicUpdate-774\":\"\",\"pill_text-774\":\"\",\"file-774\":\"5db2a6e7d033d\",\"_sipForTypo3Vars\":\"5db2a6e7d0406\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"774\",\"s\":\"5db2a6e6da8f6\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=774\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.70 Safari/537.36',1007,774,1,'d462cafd467168400e3989c1f7cfa9f8','2019-10-25 07:40:25'),(1035,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"nrabuwtDEQRjUz7K6Xt92x8LiZPtOL4L\",\"number-0\":\"1098194577\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"dynamicUpdate-0\":\"\",\"pill_text-0\":\"heMjfNolxoP28JTO30X4ag1RCFKnXVFE\",\"file-0\":\"5db2a6eac9617\",\"_sipForTypo3Vars\":\"5db2a6dfd2b62\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db2a6df05174\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.70 Safari/537.36',1007,0,3,'d462cafd467168400e3989c1f7cfa9f8','2019-10-25 07:40:29'),(1036,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"OXika2ki9cr0YoZ73BWpuyTcxqXGs0Pn\",\"number-0\":\"1370200039\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"dynamicUpdate-0\":\"\",\"pill_text-0\":\"\",\"file-0\":\"5db2a776d6906\",\"_sipForTypo3Vars\":\"5db2a77605b80\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db2a77517645\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,0,3,'032a71d67cf138cd4e6d221283d7bedc','2019-10-25 07:42:48'),(1037,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"yXwKfh72gJ8eJisfVyEcTzpPXF4I3lEi\",\"number-0\":\"105525803\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"dynamicUpdate-0\":\"\",\"pill_text-0\":\"\",\"file-0\":\"5db2a77a7cd3f\",\"_sipForTypo3Vars\":\"5db2a77605b80\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db2a77517645\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,0,3,'032a71d67cf138cd4e6d221283d7bedc','2019-10-25 07:42:52'),(1038,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"1321e8d836bea1d1424d5bc84bc16d37\",\"_h_checkbox-777\":\"\",\"text-777\":\"dKV8g0saNLlPRn2En2Un55Bwb51m63Vq\",\"number-777\":\"1430490680\",\"date-777\":\"01.01.2188\",\"datetime-777\":\"02.02.2188 01:08\",\"decimal-777\":\"12.84\",\"enum-777\":\"first option\",\"radio-777\":\"option a\",\"dynamicUpdate-777\":\"\",\"pill_text-777\":\"\",\"file-777\":\"5db2a77d3cd7f\",\"_sipForTypo3Vars\":\"5db2a77d3ce48\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"777\",\"s\":\"5db2a77c6822c\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=777\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,777,1,'032a71d67cf138cd4e6d221283d7bedc','2019-10-25 07:42:54'),(1039,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"2HK3wmiyqaFgaEjj9Bj6oXEAfEs4gj7k\",\"number-0\":\"1629781658\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"dynamicUpdate-0\":\"\",\"pill_text-0\":\"PKl0Vb0xu2egZY4Tl6hXCodrcBGgEcIn\",\"file-0\":\"5db2a77f9d607\",\"_sipForTypo3Vars\":\"5db2a77605b80\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db2a77517645\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,0,3,'032a71d67cf138cd4e6d221283d7bedc','2019-10-25 07:42:58'),(1040,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"TmAFTCYACivZ5J6aktbfdjlAOXsSMSF3\",\"number-0\":\"644198335\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"dynamicUpdate-0\":\"\",\"pill_text-0\":\"\",\"file-0\":\"5db2a7b69c746\",\"_sipForTypo3Vars\":\"5db2a7b5c536d\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db2a7b4dfc89\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,0,3,'7791a624482eff843a5b9caec78e02d1','2019-10-25 07:43:52'),(1041,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"dCOXK9ekhfge5vpiu4186bKPcxeJFugR\",\"number-0\":\"234228972\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"dynamicUpdate-0\":\"\",\"pill_text-0\":\"\",\"file-0\":\"5db2a7ba250d8\",\"_sipForTypo3Vars\":\"5db2a7b5c536d\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db2a7b4dfc89\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,0,3,'7791a624482eff843a5b9caec78e02d1','2019-10-25 07:43:56'),(1042,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"7d73aa91da0c7c42bc4113854425503a\",\"_h_checkbox-780\":\"\",\"text-780\":\"vzUtsOBUOIyxBM0cz2EVwwD9Ng2irXSt\",\"number-780\":\"1205361336\",\"date-780\":\"01.01.2188\",\"datetime-780\":\"02.02.2188 01:08\",\"decimal-780\":\"12.84\",\"enum-780\":\"first option\",\"radio-780\":\"option a\",\"dynamicUpdate-780\":\"\",\"pill_text-780\":\"\",\"file-780\":\"5db2a7bcc45a7\",\"_sipForTypo3Vars\":\"5db2a7bcc46ae\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"780\",\"s\":\"5db2a7bc0987f\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=780\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,780,1,'7791a624482eff843a5b9caec78e02d1','2019-10-25 07:43:58'),(1043,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"wNt5hQsmCyqY8so5l2ZOUHr37KixYvuE\",\"number-0\":\"1372072110\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"dynamicUpdate-0\":\"\",\"pill_text-0\":\"uoPabtdfOUQ6hKae1q0bQ9rj3Xo6RUrY\",\"file-0\":\"5db2a7bf24536\",\"_sipForTypo3Vars\":\"5db2a7b5c536d\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db2a7b4dfc89\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,0,3,'7791a624482eff843a5b9caec78e02d1','2019-10-25 07:44:01'),(1044,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"06JKt5hPDO2ZsZiNg9Huff8qigm2P4wn\",\"number-0\":\"1512446287\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"dynamicUpdate-0\":\"\",\"pill_text-0\":\"\",\"file-0\":\"5db2a8f96ba51\",\"_sipForTypo3Vars\":\"5db2a8f891e27\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db2a8f7aac4e\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,0,3,'5c2de45be46931ac8c231996e845d5c4','2019-10-25 07:49:15'),(1045,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"A7ffH2CftFImAxyE8CPCInD0O60BrDDF\",\"number-0\":\"798340360\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"dynamicUpdate-0\":\"\",\"pill_text-0\":\"\",\"file-0\":\"5db2a8fcb83d4\",\"_sipForTypo3Vars\":\"5db2a8f891e27\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db2a8f7aac4e\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,0,3,'5c2de45be46931ac8c231996e845d5c4','2019-10-25 07:49:18'),(1046,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"7f1e547a3d52a33c37fee4af5d64e0e9\",\"_h_checkbox-783\":\"\",\"text-783\":\"Y7VVJ0tZYJ0FtDCxkrCwuJqKky51iHVM\",\"number-783\":\"2075458358\",\"date-783\":\"01.01.2188\",\"datetime-783\":\"02.02.2188 01:08\",\"decimal-783\":\"12.84\",\"enum-783\":\"first option\",\"radio-783\":\"option a\",\"dynamicUpdate-783\":\"\",\"pill_text-783\":\"\",\"file-783\":\"5db2a8ff64359\",\"_sipForTypo3Vars\":\"5db2a8ff64420\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"783\",\"s\":\"5db2a8fe97fec\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=783\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,783,1,'5c2de45be46931ac8c231996e845d5c4','2019-10-25 07:49:20'),(1047,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"QybK9DeOSyfFKX9ebTK1qqaSLWSDYczY\",\"number-0\":\"1601140910\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"dynamicUpdate-0\":\"\",\"pill_text-0\":\"xBjXGeeJEYrvsGvxUhMTh6gHIh2uyJLC\",\"file-0\":\"5db2a901dd539\",\"_sipForTypo3Vars\":\"5db2a8f891e27\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db2a8f7aac4e\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,0,3,'5c2de45be46931ac8c231996e845d5c4','2019-10-25 07:49:24'),(1048,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"a0JHykvJ5CeFpup8G7hFXYdf6xyJL6rh\",\"number-0\":\"1092779971\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option c\",\"dynamicUpdate-0\":\"RVo6ysb332JbmUSKLxIv0uYSykn0OYfc\",\"pill_text-0\":\"\",\"file-0\":\"5db2a90bc5d26\",\"_sipForTypo3Vars\":\"5db2a8f891e27\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db2a8f7aac4e\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,0,3,'5c2de45be46931ac8c231996e845d5c4','2019-10-25 07:49:34'),(1049,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"1WxyCD7XGYgtUoSwmEvK7cKH5EAmBVGk\",\"number-0\":\"320344692\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"dynamicUpdate-0\":\"\",\"pill_text-0\":\"\",\"file-0\":\"5db2a90fb454f\",\"_sipForTypo3Vars\":\"5db2a8f891e27\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db2a8f7aac4e\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,0,3,'5c2de45be46931ac8c231996e845d5c4','2019-10-25 07:49:37'),(1050,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"hZXYNTHikNcOVZiIWu2sYg0WMp5L8vSr\",\"number-0\":\"200464365\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"dynamicUpdate-0\":\"\",\"pill_text-0\":\"\",\"file-0\":\"5db2a91328c6a\",\"_sipForTypo3Vars\":\"5db2a8f891e27\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db2a8f7aac4e\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,0,3,'5c2de45be46931ac8c231996e845d5c4','2019-10-25 07:49:43'),(1051,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"WHxevOkokrvqKIcsABviJxe6dB8ZgRck\",\"number-0\":\"910054803\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"dynamicUpdate-0\":\"\",\"pill_text-0\":\"\",\"file-0\":\"5db2a918ce33f\",\"_sipForTypo3Vars\":\"5db2a8f891e27\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db2a8f7aac4e\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,0,3,'5c2de45be46931ac8c231996e845d5c4','2019-10-25 07:49:48'),(1052,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"F5GazacaMUW83MmweBnWA43S5uJl9MRh\",\"number-0\":\"1469263633\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"dynamicUpdate-0\":\"\",\"pill_text-0\":\"\",\"file-0\":\"5db2ad7d00861\",\"_sipForTypo3Vars\":\"5db2ad7c3cb8d\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db2ad7b5fb42\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,0,3,'ec3caf638740047990a7b177fbb090b5','2019-10-25 08:08:30'),(1053,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"HqnD6cqfgthRROx0tG7cFKSh2rm9Vj9t\",\"number-0\":\"1764651053\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"dynamicUpdate-0\":\"\",\"pill_text-0\":\"\",\"file-0\":\"5db2ad8065c8d\",\"_sipForTypo3Vars\":\"5db2ad7c3cb8d\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db2ad7b5fb42\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,0,3,'ec3caf638740047990a7b177fbb090b5','2019-10-25 08:08:34'),(1054,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"ddb357784ad7f28f109dedc2cdbd5e64\",\"_h_checkbox-790\":\"\",\"text-790\":\"8PafXrt43IujRgQRm3gDZc8w3dMiy6S1\",\"number-790\":\"1224526790\",\"date-790\":\"01.01.2188\",\"datetime-790\":\"02.02.2188 01:08\",\"decimal-790\":\"12.84\",\"enum-790\":\"first option\",\"radio-790\":\"option a\",\"dynamicUpdate-790\":\"\",\"pill_text-790\":\"\",\"file-790\":\"5db2ad83451df\",\"_sipForTypo3Vars\":\"5db2ad83452b4\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"790\",\"s\":\"5db2ad82648b9\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=790\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,790,1,'ec3caf638740047990a7b177fbb090b5','2019-10-25 08:08:36'),(1055,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"PWtPCkKmwxCZPc45TwMsMcp9WhrtHApU\",\"number-0\":\"590088604\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"dynamicUpdate-0\":\"\",\"pill_text-0\":\"sQLJW0iFR8Vwr3amwhctDpB87dv2ZRJX\",\"file-0\":\"5db2ad85be7bf\",\"_sipForTypo3Vars\":\"5db2ad7c3cb8d\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db2ad7b5fb42\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,0,3,'ec3caf638740047990a7b177fbb090b5','2019-10-25 08:08:40'),(1056,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"VaahOSxhtiy1c4KURihYLtEt6aEI1yCt\",\"number-0\":\"855918285\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"dynamicUpdate-0\":\"\",\"pill_text-0\":\"\",\"file-0\":\"5db2adbe56025\",\"_sipForTypo3Vars\":\"5db2adbd83285\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db2adbca190f\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,0,3,'467905877a86ee076b4357f2619131f3','2019-10-25 08:09:36'),(1057,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"LVBvFzgoQsnayoHNVuWB6iFSbi8thoC7\",\"number-0\":\"93074011\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"dynamicUpdate-0\":\"\",\"pill_text-0\":\"\",\"file-0\":\"5db2adc17ef98\",\"_sipForTypo3Vars\":\"5db2adbd83285\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db2adbca190f\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,0,3,'467905877a86ee076b4357f2619131f3','2019-10-25 08:09:39'),(1058,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"4bd3b88ffd6e93c061c6283473c13a5b\",\"_h_checkbox-793\":\"\",\"text-793\":\"slblD6Nm8fG1hvfbPycuco7Y7a2CAqwO\",\"number-793\":\"660204878\",\"date-793\":\"01.01.2188\",\"datetime-793\":\"02.02.2188 01:08\",\"decimal-793\":\"12.84\",\"enum-793\":\"first option\",\"radio-793\":\"option a\",\"dynamicUpdate-793\":\"\",\"pill_text-793\":\"\",\"file-793\":\"5db2adc419b05\",\"_sipForTypo3Vars\":\"5db2adc419be7\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"793\",\"s\":\"5db2adc34f450\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=793\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,793,1,'467905877a86ee076b4357f2619131f3','2019-10-25 08:09:41'),(1059,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"TDjKEk5ZuGvGqqYdOlgJ4R9jgohw01Xo\",\"number-0\":\"836146680\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"dynamicUpdate-0\":\"\",\"pill_text-0\":\"t3Y2yBbt4EmzVQrvFazY459xeJ1h3xLV\",\"file-0\":\"5db2adc673c13\",\"_sipForTypo3Vars\":\"5db2adbd83285\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db2adbca190f\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,0,3,'467905877a86ee076b4357f2619131f3','2019-10-25 08:09:44'),(1060,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"OtowdU2Tk6aSh6yqQ3hA5OGIW5IZYI70\",\"number-0\":\"56615258\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"dynamicUpdate-0\":\"\",\"pill_text-0\":\"\",\"file-0\":\"5db2b016695a4\",\"_sipForTypo3Vars\":\"5db2b0158201f\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db2b01486f4c\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,0,3,'64118ba7919c11fa0c6ea54317caa7a9','2019-10-25 08:19:36'),(1061,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"wpALt9l4OeM3yEm1BjnJuTOMwpg0RLut\",\"number-0\":\"1604205432\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"dynamicUpdate-0\":\"\",\"pill_text-0\":\"\",\"file-0\":\"5db2b01a32081\",\"_sipForTypo3Vars\":\"5db2b0158201f\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db2b01486f4c\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,0,3,'64118ba7919c11fa0c6ea54317caa7a9','2019-10-25 08:19:40'),(1062,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"a198523e9fb4923deb6cfc0b81b0794e\",\"_h_checkbox-796\":\"\",\"text-796\":\"1XlQ10gdI8m2PD6tRZqMiqFom7WDRDBq\",\"number-796\":\"978644237\",\"date-796\":\"01.01.2188\",\"datetime-796\":\"02.02.2188 01:08\",\"decimal-796\":\"12.84\",\"enum-796\":\"first option\",\"radio-796\":\"option a\",\"dynamicUpdate-796\":\"\",\"pill_text-796\":\"\",\"file-796\":\"5db2b01d1ba20\",\"_sipForTypo3Vars\":\"5db2b01d1bb17\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"796\",\"s\":\"5db2b01c3a4fd\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=796\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,796,1,'64118ba7919c11fa0c6ea54317caa7a9','2019-10-25 08:19:42'),(1063,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"qGwILgBrQhhJBLqZXcXAt0MQ2R5fBbxH\",\"number-0\":\"2136103623\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"dynamicUpdate-0\":\"\",\"pill_text-0\":\"w2LUID0zpQJ5gW5oPOgReUsbLAJvLk0a\",\"file-0\":\"5db2b01fad9ce\",\"_sipForTypo3Vars\":\"5db2b0158201f\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db2b01486f4c\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,0,3,'64118ba7919c11fa0c6ea54317caa7a9','2019-10-25 08:19:46'),(1064,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"y4xa0X4e3cYvZId8hP5YNKawxdY1kQLw\",\"number-0\":\"775453977\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"dynamicUpdate-0\":\"\",\"pill_text-0\":\"\",\"file-0\":\"5db2b058a6213\",\"_sipForTypo3Vars\":\"5db2b057c282d\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db2b056cae3d\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,0,3,'2519b934e5e008958ff830f2a09694fc','2019-10-25 08:20:42'),(1065,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"d5yWoyUsrIjYZodCUQXvOqK6v9hInmb9\",\"number-0\":\"1498318543\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"dynamicUpdate-0\":\"\",\"pill_text-0\":\"\",\"file-0\":\"5db2b05c29c66\",\"_sipForTypo3Vars\":\"5db2b057c282d\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db2b056cae3d\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,0,3,'2519b934e5e008958ff830f2a09694fc','2019-10-25 08:20:46'),(1066,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"f4c050cc9df260adf3997a0429c9bed5\",\"_h_checkbox-799\":\"\",\"text-799\":\"DXIHnmZzRYSGrUgsj5cfxdrHhJj1Zgiu\",\"number-799\":\"113516904\",\"date-799\":\"01.01.2188\",\"datetime-799\":\"02.02.2188 01:08\",\"decimal-799\":\"12.84\",\"enum-799\":\"first option\",\"radio-799\":\"option a\",\"dynamicUpdate-799\":\"\",\"pill_text-799\":\"\",\"file-799\":\"5db2b05f26628\",\"_sipForTypo3Vars\":\"5db2b05f266f5\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"799\",\"s\":\"5db2b05e4dcb1\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=799\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,799,1,'2519b934e5e008958ff830f2a09694fc','2019-10-25 08:20:48'),(1067,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"tfdEREQQehg0T9IkWPnL6KEVAifdAdEY\",\"number-0\":\"1031232082\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"dynamicUpdate-0\":\"\",\"pill_text-0\":\"reioVlPE7Tj9KVueeG6lg5A5AMxoqQnA\",\"file-0\":\"5db2b061df2f6\",\"_sipForTypo3Vars\":\"5db2b057c282d\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db2b056cae3d\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,0,3,'2519b934e5e008958ff830f2a09694fc','2019-10-25 08:20:52'),(1068,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"ZSUIFkw1s6fFgs5idy1c4GtnkHggdLzf\",\"number-0\":\"732089463\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option c\",\"dynamicUpdate-0\":\"KPtCKU2E0THRyNLbFFVhSWO4getajq7w\",\"pill_text-0\":\"\",\"file-0\":\"5db2b06c39c0d\",\"_sipForTypo3Vars\":\"5db2b057c282d\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db2b056cae3d\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,0,3,'2519b934e5e008958ff830f2a09694fc','2019-10-25 08:21:03'),(1069,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"I86ejgCf7PNKP324YYaxQ1A0hYoEooM2\",\"number-0\":\"1999208281\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"dynamicUpdate-0\":\"\",\"pill_text-0\":\"\",\"file-0\":\"5db2b1ad4f6cf\",\"_sipForTypo3Vars\":\"5db2b1ac746c8\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db2b1ab7a645\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,0,3,'bfaca352c94c9e115c7a875a9a87ee27','2019-10-25 08:26:23'),(1070,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"hTtC3uSijoLe6y8C0CaDscDpfeg2edXv\",\"number-0\":\"1810943801\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"dynamicUpdate-0\":\"\",\"pill_text-0\":\"\",\"file-0\":\"5db2b1b1108e9\",\"_sipForTypo3Vars\":\"5db2b1ac746c8\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db2b1ab7a645\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,0,3,'bfaca352c94c9e115c7a875a9a87ee27','2019-10-25 08:26:27'),(1071,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"4a40e6bf56d37204aabe3420cec7a467\",\"_h_checkbox-803\":\"\",\"text-803\":\"YKa5VQS1Gb7W2XaEuCYgE4SjpfyHPWR8\",\"number-803\":\"388370134\",\"date-803\":\"01.01.2188\",\"datetime-803\":\"02.02.2188 01:08\",\"decimal-803\":\"12.84\",\"enum-803\":\"first option\",\"radio-803\":\"option a\",\"dynamicUpdate-803\":\"\",\"pill_text-803\":\"\",\"file-803\":\"5db2b1b445709\",\"_sipForTypo3Vars\":\"5db2b1b4457f0\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"803\",\"s\":\"5db2b1b34f1db\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=803\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,803,1,'bfaca352c94c9e115c7a875a9a87ee27','2019-10-25 08:26:29'),(1072,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"9AcEpWMqvZM55XpauHuFPRVse9gCSKaP\",\"number-0\":\"1565300527\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"dynamicUpdate-0\":\"\",\"pill_text-0\":\"25qlHQJm05assVLHejerhkGd1vXyd6bQ\",\"file-0\":\"5db2b1b71f56f\",\"_sipForTypo3Vars\":\"5db2b1ac746c8\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db2b1ab7a645\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,0,3,'bfaca352c94c9e115c7a875a9a87ee27','2019-10-25 08:26:34'),(1073,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"jsEdQAB3JSGq6jVDsl1D8qlQmq4JlBL3\",\"number-0\":\"1870994053\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option c\",\"dynamicUpdate-0\":\"Y8nOL6DPIQAfiFSAHtUZzi9Gk1zX6sZY\",\"pill_text-0\":\"\",\"file-0\":\"5db2b1c22b146\",\"_sipForTypo3Vars\":\"5db2b1ac746c8\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db2b1ab7a645\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,0,3,'bfaca352c94c9e115c7a875a9a87ee27','2019-10-25 08:26:44'),(1074,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"chUZ3nMWMHnROWE6ZnGKenLtIR3amDWe\",\"number-0\":\"1172521544\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"dynamicUpdate-0\":\"\",\"pill_text-0\":\"\",\"file-0\":\"5db2b1c65a58f\",\"_sipForTypo3Vars\":\"5db2b1ac746c8\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db2b1ab7a645\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,0,3,'bfaca352c94c9e115c7a875a9a87ee27','2019-10-25 08:26:48'),(1075,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"716HEDfw0XstKPTXXLzhAnyDcLE2kAe2\",\"number-0\":\"1585226675\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"dynamicUpdate-0\":\"\",\"pill_text-0\":\"\",\"file-0\":\"5db2b1ca2ed42\",\"_sipForTypo3Vars\":\"5db2b1ac746c8\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db2b1ab7a645\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,0,3,'bfaca352c94c9e115c7a875a9a87ee27','2019-10-25 08:26:54'),(1076,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"30jQ3hgY3cU5fEj7VPs6uoy4pd7nJO0x\",\"number-0\":\"220733140\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"dynamicUpdate-0\":\"\",\"pill_text-0\":\"\",\"file-0\":\"5db2b1d05d0b4\",\"_sipForTypo3Vars\":\"5db2b1ac746c8\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db2b1ab7a645\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,0,3,'bfaca352c94c9e115c7a875a9a87ee27','2019-10-25 08:27:00'),(1077,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"cY2tXhnW9NHVpdtcg6ZQvLgP1zAla6IW\",\"number-0\":\"215160282\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"dynamicUpdate-0\":\"\",\"pill_text-0\":\"\",\"file-0\":\"5db2b1f3533fb\",\"_sipForTypo3Vars\":\"5db2b1f258cdd\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db2b1f1225d5\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,0,3,'08eccc4644ef2ef130608e88b9291f82','2019-10-25 08:27:33'),(1078,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"DXPqJgFlQDrLzKhuDOC76cGCMjvNZkqB\",\"number-0\":\"1085290137\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"dynamicUpdate-0\":\"\",\"pill_text-0\":\"\",\"file-0\":\"5db2b1f6e0aa2\",\"_sipForTypo3Vars\":\"5db2b1f258cdd\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db2b1f1225d5\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,0,3,'08eccc4644ef2ef130608e88b9291f82','2019-10-25 08:27:37'),(1079,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"00966be875bff94d62763718362f70b0\",\"_h_checkbox-810\":\"\",\"text-810\":\"I0hEW8eP6IdVIh6AANv4uw93rHIXW50i\",\"number-810\":\"1074913688\",\"date-810\":\"01.01.2188\",\"datetime-810\":\"02.02.2188 01:08\",\"decimal-810\":\"12.84\",\"enum-810\":\"first option\",\"radio-810\":\"option a\",\"dynamicUpdate-810\":\"\",\"pill_text-810\":\"\",\"file-810\":\"5db2b1f9f1b0f\",\"_sipForTypo3Vars\":\"5db2b1f9f1be3\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"810\",\"s\":\"5db2b1f91162f\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=810\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,810,1,'08eccc4644ef2ef130608e88b9291f82','2019-10-25 08:27:39'),(1080,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"MyqOMcepBUblvFxonPL52whDFgbuTkvE\",\"number-0\":\"911714708\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"dynamicUpdate-0\":\"\",\"pill_text-0\":\"SBDNvVAfXZCX4dzoV9zPA3w6e3abV1Cq\",\"file-0\":\"5db2b1fc953b2\",\"_sipForTypo3Vars\":\"5db2b1f258cdd\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db2b1f1225d5\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,0,3,'08eccc4644ef2ef130608e88b9291f82','2019-10-25 08:27:43'),(1081,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"m3tfhASevZwEwXgDy1pg7buNlAk9DIAN\",\"number-0\":\"1777973407\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"dynamicUpdate-0\":\"\",\"pill_text-0\":\"\",\"file-0\":\"5db2b29e2cfcd\",\"_sipForTypo3Vars\":\"5db2b29d2e31d\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db2b29c3cb56\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,0,3,'6fff7bf87f2bfaaadaa4f3744959034d','2019-10-25 08:30:24'),(1082,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"XTLVCMtlxgZBysPLaiEfAhzsLcUyKnxe\",\"number-0\":\"1427495008\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"dynamicUpdate-0\":\"\",\"pill_text-0\":\"\",\"file-0\":\"5db2b2a21199a\",\"_sipForTypo3Vars\":\"5db2b29d2e31d\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db2b29c3cb56\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,0,3,'6fff7bf87f2bfaaadaa4f3744959034d','2019-10-25 08:30:28'),(1083,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"b2a7b5172abefb2d141a3b743be9ede3\",\"_h_checkbox-813\":\"\",\"text-813\":\"02jDchzf11Eyp2xQeGD3BL0Jo2m9TQ5g\",\"number-813\":\"886783550\",\"date-813\":\"01.01.2188\",\"datetime-813\":\"02.02.2188 01:08\",\"decimal-813\":\"12.84\",\"enum-813\":\"first option\",\"radio-813\":\"option a\",\"dynamicUpdate-813\":\"\",\"pill_text-813\":\"\",\"file-813\":\"5db2b2a53b14a\",\"_sipForTypo3Vars\":\"5db2b2a53b22c\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"813\",\"s\":\"5db2b2a44ef41\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=813\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,813,1,'6fff7bf87f2bfaaadaa4f3744959034d','2019-10-25 08:30:30'),(1084,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"yMh3KiE27MtRjt9N95KFqfnagi9YK57S\",\"number-0\":\"80655261\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"dynamicUpdate-0\":\"\",\"pill_text-0\":\"CI8p6GMUGKwdDCvIZYA3APuUWsyZaztg\",\"file-0\":\"5db2b2a7c81da\",\"_sipForTypo3Vars\":\"5db2b29d2e31d\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db2b29c3cb56\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,0,3,'6fff7bf87f2bfaaadaa4f3744959034d','2019-10-25 08:30:34'),(1085,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"CVpbfVo3kch7oB5UySvP5msGhX0kS5DU\",\"number-0\":\"269652378\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option c\",\"dynamicUpdate-0\":\"pdLMU9GMwk490ZbuznzKJqeFkimwXmsD\",\"pill_text-0\":\"\",\"file-0\":\"5db2b2b7c9652\",\"_sipForTypo3Vars\":\"5db2b2b7c9750\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db2b2b6e5a55\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,0,3,'5d4b137df2b99b28b4743fb5c7e06984','2019-10-25 08:30:50'),(1086,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"kCUF1XKkK7BvnUQEzWwXZhplH0Ixc7wL\",\"number-0\":\"1254778751\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option c\",\"dynamicUpdate-0\":\"py735Eqkq8p7skGbBoAnH2NvdeIFMtZ6\",\"pill_text-0\":\"\",\"file-0\":\"5db2b32634b9b\",\"_sipForTypo3Vars\":\"5db2b32634c81\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db2b32554fdd\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,0,3,'1b9058cfa52ca798596e9ed7e6d79390','2019-10-25 08:32:40'),(1087,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"kaUIFNqianckLRXpOLwDJUpds6OyNiqD\",\"number-0\":\"2002401854\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"dynamicUpdate-0\":\"\",\"pill_text-0\":\"\",\"file-0\":\"5db2b341cf452\",\"_sipForTypo3Vars\":\"5db2b340e6d06\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db2b3400ce82\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,0,3,'e1efd645a57b46108bb8e8e4064e1df0','2019-10-25 08:33:07'),(1088,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"1kPibCmYrK6P5bOxHvgHXr0DnW0xGX8T\",\"number-0\":\"831768060\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"dynamicUpdate-0\":\"\",\"pill_text-0\":\"\",\"file-0\":\"5db2b34588c5e\",\"_sipForTypo3Vars\":\"5db2b340e6d06\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db2b3400ce82\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,0,3,'e1efd645a57b46108bb8e8e4064e1df0','2019-10-25 08:33:11'),(1089,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"6630b66845c59cfea2b79b433b8b95fd\",\"_h_checkbox-818\":\"\",\"text-818\":\"guCNY9RzoBDD97HbvomtN1ZFKK4w4VVj\",\"number-818\":\"361769414\",\"date-818\":\"01.01.2188\",\"datetime-818\":\"02.02.2188 01:08\",\"decimal-818\":\"12.84\",\"enum-818\":\"first option\",\"radio-818\":\"option a\",\"dynamicUpdate-818\":\"\",\"pill_text-818\":\"\",\"file-818\":\"5db2b34851368\",\"_sipForTypo3Vars\":\"5db2b34851446\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"818\",\"s\":\"5db2b34779711\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=818\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,818,1,'e1efd645a57b46108bb8e8e4064e1df0','2019-10-25 08:33:13'),(1090,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"dZBBuzMqvkJOW5f3kMk63XiVwN0GfUed\",\"number-0\":\"665400512\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"dynamicUpdate-0\":\"\",\"pill_text-0\":\"thbaopgRiGA6ojWypWU04MoWyHM9qKvj\",\"file-0\":\"5db2b34ae04f6\",\"_sipForTypo3Vars\":\"5db2b340e6d06\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db2b3400ce82\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,0,3,'e1efd645a57b46108bb8e8e4064e1df0','2019-10-25 08:33:17'),(1091,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"G2drSZYrgwkPqw5WJYEvHwxytXdT6Lqr\",\"number-0\":\"1220045709\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option c\",\"dynamicUpdate-0\":\"7EdyLw4EtM2TLxdnsrFl5xMomXdLSysJ\",\"pill_text-0\":\"\",\"file-0\":\"5db2b35541f72\",\"_sipForTypo3Vars\":\"5db2b340e6d06\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db2b3400ce82\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,0,3,'e1efd645a57b46108bb8e8e4064e1df0','2019-10-25 08:33:28'),(1092,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"fOLhr4ICRAlBEWQQz6bxZKw7kRRDCmK9\",\"number-0\":\"1762154162\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"dynamicUpdate-0\":\"\",\"pill_text-0\":\"\",\"file-0\":\"5db2b35989118\",\"_sipForTypo3Vars\":\"5db2b340e6d06\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db2b3400ce82\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,0,3,'e1efd645a57b46108bb8e8e4064e1df0','2019-10-25 08:33:31'),(1093,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"2fKNO4pMjMtUGQSppseOhAkb86slcIYX\",\"number-0\":\"70539128\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"dynamicUpdate-0\":\"\",\"pill_text-0\":\"\",\"file-0\":\"5db2b35d62e32\",\"_sipForTypo3Vars\":\"5db2b340e6d06\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db2b3400ce82\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,0,3,'e1efd645a57b46108bb8e8e4064e1df0','2019-10-25 08:33:37'),(1094,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"h6HCDDJu8fu1Gl0k44kFnC3Up0bglsQC\",\"number-0\":\"1381175612\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"dynamicUpdate-0\":\"\",\"pill_text-0\":\"\",\"file-0\":\"5db2b36341c97\",\"_sipForTypo3Vars\":\"5db2b340e6d06\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db2b3400ce82\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,0,3,'e1efd645a57b46108bb8e8e4064e1df0','2019-10-25 08:33:43'),(1095,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"oXSzYXj7EGXT5gVHCVgCi6aEr5aFeSOn\",\"number-0\":\"342804671\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"dynamicUpdate-0\":\"\",\"pill_text-0\":\"\",\"file-0\":\"5db2b9b4cf96b\",\"_sipForTypo3Vars\":\"5db2b9b3f1a6a\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db2b9b3169e9\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,0,3,'d3f5e6772c86d36c49042dc4d8353ca2','2019-10-25 09:00:38'),(1096,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"K0xZCHspHlLUsfRpNAfVwqsHorjXNWaD\",\"number-0\":\"1629968782\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"dynamicUpdate-0\":\"\",\"pill_text-0\":\"\",\"file-0\":\"5db2b9b850152\",\"_sipForTypo3Vars\":\"5db2b9b3f1a6a\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db2b9b3169e9\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,0,3,'d3f5e6772c86d36c49042dc4d8353ca2','2019-10-25 09:00:42'),(1097,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"f9c902ef47552356f7f22abf246c55a4\",\"_h_checkbox-825\":\"\",\"text-825\":\"ZNGW1P8BJISQnl9fjIYoT2n6Bu8O83xs\",\"number-825\":\"1913643414\",\"date-825\":\"01.01.2188\",\"datetime-825\":\"02.02.2188 01:08\",\"decimal-825\":\"12.84\",\"enum-825\":\"first option\",\"radio-825\":\"option a\",\"dynamicUpdate-825\":\"\",\"pill_text-825\":\"\",\"file-825\":\"5db2b9bb3d788\",\"_sipForTypo3Vars\":\"5db2b9bb3d862\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"825\",\"s\":\"5db2b9ba60225\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=825\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,825,1,'d3f5e6772c86d36c49042dc4d8353ca2','2019-10-25 09:00:44'),(1098,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"EBIx0NlyNw31umXxavraT3bqHuBTJ0bG\",\"number-0\":\"639918848\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"dynamicUpdate-0\":\"\",\"pill_text-0\":\"yn1O9WP4Vzv21F25kdv8ePMXSC9H64yB\",\"file-0\":\"5db2b9bdd9672\",\"_sipForTypo3Vars\":\"5db2b9b3f1a6a\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db2b9b3169e9\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,0,3,'d3f5e6772c86d36c49042dc4d8353ca2','2019-10-25 09:00:48'),(1099,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"wC1XnPUyliF7du7WN8WuaAbQc1A4FWM2\",\"number-0\":\"766325996\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option c\",\"dynamicUpdate-0\":\"vamo04aKRVCDoysrOGErRDriLfhW7BSh\",\"pill_text-0\":\"\",\"file-0\":\"5db2b9c7c62dd\",\"_sipForTypo3Vars\":\"5db2b9b3f1a6a\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db2b9b3169e9\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,0,3,'d3f5e6772c86d36c49042dc4d8353ca2','2019-10-25 09:00:58'),(1100,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"Gt6GM6BA50BpVhcrLDuahqgZzrZnHp5a\",\"number-0\":\"60450242\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"dynamicUpdate-0\":\"\",\"pill_text-0\":\"\",\"file-0\":\"5db2b9cc0e957\",\"_sipForTypo3Vars\":\"5db2b9b3f1a6a\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db2b9b3169e9\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,0,3,'d3f5e6772c86d36c49042dc4d8353ca2','2019-10-25 09:01:02'),(1101,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"TZi0DnnnrFrUAuxeEgxEr5SUJjTbuja5\",\"number-0\":\"1147721222\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"dynamicUpdate-0\":\"\",\"pill_text-0\":\"\",\"file-0\":\"5db2b9cf8611c\",\"_sipForTypo3Vars\":\"5db2b9b3f1a6a\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db2b9b3169e9\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,0,3,'d3f5e6772c86d36c49042dc4d8353ca2','2019-10-25 09:01:07'),(1102,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"2AMBW877VO6xFjCJfxkRQga3K9ht7CXS\",\"number-0\":\"731123757\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"dynamicUpdate-0\":\"\",\"pill_text-0\":\"\",\"file-0\":\"5db2b9d55f198\",\"_sipForTypo3Vars\":\"5db2b9b3f1a6a\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db2b9b3169e9\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,0,3,'d3f5e6772c86d36c49042dc4d8353ca2','2019-10-25 09:01:13'),(1103,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"lfqbs2q0n1OpC4nZSOeUy6TeFT8TnBNz\",\"number-0\":\"1204798716\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"dynamicUpdate-0\":\"\",\"pill_text-0\":\"\",\"file-0\":\"5db2bcd3c9f6f\",\"_sipForTypo3Vars\":\"5db2bcd2e81af\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db2bcd209150\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,0,3,'ff0cd94251a4e468ed8ea668546c5a12','2019-10-25 09:13:57'),(1104,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"X8LuTkY3w0DxCQVQ4dF6w8m18hTxcK1X\",\"number-0\":\"1643486046\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"dynamicUpdate-0\":\"\",\"pill_text-0\":\"\",\"file-0\":\"5db2bcd76e836\",\"_sipForTypo3Vars\":\"5db2bcd2e81af\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db2bcd209150\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,0,3,'ff0cd94251a4e468ed8ea668546c5a12','2019-10-25 09:14:01'),(1105,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"f3ebde59fbc5b24ef883188f1f3de573\",\"_h_checkbox-832\":\"\",\"text-832\":\"HlgEhZapjy7VinUunZi1YIfO1JBk5NQy\",\"number-832\":\"1801999986\",\"date-832\":\"01.01.2188\",\"datetime-832\":\"02.02.2188 01:08\",\"decimal-832\":\"12.84\",\"enum-832\":\"first option\",\"radio-832\":\"option a\",\"dynamicUpdate-832\":\"\",\"pill_text-832\":\"\",\"file-832\":\"5db2bcda88089\",\"_sipForTypo3Vars\":\"5db2bcda8816e\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"832\",\"s\":\"5db2bcd98f079\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=832\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,832,1,'ff0cd94251a4e468ed8ea668546c5a12','2019-10-25 09:14:03'),(1106,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"9Vs7p8Xa064UKW6M1KijpgacpAlobGIa\",\"number-0\":\"1985672060\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"dynamicUpdate-0\":\"\",\"pill_text-0\":\"qoStArMutKErN9FwI1xTfdUiyHMh1Ufd\",\"file-0\":\"5db2bcdd1e438\",\"_sipForTypo3Vars\":\"5db2bcd2e81af\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db2bcd209150\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,0,3,'ff0cd94251a4e468ed8ea668546c5a12','2019-10-25 09:14:07'),(1107,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"gzDLbKr8RGICsfxo8mGG7z3Fys8p6FEe\",\"number-0\":\"1498692056\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option c\",\"dynamicUpdate-0\":\"IjVTSdzbKXz7NmVc8dT6IGAWmWuJ6PUP\",\"pill_text-0\":\"\",\"file-0\":\"5db2bce775b80\",\"_sipForTypo3Vars\":\"5db2bcd2e81af\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db2bcd209150\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,0,3,'ff0cd94251a4e468ed8ea668546c5a12','2019-10-25 09:14:18'),(1108,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"OnR9iNiziZidUpmi6pF2aDmVrnZq3WUE\",\"number-0\":\"1006257546\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"dynamicUpdate-0\":\"\",\"pill_text-0\":\"\",\"file-0\":\"5db2bceb8d256\",\"_sipForTypo3Vars\":\"5db2bcd2e81af\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db2bcd209150\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,0,3,'ff0cd94251a4e468ed8ea668546c5a12','2019-10-25 09:14:21'),(1109,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"v8jJPWldkoNJgF5fqaqF3CPF6L2SW6lD\",\"number-0\":\"1878507536\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"dynamicUpdate-0\":\"\",\"pill_text-0\":\"\",\"file-0\":\"5db2bcef476a4\",\"_sipForTypo3Vars\":\"5db2bcd2e81af\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db2bcd209150\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,0,3,'ff0cd94251a4e468ed8ea668546c5a12','2019-10-25 09:14:27'),(1110,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"aINhyfKM7vbWUvJhhkm2TCLDZRC8Iaol\",\"number-0\":\"1107119825\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"dynamicUpdate-0\":\"\",\"pill_text-0\":\"\",\"file-0\":\"5db2bcf54e756\",\"_sipForTypo3Vars\":\"5db2bcd2e81af\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db2bcd209150\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,0,3,'ff0cd94251a4e468ed8ea668546c5a12','2019-10-25 09:14:33'),(1111,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"owhV0GHo8vwkCtPwiU0MdKAuPgngRxCG\",\"number-0\":\"234658310\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"dynamicUpdate-0\":\"\",\"pill_text-0\":\"\",\"file-0\":\"5db2bd97d36e1\",\"_sipForTypo3Vars\":\"5db2bd96f0205\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db2bd96209a5\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,0,3,'be32ca051ff7c5a5b84540985f0f11ac','2019-10-25 09:17:13'),(1112,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"hyWNOhtrKuC4qjakDdke2ITtdLBEUDkt\",\"number-0\":\"274951015\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"dynamicUpdate-0\":\"\",\"pill_text-0\":\"\",\"file-0\":\"5db2bd9b691c8\",\"_sipForTypo3Vars\":\"5db2bd96f0205\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db2bd96209a5\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,0,3,'be32ca051ff7c5a5b84540985f0f11ac','2019-10-25 09:17:17'),(1113,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"1abcb112fc67570a57af4e60ee31153c\",\"_h_checkbox-839\":\"\",\"text-839\":\"3CHshBltuTFlPiwPpJwv3Bwt9MomJqhn\",\"number-839\":\"1954011101\",\"date-839\":\"01.01.2188\",\"datetime-839\":\"02.02.2188 01:08\",\"decimal-839\":\"12.84\",\"enum-839\":\"first option\",\"radio-839\":\"option a\",\"dynamicUpdate-839\":\"\",\"pill_text-839\":\"\",\"file-839\":\"5db2bd9e4e93f\",\"_sipForTypo3Vars\":\"5db2bd9e4ea19\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"839\",\"s\":\"5db2bd9d65cd4\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=839\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,839,1,'be32ca051ff7c5a5b84540985f0f11ac','2019-10-25 09:17:19'),(1114,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"F7trxmsFFm0ee3i1H8q572Uusxvuu6l9\",\"number-0\":\"302058627\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"dynamicUpdate-0\":\"\",\"pill_text-0\":\"EN0hxJBPH89D1EIgwJfFQuwnmnyXk2z3\",\"file-0\":\"5db2bda0ccaad\",\"_sipForTypo3Vars\":\"5db2bd96f0205\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db2bd96209a5\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,0,3,'be32ca051ff7c5a5b84540985f0f11ac','2019-10-25 09:17:23'),(1115,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"UD9YYBS8EXsHLH0h8zf1GDx9secih7Ch\",\"number-0\":\"1235737092\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option c\",\"dynamicUpdate-0\":\"QV0jxlfp340CD3SZyBx81qb9GQMpdfuA\",\"pill_text-0\":\"\",\"file-0\":\"5db2bdab1a232\",\"_sipForTypo3Vars\":\"5db2bd96f0205\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db2bd96209a5\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,0,3,'be32ca051ff7c5a5b84540985f0f11ac','2019-10-25 09:17:33'),(1116,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"tI27f5TmessXiLhDr1uIpFJzqFyKURi9\",\"number-0\":\"2040134016\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"dynamicUpdate-0\":\"\",\"pill_text-0\":\"\",\"file-0\":\"5db2bdaf5b1e2\",\"_sipForTypo3Vars\":\"5db2bd96f0205\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db2bd96209a5\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,0,3,'be32ca051ff7c5a5b84540985f0f11ac','2019-10-25 09:17:37'),(1117,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"ZFbuGui9hTjcDaHiTDpUNVsNUA8TbGOY\",\"number-0\":\"1056174266\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"dynamicUpdate-0\":\"\",\"pill_text-0\":\"\",\"file-0\":\"5db2bdb3282ba\",\"_sipForTypo3Vars\":\"5db2bd96f0205\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db2bd96209a5\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,0,3,'be32ca051ff7c5a5b84540985f0f11ac','2019-10-25 09:17:43'),(1118,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"I0jUr0fC3GD7UosHMU7ZdxEzXkkXaHDu\",\"number-0\":\"199223223\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"dynamicUpdate-0\":\"\",\"pill_text-0\":\"\",\"file-0\":\"5db2bdb9068c3\",\"_sipForTypo3Vars\":\"5db2bd96f0205\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db2bd96209a5\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,0,3,'be32ca051ff7c5a5b84540985f0f11ac','2019-10-25 09:17:49'),(1119,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"IpyB86avoI8OwFNN25vtBzAFOxvZPhN1\",\"number-0\":\"492193886\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"dynamicUpdate-0\":\"\",\"pill_text-0\":\"\",\"file-0\":\"5db2becfa09b7\",\"_sipForTypo3Vars\":\"5db2bece4a1ae\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db2becd5310d\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.70 Safari/537.36',1007,0,3,'3e228a58858fac6a7803927f11b787e3','2019-10-25 09:22:25'),(1120,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"3Up5IcAFR6DoiHQkmUIRNdQN5cNZWjlS\",\"number-0\":\"798880884\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"dynamicUpdate-0\":\"\",\"pill_text-0\":\"\",\"file-0\":\"5db2bed3f2726\",\"_sipForTypo3Vars\":\"5db2bece4a1ae\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db2becd5310d\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.70 Safari/537.36',1007,0,3,'3e228a58858fac6a7803927f11b787e3','2019-10-25 09:22:30'),(1121,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"FwXps2qATnT5gub8D1PyKdHMIFEry8Zo\",\"number-0\":\"506592940\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"dynamicUpdate-0\":\"\",\"pill_text-0\":\"\",\"file-0\":\"5db2bf4cc6698\",\"_sipForTypo3Vars\":\"5db2bf4b61815\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db2bf4a42639\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.70 Safari/537.36',1007,0,3,'4450cbf143eb8079c1c9a7af1a7e3a89','2019-10-25 09:24:30'),(1122,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"7szVEjk1yjY68d7aboZ4AgWv2Kl4ZNWO\",\"number-0\":\"67828448\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"dynamicUpdate-0\":\"\",\"pill_text-0\":\"\",\"file-0\":\"5db2bf50f0132\",\"_sipForTypo3Vars\":\"5db2bf4b61815\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db2bf4a42639\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.70 Safari/537.36',1007,0,3,'4450cbf143eb8079c1c9a7af1a7e3a89','2019-10-25 09:24:35'),(1123,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"749QBTdzTS5h6vJKpczkXVVRYgnvC0AG\",\"number-0\":\"1507473946\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"dynamicUpdate-0\":\"\",\"pill_text-0\":\"\",\"file-0\":\"5db2bf6fadcad\",\"_sipForTypo3Vars\":\"5db2bf6e59730\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db2bf6d2c748\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.70 Safari/537.36',1007,0,3,'73b064f65150c1b7e08d7c004ada49a8','2019-10-25 09:25:05'),(1124,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"8FrnwQJzfCT5dfmQBsuetLtMW3VT3FFd\",\"number-0\":\"1560789564\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"dynamicUpdate-0\":\"\",\"pill_text-0\":\"\",\"file-0\":\"5db2bf7457670\",\"_sipForTypo3Vars\":\"5db2bf6e59730\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db2bf6d2c748\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.70 Safari/537.36',1007,0,3,'73b064f65150c1b7e08d7c004ada49a8','2019-10-25 09:25:10'),(1125,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"e547970d9ae050655897963430933492\",\"_h_checkbox-850\":\"\",\"text-850\":\"CwdTWrcYhZQu9TA7fwlMGkuZizDKWrvn\",\"number-850\":\"1836677570\",\"date-850\":\"01.01.2188\",\"datetime-850\":\"02.02.2188 01:08\",\"decimal-850\":\"12.84\",\"enum-850\":\"first option\",\"radio-850\":\"option a\",\"dynamicUpdate-850\":\"\",\"pill_text-850\":\"\",\"file-850\":\"5db2bf77d0e27\",\"_sipForTypo3Vars\":\"5db2bf77d0f78\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"850\",\"s\":\"5db2bf769827e\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=850\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.70 Safari/537.36',1007,850,1,'73b064f65150c1b7e08d7c004ada49a8','2019-10-25 09:25:13'),(1126,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"yjiZ7i0vxPRSr0mEzbMG4HohrVajYFXy\",\"number-0\":\"1407796879\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"dynamicUpdate-0\":\"\",\"pill_text-0\":\"h24wAIazGtAQk3kRKvNC2paf2eOtKrzh\",\"file-0\":\"5db2bf7b8de1f\",\"_sipForTypo3Vars\":\"5db2bf6e59730\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db2bf6d2c748\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.70 Safari/537.36',1007,0,3,'73b064f65150c1b7e08d7c004ada49a8','2019-10-25 09:25:18'),(1127,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"PnUq9zRpVVY2TLYb8xNVeK2K0dq6jhgo\",\"number-0\":\"36163677\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"dynamicUpdate-0\":\"\",\"pill_text-0\":\"\",\"file-0\":\"5db2bfb568b88\",\"_sipForTypo3Vars\":\"5db2bfb414069\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db2bfb2f12f3\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.70 Safari/537.36',1007,0,3,'5c07bdc848e146f86571a5c861a3ecc0','2019-10-25 09:26:15'),(1128,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"sgIbc26Bu6kTCXQVrYQthjpXjQ3kUbpx\",\"number-0\":\"153862213\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"dynamicUpdate-0\":\"\",\"pill_text-0\":\"\",\"file-0\":\"5db2c204e5fb7\",\"_sipForTypo3Vars\":\"5db2c204006da\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db2c202d795a\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,0,3,'74a4619f2241a48e6f77959886f442a8','2019-10-25 09:36:06'),(1129,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"t6wMgneUbyVGFjjfNwAJ1yc0ka22q3B7\",\"number-0\":\"2100397537\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"dynamicUpdate-0\":\"\",\"pill_text-0\":\"\",\"file-0\":\"5db2c2088cc92\",\"_sipForTypo3Vars\":\"5db2c204006da\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db2c202d795a\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,0,3,'74a4619f2241a48e6f77959886f442a8','2019-10-25 09:36:10'),(1130,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"ade36304ff75ab81cca8cfab521f8e79\",\"_h_checkbox-854\":\"\",\"text-854\":\"FslWnei7yLN9zRCZ7ef3g9Dnnh7yR23a\",\"number-854\":\"1995214479\",\"date-854\":\"01.01.2188\",\"datetime-854\":\"02.02.2188 01:08\",\"decimal-854\":\"12.84\",\"enum-854\":\"first option\",\"radio-854\":\"option a\",\"dynamicUpdate-854\":\"\",\"pill_text-854\":\"\",\"file-854\":\"5db2c20b6865d\",\"_sipForTypo3Vars\":\"5db2c20b68730\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"854\",\"s\":\"5db2c20a8e9a1\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=854\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,854,1,'74a4619f2241a48e6f77959886f442a8','2019-10-25 09:36:12'),(1131,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"9l4BG4iRD61icc2PkXJEa7dwPK2jknPp\",\"number-0\":\"2001241694\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"dynamicUpdate-0\":\"\",\"pill_text-0\":\"n5tdEXc61CuMgeCu0tKiVvPo2SC3pTYf\",\"file-0\":\"5db2c20e070f4\",\"_sipForTypo3Vars\":\"5db2c204006da\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db2c202d795a\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,0,3,'74a4619f2241a48e6f77959886f442a8','2019-10-25 09:36:16'),(1132,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"t0k1550oku6c41mrGrvW71HBYPkjSka0\",\"number-0\":\"1492761385\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option c\",\"dynamicUpdate-0\":\"1qumwhqfioJOestcOryLG44E9FzPdPTm\",\"pill_text-0\":\"\",\"file-0\":\"5db2c218ce6c0\",\"_sipForTypo3Vars\":\"5db2c204006da\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db2c202d795a\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,0,3,'74a4619f2241a48e6f77959886f442a8','2019-10-25 09:36:27'),(1133,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"RkcKthq1KkdLGcrXkNagU4AjgSDdHt6e\",\"number-0\":\"1806536998\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"dynamicUpdate-0\":\"\",\"pill_text-0\":\"\",\"file-0\":\"5db2c21d0c641\",\"_sipForTypo3Vars\":\"5db2c204006da\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db2c202d795a\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,0,3,'74a4619f2241a48e6f77959886f442a8','2019-10-25 09:36:31'),(1134,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"o3BMECgUbXbPfBXze8z01f3e89PghgWz\",\"number-0\":\"1680294318\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"dynamicUpdate-0\":\"\",\"pill_text-0\":\"\",\"file-0\":\"5db2c220d90b0\",\"_sipForTypo3Vars\":\"5db2c204006da\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db2c202d795a\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,0,3,'74a4619f2241a48e6f77959886f442a8','2019-10-25 09:36:37'),(1135,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"eg88AtoJNB39fm2k633fx0zfB69WNzlw\",\"number-0\":\"900708641\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"dynamicUpdate-0\":\"\",\"pill_text-0\":\"\",\"file-0\":\"5db2c226c750c\",\"_sipForTypo3Vars\":\"5db2c204006da\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db2c202d795a\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,0,3,'74a4619f2241a48e6f77959886f442a8','2019-10-25 09:36:43'),(1136,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"IW8kowMk3rmKXk9AHVO7eSFVdqG0toMN\",\"number-0\":\"1454398433\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"dynamicUpdate-0\":\"\",\"pill_text-0\":\"\",\"file-0\":\"5db2f13446198\",\"_sipForTypo3Vars\":\"5db2f1336ed3e\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db2f1327dc5e\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,0,3,'2ff8a4707048baa5c773bf6e70b2cc6e','2019-10-25 12:57:26'),(1137,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"OWewi7hNdWko2Dq9Ur5TjxAgpeaYn8RP\",\"number-0\":\"1423074730\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"dynamicUpdate-0\":\"\",\"pill_text-0\":\"\",\"file-0\":\"5db2f137ef5e3\",\"_sipForTypo3Vars\":\"5db2f1336ed3e\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db2f1327dc5e\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,0,3,'2ff8a4707048baa5c773bf6e70b2cc6e','2019-10-25 12:57:30'),(1138,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"fac49c680c541d94d3d0de25689e27c9\",\"_h_checkbox-861\":\"\",\"text-861\":\"sgWBDy5PHr4X1kWehhaW03p02zg9KciD\",\"number-861\":\"581581462\",\"date-861\":\"01.01.2188\",\"datetime-861\":\"02.02.2188 01:08\",\"decimal-861\":\"12.84\",\"enum-861\":\"first option\",\"radio-861\":\"option a\",\"dynamicUpdate-861\":\"\",\"pill_text-861\":\"\",\"file-861\":\"5db2f13ac080b\",\"_sipForTypo3Vars\":\"5db2f13ac08d9\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"861\",\"s\":\"5db2f13a02eed\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=861\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,861,1,'2ff8a4707048baa5c773bf6e70b2cc6e','2019-10-25 12:57:32'),(1139,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"3JWDFEHtFdPJPs1fGsbmexerg0OrK9W1\",\"number-0\":\"663171418\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"dynamicUpdate-0\":\"\",\"pill_text-0\":\"6VnLRig88MJoE48LjTyhH6b8qbFpXhsg\",\"file-0\":\"5db2f13d49b8f\",\"_sipForTypo3Vars\":\"5db2f1336ed3e\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db2f1327dc5e\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,0,3,'2ff8a4707048baa5c773bf6e70b2cc6e','2019-10-25 12:57:36'),(1140,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"tpv8DD6F2lzieV934SA20lg5xmNNkVfz\",\"number-0\":\"1083542115\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option c\",\"dynamicUpdate-0\":\"xeFuk7QnFa40WcqGUr477MXWQUEZa3nM\",\"pill_text-0\":\"\",\"file-0\":\"5db2f147b97d5\",\"_sipForTypo3Vars\":\"5db2f1336ed3e\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db2f1327dc5e\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,0,3,'2ff8a4707048baa5c773bf6e70b2cc6e','2019-10-25 12:57:46'),(1141,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"DrgxJl34YssNO3NSgo0C04NtHxw0HWZQ\",\"number-0\":\"587252290\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"dynamicUpdate-0\":\"\",\"pill_text-0\":\"\",\"file-0\":\"5db2f14c6d61c\",\"_sipForTypo3Vars\":\"5db2f1336ed3e\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db2f1327dc5e\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,0,3,'2ff8a4707048baa5c773bf6e70b2cc6e','2019-10-25 12:57:50'),(1142,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"HfLC9K1SLHcTWp3Hd4ttcAq7MpudjRsY\",\"number-0\":\"2026221684\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"dynamicUpdate-0\":\"\",\"pill_text-0\":\"\",\"file-0\":\"5db2f1505bd6b\",\"_sipForTypo3Vars\":\"5db2f1336ed3e\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db2f1327dc5e\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,0,3,'2ff8a4707048baa5c773bf6e70b2cc6e','2019-10-25 12:57:56'),(1143,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"xh9yHK6Yf2XsWYFP6Wp7kY6vL34bY3eU\",\"number-0\":\"306800633\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"dynamicUpdate-0\":\"\",\"pill_text-0\":\"\",\"file-0\":\"5db2f1562128b\",\"_sipForTypo3Vars\":\"5db2f1336ed3e\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db2f1327dc5e\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36',1007,0,3,'2ff8a4707048baa5c773bf6e70b2cc6e','2019-10-25 12:58:02'),(1144,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"C7b0kA2ArlBodepZOLzKXBulWmDwK2Rx\",\"number-0\":\"2071867781\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"dynamicUpdate-0\":\"\",\"pill_text-0\":\"\",\"file-0\":\"5db2f17e61304\",\"_sipForTypo3Vars\":\"5db2f17b2db6b\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db2f179cb3bd\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.70 Safari/537.36',1007,0,3,'15c908d7cfa6fcf3f09bf474434f16ef','2019-10-25 12:58:46'),(1145,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"yXQOcxQfmJa28uaZup8pdRuw1v6oCF1e\",\"number-0\":\"1537991152\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"dynamicUpdate-0\":\"\",\"pill_text-0\":\"\",\"file-0\":\"5db2f18ac3eac\",\"_sipForTypo3Vars\":\"5db2f17b2db6b\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db2f179cb3bd\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.70 Safari/537.36',1007,0,3,'15c908d7cfa6fcf3f09bf474434f16ef','2019-10-25 12:58:58'),(1146,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"c52b906366c8bca8dd1aa406b09438f8\",\"_h_checkbox-868\":\"\",\"text-868\":\"xOCzM8FrWwDb8QWqoiCkTakm1024Hs6L\",\"number-868\":\"1981439320\",\"date-868\":\"01.01.2188\",\"datetime-868\":\"02.02.2188 01:08\",\"decimal-868\":\"12.84\",\"enum-868\":\"first option\",\"radio-868\":\"option a\",\"dynamicUpdate-868\":\"\",\"pill_text-868\":\"\",\"file-868\":\"5db2f194bda80\",\"_sipForTypo3Vars\":\"5db2f194bdb55\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"868\",\"s\":\"5db2f19284e5c\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=868\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.70 Safari/537.36',1007,868,1,'15c908d7cfa6fcf3f09bf474434f16ef','2019-10-25 12:59:05'),(1147,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"OwETiRFil7ZIcO9du5VkUIcTk40856sL\",\"number-0\":\"1804108722\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"dynamicUpdate-0\":\"\",\"pill_text-0\":\"PkoOfIw0biT1KjY4BIoDqzpb9TyeJCpZ\",\"file-0\":\"5db2f19ddb0a8\",\"_sipForTypo3Vars\":\"5db2f17b2db6b\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db2f179cb3bd\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.70 Safari/537.36',1007,0,3,'15c908d7cfa6fcf3f09bf474434f16ef','2019-10-25 12:59:20'),(1148,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"dxiGffWS0uiSUlcuxXc1gNunHokWAoBg\",\"number-0\":\"2007056453\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"dynamicUpdate-0\":\"\",\"pill_text-0\":\"\",\"file-0\":\"5db2fd987718d\",\"_sipForTypo3Vars\":\"5db2fd95d0836\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db2fd946271a\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.70 Safari/537.36',1007,0,3,'321b421380e110e77c3e80f114d1ee4a','2019-10-25 13:50:22'),(1149,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"CeqnTn4PjJHik2PgXd0MXtW2JgPsFAMb\",\"number-0\":\"188818915\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"dynamicUpdate-0\":\"\",\"pill_text-0\":\"\",\"file-0\":\"5db2fda205597\",\"_sipForTypo3Vars\":\"5db2fd95d0836\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db2fd946271a\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.70 Safari/537.36',1007,0,3,'321b421380e110e77c3e80f114d1ee4a','2019-10-25 13:50:31'),(1150,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"7aa135e929d49ec0806953b12c1aeb00\",\"_h_checkbox-871\":\"\",\"text-871\":\"lgbjxiqKPdC150wc3Y55xYDPnnOwDM3O\",\"number-871\":\"1748841308\",\"date-871\":\"01.01.2188\",\"datetime-871\":\"02.02.2188 01:08\",\"decimal-871\":\"12.84\",\"enum-871\":\"first option\",\"radio-871\":\"option a\",\"dynamicUpdate-871\":\"\",\"pill_text-871\":\"\",\"file-871\":\"5db2fda984cba\",\"_sipForTypo3Vars\":\"5db2fda984d9f\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"871\",\"s\":\"5db2fda7c7057\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=871\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.70 Safari/537.36',1007,871,1,'321b421380e110e77c3e80f114d1ee4a','2019-10-25 13:50:36'),(1151,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"G4D3qiLpst6nhJEeYJAonytJRa7vdKKH\",\"number-0\":\"379040467\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"dynamicUpdate-0\":\"\",\"pill_text-0\":\"2hIRugfl0SxhIokJne6Ay7Np105h80iS\",\"file-0\":\"5db2fdb05f8b1\",\"_sipForTypo3Vars\":\"5db2fd95d0836\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db2fd946271a\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.70 Safari/537.36',1007,0,3,'321b421380e110e77c3e80f114d1ee4a','2019-10-25 13:50:47'),(1152,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"DxzRVNsbmtpEbFUup1PL6dxbogjpGifc\",\"number-0\":\"2007726345\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option c\",\"dynamicUpdate-0\":\"pfHDqM4hnhTnsooCDSW3PiOi5E8pRRfX\",\"pill_text-0\":\"\",\"file-0\":\"5db2fdc4ee6ce\",\"_sipForTypo3Vars\":\"5db2fd95d0836\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db2fd946271a\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.70 Safari/537.36',1007,0,3,'321b421380e110e77c3e80f114d1ee4a','2019-10-25 13:51:08'),(1153,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"rOUue3Tm2a67CUypan5pD1zsPE6rCTQU\",\"number-0\":\"1705028554\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"dynamicUpdate-0\":\"\",\"pill_text-0\":\"\",\"file-0\":\"5db2fdcfa65ab\",\"_sipForTypo3Vars\":\"5db2fd95d0836\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db2fd946271a\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.70 Safari/537.36',1007,0,3,'321b421380e110e77c3e80f114d1ee4a','2019-10-25 13:51:18'),(1154,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"u0yxpaxpqdfldfcxTD2xepwpOyPWpR0P\",\"number-0\":\"970939364\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"dynamicUpdate-0\":\"\",\"pill_text-0\":\"\",\"file-0\":\"5db2fdd9a67fd\",\"_sipForTypo3Vars\":\"5db2fd95d0836\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db2fd946271a\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.70 Safari/537.36',1007,0,3,'321b421380e110e77c3e80f114d1ee4a','2019-10-25 13:51:31'),(1155,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"_h_checkbox-0\":\"\",\"text-0\":\"fiNBv9JUiQuMrw1yx391OchtsodlWJR5\",\"number-0\":\"2034695011\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"dynamicUpdate-0\":\"\",\"pill_text-0\":\"\",\"file-0\":\"5db2fde63761a\",\"_sipForTypo3Vars\":\"5db2fd95d0836\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5db2fd946271a\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','192.168.133.203','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.70 Safari/537.36',1007,0,3,'321b421380e110e77c3e80f114d1ee4a','2019-10-25 13:51:43'),(1156,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"text-0\":\"DPHKnp1gXBqZfBxIQcE4erCOZmOugVdo\",\"number-0\":\"2081111706\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"dynamicUpdate-0\":\"\",\"pill_text-0\":\"\",\"file-0\":\"5de51acd4161d\",\"_sipForTypo3Vars\":\"5de51acbb9f9c\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5de51aca88ee5\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','172.17.0.1','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.108 Safari/537.36',1007,0,3,'a94eb7a561a45be38a7122bd824eaa4c','2019-12-02 14:08:15'),(1157,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"text-0\":\"XDzJBOuIqsZtRpTEcy876IXSHGYk49y1\",\"number-0\":\"934772150\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"dynamicUpdate-0\":\"\",\"pill_text-0\":\"\",\"file-0\":\"5de51ad1c633f\",\"_sipForTypo3Vars\":\"5de51acbb9f9c\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5de51aca88ee5\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','172.17.0.1','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.108 Safari/537.36',1007,0,3,'a94eb7a561a45be38a7122bd824eaa4c','2019-12-02 14:08:20'),(1158,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"38c8c4f440b34ba0c8ca994cc27091b8\",\"text-878\":\"AHGtBgN8rYVtOnyNpa07HgpWWXv0euOV\",\"number-878\":\"1344216551\",\"date-878\":\"01.01.2188\",\"datetime-878\":\"02.02.2188 01:08\",\"decimal-878\":\"12.84\",\"enum-878\":\"first option\",\"radio-878\":\"option a\",\"dynamicUpdate-878\":\"\",\"pill_text-878\":\"\",\"file-878\":\"5de51ad558374\",\"_sipForTypo3Vars\":\"5de51ad558478\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"878\",\"s\":\"5de51ad40ad8d\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=878\"}','172.17.0.1','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.108 Safari/537.36',1007,878,1,'a94eb7a561a45be38a7122bd824eaa4c','2019-12-02 14:08:22'),(1159,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"text-0\":\"qGMxSGlxcsmjZcPUTVEj63ZNlvIh6Qi2\",\"number-0\":\"1609586651\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"dynamicUpdate-0\":\"\",\"pill_text-0\":\"xx9nH4q8uO0rdC8O6P4OJNldwUnp0j9s\",\"file-0\":\"5de51ad8ad189\",\"_sipForTypo3Vars\":\"5de51acbb9f9c\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5de51aca88ee5\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','172.17.0.1','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.108 Safari/537.36',1007,0,3,'a94eb7a561a45be38a7122bd824eaa4c','2019-12-02 14:08:27'),(1160,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"text-0\":\"zqgRWmIrbGkD6ye8UvIwk5loklQfTkm1\",\"number-0\":\"1289743070\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option c\",\"dynamicUpdate-0\":\"5THNebnagYRGFuUtInLHg2E99TKcKarD\",\"pill_text-0\":\"\",\"file-0\":\"5de51ae48b02a\",\"_sipForTypo3Vars\":\"5de51acbb9f9c\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5de51aca88ee5\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','172.17.0.1','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.108 Safari/537.36',1007,0,3,'a94eb7a561a45be38a7122bd824eaa4c','2019-12-02 14:08:39'),(1161,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"text-0\":\"xCNs5HL6QCaIdW6kjBsFGwORyLmMV0UL\",\"number-0\":\"136009797\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"dynamicUpdate-0\":\"\",\"pill_text-0\":\"\",\"file-0\":\"5de51ae9ec3bf\",\"_sipForTypo3Vars\":\"5de51acbb9f9c\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5de51aca88ee5\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','172.17.0.1','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.108 Safari/537.36',1007,0,3,'a94eb7a561a45be38a7122bd824eaa4c','2019-12-02 14:08:44'),(1162,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"text-0\":\"RZORHlurqakKKAviraRB8UZWhaa498tE\",\"number-0\":\"1697839314\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"dynamicUpdate-0\":\"\",\"pill_text-0\":\"\",\"file-0\":\"5de51aeed9ee5\",\"_sipForTypo3Vars\":\"5de51acbb9f9c\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5de51aca88ee5\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','172.17.0.1','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.108 Safari/537.36',1007,0,3,'a94eb7a561a45be38a7122bd824eaa4c','2019-12-02 14:08:51'),(1163,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"text-0\":\"ILNYswnvsQEd0GNCUcjY8rkGykuL4I0z\",\"number-0\":\"1143717108\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"dynamicUpdate-0\":\"\",\"pill_text-0\":\"\",\"file-0\":\"5de51af5bec5a\",\"_sipForTypo3Vars\":\"5de51acbb9f9c\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5de51aca88ee5\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','172.17.0.1','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.108 Safari/537.36',1007,0,3,'a94eb7a561a45be38a7122bd824eaa4c','2019-12-02 14:08:58'),(1164,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"text-0\":\"s8v3EgyDOTTIcXxCvi6uOtmUU0pKiWiU\",\"number-0\":\"262033345\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"dynamicUpdate-0\":\"\",\"pill_text-0\":\"\",\"file-0\":\"5de64d2a406ff\",\"_sipForTypo3Vars\":\"5de64d290b0fc\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5de64d27e5c5c\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','172.17.0.1','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.108 Safari/537.36',1007,0,3,'2bea1b4028fb2adf4fce1eb7ea3dfb92','2019-12-03 11:55:24'),(1165,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"text-0\":\"mRPiOtVPYTGiWyIMgdpxV74KSXKeZQ8T\",\"number-0\":\"2075314543\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"dynamicUpdate-0\":\"\",\"pill_text-0\":\"\",\"file-0\":\"5de64d2ea63c2\",\"_sipForTypo3Vars\":\"5de64d290b0fc\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5de64d27e5c5c\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','172.17.0.1','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.108 Safari/537.36',1007,0,3,'2bea1b4028fb2adf4fce1eb7ea3dfb92','2019-12-03 11:55:28'),(1166,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"b15ceeeeb18b262a32d90282c75c1f8f\",\"text-885\":\"V3ZXSxy5tSGI6QDk5uNinnVUcnJUUotP\",\"number-885\":\"1390774873\",\"date-885\":\"01.01.2188\",\"datetime-885\":\"02.02.2188 01:08\",\"decimal-885\":\"12.84\",\"enum-885\":\"first option\",\"radio-885\":\"option a\",\"dynamicUpdate-885\":\"\",\"pill_text-885\":\"\",\"file-885\":\"5de64d3203f19\",\"_sipForTypo3Vars\":\"5de64d320407b\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"885\",\"s\":\"5de64d30e27dc\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=885\"}','172.17.0.1','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.108 Safari/537.36',1007,885,1,'2bea1b4028fb2adf4fce1eb7ea3dfb92','2019-12-03 11:55:31'),(1167,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"text-0\":\"IpRbOPzK4ivjCjwpxH9OSJPdYepV7Nrf\",\"number-0\":\"975988708\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"dynamicUpdate-0\":\"\",\"pill_text-0\":\"4EhTSWuCR9DYx5VQvM1StzljMZZsrAYb\",\"file-0\":\"5de64d34ee061\",\"_sipForTypo3Vars\":\"5de64d290b0fc\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5de64d27e5c5c\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','172.17.0.1','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.108 Safari/537.36',1007,0,3,'2bea1b4028fb2adf4fce1eb7ea3dfb92','2019-12-03 11:55:35'),(1168,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"text-0\":\"ftxVOpLI3QXa166VmJStFeB2VPelTGeA\",\"number-0\":\"1492379361\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option c\",\"dynamicUpdate-0\":\"GqNSAdQ8X5mGzCitqZLKLlaLC6WZvTD5\",\"pill_text-0\":\"\",\"file-0\":\"5de64d401db9d\",\"_sipForTypo3Vars\":\"5de64d290b0fc\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5de64d27e5c5c\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','172.17.0.1','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.108 Safari/537.36',1007,0,3,'2bea1b4028fb2adf4fce1eb7ea3dfb92','2019-12-03 11:55:47'),(1169,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"text-0\":\"WYoeq93PX7wVrc0DB4LZS6dUzxkCZVjQ\",\"number-0\":\"1723408443\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"dynamicUpdate-0\":\"\",\"pill_text-0\":\"\",\"file-0\":\"5de64d44db79a\",\"_sipForTypo3Vars\":\"5de64d290b0fc\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5de64d27e5c5c\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','172.17.0.1','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.108 Safari/537.36',1007,0,3,'2bea1b4028fb2adf4fce1eb7ea3dfb92','2019-12-03 11:55:51'),(1170,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"text-0\":\"u0wZCFSoKZR0TdId7xSom2L88dyIxp9P\",\"number-0\":\"2105203659\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"dynamicUpdate-0\":\"\",\"pill_text-0\":\"\",\"file-0\":\"5de64d496d8d4\",\"_sipForTypo3Vars\":\"5de64d290b0fc\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5de64d27e5c5c\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','172.17.0.1','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.108 Safari/537.36',1007,0,3,'2bea1b4028fb2adf4fce1eb7ea3dfb92','2019-12-03 11:55:58'),(1171,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"text-0\":\"ixnQ9O0tSxJlr8j11lxDR8wo3axtDqcX\",\"number-0\":\"1695443155\",\"date-0\":\"01.01.2188\",\"datetime-0\":\"02.02.2188 01:08:39\",\"decimal-0\":\"12.84\",\"enum-0\":\"first option\",\"radio-0\":\"option a\",\"dynamicUpdate-0\":\"\",\"pill_text-0\":\"\",\"file-0\":\"5de64d50009eb\",\"_sipForTypo3Vars\":\"5de64d290b0fc\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5de64d27e5c5c\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','172.17.0.1','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.108 Safari/537.36',1007,0,3,'2bea1b4028fb2adf4fce1eb7ea3dfb92','2019-12-03 11:56:04'),(1172,'{\"email\":\"\",\"username\":\"\",\"password\":\"\",\"recordHashMd5\":\"d41d8cd98f00b204e9800998ecf8427e\",\"text-0\":\"uu\",\"number-0\":\"787\",\"date-0\":\"1.1.01\",\"datetime-0\":\"1.1.01 11:11\",\"decimal-0\":\"1\",\"enum-0\":\"second option\",\"radio-0\":\"option a\",\"dynamicUpdate-0\":\"\",\"checkbox-0\":[\"2\"],\"pill_text-0\":\"\",\"file-0\":\"5de64ecf77122\",\"_sipForTypo3Vars\":\"5de64ecf77234\"}','{\"__dbIndexData\":\"1\",\"form\":\"basicForm\",\"r\":\"0\",\"s\":\"5de64eaab946a\",\"urlparam\":\"__dbIndexData=1&form=basicForm&r=0\"}','172.17.0.1','','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36 OPR/64.0.3417.92',1007,0,3,'00911ce84f20dd17f7dc5f1c5e457ebb','2019-12-03 12:03:52'); /*!40000 ALTER TABLE `FormSubmitLog` ENABLE KEYS */; UNLOCK TABLES; -- GitLab From 3a84ac5e979c7af23e2f4ef1e77fc2e729f93b78 Mon Sep 17 00:00:00 2001 From: Marc Egger <marc.egger@uzh.ch> Date: Tue, 21 Jul 2020 16:59:06 +0200 Subject: [PATCH 049/195] Refs #10120 cleanup todo comments --- extension/Classes/Core/Form/FormAsFile.php | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/extension/Classes/Core/Form/FormAsFile.php b/extension/Classes/Core/Form/FormAsFile.php index 3d1d71170..9aaa28acc 100644 --- a/extension/Classes/Core/Form/FormAsFile.php +++ b/extension/Classes/Core/Form/FormAsFile.php @@ -9,7 +9,6 @@ use IMATHUZH\Qfq\Core\Helper\OnString; use IMATHUZH\Qfq\Core\Helper\SqlQuery; use IMATHUZH\Qfq\Core\Store\Store; -// TODO: Fix all broken tests... one easy solution? // TODO: Carsten Fragen: Habe keine Unittests zu QuickFormQuery->doForm gefunden. Wird nicht getestet. FormAsFile nicht testen oder vielleicht nur mit selenium? // TODO: Carsten Fragen: Form backups erstellen vor deleteFormFile und exportForm? // TODO: Carsten Fragen: "git rm" anstatt "rm" benutzen falls ordner ein git repo? Einziger unterschied: macht "git add" @@ -22,9 +21,10 @@ use IMATHUZH\Qfq\Core\Store\Store; // TODO: Carsten Fragen: PHP version von gitlab runner hochstellen, damit ?string und void type syntax fuer funktionen erlaubt ist? verhindert einige fehler // TODO: Carsten Fragen: Regex fuer erlaubte file names und form names im editor (+ erlauben?): ^([-\.\w]+)$ VS [a-zA-Z0-9._+-]+ // TODO: Carsten Fragen: Muss die neue Column fileStats von Form tabelle in DatabaseUpdateData.php? Form Editor wird ja sowieso neu eingespielt bei einem update. -// TODO: Carsten Fragen: add log messages somewhare? +// TODO: Carsten Fragen: add log messages somewhere? // TODO: BEFOORE PRUDUCTION + // TODO: Fix all broken tests // TODO: write tests (file test https://medium.com/weebly-engineering/phpunit-mocking-the-file-system-using-vfsstream-5d7d79b1eb2a) // TODO: Tests: // new form => form file created @@ -54,10 +54,6 @@ use IMATHUZH\Qfq\Core\Store\Store; // importAllForms() is executed iff the rendered QFQ report selects Form/FormElement table. // TODO: MAYBE - // TODO: Maybe: solve reference by ID after file change Problem (might not be a big deal since it only happens on git pull) - // Problem: FormEditor and form list might reference a form by an old id. In that case everything has to be reloaded. That's annoying. - // Variant 1: reference form by name in edit and delete button, not by id (only solver part of the problem) - // Variant 2: track old form ids and relay to new form automatically. Track old form ids in new Form column "oldIds" // TODO: Make unittest for isFormQuery(). Example string: //$sql = <<<END //SELECT CONCAT('p:{{pageId:T}}&form=form&r=', f.id) as _pagee, f.id, f.name, f.title, f.tableName, CONCAT('form=form&r=', f.id) as _Paged FROM where -- GitLab From f4cfb74ad625da0821a5fa2de3190b226afd896f Mon Sep 17 00:00:00 2001 From: megger <marc.egger@uzh.ch> Date: Wed, 22 Jul 2020 10:38:16 +0200 Subject: [PATCH 050/195] Refs #10120 add fileStats column to sql update and raise qfq version --- extension/Classes/Core/Database/DatabaseUpdate.php | 11 ++++++----- .../Classes/Core/Database/DatabaseUpdateData.php | 5 ++++- extension/ext_emconf.php | 2 +- 3 files changed, 11 insertions(+), 7 deletions(-) diff --git a/extension/Classes/Core/Database/DatabaseUpdate.php b/extension/Classes/Core/Database/DatabaseUpdate.php index 4e39c1166..3afff5b10 100644 --- a/extension/Classes/Core/Database/DatabaseUpdate.php +++ b/extension/Classes/Core/Database/DatabaseUpdate.php @@ -144,11 +144,6 @@ class DatabaseUpdate { if ($dbUpdate === SYSTEM_DB_UPDATE_ALWAYS || ($dbUpdate === SYSTEM_DB_UPDATE_AUTO && $new != $old)) { - if ($old !== false) { - // Import files from form path. (Creates path and exports all forms to it, if it doesn't exist) - FormAsFile::importAllForms($this->db, true, true); - } - $newFunctionHash = $this->updateSqlFunctions($versionInfo[QFQ_VERSION_KEY_FUNCTION_HASH] ?? ''); if (null !== $newFunctionHash) { $versionInfo[QFQ_VERSION_KEY_FUNCTION_HASH] = $newFunctionHash; @@ -156,6 +151,12 @@ class DatabaseUpdate { } $this->dbUpdateStatements($old, $new); + + if ($old !== false) { + // Import files from form path. (Creates path and exports all forms to it, if it doesn't exist) + FormAsFile::importAllForms($this->db, true, true); + } + $this->db->playSqlFile(__DIR__ . '/../../Sql/formEditor.sql'); $qfqLog = $this->db->getQfqLogFile(); diff --git a/extension/Classes/Core/Database/DatabaseUpdateData.php b/extension/Classes/Core/Database/DatabaseUpdateData.php index 1bbcb9f2e..faed4ae66 100644 --- a/extension/Classes/Core/Database/DatabaseUpdateData.php +++ b/extension/Classes/Core/Database/DatabaseUpdateData.php @@ -193,7 +193,10 @@ $UPDATE_ARRAY = array( "ALTER TABLE `FormElement` CHANGE `label` `label` VARCHAR(1023) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULT '';", ], - + '20.7.0' => [ + "ALTER TABLE `Form` ADD `fileStats` VARCHAR(255) NOT NULL DEFAULT '' AFTER `created`;", + ], + ); diff --git a/extension/ext_emconf.php b/extension/ext_emconf.php index d1c5b53c0..3c64e5d5b 100644 --- a/extension/ext_emconf.php +++ b/extension/ext_emconf.php @@ -12,7 +12,7 @@ $EM_CONF[$_EXTKEY] = array( 'dependencies' => 'fluid,extbase', 'clearcacheonload' => true, 'state' => 'stable', - 'version' => '20.4.1', + 'version' => '20.7.0', 'constraints' => [ 'depends' => [ 'typo3' => '7.0.0-9.2.99', -- GitLab From 6267461bc7b6ef5ebb40651eceb81ed298c23baf Mon Sep 17 00:00:00 2001 From: megger <marc.egger@uzh.ch> Date: Wed, 22 Jul 2020 10:58:14 +0200 Subject: [PATCH 051/195] Refs #10120 DatbaseUpdate.php: Move form as file code before version number update --- .../Classes/Core/Database/DatabaseUpdate.php | 21 ++++++++++--------- 1 file changed, 11 insertions(+), 10 deletions(-) diff --git a/extension/Classes/Core/Database/DatabaseUpdate.php b/extension/Classes/Core/Database/DatabaseUpdate.php index 3afff5b10..175541351 100644 --- a/extension/Classes/Core/Database/DatabaseUpdate.php +++ b/extension/Classes/Core/Database/DatabaseUpdate.php @@ -153,27 +153,28 @@ class DatabaseUpdate { $this->dbUpdateStatements($old, $new); if ($old !== false) { - // Import files from form path. (Creates path and exports all forms to it, if it doesn't exist) + // If Form table exists, import all form files so everything is up to date. + // Note: Creates path and exports all forms to it, if it doesn't exist FormAsFile::importAllForms($this->db, true, true); } $this->db->playSqlFile(__DIR__ . '/../../Sql/formEditor.sql'); - $qfqLog = $this->db->getQfqLogFile(); - Logger::logMessage(date('Y.m.d H:i:s ') . ": Updated from QFQ version '$old' to '$new'", $qfqLog); - - // Finally write the latest version number. - $versionInfo[QFQ_VERSION_KEY] = $new; - $this->setDatabaseVersion($versionInfo); - if ($old === false) { - // new installation: export native forms + import existing user forms + // new installation: export native qfq forms + import existing user forms FormAsFIle::exportAllForms($this->db, false); FormAsFile::importAllForms($this->db); } else { - // Export forms + delete files which were removed since the import above + // Existing installation: export forms + delete files which were removed since the import above FormAsFIle::exportAllForms($this->db, true); } + + $qfqLog = $this->db->getQfqLogFile(); + Logger::logMessage(date('Y.m.d H:i:s ') . ": Updated from QFQ version '$old' to '$new'", $qfqLog); + + // Finally write the latest version number. + $versionInfo[QFQ_VERSION_KEY] = $new; + $this->setDatabaseVersion($versionInfo); } if ($old === false) { -- GitLab From b5ea4b78261fa0e7c09b6abde7cf82464d57177a Mon Sep 17 00:00:00 2001 From: Marc Egger <marc.egger@uzh.ch> Date: Mon, 27 Jul 2020 10:31:09 +0200 Subject: [PATCH 052/195] Refs #10120 cleanup todo comments --- extension/Classes/Core/Form/FormAsFile.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/extension/Classes/Core/Form/FormAsFile.php b/extension/Classes/Core/Form/FormAsFile.php index 9aaa28acc..be036a240 100644 --- a/extension/Classes/Core/Form/FormAsFile.php +++ b/extension/Classes/Core/Form/FormAsFile.php @@ -15,13 +15,13 @@ use IMATHUZH\Qfq\Core\Store\Store; // TODO: Carsten Fragen: Form Copy ist broken. Aber jetzt auch unnötig, da man einfach die files kopieren kann. // TODO: Carsten Fragen: Koennte die column "lastImport" zu Form hinzufuegen. Dieser wird dann manuell zusammen mit "changed" beim import und export gesetzt. Mittels Left Join query mit den created columns von FormElement koennte man in importForm() feststellen, ob sich ein form geaendert hat und dieses expotieren, falls der fingerabdruck des files noch gleich ist. // TODO: Carsten Fragen: QFQ formulare haben id unter 1000 und user forms ueber 1000. Wird ein QFQ formular neu importiert, erhaelt es aber eine id ueber 1000. ist dies ein problem? -// TODO: Carsten Fragen: ZUERST NOCHMAL GENAU NACHTEILE PRUEFEN: In doForm koennte man auch einfach pauschal importAllForms(enforce writeable=true) und exportAllForms() machen, wenn der geladene record ein Form/Formelement ist. Bei vielen forms koennte es langsam sein. ansonsten sehe ich gerade keine klaren nachteile. // TODO: Carsten Fragen: Kann es sein, dass records in Dirty tabelle nicht mehr richtig abegraeumt werden, weil forms die ID wechseln? // TODO: Carsten Fragen: Exceptions werden teilweise ohne Developer message angezeigt (API). Deshalb habe ich die Message teilweise in User message getan. // TODO: Carsten Fragen: PHP version von gitlab runner hochstellen, damit ?string und void type syntax fuer funktionen erlaubt ist? verhindert einige fehler // TODO: Carsten Fragen: Regex fuer erlaubte file names und form names im editor (+ erlauben?): ^([-\.\w]+)$ VS [a-zA-Z0-9._+-]+ -// TODO: Carsten Fragen: Muss die neue Column fileStats von Form tabelle in DatabaseUpdateData.php? Form Editor wird ja sowieso neu eingespielt bei einem update. // TODO: Carsten Fragen: add log messages somewhere? +// TODO: Carsten Fragen: ZUERST NOCHMAL GENAU NACHTEILE PRUEFEN: In doForm koennte man auch einfach pauschal importAllForms(enforce writeable=true) und exportAllForms() machen, wenn der geladene record ein Form/Formelement ist. Bei vielen forms koennte es langsam sein. ansonsten sehe ich gerade keine klaren nachteile. + // TODO: BEFOORE PRUDUCTION // TODO: Fix all broken tests -- GitLab From 39fa2e75e358ca21e0ba1bdcdff4c186def97c29 Mon Sep 17 00:00:00 2001 From: Marc Egger <marc.egger@uzh.ch> Date: Mon, 27 Jul 2020 12:12:17 +0200 Subject: [PATCH 053/195] Refs #9600 add todos, parse file keyword --- extension/Classes/Core/QuickFormQuery.php | 22 +++++++++++++++ .../Classes/Core/Report/ReportAsFile.php | 28 +++++++++++++++++++ 2 files changed, 50 insertions(+) create mode 100644 extension/Classes/Core/Report/ReportAsFile.php diff --git a/extension/Classes/Core/QuickFormQuery.php b/extension/Classes/Core/QuickFormQuery.php index d1e3e114d..1829642c6 100644 --- a/extension/Classes/Core/QuickFormQuery.php +++ b/extension/Classes/Core/QuickFormQuery.php @@ -24,6 +24,7 @@ use IMATHUZH\Qfq\Core\Helper\OnArray; use IMATHUZH\Qfq\Core\Helper\Support; use IMATHUZH\Qfq\Core\Report\Monitor; use IMATHUZH\Qfq\Core\Report\Report; +use IMATHUZH\Qfq\Core\Report\ReportAsFile; use IMATHUZH\Qfq\Core\Store\FillStoreForm; use IMATHUZH\Qfq\Core\Store\Session; use IMATHUZH\Qfq\Core\Store\Sip; @@ -136,13 +137,32 @@ class QuickFormQuery { set_include_path(get_include_path() . PATH_SEPARATOR . '../../Resources/Private/Classes/'); if (!isset($t3data[T3DATA_BODYTEXT])) { + // TODO: ?CR: when does this happen? why no exception thrown? $t3data[T3DATA_BODYTEXT] = ''; } if (!isset($t3data[T3DATA_UID])) { + // TODO: ?CR: when does this happen? why no exception thrown? $t3data[T3DATA_UID] = 0; } + /////// DEBUG ///////// + preg_match('/^\s*file\s*=\s*(.+)\/([^\/\s]+)/m', $t3data[T3DATA_BODYTEXT], $matches); + throw new \UserFormException(json_encode([ + ERROR_MESSAGE_TO_USER => json_encode(ReportAsFile::parseFileKeyword($t3data[T3DATA_BODYTEXT]), JSON_PRETTY_PRINT), + ERROR_MESSAGE_TO_DEVELOPER => json_encode($matches, JSON_PRETTY_PRINT) + ])); + /////////////////////// + + // TODO: find keyword file=<path> (regex ^file=[path]$) + // TODO: if keyword 'file' does not exist: + // read page path of tt-content element + // create path in filesystem if not exists + // create file with content bodytext. Filename: header slugg if exists, uid if not. + // replace tt-content bodytext with file=<path> + // TODO: read file. If not exists, throw exception. + // TODO: set bodytext to file content. + $btp = new BodytextParser(); $t3data[T3DATA_BODYTEXT_RAW] = $t3data[T3DATA_BODYTEXT]; $t3data[T3DATA_BODYTEXT] = $btp->process($t3data[T3DATA_BODYTEXT]); @@ -1720,6 +1740,7 @@ class QuickFormQuery { * @throws \UserFormException */ private function buildInlineReport() { + // TODO: replace $uid with file path $uid = $this->t3data[T3DATA_UID]; $bodytext = $this->t3data[T3DATA_BODYTEXT_RAW]; $header = $this->t3data[T3DATA_HEADER]; @@ -1763,6 +1784,7 @@ class QuickFormQuery { * @throws \UserFormException */ public function saveReport() { + // TODO: replace $uid with file path $uid = $this->store->getVar(T3DATA_UID, STORE_SIP . STORE_ZERO, SANITIZE_ALLOW_DIGIT); if ($uid == 0) { // Check if it was called with a SIP (containing a uid) diff --git a/extension/Classes/Core/Report/ReportAsFile.php b/extension/Classes/Core/Report/ReportAsFile.php new file mode 100644 index 000000000..9bcb2d079 --- /dev/null +++ b/extension/Classes/Core/Report/ReportAsFile.php @@ -0,0 +1,28 @@ +<?php + +// TODO: QuickFormQuery.php: edit saveReport() such that it saves to file instead of DB. Search T3DATA_UID + // pass the file path instead of uid in sip. Escape could be a problem. Example: Search KeyValueStringParser::unparse($t3varsArray +// TODO: Add filename to Report Editor. Search T3DATA_HEADER + +// TODO: ?CR: QuickFormQuery.php L138: Why fallback $t3data[T3DATA_UID] = 0; and $t3data[T3DATA_BODYTEXT] = ''; ? When does this happen? + +namespace IMATHUZH\Qfq\Core\Report; + + +class ReportAsFile +{ + /** + * Finds the keyword file=<path> and returns path and filename. + * + * @param string $bodyText + * @return array|null [path, filename] + */ + public static function parseFileKeyword(string $bodyText): ?array + { + if (preg_match('/^\s*file\s*=\s*(.+)\/([^\/\s]+)/m', $bodyText, $matches)) { + return [$matches[1], $matches[2]]; + } else { + return null; + } + } +} \ No newline at end of file -- GitLab From 11fa9e4209827d6134c421a88c9c407a96fb6041 Mon Sep 17 00:00:00 2001 From: Marc Egger <marc.egger@uzh.ch> Date: Mon, 27 Jul 2020 18:42:26 +0200 Subject: [PATCH 054/195] Refs #9600 report export and file read works. --- extension/Classes/Core/Constants.php | 2 + extension/Classes/Core/Helper/HelperFile.php | 35 +++++++ extension/Classes/Core/QuickFormQuery.php | 91 +++++++++++++++---- .../Classes/Core/Report/ReportAsFile.php | 36 +++++++- 4 files changed, 143 insertions(+), 21 deletions(-) diff --git a/extension/Classes/Core/Constants.php b/extension/Classes/Core/Constants.php index 10013027f..18c0ac974 100644 --- a/extension/Classes/Core/Constants.php +++ b/extension/Classes/Core/Constants.php @@ -1459,8 +1459,10 @@ const INDEX_PHP = 'index.php'; const T3DATA_BODYTEXT = 'bodytext'; const T3DATA_BODYTEXT_RAW = 'bodytext-raw'; const T3DATA_UID = 'uid'; +const T3DATA_PID = 'pid'; const T3DATA_HEADER = 'header'; const REPORT_INLINE_BODYTEXT = 'bodytext'; +const REPORT_FILE_EXTENSION = '.qfqr'; // Special Column to check for uploads const COLUMN_PATH_FILE_NAME = 'pathFileName'; diff --git a/extension/Classes/Core/Helper/HelperFile.php b/extension/Classes/Core/Helper/HelperFile.php index 846bd4321..08067f144 100644 --- a/extension/Classes/Core/Helper/HelperFile.php +++ b/extension/Classes/Core/Helper/HelperFile.php @@ -550,5 +550,40 @@ class HelperFile { { return preg_match('/^([-\.\w]+)$/', $fileName) > 0; } + + /** + * Remove non-alphanumeric characters and replace them with - + * + * @param $string + * @return string + */ + public static function sanitizeFileName($string): ?string + { + $res = strtolower(trim(preg_replace('/[^A-Za-z0-9-]+/', '-', $string), '-')); + $res = preg_replace('~-+~', '-', $res); + if (empty($res)) { + return null; + } + return $res; + } + + /** + * Creates the given path if it does not exist. + * + * @param $path + * @throws \UserFormException + */ + public static function createPathRecursive($path): void + { + if (!is_dir($path)) { + $success = mkdir($path, 0777, true); + if ($success === false) { + throw new \UserFormException(json_encode([ + ERROR_MESSAGE_TO_USER => "Can't create file path.", + ERROR_MESSAGE_TO_DEVELOPER => "Can't create path: " . $path]), + ERROR_IO_WRITE_FILE); + } + } + } } diff --git a/extension/Classes/Core/QuickFormQuery.php b/extension/Classes/Core/QuickFormQuery.php index 1829642c6..dedf9eb8a 100644 --- a/extension/Classes/Core/QuickFormQuery.php +++ b/extension/Classes/Core/QuickFormQuery.php @@ -146,22 +146,18 @@ class QuickFormQuery { $t3data[T3DATA_UID] = 0; } - /////// DEBUG ///////// - preg_match('/^\s*file\s*=\s*(.+)\/([^\/\s]+)/m', $t3data[T3DATA_BODYTEXT], $matches); - throw new \UserFormException(json_encode([ - ERROR_MESSAGE_TO_USER => json_encode(ReportAsFile::parseFileKeyword($t3data[T3DATA_BODYTEXT]), JSON_PRETTY_PRINT), - ERROR_MESSAGE_TO_DEVELOPER => json_encode($matches, JSON_PRETTY_PRINT) - ])); - /////////////////////// - - // TODO: find keyword file=<path> (regex ^file=[path]$) - // TODO: if keyword 'file' does not exist: - // read page path of tt-content element - // create path in filesystem if not exists - // create file with content bodytext. Filename: header slugg if exists, uid if not. - // replace tt-content bodytext with file=<path> - // TODO: read file. If not exists, throw exception. - // TODO: set bodytext to file content. + // Read report file if file keyword exists + $reportPathFileNameFull = ReportAsFile::parseFileKeyword($t3data[T3DATA_BODYTEXT]); + if ($reportPathFileNameFull !== null) { + $fileContents = file_get_contents($reportPathFileNameFull); + if ($fileContents === false) { + throw new \UserReportException(json_encode([ + ERROR_MESSAGE_TO_USER => "File read error.", + ERROR_MESSAGE_TO_DEVELOPER => "Report file not found or no permission to read file: '$reportPathFileNameFull'"]), + ERROR_FORM_NOT_FOUND); + } + $t3data[T3DATA_BODYTEXT] = $fileContents; + } $btp = new BodytextParser(); $t3data[T3DATA_BODYTEXT_RAW] = $t3data[T3DATA_BODYTEXT]; @@ -205,6 +201,69 @@ class QuickFormQuery { $dbIndex = $this->evaluate->parse($dbIndex); $dbIndex = ($dbIndex == '') ? DB_INDEX_DEFAULT : $dbIndex; $this->store->setVar(TOKEN_DB_INDEX, $dbIndex, STORE_TYPO3); + + // Create report file if file keyword not found + // TODO: ?CR: $t3data might not contain the following values. Or uid could be 0. + if ($reportPathFileNameFull === null && $t3data[T3DATA_UID] !== 0) { + + // read page path of tt-content element (use page alias if exists) + $dbT3 = $this->store->getVar(SYSTEM_DB_NAME_T3, STORE_SYSTEM); + $reportPath = ''; + $pid = $t3data[T3DATA_PID]; + while (intval($pid) !== 0) { + $sql = "SELECT `pid`, `alias`, `title` FROM `$dbT3`.`pages` WHERE `uid` = ?"; + $page = $this->dbArray[$this->dbIndexData]->sql($sql, ROW_EXPECT_1, + [$pid], "Typo3 page not found. Uid: $pid"); + $supDir = $page['alias'] !== '' ? $page['alias'] : $page['title']; + $reportPath = HelperFile::joinPathFilename(HelperFile::sanitizeFileName($supDir), $reportPath); + $pid = $page['pid']; + if (strlen($reportPath) > 4096) { + // Throw exception in case of infinite loop. + throw new \UserReportException(json_encode([ + ERROR_MESSAGE_TO_USER => "Path too long.", + ERROR_MESSAGE_TO_DEVELOPER => "Report path too long: '$reportPath'"]), + ERROR_FORM_NOT_FOUND); + } + } + $reportPathFull = HelperFile::joinPathFilename(ReportAsFile::reportPath(), $reportPath); + + // create path in filesystem if not exists + HelperFile::createPathRecursive($reportPathFull); + + // add filename + $fileName = HelperFile::sanitizeFileName($t3data[T3DATA_HEADER]); + if ($fileName === null) { + $fileName = strval($t3data[T3DATA_UID]); + } + $reportPathFileNameFull = HelperFile::joinPathFilename($reportPathFull, $fileName) . REPORT_FILE_EXTENSION; + + // if file exists, throw exception + if (file_exists($reportPathFileNameFull)) { + throw new \UserReportException(json_encode([ + ERROR_MESSAGE_TO_USER => "Writing file failed.", + ERROR_MESSAGE_TO_DEVELOPER => "Can't export report to file. File already exists: '$reportPathFileNameFull'"]), + ERROR_FORM_NOT_FOUND); + } + + // create file with content bodytext + $success = file_put_contents($reportPathFileNameFull, $t3data[T3DATA_BODYTEXT_RAW]); + if ($success === false) { + throw new \UserFormException(json_encode([ + ERROR_MESSAGE_TO_USER => "Writing file failed.", + ERROR_MESSAGE_TO_DEVELOPER => "Can't write to file '$reportPathFileNameFull'"]), + ERROR_IO_WRITE_FILE); + } + + // replace tt-content bodytext with file=<path> + $newBodytext = "file=" . HelperFile::joinPathFilename($reportPath, $fileName) . REPORT_FILE_EXTENSION; + $sql = "UPDATE `$dbT3`.`tt_content` SET `bodytext` = ?, `tstamp` = UNIX_TIMESTAMP(NOW()) WHERE `uid` = ?"; + $this->dbArray[$this->dbIndexData]->sql($sql, ROW_REGULAR, [$newBodytext, $t3data[T3DATA_UID]]); + + // Clear cache + // Need to truncate cf_cache_pages because it is used to restore page-specific cache + $sql = "DELETE FROM `$dbT3`.`cf_cache_pages`"; + $this->dbArray[$this->dbIndexData]->sql($sql); + } } /** diff --git a/extension/Classes/Core/Report/ReportAsFile.php b/extension/Classes/Core/Report/ReportAsFile.php index 9bcb2d079..1f18a95b2 100644 --- a/extension/Classes/Core/Report/ReportAsFile.php +++ b/extension/Classes/Core/Report/ReportAsFile.php @@ -3,26 +3,52 @@ // TODO: QuickFormQuery.php: edit saveReport() such that it saves to file instead of DB. Search T3DATA_UID // pass the file path instead of uid in sip. Escape could be a problem. Example: Search KeyValueStringParser::unparse($t3varsArray // TODO: Add filename to Report Editor. Search T3DATA_HEADER +// TODO: abstract all these IO functions which throw exceptions +// TODO: replace keyword 'file' with constant // TODO: ?CR: QuickFormQuery.php L138: Why fallback $t3data[T3DATA_UID] = 0; and $t3data[T3DATA_BODYTEXT] = ''; ? When does this happen? namespace IMATHUZH\Qfq\Core\Report; +use IMATHUZH\Qfq\Core\Helper\HelperFile; +use IMATHUZH\Qfq\Core\Store\Store; class ReportAsFile { /** - * Finds the keyword file=<path> and returns path and filename. + * Finds the keyword file=<pathFileName> and returns pathFileName of report. * * @param string $bodyText - * @return array|null [path, filename] + * @return string|null ReportPathFileName + * @throws \CodeException + * @throws \UserFormException + * @throws \UserReportException */ - public static function parseFileKeyword(string $bodyText): ?array + public static function parseFileKeyword(string $bodyText): ?string { - if (preg_match('/^\s*file\s*=\s*(.+)\/([^\/\s]+)/m', $bodyText, $matches)) { - return [$matches[1], $matches[2]]; + if (preg_match('/^\s*file\s*=\s*([^\s]*)/m', $bodyText, $matches)) { + return HelperFile::joinPathFilename(self::reportPath(), $matches[1]); } else { return null; } } + + /** + * Return the path of the report directory relative to CWD. + * Create path if it doesn't exist. + * + * @return string + * @throws \CodeException + * @throws \UserFormException + * @throws \UserReportException + */ + public static function reportPath(): string + { + // TODO: make private + + $systemQfqProjectDir = Store::getInstance()->getVar(SYSTEM_QFQ_PROJECT_DIR_SECURE, STORE_SYSTEM); + $reportPath = HelperFile::correctRelativePathFileName(HelperFile::joinPathFilename($systemQfqProjectDir, 'report')); + HelperFile::createPathRecursive($reportPath); + return $reportPath; + } } \ No newline at end of file -- GitLab From 29ac8bc8342412473e4fc6bf8f6ccfebbf12f31b Mon Sep 17 00:00:00 2001 From: Marc Egger <marc.egger@uzh.ch> Date: Wed, 29 Jul 2020 09:30:07 +0200 Subject: [PATCH 055/195] Refs #9600 todos --- extension/Classes/Core/Report/ReportAsFile.php | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/extension/Classes/Core/Report/ReportAsFile.php b/extension/Classes/Core/Report/ReportAsFile.php index 1f18a95b2..e203ae641 100644 --- a/extension/Classes/Core/Report/ReportAsFile.php +++ b/extension/Classes/Core/Report/ReportAsFile.php @@ -5,6 +5,10 @@ // TODO: Add filename to Report Editor. Search T3DATA_HEADER // TODO: abstract all these IO functions which throw exceptions // TODO: replace keyword 'file' with constant +// TODO: frontend edit komplett auschalten koennen (CR) +// TODO: volle kontrolle ueber code, dass der nicht pauschal ausgeliefert wird. (CR) +// TODO: zentrale konfig, ob es angezeigt wird. (sekreteaerin soll nicht sehen obwohl BE login) (CR) +// TODO: pro user option, ob gezeigt wird. (CR) // TODO: ?CR: QuickFormQuery.php L138: Why fallback $t3data[T3DATA_UID] = 0; and $t3data[T3DATA_BODYTEXT] = ''; ? When does this happen? -- GitLab From 827c9fc6407cf7e2a22cb5e768aa07089d153315 Mon Sep 17 00:00:00 2001 From: Marc Egger <marc.egger@uzh.ch> Date: Wed, 29 Jul 2020 09:33:02 +0200 Subject: [PATCH 056/195] Refs #10120 todos --- extension/Classes/Core/Form/FormAsFile.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/extension/Classes/Core/Form/FormAsFile.php b/extension/Classes/Core/Form/FormAsFile.php index be036a240..28dbcdd44 100644 --- a/extension/Classes/Core/Form/FormAsFile.php +++ b/extension/Classes/Core/Form/FormAsFile.php @@ -14,6 +14,7 @@ use IMATHUZH\Qfq\Core\Store\Store; // TODO: Carsten Fragen: "git rm" anstatt "rm" benutzen falls ordner ein git repo? Einziger unterschied: macht "git add" // TODO: Carsten Fragen: Form Copy ist broken. Aber jetzt auch unnötig, da man einfach die files kopieren kann. // TODO: Carsten Fragen: Koennte die column "lastImport" zu Form hinzufuegen. Dieser wird dann manuell zusammen mit "changed" beim import und export gesetzt. Mittels Left Join query mit den created columns von FormElement koennte man in importForm() feststellen, ob sich ein form geaendert hat und dieses expotieren, falls der fingerabdruck des files noch gleich ist. +// in doForm: wenn ein fehler auftritt, nachdem die datenbank gespeichert wird und bevor das file geschrieben wurde, dann ist das file nicht mehr up to date. "lastImport" koennte dies loesen. // TODO: Carsten Fragen: QFQ formulare haben id unter 1000 und user forms ueber 1000. Wird ein QFQ formular neu importiert, erhaelt es aber eine id ueber 1000. ist dies ein problem? // TODO: Carsten Fragen: Kann es sein, dass records in Dirty tabelle nicht mehr richtig abegraeumt werden, weil forms die ID wechseln? // TODO: Carsten Fragen: Exceptions werden teilweise ohne Developer message angezeigt (API). Deshalb habe ich die Message teilweise in User message getan. @@ -22,7 +23,6 @@ use IMATHUZH\Qfq\Core\Store\Store; // TODO: Carsten Fragen: add log messages somewhere? // TODO: Carsten Fragen: ZUERST NOCHMAL GENAU NACHTEILE PRUEFEN: In doForm koennte man auch einfach pauschal importAllForms(enforce writeable=true) und exportAllForms() machen, wenn der geladene record ein Form/Formelement ist. Bei vielen forms koennte es langsam sein. ansonsten sehe ich gerade keine klaren nachteile. - // TODO: BEFOORE PRUDUCTION // TODO: Fix all broken tests // TODO: write tests (file test https://medium.com/weebly-engineering/phpunit-mocking-the-file-system-using-vfsstream-5d7d79b1eb2a) -- GitLab From 00d02c9dc2ef1e78bd53e0f4cf31dd7ce00a59cc Mon Sep 17 00:00:00 2001 From: Marc Egger <marc.egger@uzh.ch> Date: Wed, 29 Jul 2020 13:09:47 +0200 Subject: [PATCH 057/195] Refs #9600 Edit report file using frontend editor. --- extension/Classes/Core/Constants.php | 2 + extension/Classes/Core/Helper/HelperFile.php | 22 ++- extension/Classes/Core/QuickFormQuery.php | 99 ++---------- .../Classes/Core/Report/ReportAsFile.php | 149 ++++++++++++++++-- 4 files changed, 173 insertions(+), 99 deletions(-) diff --git a/extension/Classes/Core/Constants.php b/extension/Classes/Core/Constants.php index 18c0ac974..69934b576 100644 --- a/extension/Classes/Core/Constants.php +++ b/extension/Classes/Core/Constants.php @@ -1461,6 +1461,7 @@ const T3DATA_BODYTEXT_RAW = 'bodytext-raw'; const T3DATA_UID = 'uid'; const T3DATA_PID = 'pid'; const T3DATA_HEADER = 'header'; +const T3DATA_REPORT_PATH_FILENAME = 'reportPathFileName'; const REPORT_INLINE_BODYTEXT = 'bodytext'; const REPORT_FILE_EXTENSION = '.qfqr'; @@ -1545,6 +1546,7 @@ const TOKEN_RECORD_ID = CLIENT_RECORD_ID; const TOKEN_DEBUG_BODYTEXT = TYPO3_DEBUG_SHOW_BODY_TEXT; const TOKEN_DB_INDEX = F_DB_INDEX; const TOKEN_CONTENT = 'content'; +const TOKEN_REPORT_FILE = 'file'; const TOKEN_VALID_LIST = 'sql|twig|head|althead|altsql|tail|shead|stail|rbeg|rend|renr|rsep|fbeg|fend|fsep|fskipwrap|rbgd|debug|form|r|debugShowBodyText|dbIndex|sqlLog|sqlLogMode|content|render'; diff --git a/extension/Classes/Core/Helper/HelperFile.php b/extension/Classes/Core/Helper/HelperFile.php index 08067f144..bc68d8e0a 100644 --- a/extension/Classes/Core/Helper/HelperFile.php +++ b/extension/Classes/Core/Helper/HelperFile.php @@ -557,7 +557,7 @@ class HelperFile { * @param $string * @return string */ - public static function sanitizeFileName($string): ?string + public static function sanitizeFileName($string) // : ?string { $res = strtolower(trim(preg_replace('/[^A-Za-z0-9-]+/', '-', $string), '-')); $res = preg_replace('~-+~', '-', $res); @@ -573,7 +573,7 @@ class HelperFile { * @param $path * @throws \UserFormException */ - public static function createPathRecursive($path): void + public static function createPathRecursive($path) // : void { if (!is_dir($path)) { $success = mkdir($path, 0777, true); @@ -585,5 +585,23 @@ class HelperFile { } } } + + /** + * Wrapper for file_put_contents which throws exception on failure. + * + * @param $pathFileName + * @param $content + * @throws \UserFormException + */ + public static function file_put_contents($pathFileName, $content) // : void + { + $success = file_put_contents($pathFileName, $content); + if ($success === false) { + throw new \UserFormException(json_encode([ + ERROR_MESSAGE_TO_USER => "Writing file failed.", + ERROR_MESSAGE_TO_DEVELOPER => "Can't write to file '$pathFileName'"]), + ERROR_IO_WRITE_FILE); + } + } } diff --git a/extension/Classes/Core/QuickFormQuery.php b/extension/Classes/Core/QuickFormQuery.php index dedf9eb8a..043cf8408 100644 --- a/extension/Classes/Core/QuickFormQuery.php +++ b/extension/Classes/Core/QuickFormQuery.php @@ -146,17 +146,10 @@ class QuickFormQuery { $t3data[T3DATA_UID] = 0; } - // Read report file if file keyword exists + // Read report file, if file keyword exists in bodytext $reportPathFileNameFull = ReportAsFile::parseFileKeyword($t3data[T3DATA_BODYTEXT]); if ($reportPathFileNameFull !== null) { - $fileContents = file_get_contents($reportPathFileNameFull); - if ($fileContents === false) { - throw new \UserReportException(json_encode([ - ERROR_MESSAGE_TO_USER => "File read error.", - ERROR_MESSAGE_TO_DEVELOPER => "Report file not found or no permission to read file: '$reportPathFileNameFull'"]), - ERROR_FORM_NOT_FOUND); - } - $t3data[T3DATA_BODYTEXT] = $fileContents; + $t3data[T3DATA_BODYTEXT] = ReportAsFile::read_report_file($reportPathFileNameFull); } $btp = new BodytextParser(); @@ -203,67 +196,13 @@ class QuickFormQuery { $this->store->setVar(TOKEN_DB_INDEX, $dbIndex, STORE_TYPO3); // Create report file if file keyword not found - // TODO: ?CR: $t3data might not contain the following values. Or uid could be 0. + // TODO: ?CR: uid could be 0. When does this happen? if ($reportPathFileNameFull === null && $t3data[T3DATA_UID] !== 0) { - - // read page path of tt-content element (use page alias if exists) - $dbT3 = $this->store->getVar(SYSTEM_DB_NAME_T3, STORE_SYSTEM); - $reportPath = ''; - $pid = $t3data[T3DATA_PID]; - while (intval($pid) !== 0) { - $sql = "SELECT `pid`, `alias`, `title` FROM `$dbT3`.`pages` WHERE `uid` = ?"; - $page = $this->dbArray[$this->dbIndexData]->sql($sql, ROW_EXPECT_1, - [$pid], "Typo3 page not found. Uid: $pid"); - $supDir = $page['alias'] !== '' ? $page['alias'] : $page['title']; - $reportPath = HelperFile::joinPathFilename(HelperFile::sanitizeFileName($supDir), $reportPath); - $pid = $page['pid']; - if (strlen($reportPath) > 4096) { - // Throw exception in case of infinite loop. - throw new \UserReportException(json_encode([ - ERROR_MESSAGE_TO_USER => "Path too long.", - ERROR_MESSAGE_TO_DEVELOPER => "Report path too long: '$reportPath'"]), - ERROR_FORM_NOT_FOUND); - } - } - $reportPathFull = HelperFile::joinPathFilename(ReportAsFile::reportPath(), $reportPath); - - // create path in filesystem if not exists - HelperFile::createPathRecursive($reportPathFull); - - // add filename - $fileName = HelperFile::sanitizeFileName($t3data[T3DATA_HEADER]); - if ($fileName === null) { - $fileName = strval($t3data[T3DATA_UID]); - } - $reportPathFileNameFull = HelperFile::joinPathFilename($reportPathFull, $fileName) . REPORT_FILE_EXTENSION; - - // if file exists, throw exception - if (file_exists($reportPathFileNameFull)) { - throw new \UserReportException(json_encode([ - ERROR_MESSAGE_TO_USER => "Writing file failed.", - ERROR_MESSAGE_TO_DEVELOPER => "Can't export report to file. File already exists: '$reportPathFileNameFull'"]), - ERROR_FORM_NOT_FOUND); - } - - // create file with content bodytext - $success = file_put_contents($reportPathFileNameFull, $t3data[T3DATA_BODYTEXT_RAW]); - if ($success === false) { - throw new \UserFormException(json_encode([ - ERROR_MESSAGE_TO_USER => "Writing file failed.", - ERROR_MESSAGE_TO_DEVELOPER => "Can't write to file '$reportPathFileNameFull'"]), - ERROR_IO_WRITE_FILE); - } - - // replace tt-content bodytext with file=<path> - $newBodytext = "file=" . HelperFile::joinPathFilename($reportPath, $fileName) . REPORT_FILE_EXTENSION; - $sql = "UPDATE `$dbT3`.`tt_content` SET `bodytext` = ?, `tstamp` = UNIX_TIMESTAMP(NOW()) WHERE `uid` = ?"; - $this->dbArray[$this->dbIndexData]->sql($sql, ROW_REGULAR, [$newBodytext, $t3data[T3DATA_UID]]); - - // Clear cache - // Need to truncate cf_cache_pages because it is used to restore page-specific cache - $sql = "DELETE FROM `$dbT3`.`cf_cache_pages`"; - $this->dbArray[$this->dbIndexData]->sql($sql); + $reportPathFileNameFull = ReportAsFile::create_file_from_ttContent($t3data[T3DATA_UID], $this->dbArray[$this->dbIndexData]); } + + // Save pathFileName for use in inline editor + $this->t3data[T3DATA_REPORT_PATH_FILENAME] = $reportPathFileNameFull; } /** @@ -1792,15 +1731,16 @@ class QuickFormQuery { return $html; } - /** Constructs a form to directly edit qfq content elements inline. + /** + * Constructs a form to directly edit qfq content elements inline. * * @return string - the html code * @throws \CodeException * @throws \UserFormException */ private function buildInlineReport() { - // TODO: replace $uid with file path $uid = $this->t3data[T3DATA_UID]; + $reportPathFileNameFull = $this->t3data[T3DATA_REPORT_PATH_FILENAME]; $bodytext = $this->t3data[T3DATA_BODYTEXT_RAW]; $header = $this->t3data[T3DATA_HEADER]; @@ -1815,7 +1755,7 @@ class QuickFormQuery { Support::doAttribute('title', 'Save & Reload'); $saveBtnIcon = Support::renderGlyphIcon(GLYPH_ICON_CHECK); $saveBtn = Support::wrapTag("<button $saveBtnAttributes>", $saveBtnIcon); - $header = "QFQ Page Content '$header'"; + $header = "QFQ Page Content '$header'.<br><small>File: '$reportPathFileNameFull'</small>"; $headerBar = Support::wrapTag("<div class='col-md-12 qfq-form-title'>", $header . $saveBtn); $ttContentCode = Support::htmlEntityEncodeDecode(MODE_ENCODE, $bodytext); @@ -1841,28 +1781,17 @@ class QuickFormQuery { * @throws \CodeException * @throws \DbException * @throws \UserFormException + * @throws \UserReportException */ public function saveReport() { - // TODO: replace $uid with file path $uid = $this->store->getVar(T3DATA_UID, STORE_SIP . STORE_ZERO, SANITIZE_ALLOW_DIGIT); if ($uid == 0) { // Check if it was called with a SIP (containing a uid) // If not, this might be an attack => cancel. return; } - - $bodytext = Support::htmlEntityEncodeDecode(MODE_DECODE, $_POST[REPORT_INLINE_BODYTEXT]); - $dbT3 = $this->store->getVar(SYSTEM_DB_NAME_T3, STORE_SYSTEM); - - // Update bodytext - $sql = "UPDATE `$dbT3`.`tt_content` SET `bodytext` = ?, `tstamp` = UNIX_TIMESTAMP(NOW()) WHERE `uid` = ?"; - $this->dbArray[$this->dbIndexData]->sql($sql, ROW_REGULAR, [$bodytext, $uid]); - - // Clear cache - // Need to truncate cf_cache_pages because it is used to restore page-specific cache - $sql = "DELETE FROM `$dbT3`.`cf_cache_pages`"; - $this->dbArray[$this->dbIndexData]->sql($sql); - + $bodytextNew = Support::htmlEntityEncodeDecode(MODE_DECODE, $_POST[REPORT_INLINE_BODYTEXT]); + ReportAsFile::write_file_uid($uid, $bodytextNew, $this->dbArray[$this->dbIndexData]); $this->formSpec[F_FORWARD_MODE] = 'auto'; } diff --git a/extension/Classes/Core/Report/ReportAsFile.php b/extension/Classes/Core/Report/ReportAsFile.php index e203ae641..018a7723c 100644 --- a/extension/Classes/Core/Report/ReportAsFile.php +++ b/extension/Classes/Core/Report/ReportAsFile.php @@ -1,42 +1,169 @@ <?php -// TODO: QuickFormQuery.php: edit saveReport() such that it saves to file instead of DB. Search T3DATA_UID - // pass the file path instead of uid in sip. Escape could be a problem. Example: Search KeyValueStringParser::unparse($t3varsArray -// TODO: Add filename to Report Editor. Search T3DATA_HEADER -// TODO: abstract all these IO functions which throw exceptions -// TODO: replace keyword 'file' with constant +// TODO: show frontend editor even when an exception occured during report rendering + // Solution: in rendering of exception, add the editor to the html. // TODO: frontend edit komplett auschalten koennen (CR) // TODO: volle kontrolle ueber code, dass der nicht pauschal ausgeliefert wird. (CR) // TODO: zentrale konfig, ob es angezeigt wird. (sekreteaerin soll nicht sehen obwohl BE login) (CR) // TODO: pro user option, ob gezeigt wird. (CR) +// TODO: fix unittests run by gitlab runner. // TODO: ?CR: QuickFormQuery.php L138: Why fallback $t3data[T3DATA_UID] = 0; and $t3data[T3DATA_BODYTEXT] = ''; ? When does this happen? +// TODO: ?CR: alle ?CR suchen und durchgehen. namespace IMATHUZH\Qfq\Core\Report; +use IMATHUZH\Qfq\Core\Database\Database; use IMATHUZH\Qfq\Core\Helper\HelperFile; use IMATHUZH\Qfq\Core\Store\Store; class ReportAsFile { /** - * Finds the keyword file=<pathFileName> and returns pathFileName of report. + * Finds the keyword file=<pathFileName> and returns pathFileName of report relative to CWD. * * @param string $bodyText - * @return string|null ReportPathFileName + * @return string|null pathFileName of report relative to CWD. * @throws \CodeException * @throws \UserFormException * @throws \UserReportException */ - public static function parseFileKeyword(string $bodyText): ?string + public static function parseFileKeyword(string $bodyText) // : ?string { - if (preg_match('/^\s*file\s*=\s*([^\s]*)/m', $bodyText, $matches)) { + if (preg_match('/^\s*' . TOKEN_REPORT_FILE . '\s*=\s*([^\s]*)/m', $bodyText, $matches)) { return HelperFile::joinPathFilename(self::reportPath(), $matches[1]); } else { return null; } } + /** + * Read report file from given pathFileName. Throw exception on failure. + * + * @param string $reportPathFileNameFull + * @return string|null + * @throws \UserReportException + */ + public static function read_report_file(string $reportPathFileNameFull): string + { + $fileContents = file_get_contents($reportPathFileNameFull); + if ($fileContents === false) { + throw new \UserReportException(json_encode([ + ERROR_MESSAGE_TO_USER => "File read error.", + ERROR_MESSAGE_TO_DEVELOPER => "Report file not found or no permission to read file: '$reportPathFileNameFull'"]), + ERROR_FORM_NOT_FOUND); + } + return $fileContents; + } + + /** + * Create new file named after the tt_content header or the UID if not defined. + * - Invalid characters are stripped from filename. + * - If file exists, throw exception. + * - The path of the file is derived the typo3 page structure (use page alias if exists, else page name). + * - The path is created if not exists. + * + * @param int $uid + * @param Database $databaseT3 + * @return string pathFileName of report relative to CWD + * @throws \CodeException + * @throws \DbException + * @throws \UserFormException + * @throws \UserReportException + */ + public static function create_file_from_ttContent(int $uid, Database $databaseT3): string + { + // Select tt_content + $dbT3 = Store::getInstance()->getVar(SYSTEM_DB_NAME_T3, STORE_SYSTEM); + $sql = "SELECT `bodytext`, `header`, `pid` FROM `$dbT3`.`tt_content` WHERE `uid` = ?"; + $ttContent = $databaseT3->sql($sql, ROW_EXPECT_1, + [$uid], "Typo3 content element not found. Uid: $uid"); + + // read page path of tt-content element (use page alias if exists) + $reportPath = ''; + $pid = $ttContent['pid']; + while (intval($pid) !== 0) { + $sql = "SELECT `pid`, `alias`, `title` FROM `$dbT3`.`pages` WHERE `uid` = ?"; + $page = $databaseT3->sql($sql, ROW_EXPECT_1, + [$pid], "Typo3 page not found. Uid: $pid"); + $supDir = $page['alias'] !== '' ? $page['alias'] : $page['title']; + $reportPath = HelperFile::joinPathFilename(HelperFile::sanitizeFileName($supDir), $reportPath); + $pid = $page['pid']; + if (strlen($reportPath) > 4096) { + // Throw exception in case of infinite loop. + throw new \UserReportException(json_encode([ + ERROR_MESSAGE_TO_USER => "Path too long.", + ERROR_MESSAGE_TO_DEVELOPER => "Report path too long: '$reportPath'"]), + ERROR_FORM_NOT_FOUND); + } + } + $reportPathFull = HelperFile::joinPathFilename(ReportAsFile::reportPath(), $reportPath); + + // create path in filesystem if not exists + HelperFile::createPathRecursive($reportPathFull); + + // add filename + $fileName = HelperFile::sanitizeFileName($ttContent['header']); + if ($fileName === null) { + $fileName = strval($uid); + } + $reportPathFileNameFull = HelperFile::joinPathFilename($reportPathFull, $fileName) . REPORT_FILE_EXTENSION; + + // if file exists, throw exception + if (file_exists($reportPathFileNameFull)) { + throw new \UserReportException(json_encode([ + ERROR_MESSAGE_TO_USER => "Writing file failed.", + ERROR_MESSAGE_TO_DEVELOPER => "Can't export report to file. File already exists: '$reportPathFileNameFull'"]), + ERROR_FORM_NOT_FOUND); + } + + // create file with content bodytext + HelperFile::file_put_contents($reportPathFileNameFull, $ttContent['bodytext']); + + // replace tt-content bodytext with file=<path> + $newBodytext = TOKEN_REPORT_FILE . "=" . HelperFile::joinPathFilename($reportPath, $fileName) . REPORT_FILE_EXTENSION; + $sql = "UPDATE `$dbT3`.`tt_content` SET `bodytext` = ?, `tstamp` = UNIX_TIMESTAMP(NOW()) WHERE `uid` = ?"; + $databaseT3->sql($sql, ROW_REGULAR, [$newBodytext, $uid]); + + // Clear cache + // Need to truncate cf_cache_pages because it is used to restore page-specific cache + $sql = "DELETE FROM `$dbT3`.`cf_cache_pages`"; + $databaseT3->sql($sql); + + return $reportPathFileNameFull; + } + + /** + * Overwrites report file given by the 'file=<path>' keyword of the tt_content element with the given uid. + * + * @param int $uid + * @param string $newContent + * @param Database $databaseT3 + * @throws \CodeException + * @throws \DbException + * @throws \UserFormException + * @throws \UserReportException + */ + public static function write_file_uid(int $uid, string $newContent, Database $databaseT3) // : void + { + // Get the report file path from tt_content + $dbT3 = Store::getInstance()->getVar(SYSTEM_DB_NAME_T3, STORE_SYSTEM); + $sql = "SELECT `bodytext` FROM `$dbT3`.`tt_content` WHERE `uid` = ?"; + $ttContent = $databaseT3->sql($sql, ROW_EXPECT_1, + [$uid], "Typo3 content element not found. Uid: $uid"); + + $reportPathFileNameFull = ReportAsFile::parseFileKeyword($ttContent['bodytext']); + if ($reportPathFileNameFull === null) { + throw new \UserReportException(json_encode([ + ERROR_MESSAGE_TO_USER => "No report file defined.", + ERROR_MESSAGE_TO_DEVELOPER => "The keyword '" . TOKEN_REPORT_FILE . "' is not present in the typo3 content element with id $uid"]), + ERROR_FORM_NOT_FOUND); + } + + // Update report file + HelperFile::file_put_contents($reportPathFileNameFull, $newContent); + } + /** * Return the path of the report directory relative to CWD. * Create path if it doesn't exist. @@ -46,10 +173,8 @@ class ReportAsFile * @throws \UserFormException * @throws \UserReportException */ - public static function reportPath(): string + private static function reportPath(): string { - // TODO: make private - $systemQfqProjectDir = Store::getInstance()->getVar(SYSTEM_QFQ_PROJECT_DIR_SECURE, STORE_SYSTEM); $reportPath = HelperFile::correctRelativePathFileName(HelperFile::joinPathFilename($systemQfqProjectDir, 'report')); HelperFile::createPathRecursive($reportPath); -- GitLab From 1eac8e301c87355e364a88627be13d5a85cd4da2 Mon Sep 17 00:00:00 2001 From: Marc Egger <marc.egger@uzh.ch> Date: Tue, 18 Aug 2020 10:26:02 +0200 Subject: [PATCH 058/195] Refs #9600 Edit report file using frontend editor. --- .../Core/Exception/AbstractException.php | 6 +++++ .../Core/Exception/UserReportException.php | 7 ++++++ extension/Classes/Core/QuickFormQuery.php | 25 +++++++++++++------ .../Classes/Core/Report/ReportAsFile.php | 11 +++++--- 4 files changed, 38 insertions(+), 11 deletions(-) diff --git a/extension/Classes/Core/Exception/AbstractException.php b/extension/Classes/Core/Exception/AbstractException.php index bc2b28a21..388a45b0b 100644 --- a/extension/Classes/Core/Exception/AbstractException.php +++ b/extension/Classes/Core/Exception/AbstractException.php @@ -8,6 +8,7 @@ namespace IMATHUZH\Qfq\Core\Exception; +use IMATHUZH\Qfq\Core\QuickFormQuery; use IMATHUZH\Qfq\Core\Store\Store; use IMATHUZH\Qfq\Core\Store\Sip; use IMATHUZH\Qfq\Core\Store\T3Info; @@ -168,6 +169,11 @@ class AbstractException extends \Exception { $arrMerged[$key] = str_replace("\n", "<br>", $arrMerged[$key]); } + // Render inline report editor + $arrMerged[ERROR_MESSAGE_TO_DEVELOPER] = QuickFormQuery::buildInlineReport(\UserReportException::$report_uid, + \UserReportException::$report_pathFileName, \UserReportException::$report_bodytext, + \UserReportException::$report_header) . $arrMerged[ERROR_MESSAGE_TO_DEVELOPER]; + $htmlDebug = OnArray::arrayToHtmlTable( array_merge($arrForm, $arrMerged), 'Debug', EXCEPTION_TABLE_CLASS); diff --git a/extension/Classes/Core/Exception/UserReportException.php b/extension/Classes/Core/Exception/UserReportException.php index c27c1cade..6c3aab299 100644 --- a/extension/Classes/Core/Exception/UserReportException.php +++ b/extension/Classes/Core/Exception/UserReportException.php @@ -30,6 +30,13 @@ use IMATHUZH\Qfq\Core\Store\Store; */ class UserReportException extends AbstractException { + // SUPER HACK: to render inline editor when an exception is thrown + // Can't use store, since store needs bodytext to be parsed, which might throw exceptions if there is a syntax error. + public static $report_uid = null; + public static $report_bodytext = ''; + public static $report_pathFileName = ''; + public static $report_header = ''; + /** * $this->getMessage() might give a) a simple string or b) an JSON String. * diff --git a/extension/Classes/Core/QuickFormQuery.php b/extension/Classes/Core/QuickFormQuery.php index 043cf8408..b6fe29186 100644 --- a/extension/Classes/Core/QuickFormQuery.php +++ b/extension/Classes/Core/QuickFormQuery.php @@ -152,6 +152,13 @@ class QuickFormQuery { $t3data[T3DATA_BODYTEXT] = ReportAsFile::read_report_file($reportPathFileNameFull); } + // SUPER HACK: to render inline editor when an exception is thrown + // Can't use store, since store needs bodytext to be parsed, which might throw exceptions if there is a syntax error. + \UserReportException::$report_uid = $t3data[T3DATA_UID]; + \UserReportException::$report_bodytext = $t3data[T3DATA_BODYTEXT]; + \UserReportException::$report_header = t3data[T3DATA_HEADER]; + \UserReportException::$report_pathFileName = $reportPathFileNameFull; + $btp = new BodytextParser(); $t3data[T3DATA_BODYTEXT_RAW] = $t3data[T3DATA_BODYTEXT]; $t3data[T3DATA_BODYTEXT] = $btp->process($t3data[T3DATA_BODYTEXT]); @@ -1724,7 +1731,8 @@ class QuickFormQuery { $beUserLoggedIn = $this->store->getVar(TYPO3_BE_USER, STORE_TYPO3, SANITIZE_ALLOW_ALNUMX); if ($beUserLoggedIn && $this->inlineReport) { - $html .= $this->buildInlineReport(); + $html .= $this->buildInlineReport($this->t3data[T3DATA_UID], $this->t3data[T3DATA_REPORT_PATH_FILENAME], + $this->t3data[T3DATA_BODYTEXT_RAW], $this->t3data[T3DATA_HEADER]); } $html .= $report->process($this->t3data[T3DATA_BODYTEXT]); @@ -1734,16 +1742,19 @@ class QuickFormQuery { /** * Constructs a form to directly edit qfq content elements inline. * + * @param int|null $uid + * @param string $reportPathFileNameFull + * @param string $bodytext + * @param string $header * @return string - the html code * @throws \CodeException * @throws \UserFormException */ - private function buildInlineReport() { - $uid = $this->t3data[T3DATA_UID]; - $reportPathFileNameFull = $this->t3data[T3DATA_REPORT_PATH_FILENAME]; - $bodytext = $this->t3data[T3DATA_BODYTEXT_RAW]; - $header = $this->t3data[T3DATA_HEADER]; - + public static function buildInlineReport(?int $uid, string $reportPathFileNameFull, string $bodytext, string $header): string + { + if ($uid === null) { + return ''; + } $icon = Support::renderGlyphIcon(GLYPH_ICON_TASKS); $showFormJs = '$("#tt-content-edit-' . $uid . '").toggleClass("hidden")'; $toggleBtn = Support::wrapTag("<a href='#' onclick='$showFormJs' style='float:right;'>", $icon); diff --git a/extension/Classes/Core/Report/ReportAsFile.php b/extension/Classes/Core/Report/ReportAsFile.php index 018a7723c..405250442 100644 --- a/extension/Classes/Core/Report/ReportAsFile.php +++ b/extension/Classes/Core/Report/ReportAsFile.php @@ -1,15 +1,18 @@ <?php +// TODO: fix unittests run by gitlab runner. +// TODO: ?CR: QuickFormQuery.php L138: Why fallback $t3data[T3DATA_UID] = 0; and $t3data[T3DATA_BODYTEXT] = ''; ? When does this happen? +// TODO: ?CR: alle ?CR suchen und durchgehen. + +//// FRONTEND EDITOR //// +// ====================// // TODO: show frontend editor even when an exception occured during report rendering // Solution: in rendering of exception, add the editor to the html. // TODO: frontend edit komplett auschalten koennen (CR) -// TODO: volle kontrolle ueber code, dass der nicht pauschal ausgeliefert wird. (CR) +// TODO: frontend editor wird nicht pauschal ausgeliefert, sondern nur wenn auch angezeigt. (CR) // TODO: zentrale konfig, ob es angezeigt wird. (sekreteaerin soll nicht sehen obwohl BE login) (CR) // TODO: pro user option, ob gezeigt wird. (CR) -// TODO: fix unittests run by gitlab runner. -// TODO: ?CR: QuickFormQuery.php L138: Why fallback $t3data[T3DATA_UID] = 0; and $t3data[T3DATA_BODYTEXT] = ''; ? When does this happen? -// TODO: ?CR: alle ?CR suchen und durchgehen. namespace IMATHUZH\Qfq\Core\Report; -- GitLab From 1061a5a1b6ed9f717ad84603da446a3f75945439 Mon Sep 17 00:00:00 2001 From: Marc Egger <marc.egger@uzh.ch> Date: Tue, 18 Aug 2020 10:31:06 +0200 Subject: [PATCH 059/195] Refs #10120 todos --- extension/Classes/Core/Form/FormAsFile.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/extension/Classes/Core/Form/FormAsFile.php b/extension/Classes/Core/Form/FormAsFile.php index 28dbcdd44..6f31ce0e6 100644 --- a/extension/Classes/Core/Form/FormAsFile.php +++ b/extension/Classes/Core/Form/FormAsFile.php @@ -15,13 +15,13 @@ use IMATHUZH\Qfq\Core\Store\Store; // TODO: Carsten Fragen: Form Copy ist broken. Aber jetzt auch unnötig, da man einfach die files kopieren kann. // TODO: Carsten Fragen: Koennte die column "lastImport" zu Form hinzufuegen. Dieser wird dann manuell zusammen mit "changed" beim import und export gesetzt. Mittels Left Join query mit den created columns von FormElement koennte man in importForm() feststellen, ob sich ein form geaendert hat und dieses expotieren, falls der fingerabdruck des files noch gleich ist. // in doForm: wenn ein fehler auftritt, nachdem die datenbank gespeichert wird und bevor das file geschrieben wurde, dann ist das file nicht mehr up to date. "lastImport" koennte dies loesen. + // >> nicht unbedingt noetig. passiert nur sehr selten, dass db und file nicht synch ist und dann faellts auf, wenn der developer testet. // TODO: Carsten Fragen: QFQ formulare haben id unter 1000 und user forms ueber 1000. Wird ein QFQ formular neu importiert, erhaelt es aber eine id ueber 1000. ist dies ein problem? // TODO: Carsten Fragen: Kann es sein, dass records in Dirty tabelle nicht mehr richtig abegraeumt werden, weil forms die ID wechseln? // TODO: Carsten Fragen: Exceptions werden teilweise ohne Developer message angezeigt (API). Deshalb habe ich die Message teilweise in User message getan. // TODO: Carsten Fragen: PHP version von gitlab runner hochstellen, damit ?string und void type syntax fuer funktionen erlaubt ist? verhindert einige fehler // TODO: Carsten Fragen: Regex fuer erlaubte file names und form names im editor (+ erlauben?): ^([-\.\w]+)$ VS [a-zA-Z0-9._+-]+ // TODO: Carsten Fragen: add log messages somewhere? -// TODO: Carsten Fragen: ZUERST NOCHMAL GENAU NACHTEILE PRUEFEN: In doForm koennte man auch einfach pauschal importAllForms(enforce writeable=true) und exportAllForms() machen, wenn der geladene record ein Form/Formelement ist. Bei vielen forms koennte es langsam sein. ansonsten sehe ich gerade keine klaren nachteile. // TODO: BEFOORE PRUDUCTION // TODO: Fix all broken tests -- GitLab From 78fda461fb48cd2f7e82ec550c371e741d8ae076 Mon Sep 17 00:00:00 2001 From: Marc Egger <marc.egger@uzh.ch> Date: Tue, 18 Aug 2020 11:14:10 +0200 Subject: [PATCH 060/195] Refs #10120 todos --- extension/Classes/Core/Form/FormAsFile.php | 38 ++++++++++------------ 1 file changed, 18 insertions(+), 20 deletions(-) diff --git a/extension/Classes/Core/Form/FormAsFile.php b/extension/Classes/Core/Form/FormAsFile.php index 6f31ce0e6..2d0e4f874 100644 --- a/extension/Classes/Core/Form/FormAsFile.php +++ b/extension/Classes/Core/Form/FormAsFile.php @@ -9,19 +9,22 @@ use IMATHUZH\Qfq\Core\Helper\OnString; use IMATHUZH\Qfq\Core\Helper\SqlQuery; use IMATHUZH\Qfq\Core\Store\Store; -// TODO: Carsten Fragen: Habe keine Unittests zu QuickFormQuery->doForm gefunden. Wird nicht getestet. FormAsFile nicht testen oder vielleicht nur mit selenium? -// TODO: Carsten Fragen: Form backups erstellen vor deleteFormFile und exportForm? -// TODO: Carsten Fragen: "git rm" anstatt "rm" benutzen falls ordner ein git repo? Einziger unterschied: macht "git add" -// TODO: Carsten Fragen: Form Copy ist broken. Aber jetzt auch unnötig, da man einfach die files kopieren kann. -// TODO: Carsten Fragen: Koennte die column "lastImport" zu Form hinzufuegen. Dieser wird dann manuell zusammen mit "changed" beim import und export gesetzt. Mittels Left Join query mit den created columns von FormElement koennte man in importForm() feststellen, ob sich ein form geaendert hat und dieses expotieren, falls der fingerabdruck des files noch gleich ist. -// in doForm: wenn ein fehler auftritt, nachdem die datenbank gespeichert wird und bevor das file geschrieben wurde, dann ist das file nicht mehr up to date. "lastImport" koennte dies loesen. +// ---------------------- // +// Besprechen mit Carsten // +// ====================== // + +// Form backups erstellen vor deleteFormFile und exportForm? +// "git rm" anstatt "rm" benutzen falls ordner ein git repo? Einziger unterschied: macht "git add" +// Form Copy ist broken. Aber jetzt auch unnötig, da man einfach die files kopieren kann. +// Koennte die column "lastImport" zu Form hinzufuegen. Dieser wird dann manuell zusammen mit "changed" beim import und export gesetzt. Mittels Left Join query mit den created columns von FormElement koennte man in importForm() feststellen, ob sich ein form geaendert hat und dieses expotieren, falls der fingerabdruck des files noch gleich ist. + // in doForm: wenn ein fehler auftritt, nachdem die datenbank gespeichert wird und bevor das file geschrieben wurde, dann ist das file nicht mehr up to date. "lastImport" koennte dies loesen. // >> nicht unbedingt noetig. passiert nur sehr selten, dass db und file nicht synch ist und dann faellts auf, wenn der developer testet. -// TODO: Carsten Fragen: QFQ formulare haben id unter 1000 und user forms ueber 1000. Wird ein QFQ formular neu importiert, erhaelt es aber eine id ueber 1000. ist dies ein problem? -// TODO: Carsten Fragen: Kann es sein, dass records in Dirty tabelle nicht mehr richtig abegraeumt werden, weil forms die ID wechseln? -// TODO: Carsten Fragen: Exceptions werden teilweise ohne Developer message angezeigt (API). Deshalb habe ich die Message teilweise in User message getan. -// TODO: Carsten Fragen: PHP version von gitlab runner hochstellen, damit ?string und void type syntax fuer funktionen erlaubt ist? verhindert einige fehler -// TODO: Carsten Fragen: Regex fuer erlaubte file names und form names im editor (+ erlauben?): ^([-\.\w]+)$ VS [a-zA-Z0-9._+-]+ -// TODO: Carsten Fragen: add log messages somewhere? +// QFQ formulare haben id unter 1000 und user forms ueber 1000. Wird ein QFQ formular neu importiert, erhaelt es aber eine id ueber 1000. ist dies ein problem? +// Kann es sein, dass records in Dirty tabelle nicht mehr richtig abegraeumt werden, weil forms die ID wechseln? +// Exceptions werden teilweise ohne Developer message angezeigt (API). Deshalb habe ich die Message teilweise in User message getan. +// PHP version von gitlab runner hochstellen, damit ?string und void type syntax fuer funktionen erlaubt ist? verhindert einige fehler +// Regex fuer erlaubte file names und form names im editor (+ erlauben?): ^([-\.\w]+)$ VS [a-zA-Z0-9._+-]+ +// add log messages somewhere? // TODO: BEFOORE PRUDUCTION // TODO: Fix all broken tests @@ -66,14 +69,9 @@ use IMATHUZH\Qfq\Core\Store\Store; //SELECT CONCAT('p:{{pageId:T}}&form=form&r=', f.id) as _pagee, f.id, f.name, f.title, f.tableName, CONCAT('form=form&r=', f.id) as _Paged from Form AS f ORDER BY f.name //END; -// TODO: DON'T DO - // TODO: DONT DO: add column import-modification-date to Form and FormElement and set them to the same as modification date in both exportForm and importForm. compare the two modification dates in the beginning. If the actual modification is after importModification and fileStats are the same in file and in form, then exportForm. - // TODO: DONT DO: what to do if importModificationDate and fileStats have changed? > 1) export Form to new form file named <formName>mergeConflict_timestamp 2) importForm form file, overwrite DB - -///////////////// JUST A TEST, DELETE ME! ////////////// -// FormAsFile::exportForm($formName, $this->dbArray[$this->dbIndexQfq]); -// FormAsFile::importForm($formName, $this->dbArray[$this->dbIndexQfq]); -///////////////// TEST FINISHED //////////////////////// +// DON'T DO + // DONT DO: add column import-modification-date to Form and FormElement and set them to the same as modification date in both exportForm and importForm. compare the two modification dates in the beginning. If the actual modification is after importModification and fileStats are the same in file and in form, then exportForm. + // DONT DO: what to do if importModificationDate and fileStats have changed? > 1) export Form to new form file named <formName>mergeConflict_timestamp 2) importForm form file, overwrite DB /////// DEBUG ///////// // throw new \UserFormException(json_encode([ -- GitLab From b4537ff17090f09aaf7e288ac78ea7b88d453539 Mon Sep 17 00:00:00 2001 From: Marc Egger <marc.egger@uzh.ch> Date: Tue, 18 Aug 2020 11:22:35 +0200 Subject: [PATCH 061/195] Refs #9600 Todos --- extension/Classes/Core/Report/ReportAsFile.php | 16 +++++----------- 1 file changed, 5 insertions(+), 11 deletions(-) diff --git a/extension/Classes/Core/Report/ReportAsFile.php b/extension/Classes/Core/Report/ReportAsFile.php index 405250442..14177bdc8 100644 --- a/extension/Classes/Core/Report/ReportAsFile.php +++ b/extension/Classes/Core/Report/ReportAsFile.php @@ -1,18 +1,12 @@ <?php // TODO: fix unittests run by gitlab runner. -// TODO: ?CR: QuickFormQuery.php L138: Why fallback $t3data[T3DATA_UID] = 0; and $t3data[T3DATA_BODYTEXT] = ''; ? When does this happen? -// TODO: ?CR: alle ?CR suchen und durchgehen. - -//// FRONTEND EDITOR //// -// ====================// -// TODO: show frontend editor even when an exception occured during report rendering - // Solution: in rendering of exception, add the editor to the html. -// TODO: frontend edit komplett auschalten koennen (CR) -// TODO: frontend editor wird nicht pauschal ausgeliefert, sondern nur wenn auch angezeigt. (CR) -// TODO: zentrale konfig, ob es angezeigt wird. (sekreteaerin soll nicht sehen obwohl BE login) (CR) -// TODO: pro user option, ob gezeigt wird. (CR) +// Besprechen mit Carsten // +// ====================== // + +// ?CR: QuickFormQuery.php L138: Why fallback $t3data[T3DATA_UID] = 0; and $t3data[T3DATA_BODYTEXT] = ''; ? When does this happen? +// ?CR: alle ?CR suchen und durchgehen. namespace IMATHUZH\Qfq\Core\Report; -- GitLab From 4abb17bdba89d87f60a1c955870c3f0a71cdde2e Mon Sep 17 00:00:00 2001 From: Marc Egger <marc.egger@uzh.ch> Date: Wed, 19 Aug 2020 17:54:21 +0200 Subject: [PATCH 062/195] Refs #11035 qfq runs without T3, but paths not right usw. A lot to do. --- extension/Classes/Api/index.php | 429 +++++++++++++++++++ extension/Classes/Core/Helper/HelperFile.php | 51 +++ 2 files changed, 480 insertions(+) create mode 100644 extension/Classes/Api/index.php diff --git a/extension/Classes/Api/index.php b/extension/Classes/Api/index.php new file mode 100644 index 000000000..fd955d522 --- /dev/null +++ b/extension/Classes/Api/index.php @@ -0,0 +1,429 @@ +<?php + +// DELETE ME! // +// TEST FILE TO RUN QFQ REPORT WITHOUT TYPO3 // +/////////////////////////////////////////////// + +echo $_SERVER['DOCUMENT_ROOT']; + +// TODO: replace the following with a better method +const API_DIR = "./"; +const GFX_INFO = '/../../Resources/Public/icons/note.gif'; +const PATH_ICONS = '/../../Resources/Public/icons'; + + +require_once(__DIR__ . '/../../vendor/autoload.php'); + +use http\Exception; +use IMATHUZH\Qfq\Core\QuickFormQuery; + +// TODO: replace all paths with typo3conf/ and /../ and fileadmin/ with correct path computing function. +// TODO: replace HelperFile::correctRelativePathFileName() everywhere with the corresponding path function. +// TODO: replace Logger::makePathAbsolute() +// TODO: Read code in Core/Typo3 +// TODO: comment out autoloader in T3Handler::t3AutoloadIfNotRunning() and test if this file still runs without exception. +// TODO: create filePathToQfqConfig() and replace config references with this +// TODO: $_COOKIE, $_SERVER und POST GET alles ausgeben. alle php globalen ausgeben. schauen wo was drin ist. +// TODO: AS _pagee macht link auf .../index.php . entweder datei umbenennen oder link klasse aendern +// TODO: add HTML header and body tags to echo +// TODO: Check if there are other javascript files which have to be included in qfq/Resources/Public/JavaScript +// TODO: BuildFormBootstrap.php Zeile 666 ff. : API pfad automatisch anpassen +// TODO: Link.php 1776: API pfad automatisch anpassen + +// Misc. +// TODO: TablesorterController.js: pass API url as data attribute instead of hardcode (this.tablesorterApiUrl = 'typo3conf/ext/qfq/Classes/Api/setting.php';) + +//// + +class User { + public $user; + public function __construct() + { + $this->user = [ + "uid" => 1, // Backend user: 2 + // $feUserLoggedIn = isset($GLOBALS["TSFE"]->fe_user->user["uid"]) && $GLOBALS["TSFE"]->fe_user->user["uid"] > 0; + // $arr["fe_user_uid"] = $GLOBALS["TSFE"]->fe_user->user["uid"] ?? '-'; + // $arr["be_user_uid"] = (isset($GLOBALS['BE_USER'])) ? $GLOBALS['BE_USER']->user["uid"] : '-'; + // $feUidLoggedIn = $GLOBALS["TSFE"]->fe_user->user["uid"] ?? false; + // $t3vars[TYPO3_FE_USER_UID] = isset($GLOBALS["TSFE"]->fe_user->user["uid"]) ? $GLOBALS["TSFE"]->fe_user->user["uid"] : ''; + + "username" => "megger", // Backend user: "megger" + // $arr["fe_user"] = $GLOBALS["TSFE"]->fe_user->user["username"] ?? '-'; + // $feUserSession = $GLOBALS["TSFE"]->fe_user->user["username"] ?? false; + // $beUser = $GLOBALS["BE_USER"]->user["username"] ?? false; + // if (isset($GLOBALS["TSFE"]->fe_user->user["username"]) && isset($_COOKIE['fe_typo_user'])) { + // $t3vars[TYPO3_FE_USER] = isset($GLOBALS["TSFE"]->fe_user->user["username"]) ? $GLOBALS["TSFE"]->fe_user->user["username"] : ''; + // $t3vars[TYPO3_BE_USER] = isset($GLOBALS["BE_USER"]->user["username"]) ? $GLOBALS["BE_USER"]->user["username"] : ''; + + "usergroup"=> "1" // Backend user: "" + // $feUserGroup = $GLOBALS["TSFE"]->fe_user->user["usergroup"] ?? false; + // $t3vars[TYPO3_FE_USER_GROUP] = isset($GLOBALS["TSFE"]->fe_user->user["usergroup"]) ? $GLOBALS["TSFE"]->fe_user->user["usergroup"] : ''; + ]; + } + + public function logoff() + { + // $GLOBALS['TSFE']->fe_user->logoff(); + } +} + +class TSFE +{ + public $fe_user; + + public $id = 1; + // $arr["page_id"] = $GLOBALS["TSFE"]->id; + // $t3vars[TYPO3_PAGE_ID] = isset($GLOBALS["TSFE"]->id) ? $GLOBALS["TSFE"]->id : ''; + + public $type = 0; + // $arr["page_type"] = $GLOBALS["TSFE"]->type; + // $t3vars[TYPO3_PAGE_TYPE] = isset($GLOBALS["TSFE"]->type) ? $GLOBALS["TSFE"]->type : ''; + + public $sys_language_uid = 0; + // $arr["page_language_uid"] = $GLOBALS["TSFE"]->sys_language_uid; + // $t3vars[TYPO3_PAGE_LANGUAGE] = isset($GLOBALS["TSFE"]->sys_language_uid) ? $GLOBALS["TSFE"]->sys_language_uid : ''; + + public $beUserLogin = true; + // return (!empty($GLOBALS["TSFE"]->beUserLogin) && $GLOBALS["TSFE"]->beUserLogin === true); + // $t3vars[TYPO3_BE_USER_LOGGED_IN] = (isset($GLOBALS["TSFE"]->beUserLogin) && $GLOBALS["TSFE"]->beUserLogin === true) ? 'yes' : 'no'; + + public $page = [ + "alias" => 1, + // $t3vars[TYPO3_PAGE_ALIAS] = empty($GLOBALS["TSFE"]->page["alias"]) ? $t3vars[TYPO3_PAGE_ID] : $GLOBALS["TSFE"]->page["alias"]; + + "title" => "two" + // $t3vars[TYPO3_PAGE_TITLE] = isset($GLOBALS["TSFE"]->page["title"]) ? $GLOBALS["TSFE"]->page["title"] : ''; + ]; + + public function __construct() + { + $this->fe_user = new User(); + // if (isset($GLOBALS["TSFE"]->fe_user)) { + } +} + + +$extConf = [ + "flagProduction" => "yes", + "render" => "both", + "maxFileSize" => "", + "baseUrl" => "", + "dateFormat" => "dd.mm.yyyy", + "qfqProjectDir" => "fileadmin/protected/qfqProject", + "thumbnailDirSecure" => "fileadmin/protected/qfqThumbnail", + "thumbnailDirPublic" => "typo3temp/qfqThumbnail", + "cmdInkscape" => "inkscape", + "cmdConvert" => "convert", + "cmdWkhtmltopdf" => "/opt/wkhtmltox/bin/wkhtmltopdf", + "cmdQpdf" => "qpdf", + "cmdGs" => "gs", + "cmdPdfunite" => "pdfunite", + "sendEMailOptions" => "", + "documentation" => "https://docs.typo3.org/typo3cms/drafts/github/T3DocumentationStarter/Public-Info-053/Manual.html", + "fillStoreSystemBySql1" => "", + "fillStoreSystemBySqlErrorMsg1" => "", + "fillStoreSystemBySql2" => "", + "fillStoreSystemBySqlErrorMsg2" => "", + "fillStoreSystemBySql3" => "", + "fillStoreSystemBySqlErrorMsg3" => "", + "throwExceptionGeneralError" => "auto", + "formSubmitLogMode" => "all", + "redirectAllMailTo" => "", + "sqlLogMode" => "modify", + "sqlLogModeAutoCron" => "error", + "sqlLog" => "fileadmin/protected/log/sql.log", + "qfqLog" => "fileadmin/protected/log/qfq.log", + "mailLog" => "fileadmin/protected/log/mail.log", + "showDebugInfo" => "auto", + "init" => "SET names utf8; SET sql_mode = \"NO_ENGINE_SUBSTITUTION\";", + "update" => "auto", + "indexData" => "1", + "indexQfq" => "1", + "escapeTypeDefault" => "m", + "securityVarsHoneypot" => "email,username,password", + "securityAttackDelay" => "5", + "securityShowMessage" => "true", + "securityGetMaxLength" => "50", + "securityFailedAuthDelay" => "3", + "sessionTimeoutSeconds" => "1800", + "recordLockTimeoutSeconds" => "900", + "enterAsSubmit" => "1", + "editFormPage" => "form", + "formDataPatternError" => "", + "formDataRequiredError" => "", + "formDataMatchError" => "", + "formDataError" => "", + "showIdInFormTitle" => "0", + "cssClassColumnId" => "text-muted", + "labelAlign" => "left", + "cssClassQfqContainer" => "", + "cssClassQfqForm" => "", + "cssClassQfqFormPill" => "qfq-color-grey-1", + "cssClassQfqFormBody" => "qfq-color-grey-2", + "formBsColumns" => "col-md-12", + "formBsLabelColumns" => "col-md-3 col-lg-3", + "formBsInputColumns" => "col-md-6 col-lg-6", + "formBsNoteColumns" => "col-md-3 col-lg-3", + "extraButtonInfoInline" => "<span class=\"glyphicon glyphicon-info-sign\" aria-hidden=\"true\"></span>", + "extraButtonInfoBelow" => "<span class=\"glyphicon glyphicon-info-sign text-info\" aria-hidden=\"true\"></span>", + "extraButtonInfoPosition" => "auto", + "extraButtonInfoClass" => "", + "formLanguageAId" => "", + "formLanguageALabel" => "", + "formLanguageBId" => "", + "formLanguageBLabel" => "", + "formLanguageCId" => "", + "formLanguageCLabel" => "", + "formLanguageDId" => "", + "formLanguageDLabel" => "", + "saveButtonText" => "", + "saveButtonTooltip" => "Save", + "saveButtonClass" => "btn btn-default navbar-btn", + "saveButtonClassOnChange" => "alert-info btn-info", + "saveButtonGlyphIcon" => "glyphicon-ok", + "closeButtonText" => "", + "closeButtonTooltip" => "Close", + "closeButtonClass" => "btn btn-default navbar-btn", + "closeButtonGlyphIcon" => "glyphicon-remove", + "deleteButtonText" => "", + "deleteButtonTooltip" => "Delete", + "deleteButtonClass" => "btn btn-default navbar-btn", + "deleteButtonGlyphIcon" => "glyphicon-trash", + "newButtonText" => "", + "newButtonTooltip" => "New", + "newButtonClass" => "btn btn-default navbar-btn", + "newButtonGlyphIcon" => "glyphicon-plus", + "custom1" => "", + "custom2" => "", + "custom3" => "", + "custom4" => "", + "custom5" => "", + "custom6" => "", + "custom7" => "", + "custom8" => "", + "custom9" => "", + "custom10" => "", + "custom11" => "", + "custom12" => "", + "custom13" => "", + "custom14" => "", + "custom15" => "", + "custom16" => "", + "custom17" => "", + "custom18" => "", + "custom19" => "", + "custom20" => "", + "custom21" => "", + "custom22" => "", + "custom23" => "", + "custom24" => "", + "custom25" => "", + "custom26" => "", + "custom27" => "", + "custom28" => "", + "custom29" => "", + "custom30" => "", + "cmdImg2pdf" => "img2pdf" +]; + + +$GLOBALS["TSFE"] = new TSFE(); +// if (isset($GLOBALS["TSFE"])) { + +$GLOBALS["BE_USER"] = new User(); /// THIS STOPS RENDERING + +$GLOBALS['TYPO3_CONF_VARS'] = [ + 'EXT' => ['extConf'=>[EXT_KEY=>serialize($extConf)]], // THIS STOPS RENDERING + // $configT3qfq = unserialize($GLOBALS['TYPO3_CONF_VARS']['EXT']['extConf'][EXT_KEY]); + + 'DB' => [ + "additionalQueryRestrictions" => [], + "Connections" => [ + "Default" => [ + "charset" => "utf8", + "dbname" => "megger_qfq_t3", + "driver" => "mysqli", + "host" => "127.0.0.1", + "password" => "R76HL8s6xsDdHiuu", + "port" => 3306, + "user" => "megger_qfq" + ] + ] + ] + // $configT3qfq[SYSTEM_DB_NAME_T3] = self::getDbName($GLOBALS['TYPO3_CONF_VARS']['DB']); +]; + +$GLOBALS['TYPO3_LOADED_EXT'] = [ + EXT_KEY => ['ext_localconf.php' => '/var/www/html/megger/qfq/typo3conf/ext/qfq/ext_localconf.php'] + // if ($pos === false && isset($GLOBALS['TYPO3_LOADED_EXT'][EXT_KEY]['ext_localconf.php'])) { + // $config[SYSTEM_EXT_PATH] = dirname($GLOBALS['TYPO3_LOADED_EXT'][EXT_KEY]['ext_localconf.php']); +]; + +// Cookies +// In SessionCookie.php all cookie data is saved in a file. but this isonly used in Html2Pdf.php: foreach ($_COOKIE as $name => $value) { + +$_COOKIE[SESSION_NAME] = "rnhngphhsia6nulti8mqe35i80"; +// isset($_COOKIE[SESSION_NAME]) +// "Cookie: " . SESSION_NAME . "=" . $_COOKIE[SESSION_NAME] . "\r\n", +// $cookie = isset($_COOKIE[SESSION_NAME]) ? $_COOKIE[SESSION_NAME] : '<no session cookie>'; +// $feUser = $_COOKIE[SESSION_NAME] ?? 'fake'; +// if (isset($_COOKIE[SESSION_NAME])) { $cookie[CLIENT_COOKIE_QFQ] = $_COOKIE[SESSION_NAME]; } +// if (isset($_COOKIE[SESSION_NAME])) { unset($_COOKIE[SESSION_NAME]); setcookie(SESSION_NAME, '', time() - 86400, '/'); } + +$_COOKIE['fe_typo_user'] = "1d4751e1531fac9e145914bc12cb83f6"; +// $cookieFe = ($_COOKIE['fe_typo_user']) ?? false; +// if (isset($GLOBALS["TSFE"]->fe_user->user["username"]) && isset($_COOKIE['fe_typo_user'])) { + +//// +echo <<<EOF + +<link rel="stylesheet" type="text/css" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/css/bootstrap.min.css" media="all"> +<link rel="stylesheet" type="text/css" href="https://webwork16.math.uzh.ch/megger/qfq/typo3conf/ext/qfq/Resources/Public/Css/bootstrap-theme.min.css?1594738199" media="all"> +<link rel="stylesheet" type="text/css" href="https://webwork16.math.uzh.ch/megger/qfq/typo3conf/ext/qfq/Resources/Public/Css/qfq-bs.css?1594738199" media="all"> +<link rel="stylesheet" type="text/css" href="https://webwork16.math.uzh.ch/megger/qfq/typo3conf/ext/qfq/Resources/Public/Css/tablesorter-bootstrap.css?1594738199" media="all"> +<link rel="stylesheet" type="text/css" href="https://webwork16.math.uzh.ch/megger/qfq/typo3conf/ext/qfq/Resources/Public/Css/font-awesome.min.css?1594738199" media="all"> + + +<script src="https://webwork16.math.uzh.ch/megger/qfq/typo3conf/ext/qfq/Resources/Public/JavaScript/jquery.min.js" type="text/javascript"></script> +<script src="https://webwork16.math.uzh.ch/megger/qfq/typo3conf/ext/qfq/Resources/Public/JavaScript/validator.min.js" type="text/javascript"></script> +<script src="https://webwork16.math.uzh.ch/megger/qfq/typo3conf/ext/qfq/Resources/Public/JavaScript/tinymce.min.js" type="text/javascript"></script> +<script src="https://webwork16.math.uzh.ch/megger/qfq/typo3conf/ext/qfq/Resources/Public/JavaScript/EventEmitter.min.js" type="text/javascript"></script> +<script src="https://webwork16.math.uzh.ch/megger/qfq/typo3conf/ext/qfq/Resources/Public/JavaScript/qfq.min.js" type="text/javascript"></script> +<script src="https://webwork16.math.uzh.ch/megger/qfq/typo3conf/ext/qfq/Resources/Public/JavaScript/typeahead.bundle.min.js" type="text/javascript"></script> +<script src="https://webwork16.math.uzh.ch/megger/qfq/typo3conf/ext/qfq/Resources/Public/JavaScript/jquery.tablesorter.combined.min.js" type="text/javascript"></script> +<script src="https://webwork16.math.uzh.ch/megger/qfq/typo3conf/ext/qfq/Resources/Public/JavaScript/jquery.tablesorter.pager.min.js" type="text/javascript"></script> +<script src="https://webwork16.math.uzh.ch/megger/qfq/typo3conf/ext/qfq/Resources/Public/JavaScript/widget-columnSelector.min.js" type="text/javascript"></script> +EOF; + +$t3data = [ + "uid" => 3, + "pid" => 3, + "t3ver_oid" => 0, + "t3ver_id" => 0, + "t3ver_wsid" => 0, + "t3ver_label" => "", + "t3ver_state" => 0, + "t3ver_stage" => 0, + "t3ver_count" => 0, + "t3ver_tstamp" => 0, + "t3ver_move_id" => 0, + "t3_origuid" => 0, + "tstamp" => 1596017434, + "crdate" => 1544445105, + "cruser_id" => 2, + "editlock" => 0, + "hidden" => 0, + "sorting" => 256, + "CType" => "qfq_qfq", + "header" => "QFQ: Person", + "header_position" => "", + "rowDescription" => "", + "bodytext" => "file=home/two/qfq-person.qfqr", + "bullets_type" => 0, + "uploads_description" => 0, + "uploads_type" => 0, + "assets" => 0, + "image" => 0, + "imagewidth" => 0, + "imageorient" => 0, + "imagecols" => 2, + "imageborder" => 0, + "media" => 0, + "layout" => 0, + "frame_class" => "default", + "deleted" => 0, + "cols" => 0, + "spaceBefore" => 0, + "spaceAfter" => 0, + "space_before_class" => "", + "space_after_class" => "", + "records" => null, + "pages" => null, + "starttime" => 0, + "endtime" => 0, + "colPos" => 0, + "subheader" => "", + "fe_group" => "", + "header_link" => "", + "image_zoom" => 0, + "header_layout" => "0", + "list_type" => "", + "sectionIndex" => 1, + "linkToTop" => 0, + "file_collections" => null, + "filelink_size" => 0, + "filelink_sorting" => "", + "target" => "", + "date" => 0, + "recursive" => 0, + "imageheight" => 0, + "sys_language_uid" => 0, + "pi_flexform" => null, + "accessibility_title" => "", + "accessibility_bypass" => 0, + "accessibility_bypass_text" => "", + "l18n_parent" => 0, + "l18n_diffsource" => "a:15:{s:6:\"header\";N;s:5:\"CType\";N;s:8:\"bodytext\";N;s:6:\"hidden\";N;s:8:\"fe_group\";N;s:9:\"starttime\";N;s:7:\"endtime\";N;s:6:\"colPos\";N;s:15:\"header_position\";N;s:16:\"sys_language_uid\";N;s:6:\"layout\";N;s:13:\"header_layout\";N;s:9:\"linkToTop\";N;s:12:\"sectionIndex\";N;s:10:\"categories\";N;}", + "l10n_source" => 0, + "selected_categories" => null, + "category_field" => "", + "table_class" => "", + "table_caption" => null, + "table_delimiter" => 124, + "table_enclosure" => 0, + "table_header_position" => 0, + "table_tfoot" => 0, + "tx_impexp_origuid" => 0, + "l10n_state" => null, + "categories" => 0 +]; + +$html = ''; +$origErrorReporting = ''; +$flagOk = false; + +try { + + // By T3 default 'E_NOTICE' is unset. E.g. 'Undefined Index' will throw an exception. + // QFQ like to see those 'E_NOTICE' + $origErrorReporting = error_reporting(); + error_reporting($origErrorReporting | E_NOTICE); + + $qfq = new QuickFormQuery($t3data); + $html = $qfq->process(); + $flagOk = true; + +} catch (\UserFormException $e) { + $html = $e->formatMessage(); + +} catch (\UserReportException $e) { + $html = $e->formatMessage(); + +} catch (\CodeException $e) { + $html = $e->formatMessage(); + +} catch (\DbException $e) { + $html = $e->formatMessage(); + +} catch (\ShellException $e) { + $html = $e->formatMessage(); + +} catch (\DownloadException $e) { + $html = $e->formatMessage(); + +} catch (Exception $e) { + $html = "Generic Exception: " . $e->getMessage(); +} + +if (isset($e) && $e->getCode() == ERROR_QUIT_QFQ_REGULAR) { + $flagOk = true; +} + +if (!$flagOk) { + $html = "<div class='alert alert-warning'>$html</div>"; +} + +// Restore has to be outside of try/catch - E_NOTICE needs to unset for further T3 handling after an QFQ Exception. +error_reporting($origErrorReporting); + +echo $html; \ No newline at end of file diff --git a/extension/Classes/Core/Helper/HelperFile.php b/extension/Classes/Core/Helper/HelperFile.php index bc68d8e0a..2882ee273 100644 --- a/extension/Classes/Core/Helper/HelperFile.php +++ b/extension/Classes/Core/Helper/HelperFile.php @@ -153,6 +153,57 @@ class HelperFile { return $pathFileName; } + public static function overrideExtPath(string $path) + { +// const QFQ_EXT_DOMAIN_PATH_GLOBALS_KEY = "qfq_path_to_extension_directory_relative_to_domain_root"; +// const QFQ_EXT_FILE_PATH_GLOBALS_KEY = "qfq_absolute_file_path_to_extension_directory"; +// const APPLICATION_DOMAIN_PATH_GLOBALS_KEY = "qfq_absolute_file_path_to_application_root_directory"; +// const APPLICATION_FILE_PATH_GLOBALS_KEY = "qfq_absolute_file_path_to_application_root_directory"; +// $GLOBALS[]; + + // TODO: if global with key not exists, then set path to global. Only the first time this function is called it has en effect. + } + + private static function pathRelToExt(string $path, bool $urlPath): string + { + if (empty($path) || $path === './') { + // TODO: return path to ext + } + + // TODO: get path from global or constant + // TODO: join path + } + + private static function pathRelToApp(string $path, bool $urlPath): string + { + if (empty($path) || $path === './') { + // TODO: return path to ext + } + + // TODO: get path from global or constant + // TODO: join path + } + + public static function urlPathRelToExt(string $path = ''): string + { + return self::pathRelToExt($path, true); + } + + public static function filePathRelToExt(string $path = ''): string + { + return self::pathRelToExt($path, false); + } + + public static function urlPathRelToApp(string $path = ''): string + { + return self::pathRelToApp($path, true); + } + + public static function filePathRelToApp(string $path = ''): string + { + return self::pathRelToApp($path, false); + } + /** * Split $pathFileName into it's components and fill an array, with array keys like used in STORE_VAR. * -- GitLab From cb051f413403cca0cfec0ff8479970b22ffcc86c Mon Sep 17 00:00:00 2001 From: Marc Egger <marc.egger@uzh.ch> Date: Thu, 20 Aug 2020 17:56:23 +0200 Subject: [PATCH 063/195] Refs #11035 replace all paths from Constans.php with Path:: functions --- extension/Classes/Api/index.php | 5 + extension/Classes/Core/AbstractBuildForm.php | 9 +- extension/Classes/Core/BuildFormBootstrap.php | 19 ++- extension/Classes/Core/Constants.php | 38 +++-- extension/Classes/Core/Database/Database.php | 2 +- .../Classes/Core/Database/DatabaseUpdate.php | 5 +- extension/Classes/Core/Evaluate.php | 3 +- .../Core/Exception/AbstractException.php | 3 +- extension/Classes/Core/Helper/HelperFile.php | 57 +------- extension/Classes/Core/Helper/Logger.php | 2 +- extension/Classes/Core/Helper/Path.php | 130 ++++++++++++++++++ extension/Classes/Core/Helper/Support.php | 4 +- extension/Classes/Core/QuickFormQuery.php | 3 +- extension/Classes/Core/Report/Link.php | 11 +- extension/Classes/Core/Report/Monitor.php | 3 +- extension/Classes/Core/Report/Thumbnail.php | 5 +- extension/Classes/Core/Store/Config.php | 13 +- .../Tests/Unit/Core/Helper/HelperFileTest.php | 31 +++-- .../Tests/Unit/Core/Report/ReportTest.php | 17 +-- extension/Tests/Unit/Core/Store/StoreTest.php | 5 +- 20 files changed, 240 insertions(+), 125 deletions(-) create mode 100644 extension/Classes/Core/Helper/Path.php diff --git a/extension/Classes/Api/index.php b/extension/Classes/Api/index.php index fd955d522..ee4a11041 100644 --- a/extension/Classes/Api/index.php +++ b/extension/Classes/Api/index.php @@ -17,9 +17,13 @@ require_once(__DIR__ . '/../../vendor/autoload.php'); use http\Exception; use IMATHUZH\Qfq\Core\QuickFormQuery; +// TODO: use Path:: for paths that are defined in config +// TODO: replace the above change of constants with better method // TODO: replace all paths with typo3conf/ and /../ and fileadmin/ with correct path computing function. // TODO: replace HelperFile::correctRelativePathFileName() everywhere with the corresponding path function. // TODO: replace Logger::makePathAbsolute() +// TODO: rename extRelToCwd() to extRelToApp() ?? or extRelToIndex() ?? extRelToUrl ?? +// TODO: Compare Support::joinPath with Path::join // TODO: Read code in Core/Typo3 // TODO: comment out autoloader in T3Handler::t3AutoloadIfNotRunning() and test if this file still runs without exception. // TODO: create filePathToQfqConfig() and replace config references with this @@ -29,6 +33,7 @@ use IMATHUZH\Qfq\Core\QuickFormQuery; // TODO: Check if there are other javascript files which have to be included in qfq/Resources/Public/JavaScript // TODO: BuildFormBootstrap.php Zeile 666 ff. : API pfad automatisch anpassen // TODO: Link.php 1776: API pfad automatisch anpassen +// TODO: Monitor.php 77: Wird path. I don't know relativ to what it should be // Misc. // TODO: TablesorterController.js: pass API url as data attribute instead of hardcode (this.tablesorterApiUrl = 'typo3conf/ext/qfq/Classes/Api/setting.php';) diff --git a/extension/Classes/Core/AbstractBuildForm.php b/extension/Classes/Core/AbstractBuildForm.php index 060a0aa84..cdd066aa4 100644 --- a/extension/Classes/Core/AbstractBuildForm.php +++ b/extension/Classes/Core/AbstractBuildForm.php @@ -16,6 +16,7 @@ use IMATHUZH\Qfq\Core\Helper\KeyValueStringParser; use IMATHUZH\Qfq\Core\Helper\Ldap; use IMATHUZH\Qfq\Core\Helper\Logger; use IMATHUZH\Qfq\Core\Helper\OnArray; +use IMATHUZH\Qfq\Core\Helper\Path; use IMATHUZH\Qfq\Core\Helper\Sanitize; use IMATHUZH\Qfq\Core\Helper\Support; use IMATHUZH\Qfq\Core\Report\Link; @@ -632,7 +633,7 @@ abstract class AbstractBuildForm { */ public function getActionUrl() { - return API_DIR . '/save.php'; + return Path::apiRelToCwd(API_SAVE_PHP); } /** @@ -2544,7 +2545,7 @@ abstract class AbstractBuildForm { } if (isset($control[SUBRECORD_COLUMN_ICON][$columnName])) { - $cell = ($cell === '') ? '' : "<image src='" . PATH_ICONS . "/$cell'>"; + $cell = ($cell === '') ? '' : "<image src='" . Path::extRelToCwd(PATH_ICONS_REL_TO_EXT) . "/$cell'>"; } if (isset($control[SUBRECORD_COLUMN_MAILTO][$columnName])) { @@ -2594,7 +2595,7 @@ abstract class AbstractBuildForm { $sip = $this->store->getSipInstance(); - return $sip->queryStringToSip($queryString, $mode, API_DIR . '/' . API_DELETE_PHP); + return $sip->queryStringToSip($queryString, $mode, Path::apiRelToCwd(API_DELETE_PHP)); } /** @@ -2994,7 +2995,7 @@ abstract class AbstractBuildForm { $param[DOWNLOAD_MODE] = DOWNLOAD_MODE_FILE; $param[SIP_DOWNLOAD_PARAMETER] = base64_encode(TOKEN_FILE . PARAM_TOKEN_DELIMITER . $pathFileName); - $url = $this->sip->queryStringToSip(API_DIR . '/' . API_DOWNLOAD_PHP . '?' . KeyValueStringParser::unparse($param, '=', '&'), RETURN_URL); + $url = $this->sip->queryStringToSip(Path::apiRelToCwd(API_DOWNLOAD_PHP) . '?' . KeyValueStringParser::unparse($param, '=', '&'), RETURN_URL); return $url; } diff --git a/extension/Classes/Core/BuildFormBootstrap.php b/extension/Classes/Core/BuildFormBootstrap.php index 3d4a2d28d..3ebae0f06 100644 --- a/extension/Classes/Core/BuildFormBootstrap.php +++ b/extension/Classes/Core/BuildFormBootstrap.php @@ -11,6 +11,7 @@ namespace IMATHUZH\Qfq\Core; use IMATHUZH\Qfq\Core\Helper\HelperFormElement; use IMATHUZH\Qfq\Core\Helper\Logger; use IMATHUZH\Qfq\Core\Helper\OnArray; +use IMATHUZH\Qfq\Core\Helper\Path; use IMATHUZH\Qfq\Core\Helper\Support; @@ -656,10 +657,14 @@ class BuildFormBootstrap extends AbstractBuildForm { $actionUpload = FILE_ACTION . '=' . FILE_ACTION_UPLOAD; $actionDelete = FILE_ACTION . '=' . FILE_ACTION_DELETE; - $apiDir = API_DIR; - $apiDeletePhp = API_DIR . '/' . API_DELETE_PHP; + $apiDeletePhp = Path::apiRelToCwd(API_DELETE_PHP); - $dirtyAction = ($this->formSpec[F_DIRTY_MODE] == DIRTY_MODE_NONE) ? '' : "dirtyUrl: '$apiDir/dirty.php',"; + $dirtyAction = ($this->formSpec[F_DIRTY_MODE] == DIRTY_MODE_NONE) ? '' : "dirtyUrl: '" . Path::apiRelToCwd(API_DIRTY_PHP) . "',"; + + $submitTo = Path::apiRelToCwd(API_SAVE_PHP); + $refreshUrl = Path::apiRelToCwd(API_LOAD_PHP); + $fileUploadTo = Path::apiRelToCwd(API_FILE_PHP) . '?' . $actionUpload; + $fileDeleteUrl = Path::apiRelToCwd(API_FILE_PHP) . '?' . $actionDelete; $html .= '</form>'; // <form class="form-horizontal" ... $html .= <<<EOF @@ -671,12 +676,12 @@ class BuildFormBootstrap extends AbstractBuildForm { var qfqPage = new QfqNS.QfqPage({ tabsId: '$tabId', formId: '$formId', - submitTo: '$apiDir/save.php', + submitTo: '$submitTo', $dirtyAction deleteUrl: '$deleteUrl', - refreshUrl: '$apiDir/load.php', - fileUploadTo: '$apiDir/file.php?$actionUpload', - fileDeleteUrl: '$apiDir/file.php?$actionDelete' + refreshUrl: '$refreshUrl', + fileUploadTo: '$fileUploadTo', + fileDeleteUrl: '$fileDeleteUrl' }); diff --git a/extension/Classes/Core/Constants.php b/extension/Classes/Core/Constants.php index 69934b576..d7d27b17e 100644 --- a/extension/Classes/Core/Constants.php +++ b/extension/Classes/Core/Constants.php @@ -11,11 +11,13 @@ const CONFIG_QFQ_INI = "config.qfq.ini"; // QFQ configuration file: db access - const CONFIG_QFQ_PHP = "config.qfq.php"; // QFQ configuration file: db access const CONFIG_T3 = 'LocalConfiguration.php'; // T3 config file -const GFX_INFO = 'typo3conf/ext/qfq/Resources/Public/icons/note.gif'; -const API_DIR = 'typo3conf/ext/qfq/Classes/Api'; -const API_DIR_EXT = 'Classes/Api'; +const GFX_INFO = 'typo3conf/ext/qfq/Resources/Public/icons/note.gif'; // Deprecated! Use Path::extRelToCwd(GFX_INFO_REL_TO_EXT) instead! +const GFX_INFO_REL_TO_EXT = 'Resources/Public/icons/note.gif'; +const API_DIR = 'typo3conf/ext/qfq/Classes/Api'; // Deprecated! Use Path::apiRelToCwd() instead! +const API_DIR_EXT = 'Classes/Api'; // Deprecated! Use Path::apiRelToExt() instead! -const PATH_ICONS = 'typo3conf/ext/qfq/Resources/Public/icons'; +const PATH_ICONS = 'typo3conf/ext/qfq/Resources/Public/icons'; // Deprecated! Use Path::extRelToCwd(PATH_ICONS_REL_TO_EXT) instead! +const PATH_ICONS_REL_TO_EXT = 'Resources/Public/icons'; const QFQ_TEMP_FILE_PATTERN = 'qfq.split.XXXXX'; const QFQ_TEMP_SOURCE = '.temp.source'; @@ -490,7 +492,8 @@ const SYSTEM_DB_INDEX_QFQ = "indexQfq"; //const SYSTEM_DB_INDEX_DATA_DEPRECATED = "DB_INDEX_DATA"; //const SYSTEM_DB_INDEX_QFQ_DEPRECATED = "DB_INDEX_QFQ"; -const SYSTEM_FILEADMIN_PROTECTED_LOG = 'fileadmin/protected/log'; +const SYSTEM_FILEADMIN_PROTECTED_LOG = 'fileadmin/protected/log'; // Deprecated! Use: Path::appRelToCwd(SYSTEM_FILEADMIN_PROTECTED_LOG_REL_TO_APP) +const SYSTEM_FILEADMIN_PROTECTED_LOG_REL_TO_APP = 'fileadmin/protected/log'; // Automatically filled by QFQ const SYSTEM_DB_NAME_DATA = 'dbNameData'; @@ -498,13 +501,16 @@ const SYSTEM_DB_NAME_QFQ = 'dbNameQfq'; const SYSTEM_DB_NAME_T3 = 'dbNameT3'; const SYSTEM_QFQ_LOG = 'qfqLog'; // Logging to file -const SYSTEM_QFQ_LOG_FILE = 'fileadmin/protected/log/qfq.log'; +const SYSTEM_QFQ_LOG_FILE = 'fileadmin/protected/log/qfq.log'; // Deprecated! Use: Path::appRelToCwd(SYSTEM_QFQ_LOG_FILE_REL_TO_APP) +const SYSTEM_QFQ_LOG_FILE_REL_TO_APP = 'fileadmin/protected/log/qfq.log'; const SYSTEM_MAIL_LOG = 'mailLog'; -const SYSTEM_MAIL_LOG_FILE = 'fileadmin/protected/log/mail.log'; +const SYSTEM_MAIL_LOG_FILE = 'fileadmin/protected/log/mail.log'; // Deprecated! Use: Path::appRelToCwd(SYSTEM_MAIL_LOG_FILE_REL_TO_APP) +const SYSTEM_MAIL_LOG_FILE_REL_TO_APP = 'fileadmin/protected/log/mail.log'; const SYSTEM_SQL_LOG = 'sqlLog'; // Logging to file -const SYSTEM_SQL_LOG_FILE = 'fileadmin/protected/log/sql.log'; +const SYSTEM_SQL_LOG_FILE = 'fileadmin/protected/log/sql.log'; // Deprecated! Use: Path::appRelToCwd(SYSTEM_SQL_LOG_FILE_REL_TO_APP) +const SYSTEM_SQL_LOG_FILE_REL_TO_APP = 'fileadmin/protected/log/sql.log'; const SYSTEM_SQL_LOG_MODE = 'sqlLogMode'; // Mode, which statements to log. const SYSTEM_SQL_LOG_MODE_AUTOCRON = 'sqlLogModeAutoCron'; // Mode, which statements to log in AutoCron Environments. @@ -653,9 +659,11 @@ const SYSTEM_CMD_PDFUNITE = 'cmdPdfunite'; // Thumbnail const SYSTEM_THUMBNAIL_DIR_SECURE = 'thumbnailDirSecure'; -const SYSTEM_THUMBNAIL_DIR_SECURE_DEFAULT = 'fileadmin/protected/qfqThumbnail'; +const SYSTEM_THUMBNAIL_DIR_SECURE_DEFAULT = 'fileadmin/protected/qfqThumbnail'; // Deprecated! Use: Path::appRelToCwd(SYSTEM_THUMBNAIL_DIR_SECURE_DEFAULT_REL_TO_APP) +const SYSTEM_THUMBNAIL_DIR_SECURE_DEFAULT_REL_TO_APP = 'fileadmin/protected/qfqThumbnail'; const SYSTEM_THUMBNAIL_DIR_PUBLIC = 'thumbnailDirPublic'; -const SYSTEM_THUMBNAIL_DIR_PUBLIC_DEFAULT = 'typo3temp/qfqThumbnail'; +const SYSTEM_THUMBNAIL_DIR_PUBLIC_DEFAULT = 'typo3temp/qfqThumbnail'; // Deprecated! Use: Path::appRelToCwd(SYSTEM_THUMBNAIL_DIR_PUBLIC_DEFAULT_REL_TO_APP) +const SYSTEM_THUMBNAIL_DIR_PUBLIC_DEFAULT_REL_TO_APP = 'typo3temp/qfqThumbnail'; // Form/Report as file const SYSTEM_QFQ_PROJECT_DIR_SECURE = 'qfqProjectDir'; // where form and report files are saved @@ -804,6 +812,10 @@ const MODE_LDAP_MULTI = 'ldapMulti'; // api/save.php, api/delete.php, api/load.php const API_DELETE_PHP = 'delete.php'; +const API_DIRTY_PHP = 'dirty.php'; +const API_SAVE_PHP = 'save.php'; +const API_LOAD_PHP = 'load.php'; +const API_FILE_PHP = 'file.php'; const API_DOWNLOAD_PHP = 'download.php'; const API_DRAG_AND_DROP_PHP = 'dragAndDrop.php'; @@ -1472,7 +1484,8 @@ const COLUMN_PATH_FILE_NAME = 'pathFileName'; const EXISTING_PATH_FILE_NAME = '_existingPathFileName'; const THUMBNAIL_WIDTH_DEFAULT = '150x'; -const THUMBNAIL_UNKNOWN_TYPE = 'typo3/sysext/frontend/Resources/Public/Icons/FileIcons/'; +const THUMBNAIL_UNKNOWN_TYPE = 'typo3/sysext/frontend/Resources/Public/Icons/FileIcons/'; // Deprecated! Use: Path::appRelToCwd(THUMBNAIL_UNKNOWN_TYPE_REL_TO_APP) +const THUMBNAIL_UNKNOWN_TYPE_REL_TO_APP = 'typo3/sysext/frontend/Resources/Public/Icons/FileIcons/'; const THUMBNAIL_MAX_SECONDS = 60; const THUMBNAIL_PREPARE = 'prepare'; const THUMBNAIL_VIA_DOWNLOAD = 'secureFile'; @@ -1889,7 +1902,8 @@ const AUTOCRON_COUNT = 'count'; // Annotate const ANNOTATE_GRAPHIC_CSS_CLASS = 'annotate-graphic'; // Ex 'fabric' const ANNOTATE_TEXT_CSS_CLASS = 'annotate-text'; // Ex 'codeCorrection -const DIR_HIGHLIGHT_JSON = 'typo3conf/ext/qfq/Resources/Public/Json'; +const DIR_HIGHLIGHT_JSON = 'typo3conf/ext/qfq/Resources/Public/Json'; // Deprecated! Use: Path::appRelToCwd(DIR_HIGHLIGHT_JSON_REL_TO_APP) +const DIR_HIGHLIGHT_JSON_REL_TO_APP = 'typo3conf/ext/qfq/Resources/Public/Json'; // DataImport const IMPORT_MODE_APPEND = 'append'; diff --git a/extension/Classes/Core/Database/Database.php b/extension/Classes/Core/Database/Database.php index 07ef4bd8d..760b3e67f 100644 --- a/extension/Classes/Core/Database/Database.php +++ b/extension/Classes/Core/Database/Database.php @@ -1044,7 +1044,7 @@ class Database { * @throws \UserFormException */ public function getQfqLogFile() { - return ($this->store == null) ? SYSTEM_QFQ_LOG_FILE : $this->store->getVar(SYSTEM_QFQ_LOG, STORE_SYSTEM); + return ($this->store == null) ? Path::appRelToCwd(SYSTEM_QFQ_LOG_FILE_REL_TO_APP) : $this->store->getVar(SYSTEM_QFQ_LOG, STORE_SYSTEM); } /** diff --git a/extension/Classes/Core/Database/DatabaseUpdate.php b/extension/Classes/Core/Database/DatabaseUpdate.php index 175541351..bbd7ad966 100644 --- a/extension/Classes/Core/Database/DatabaseUpdate.php +++ b/extension/Classes/Core/Database/DatabaseUpdate.php @@ -10,6 +10,7 @@ namespace IMATHUZH\Qfq\Core\Database; use IMATHUZH\Qfq\Core\Form\FormAsFile; use IMATHUZH\Qfq\Core\Helper\Logger; +use IMATHUZH\Qfq\Core\Helper\Path; use IMATHUZH\Qfq\Core\Store\Store; use IMATHUZH\Qfq\Core\Typo3\T3Handler; @@ -293,7 +294,7 @@ class DatabaseUpdate { if ($actionSpecialColumn === ACTION_SPECIAL_COLUMN_DO_REPLACE) { // save log file $message = '<h1>Special column names replaced</h1>The following special column names were replaced.<hr>' . $message; - Logger::logMessage($message, SYSTEM_FILEADMIN_PROTECTED_LOG . '/' . date("YmdHi") . '_special_columns_auto_update.html'); + Logger::logMessage($message, Path::appRelToCwd(SYSTEM_FILEADMIN_PROTECTED_LOG_REL_TO_APP) . '/' . date("YmdHi") . '_special_columns_auto_update.html'); } elseif ($actionSpecialColumn === ACTION_SPECIAL_COLUMN_DO_SKIP_REPLACE) { // do nothing } else { @@ -305,7 +306,7 @@ class DatabaseUpdate { . 'Click <a href="?' . http_build_query(array_merge($_GET, array(ACTION_SPECIAL_COLUMN_UPDATE => ACTION_SPECIAL_COLUMN_DO_REPLACE))) . '">Auto-Replace</a>' . ' to automatically prepend the found column names with an underscore.' . ' In the report below the missing underscores are marked by "<span style="font-weight: bold; color: red;">>>>_</span>".' - . ' This report will be saved in ' . SYSTEM_FILEADMIN_PROTECTED_LOG . ' after the automatic replacement.' + . ' This report will be saved in ' . Path::appRelToCwd(SYSTEM_FILEADMIN_PROTECTED_LOG_REL_TO_APP) . ' after the automatic replacement.' . ' <br><br>To update qfq without changing the special columns (your app will probably be broken): ' . '<a href="?' . http_build_query(array_merge($_GET, array(ACTION_SPECIAL_COLUMN_UPDATE => ACTION_SPECIAL_COLUMN_DO_SKIP_REPLACE))) . '">Skip Auto-Replace</a>' . '<h2>Report</h2>' diff --git a/extension/Classes/Core/Evaluate.php b/extension/Classes/Core/Evaluate.php index 55521c573..471130356 100644 --- a/extension/Classes/Core/Evaluate.php +++ b/extension/Classes/Core/Evaluate.php @@ -11,6 +11,7 @@ namespace IMATHUZH\Qfq\Core; use IMATHUZH\Qfq\Core\Database\Database; use IMATHUZH\Qfq\Core\Helper\KeyValueStringParser; use IMATHUZH\Qfq\Core\Helper\OnString; +use IMATHUZH\Qfq\Core\Helper\Path; use IMATHUZH\Qfq\Core\Helper\Support; use IMATHUZH\Qfq\Core\Report\Link; use IMATHUZH\Qfq\Core\Report\Tablesorter; @@ -292,7 +293,7 @@ class Evaluate { $this->store::setVar(SYSTEM_DRAG_AND_DROP_JS, 'true', STORE_SYSTEM); // data-dnd-api="typo3conf/ext/qfq/qfq/Api/dragAndDrop.php?s={{'U:form=<form name>[¶mX=<any value>]|s|r:8' AS _link}}" - return DND_DATA_DND_API . '="' . API_DIR . '/' . API_DRAG_AND_DROP_PHP . '?s=' . $s . '"'; + return DND_DATA_DND_API . '="' . Path::apiRelToCwd(API_DRAG_AND_DROP_PHP) . '?s=' . $s . '"'; } /** diff --git a/extension/Classes/Core/Exception/AbstractException.php b/extension/Classes/Core/Exception/AbstractException.php index 388a45b0b..729b8dbfd 100644 --- a/extension/Classes/Core/Exception/AbstractException.php +++ b/extension/Classes/Core/Exception/AbstractException.php @@ -8,6 +8,7 @@ namespace IMATHUZH\Qfq\Core\Exception; +use IMATHUZH\Qfq\Core\Helper\Path; use IMATHUZH\Qfq\Core\QuickFormQuery; use IMATHUZH\Qfq\Core\Store\Store; use IMATHUZH\Qfq\Core\Store\Sip; @@ -189,7 +190,7 @@ class AbstractException extends \Exception { } } - $qfqLog = ($store == null) ? SYSTEM_QFQ_LOG_FILE : $store->getVar(SYSTEM_QFQ_LOG, STORE_SYSTEM); + $qfqLog = ($store == null) ? Path::appRelToCwd(SYSTEM_QFQ_LOG_FILE_REL_TO_APP) : $store->getVar(SYSTEM_QFQ_LOG, STORE_SYSTEM); $arrDebugHidden[EXCEPTION_STACKTRACE] = PHP_EOL . implode($arrTrace, PHP_EOL); $arrLogAll = array_merge($arrMsg, $arrShow, $arrDebugShow, $arrDebugHidden); $logAll = OnArray::arrayToLog($arrLogAll); diff --git a/extension/Classes/Core/Helper/HelperFile.php b/extension/Classes/Core/Helper/HelperFile.php index 2882ee273..e1e1489ec 100644 --- a/extension/Classes/Core/Helper/HelperFile.php +++ b/extension/Classes/Core/Helper/HelperFile.php @@ -145,65 +145,14 @@ class HelperFile { return $pathFileName; } - $length = strlen('/' . API_DIR_EXT); - if (substr(getcwd(), -$length) == '/' . API_DIR_EXT) { + $length = strlen('/' . Path::apiRelToExt()); + if (substr(getcwd(), -$length) == '/' . Path::apiRelToExt()) { return '../../../../../' . $pathFileName; } return $pathFileName; } - public static function overrideExtPath(string $path) - { -// const QFQ_EXT_DOMAIN_PATH_GLOBALS_KEY = "qfq_path_to_extension_directory_relative_to_domain_root"; -// const QFQ_EXT_FILE_PATH_GLOBALS_KEY = "qfq_absolute_file_path_to_extension_directory"; -// const APPLICATION_DOMAIN_PATH_GLOBALS_KEY = "qfq_absolute_file_path_to_application_root_directory"; -// const APPLICATION_FILE_PATH_GLOBALS_KEY = "qfq_absolute_file_path_to_application_root_directory"; -// $GLOBALS[]; - - // TODO: if global with key not exists, then set path to global. Only the first time this function is called it has en effect. - } - - private static function pathRelToExt(string $path, bool $urlPath): string - { - if (empty($path) || $path === './') { - // TODO: return path to ext - } - - // TODO: get path from global or constant - // TODO: join path - } - - private static function pathRelToApp(string $path, bool $urlPath): string - { - if (empty($path) || $path === './') { - // TODO: return path to ext - } - - // TODO: get path from global or constant - // TODO: join path - } - - public static function urlPathRelToExt(string $path = ''): string - { - return self::pathRelToExt($path, true); - } - - public static function filePathRelToExt(string $path = ''): string - { - return self::pathRelToExt($path, false); - } - - public static function urlPathRelToApp(string $path = ''): string - { - return self::pathRelToApp($path, true); - } - - public static function filePathRelToApp(string $path = ''): string - { - return self::pathRelToApp($path, false); - } - /** * Split $pathFileName into it's components and fill an array, with array keys like used in STORE_VAR. * @@ -526,7 +475,7 @@ class HelperFile { } if (isset($extToFileType[$ext])) { - return DIR_HIGHLIGHT_JSON . '/' . $extToFileType[$ext]; + return Path::appRelToCwd(DIR_HIGHLIGHT_JSON_REL_TO_APP) . '/' . $extToFileType[$ext]; } return ''; diff --git a/extension/Classes/Core/Helper/Logger.php b/extension/Classes/Core/Helper/Logger.php index 9d7b8c934..1291bed75 100644 --- a/extension/Classes/Core/Helper/Logger.php +++ b/extension/Classes/Core/Helper/Logger.php @@ -112,7 +112,7 @@ class Logger { if (self::$systemSitePath == '') { if (defined('PHPUNIT_QFQ')) { - if (strpos(getcwd(), 'qfq/' . API_DIR_EXT) !== false) { + if (strpos(getcwd(), 'qfq/' . Path::apiRelToExt()) !== false) { return ('../../../../../' . $filename); } return $filename; diff --git a/extension/Classes/Core/Helper/Path.php b/extension/Classes/Core/Helper/Path.php new file mode 100644 index 000000000..0b30ba298 --- /dev/null +++ b/extension/Classes/Core/Helper/Path.php @@ -0,0 +1,130 @@ +<?php + + +namespace IMATHUZH\Qfq\Core\Helper; + +/* + +Path::apiRelToCwd(API_SAVE_PHP) === API_DIR . '/save.php' +Path::apiRelToCwd(API_LOAD_PHP) === API_DIR . '/load.php' +Path::apiRelToCwd(API_FILE_PHP) . '?' . $actionUpload === API_DIR . '/file.php?' . $actionUpload +Path::apiRelToCwd(API_FILE_PHP) . '?' . $actionDelete === API_DIR . '/file.php?' . $actionDelete +Path::apiRelToCwd(API_DIRTY_PHP) === API_DIR . "/" . API_DIRTY_PHP +Path::apiRelToCwd(API_DRAG_AND_DROP_PHP) === API_DIR . '/' . API_DRAG_AND_DROP_PHP +Path::apiRelToCwd(API_SAVE_PHP) === API_DIR . "/" . "save.php" +Path::apiRelToCwd(API_DOWNLOAD_PHP) === API_DIR . '/' . API_DOWNLOAD_PHP +Path::apiRelToCwd(API_DELETE_PHP) === API_DIR . '/' . API_DELETE_PHP + +Path::apiRelToExt() === API_DIR_EXT +Path::apiRelToExt(API_DOWNLOAD_PHP) === API_DIR_EXT . '/' . API_DOWNLOAD_PHP + +Path::extRelToCwd(GFX_INFO_REL_TO_EXT) === GFX_INFO + +Path::extRelToCwd(PATH_ICONS_REL_TO_EXT) === PATH_ICONS + +Path::appRelToCwd(SYSTEM_FILEADMIN_PROTECTED_LOG_REL_TO_APP) === SYSTEM_FILEADMIN_PROTECTED_LOG +Path::appRelToCwd(SYSTEM_QFQ_LOG_FILE_REL_TO_APP) === SYSTEM_QFQ_LOG_FILE +Path::appRelToCwd(SYSTEM_THUMBNAIL_DIR_SECURE_DEFAULT_REL_TO_APP) === SYSTEM_THUMBNAIL_DIR_SECURE_DEFAULT +Path::appRelToCwd(SYSTEM_THUMBNAIL_DIR_PUBLIC_DEFAULT_REL_TO_APP) === SYSTEM_THUMBNAIL_DIR_PUBLIC_DEFAULT +Path::appRelToCwd(THUMBNAIL_UNKNOWN_TYPE_REL_TO_APP) === THUMBNAIL_UNKNOWN_TYPE +Path::appRelToCwd(DIR_HIGHLIGHT_JSON_REL_TO_APP) === DIR_HIGHLIGHT_JSON + + + */ + +class Path +{ + /* + public static function overrideExtPath(string $path) + { +// const QFQ_EXT_DOMAIN_PATH_GLOBALS_KEY = "qfq_path_to_extension_directory_relative_to_domain_root"; +// const QFQ_EXT_FILE_PATH_GLOBALS_KEY = "qfq_absolute_file_path_to_extension_directory"; +// const APPLICATION_DOMAIN_PATH_GLOBALS_KEY = "qfq_absolute_file_path_to_application_root_directory"; +// const APPLICATION_FILE_PATH_GLOBALS_KEY = "qfq_absolute_file_path_to_application_root_directory"; +// $GLOBALS[]; + + // TODO: if global with key not exists, then set path to global. Only the first time this function is called it has en effect. + } + */ + + /** + * Return path relative to CWD + * + * Path::pathRelToExt("Classes/Api") + * Path::relToExt("Classes/Api") + * Path::extRelToCwd("Classes/Api") + * + * + * @param string $pathRelToExt + * @return string + */ + public static function extRelToCwd(string $pathRelToExt = ''): string + { + $extPathRelToCwd = 'typo3conf/ext/qfq'; + return self::join($extPathRelToCwd, $pathRelToExt); + } + + public static function apiRelToExt(string $pathRelToApi = ''): string + { + $apiPathRelToExt = 'Classes/Api'; + return self::join($apiPathRelToExt, $pathRelToApi); + } + + public static function apiRelToCwd(string $pathRelToApi = ''): string + { + return self::extRelToCwd(self::apiRelToExt($pathRelToApi)); + } + + public static function appRelToCwd(string $pathRelToExt = ''): string + { + $appPathRelToCwd = ''; + return self::join($appPathRelToCwd, $pathRelToExt); + } + + public static function join(): string + { + // Filter out empty string and null arguments + $pieces = array_filter(func_get_args(), function($value) { return !is_null($value) && $value !== ''; }); + + if (empty($pieces)) { + return ''; + } + $firstPiece = array_shift($pieces); + if (empty($pieces)) { + return $firstPiece; + } + return $firstPiece . '/' . implode($pieces,'/'); + } + + /* + public static function appRelToCwd(string $path): string + { + if (empty($path) || $path === './') { + // TODO: return path to ext + } + + // TODO: get path from global or constant + // TODO: join path + } + + public static function urlPathRelToExt(string $path = ''): string + { + return self::pathRelToExt($path, true); + } + + public static function filePathRelToExt(string $path = ''): string + { + return self::pathRelToExt($path, false); + } + + public static function urlPathRelToApp(string $path = ''): string + { + return self::pathRelToApp($path, true); + } + + public static function filePathRelToApp(string $path = ''): string + { + return self::pathRelToApp($path, false); + } + */ +} \ No newline at end of file diff --git a/extension/Classes/Core/Helper/Support.php b/extension/Classes/Core/Helper/Support.php index 915642a7e..3aac21faf 100644 --- a/extension/Classes/Core/Helper/Support.php +++ b/extension/Classes/Core/Helper/Support.php @@ -123,7 +123,7 @@ class Support { throw new \CodeException('Unknown mode: ' . $formLogMode, ERROR_UNKNOWN_TOKEN); } - $filename = SYSTEM_FILEADMIN_PROTECTED_LOG . '/' . $formName . "." . $perBeSession . "log"; + $filename = Path::appRelToCwd(SYSTEM_FILEADMIN_PROTECTED_LOG_REL_TO_APP) . '/' . $formName . "." . $perBeSession . "log"; return sanitize::safeFilename($filename, false, true); } @@ -236,7 +236,7 @@ class Support { */ public static function doTooltip($htmlId, $tooltipText) { - return "<img " . self::doAttribute('id', $htmlId) . " src='" . GFX_INFO . "' title=\"" . htmlentities($tooltipText) . "\">"; + return "<img " . self::doAttribute('id', $htmlId) . " src='" . Path::extRelToCwd(GFX_INFO_REL_TO_EXT) . "' title=\"" . htmlentities($tooltipText) . "\">"; } /** diff --git a/extension/Classes/Core/QuickFormQuery.php b/extension/Classes/Core/QuickFormQuery.php index b6fe29186..3cf4257e1 100644 --- a/extension/Classes/Core/QuickFormQuery.php +++ b/extension/Classes/Core/QuickFormQuery.php @@ -21,6 +21,7 @@ use IMATHUZH\Qfq\Core\Helper\HelperFormElement; use IMATHUZH\Qfq\Core\Helper\KeyValueStringParser; use IMATHUZH\Qfq\Core\Helper\Logger; use IMATHUZH\Qfq\Core\Helper\OnArray; +use IMATHUZH\Qfq\Core\Helper\Path; use IMATHUZH\Qfq\Core\Helper\Support; use IMATHUZH\Qfq\Core\Report\Monitor; use IMATHUZH\Qfq\Core\Report\Report; @@ -1778,7 +1779,7 @@ class QuickFormQuery { $form = join(' ', [$headerBar, $codeBox]); $sipObj = new Sip; - $action = $sipObj->queryStringToSip(API_DIR . "/save.php?uid=$uid&" . REPORT_SAVE . "=1"); + $action = $sipObj->queryStringToSip(Path::apiRelToCwd(API_SAVE_PHP) . "?uid=$uid&" . REPORT_SAVE . "=1"); $formAttributes = Support::doAttribute('id', "tt-content-edit-$uid") . Support::doAttribute('class', 'hidden') . Support::doAttribute('method', 'post') . diff --git a/extension/Classes/Core/Report/Link.php b/extension/Classes/Core/Report/Link.php index 1bafcc25c..411359701 100644 --- a/extension/Classes/Core/Report/Link.php +++ b/extension/Classes/Core/Report/Link.php @@ -26,6 +26,7 @@ namespace IMATHUZH\Qfq\Core\Report; use IMATHUZH\Qfq\Core\Helper\KeyValueStringParser; use IMATHUZH\Qfq\Core\Helper\OnArray; +use IMATHUZH\Qfq\Core\Helper\Path; use IMATHUZH\Qfq\Core\Helper\Support; use IMATHUZH\Qfq\Core\Helper\Token; use IMATHUZH\Qfq\Core\Helper\Sanitize; @@ -1590,7 +1591,7 @@ EOF; onclick="$('#qfqModalTitle101').text($(this).data('title')); $('#qfqModalText101').text($(this).data('text'));" EOF; - $vars[NAME_URL] = API_DIR . '/' . API_DOWNLOAD_PHP; + $vars[NAME_URL] = Path::apiRelToCwd(API_DOWNLOAD_PHP); $vars[NAME_LINK_CLASS_DEFAULT] = NO_CLASS; $vars[NAME_EXTRA_CONTENT_WRAP] = '<span ' . $attributes . $onClick . '>'; @@ -1652,7 +1653,7 @@ EOF; $vars[NAME_TOOL_TIP] .= PHP_EOL . PHP_EOL . $this->sip->debugSip($paramArray); } - $source = json_encode(['uri' => API_DIR . '/' . API_DOWNLOAD_PHP . '?s=' . $paramArray[SIP_SIP]]); + $source = json_encode(['uri' => Path::apiRelToCwd(API_DOWNLOAD_PHP) . '?s=' . $paramArray[SIP_SIP]]); } else { throw new \UserReportException("Missing content for 'copy to clipboard'", ERROR_MISSING_CONTENT); } @@ -1704,7 +1705,7 @@ EOF; $vars[NAME_ALT_TEXT] = "Bullet " . $value; } - $vars[NAME_IMAGE] = PATH_ICONS . "/bullet-" . $value . '.gif'; + $vars[NAME_IMAGE] = Path::extRelToCwd(PATH_ICONS_REL_TO_EXT) . "/bullet-" . $value . '.gif'; $vars[NAME_IMAGE_TITLE] = $value; $vars[NAME_LINK_CLASS_DEFAULT] = NO_CLASS; @@ -1729,7 +1730,7 @@ EOF; $vars[NAME_ALT_TEXT] = "Checked " . $value; } - $vars[NAME_IMAGE] = PATH_ICONS . "/checked-" . $value . '.gif'; + $vars[NAME_IMAGE] = Path::extRelToCwd(PATH_ICONS_REL_TO_EXT) . "/checked-" . $value . '.gif'; $vars[NAME_IMAGE_TITLE] = $value; $vars[NAME_LINK_CLASS_DEFAULT] = NO_CLASS; @@ -1773,7 +1774,7 @@ EOF; } if ($vars[NAME_URL] == '') { - $vars[NAME_URL] = API_DIR . '/' . API_DELETE_PHP; + $vars[NAME_URL] = Path::apiRelToCwd(API_DELETE_PHP); } if (!isset($vars[NAME_LINK_CLASS])) { diff --git a/extension/Classes/Core/Report/Monitor.php b/extension/Classes/Core/Report/Monitor.php index 0686d24b6..f011cb1d5 100644 --- a/extension/Classes/Core/Report/Monitor.php +++ b/extension/Classes/Core/Report/Monitor.php @@ -11,6 +11,7 @@ namespace IMATHUZH\Qfq\Core\Report; +use IMATHUZH\Qfq\Core\Helper\Path; use IMATHUZH\Qfq\Core\Store\Session; use IMATHUZH\Qfq\Core\Store\Store; use IMATHUZH\Qfq\Core\Helper\Support; @@ -73,7 +74,7 @@ class Monitor { '&' . TOKEN_L_TAIL . '=' . $vars[TOKEN_L_TAIL] . '&' . TOKEN_L_APPEND . '=' . $vars[TOKEN_L_APPEND]; // $url = store::getSipInstance()->queryStringToSip(API_DIR . '/' . API_DOWNLOAD_PHP . '?' . $queryString, RETURN_URL); - $arr = store::getSipInstance()->queryStringToSip('../../../'. API_DIR_EXT . '/' . API_DOWNLOAD_PHP . '?' . $queryString, RETURN_ARRAY); + $arr = store::getSipInstance()->queryStringToSip('../../../'. Path::apiRelToExt(API_DOWNLOAD_PHP) . '?' . $queryString, RETURN_ARRAY); $url = $arr[SIP_SIP_URL]; // On page reload, take care to remove optional existing old seek position. diff --git a/extension/Classes/Core/Report/Thumbnail.php b/extension/Classes/Core/Report/Thumbnail.php index 2db178440..57c8c5bc8 100644 --- a/extension/Classes/Core/Report/Thumbnail.php +++ b/extension/Classes/Core/Report/Thumbnail.php @@ -12,6 +12,7 @@ namespace IMATHUZH\Qfq\Core\Report; use IMATHUZH\Qfq\Core\Helper\HelperFile; +use IMATHUZH\Qfq\Core\Helper\Path; use IMATHUZH\Qfq\Core\Store\Store; use IMATHUZH\Qfq\Core\Helper\Support; use IMATHUZH\Qfq\Core\Helper\Token; @@ -220,7 +221,7 @@ class Thumbnail { break; default: - $placeholder = Support::joinPath(THUMBNAIL_UNKNOWN_TYPE, $ext . '.gif'); + $placeholder = Support::joinPath(Path::appRelToCwd(THUMBNAIL_UNKNOWN_TYPE_REL_TO_APP), $ext . '.gif'); if (is_readable($placeholder)) { return $placeholder; } @@ -288,7 +289,7 @@ class Thumbnail { */ private function buildSecureDownloadLink($pathFilenameThumbnail, $str) { - $urlParam = API_DIR . '/' . API_DOWNLOAD_PHP . '?' . DOWNLOAD_MODE . '=' . DOWNLOAD_MODE_THUMBNAIL; + $urlParam = Path::apiRelToCwd(API_DOWNLOAD_PHP) . '?' . DOWNLOAD_MODE . '=' . DOWNLOAD_MODE_THUMBNAIL; $urlParam .= '&' . SIP_DOWNLOAD_PARAMETER . '=' . base64_encode(TOKEN_FILE . ':' . $pathFilenameThumbnail . '|' . $str); $sip = $this->store->getSipInstance(); diff --git a/extension/Classes/Core/Store/Config.php b/extension/Classes/Core/Store/Config.php index 29a638c9b..e5b786a15 100644 --- a/extension/Classes/Core/Store/Config.php +++ b/extension/Classes/Core/Store/Config.php @@ -9,6 +9,7 @@ namespace IMATHUZH\Qfq\Core\Store; use IMATHUZH\Qfq\Core\Helper\Logger; +use IMATHUZH\Qfq\Core\Helper\Path; use IMATHUZH\Qfq\Core\Helper\Support; use IMATHUZH\Qfq\Core\Helper\OnString; @@ -266,7 +267,7 @@ class Config { } Logger::logMessage(Logger::linePre() . 'Security: attack detected' . PHP_EOL . $reason, - $config[SYSTEM_QFQ_LOG] ?? SYSTEM_QFQ_LOG_FILE); + $config[SYSTEM_QFQ_LOG] ?? Path::appRelToCwd(SYSTEM_QFQ_LOG_FILE_REL_TO_APP)); // In case of an attack: log out the current user. Session::destroy(); @@ -314,9 +315,9 @@ class Config { SYSTEM_RENDER => SYSTEM_RENDER_SINGLE, SYSTEM_DATE_FORMAT => 'yyyy-mm-dd', SYSTEM_SHOW_DEBUG_INFO => SYSTEM_SHOW_DEBUG_INFO_AUTO, - SYSTEM_MAIL_LOG => SYSTEM_MAIL_LOG_FILE, - SYSTEM_QFQ_LOG => SYSTEM_QFQ_LOG_FILE, - SYSTEM_SQL_LOG => SYSTEM_SQL_LOG_FILE, + SYSTEM_MAIL_LOG => Path::appRelToCwd(SYSTEM_MAIL_LOG_FILE_REL_TO_APP), + SYSTEM_QFQ_LOG => Path::appRelToCwd(SYSTEM_QFQ_LOG_FILE_REL_TO_APP), + SYSTEM_SQL_LOG => Path::appRelToCwd(SYSTEM_SQL_LOG_FILE_REL_TO_APP), SYSTEM_SQL_LOG_MODE => 'modify', SYSTEM_SQL_LOG_MODE_AUTOCRON => 'error', F_BS_COLUMNS => 'col-md-12 col-lg-10', @@ -378,8 +379,8 @@ class Config { SYSTEM_CMD_GS => 'gs', SYSTEM_CMD_PDFUNITE => 'pdfunite', - SYSTEM_THUMBNAIL_DIR_SECURE => SYSTEM_THUMBNAIL_DIR_SECURE_DEFAULT, - SYSTEM_THUMBNAIL_DIR_PUBLIC => SYSTEM_THUMBNAIL_DIR_PUBLIC_DEFAULT, + SYSTEM_THUMBNAIL_DIR_SECURE => Path::appRelToCwd(SYSTEM_THUMBNAIL_DIR_SECURE_DEFAULT_REL_TO_APP), + SYSTEM_THUMBNAIL_DIR_PUBLIC => Path::appRelToCwd(SYSTEM_THUMBNAIL_DIR_PUBLIC_DEFAULT_REL_TO_APP), F_FE_DATA_REQUIRED_ERROR => F_FE_DATA_REQUIRED_ERROR_DEFAULT, F_FE_DATA_MATCH_ERROR => F_FE_DATA_MATCH_ERROR_DEFAULT, diff --git a/extension/Tests/Unit/Core/Helper/HelperFileTest.php b/extension/Tests/Unit/Core/Helper/HelperFileTest.php index 98ae13a4f..fa9fea521 100644 --- a/extension/Tests/Unit/Core/Helper/HelperFileTest.php +++ b/extension/Tests/Unit/Core/Helper/HelperFileTest.php @@ -10,6 +10,7 @@ namespace IMATHUZH\Qfq\Tests\Unit\Core\Helper; use IMATHUZH\Qfq\Core\Helper\HelperFile; +use IMATHUZH\Qfq\Core\Helper\Path; use PHPUnit\Framework\TestCase; @@ -32,21 +33,21 @@ class HelperFileTest extends TestCase { $this->assertEquals('', HelperFile::getFileTypeHighlight(FE_HIGHLIGHT_AUTO,'')); - $this->assertEquals(DIR_HIGHLIGHT_JSON . '/javascript.json', HelperFile::getFileTypeHighlight(FE_HIGHLIGHT_JAVASCRIPT,'')); - $this->assertEquals(DIR_HIGHLIGHT_JSON . '/highlight.qfq.json', HelperFile::getFileTypeHighlight(FE_HIGHLIGHT_QFQ,'')); - $this->assertEquals(DIR_HIGHLIGHT_JSON . '/highlight.py.json', HelperFile::getFileTypeHighlight(FE_HIGHLIGHT_PYTHON,'')); - $this->assertEquals(DIR_HIGHLIGHT_JSON . '/highlight.m.json', HelperFile::getFileTypeHighlight(FE_HIGHLIGHT_MATLAB,'')); - - $this->assertEquals(DIR_HIGHLIGHT_JSON . '/javascript.json', HelperFile::getFileTypeHighlight(FE_HIGHLIGHT_JAVASCRIPT,'fileadmin/test.js')); - $this->assertEquals(DIR_HIGHLIGHT_JSON . '/highlight.qfq.json', HelperFile::getFileTypeHighlight(FE_HIGHLIGHT_QFQ, 'fileadmin/test.js')); - $this->assertEquals(DIR_HIGHLIGHT_JSON . '/highlight.py.json', HelperFile::getFileTypeHighlight(FE_HIGHLIGHT_PYTHON, 'fileadmin/test.js')); - $this->assertEquals(DIR_HIGHLIGHT_JSON . '/highlight.m.json', HelperFile::getFileTypeHighlight(FE_HIGHLIGHT_MATLAB, 'fileadmin/test.js')); - - $this->assertEquals(DIR_HIGHLIGHT_JSON . '/javascript.json', HelperFile::getFileTypeHighlight(FE_HIGHLIGHT_AUTO, 'fileadmin/test.js')); - $this->assertEquals(DIR_HIGHLIGHT_JSON . '/highlight.php.json', HelperFile::getFileTypeHighlight(FE_HIGHLIGHT_AUTO, 'fileadmin/test.php')); - $this->assertEquals(DIR_HIGHLIGHT_JSON . '/highlight.qfq.json', HelperFile::getFileTypeHighlight(FE_HIGHLIGHT_AUTO, 'fileadmin/test.qfq')); - $this->assertEquals(DIR_HIGHLIGHT_JSON . '/highlight.py.json', HelperFile::getFileTypeHighlight(FE_HIGHLIGHT_AUTO, 'fileadmin/test.py')); - $this->assertEquals(DIR_HIGHLIGHT_JSON . '/highlight.m.json', HelperFile::getFileTypeHighlight(FE_HIGHLIGHT_AUTO, 'fileadmin/test.m')); + $this->assertEquals(Path::appRelToCwd(DIR_HIGHLIGHT_JSON_REL_TO_APP) . '/javascript.json', HelperFile::getFileTypeHighlight(FE_HIGHLIGHT_JAVASCRIPT,'')); + $this->assertEquals(Path::appRelToCwd(DIR_HIGHLIGHT_JSON_REL_TO_APP) . '/highlight.qfq.json', HelperFile::getFileTypeHighlight(FE_HIGHLIGHT_QFQ,'')); + $this->assertEquals(Path::appRelToCwd(DIR_HIGHLIGHT_JSON_REL_TO_APP) . '/highlight.py.json', HelperFile::getFileTypeHighlight(FE_HIGHLIGHT_PYTHON,'')); + $this->assertEquals(Path::appRelToCwd(DIR_HIGHLIGHT_JSON_REL_TO_APP) . '/highlight.m.json', HelperFile::getFileTypeHighlight(FE_HIGHLIGHT_MATLAB,'')); + + $this->assertEquals(Path::appRelToCwd(DIR_HIGHLIGHT_JSON_REL_TO_APP) . '/javascript.json', HelperFile::getFileTypeHighlight(FE_HIGHLIGHT_JAVASCRIPT,'fileadmin/test.js')); + $this->assertEquals(Path::appRelToCwd(DIR_HIGHLIGHT_JSON_REL_TO_APP) . '/highlight.qfq.json', HelperFile::getFileTypeHighlight(FE_HIGHLIGHT_QFQ, 'fileadmin/test.js')); + $this->assertEquals(Path::appRelToCwd(DIR_HIGHLIGHT_JSON_REL_TO_APP) . '/highlight.py.json', HelperFile::getFileTypeHighlight(FE_HIGHLIGHT_PYTHON, 'fileadmin/test.js')); + $this->assertEquals(Path::appRelToCwd(DIR_HIGHLIGHT_JSON_REL_TO_APP) . '/highlight.m.json', HelperFile::getFileTypeHighlight(FE_HIGHLIGHT_MATLAB, 'fileadmin/test.js')); + + $this->assertEquals(Path::appRelToCwd(DIR_HIGHLIGHT_JSON_REL_TO_APP) . '/javascript.json', HelperFile::getFileTypeHighlight(FE_HIGHLIGHT_AUTO, 'fileadmin/test.js')); + $this->assertEquals(Path::appRelToCwd(DIR_HIGHLIGHT_JSON_REL_TO_APP) . '/highlight.php.json', HelperFile::getFileTypeHighlight(FE_HIGHLIGHT_AUTO, 'fileadmin/test.php')); + $this->assertEquals(Path::appRelToCwd(DIR_HIGHLIGHT_JSON_REL_TO_APP) . '/highlight.qfq.json', HelperFile::getFileTypeHighlight(FE_HIGHLIGHT_AUTO, 'fileadmin/test.qfq')); + $this->assertEquals(Path::appRelToCwd(DIR_HIGHLIGHT_JSON_REL_TO_APP) . '/highlight.py.json', HelperFile::getFileTypeHighlight(FE_HIGHLIGHT_AUTO, 'fileadmin/test.py')); + $this->assertEquals(Path::appRelToCwd(DIR_HIGHLIGHT_JSON_REL_TO_APP) . '/highlight.m.json', HelperFile::getFileTypeHighlight(FE_HIGHLIGHT_AUTO, 'fileadmin/test.m')); } public function testJoinPathFilename() { diff --git a/extension/Tests/Unit/Core/Report/ReportTest.php b/extension/Tests/Unit/Core/Report/ReportTest.php index 2bdb0b5fb..389d63185 100644 --- a/extension/Tests/Unit/Core/Report/ReportTest.php +++ b/extension/Tests/Unit/Core/Report/ReportTest.php @@ -3,7 +3,8 @@ namespace IMATHUZH\Qfq\Tests\Unit\Core\Report; use IMATHUZH\Qfq\Core\Evaluate; - + +use IMATHUZH\Qfq\Core\Helper\Path; use IMATHUZH\Qfq\Core\Report\Report; use IMATHUZH\Qfq\Core\Store\Session; use IMATHUZH\Qfq\Tests\Unit\Core\Database\AbstractDatabaseTest; @@ -931,7 +932,7 @@ EOF; // _paged: incl. alert $result = $this->report->process("10.sql = SELECT 'U:table=Person&r=123' AS _paged FROM Person ORDER BY id LIMIT 1"); - $this->assertEquals('<a href="' . API_DIR . '/' . API_DELETE_PHP . '?s=badcaffee1234" class="btn btn-default" title="Delete" ' . $js . ' ><span class="glyphicon glyphicon-trash" ></span></a>', $result); + $this->assertEquals('<a href="' . Path::apiRelToCwd(API_DELETE_PHP) . '?s=badcaffee1234" class="btn btn-default" title="Delete" ' . $js . ' ><span class="glyphicon glyphicon-trash" ></span></a>', $result); // Check das via '_paged' SIP_MODE_ANSWER and SIP_TARGET_URL has been set. $result = Session::get('badcaffee1234'); @@ -939,7 +940,7 @@ EOF; // _paged: incl. alert $result = $this->report->process("10.sql = SELECT 'U:form=Person&r=123' AS _paged FROM Person ORDER BY id LIMIT 1"); - $this->assertEquals('<a href="' . API_DIR . '/' . API_DELETE_PHP . '?s=badcaffee1234" class="btn btn-default" title="Delete" ' . $js . ' ><span class="glyphicon glyphicon-trash" ></span></a>', $result); + $this->assertEquals('<a href="' . Path::apiRelToCwd(API_DELETE_PHP) . '?s=badcaffee1234" class="btn btn-default" title="Delete" ' . $js . ' ><span class="glyphicon glyphicon-trash" ></span></a>', $result); // _paged: other than defaults for the alert. $js = str_replace('Do you really want to delete the record?', 'Move to trash?', $js); @@ -950,11 +951,11 @@ EOF; $js = str_replace('modal: true', 'modal: false', $js); $js = str_replace("type: 'warning'", "type: 'success'", $js); $result = $this->report->process("10.sql = SELECT 'U:table=Person&r=123|q:Move to trash?:success:yes:no:10:0' AS _paged FROM Person ORDER BY id LIMIT 1"); - $this->assertEquals('<a href="' . API_DIR . '/' . API_DELETE_PHP . '?s=badcaffee1234" class="btn btn-default" title="Delete" ' . $js . ' ><span class="glyphicon glyphicon-trash" ></span></a>', $result); + $this->assertEquals('<a href="' . Path::apiRelToCwd(API_DELETE_PHP) . '?s=badcaffee1234" class="btn btn-default" title="Delete" ' . $js . ' ><span class="glyphicon glyphicon-trash" ></span></a>', $result); $result = $this->report->process("10.sql = SELECT 'U:table=Person&r=123|q:Move to trash?:success:yes:no:10:0|t:click me' AS _paged FROM Person ORDER BY id LIMIT 1"); - $this->assertEquals('<a href="' . API_DIR . '/' . API_DELETE_PHP . '?s=badcaffee1234" class="btn btn-default" title="Delete" ' . $js . ' ><span class="glyphicon glyphicon-trash" ></span> click me</a>', $result); + $this->assertEquals('<a href="' . Path::apiRelToCwd(API_DELETE_PHP) . '?s=badcaffee1234" class="btn btn-default" title="Delete" ' . $js . ' ><span class="glyphicon glyphicon-trash" ></span> click me</a>', $result); } /** @@ -987,7 +988,7 @@ EOF; // _Paged: incl. alert $result = $this->report->process("10.sql = SELECT 'table=Person&r=123' AS _Paged FROM Person ORDER BY id LIMIT 1"); - $this->assertEquals('<a href="' . API_DIR . '/' . API_DELETE_PHP . '?s=badcaffee1234" class="btn btn-default" title="Delete" ' . $js . ' ><span class="glyphicon glyphicon-trash" ></span></a>', $result); + $this->assertEquals('<a href="' . Path::apiRelToCwd(API_DELETE_PHP) . '?s=badcaffee1234" class="btn btn-default" title="Delete" ' . $js . ' ><span class="glyphicon glyphicon-trash" ></span></a>', $result); // _Paged: other than defaults for the alert. $js = str_replace('Do you really want to delete the record?', 'Move to trash?', $js); @@ -998,11 +999,11 @@ EOF; $js = str_replace('modal: true', 'modal: false', $js); $js = str_replace("type: 'warning'", "type: 'success'", $js); $result = $this->report->process("10.sql = SELECT 'table=Person&r=123|||Move to trash?:success:yes:no:10:0' AS _Paged FROM Person ORDER BY id LIMIT 1"); - $this->assertEquals('<a href="' . API_DIR . '/' . API_DELETE_PHP . '?s=badcaffee1234" class="btn btn-default" title="Delete" ' . $js . ' ><span class="glyphicon glyphicon-trash" ></span></a>', $result); + $this->assertEquals('<a href="' . Path::apiRelToCwd(API_DELETE_PHP) . '?s=badcaffee1234" class="btn btn-default" title="Delete" ' . $js . ' ><span class="glyphicon glyphicon-trash" ></span></a>', $result); $result = $this->report->process("10.sql = SELECT 'table=Person&r=123|click me||Move to trash?:success:yes:no:10:0' AS _Paged FROM Person ORDER BY id LIMIT 1"); - $this->assertEquals('<a href="' . API_DIR . '/' . API_DELETE_PHP . '?s=badcaffee1234" class="btn btn-default" title="Delete" ' . $js . ' ><span class="glyphicon glyphicon-trash" ></span> click me</a>', $result); + $this->assertEquals('<a href="' . Path::apiRelToCwd(API_DELETE_PHP) . '?s=badcaffee1234" class="btn btn-default" title="Delete" ' . $js . ' ><span class="glyphicon glyphicon-trash" ></span> click me</a>', $result); // Empty string is ok $result = $this->report->process("10.sql = SELECT '' AS _Paged FROM Person ORDER BY id LIMIT 1"); diff --git a/extension/Tests/Unit/Core/Store/StoreTest.php b/extension/Tests/Unit/Core/Store/StoreTest.php index ec661206e..eb3de630b 100644 --- a/extension/Tests/Unit/Core/Store/StoreTest.php +++ b/extension/Tests/Unit/Core/Store/StoreTest.php @@ -9,6 +9,7 @@ namespace IMATHUZH\Qfq\Tests\Unit\Core\Store; use IMATHUZH\Qfq\Core\Database\Database; +use IMATHUZH\Qfq\Core\Helper\Path; use IMATHUZH\Qfq\Core\Store\Store; use PHPUnit\Framework\TestCase; @@ -341,8 +342,8 @@ class StoreTest extends TestCase { SYSTEM_DB_1_NAME => '<DB>', SYSTEM_DOCUMENTATION_QFQ => SYSTEM_DOCUMENTATION_QFQ_URL, SYSTEM_FLAG_PRODUCTION => 'yes', - SYSTEM_THUMBNAIL_DIR_SECURE => SYSTEM_THUMBNAIL_DIR_SECURE_DEFAULT, - SYSTEM_THUMBNAIL_DIR_PUBLIC => SYSTEM_THUMBNAIL_DIR_PUBLIC_DEFAULT, + SYSTEM_THUMBNAIL_DIR_SECURE => Path::appRelToCwd(SYSTEM_THUMBNAIL_DIR_SECURE_DEFAULT_REL_TO_APP), + SYSTEM_THUMBNAIL_DIR_PUBLIC => Path::appRelToCwd(SYSTEM_THUMBNAIL_DIR_PUBLIC_DEFAULT_REL_TO_APP), SYSTEM_CMD_INKSCAPE => 'inkscape', SYSTEM_CMD_CONVERT => 'convert', SYSTEM_CMD_WKHTMLTOPDF => '/opt/wkhtmltox/bin/wkhtmltopdf', -- GitLab From 65501a4cfa24aa314415b82a46d81b14c21a3e15 Mon Sep 17 00:00:00 2001 From: Marc Egger <marc.egger@uzh.ch> Date: Mon, 24 Aug 2020 10:04:35 +0200 Subject: [PATCH 064/195] Refs #11035 move all path constants into Path.php --- extension/Classes/Api/index.php | 9 ++-- extension/Classes/Core/AbstractBuildForm.php | 2 +- extension/Classes/Core/Constants.php | 25 ----------- extension/Classes/Core/Database/Database.php | 3 +- .../Classes/Core/Database/DatabaseUpdate.php | 4 +- .../Core/Exception/AbstractException.php | 2 +- extension/Classes/Core/Helper/HelperFile.php | 2 +- extension/Classes/Core/Helper/Path.php | 43 ++++++++++++------- extension/Classes/Core/Helper/Support.php | 4 +- extension/Classes/Core/Report/Link.php | 4 +- extension/Classes/Core/Report/Thumbnail.php | 2 +- extension/Classes/Core/Store/Config.php | 12 +++--- .../Tests/Unit/Core/Helper/HelperFileTest.php | 30 ++++++------- extension/Tests/Unit/Core/Store/StoreTest.php | 4 +- 14 files changed, 66 insertions(+), 80 deletions(-) diff --git a/extension/Classes/Api/index.php b/extension/Classes/Api/index.php index ee4a11041..e796acc69 100644 --- a/extension/Classes/Api/index.php +++ b/extension/Classes/Api/index.php @@ -6,15 +6,10 @@ echo $_SERVER['DOCUMENT_ROOT']; -// TODO: replace the following with a better method -const API_DIR = "./"; -const GFX_INFO = '/../../Resources/Public/icons/note.gif'; -const PATH_ICONS = '/../../Resources/Public/icons'; - - require_once(__DIR__ . '/../../vendor/autoload.php'); use http\Exception; +use IMATHUZH\Qfq\Core\Helper\Path; use IMATHUZH\Qfq\Core\QuickFormQuery; // TODO: use Path:: for paths that are defined in config @@ -40,6 +35,8 @@ use IMATHUZH\Qfq\Core\QuickFormQuery; //// +Path::setExtRelToCwd('../../'); + class User { public $user; public function __construct() diff --git a/extension/Classes/Core/AbstractBuildForm.php b/extension/Classes/Core/AbstractBuildForm.php index cdd066aa4..56c64fc50 100644 --- a/extension/Classes/Core/AbstractBuildForm.php +++ b/extension/Classes/Core/AbstractBuildForm.php @@ -2545,7 +2545,7 @@ abstract class AbstractBuildForm { } if (isset($control[SUBRECORD_COLUMN_ICON][$columnName])) { - $cell = ($cell === '') ? '' : "<image src='" . Path::extRelToCwd(PATH_ICONS_REL_TO_EXT) . "/$cell'>"; + $cell = ($cell === '') ? '' : "<image src='" . Path::extRelToCwd(Path::PATH_ICONS_REL_TO_EXT) . "/$cell'>"; } if (isset($control[SUBRECORD_COLUMN_MAILTO][$columnName])) { diff --git a/extension/Classes/Core/Constants.php b/extension/Classes/Core/Constants.php index d7d27b17e..609ce6cc4 100644 --- a/extension/Classes/Core/Constants.php +++ b/extension/Classes/Core/Constants.php @@ -11,14 +11,6 @@ const CONFIG_QFQ_INI = "config.qfq.ini"; // QFQ configuration file: db access - const CONFIG_QFQ_PHP = "config.qfq.php"; // QFQ configuration file: db access const CONFIG_T3 = 'LocalConfiguration.php'; // T3 config file -const GFX_INFO = 'typo3conf/ext/qfq/Resources/Public/icons/note.gif'; // Deprecated! Use Path::extRelToCwd(GFX_INFO_REL_TO_EXT) instead! -const GFX_INFO_REL_TO_EXT = 'Resources/Public/icons/note.gif'; -const API_DIR = 'typo3conf/ext/qfq/Classes/Api'; // Deprecated! Use Path::apiRelToCwd() instead! -const API_DIR_EXT = 'Classes/Api'; // Deprecated! Use Path::apiRelToExt() instead! - -const PATH_ICONS = 'typo3conf/ext/qfq/Resources/Public/icons'; // Deprecated! Use Path::extRelToCwd(PATH_ICONS_REL_TO_EXT) instead! -const PATH_ICONS_REL_TO_EXT = 'Resources/Public/icons'; - const QFQ_TEMP_FILE_PATTERN = 'qfq.split.XXXXX'; const QFQ_TEMP_SOURCE = '.temp.source'; @@ -492,25 +484,16 @@ const SYSTEM_DB_INDEX_QFQ = "indexQfq"; //const SYSTEM_DB_INDEX_DATA_DEPRECATED = "DB_INDEX_DATA"; //const SYSTEM_DB_INDEX_QFQ_DEPRECATED = "DB_INDEX_QFQ"; -const SYSTEM_FILEADMIN_PROTECTED_LOG = 'fileadmin/protected/log'; // Deprecated! Use: Path::appRelToCwd(SYSTEM_FILEADMIN_PROTECTED_LOG_REL_TO_APP) -const SYSTEM_FILEADMIN_PROTECTED_LOG_REL_TO_APP = 'fileadmin/protected/log'; - // Automatically filled by QFQ const SYSTEM_DB_NAME_DATA = 'dbNameData'; const SYSTEM_DB_NAME_QFQ = 'dbNameQfq'; const SYSTEM_DB_NAME_T3 = 'dbNameT3'; const SYSTEM_QFQ_LOG = 'qfqLog'; // Logging to file -const SYSTEM_QFQ_LOG_FILE = 'fileadmin/protected/log/qfq.log'; // Deprecated! Use: Path::appRelToCwd(SYSTEM_QFQ_LOG_FILE_REL_TO_APP) -const SYSTEM_QFQ_LOG_FILE_REL_TO_APP = 'fileadmin/protected/log/qfq.log'; const SYSTEM_MAIL_LOG = 'mailLog'; -const SYSTEM_MAIL_LOG_FILE = 'fileadmin/protected/log/mail.log'; // Deprecated! Use: Path::appRelToCwd(SYSTEM_MAIL_LOG_FILE_REL_TO_APP) -const SYSTEM_MAIL_LOG_FILE_REL_TO_APP = 'fileadmin/protected/log/mail.log'; const SYSTEM_SQL_LOG = 'sqlLog'; // Logging to file -const SYSTEM_SQL_LOG_FILE = 'fileadmin/protected/log/sql.log'; // Deprecated! Use: Path::appRelToCwd(SYSTEM_SQL_LOG_FILE_REL_TO_APP) -const SYSTEM_SQL_LOG_FILE_REL_TO_APP = 'fileadmin/protected/log/sql.log'; const SYSTEM_SQL_LOG_MODE = 'sqlLogMode'; // Mode, which statements to log. const SYSTEM_SQL_LOG_MODE_AUTOCRON = 'sqlLogModeAutoCron'; // Mode, which statements to log in AutoCron Environments. @@ -659,11 +642,7 @@ const SYSTEM_CMD_PDFUNITE = 'cmdPdfunite'; // Thumbnail const SYSTEM_THUMBNAIL_DIR_SECURE = 'thumbnailDirSecure'; -const SYSTEM_THUMBNAIL_DIR_SECURE_DEFAULT = 'fileadmin/protected/qfqThumbnail'; // Deprecated! Use: Path::appRelToCwd(SYSTEM_THUMBNAIL_DIR_SECURE_DEFAULT_REL_TO_APP) -const SYSTEM_THUMBNAIL_DIR_SECURE_DEFAULT_REL_TO_APP = 'fileadmin/protected/qfqThumbnail'; const SYSTEM_THUMBNAIL_DIR_PUBLIC = 'thumbnailDirPublic'; -const SYSTEM_THUMBNAIL_DIR_PUBLIC_DEFAULT = 'typo3temp/qfqThumbnail'; // Deprecated! Use: Path::appRelToCwd(SYSTEM_THUMBNAIL_DIR_PUBLIC_DEFAULT_REL_TO_APP) -const SYSTEM_THUMBNAIL_DIR_PUBLIC_DEFAULT_REL_TO_APP = 'typo3temp/qfqThumbnail'; // Form/Report as file const SYSTEM_QFQ_PROJECT_DIR_SECURE = 'qfqProjectDir'; // where form and report files are saved @@ -1484,8 +1463,6 @@ const COLUMN_PATH_FILE_NAME = 'pathFileName'; const EXISTING_PATH_FILE_NAME = '_existingPathFileName'; const THUMBNAIL_WIDTH_DEFAULT = '150x'; -const THUMBNAIL_UNKNOWN_TYPE = 'typo3/sysext/frontend/Resources/Public/Icons/FileIcons/'; // Deprecated! Use: Path::appRelToCwd(THUMBNAIL_UNKNOWN_TYPE_REL_TO_APP) -const THUMBNAIL_UNKNOWN_TYPE_REL_TO_APP = 'typo3/sysext/frontend/Resources/Public/Icons/FileIcons/'; const THUMBNAIL_MAX_SECONDS = 60; const THUMBNAIL_PREPARE = 'prepare'; const THUMBNAIL_VIA_DOWNLOAD = 'secureFile'; @@ -1902,8 +1879,6 @@ const AUTOCRON_COUNT = 'count'; // Annotate const ANNOTATE_GRAPHIC_CSS_CLASS = 'annotate-graphic'; // Ex 'fabric' const ANNOTATE_TEXT_CSS_CLASS = 'annotate-text'; // Ex 'codeCorrection -const DIR_HIGHLIGHT_JSON = 'typo3conf/ext/qfq/Resources/Public/Json'; // Deprecated! Use: Path::appRelToCwd(DIR_HIGHLIGHT_JSON_REL_TO_APP) -const DIR_HIGHLIGHT_JSON_REL_TO_APP = 'typo3conf/ext/qfq/Resources/Public/Json'; // DataImport const IMPORT_MODE_APPEND = 'append'; diff --git a/extension/Classes/Core/Database/Database.php b/extension/Classes/Core/Database/Database.php index 760b3e67f..836888516 100644 --- a/extension/Classes/Core/Database/Database.php +++ b/extension/Classes/Core/Database/Database.php @@ -14,6 +14,7 @@ use IMATHUZH\Qfq\Core\Helper\HelperFile; use IMATHUZH\Qfq\Core\Helper\HelperFormElement; use IMATHUZH\Qfq\Core\Helper\Logger; use IMATHUZH\Qfq\Core\Helper\OnArray; +use IMATHUZH\Qfq\Core\Helper\Path; use IMATHUZH\Qfq\Core\Store\Store; /** @@ -1044,7 +1045,7 @@ class Database { * @throws \UserFormException */ public function getQfqLogFile() { - return ($this->store == null) ? Path::appRelToCwd(SYSTEM_QFQ_LOG_FILE_REL_TO_APP) : $this->store->getVar(SYSTEM_QFQ_LOG, STORE_SYSTEM); + return ($this->store == null) ? Path::appRelToCwd(Path::SYSTEM_QFQ_LOG_FILE_REL_TO_APP) : $this->store->getVar(SYSTEM_QFQ_LOG, STORE_SYSTEM); } /** diff --git a/extension/Classes/Core/Database/DatabaseUpdate.php b/extension/Classes/Core/Database/DatabaseUpdate.php index bbd7ad966..92cac0279 100644 --- a/extension/Classes/Core/Database/DatabaseUpdate.php +++ b/extension/Classes/Core/Database/DatabaseUpdate.php @@ -294,7 +294,7 @@ class DatabaseUpdate { if ($actionSpecialColumn === ACTION_SPECIAL_COLUMN_DO_REPLACE) { // save log file $message = '<h1>Special column names replaced</h1>The following special column names were replaced.<hr>' . $message; - Logger::logMessage($message, Path::appRelToCwd(SYSTEM_FILEADMIN_PROTECTED_LOG_REL_TO_APP) . '/' . date("YmdHi") . '_special_columns_auto_update.html'); + Logger::logMessage($message, Path::appRelToCwd(Path::SYSTEM_LOG_REL_TO_APP) . '/' . date("YmdHi") . '_special_columns_auto_update.html'); } elseif ($actionSpecialColumn === ACTION_SPECIAL_COLUMN_DO_SKIP_REPLACE) { // do nothing } else { @@ -306,7 +306,7 @@ class DatabaseUpdate { . 'Click <a href="?' . http_build_query(array_merge($_GET, array(ACTION_SPECIAL_COLUMN_UPDATE => ACTION_SPECIAL_COLUMN_DO_REPLACE))) . '">Auto-Replace</a>' . ' to automatically prepend the found column names with an underscore.' . ' In the report below the missing underscores are marked by "<span style="font-weight: bold; color: red;">>>>_</span>".' - . ' This report will be saved in ' . Path::appRelToCwd(SYSTEM_FILEADMIN_PROTECTED_LOG_REL_TO_APP) . ' after the automatic replacement.' + . ' This report will be saved in ' . Path::appRelToCwd(Path::SYSTEM_LOG_REL_TO_APP) . ' after the automatic replacement.' . ' <br><br>To update qfq without changing the special columns (your app will probably be broken): ' . '<a href="?' . http_build_query(array_merge($_GET, array(ACTION_SPECIAL_COLUMN_UPDATE => ACTION_SPECIAL_COLUMN_DO_SKIP_REPLACE))) . '">Skip Auto-Replace</a>' . '<h2>Report</h2>' diff --git a/extension/Classes/Core/Exception/AbstractException.php b/extension/Classes/Core/Exception/AbstractException.php index 729b8dbfd..505a6d8e2 100644 --- a/extension/Classes/Core/Exception/AbstractException.php +++ b/extension/Classes/Core/Exception/AbstractException.php @@ -190,7 +190,7 @@ class AbstractException extends \Exception { } } - $qfqLog = ($store == null) ? Path::appRelToCwd(SYSTEM_QFQ_LOG_FILE_REL_TO_APP) : $store->getVar(SYSTEM_QFQ_LOG, STORE_SYSTEM); + $qfqLog = ($store == null) ? Path::appRelToCwd(Path::SYSTEM_QFQ_LOG_FILE_REL_TO_APP) : $store->getVar(SYSTEM_QFQ_LOG, STORE_SYSTEM); $arrDebugHidden[EXCEPTION_STACKTRACE] = PHP_EOL . implode($arrTrace, PHP_EOL); $arrLogAll = array_merge($arrMsg, $arrShow, $arrDebugShow, $arrDebugHidden); $logAll = OnArray::arrayToLog($arrLogAll); diff --git a/extension/Classes/Core/Helper/HelperFile.php b/extension/Classes/Core/Helper/HelperFile.php index e1e1489ec..327ee252e 100644 --- a/extension/Classes/Core/Helper/HelperFile.php +++ b/extension/Classes/Core/Helper/HelperFile.php @@ -475,7 +475,7 @@ class HelperFile { } if (isset($extToFileType[$ext])) { - return Path::appRelToCwd(DIR_HIGHLIGHT_JSON_REL_TO_APP) . '/' . $extToFileType[$ext]; + return Path::appRelToCwd(Path::DIR_HIGHLIGHT_JSON_REL_TO_APP) . '/' . $extToFileType[$ext]; } return ''; diff --git a/extension/Classes/Core/Helper/Path.php b/extension/Classes/Core/Helper/Path.php index 0b30ba298..eb816921b 100644 --- a/extension/Classes/Core/Helper/Path.php +++ b/extension/Classes/Core/Helper/Path.php @@ -34,18 +34,33 @@ Path::appRelToCwd(DIR_HIGHLIGHT_JSON_REL_TO_APP) === DIR_HIGHLIGHT_JSON class Path { - /* - public static function overrideExtPath(string $path) - { -// const QFQ_EXT_DOMAIN_PATH_GLOBALS_KEY = "qfq_path_to_extension_directory_relative_to_domain_root"; -// const QFQ_EXT_FILE_PATH_GLOBALS_KEY = "qfq_absolute_file_path_to_extension_directory"; -// const APPLICATION_DOMAIN_PATH_GLOBALS_KEY = "qfq_absolute_file_path_to_application_root_directory"; -// const APPLICATION_FILE_PATH_GLOBALS_KEY = "qfq_absolute_file_path_to_application_root_directory"; -// $GLOBALS[]; + private static $extRelToCwd = 'typo3conf/ext/qfq'; + + // API + const API_REL_TO_EXT = 'Classes/Api'; + + // Icons + const GFX_INFO_REL_TO_EXT = 'Resources/Public/icons/note.gif'; + const PATH_ICONS_REL_TO_EXT = 'Resources/Public/icons'; + + // Log files + const SYSTEM_LOG_REL_TO_APP = 'fileadmin/protected/log'; + const SYSTEM_QFQ_LOG_FILE_REL_TO_APP = 'fileadmin/protected/log/qfq.log'; + const SYSTEM_MAIL_LOG_FILE_REL_TO_APP = 'fileadmin/protected/log/mail.log'; + const SYSTEM_SQL_LOG_FILE_REL_TO_APP = 'fileadmin/protected/log/sql.log'; - // TODO: if global with key not exists, then set path to global. Only the first time this function is called it has en effect. + // Thumbnail + const SYSTEM_THUMBNAIL_DIR_SECURE_DEFAULT_REL_TO_APP = 'fileadmin/protected/qfqThumbnail'; + const SYSTEM_THUMBNAIL_DIR_PUBLIC_DEFAULT_REL_TO_APP = 'typo3temp/qfqThumbnail'; + const THUMBNAIL_UNKNOWN_TYPE_REL_TO_APP = 'typo3/sysext/frontend/Resources/Public/Icons/FileIcons/'; + + // Annotate + const DIR_HIGHLIGHT_JSON_REL_TO_APP = 'typo3conf/ext/qfq/Resources/Public/Json'; + + public static function setExtRelToCwd(string $newPath) + { + self::$extRelToCwd = $newPath; } - */ /** * Return path relative to CWD @@ -60,14 +75,12 @@ class Path */ public static function extRelToCwd(string $pathRelToExt = ''): string { - $extPathRelToCwd = 'typo3conf/ext/qfq'; - return self::join($extPathRelToCwd, $pathRelToExt); + return self::join(self::$extRelToCwd, $pathRelToExt); } public static function apiRelToExt(string $pathRelToApi = ''): string { - $apiPathRelToExt = 'Classes/Api'; - return self::join($apiPathRelToExt, $pathRelToApi); + return self::join(self::API_REL_TO_EXT, $pathRelToApi); } public static function apiRelToCwd(string $pathRelToApi = ''): string @@ -81,7 +94,7 @@ class Path return self::join($appPathRelToCwd, $pathRelToExt); } - public static function join(): string + public static function join(/* path pieces */): string { // Filter out empty string and null arguments $pieces = array_filter(func_get_args(), function($value) { return !is_null($value) && $value !== ''; }); diff --git a/extension/Classes/Core/Helper/Support.php b/extension/Classes/Core/Helper/Support.php index 3aac21faf..ab338003a 100644 --- a/extension/Classes/Core/Helper/Support.php +++ b/extension/Classes/Core/Helper/Support.php @@ -123,7 +123,7 @@ class Support { throw new \CodeException('Unknown mode: ' . $formLogMode, ERROR_UNKNOWN_TOKEN); } - $filename = Path::appRelToCwd(SYSTEM_FILEADMIN_PROTECTED_LOG_REL_TO_APP) . '/' . $formName . "." . $perBeSession . "log"; + $filename = Path::appRelToCwd(Path::SYSTEM_LOG_REL_TO_APP) . '/' . $formName . "." . $perBeSession . "log"; return sanitize::safeFilename($filename, false, true); } @@ -236,7 +236,7 @@ class Support { */ public static function doTooltip($htmlId, $tooltipText) { - return "<img " . self::doAttribute('id', $htmlId) . " src='" . Path::extRelToCwd(GFX_INFO_REL_TO_EXT) . "' title=\"" . htmlentities($tooltipText) . "\">"; + return "<img " . self::doAttribute('id', $htmlId) . " src='" . Path::extRelToCwd(Path::GFX_INFO_REL_TO_EXT) . "' title=\"" . htmlentities($tooltipText) . "\">"; } /** diff --git a/extension/Classes/Core/Report/Link.php b/extension/Classes/Core/Report/Link.php index 411359701..100c3fa96 100644 --- a/extension/Classes/Core/Report/Link.php +++ b/extension/Classes/Core/Report/Link.php @@ -1705,7 +1705,7 @@ EOF; $vars[NAME_ALT_TEXT] = "Bullet " . $value; } - $vars[NAME_IMAGE] = Path::extRelToCwd(PATH_ICONS_REL_TO_EXT) . "/bullet-" . $value . '.gif'; + $vars[NAME_IMAGE] = Path::extRelToCwd(Path::PATH_ICONS_REL_TO_EXT) . "/bullet-" . $value . '.gif'; $vars[NAME_IMAGE_TITLE] = $value; $vars[NAME_LINK_CLASS_DEFAULT] = NO_CLASS; @@ -1730,7 +1730,7 @@ EOF; $vars[NAME_ALT_TEXT] = "Checked " . $value; } - $vars[NAME_IMAGE] = Path::extRelToCwd(PATH_ICONS_REL_TO_EXT) . "/checked-" . $value . '.gif'; + $vars[NAME_IMAGE] = Path::extRelToCwd(Path::PATH_ICONS_REL_TO_EXT) . "/checked-" . $value . '.gif'; $vars[NAME_IMAGE_TITLE] = $value; $vars[NAME_LINK_CLASS_DEFAULT] = NO_CLASS; diff --git a/extension/Classes/Core/Report/Thumbnail.php b/extension/Classes/Core/Report/Thumbnail.php index 57c8c5bc8..bead0dbdf 100644 --- a/extension/Classes/Core/Report/Thumbnail.php +++ b/extension/Classes/Core/Report/Thumbnail.php @@ -221,7 +221,7 @@ class Thumbnail { break; default: - $placeholder = Support::joinPath(Path::appRelToCwd(THUMBNAIL_UNKNOWN_TYPE_REL_TO_APP), $ext . '.gif'); + $placeholder = Support::joinPath(Path::appRelToCwd(Path::THUMBNAIL_UNKNOWN_TYPE_REL_TO_APP), $ext . '.gif'); if (is_readable($placeholder)) { return $placeholder; } diff --git a/extension/Classes/Core/Store/Config.php b/extension/Classes/Core/Store/Config.php index e5b786a15..d366027ec 100644 --- a/extension/Classes/Core/Store/Config.php +++ b/extension/Classes/Core/Store/Config.php @@ -267,7 +267,7 @@ class Config { } Logger::logMessage(Logger::linePre() . 'Security: attack detected' . PHP_EOL . $reason, - $config[SYSTEM_QFQ_LOG] ?? Path::appRelToCwd(SYSTEM_QFQ_LOG_FILE_REL_TO_APP)); + $config[SYSTEM_QFQ_LOG] ?? Path::appRelToCwd(Path::SYSTEM_QFQ_LOG_FILE_REL_TO_APP)); // In case of an attack: log out the current user. Session::destroy(); @@ -315,9 +315,9 @@ class Config { SYSTEM_RENDER => SYSTEM_RENDER_SINGLE, SYSTEM_DATE_FORMAT => 'yyyy-mm-dd', SYSTEM_SHOW_DEBUG_INFO => SYSTEM_SHOW_DEBUG_INFO_AUTO, - SYSTEM_MAIL_LOG => Path::appRelToCwd(SYSTEM_MAIL_LOG_FILE_REL_TO_APP), - SYSTEM_QFQ_LOG => Path::appRelToCwd(SYSTEM_QFQ_LOG_FILE_REL_TO_APP), - SYSTEM_SQL_LOG => Path::appRelToCwd(SYSTEM_SQL_LOG_FILE_REL_TO_APP), + SYSTEM_MAIL_LOG => Path::appRelToCwd(Path::SYSTEM_MAIL_LOG_FILE_REL_TO_APP), + SYSTEM_QFQ_LOG => Path::appRelToCwd(Path::SYSTEM_QFQ_LOG_FILE_REL_TO_APP), + SYSTEM_SQL_LOG => Path::appRelToCwd(Path::SYSTEM_SQL_LOG_FILE_REL_TO_APP), SYSTEM_SQL_LOG_MODE => 'modify', SYSTEM_SQL_LOG_MODE_AUTOCRON => 'error', F_BS_COLUMNS => 'col-md-12 col-lg-10', @@ -379,8 +379,8 @@ class Config { SYSTEM_CMD_GS => 'gs', SYSTEM_CMD_PDFUNITE => 'pdfunite', - SYSTEM_THUMBNAIL_DIR_SECURE => Path::appRelToCwd(SYSTEM_THUMBNAIL_DIR_SECURE_DEFAULT_REL_TO_APP), - SYSTEM_THUMBNAIL_DIR_PUBLIC => Path::appRelToCwd(SYSTEM_THUMBNAIL_DIR_PUBLIC_DEFAULT_REL_TO_APP), + SYSTEM_THUMBNAIL_DIR_SECURE => Path::appRelToCwd(Path::SYSTEM_THUMBNAIL_DIR_SECURE_DEFAULT_REL_TO_APP), + SYSTEM_THUMBNAIL_DIR_PUBLIC => Path::appRelToCwd(Path::SYSTEM_THUMBNAIL_DIR_PUBLIC_DEFAULT_REL_TO_APP), F_FE_DATA_REQUIRED_ERROR => F_FE_DATA_REQUIRED_ERROR_DEFAULT, F_FE_DATA_MATCH_ERROR => F_FE_DATA_MATCH_ERROR_DEFAULT, diff --git a/extension/Tests/Unit/Core/Helper/HelperFileTest.php b/extension/Tests/Unit/Core/Helper/HelperFileTest.php index fa9fea521..305adf2c6 100644 --- a/extension/Tests/Unit/Core/Helper/HelperFileTest.php +++ b/extension/Tests/Unit/Core/Helper/HelperFileTest.php @@ -33,21 +33,21 @@ class HelperFileTest extends TestCase { $this->assertEquals('', HelperFile::getFileTypeHighlight(FE_HIGHLIGHT_AUTO,'')); - $this->assertEquals(Path::appRelToCwd(DIR_HIGHLIGHT_JSON_REL_TO_APP) . '/javascript.json', HelperFile::getFileTypeHighlight(FE_HIGHLIGHT_JAVASCRIPT,'')); - $this->assertEquals(Path::appRelToCwd(DIR_HIGHLIGHT_JSON_REL_TO_APP) . '/highlight.qfq.json', HelperFile::getFileTypeHighlight(FE_HIGHLIGHT_QFQ,'')); - $this->assertEquals(Path::appRelToCwd(DIR_HIGHLIGHT_JSON_REL_TO_APP) . '/highlight.py.json', HelperFile::getFileTypeHighlight(FE_HIGHLIGHT_PYTHON,'')); - $this->assertEquals(Path::appRelToCwd(DIR_HIGHLIGHT_JSON_REL_TO_APP) . '/highlight.m.json', HelperFile::getFileTypeHighlight(FE_HIGHLIGHT_MATLAB,'')); - - $this->assertEquals(Path::appRelToCwd(DIR_HIGHLIGHT_JSON_REL_TO_APP) . '/javascript.json', HelperFile::getFileTypeHighlight(FE_HIGHLIGHT_JAVASCRIPT,'fileadmin/test.js')); - $this->assertEquals(Path::appRelToCwd(DIR_HIGHLIGHT_JSON_REL_TO_APP) . '/highlight.qfq.json', HelperFile::getFileTypeHighlight(FE_HIGHLIGHT_QFQ, 'fileadmin/test.js')); - $this->assertEquals(Path::appRelToCwd(DIR_HIGHLIGHT_JSON_REL_TO_APP) . '/highlight.py.json', HelperFile::getFileTypeHighlight(FE_HIGHLIGHT_PYTHON, 'fileadmin/test.js')); - $this->assertEquals(Path::appRelToCwd(DIR_HIGHLIGHT_JSON_REL_TO_APP) . '/highlight.m.json', HelperFile::getFileTypeHighlight(FE_HIGHLIGHT_MATLAB, 'fileadmin/test.js')); - - $this->assertEquals(Path::appRelToCwd(DIR_HIGHLIGHT_JSON_REL_TO_APP) . '/javascript.json', HelperFile::getFileTypeHighlight(FE_HIGHLIGHT_AUTO, 'fileadmin/test.js')); - $this->assertEquals(Path::appRelToCwd(DIR_HIGHLIGHT_JSON_REL_TO_APP) . '/highlight.php.json', HelperFile::getFileTypeHighlight(FE_HIGHLIGHT_AUTO, 'fileadmin/test.php')); - $this->assertEquals(Path::appRelToCwd(DIR_HIGHLIGHT_JSON_REL_TO_APP) . '/highlight.qfq.json', HelperFile::getFileTypeHighlight(FE_HIGHLIGHT_AUTO, 'fileadmin/test.qfq')); - $this->assertEquals(Path::appRelToCwd(DIR_HIGHLIGHT_JSON_REL_TO_APP) . '/highlight.py.json', HelperFile::getFileTypeHighlight(FE_HIGHLIGHT_AUTO, 'fileadmin/test.py')); - $this->assertEquals(Path::appRelToCwd(DIR_HIGHLIGHT_JSON_REL_TO_APP) . '/highlight.m.json', HelperFile::getFileTypeHighlight(FE_HIGHLIGHT_AUTO, 'fileadmin/test.m')); + $this->assertEquals(Path::appRelToCwd(Path::DIR_HIGHLIGHT_JSON_REL_TO_APP) . '/javascript.json', HelperFile::getFileTypeHighlight(FE_HIGHLIGHT_JAVASCRIPT,'')); + $this->assertEquals(Path::appRelToCwd(Path::DIR_HIGHLIGHT_JSON_REL_TO_APP) . '/highlight.qfq.json', HelperFile::getFileTypeHighlight(FE_HIGHLIGHT_QFQ,'')); + $this->assertEquals(Path::appRelToCwd(Path::DIR_HIGHLIGHT_JSON_REL_TO_APP) . '/highlight.py.json', HelperFile::getFileTypeHighlight(FE_HIGHLIGHT_PYTHON,'')); + $this->assertEquals(Path::appRelToCwd(Path::DIR_HIGHLIGHT_JSON_REL_TO_APP) . '/highlight.m.json', HelperFile::getFileTypeHighlight(FE_HIGHLIGHT_MATLAB,'')); + + $this->assertEquals(Path::appRelToCwd(Path::DIR_HIGHLIGHT_JSON_REL_TO_APP) . '/javascript.json', HelperFile::getFileTypeHighlight(FE_HIGHLIGHT_JAVASCRIPT,'fileadmin/test.js')); + $this->assertEquals(Path::appRelToCwd(Path::DIR_HIGHLIGHT_JSON_REL_TO_APP) . '/highlight.qfq.json', HelperFile::getFileTypeHighlight(FE_HIGHLIGHT_QFQ, 'fileadmin/test.js')); + $this->assertEquals(Path::appRelToCwd(Path::DIR_HIGHLIGHT_JSON_REL_TO_APP) . '/highlight.py.json', HelperFile::getFileTypeHighlight(FE_HIGHLIGHT_PYTHON, 'fileadmin/test.js')); + $this->assertEquals(Path::appRelToCwd(Path::DIR_HIGHLIGHT_JSON_REL_TO_APP) . '/highlight.m.json', HelperFile::getFileTypeHighlight(FE_HIGHLIGHT_MATLAB, 'fileadmin/test.js')); + + $this->assertEquals(Path::appRelToCwd(Path::DIR_HIGHLIGHT_JSON_REL_TO_APP) . '/javascript.json', HelperFile::getFileTypeHighlight(FE_HIGHLIGHT_AUTO, 'fileadmin/test.js')); + $this->assertEquals(Path::appRelToCwd(Path::DIR_HIGHLIGHT_JSON_REL_TO_APP) . '/highlight.php.json', HelperFile::getFileTypeHighlight(FE_HIGHLIGHT_AUTO, 'fileadmin/test.php')); + $this->assertEquals(Path::appRelToCwd(Path::DIR_HIGHLIGHT_JSON_REL_TO_APP) . '/highlight.qfq.json', HelperFile::getFileTypeHighlight(FE_HIGHLIGHT_AUTO, 'fileadmin/test.qfq')); + $this->assertEquals(Path::appRelToCwd(Path::DIR_HIGHLIGHT_JSON_REL_TO_APP) . '/highlight.py.json', HelperFile::getFileTypeHighlight(FE_HIGHLIGHT_AUTO, 'fileadmin/test.py')); + $this->assertEquals(Path::appRelToCwd(Path::DIR_HIGHLIGHT_JSON_REL_TO_APP) . '/highlight.m.json', HelperFile::getFileTypeHighlight(FE_HIGHLIGHT_AUTO, 'fileadmin/test.m')); } public function testJoinPathFilename() { diff --git a/extension/Tests/Unit/Core/Store/StoreTest.php b/extension/Tests/Unit/Core/Store/StoreTest.php index eb3de630b..c8faf559f 100644 --- a/extension/Tests/Unit/Core/Store/StoreTest.php +++ b/extension/Tests/Unit/Core/Store/StoreTest.php @@ -342,8 +342,8 @@ class StoreTest extends TestCase { SYSTEM_DB_1_NAME => '<DB>', SYSTEM_DOCUMENTATION_QFQ => SYSTEM_DOCUMENTATION_QFQ_URL, SYSTEM_FLAG_PRODUCTION => 'yes', - SYSTEM_THUMBNAIL_DIR_SECURE => Path::appRelToCwd(SYSTEM_THUMBNAIL_DIR_SECURE_DEFAULT_REL_TO_APP), - SYSTEM_THUMBNAIL_DIR_PUBLIC => Path::appRelToCwd(SYSTEM_THUMBNAIL_DIR_PUBLIC_DEFAULT_REL_TO_APP), + SYSTEM_THUMBNAIL_DIR_SECURE => Path::appRelToCwd(Path::SYSTEM_THUMBNAIL_DIR_SECURE_DEFAULT_REL_TO_APP), + SYSTEM_THUMBNAIL_DIR_PUBLIC => Path::appRelToCwd(Path::SYSTEM_THUMBNAIL_DIR_PUBLIC_DEFAULT_REL_TO_APP), SYSTEM_CMD_INKSCAPE => 'inkscape', SYSTEM_CMD_CONVERT => 'convert', SYSTEM_CMD_WKHTMLTOPDF => '/opt/wkhtmltox/bin/wkhtmltopdf', -- GitLab From 611d01310ce05a44eddfc89558335bcf36b7f2c6 Mon Sep 17 00:00:00 2001 From: Marc Egger <marc.egger@uzh.ch> Date: Mon, 24 Aug 2020 14:12:36 +0200 Subject: [PATCH 065/195] Refs #11035 use Path:: for paths that are defined in config. Except for Log & absolute paths... they need more work. --- extension/Classes/Api/index.php | 9 +-- extension/Classes/Core/Constants.php | 22 ++++---- extension/Classes/Core/Database/Database.php | 8 +-- extension/Classes/Core/Delete.php | 2 +- .../Core/Exception/AbstractException.php | 2 +- extension/Classes/Core/File.php | 8 +-- extension/Classes/Core/Form/FormAsFile.php | 7 ++- extension/Classes/Core/Helper/Path.php | 55 +++++++++++++------ extension/Classes/Core/Report/Download.php | 11 ++-- extension/Classes/Core/Report/Html2Pdf.php | 8 +-- extension/Classes/Core/Report/Report.php | 6 +- .../Classes/Core/Report/ReportAsFile.php | 5 +- extension/Classes/Core/Report/SendMail.php | 8 +-- extension/Classes/Core/Report/Thumbnail.php | 10 ++-- extension/Classes/Core/Save.php | 10 ++-- extension/Classes/Core/Store/Config.php | 12 ++-- extension/Classes/Core/Store/Store.php | 28 +++++----- extension/Classes/External/AutoCron.php | 2 +- extension/Tests/Unit/Core/DeleteTest.php | 2 +- extension/Tests/Unit/Core/Store/StoreTest.php | 9 ++- 20 files changed, 124 insertions(+), 100 deletions(-) diff --git a/extension/Classes/Api/index.php b/extension/Classes/Api/index.php index e796acc69..0086d3907 100644 --- a/extension/Classes/Api/index.php +++ b/extension/Classes/Api/index.php @@ -4,8 +4,6 @@ // TEST FILE TO RUN QFQ REPORT WITHOUT TYPO3 // /////////////////////////////////////////////// -echo $_SERVER['DOCUMENT_ROOT']; - require_once(__DIR__ . '/../../vendor/autoload.php'); use http\Exception; @@ -13,7 +11,6 @@ use IMATHUZH\Qfq\Core\Helper\Path; use IMATHUZH\Qfq\Core\QuickFormQuery; // TODO: use Path:: for paths that are defined in config -// TODO: replace the above change of constants with better method // TODO: replace all paths with typo3conf/ and /../ and fileadmin/ with correct path computing function. // TODO: replace HelperFile::correctRelativePathFileName() everywhere with the corresponding path function. // TODO: replace Logger::makePathAbsolute() @@ -29,13 +26,17 @@ use IMATHUZH\Qfq\Core\QuickFormQuery; // TODO: BuildFormBootstrap.php Zeile 666 ff. : API pfad automatisch anpassen // TODO: Link.php 1776: API pfad automatisch anpassen // TODO: Monitor.php 77: Wird path. I don't know relativ to what it should be +// TODO: In QFQ Config one can define "CSS class QFQ container", it says that this should be set to "container" if QFQ element is not yet in Bootstrap container. Why? Seems to work without it +// TODO: (?) move computation of SYSTEM_EXT_PATH_ABSOLUTE and SYSTEM_SITE_PATH_ABSOLUTE into Path.php. Currently Sotre->doSystemPath +// TODO: (?) replace all log path computations: SYSTEM_QFQ_LOG_ABSOLUTE, SYSTEM_SQL_LOG_ABSOLUTE, +// TODO: Test if qfq, sql and mail logs still work // Misc. // TODO: TablesorterController.js: pass API url as data attribute instead of hardcode (this.tablesorterApiUrl = 'typo3conf/ext/qfq/Classes/Api/setting.php';) //// -Path::setExtRelToCwd('../../'); +Path::setAppRelToCwd('../../../../../'); class User { public $user; diff --git a/extension/Classes/Core/Constants.php b/extension/Classes/Core/Constants.php index 609ce6cc4..08c4896e9 100644 --- a/extension/Classes/Core/Constants.php +++ b/extension/Classes/Core/Constants.php @@ -253,6 +253,8 @@ const ERROR_IO_CHMOD = 1314; const ERROR_IO_READ_FILE = 1315; const ERROR_IO_WRITE_FILE = 1316; +const ERROR_PATH_INVALID = 1317; + const ERROR_PDF2SVG = 1320; const ERROR_PDF2JPEG = 1321; @@ -461,7 +463,7 @@ const TYPO3_PAGE_TYPE = 'pageType'; const TYPO3_PAGE_LANGUAGE = 'pageLanguage'; const TYPO3_DEBUG_SHOW_BODY_TEXT = 'debugShowBodyText'; -const TYPO3_SQL_LOG = 'sqlLog'; +const TYPO3_SQL_LOG_ABSOLUTE = 'sqlLog'; const TYPO3_SQL_LOG_MODE = 'sqlLogMode'; // Deprecated: legacy config - still used to read old configuration file. @@ -489,11 +491,11 @@ const SYSTEM_DB_NAME_DATA = 'dbNameData'; const SYSTEM_DB_NAME_QFQ = 'dbNameQfq'; const SYSTEM_DB_NAME_T3 = 'dbNameT3'; -const SYSTEM_QFQ_LOG = 'qfqLog'; // Logging to file +const SYSTEM_QFQ_LOG_ABSOLUTE = 'qfqLog'; // Logging to file -const SYSTEM_MAIL_LOG = 'mailLog'; +const SYSTEM_MAIL_LOG_ABSOLUTE = 'mailLog'; -const SYSTEM_SQL_LOG = 'sqlLog'; // Logging to file +const SYSTEM_SQL_LOG_ABSOLUTE = 'sqlLog'; // Logging to file const SYSTEM_SQL_LOG_MODE = 'sqlLogMode'; // Mode, which statements to log. const SYSTEM_SQL_LOG_MODE_AUTOCRON = 'sqlLogModeAutoCron'; // Mode, which statements to log in AutoCron Environments. @@ -540,14 +542,14 @@ const SYSTEM_FORM_BS_NOTE_COLUMNS = 'formBsNoteColumns'; const SYSTEM_BASE_URL = 'baseUrl'; -const SYSTEM_SEND_E_MAIL = 'sendEmail'; +const SYSTEM_SEND_E_MAIL_ABSOLUTE = 'sendEmail'; const SYSTEM_SEND_E_MAIL_OPTIONS = 'sendEMailOptions'; const SYSTEM_EDIT_FORM_PAGE = 'editFormPage'; // computed automatically during runtime -const SYSTEM_EXT_PATH = 'extPath'; -const SYSTEM_SITE_PATH = 'sitePath'; +const SYSTEM_EXT_PATH_ABSOLUTE = 'extPath'; +const SYSTEM_SITE_PATH_ABSOLUTE = 'sitePath'; const SYSTEM_LDAP_1_RDN = 'LDAP_1_RDN'; // Credentials to access LDAP const SYSTEM_LDAP_1_PASSWORD = 'LDAP_1_PASSWORD'; // Credentials to access LDAP @@ -641,11 +643,11 @@ const SYSTEM_CMD_GS = 'cmdGs'; const SYSTEM_CMD_PDFUNITE = 'cmdPdfunite'; // Thumbnail -const SYSTEM_THUMBNAIL_DIR_SECURE = 'thumbnailDirSecure'; -const SYSTEM_THUMBNAIL_DIR_PUBLIC = 'thumbnailDirPublic'; +const SYSTEM_THUMBNAIL_DIR_SECURE_REL_TO_APP = 'thumbnailDirSecure'; +const SYSTEM_THUMBNAIL_DIR_PUBLIC_REL_TO_APP = 'thumbnailDirPublic'; // Form/Report as file -const SYSTEM_QFQ_PROJECT_DIR_SECURE = 'qfqProjectDir'; // where form and report files are saved +const SYSTEM_QFQ_PROJECT_DIR_SECURE_REL_TO_APP = 'qfqProjectDir'; // where form and report files are saved const SYSTEM_DOCUMENTATION_QFQ = 'documentation'; const SYSTEM_DOCUMENTATION_QFQ_URL = 'https://docs.qfq.io'; diff --git a/extension/Classes/Core/Database/Database.php b/extension/Classes/Core/Database/Database.php index 836888516..6196ab05c 100644 --- a/extension/Classes/Core/Database/Database.php +++ b/extension/Classes/Core/Database/Database.php @@ -46,7 +46,7 @@ class Database { /** * @var string */ - private $sqlLog = ''; + private $sqlLogAbsolute = ''; /** * @var array @@ -75,7 +75,7 @@ class Database { $this->store = Store::getInstance(); $storeSystem = $this->store->getStore(STORE_SYSTEM); - $this->sqlLog = $storeSystem[SYSTEM_SQL_LOG]; + $this->sqlLogAbsolute = $storeSystem[SYSTEM_SQL_LOG_ABSOLUTE]; $dbInit = $storeSystem[SYSTEM_DB_INIT]; $config = $this->getConnectionDetails($dbIndex, $storeSystem); @@ -588,7 +588,7 @@ class Database { } $msg .= '[' . $status . $sql . ']'; - Logger::logMessage($msg, $this->sqlLog); + Logger::logMessage($msg, $this->sqlLogAbsolute); } /** @@ -1045,7 +1045,7 @@ class Database { * @throws \UserFormException */ public function getQfqLogFile() { - return ($this->store == null) ? Path::appRelToCwd(Path::SYSTEM_QFQ_LOG_FILE_REL_TO_APP) : $this->store->getVar(SYSTEM_QFQ_LOG, STORE_SYSTEM); + return ($this->store == null) ? Path::appRelToCwd(Path::SYSTEM_QFQ_LOG_FILE_REL_TO_APP) : $this->store->getVar(SYSTEM_QFQ_LOG_ABSOLUTE, STORE_SYSTEM); } /** diff --git a/extension/Classes/Core/Delete.php b/extension/Classes/Core/Delete.php index 6e9937c5f..ea893f6d7 100644 --- a/extension/Classes/Core/Delete.php +++ b/extension/Classes/Core/Delete.php @@ -70,7 +70,7 @@ class Delete { // Take care the necessary target directories exist. $cwd = getcwd(); - $sitePath = $this->store->getVar(SYSTEM_SITE_PATH, STORE_SYSTEM); + $sitePath = $this->store->getVar(SYSTEM_SITE_PATH_ABSOLUTE, STORE_SYSTEM); if ($cwd === false || $sitePath === false || !HelperFile::chdir($sitePath)) { throw new \UserFormException( json_encode([ERROR_MESSAGE_TO_USER => 'getcwd() failed or SITE_PATH undefined or chdir() failed', ERROR_MESSAGE_TO_DEVELOPER => "getcwd() failed or SITE_PATH undefined or chdir('$sitePath') failed."]), diff --git a/extension/Classes/Core/Exception/AbstractException.php b/extension/Classes/Core/Exception/AbstractException.php index 505a6d8e2..42c56358a 100644 --- a/extension/Classes/Core/Exception/AbstractException.php +++ b/extension/Classes/Core/Exception/AbstractException.php @@ -190,7 +190,7 @@ class AbstractException extends \Exception { } } - $qfqLog = ($store == null) ? Path::appRelToCwd(Path::SYSTEM_QFQ_LOG_FILE_REL_TO_APP) : $store->getVar(SYSTEM_QFQ_LOG, STORE_SYSTEM); + $qfqLog = ($store == null) ? Path::appRelToCwd(Path::SYSTEM_QFQ_LOG_FILE_REL_TO_APP) : $store->getVar(SYSTEM_QFQ_LOG_ABSOLUTE, STORE_SYSTEM); $arrDebugHidden[EXCEPTION_STACKTRACE] = PHP_EOL . implode($arrTrace, PHP_EOL); $arrLogAll = array_merge($arrMsg, $arrShow, $arrDebugShow, $arrDebugHidden); $logAll = OnArray::arrayToLog($arrLogAll); diff --git a/extension/Classes/Core/File.php b/extension/Classes/Core/File.php index bd4e676e1..da0356a8c 100644 --- a/extension/Classes/Core/File.php +++ b/extension/Classes/Core/File.php @@ -33,7 +33,7 @@ class File { */ private $session = null; - private $qfqLogFilename = ''; + private $qfqLogPathFilenameAbsolute = ''; /** * @param bool|false $phpUnit @@ -47,7 +47,7 @@ class File { $this->session = Session::getInstance($phpUnit); $this->store = Store::getInstance('', $phpUnit); - $this->qfqLogFilename = $this->store->getVar(SYSTEM_QFQ_LOG, STORE_SYSTEM); + $this->qfqLogPathFilenameAbsolute = $this->store->getVar(SYSTEM_QFQ_LOG_ABSOLUTE, STORE_SYSTEM); $this->uploadErrMsg = [ UPLOAD_ERR_INI_SIZE => "The uploaded file exceeds the upload_max_filesize directive in php.ini", @@ -138,7 +138,7 @@ class File { ERROR_UPLOAD); } - Logger::logMessageWithPrefix(UPLOAD_LOG_PREFIX . ': File under ' . $statusUpload['tmp_name'], $this->qfqLogFilename); + Logger::logMessageWithPrefix(UPLOAD_LOG_PREFIX . ': File under ' . $statusUpload['tmp_name'], $this->qfqLogPathFilenameAbsolute); $this->checkMaxFileSize($statusUpload['size']); @@ -174,7 +174,7 @@ class File { if (isset($statusUpload[FILES_TMP_NAME]) && $statusUpload[FILES_TMP_NAME] != '') { $file = Support::extendFilename($statusUpload[FILES_TMP_NAME], UPLOAD_CACHED); if (file_exists($file)) { - HelperFile::unlink($file, $this->qfqLogFilename); + HelperFile::unlink($file, $this->qfqLogPathFilenameAbsolute); } $statusUpload[FILES_TMP_NAME] = ''; } diff --git a/extension/Classes/Core/Form/FormAsFile.php b/extension/Classes/Core/Form/FormAsFile.php index 2d0e4f874..5dc953a1b 100644 --- a/extension/Classes/Core/Form/FormAsFile.php +++ b/extension/Classes/Core/Form/FormAsFile.php @@ -6,6 +6,7 @@ namespace IMATHUZH\Qfq\Core\Form; use IMATHUZH\Qfq\Core\Database\Database; use IMATHUZH\Qfq\Core\Helper\HelperFile; use IMATHUZH\Qfq\Core\Helper\OnString; +use IMATHUZH\Qfq\Core\Helper\Path; use IMATHUZH\Qfq\Core\Helper\SqlQuery; use IMATHUZH\Qfq\Core\Store\Store; @@ -312,7 +313,7 @@ class FormAsFile * @param string $tableName * @return string */ - public static function errorHintFormImport (string $tableName = 'Form'): string + public static function errorHintFormImport (string $tableName = TABLE_NAME_FORM): string { $message = ''; if (in_array($tableName, [TABLE_NAME_FORM, TABLE_NAME_FORM_ELEMENT])) { @@ -609,8 +610,8 @@ class FormAsFile */ private static function formPath(Database $database): string { - $systemQfqProjectDir = Store::getInstance()->getVar(SYSTEM_QFQ_PROJECT_DIR_SECURE, STORE_SYSTEM); - $formPath = HelperFile::correctRelativePathFileName(HelperFile::joinPathFilename($systemQfqProjectDir, 'form')); + $qfqProjectDirRelToCwd = Path::appRelToCwd(Store::getInstance()->getVar(SYSTEM_QFQ_PROJECT_DIR_SECURE_REL_TO_APP, STORE_SYSTEM)); + $formPath = Path::join($qfqProjectDirRelToCwd, Path::FORM_REL_TO_PROJECT_DIR); if (!is_dir($formPath)) { // create path diff --git a/extension/Classes/Core/Helper/Path.php b/extension/Classes/Core/Helper/Path.php index eb816921b..d8b0a9ef9 100644 --- a/extension/Classes/Core/Helper/Path.php +++ b/extension/Classes/Core/Helper/Path.php @@ -29,12 +29,23 @@ Path::appRelToCwd(SYSTEM_THUMBNAIL_DIR_PUBLIC_DEFAULT_REL_TO_APP) === SYSTEM_THU Path::appRelToCwd(THUMBNAIL_UNKNOWN_TYPE_REL_TO_APP) === THUMBNAIL_UNKNOWN_TYPE Path::appRelToCwd(DIR_HIGHLIGHT_JSON_REL_TO_APP) === DIR_HIGHLIGHT_JSON +$qfqProjectDirRelToCwd = Path::appRelToCwd(Store::getInstance()->getVar(SYSTEM_QFQ_PROJECT_DIR_SECURE_REL_TO_APP, STORE_SYSTEM)); +Path::join($qfqProjectDirRelToCwd, Path::REPORT_REL_TO_PROJECT_DIR) === "../../../../../fileadmin/protected/qfqProject/report" + */ class Path { - private static $extRelToCwd = 'typo3conf/ext/qfq'; + // Default path relative to CWD + private static $appRelToCwd = ''; + + // Extension + const EXT_REL_TO_APP = 'typo3conf/ext/qfq'; + + // QFQ Project dir + const FORM_REL_TO_PROJECT_DIR = 'form'; + const REPORT_REL_TO_PROJECT_DIR = 'report'; // API const API_REL_TO_EXT = 'Classes/Api'; @@ -57,25 +68,20 @@ class Path // Annotate const DIR_HIGHLIGHT_JSON_REL_TO_APP = 'typo3conf/ext/qfq/Resources/Public/Json'; - public static function setExtRelToCwd(string $newPath) + public static function setAppRelToCwd(string $newPath) { - self::$extRelToCwd = $newPath; + self::$appRelToCwd = $newPath; } /** * Return path relative to CWD * - * Path::pathRelToExt("Classes/Api") - * Path::relToExt("Classes/Api") - * Path::extRelToCwd("Classes/Api") - * - * * @param string $pathRelToExt * @return string */ public static function extRelToCwd(string $pathRelToExt = ''): string { - return self::join(self::$extRelToCwd, $pathRelToExt); + return self::join(self::appRelToCwd(self::EXT_REL_TO_APP), $pathRelToExt); } public static function apiRelToExt(string $pathRelToApi = ''): string @@ -90,23 +96,36 @@ class Path public static function appRelToCwd(string $pathRelToExt = ''): string { - $appPathRelToCwd = ''; - return self::join($appPathRelToCwd, $pathRelToExt); + return self::join(self::$appRelToCwd, $pathRelToExt); } - public static function join(/* path pieces */): string + public static function join(/* path parts */): string { // Filter out empty string and null arguments - $pieces = array_filter(func_get_args(), function($value) { return !is_null($value) && $value !== ''; }); + $parts = array_filter(func_get_args(), function($value) { return !is_null($value) && $value !== ''; }); - if (empty($pieces)) { + if (empty($parts)) { return ''; } - $firstPiece = array_shift($pieces); - if (empty($pieces)) { - return $firstPiece; + $firstPart = array_shift($parts); + if (empty($parts)) { + return $firstPart; } - return $firstPiece . '/' . implode($pieces,'/'); + + // Trailing path parts may not be absolute + foreach ($parts as $part) { + if ($part[0] === '/') { + throw new \UserFormException(json_encode([ + ERROR_MESSAGE_TO_USER => 'Failed: Join path.', + ERROR_MESSAGE_TO_DEVELOPER => "Trailing path parts may not start with '/'. Trailing part: '$part'."]), + ERROR_PATH_INVALID); + } + } + + $path = $firstPart . '/' . implode($parts,'/'); + + // remove multiple occurances of '/' + return preg_replace('/\/{2,}/','/', $path); } /* diff --git a/extension/Classes/Core/Report/Download.php b/extension/Classes/Core/Report/Download.php index 3820e521f..9c13511c0 100644 --- a/extension/Classes/Core/Report/Download.php +++ b/extension/Classes/Core/Report/Download.php @@ -17,6 +17,7 @@ use IMATHUZH\Qfq\Core\Helper\KeyValueStringParser; use IMATHUZH\Qfq\Core\Helper\Logger; use IMATHUZH\Qfq\Core\Helper\OnArray; use IMATHUZH\Qfq\Core\Helper\OnString; +use IMATHUZH\Qfq\Core\Helper\Path; use IMATHUZH\Qfq\Core\Helper\Sanitize; use IMATHUZH\Qfq\Core\Helper\Support; use IMATHUZH\Qfq\Core\QuickFormQuery; @@ -61,7 +62,7 @@ class Download { /** * @var string Filename where to write download Information */ - private $downloadDebugLog = ''; + private $downloadDebugLogAbsolute = ''; /** * @var string Name of command @@ -103,7 +104,7 @@ class Download { $this->pdfunite = $this->store->getVar(SYSTEM_CMD_PDFUNITE, STORE_SYSTEM); if (Support::findInSet(SYSTEM_SHOW_DEBUG_INFO_DOWNLOAD, $this->store->getVar(SYSTEM_SHOW_DEBUG_INFO, STORE_SYSTEM))) { - $this->downloadDebugLog = $this->store->getVar(SYSTEM_SQL_LOG, STORE_SYSTEM); + $this->downloadDebugLogAbsolute = $this->store->getVar(SYSTEM_SQL_LOG_ABSOLUTE, STORE_SYSTEM); } } @@ -161,8 +162,8 @@ class Download { // $cmd = "qpdf --empty --pages $inputFiles -- $concatFile 2>&1"; # Fails to merge identical files, if they contain references. $cmd = $this->pdfunite . " $inputFiles $concatFile 2>&1"; // Based on poppler. URLs are preserved. Orientation and size are preserved. - if ($this->downloadDebugLog != '') { - Logger::logMessage("Download: $cmd", $this->downloadDebugLog); + if ($this->downloadDebugLogAbsolute != '') { + Logger::logMessage("Download: $cmd", $this->downloadDebugLogAbsolute); } $rc = $this->concatPdfFilesPdfUnite($cmd, $output); @@ -501,7 +502,7 @@ class Download { $tmpFiles = array(); - $workDir = $this->store->getVar(SYSTEM_SITE_PATH, STORE_SYSTEM); + $workDir = $this->store->getVar(SYSTEM_SITE_PATH_ABSOLUTE, STORE_SYSTEM); HelperFile::chdir($workDir); $downloadMode = $vars[DOWNLOAD_MODE]; diff --git a/extension/Classes/Core/Report/Html2Pdf.php b/extension/Classes/Core/Report/Html2Pdf.php index 048191ba7..58207471a 100644 --- a/extension/Classes/Core/Report/Html2Pdf.php +++ b/extension/Classes/Core/Report/Html2Pdf.php @@ -53,7 +53,7 @@ class Html2Pdf { /** * @var string */ - private $logFile = ''; + private $logFilePathAbsolute = ''; /** * Read QFQ config. Only SYSTEM_BASE_URL_PRINT and SYSTEM_WKHTMLTOPDF will be used. @@ -86,7 +86,7 @@ class Html2Pdf { $this->sessionCookie = new SessionCookie($config); $this->sip = new Sip($phpUnit); - $this->logFile = $config[SYSTEM_QFQ_LOG]; + $this->logFilePathAbsolute = $config[SYSTEM_QFQ_LOG_ABSOLUTE]; } /** @@ -186,8 +186,8 @@ class Html2Pdf { $this->session->close(); $cmd = "$wkhtmlToPdf $customHeader $cookieOptions $options $urlPrint $filenameEscape"; - if ($this->logFile != '') { - Logger::logMessage("Html2Pdf: $cmd", $this->logFile); + if ($this->logFilePathAbsolute != '') { + Logger::logMessage("Html2Pdf: $cmd", $this->logFilePathAbsolute); } $rc = 0; diff --git a/extension/Classes/Core/Report/Report.php b/extension/Classes/Core/Report/Report.php index 2fa12ade7..20f29a9af 100644 --- a/extension/Classes/Core/Report/Report.php +++ b/extension/Classes/Core/Report/Report.php @@ -190,10 +190,10 @@ class Report { */ private function checkUpdateSqlLog() { - $sqlLog = $this->store->getVar(TYPO3_SQL_LOG, STORE_TYPO3); + $sqlLog = $this->store->getVar(TYPO3_SQL_LOG_ABSOLUTE, STORE_TYPO3); if (false !== $sqlLog) { - $sqlLog = HelperFile::joinPathFilename($this->store->getVar(SYSTEM_EXT_PATH, STORE_SYSTEM), $sqlLog); - $this->store->setVar(SYSTEM_SQL_LOG, $sqlLog, STORE_SYSTEM); + $sqlLog = HelperFile::joinPathFilename($this->store->getVar(SYSTEM_SITE_PATH_ABSOLUTE, STORE_SYSTEM), $sqlLog); + $this->store->setVar(SYSTEM_SQL_LOG_ABSOLUTE, $sqlLog, STORE_SYSTEM); } $sqlLogMode = $this->store->getVar(TYPO3_SQL_LOG_MODE, STORE_TYPO3); diff --git a/extension/Classes/Core/Report/ReportAsFile.php b/extension/Classes/Core/Report/ReportAsFile.php index 14177bdc8..920ef1e80 100644 --- a/extension/Classes/Core/Report/ReportAsFile.php +++ b/extension/Classes/Core/Report/ReportAsFile.php @@ -12,6 +12,7 @@ namespace IMATHUZH\Qfq\Core\Report; use IMATHUZH\Qfq\Core\Database\Database; use IMATHUZH\Qfq\Core\Helper\HelperFile; +use IMATHUZH\Qfq\Core\Helper\Path; use IMATHUZH\Qfq\Core\Store\Store; class ReportAsFile @@ -172,8 +173,8 @@ class ReportAsFile */ private static function reportPath(): string { - $systemQfqProjectDir = Store::getInstance()->getVar(SYSTEM_QFQ_PROJECT_DIR_SECURE, STORE_SYSTEM); - $reportPath = HelperFile::correctRelativePathFileName(HelperFile::joinPathFilename($systemQfqProjectDir, 'report')); + $qfqProjectDirRelToCwd = Path::appRelToCwd(Store::getInstance()->getVar(SYSTEM_QFQ_PROJECT_DIR_SECURE_REL_TO_APP, STORE_SYSTEM)); + $reportPath = Path::join($qfqProjectDirRelToCwd, Path::REPORT_REL_TO_PROJECT_DIR); HelperFile::createPathRecursive($reportPath); return $reportPath; } diff --git a/extension/Classes/Core/Report/SendMail.php b/extension/Classes/Core/Report/SendMail.php index 62f58da89..9b200bda1 100644 --- a/extension/Classes/Core/Report/SendMail.php +++ b/extension/Classes/Core/Report/SendMail.php @@ -170,9 +170,9 @@ class SendMail { $args[] = '-t "' . $mailConfig[SENDMAIL_TOKEN_RECEIVER] . '"'; $args[] = '-o message-charset="utf-8"'; - $logFile = $this->store->getVar(SYSTEM_MAIL_LOG, STORE_SYSTEM); - if ($logFile != '' && $logFile !== false) { - $args[] = '-l "' . $logFile . '"'; + $logFilePathAbsolute = $this->store->getVar(SYSTEM_MAIL_LOG_ABSOLUTE, STORE_SYSTEM); + if ($logFilePathAbsolute != '' && $logFilePathAbsolute !== false) { + $args[] = '-l "' . $logFilePathAbsolute . '"'; } if (!empty($mailConfig[SENDMAIL_TOKEN_RECEIVER_CC])) { @@ -220,7 +220,7 @@ class SendMail { $args[] = '-o message-header="' . $mailConfig[SENDMAIL_TOKEN_HEADER] . '"'; } - $sendEmail = $this->store->getVar(SYSTEM_SEND_E_MAIL, STORE_SYSTEM); + $sendEmail = $this->store->getVar(SYSTEM_SEND_E_MAIL_ABSOLUTE, STORE_SYSTEM); if (empty($sendEmail)) { throw new \UserFormException("Missing 'sendEmail'", ERROR_SENDMAIL); } diff --git a/extension/Classes/Core/Report/Thumbnail.php b/extension/Classes/Core/Report/Thumbnail.php index bead0dbdf..6d672a73b 100644 --- a/extension/Classes/Core/Report/Thumbnail.php +++ b/extension/Classes/Core/Report/Thumbnail.php @@ -33,8 +33,8 @@ class Thumbnail { private $inkscape = ''; private $convert = ''; - private $thumbnailDirSecure = ''; - private $thumbnailDirPublic = ''; + private $thumbnailDirSecureRelToCwd = ''; + private $thumbnailDirPublicRelToCwd = ''; /** * @param bool|false $phpUnit @@ -49,8 +49,8 @@ class Thumbnail { $this->inkscape = $this->store->getVar(SYSTEM_CMD_INKSCAPE, STORE_SYSTEM); $this->convert = $this->store->getVar(SYSTEM_CMD_CONVERT, STORE_SYSTEM); - $this->thumbnailDirSecure = $this->store->getVar(SYSTEM_THUMBNAIL_DIR_SECURE, STORE_SYSTEM); - $this->thumbnailDirPublic = $this->store->getVar(SYSTEM_THUMBNAIL_DIR_PUBLIC, STORE_SYSTEM); + $this->thumbnailDirSecureRelToCwd = Path::appRelToCwd($this->store->getVar(SYSTEM_THUMBNAIL_DIR_SECURE_REL_TO_APP, STORE_SYSTEM)); + $this->thumbnailDirPublicRelToCwd = Path::appRelToCwd($this->store->getVar(SYSTEM_THUMBNAIL_DIR_PUBLIC_REL_TO_APP, STORE_SYSTEM)); } /** @@ -84,7 +84,7 @@ class Thumbnail { $pathFilenameSource = $control[TOKEN_THUMBNAIL]; - $dir = ($control[TOKEN_SIP] == "1") ? $this->thumbnailDirSecure : $this->thumbnailDirPublic; + $dir = ($control[TOKEN_SIP] == "1") ? $this->thumbnailDirSecureRelToCwd : $this->thumbnailDirPublicRelToCwd; $pathFilenameThumbnail = Support::joinPath($dir, md5($pathFilenameSource . $control[TOKEN_THUMBNAIL_DIMENSION]) . '.png'); // Check if the file has to exist now. diff --git a/extension/Classes/Core/Save.php b/extension/Classes/Core/Save.php index a89270773..f55f4e855 100644 --- a/extension/Classes/Core/Save.php +++ b/extension/Classes/Core/Save.php @@ -73,9 +73,9 @@ class Save { $this->evaluate = new Evaluate($this->store, $this->db); $this->formAction = new FormAction($formSpec, $this->db); - $this->qfqLogFilename = HelperFile::joinPathFilename( - $this->store->getVar(SYSTEM_SITE_PATH, STORE_SYSTEM), - $this->store->getVar(SYSTEM_QFQ_LOG, STORE_SYSTEM)); + $this->qfqLogFilename = HelperFile::joinPathFilename( // Will only join if second part does not start with '/' + $this->store->getVar(SYSTEM_SITE_PATH_ABSOLUTE, STORE_SYSTEM), + $this->store->getVar(SYSTEM_QFQ_LOG_ABSOLUTE, STORE_SYSTEM)); } /** @@ -663,7 +663,7 @@ class Save { // Take care the necessary target directories exist. $cwd = getcwd(); - $sitePath = $this->store->getVar(SYSTEM_SITE_PATH, STORE_SYSTEM); + $sitePath = $this->store->getVar(SYSTEM_SITE_PATH_ABSOLUTE, STORE_SYSTEM); if ($cwd === false || $sitePath === false || !HelperFile::chdir($sitePath)) { throw new \UserFormException( json_encode([ERROR_MESSAGE_TO_USER => 'getcwd() failed or SITE_PATH undefined or chdir() failed', ERROR_MESSAGE_TO_DEVELOPER => "getcwd() failed or SITE_PATH undefined or chdir('$sitePath') failed."]), @@ -768,7 +768,7 @@ class Save { // Upload - Take care the necessary target directories exist. $cwd = getcwd(); - $sitePath = $this->store->getVar(SYSTEM_SITE_PATH, STORE_SYSTEM); + $sitePath = $this->store->getVar(SYSTEM_SITE_PATH_ABSOLUTE, STORE_SYSTEM); if ($cwd === false || $sitePath === false || !HelperFile::chdir($sitePath)) { throw new \UserFormException( json_encode([ERROR_MESSAGE_TO_USER => 'getcwd() failed or SITE_PATH undefined or chdir() failed', ERROR_MESSAGE_TO_DEVELOPER => "getcwd() failed or SITE_PATH undefined or chdir('$sitePath') failed."]), diff --git a/extension/Classes/Core/Store/Config.php b/extension/Classes/Core/Store/Config.php index d366027ec..09aec6e50 100644 --- a/extension/Classes/Core/Store/Config.php +++ b/extension/Classes/Core/Store/Config.php @@ -267,7 +267,7 @@ class Config { } Logger::logMessage(Logger::linePre() . 'Security: attack detected' . PHP_EOL . $reason, - $config[SYSTEM_QFQ_LOG] ?? Path::appRelToCwd(Path::SYSTEM_QFQ_LOG_FILE_REL_TO_APP)); + $config[SYSTEM_QFQ_LOG_ABSOLUTE] ?? Path::appRelToCwd(Path::SYSTEM_QFQ_LOG_FILE_REL_TO_APP)); // In case of an attack: log out the current user. Session::destroy(); @@ -315,9 +315,9 @@ class Config { SYSTEM_RENDER => SYSTEM_RENDER_SINGLE, SYSTEM_DATE_FORMAT => 'yyyy-mm-dd', SYSTEM_SHOW_DEBUG_INFO => SYSTEM_SHOW_DEBUG_INFO_AUTO, - SYSTEM_MAIL_LOG => Path::appRelToCwd(Path::SYSTEM_MAIL_LOG_FILE_REL_TO_APP), - SYSTEM_QFQ_LOG => Path::appRelToCwd(Path::SYSTEM_QFQ_LOG_FILE_REL_TO_APP), - SYSTEM_SQL_LOG => Path::appRelToCwd(Path::SYSTEM_SQL_LOG_FILE_REL_TO_APP), + SYSTEM_MAIL_LOG_ABSOLUTE => Path::SYSTEM_MAIL_LOG_FILE_REL_TO_APP, // Will be made absolute automatically by Store->adjustConfig() + SYSTEM_QFQ_LOG_ABSOLUTE => Path::SYSTEM_QFQ_LOG_FILE_REL_TO_APP, // Will be made absolute automatically by Store->adjustConfig() + SYSTEM_SQL_LOG_ABSOLUTE => Path::SYSTEM_SQL_LOG_FILE_REL_TO_APP, // Will be made absolute automatically by Store->adjustConfig() SYSTEM_SQL_LOG_MODE => 'modify', SYSTEM_SQL_LOG_MODE_AUTOCRON => 'error', F_BS_COLUMNS => 'col-md-12 col-lg-10', @@ -379,8 +379,8 @@ class Config { SYSTEM_CMD_GS => 'gs', SYSTEM_CMD_PDFUNITE => 'pdfunite', - SYSTEM_THUMBNAIL_DIR_SECURE => Path::appRelToCwd(Path::SYSTEM_THUMBNAIL_DIR_SECURE_DEFAULT_REL_TO_APP), - SYSTEM_THUMBNAIL_DIR_PUBLIC => Path::appRelToCwd(Path::SYSTEM_THUMBNAIL_DIR_PUBLIC_DEFAULT_REL_TO_APP), + SYSTEM_THUMBNAIL_DIR_SECURE_REL_TO_APP => Path::SYSTEM_THUMBNAIL_DIR_SECURE_DEFAULT_REL_TO_APP, + SYSTEM_THUMBNAIL_DIR_PUBLIC_REL_TO_APP => Path::SYSTEM_THUMBNAIL_DIR_PUBLIC_DEFAULT_REL_TO_APP, F_FE_DATA_REQUIRED_ERROR => F_FE_DATA_REQUIRED_ERROR_DEFAULT, F_FE_DATA_MATCH_ERROR => F_FE_DATA_MATCH_ERROR_DEFAULT, diff --git a/extension/Classes/Core/Store/Store.php b/extension/Classes/Core/Store/Store.php index 6be741eae..975b3648d 100644 --- a/extension/Classes/Core/Store/Store.php +++ b/extension/Classes/Core/Store/Store.php @@ -250,7 +250,7 @@ class Store { private static function doSystemPath(array $config) { // SYSTEM_PATH_EXT: compute only if not already defined. - if (!isset($config[SYSTEM_EXT_PATH]) || $config[SYSTEM_EXT_PATH] === '' || $config[SYSTEM_EXT_PATH][0] !== '/') { + if (!isset($config[SYSTEM_EXT_PATH_ABSOLUTE]) || $config[SYSTEM_EXT_PATH_ABSOLUTE] === '' || $config[SYSTEM_EXT_PATH_ABSOLUTE][0] !== '/') { $relExtDir = '/typo3conf/ext/' . EXT_KEY; if (defined('PHPUNIT_QFQ')) { @@ -258,8 +258,8 @@ class Store { $pos = strpos($cwd, '/typo3conf/'); // this means phpUnit. - $config[SYSTEM_SITE_PATH] = substr($cwd, 0, $pos); - $config[SYSTEM_EXT_PATH] = $config[SYSTEM_SITE_PATH] . $relExtDir; + $config[SYSTEM_SITE_PATH_ABSOLUTE] = substr($cwd, 0, $pos); + $config[SYSTEM_EXT_PATH_ABSOLUTE] = $config[SYSTEM_SITE_PATH_ABSOLUTE] . $relExtDir; } else { // If we are called through AJAX API (e.g. api/save.php), there is no TYPO3 environment. @@ -267,17 +267,17 @@ class Store { if ($pos === false && isset($GLOBALS['TYPO3_LOADED_EXT'][EXT_KEY]['ext_localconf.php'])) { // Typo3 extension: probably index.php - $config[SYSTEM_EXT_PATH] = dirname($GLOBALS['TYPO3_LOADED_EXT'][EXT_KEY]['ext_localconf.php']); - $config[SYSTEM_SITE_PATH] = dirname($_SERVER['SCRIPT_FILENAME'] ?? ''); + $config[SYSTEM_EXT_PATH_ABSOLUTE] = dirname($GLOBALS['TYPO3_LOADED_EXT'][EXT_KEY]['ext_localconf.php']); + $config[SYSTEM_SITE_PATH_ABSOLUTE] = dirname($_SERVER['SCRIPT_FILENAME'] ?? ''); } else { // API - $config[SYSTEM_EXT_PATH] = substr($_SERVER['SCRIPT_FILENAME'] ?? '', 0, $pos + strlen($relExtDir)); - $config[SYSTEM_SITE_PATH] = substr($_SERVER['SCRIPT_FILENAME'] ?? '', 0, $pos); + $config[SYSTEM_EXT_PATH_ABSOLUTE] = substr($_SERVER['SCRIPT_FILENAME'] ?? '', 0, $pos + strlen($relExtDir)); + $config[SYSTEM_SITE_PATH_ABSOLUTE] = substr($_SERVER['SCRIPT_FILENAME'] ?? '', 0, $pos); } } } - Logger::setSystemSitePath($config[SYSTEM_SITE_PATH]); + Logger::setSystemSitePath($config[SYSTEM_SITE_PATH_ABSOLUTE]); return $config; } @@ -293,12 +293,12 @@ class Store { $config[SYSTEM_SHOW_DEBUG_INFO] = self::adjustConfigShowDebugInfo($config[SYSTEM_SHOW_DEBUG_INFO], self::beUserLoggdIn()); - $config[SYSTEM_SEND_E_MAIL] = $config[SYSTEM_EXT_PATH] . '/Classes/External/sendEmail'; + $config[SYSTEM_SEND_E_MAIL_ABSOLUTE] = $config[SYSTEM_EXT_PATH_ABSOLUTE] . '/Classes/External/sendEmail'; // Make path absolute - foreach ([SYSTEM_MAIL_LOG, SYSTEM_QFQ_LOG, SYSTEM_SQL_LOG] AS $key) { + foreach ([SYSTEM_MAIL_LOG_ABSOLUTE, SYSTEM_QFQ_LOG_ABSOLUTE, SYSTEM_SQL_LOG_ABSOLUTE] AS $key) { if (!empty($config[$key]) && $config[$key][0] != '/') { - $config[$key] = HelperFile::joinPathFilename($config[SYSTEM_SITE_PATH], $config[$key]); + $config[$key] = HelperFile::joinPathFilename($config[SYSTEM_SITE_PATH_ABSOLUTE], $config[$key]); } } @@ -353,7 +353,7 @@ class Store { private static function checkMandatoryParameter(array $config) { // Check mandatory config vars. - $names = array_merge([SYSTEM_SQL_LOG, SYSTEM_SQL_LOG_MODE], + $names = array_merge([SYSTEM_SQL_LOG_ABSOLUTE, SYSTEM_SQL_LOG_MODE], self::dbCredentialName($config[SYSTEM_DB_INDEX_DATA]), self::dbCredentialName($config[SYSTEM_DB_INDEX_QFQ])); @@ -639,9 +639,9 @@ class Store { // Switch FeUser: log this to qfq.log if ($storeName === STORE_USER && $key == TYPO3_FE_USER) { - $qfqLog = self::getVar(SYSTEM_QFQ_LOG, STORE_SYSTEM); + $qfqLogPathAbsolute = self::getVar(SYSTEM_QFQ_LOG_ABSOLUTE, STORE_SYSTEM); $feUserOld = isset($data[$key]) ? $data[$key] : self::getVar($key, STORE_TYPO3 . STORE_EMPTY); - Logger::logMessage(date('Y.m.d H:i:s ') . ": Switch feUser '$feUserOld' to '$value'", $qfqLog); + Logger::logMessage(date('Y.m.d H:i:s ') . ": Switch feUser '$feUserOld' to '$value'", $qfqLogPathAbsolute); } $data[$key] = $value; diff --git a/extension/Classes/External/AutoCron.php b/extension/Classes/External/AutoCron.php index 34a695c0a..9ed56aba2 100644 --- a/extension/Classes/External/AutoCron.php +++ b/extension/Classes/External/AutoCron.php @@ -171,7 +171,7 @@ class AutoCron { // If configured, log the download content if (!empty($job[AUTOCRON_OUTPUT_FILE])) { - $job[AUTOCRON_OUTPUT_FILE] = Support::joinPath($this->store->getVar(SYSTEM_SITE_PATH, STORE_SYSTEM), $job[AUTOCRON_OUTPUT_FILE], FILE_PRIORITY); + $job[AUTOCRON_OUTPUT_FILE] = Support::joinPath($this->store->getVar(SYSTEM_SITE_PATH_ABSOLUTE, STORE_SYSTEM), $job[AUTOCRON_OUTPUT_FILE], FILE_PRIORITY); Logger::logMessage($page, $job[AUTOCRON_OUTPUT_FILE], $job[AUTOCRON_OUTPUT_MODE] == 'append' ? FILE_MODE_APPEND : FILE_MODE_WRITE); } diff --git a/extension/Tests/Unit/Core/DeleteTest.php b/extension/Tests/Unit/Core/DeleteTest.php index 43164fbe2..da28b65e1 100644 --- a/extension/Tests/Unit/Core/DeleteTest.php +++ b/extension/Tests/Unit/Core/DeleteTest.php @@ -73,7 +73,7 @@ class DeleteTest extends AbstractDatabaseTest { parent::setUp(); $this->store->setVar('form', 'TestFormName', STORE_TYPO3); - $this->store->setVar(SYSTEM_SITE_PATH, '/tmp', STORE_SYSTEM, true); + $this->store->setVar(SYSTEM_SITE_PATH_ABSOLUTE, '/tmp', STORE_SYSTEM, true); $this->executeSQLFile(__DIR__ . '/Database/fixtures/Generic.sql', true); } diff --git a/extension/Tests/Unit/Core/Store/StoreTest.php b/extension/Tests/Unit/Core/Store/StoreTest.php index c8faf559f..3080afe40 100644 --- a/extension/Tests/Unit/Core/Store/StoreTest.php +++ b/extension/Tests/Unit/Core/Store/StoreTest.php @@ -342,8 +342,8 @@ class StoreTest extends TestCase { SYSTEM_DB_1_NAME => '<DB>', SYSTEM_DOCUMENTATION_QFQ => SYSTEM_DOCUMENTATION_QFQ_URL, SYSTEM_FLAG_PRODUCTION => 'yes', - SYSTEM_THUMBNAIL_DIR_SECURE => Path::appRelToCwd(Path::SYSTEM_THUMBNAIL_DIR_SECURE_DEFAULT_REL_TO_APP), - SYSTEM_THUMBNAIL_DIR_PUBLIC => Path::appRelToCwd(Path::SYSTEM_THUMBNAIL_DIR_PUBLIC_DEFAULT_REL_TO_APP), + SYSTEM_THUMBNAIL_DIR_SECURE_REL_TO_APP => Path::SYSTEM_THUMBNAIL_DIR_SECURE_DEFAULT_REL_TO_APP, + SYSTEM_THUMBNAIL_DIR_PUBLIC_REL_TO_APP => Path::SYSTEM_THUMBNAIL_DIR_PUBLIC_DEFAULT_REL_TO_APP, SYSTEM_CMD_INKSCAPE => 'inkscape', SYSTEM_CMD_CONVERT => 'convert', SYSTEM_CMD_WKHTMLTOPDF => '/opt/wkhtmltox/bin/wkhtmltopdf', @@ -449,9 +449,8 @@ EOT; $config = $this->store->getStore(STORE_SYSTEM); # The following won't be checked by content, cause they will change on different installations. -// foreach ([ SYSTEM_SQL_LOG, SYSTEM_MAIL_LOG, SYSTEM_SITE_PATH, SYSTEM_EXT_PATH, SYSTEM_SEND_E_MAIL] as $key) { - foreach ([SYSTEM_SITE_PATH, SYSTEM_EXT_PATH, SYSTEM_SEND_E_MAIL, SYSTEM_SESSION_TIMEOUT_SECONDS, SYSTEM_QFQ_LOG, - SYSTEM_SQL_LOG, SYSTEM_MAIL_LOG, SYSTEM_FILE_MAX_FILE_SIZE] as $key) { + foreach ([SYSTEM_SITE_PATH_ABSOLUTE, SYSTEM_EXT_PATH_ABSOLUTE, SYSTEM_SEND_E_MAIL_ABSOLUTE, SYSTEM_SESSION_TIMEOUT_SECONDS, SYSTEM_QFQ_LOG_ABSOLUTE, + SYSTEM_SQL_LOG_ABSOLUTE, SYSTEM_MAIL_LOG_ABSOLUTE, SYSTEM_FILE_MAX_FILE_SIZE] as $key) { $this->assertTrue(isset($config[$key]), "Missing default value for '$key' "); unset ($config[$key]); } -- GitLab From c0afbe317a76127056b9f10f28d9714ab1f011df Mon Sep 17 00:00:00 2001 From: Marc Egger <marc.egger@uzh.ch> Date: Mon, 24 Aug 2020 18:14:14 +0200 Subject: [PATCH 066/195] Refs #11035 rename Path:: functions and constants from {a}relTo{b} to {b}to{a}. --- extension/Classes/Core/AbstractBuildForm.php | 14 +-- extension/Classes/Core/BuildFormBootstrap.php | 12 +-- extension/Classes/Core/Constants.php | 2 +- extension/Classes/Core/Database/Database.php | 2 +- .../Classes/Core/Database/DatabaseUpdate.php | 8 +- extension/Classes/Core/Evaluate.php | 2 +- .../Core/Exception/AbstractException.php | 4 +- extension/Classes/Core/Form/FormAsFile.php | 4 +- extension/Classes/Core/Helper/HelperFile.php | 40 ++------ extension/Classes/Core/Helper/Logger.php | 50 ++++------ extension/Classes/Core/Helper/Path.php | 94 ++++++------------- extension/Classes/Core/Helper/Support.php | 4 +- extension/Classes/Core/QuickFormQuery.php | 6 +- extension/Classes/Core/Report/Link.php | 10 +- extension/Classes/Core/Report/Monitor.php | 6 +- extension/Classes/Core/Report/Report.php | 3 +- .../Classes/Core/Report/ReportAsFile.php | 4 +- extension/Classes/Core/Report/Thumbnail.php | 8 +- extension/Classes/Core/Store/Config.php | 12 +-- extension/Classes/Core/Store/Store.php | 3 +- extension/{Classes/Api => NoT3Page}/index.php | 16 ++-- .../Tests/Unit/Core/Helper/HelperFileTest.php | 30 +++--- .../Tests/Unit/Core/Report/ReportTest.php | 14 +-- extension/Tests/Unit/Core/Store/StoreTest.php | 4 +- 24 files changed, 141 insertions(+), 211 deletions(-) rename extension/{Classes/Api => NoT3Page}/index.php (94%) diff --git a/extension/Classes/Core/AbstractBuildForm.php b/extension/Classes/Core/AbstractBuildForm.php index 56c64fc50..9e44c6267 100644 --- a/extension/Classes/Core/AbstractBuildForm.php +++ b/extension/Classes/Core/AbstractBuildForm.php @@ -633,7 +633,7 @@ abstract class AbstractBuildForm { */ public function getActionUrl() { - return Path::apiRelToCwd(API_SAVE_PHP); + return Path::cwdToApi(API_SAVE_PHP); } /** @@ -2545,7 +2545,7 @@ abstract class AbstractBuildForm { } if (isset($control[SUBRECORD_COLUMN_ICON][$columnName])) { - $cell = ($cell === '') ? '' : "<image src='" . Path::extRelToCwd(Path::PATH_ICONS_REL_TO_EXT) . "/$cell'>"; + $cell = ($cell === '') ? '' : "<image src='" . Path::cwdToExt(Path::EXT_TO_PATH_ICONS) . "/$cell'>"; } if (isset($control[SUBRECORD_COLUMN_MAILTO][$columnName])) { @@ -2595,7 +2595,7 @@ abstract class AbstractBuildForm { $sip = $this->store->getSipInstance(); - return $sip->queryStringToSip($queryString, $mode, Path::apiRelToCwd(API_DELETE_PHP)); + return $sip->queryStringToSip($queryString, $mode, Path::cwdToApi(API_DELETE_PHP)); } /** @@ -2883,8 +2883,8 @@ abstract class AbstractBuildForm { $attributeFabric = Support::doAttribute('class', ANNOTATE_GRAPHIC_CSS_CLASS); $attributeFabric .= Support::doAttribute('data-background-image', $this->fileToSipUrl($formElement[FE_IMAGE_SOURCE])); $attributeFabric .= Support::doAttribute('data-control-name', $formElement[FE_HTML_ID]); - $attributeFabric .= Support::doAttribute('data-buttons', 'typo3conf/ext/qfq/Resources/Public/Json/fabric.buttons.json'); - $attributeFabric .= Support::doAttribute('data-emojis', 'typo3conf/ext/qfq/Resources/Public/Json/qfq.emoji.json'); + $attributeFabric .= Support::doAttribute('data-buttons', Path::cwdToExt('Resources/Public/Json/fabric.buttons.json')); + $attributeFabric .= Support::doAttribute('data-emojis', Path::cwdToExt('Resources/Public/Json/qfq.emoji.json')); $attributeFabric .= Support::doAttribute('data-fabric-color', HelperFormElement::penColorToHex($formElement)); $attributeFabric .= HelperFormElement::getAttributeFeMode($formElement[FE_MODE]); if ($formElement[FE_MODE] == FE_MODE_READONLY) { @@ -2949,7 +2949,7 @@ abstract class AbstractBuildForm { // data-image-output="target-png"> // </div> $attributeFabric = Support::doAttribute('class', ANNOTATE_GRAPHIC_CSS_CLASS); - $attributeFabric .= Support::doAttribute('data-buttons', 'typo3conf/ext/qfq/Resources/Public/Json/fabric.editor.buttons.json'); + $attributeFabric .= Support::doAttribute('data-buttons', Path::cwdToExt('Resources/Public/Json/fabric.editor.buttons.json')); $attributeFabric .= Support::doAttribute('data-edit-image', 'true'); $attributeFabric .= Support::doAttribute('data-background-image', $imageFileName); $attributeFabric .= Support::doAttribute('data-control-name', $htmlFabricId); @@ -2995,7 +2995,7 @@ abstract class AbstractBuildForm { $param[DOWNLOAD_MODE] = DOWNLOAD_MODE_FILE; $param[SIP_DOWNLOAD_PARAMETER] = base64_encode(TOKEN_FILE . PARAM_TOKEN_DELIMITER . $pathFileName); - $url = $this->sip->queryStringToSip(Path::apiRelToCwd(API_DOWNLOAD_PHP) . '?' . KeyValueStringParser::unparse($param, '=', '&'), RETURN_URL); + $url = $this->sip->queryStringToSip(Path::cwdToApi(API_DOWNLOAD_PHP) . '?' . KeyValueStringParser::unparse($param, '=', '&'), RETURN_URL); return $url; } diff --git a/extension/Classes/Core/BuildFormBootstrap.php b/extension/Classes/Core/BuildFormBootstrap.php index 3ebae0f06..4a0e11568 100644 --- a/extension/Classes/Core/BuildFormBootstrap.php +++ b/extension/Classes/Core/BuildFormBootstrap.php @@ -657,14 +657,14 @@ class BuildFormBootstrap extends AbstractBuildForm { $actionUpload = FILE_ACTION . '=' . FILE_ACTION_UPLOAD; $actionDelete = FILE_ACTION . '=' . FILE_ACTION_DELETE; - $apiDeletePhp = Path::apiRelToCwd(API_DELETE_PHP); + $apiDeletePhp = Path::cwdToApi(API_DELETE_PHP); - $dirtyAction = ($this->formSpec[F_DIRTY_MODE] == DIRTY_MODE_NONE) ? '' : "dirtyUrl: '" . Path::apiRelToCwd(API_DIRTY_PHP) . "',"; + $dirtyAction = ($this->formSpec[F_DIRTY_MODE] == DIRTY_MODE_NONE) ? '' : "dirtyUrl: '" . Path::cwdToApi(API_DIRTY_PHP) . "',"; - $submitTo = Path::apiRelToCwd(API_SAVE_PHP); - $refreshUrl = Path::apiRelToCwd(API_LOAD_PHP); - $fileUploadTo = Path::apiRelToCwd(API_FILE_PHP) . '?' . $actionUpload; - $fileDeleteUrl = Path::apiRelToCwd(API_FILE_PHP) . '?' . $actionDelete; + $submitTo = Path::cwdToApi(API_SAVE_PHP); + $refreshUrl = Path::cwdToApi(API_LOAD_PHP); + $fileUploadTo = Path::cwdToApi(API_FILE_PHP) . '?' . $actionUpload; + $fileDeleteUrl = Path::cwdToApi(API_FILE_PHP) . '?' . $actionDelete; $html .= '</form>'; // <form class="form-horizontal" ... $html .= <<<EOF diff --git a/extension/Classes/Core/Constants.php b/extension/Classes/Core/Constants.php index 08c4896e9..c24335fc2 100644 --- a/extension/Classes/Core/Constants.php +++ b/extension/Classes/Core/Constants.php @@ -549,7 +549,7 @@ const SYSTEM_EDIT_FORM_PAGE = 'editFormPage'; // computed automatically during runtime const SYSTEM_EXT_PATH_ABSOLUTE = 'extPath'; -const SYSTEM_SITE_PATH_ABSOLUTE = 'sitePath'; +const SYSTEM_SITE_PATH_ABSOLUTE = 'sitePath'; // Path of the App const SYSTEM_LDAP_1_RDN = 'LDAP_1_RDN'; // Credentials to access LDAP const SYSTEM_LDAP_1_PASSWORD = 'LDAP_1_PASSWORD'; // Credentials to access LDAP diff --git a/extension/Classes/Core/Database/Database.php b/extension/Classes/Core/Database/Database.php index 6196ab05c..c81aca3c5 100644 --- a/extension/Classes/Core/Database/Database.php +++ b/extension/Classes/Core/Database/Database.php @@ -1045,7 +1045,7 @@ class Database { * @throws \UserFormException */ public function getQfqLogFile() { - return ($this->store == null) ? Path::appRelToCwd(Path::SYSTEM_QFQ_LOG_FILE_REL_TO_APP) : $this->store->getVar(SYSTEM_QFQ_LOG_ABSOLUTE, STORE_SYSTEM); + return ($this->store == null) ? Path::cwdToApp(Path::APP_TO_SYSTEM_QFQ_LOG_FILE) : $this->store->getVar(SYSTEM_QFQ_LOG_ABSOLUTE, STORE_SYSTEM); } /** diff --git a/extension/Classes/Core/Database/DatabaseUpdate.php b/extension/Classes/Core/Database/DatabaseUpdate.php index 92cac0279..4055af7d7 100644 --- a/extension/Classes/Core/Database/DatabaseUpdate.php +++ b/extension/Classes/Core/Database/DatabaseUpdate.php @@ -294,7 +294,7 @@ class DatabaseUpdate { if ($actionSpecialColumn === ACTION_SPECIAL_COLUMN_DO_REPLACE) { // save log file $message = '<h1>Special column names replaced</h1>The following special column names were replaced.<hr>' . $message; - Logger::logMessage($message, Path::appRelToCwd(Path::SYSTEM_LOG_REL_TO_APP) . '/' . date("YmdHi") . '_special_columns_auto_update.html'); + Logger::logMessage($message, Path::cwdToApp(Path::APP_TO_SYSTEM_LOG) . '/' . date("YmdHi") . '_special_columns_auto_update.html'); } elseif ($actionSpecialColumn === ACTION_SPECIAL_COLUMN_DO_SKIP_REPLACE) { // do nothing } else { @@ -306,7 +306,7 @@ class DatabaseUpdate { . 'Click <a href="?' . http_build_query(array_merge($_GET, array(ACTION_SPECIAL_COLUMN_UPDATE => ACTION_SPECIAL_COLUMN_DO_REPLACE))) . '">Auto-Replace</a>' . ' to automatically prepend the found column names with an underscore.' . ' In the report below the missing underscores are marked by "<span style="font-weight: bold; color: red;">>>>_</span>".' - . ' This report will be saved in ' . Path::appRelToCwd(Path::SYSTEM_LOG_REL_TO_APP) . ' after the automatic replacement.' + . ' This report will be saved in ' . Path::cwdToApp(Path::APP_TO_SYSTEM_LOG) . ' after the automatic replacement.' . ' <br><br>To update qfq without changing the special columns (your app will probably be broken): ' . '<a href="?' . http_build_query(array_merge($_GET, array(ACTION_SPECIAL_COLUMN_UPDATE => ACTION_SPECIAL_COLUMN_DO_SKIP_REPLACE))) . '">Skip Auto-Replace</a>' . '<h2>Report</h2>' @@ -365,6 +365,8 @@ class DatabaseUpdate { $functionsHashTest = null; } + $qfqFunctionSqlRelToApp = Path::cwdToExt('Classes/Sql/' . QFQ_FUNCTION_SQL); + if ($functionHash !== null AND $functionsHashTest === $functionHash) { return $functionHash; } else { @@ -374,7 +376,7 @@ class DatabaseUpdate { "Possible solutions: <ul>" . '<li>Grant SUPER, CREATE ROUTINE, ALTER ROUTINE privileges to qfq mysql user temporarily.</li>' . '<li>Play the following file manually on the database: ' . - '<a href="typo3conf/ext/qfq/Classes/Sql/' . QFQ_FUNCTION_SQL . '">typo3conf/ext/qfq/Classes/Sql/' . QFQ_FUNCTION_SQL . '</a><br>and grant the qfq mysql user execution privileges on the sql functions.</li>' . + '<a href="' . $qfqFunctionSqlRelToApp . '">' . $qfqFunctionSqlRelToApp . '</a><br>and grant the qfq mysql user execution privileges on the sql functions.</li>' . '<li><a href="?' . http_build_query(array_merge($_GET, array(ACTION_FUNCTION_UPDATE => ACTION_FUNCTION_UPDATE_NEXT_UPDATE))) . '">Click here</a> to skip the sql functions update until next qfq release update</li>' . '<li><a href="?' . http_build_query(array_merge($_GET, array(ACTION_FUNCTION_UPDATE => ACTION_FUNCTION_UPDATE_NEVER))) . '">Click here</a> to skip the sql functions update forever</li>' . '</ul>' . diff --git a/extension/Classes/Core/Evaluate.php b/extension/Classes/Core/Evaluate.php index 471130356..fa40d32a7 100644 --- a/extension/Classes/Core/Evaluate.php +++ b/extension/Classes/Core/Evaluate.php @@ -293,7 +293,7 @@ class Evaluate { $this->store::setVar(SYSTEM_DRAG_AND_DROP_JS, 'true', STORE_SYSTEM); // data-dnd-api="typo3conf/ext/qfq/qfq/Api/dragAndDrop.php?s={{'U:form=<form name>[¶mX=<any value>]|s|r:8' AS _link}}" - return DND_DATA_DND_API . '="' . Path::apiRelToCwd(API_DRAG_AND_DROP_PHP) . '?s=' . $s . '"'; + return DND_DATA_DND_API . '="' . Path::cwdToApi(API_DRAG_AND_DROP_PHP) . '?s=' . $s . '"'; } /** diff --git a/extension/Classes/Core/Exception/AbstractException.php b/extension/Classes/Core/Exception/AbstractException.php index 42c56358a..332e6ee54 100644 --- a/extension/Classes/Core/Exception/AbstractException.php +++ b/extension/Classes/Core/Exception/AbstractException.php @@ -190,7 +190,7 @@ class AbstractException extends \Exception { } } - $qfqLog = ($store == null) ? Path::appRelToCwd(Path::SYSTEM_QFQ_LOG_FILE_REL_TO_APP) : $store->getVar(SYSTEM_QFQ_LOG_ABSOLUTE, STORE_SYSTEM); + $qfqLog = ($store == null) ? Path::cwdToApp(Path::APP_TO_SYSTEM_QFQ_LOG_FILE) : $store->getVar(SYSTEM_QFQ_LOG_ABSOLUTE, STORE_SYSTEM); $arrDebugHidden[EXCEPTION_STACKTRACE] = PHP_EOL . implode($arrTrace, PHP_EOL); $arrLogAll = array_merge($arrMsg, $arrShow, $arrDebugShow, $arrDebugHidden); $logAll = OnArray::arrayToLog($arrLogAll); @@ -260,7 +260,7 @@ class AbstractException extends \Exception { $trace = $this->getTraceAsString(); $arrTrace = explode(PHP_EOL, $trace); - return OnArray::filterValueSubstring($arrTrace, '/typo3conf/ext/' . EXT_KEY . '/'); + return OnArray::filterValueSubstring($arrTrace, Path::APP_TO_EXT); } /** diff --git a/extension/Classes/Core/Form/FormAsFile.php b/extension/Classes/Core/Form/FormAsFile.php index 5dc953a1b..c16b5b58d 100644 --- a/extension/Classes/Core/Form/FormAsFile.php +++ b/extension/Classes/Core/Form/FormAsFile.php @@ -610,8 +610,8 @@ class FormAsFile */ private static function formPath(Database $database): string { - $qfqProjectDirRelToCwd = Path::appRelToCwd(Store::getInstance()->getVar(SYSTEM_QFQ_PROJECT_DIR_SECURE_REL_TO_APP, STORE_SYSTEM)); - $formPath = Path::join($qfqProjectDirRelToCwd, Path::FORM_REL_TO_PROJECT_DIR); + $qfqProjectDirRelToCwd = Path::cwdToApp(Store::getInstance()->getVar(SYSTEM_QFQ_PROJECT_DIR_SECURE_REL_TO_APP, STORE_SYSTEM)); + $formPath = Path::join($qfqProjectDirRelToCwd, Path::PROJECT_DIR_TO_FORM); if (!is_dir($formPath)) { // create path diff --git a/extension/Classes/Core/Helper/HelperFile.php b/extension/Classes/Core/Helper/HelperFile.php index 327ee252e..de9129979 100644 --- a/extension/Classes/Core/Helper/HelperFile.php +++ b/extension/Classes/Core/Helper/HelperFile.php @@ -102,25 +102,25 @@ class HelperFile { /** * Returns an array with filestat information to $pathFileName * - * @param $pathFileName + * @param $pathFileNameRelToApp * @return array * @throws \UserFormException */ - public static function getFileStat($pathFileName) { + public static function getFileStat($pathFileNameRelToApp) { $vars = [VAR_FILE_MIME_TYPE => '-', VAR_FILE_SIZE => '-']; - if (empty($pathFileName)) { + if (empty($pathFileNameRelToApp)) { return $vars; } - $pathFileName = self::correctRelativePathFileName($pathFileName); + $pathFileNameRelToApp = Path::cwdToApp($pathFileNameRelToApp); - if (!file_exists($pathFileName)) { + if (!file_exists($pathFileNameRelToApp)) { return $vars; } - $vars[VAR_FILE_MIME_TYPE] = self::getMimeType($pathFileName); - $vars[VAR_FILE_SIZE] = filesize($pathFileName); + $vars[VAR_FILE_MIME_TYPE] = self::getMimeType($pathFileNameRelToApp); + $vars[VAR_FILE_SIZE] = filesize($pathFileNameRelToApp); if ($vars[VAR_FILE_SIZE] === false) { $vars[VAR_FILE_SIZE] = '-'; @@ -129,30 +129,6 @@ class HelperFile { return $vars; } - /** - * Correct $pathFilename, if the cwd is .../qfq/Api' - * - * @param $pathFileName - * @return string - */ - public static function correctRelativePathFileName($pathFileName) { - - if (empty($pathFileName)) { - return ''; - } - - if ($pathFileName[0] == '/') { - return $pathFileName; - } - - $length = strlen('/' . Path::apiRelToExt()); - if (substr(getcwd(), -$length) == '/' . Path::apiRelToExt()) { - return '../../../../../' . $pathFileName; - } - - return $pathFileName; - } - /** * Split $pathFileName into it's components and fill an array, with array keys like used in STORE_VAR. * @@ -475,7 +451,7 @@ class HelperFile { } if (isset($extToFileType[$ext])) { - return Path::appRelToCwd(Path::DIR_HIGHLIGHT_JSON_REL_TO_APP) . '/' . $extToFileType[$ext]; + return Path::cwdToExt(Path::EXT_TO_HIGHLIGHT_JSON_DIR) . '/' . $extToFileType[$ext]; } return ''; diff --git a/extension/Classes/Core/Helper/Logger.php b/extension/Classes/Core/Helper/Logger.php index 1291bed75..cfa3b5dbc 100644 --- a/extension/Classes/Core/Helper/Logger.php +++ b/extension/Classes/Core/Helper/Logger.php @@ -26,7 +26,7 @@ class Logger { * * @param $path */ - public static function setSystemSitePath($path) { + public static function setSystemSitePathAbsolute($path) { self::$systemSitePath = $path; } @@ -34,25 +34,25 @@ class Logger { * Append $msg to $filename. Create the file it it not exist. * * @param $msg - * @param $filename + * @param $pathFileNameRelToCwd * * @param string $mode * @param bool $recursion * @throws \CodeException * @throws \UserFormException */ - public static function logMessage($msg, $filename, $mode = FILE_MODE_APPEND, $recursion = false) { + public static function logMessage($msg, $pathFileNameRelToCwd, $mode = FILE_MODE_APPEND, $recursion = false) { $handle = false; - if ($filename == '') { + if ($pathFileNameRelToCwd == '') { return; } - $filename = self::makePathAbsolute($filename); + $pathFileNameRelToCwd = self::makePathAbsolute($pathFileNameRelToCwd); try { - $handle = fopen($filename, $mode); + $handle = fopen($pathFileNameRelToCwd, $mode); } catch (\Exception $e) { $dummy = 1; } @@ -64,21 +64,21 @@ class Logger { if ($recursion) { throw new \UserFormException( json_encode([ERROR_MESSAGE_TO_USER => 'Error: cannot open file', - ERROR_MESSAGE_TO_DEVELOPER => "Error - cannot open. File: " . $filename . + ERROR_MESSAGE_TO_DEVELOPER => "Error - cannot open. File: " . $pathFileNameRelToCwd . " ( CWD: " . getcwd() . ") - " . HelperFile::errorGetLastAsString()]), ERROR_IO_OPEN); } // If open fails, maybe the directory does not exist. Create it: - HelperFile::mkDirParent($filename); - self::logMessage($msg, $filename, $mode, true); + HelperFile::mkDirParent($pathFileNameRelToCwd); + self::logMessage($msg, $pathFileNameRelToCwd, $mode, true); return; } if (fwrite($handle, $msg . PHP_EOL) === false) { throw new \UserFormException( json_encode([ERROR_MESSAGE_TO_USER => 'Error: cannot write file', - ERROR_MESSAGE_TO_DEVELOPER => "Error - cannot open. File: " . $filename . + ERROR_MESSAGE_TO_DEVELOPER => "Error - cannot open. File: " . $pathFileNameRelToCwd . " ( CWD: " . getcwd() . ") - " . HelperFile::errorGetLastAsString()]), ERROR_IO_WRITE); } @@ -100,33 +100,17 @@ class Logger { } /** - * In case $filename is not absolute and if we're in the API directory: Check if we're in api - update relative filename + * In case $pathFileNameRelToCwd is not absolute, make it absolute * - * @param $filename + * @param $pathFileNameRelToCwd * @return string */ - private static function makePathAbsolute($filename) { - - if (isset($filename[0]) && $filename[0] != '/') { - - if (self::$systemSitePath == '') { + private static function makePathAbsolute($pathFileNameRelToCwd) { - if (defined('PHPUNIT_QFQ')) { - if (strpos(getcwd(), 'qfq/' . Path::apiRelToExt()) !== false) { - return ('../../../../../' . $filename); - } - return $filename; - } - - // In case of attack detection, the config is not available - extract the installation directory from the server vars. - return dirname($_SERVER['SCRIPT_FILENAME']) . DIRECTORY_SEPARATOR . $filename; -// throw new \CodeException('SystemSitePath is not set and the given logfile should be made absolute.', ERROR_MISSING_VALUE); - } - - return self::$systemSitePath . DIRECTORY_SEPARATOR . $filename; + if (isset($pathFileNameRelToCwd[0]) && $pathFileNameRelToCwd[0] != '/') { + return realpath($pathFileNameRelToCwd); } - - return $filename; + return $pathFileNameRelToCwd; } /** @@ -182,7 +166,7 @@ class Logger { foreach ([FORM_LOG_FILE_ALL, FORM_LOG_FILE_SESSION] as $filename) { if (!empty($form[$filename])) { - Logger::logMessage($line, $form[$filename]); + Logger::logMessage($line, Path::cwdToApp($form[$filename])); } } } diff --git a/extension/Classes/Core/Helper/Path.php b/extension/Classes/Core/Helper/Path.php index d8b0a9ef9..e34e2b118 100644 --- a/extension/Classes/Core/Helper/Path.php +++ b/extension/Classes/Core/Helper/Path.php @@ -37,66 +37,64 @@ Path::join($qfqProjectDirRelToCwd, Path::REPORT_REL_TO_PROJECT_DIR) === "../../. class Path { - // Default path relative to CWD - private static $appRelToCwd = ''; + // Path from CWD. + // This should be manually overwritten (using Path::setCwdToApp()) if the CWD is not the one containing the typo3 index.php. + private static $cwdToApp = ''; // Extension - const EXT_REL_TO_APP = 'typo3conf/ext/qfq'; + const APP_TO_EXT = 'typo3conf/ext/qfq'; // QFQ Project dir - const FORM_REL_TO_PROJECT_DIR = 'form'; - const REPORT_REL_TO_PROJECT_DIR = 'report'; + const PROJECT_DIR_TO_FORM = 'form'; + const PROJECT_DIR_TO_REPORT = 'report'; // API - const API_REL_TO_EXT = 'Classes/Api'; + const EXT_TO_API = 'Classes/Api'; // Icons - const GFX_INFO_REL_TO_EXT = 'Resources/Public/icons/note.gif'; - const PATH_ICONS_REL_TO_EXT = 'Resources/Public/icons'; + const EXT_TO_GFX_INFO = 'Resources/Public/icons/note.gif'; + const EXT_TO_PATH_ICONS = 'Resources/Public/icons'; // Log files - const SYSTEM_LOG_REL_TO_APP = 'fileadmin/protected/log'; - const SYSTEM_QFQ_LOG_FILE_REL_TO_APP = 'fileadmin/protected/log/qfq.log'; - const SYSTEM_MAIL_LOG_FILE_REL_TO_APP = 'fileadmin/protected/log/mail.log'; - const SYSTEM_SQL_LOG_FILE_REL_TO_APP = 'fileadmin/protected/log/sql.log'; + const APP_TO_SYSTEM_LOG = 'fileadmin/protected/log'; + const APP_TO_SYSTEM_QFQ_LOG_FILE = 'fileadmin/protected/log/qfq.log'; + const APP_TO_SYSTEM_MAIL_LOG_FILE = 'fileadmin/protected/log/mail.log'; + const APP_TO_SYSTEM_SQL_LOG_FILE = 'fileadmin/protected/log/sql.log'; // Thumbnail - const SYSTEM_THUMBNAIL_DIR_SECURE_DEFAULT_REL_TO_APP = 'fileadmin/protected/qfqThumbnail'; - const SYSTEM_THUMBNAIL_DIR_PUBLIC_DEFAULT_REL_TO_APP = 'typo3temp/qfqThumbnail'; - const THUMBNAIL_UNKNOWN_TYPE_REL_TO_APP = 'typo3/sysext/frontend/Resources/Public/Icons/FileIcons/'; + const APP_TO_SYSTEM_THUMBNAIL_DIR_SECURE_DEFAULT = 'fileadmin/protected/qfqThumbnail'; + const APP_TO_SYSTEM_THUMBNAIL_DIR_PUBLIC_DEFAULT = 'typo3temp/qfqThumbnail'; + const APP_TO_THUMBNAIL_UNKNOWN_TYPE = 'typo3/sysext/frontend/Resources/Public/Icons/FileIcons/'; // Annotate - const DIR_HIGHLIGHT_JSON_REL_TO_APP = 'typo3conf/ext/qfq/Resources/Public/Json'; + const EXT_TO_HIGHLIGHT_JSON_DIR = 'Resources/Public/Json'; - public static function setAppRelToCwd(string $newPath) + // Twig + const EXT_TO_TWIG_TEMPLATES = 'Resources/Public/twig_templates'; + + public static function setCwdToApp(string $newPath) { - self::$appRelToCwd = $newPath; + self::$cwdToApp = $newPath; } - /** - * Return path relative to CWD - * - * @param string $pathRelToExt - * @return string - */ - public static function extRelToCwd(string $pathRelToExt = ''): string + public static function cwdToExt(string $pathRelToExt = ''): string { - return self::join(self::appRelToCwd(self::EXT_REL_TO_APP), $pathRelToExt); + return self::join(self::cwdToApp(self::APP_TO_EXT), $pathRelToExt); } - public static function apiRelToExt(string $pathRelToApi = ''): string + public static function extToApi(string $pathRelToApi = ''): string { - return self::join(self::API_REL_TO_EXT, $pathRelToApi); + return self::join(self::EXT_TO_API, $pathRelToApi); } - public static function apiRelToCwd(string $pathRelToApi = ''): string + public static function cwdToApi(string $pathRelToApi = ''): string { - return self::extRelToCwd(self::apiRelToExt($pathRelToApi)); + return self::cwdToExt(self::extToApi($pathRelToApi)); } - public static function appRelToCwd(string $pathRelToExt = ''): string + public static function cwdToApp(string $pathRelToExt = ''): string { - return self::join(self::$appRelToCwd, $pathRelToExt); + return self::join(self::$cwdToApp, $pathRelToExt); } public static function join(/* path parts */): string @@ -127,36 +125,4 @@ class Path // remove multiple occurances of '/' return preg_replace('/\/{2,}/','/', $path); } - - /* - public static function appRelToCwd(string $path): string - { - if (empty($path) || $path === './') { - // TODO: return path to ext - } - - // TODO: get path from global or constant - // TODO: join path - } - - public static function urlPathRelToExt(string $path = ''): string - { - return self::pathRelToExt($path, true); - } - - public static function filePathRelToExt(string $path = ''): string - { - return self::pathRelToExt($path, false); - } - - public static function urlPathRelToApp(string $path = ''): string - { - return self::pathRelToApp($path, true); - } - - public static function filePathRelToApp(string $path = ''): string - { - return self::pathRelToApp($path, false); - } - */ } \ No newline at end of file diff --git a/extension/Classes/Core/Helper/Support.php b/extension/Classes/Core/Helper/Support.php index ab338003a..d987d2bcc 100644 --- a/extension/Classes/Core/Helper/Support.php +++ b/extension/Classes/Core/Helper/Support.php @@ -123,7 +123,7 @@ class Support { throw new \CodeException('Unknown mode: ' . $formLogMode, ERROR_UNKNOWN_TOKEN); } - $filename = Path::appRelToCwd(Path::SYSTEM_LOG_REL_TO_APP) . '/' . $formName . "." . $perBeSession . "log"; + $filename = Path::cwdToApp(Path::APP_TO_SYSTEM_LOG) . '/' . $formName . "." . $perBeSession . "log"; return sanitize::safeFilename($filename, false, true); } @@ -236,7 +236,7 @@ class Support { */ public static function doTooltip($htmlId, $tooltipText) { - return "<img " . self::doAttribute('id', $htmlId) . " src='" . Path::extRelToCwd(Path::GFX_INFO_REL_TO_EXT) . "' title=\"" . htmlentities($tooltipText) . "\">"; + return "<img " . self::doAttribute('id', $htmlId) . " src='" . Path::cwdToExt(Path::EXT_TO_GFX_INFO) . "' title=\"" . htmlentities($tooltipText) . "\">"; } /** diff --git a/extension/Classes/Core/QuickFormQuery.php b/extension/Classes/Core/QuickFormQuery.php index 3cf4257e1..5a78f3c8a 100644 --- a/extension/Classes/Core/QuickFormQuery.php +++ b/extension/Classes/Core/QuickFormQuery.php @@ -1779,7 +1779,7 @@ class QuickFormQuery { $form = join(' ', [$headerBar, $codeBox]); $sipObj = new Sip; - $action = $sipObj->queryStringToSip(Path::apiRelToCwd(API_SAVE_PHP) . "?uid=$uid&" . REPORT_SAVE . "=1"); + $action = $sipObj->queryStringToSip(Path::cwdToApi(API_SAVE_PHP) . "?uid=$uid&" . REPORT_SAVE . "=1"); $formAttributes = Support::doAttribute('id', "tt-content-edit-$uid") . Support::doAttribute('class', 'hidden') . Support::doAttribute('method', 'post') . @@ -2085,6 +2085,8 @@ class QuickFormQuery { */ private function getModalCode() { + $iconGearRelToCwd = Path::cwdToExt('Resources/Public/icons/gear.svg'); + $code = <<<EOF <!-- Modal --> <div class="modal fade" id="qfqModal101" tabindex="-1" role="dialog" aria-labelledby="myModalLabel"> @@ -2095,7 +2097,7 @@ class QuickFormQuery { <h4 class="modal-title" id="qfqModalTitle101">Loading Document</h4> </div> <div class="modal-body" style="text-align: center;"> - <img class="qfq-icon-gear glyphicon-spin" src="typo3conf/ext/qfq/Resources/Public/icons/gear.svg"> + <img class="qfq-icon-gear glyphicon-spin" src="$iconGearRelToCwd"> <p id="qfqModalText101">Document is being generated. Please wait.</p> </div> <div class="modal-footer"> diff --git a/extension/Classes/Core/Report/Link.php b/extension/Classes/Core/Report/Link.php index 100c3fa96..0cb82e80c 100644 --- a/extension/Classes/Core/Report/Link.php +++ b/extension/Classes/Core/Report/Link.php @@ -1591,7 +1591,7 @@ EOF; onclick="$('#qfqModalTitle101').text($(this).data('title')); $('#qfqModalText101').text($(this).data('text'));" EOF; - $vars[NAME_URL] = Path::apiRelToCwd(API_DOWNLOAD_PHP); + $vars[NAME_URL] = Path::cwdToApi(API_DOWNLOAD_PHP); $vars[NAME_LINK_CLASS_DEFAULT] = NO_CLASS; $vars[NAME_EXTRA_CONTENT_WRAP] = '<span ' . $attributes . $onClick . '>'; @@ -1653,7 +1653,7 @@ EOF; $vars[NAME_TOOL_TIP] .= PHP_EOL . PHP_EOL . $this->sip->debugSip($paramArray); } - $source = json_encode(['uri' => Path::apiRelToCwd(API_DOWNLOAD_PHP) . '?s=' . $paramArray[SIP_SIP]]); + $source = json_encode(['uri' => Path::cwdToApi(API_DOWNLOAD_PHP) . '?s=' . $paramArray[SIP_SIP]]); } else { throw new \UserReportException("Missing content for 'copy to clipboard'", ERROR_MISSING_CONTENT); } @@ -1705,7 +1705,7 @@ EOF; $vars[NAME_ALT_TEXT] = "Bullet " . $value; } - $vars[NAME_IMAGE] = Path::extRelToCwd(Path::PATH_ICONS_REL_TO_EXT) . "/bullet-" . $value . '.gif'; + $vars[NAME_IMAGE] = Path::cwdToExt(Path::EXT_TO_PATH_ICONS) . "/bullet-" . $value . '.gif'; $vars[NAME_IMAGE_TITLE] = $value; $vars[NAME_LINK_CLASS_DEFAULT] = NO_CLASS; @@ -1730,7 +1730,7 @@ EOF; $vars[NAME_ALT_TEXT] = "Checked " . $value; } - $vars[NAME_IMAGE] = Path::extRelToCwd(Path::PATH_ICONS_REL_TO_EXT) . "/checked-" . $value . '.gif'; + $vars[NAME_IMAGE] = Path::cwdToExt(Path::EXT_TO_PATH_ICONS) . "/checked-" . $value . '.gif'; $vars[NAME_IMAGE_TITLE] = $value; $vars[NAME_LINK_CLASS_DEFAULT] = NO_CLASS; @@ -1774,7 +1774,7 @@ EOF; } if ($vars[NAME_URL] == '') { - $vars[NAME_URL] = Path::apiRelToCwd(API_DELETE_PHP); + $vars[NAME_URL] = Path::cwdToApi(API_DELETE_PHP); } if (!isset($vars[NAME_LINK_CLASS])) { diff --git a/extension/Classes/Core/Report/Monitor.php b/extension/Classes/Core/Report/Monitor.php index f011cb1d5..4d666020e 100644 --- a/extension/Classes/Core/Report/Monitor.php +++ b/extension/Classes/Core/Report/Monitor.php @@ -74,18 +74,20 @@ class Monitor { '&' . TOKEN_L_TAIL . '=' . $vars[TOKEN_L_TAIL] . '&' . TOKEN_L_APPEND . '=' . $vars[TOKEN_L_APPEND]; // $url = store::getSipInstance()->queryStringToSip(API_DIR . '/' . API_DOWNLOAD_PHP . '?' . $queryString, RETURN_URL); - $arr = store::getSipInstance()->queryStringToSip('../../../'. Path::apiRelToExt(API_DOWNLOAD_PHP) . '?' . $queryString, RETURN_ARRAY); + $arr = store::getSipInstance()->queryStringToSip('../../../'. Path::extToApi(API_DOWNLOAD_PHP) . '?' . $queryString, RETURN_ARRAY); $url = $arr[SIP_SIP_URL]; // On page reload, take care to remove optional existing old seek position. $key = $this->getSeekSessionKey($arr[CLIENT_SIP]); $this->session::unsetItem($key); + $webworker = Path::cwdToExt('Resources/Public/JavaScript/GetFileContent.js'); + $code = <<<EOF <script type="text/javascript"> $(document).ready(function () { var getFile = new QfqNS.DisplayFile({ - webworker: "typo3conf/ext/qfq/Resources/Public/JavaScript/GetFileContent.js", + webworker: $webworker, filePath: "$url", interval: $interval, targetId: "$htmlId", diff --git a/extension/Classes/Core/Report/Report.php b/extension/Classes/Core/Report/Report.php index 20f29a9af..49d05d7cf 100644 --- a/extension/Classes/Core/Report/Report.php +++ b/extension/Classes/Core/Report/Report.php @@ -29,6 +29,7 @@ use IMATHUZH\Qfq\Core\Form\FormAsFile; use IMATHUZH\Qfq\Core\Helper\HelperFile; use IMATHUZH\Qfq\Core\Helper\KeyValueStringParser; use IMATHUZH\Qfq\Core\Helper\OnString; +use IMATHUZH\Qfq\Core\Helper\Path; use IMATHUZH\Qfq\Core\Helper\Sanitize; use IMATHUZH\Qfq\Core\Helper\Support; use IMATHUZH\Qfq\Core\Store\Sip; @@ -767,7 +768,7 @@ class Report { $tmpl_start = substr($twig_template, 0, 5); if ($tmpl_start == "file:") { - $loader = new \Twig\Loader\FilesystemLoader([".", "typo3conf/ext/qfq/Resources/Public/twig_templates"]); + $loader = new \Twig\Loader\FilesystemLoader([".", Path::cwdToExt(Path::EXT_TO_TWIG_TEMPLATES)]); $twig_template = substr($twig_template, 5); } else { $loader = new \Twig\Loader\ArrayLoader(array( diff --git a/extension/Classes/Core/Report/ReportAsFile.php b/extension/Classes/Core/Report/ReportAsFile.php index 920ef1e80..5127434d4 100644 --- a/extension/Classes/Core/Report/ReportAsFile.php +++ b/extension/Classes/Core/Report/ReportAsFile.php @@ -173,8 +173,8 @@ class ReportAsFile */ private static function reportPath(): string { - $qfqProjectDirRelToCwd = Path::appRelToCwd(Store::getInstance()->getVar(SYSTEM_QFQ_PROJECT_DIR_SECURE_REL_TO_APP, STORE_SYSTEM)); - $reportPath = Path::join($qfqProjectDirRelToCwd, Path::REPORT_REL_TO_PROJECT_DIR); + $qfqProjectDirRelToCwd = Path::cwdToApp(Store::getInstance()->getVar(SYSTEM_QFQ_PROJECT_DIR_SECURE_REL_TO_APP, STORE_SYSTEM)); + $reportPath = Path::join($qfqProjectDirRelToCwd, Path::PROJECT_DIR_TO_REPORT); HelperFile::createPathRecursive($reportPath); return $reportPath; } diff --git a/extension/Classes/Core/Report/Thumbnail.php b/extension/Classes/Core/Report/Thumbnail.php index 6d672a73b..60fadbb7f 100644 --- a/extension/Classes/Core/Report/Thumbnail.php +++ b/extension/Classes/Core/Report/Thumbnail.php @@ -49,8 +49,8 @@ class Thumbnail { $this->inkscape = $this->store->getVar(SYSTEM_CMD_INKSCAPE, STORE_SYSTEM); $this->convert = $this->store->getVar(SYSTEM_CMD_CONVERT, STORE_SYSTEM); - $this->thumbnailDirSecureRelToCwd = Path::appRelToCwd($this->store->getVar(SYSTEM_THUMBNAIL_DIR_SECURE_REL_TO_APP, STORE_SYSTEM)); - $this->thumbnailDirPublicRelToCwd = Path::appRelToCwd($this->store->getVar(SYSTEM_THUMBNAIL_DIR_PUBLIC_REL_TO_APP, STORE_SYSTEM)); + $this->thumbnailDirSecureRelToCwd = Path::cwdToApp($this->store->getVar(SYSTEM_THUMBNAIL_DIR_SECURE_REL_TO_APP, STORE_SYSTEM)); + $this->thumbnailDirPublicRelToCwd = Path::cwdToApp($this->store->getVar(SYSTEM_THUMBNAIL_DIR_PUBLIC_REL_TO_APP, STORE_SYSTEM)); } /** @@ -221,7 +221,7 @@ class Thumbnail { break; default: - $placeholder = Support::joinPath(Path::appRelToCwd(Path::THUMBNAIL_UNKNOWN_TYPE_REL_TO_APP), $ext . '.gif'); + $placeholder = Support::joinPath(Path::cwdToApp(Path::APP_TO_THUMBNAIL_UNKNOWN_TYPE), $ext . '.gif'); if (is_readable($placeholder)) { return $placeholder; } @@ -289,7 +289,7 @@ class Thumbnail { */ private function buildSecureDownloadLink($pathFilenameThumbnail, $str) { - $urlParam = Path::apiRelToCwd(API_DOWNLOAD_PHP) . '?' . DOWNLOAD_MODE . '=' . DOWNLOAD_MODE_THUMBNAIL; + $urlParam = Path::cwdToApi(API_DOWNLOAD_PHP) . '?' . DOWNLOAD_MODE . '=' . DOWNLOAD_MODE_THUMBNAIL; $urlParam .= '&' . SIP_DOWNLOAD_PARAMETER . '=' . base64_encode(TOKEN_FILE . ':' . $pathFilenameThumbnail . '|' . $str); $sip = $this->store->getSipInstance(); diff --git a/extension/Classes/Core/Store/Config.php b/extension/Classes/Core/Store/Config.php index 09aec6e50..ce3da7d12 100644 --- a/extension/Classes/Core/Store/Config.php +++ b/extension/Classes/Core/Store/Config.php @@ -267,7 +267,7 @@ class Config { } Logger::logMessage(Logger::linePre() . 'Security: attack detected' . PHP_EOL . $reason, - $config[SYSTEM_QFQ_LOG_ABSOLUTE] ?? Path::appRelToCwd(Path::SYSTEM_QFQ_LOG_FILE_REL_TO_APP)); + $config[SYSTEM_QFQ_LOG_ABSOLUTE] ?? Path::cwdToApp(Path::APP_TO_SYSTEM_QFQ_LOG_FILE)); // In case of an attack: log out the current user. Session::destroy(); @@ -315,9 +315,9 @@ class Config { SYSTEM_RENDER => SYSTEM_RENDER_SINGLE, SYSTEM_DATE_FORMAT => 'yyyy-mm-dd', SYSTEM_SHOW_DEBUG_INFO => SYSTEM_SHOW_DEBUG_INFO_AUTO, - SYSTEM_MAIL_LOG_ABSOLUTE => Path::SYSTEM_MAIL_LOG_FILE_REL_TO_APP, // Will be made absolute automatically by Store->adjustConfig() - SYSTEM_QFQ_LOG_ABSOLUTE => Path::SYSTEM_QFQ_LOG_FILE_REL_TO_APP, // Will be made absolute automatically by Store->adjustConfig() - SYSTEM_SQL_LOG_ABSOLUTE => Path::SYSTEM_SQL_LOG_FILE_REL_TO_APP, // Will be made absolute automatically by Store->adjustConfig() + SYSTEM_MAIL_LOG_ABSOLUTE => Path::APP_TO_SYSTEM_MAIL_LOG_FILE, // Will be made absolute automatically by Store->adjustConfig() + SYSTEM_QFQ_LOG_ABSOLUTE => Path::APP_TO_SYSTEM_QFQ_LOG_FILE, // Will be made absolute automatically by Store->adjustConfig() + SYSTEM_SQL_LOG_ABSOLUTE => Path::APP_TO_SYSTEM_SQL_LOG_FILE, // Will be made absolute automatically by Store->adjustConfig() SYSTEM_SQL_LOG_MODE => 'modify', SYSTEM_SQL_LOG_MODE_AUTOCRON => 'error', F_BS_COLUMNS => 'col-md-12 col-lg-10', @@ -379,8 +379,8 @@ class Config { SYSTEM_CMD_GS => 'gs', SYSTEM_CMD_PDFUNITE => 'pdfunite', - SYSTEM_THUMBNAIL_DIR_SECURE_REL_TO_APP => Path::SYSTEM_THUMBNAIL_DIR_SECURE_DEFAULT_REL_TO_APP, - SYSTEM_THUMBNAIL_DIR_PUBLIC_REL_TO_APP => Path::SYSTEM_THUMBNAIL_DIR_PUBLIC_DEFAULT_REL_TO_APP, + SYSTEM_THUMBNAIL_DIR_SECURE_REL_TO_APP => Path::APP_TO_SYSTEM_THUMBNAIL_DIR_SECURE_DEFAULT, + SYSTEM_THUMBNAIL_DIR_PUBLIC_REL_TO_APP => Path::APP_TO_SYSTEM_THUMBNAIL_DIR_PUBLIC_DEFAULT, F_FE_DATA_REQUIRED_ERROR => F_FE_DATA_REQUIRED_ERROR_DEFAULT, F_FE_DATA_MATCH_ERROR => F_FE_DATA_MATCH_ERROR_DEFAULT, diff --git a/extension/Classes/Core/Store/Store.php b/extension/Classes/Core/Store/Store.php index 975b3648d..e9b3b8de2 100644 --- a/extension/Classes/Core/Store/Store.php +++ b/extension/Classes/Core/Store/Store.php @@ -13,6 +13,7 @@ use IMATHUZH\Qfq\Core\Helper\HelperFile; use IMATHUZH\Qfq\Core\Helper\KeyValueStringParser; use IMATHUZH\Qfq\Core\Helper\Logger; use IMATHUZH\Qfq\Core\Helper\OnArray; +use IMATHUZH\Qfq\Core\Helper\Path; use IMATHUZH\Qfq\Core\Helper\Sanitize; use IMATHUZH\Qfq\Core\Helper\Support; @@ -277,7 +278,7 @@ class Store { } } - Logger::setSystemSitePath($config[SYSTEM_SITE_PATH_ABSOLUTE]); + Logger::setSystemSitePathAbsolute($config[SYSTEM_SITE_PATH_ABSOLUTE]); return $config; } diff --git a/extension/Classes/Api/index.php b/extension/NoT3Page/index.php similarity index 94% rename from extension/Classes/Api/index.php rename to extension/NoT3Page/index.php index 0086d3907..59db30b2e 100644 --- a/extension/Classes/Api/index.php +++ b/extension/NoT3Page/index.php @@ -4,39 +4,35 @@ // TEST FILE TO RUN QFQ REPORT WITHOUT TYPO3 // /////////////////////////////////////////////// -require_once(__DIR__ . '/../../vendor/autoload.php'); +require_once(__DIR__ . '/../vendor/autoload.php'); use http\Exception; use IMATHUZH\Qfq\Core\Helper\Path; use IMATHUZH\Qfq\Core\QuickFormQuery; -// TODO: use Path:: for paths that are defined in config -// TODO: replace all paths with typo3conf/ and /../ and fileadmin/ with correct path computing function. -// TODO: replace HelperFile::correctRelativePathFileName() everywhere with the corresponding path function. +// TODO: replace all paths with typo3conf/ (usw.) and /../ and fileadmin/ with correct path computing function. +// TODO: set setAppRelToCwd() in every api file. // TODO: replace Logger::makePathAbsolute() -// TODO: rename extRelToCwd() to extRelToApp() ?? or extRelToIndex() ?? extRelToUrl ?? // TODO: Compare Support::joinPath with Path::join // TODO: Read code in Core/Typo3 // TODO: comment out autoloader in T3Handler::t3AutoloadIfNotRunning() and test if this file still runs without exception. // TODO: create filePathToQfqConfig() and replace config references with this -// TODO: $_COOKIE, $_SERVER und POST GET alles ausgeben. alle php globalen ausgeben. schauen wo was drin ist. // TODO: AS _pagee macht link auf .../index.php . entweder datei umbenennen oder link klasse aendern // TODO: add HTML header and body tags to echo // TODO: Check if there are other javascript files which have to be included in qfq/Resources/Public/JavaScript -// TODO: BuildFormBootstrap.php Zeile 666 ff. : API pfad automatisch anpassen -// TODO: Link.php 1776: API pfad automatisch anpassen // TODO: Monitor.php 77: Wird path. I don't know relativ to what it should be -// TODO: In QFQ Config one can define "CSS class QFQ container", it says that this should be set to "container" if QFQ element is not yet in Bootstrap container. Why? Seems to work without it +// TODO: ?CR/BB: In QFQ Config one can define "CSS class QFQ container", it says that this should be set to "container" if QFQ element is not yet in Bootstrap container. Why? Seems to work without it // TODO: (?) move computation of SYSTEM_EXT_PATH_ABSOLUTE and SYSTEM_SITE_PATH_ABSOLUTE into Path.php. Currently Sotre->doSystemPath // TODO: (?) replace all log path computations: SYSTEM_QFQ_LOG_ABSOLUTE, SYSTEM_SQL_LOG_ABSOLUTE, // TODO: Test if qfq, sql and mail logs still work +// TODO: write docstrings for Path.php // Misc. // TODO: TablesorterController.js: pass API url as data attribute instead of hardcode (this.tablesorterApiUrl = 'typo3conf/ext/qfq/Classes/Api/setting.php';) //// -Path::setAppRelToCwd('../../../../../'); +Path::setCwdToApp('../../../../'); class User { public $user; diff --git a/extension/Tests/Unit/Core/Helper/HelperFileTest.php b/extension/Tests/Unit/Core/Helper/HelperFileTest.php index 305adf2c6..bc12425b1 100644 --- a/extension/Tests/Unit/Core/Helper/HelperFileTest.php +++ b/extension/Tests/Unit/Core/Helper/HelperFileTest.php @@ -33,21 +33,21 @@ class HelperFileTest extends TestCase { $this->assertEquals('', HelperFile::getFileTypeHighlight(FE_HIGHLIGHT_AUTO,'')); - $this->assertEquals(Path::appRelToCwd(Path::DIR_HIGHLIGHT_JSON_REL_TO_APP) . '/javascript.json', HelperFile::getFileTypeHighlight(FE_HIGHLIGHT_JAVASCRIPT,'')); - $this->assertEquals(Path::appRelToCwd(Path::DIR_HIGHLIGHT_JSON_REL_TO_APP) . '/highlight.qfq.json', HelperFile::getFileTypeHighlight(FE_HIGHLIGHT_QFQ,'')); - $this->assertEquals(Path::appRelToCwd(Path::DIR_HIGHLIGHT_JSON_REL_TO_APP) . '/highlight.py.json', HelperFile::getFileTypeHighlight(FE_HIGHLIGHT_PYTHON,'')); - $this->assertEquals(Path::appRelToCwd(Path::DIR_HIGHLIGHT_JSON_REL_TO_APP) . '/highlight.m.json', HelperFile::getFileTypeHighlight(FE_HIGHLIGHT_MATLAB,'')); - - $this->assertEquals(Path::appRelToCwd(Path::DIR_HIGHLIGHT_JSON_REL_TO_APP) . '/javascript.json', HelperFile::getFileTypeHighlight(FE_HIGHLIGHT_JAVASCRIPT,'fileadmin/test.js')); - $this->assertEquals(Path::appRelToCwd(Path::DIR_HIGHLIGHT_JSON_REL_TO_APP) . '/highlight.qfq.json', HelperFile::getFileTypeHighlight(FE_HIGHLIGHT_QFQ, 'fileadmin/test.js')); - $this->assertEquals(Path::appRelToCwd(Path::DIR_HIGHLIGHT_JSON_REL_TO_APP) . '/highlight.py.json', HelperFile::getFileTypeHighlight(FE_HIGHLIGHT_PYTHON, 'fileadmin/test.js')); - $this->assertEquals(Path::appRelToCwd(Path::DIR_HIGHLIGHT_JSON_REL_TO_APP) . '/highlight.m.json', HelperFile::getFileTypeHighlight(FE_HIGHLIGHT_MATLAB, 'fileadmin/test.js')); - - $this->assertEquals(Path::appRelToCwd(Path::DIR_HIGHLIGHT_JSON_REL_TO_APP) . '/javascript.json', HelperFile::getFileTypeHighlight(FE_HIGHLIGHT_AUTO, 'fileadmin/test.js')); - $this->assertEquals(Path::appRelToCwd(Path::DIR_HIGHLIGHT_JSON_REL_TO_APP) . '/highlight.php.json', HelperFile::getFileTypeHighlight(FE_HIGHLIGHT_AUTO, 'fileadmin/test.php')); - $this->assertEquals(Path::appRelToCwd(Path::DIR_HIGHLIGHT_JSON_REL_TO_APP) . '/highlight.qfq.json', HelperFile::getFileTypeHighlight(FE_HIGHLIGHT_AUTO, 'fileadmin/test.qfq')); - $this->assertEquals(Path::appRelToCwd(Path::DIR_HIGHLIGHT_JSON_REL_TO_APP) . '/highlight.py.json', HelperFile::getFileTypeHighlight(FE_HIGHLIGHT_AUTO, 'fileadmin/test.py')); - $this->assertEquals(Path::appRelToCwd(Path::DIR_HIGHLIGHT_JSON_REL_TO_APP) . '/highlight.m.json', HelperFile::getFileTypeHighlight(FE_HIGHLIGHT_AUTO, 'fileadmin/test.m')); + $this->assertEquals(Path::cwdToExt(Path::EXT_TO_HIGHLIGHT_JSON_DIR) . '/javascript.json', HelperFile::getFileTypeHighlight(FE_HIGHLIGHT_JAVASCRIPT,'')); + $this->assertEquals(Path::cwdToExt(Path::EXT_TO_HIGHLIGHT_JSON_DIR) . '/highlight.qfq.json', HelperFile::getFileTypeHighlight(FE_HIGHLIGHT_QFQ,'')); + $this->assertEquals(Path::cwdToExt(Path::EXT_TO_HIGHLIGHT_JSON_DIR) . '/highlight.py.json', HelperFile::getFileTypeHighlight(FE_HIGHLIGHT_PYTHON,'')); + $this->assertEquals(Path::cwdToExt(Path::EXT_TO_HIGHLIGHT_JSON_DIR) . '/highlight.m.json', HelperFile::getFileTypeHighlight(FE_HIGHLIGHT_MATLAB,'')); + + $this->assertEquals(Path::cwdToExt(Path::EXT_TO_HIGHLIGHT_JSON_DIR) . '/javascript.json', HelperFile::getFileTypeHighlight(FE_HIGHLIGHT_JAVASCRIPT,'fileadmin/test.js')); + $this->assertEquals(Path::cwdToExt(Path::EXT_TO_HIGHLIGHT_JSON_DIR) . '/highlight.qfq.json', HelperFile::getFileTypeHighlight(FE_HIGHLIGHT_QFQ, 'fileadmin/test.js')); + $this->assertEquals(Path::cwdToExt(Path::EXT_TO_HIGHLIGHT_JSON_DIR) . '/highlight.py.json', HelperFile::getFileTypeHighlight(FE_HIGHLIGHT_PYTHON, 'fileadmin/test.js')); + $this->assertEquals(Path::cwdToExt(Path::EXT_TO_HIGHLIGHT_JSON_DIR) . '/highlight.m.json', HelperFile::getFileTypeHighlight(FE_HIGHLIGHT_MATLAB, 'fileadmin/test.js')); + + $this->assertEquals(Path::cwdToExt(Path::EXT_TO_HIGHLIGHT_JSON_DIR) . '/javascript.json', HelperFile::getFileTypeHighlight(FE_HIGHLIGHT_AUTO, 'fileadmin/test.js')); + $this->assertEquals(Path::cwdToExt(Path::EXT_TO_HIGHLIGHT_JSON_DIR) . '/highlight.php.json', HelperFile::getFileTypeHighlight(FE_HIGHLIGHT_AUTO, 'fileadmin/test.php')); + $this->assertEquals(Path::cwdToExt(Path::EXT_TO_HIGHLIGHT_JSON_DIR) . '/highlight.qfq.json', HelperFile::getFileTypeHighlight(FE_HIGHLIGHT_AUTO, 'fileadmin/test.qfq')); + $this->assertEquals(Path::cwdToExt(Path::EXT_TO_HIGHLIGHT_JSON_DIR) . '/highlight.py.json', HelperFile::getFileTypeHighlight(FE_HIGHLIGHT_AUTO, 'fileadmin/test.py')); + $this->assertEquals(Path::cwdToExt(Path::EXT_TO_HIGHLIGHT_JSON_DIR) . '/highlight.m.json', HelperFile::getFileTypeHighlight(FE_HIGHLIGHT_AUTO, 'fileadmin/test.m')); } public function testJoinPathFilename() { diff --git a/extension/Tests/Unit/Core/Report/ReportTest.php b/extension/Tests/Unit/Core/Report/ReportTest.php index 389d63185..9d57d1cb2 100644 --- a/extension/Tests/Unit/Core/Report/ReportTest.php +++ b/extension/Tests/Unit/Core/Report/ReportTest.php @@ -932,7 +932,7 @@ EOF; // _paged: incl. alert $result = $this->report->process("10.sql = SELECT 'U:table=Person&r=123' AS _paged FROM Person ORDER BY id LIMIT 1"); - $this->assertEquals('<a href="' . Path::apiRelToCwd(API_DELETE_PHP) . '?s=badcaffee1234" class="btn btn-default" title="Delete" ' . $js . ' ><span class="glyphicon glyphicon-trash" ></span></a>', $result); + $this->assertEquals('<a href="' . Path::cwdToApi(API_DELETE_PHP) . '?s=badcaffee1234" class="btn btn-default" title="Delete" ' . $js . ' ><span class="glyphicon glyphicon-trash" ></span></a>', $result); // Check das via '_paged' SIP_MODE_ANSWER and SIP_TARGET_URL has been set. $result = Session::get('badcaffee1234'); @@ -940,7 +940,7 @@ EOF; // _paged: incl. alert $result = $this->report->process("10.sql = SELECT 'U:form=Person&r=123' AS _paged FROM Person ORDER BY id LIMIT 1"); - $this->assertEquals('<a href="' . Path::apiRelToCwd(API_DELETE_PHP) . '?s=badcaffee1234" class="btn btn-default" title="Delete" ' . $js . ' ><span class="glyphicon glyphicon-trash" ></span></a>', $result); + $this->assertEquals('<a href="' . Path::cwdToApi(API_DELETE_PHP) . '?s=badcaffee1234" class="btn btn-default" title="Delete" ' . $js . ' ><span class="glyphicon glyphicon-trash" ></span></a>', $result); // _paged: other than defaults for the alert. $js = str_replace('Do you really want to delete the record?', 'Move to trash?', $js); @@ -951,11 +951,11 @@ EOF; $js = str_replace('modal: true', 'modal: false', $js); $js = str_replace("type: 'warning'", "type: 'success'", $js); $result = $this->report->process("10.sql = SELECT 'U:table=Person&r=123|q:Move to trash?:success:yes:no:10:0' AS _paged FROM Person ORDER BY id LIMIT 1"); - $this->assertEquals('<a href="' . Path::apiRelToCwd(API_DELETE_PHP) . '?s=badcaffee1234" class="btn btn-default" title="Delete" ' . $js . ' ><span class="glyphicon glyphicon-trash" ></span></a>', $result); + $this->assertEquals('<a href="' . Path::cwdToApi(API_DELETE_PHP) . '?s=badcaffee1234" class="btn btn-default" title="Delete" ' . $js . ' ><span class="glyphicon glyphicon-trash" ></span></a>', $result); $result = $this->report->process("10.sql = SELECT 'U:table=Person&r=123|q:Move to trash?:success:yes:no:10:0|t:click me' AS _paged FROM Person ORDER BY id LIMIT 1"); - $this->assertEquals('<a href="' . Path::apiRelToCwd(API_DELETE_PHP) . '?s=badcaffee1234" class="btn btn-default" title="Delete" ' . $js . ' ><span class="glyphicon glyphicon-trash" ></span> click me</a>', $result); + $this->assertEquals('<a href="' . Path::cwdToApi(API_DELETE_PHP) . '?s=badcaffee1234" class="btn btn-default" title="Delete" ' . $js . ' ><span class="glyphicon glyphicon-trash" ></span> click me</a>', $result); } /** @@ -988,7 +988,7 @@ EOF; // _Paged: incl. alert $result = $this->report->process("10.sql = SELECT 'table=Person&r=123' AS _Paged FROM Person ORDER BY id LIMIT 1"); - $this->assertEquals('<a href="' . Path::apiRelToCwd(API_DELETE_PHP) . '?s=badcaffee1234" class="btn btn-default" title="Delete" ' . $js . ' ><span class="glyphicon glyphicon-trash" ></span></a>', $result); + $this->assertEquals('<a href="' . Path::cwdToApi(API_DELETE_PHP) . '?s=badcaffee1234" class="btn btn-default" title="Delete" ' . $js . ' ><span class="glyphicon glyphicon-trash" ></span></a>', $result); // _Paged: other than defaults for the alert. $js = str_replace('Do you really want to delete the record?', 'Move to trash?', $js); @@ -999,11 +999,11 @@ EOF; $js = str_replace('modal: true', 'modal: false', $js); $js = str_replace("type: 'warning'", "type: 'success'", $js); $result = $this->report->process("10.sql = SELECT 'table=Person&r=123|||Move to trash?:success:yes:no:10:0' AS _Paged FROM Person ORDER BY id LIMIT 1"); - $this->assertEquals('<a href="' . Path::apiRelToCwd(API_DELETE_PHP) . '?s=badcaffee1234" class="btn btn-default" title="Delete" ' . $js . ' ><span class="glyphicon glyphicon-trash" ></span></a>', $result); + $this->assertEquals('<a href="' . Path::cwdToApi(API_DELETE_PHP) . '?s=badcaffee1234" class="btn btn-default" title="Delete" ' . $js . ' ><span class="glyphicon glyphicon-trash" ></span></a>', $result); $result = $this->report->process("10.sql = SELECT 'table=Person&r=123|click me||Move to trash?:success:yes:no:10:0' AS _Paged FROM Person ORDER BY id LIMIT 1"); - $this->assertEquals('<a href="' . Path::apiRelToCwd(API_DELETE_PHP) . '?s=badcaffee1234" class="btn btn-default" title="Delete" ' . $js . ' ><span class="glyphicon glyphicon-trash" ></span> click me</a>', $result); + $this->assertEquals('<a href="' . Path::cwdToApi(API_DELETE_PHP) . '?s=badcaffee1234" class="btn btn-default" title="Delete" ' . $js . ' ><span class="glyphicon glyphicon-trash" ></span> click me</a>', $result); // Empty string is ok $result = $this->report->process("10.sql = SELECT '' AS _Paged FROM Person ORDER BY id LIMIT 1"); diff --git a/extension/Tests/Unit/Core/Store/StoreTest.php b/extension/Tests/Unit/Core/Store/StoreTest.php index 3080afe40..ca93c5671 100644 --- a/extension/Tests/Unit/Core/Store/StoreTest.php +++ b/extension/Tests/Unit/Core/Store/StoreTest.php @@ -342,8 +342,8 @@ class StoreTest extends TestCase { SYSTEM_DB_1_NAME => '<DB>', SYSTEM_DOCUMENTATION_QFQ => SYSTEM_DOCUMENTATION_QFQ_URL, SYSTEM_FLAG_PRODUCTION => 'yes', - SYSTEM_THUMBNAIL_DIR_SECURE_REL_TO_APP => Path::SYSTEM_THUMBNAIL_DIR_SECURE_DEFAULT_REL_TO_APP, - SYSTEM_THUMBNAIL_DIR_PUBLIC_REL_TO_APP => Path::SYSTEM_THUMBNAIL_DIR_PUBLIC_DEFAULT_REL_TO_APP, + SYSTEM_THUMBNAIL_DIR_SECURE_REL_TO_APP => Path::APP_TO_SYSTEM_THUMBNAIL_DIR_SECURE_DEFAULT, + SYSTEM_THUMBNAIL_DIR_PUBLIC_REL_TO_APP => Path::APP_TO_SYSTEM_THUMBNAIL_DIR_PUBLIC_DEFAULT, SYSTEM_CMD_INKSCAPE => 'inkscape', SYSTEM_CMD_CONVERT => 'convert', SYSTEM_CMD_WKHTMLTOPDF => '/opt/wkhtmltox/bin/wkhtmltopdf', -- GitLab From e658bbf8111c1b1268540fdb8360279d6bf4d9d5 Mon Sep 17 00:00:00 2001 From: Marc Egger <marc.egger@uzh.ch> Date: Tue, 25 Aug 2020 10:28:56 +0200 Subject: [PATCH 067/195] Refs #11035 change path to CWD when API is called. --- extension/Classes/Api/delete.php | 3 ++- extension/Classes/Api/dirty.php | 2 ++ extension/Classes/Api/download.php | 3 +++ extension/Classes/Api/dragAndDrop.php | 4 +++- extension/Classes/Api/file.php | 4 +++- extension/Classes/Api/load.php | 4 +++- extension/Classes/Api/print.php | 3 +++ extension/Classes/Api/rest.php | 3 +++ extension/Classes/Api/save.php | 3 ++- extension/Classes/Api/setting.php | 2 ++ extension/Classes/Api/typeahead.php | 2 ++ extension/Classes/Core/Helper/Path.php | 1 + extension/Classes/Core/QuickFormQuery.php | 2 +- extension/NoT3Page/index.php | 17 +++++++++++------ 14 files changed, 41 insertions(+), 12 deletions(-) diff --git a/extension/Classes/Api/delete.php b/extension/Classes/Api/delete.php index 937d13023..e18902086 100644 --- a/extension/Classes/Api/delete.php +++ b/extension/Classes/Api/delete.php @@ -10,10 +10,11 @@ namespace IMATHUZH\Qfq\Api; require_once(__DIR__ . '/../../vendor/autoload.php'); +use IMATHUZH\Qfq\Core\Helper\Path; use IMATHUZH\Qfq\Core\QuickFormQuery; use IMATHUZH\Qfq\Core\Store\Store; - +Path::setCwdToApp(Path::API_TO_APP); /** * delete: success diff --git a/extension/Classes/Api/dirty.php b/extension/Classes/Api/dirty.php index cfdf018b4..a8ad5009b 100644 --- a/extension/Classes/Api/dirty.php +++ b/extension/Classes/Api/dirty.php @@ -11,7 +11,9 @@ namespace IMATHUZH\Qfq\Api; require_once(__DIR__ . '/../../vendor/autoload.php'); use IMATHUZH\Qfq\Core\Form\Dirty; +use IMATHUZH\Qfq\Core\Helper\Path; +Path::setCwdToApp(Path::API_TO_APP); /** * Return JSON encoded answer diff --git a/extension/Classes/Api/download.php b/extension/Classes/Api/download.php index d248a51f4..1f732f1c9 100644 --- a/extension/Classes/Api/download.php +++ b/extension/Classes/Api/download.php @@ -12,8 +12,11 @@ namespace IMATHUZH\Qfq\Api; require_once(__DIR__ . '/../../vendor/autoload.php'); +use IMATHUZH\Qfq\Core\Helper\Path; use IMATHUZH\Qfq\Core\Report\Download; +Path::setCwdToApp(Path::API_TO_APP); + set_error_handler("\\IMATHUZH\\Qfq\\Core\\Exception\\ErrorHandler::exception_error_handler"); diff --git a/extension/Classes/Api/dragAndDrop.php b/extension/Classes/Api/dragAndDrop.php index 19ee47099..5702da3d6 100644 --- a/extension/Classes/Api/dragAndDrop.php +++ b/extension/Classes/Api/dragAndDrop.php @@ -10,8 +10,10 @@ namespace IMATHUZH\Qfq\Api; require_once(__DIR__ . '/../../vendor/autoload.php'); +use IMATHUZH\Qfq\Core\Helper\Path; use IMATHUZH\Qfq\Core\QuickFormQuery; - + +Path::setCwdToApp(Path::API_TO_APP); /** * Return JSON encoded answer diff --git a/extension/Classes/Api/file.php b/extension/Classes/Api/file.php index 65b3e9603..72cff5cc2 100644 --- a/extension/Classes/Api/file.php +++ b/extension/Classes/Api/file.php @@ -11,7 +11,9 @@ namespace IMATHUZH\Qfq\Api; require_once(__DIR__ . '/../../vendor/autoload.php'); use IMATHUZH\Qfq\Core\File; - +use IMATHUZH\Qfq\Core\Helper\Path; + +Path::setCwdToApp(Path::API_TO_APP); /** * Process File Upload - immediately when the the user selects a file. diff --git a/extension/Classes/Api/load.php b/extension/Classes/Api/load.php index 4021b6f50..c652e5b53 100644 --- a/extension/Classes/Api/load.php +++ b/extension/Classes/Api/load.php @@ -10,9 +10,11 @@ namespace IMATHUZH\Qfq\Api; require_once(__DIR__ . '/../../vendor/autoload.php'); +use IMATHUZH\Qfq\Core\Helper\Path; use IMATHUZH\Qfq\Core\Store\Store; use IMATHUZH\Qfq\Core\QuickFormQuery; - + +Path::setCwdToApp(Path::API_TO_APP); /** diff --git a/extension/Classes/Api/print.php b/extension/Classes/Api/print.php index 772ecc580..7e705faab 100644 --- a/extension/Classes/Api/print.php +++ b/extension/Classes/Api/print.php @@ -11,8 +11,11 @@ namespace IMATHUZH\Qfq\Api; require_once(__DIR__ . '/../../vendor/autoload.php'); +use IMATHUZH\Qfq\Core\Helper\Path; use IMATHUZH\Qfq\Core\Report\Html2Pdf; +Path::setCwdToApp(Path::API_TO_APP); + /** * Main */ diff --git a/extension/Classes/Api/rest.php b/extension/Classes/Api/rest.php index 38be130bd..3fd76621b 100644 --- a/extension/Classes/Api/rest.php +++ b/extension/Classes/Api/rest.php @@ -10,10 +10,13 @@ namespace IMATHUZH\Qfq\Api; require_once(__DIR__ . '/../../vendor/autoload.php'); +use IMATHUZH\Qfq\Core\Helper\Path; use IMATHUZH\Qfq\Core\QuickFormQuery; use IMATHUZH\Qfq\Core\Helper\OnString; +Path::setCwdToApp(Path::API_TO_APP); + $restId = array(); $restForm = array(); diff --git a/extension/Classes/Api/save.php b/extension/Classes/Api/save.php index a9e16a450..efd618e98 100644 --- a/extension/Classes/Api/save.php +++ b/extension/Classes/Api/save.php @@ -10,11 +10,12 @@ namespace IMATHUZH\Qfq\Api; require_once(__DIR__ . '/../../vendor/autoload.php'); +use IMATHUZH\Qfq\Core\Helper\Path; use IMATHUZH\Qfq\Core\QuickFormQuery; use IMATHUZH\Qfq\Core\Store\Store; use IMATHUZH\Qfq\Core\Helper\Support; - +Path::setCwdToApp(Path::API_TO_APP); /** * Return JSON encoded answer diff --git a/extension/Classes/Api/setting.php b/extension/Classes/Api/setting.php index 2ce7c1775..aceed3017 100644 --- a/extension/Classes/Api/setting.php +++ b/extension/Classes/Api/setting.php @@ -10,8 +10,10 @@ namespace IMATHUZH\Qfq\Api; require_once(__DIR__ . '/../../vendor/autoload.php'); +use IMATHUZH\Qfq\Core\Helper\Path; use IMATHUZH\Qfq\Core\QuickFormQuery; +Path::setCwdToApp(Path::API_TO_APP); /** * Return JSON encoded answer diff --git a/extension/Classes/Api/typeahead.php b/extension/Classes/Api/typeahead.php index 7762af64e..36c5c1bc0 100644 --- a/extension/Classes/Api/typeahead.php +++ b/extension/Classes/Api/typeahead.php @@ -12,7 +12,9 @@ namespace IMATHUZH\Qfq\Api; require_once(__DIR__ . '/../../vendor/autoload.php'); use IMATHUZH\Qfq\Core\Form\TypeAhead; +use IMATHUZH\Qfq\Core\Helper\Path; +Path::setCwdToApp(Path::API_TO_APP); /** * Return JSON encoded answer diff --git a/extension/Classes/Core/Helper/Path.php b/extension/Classes/Core/Helper/Path.php index e34e2b118..336eb4ad4 100644 --- a/extension/Classes/Core/Helper/Path.php +++ b/extension/Classes/Core/Helper/Path.php @@ -50,6 +50,7 @@ class Path // API const EXT_TO_API = 'Classes/Api'; + const API_TO_APP = '../../../../../'; // Icons const EXT_TO_GFX_INFO = 'Resources/Public/icons/note.gif'; diff --git a/extension/Classes/Core/QuickFormQuery.php b/extension/Classes/Core/QuickFormQuery.php index 5a78f3c8a..8edebf893 100644 --- a/extension/Classes/Core/QuickFormQuery.php +++ b/extension/Classes/Core/QuickFormQuery.php @@ -157,7 +157,7 @@ class QuickFormQuery { // Can't use store, since store needs bodytext to be parsed, which might throw exceptions if there is a syntax error. \UserReportException::$report_uid = $t3data[T3DATA_UID]; \UserReportException::$report_bodytext = $t3data[T3DATA_BODYTEXT]; - \UserReportException::$report_header = t3data[T3DATA_HEADER]; + \UserReportException::$report_header = $t3data[T3DATA_HEADER]; \UserReportException::$report_pathFileName = $reportPathFileNameFull; $btp = new BodytextParser(); diff --git a/extension/NoT3Page/index.php b/extension/NoT3Page/index.php index 59db30b2e..002ad9fdc 100644 --- a/extension/NoT3Page/index.php +++ b/extension/NoT3Page/index.php @@ -10,13 +10,9 @@ use http\Exception; use IMATHUZH\Qfq\Core\Helper\Path; use IMATHUZH\Qfq\Core\QuickFormQuery; -// TODO: replace all paths with typo3conf/ (usw.) and /../ and fileadmin/ with correct path computing function. + // TODO: set setAppRelToCwd() in every api file. -// TODO: replace Logger::makePathAbsolute() -// TODO: Compare Support::joinPath with Path::join -// TODO: Read code in Core/Typo3 -// TODO: comment out autoloader in T3Handler::t3AutoloadIfNotRunning() and test if this file still runs without exception. -// TODO: create filePathToQfqConfig() and replace config references with this +// TODO: Replace all calls to T3Handler::... and Store/T3Info.php with abstraction // TODO: AS _pagee macht link auf .../index.php . entweder datei umbenennen oder link klasse aendern // TODO: add HTML header and body tags to echo // TODO: Check if there are other javascript files which have to be included in qfq/Resources/Public/JavaScript @@ -27,6 +23,15 @@ use IMATHUZH\Qfq\Core\QuickFormQuery; // TODO: Test if qfq, sql and mail logs still work // TODO: write docstrings for Path.php +// PATH migration +// TODO: create filePathToQfqConfig() and replace config references with this +// TODO: replace all paths with typo3conf/ (usw.) and /../ and fileadmin/ with correct path computing function. +// TODO: Compare Support::joinPath with Path::join + +// Testing +// TODO: Fix Unittests +// TODO: test if Logger::makePathAbsolute() actually still does what it should (I have changed it) + // Misc. // TODO: TablesorterController.js: pass API url as data attribute instead of hardcode (this.tablesorterApiUrl = 'typo3conf/ext/qfq/Classes/Api/setting.php';) -- GitLab From 426aa27e75c814cbbeb431ec5a4a774a421f9961 Mon Sep 17 00:00:00 2001 From: Marc Egger <marc.egger@uzh.ch> Date: Tue, 25 Aug 2020 17:43:38 +0200 Subject: [PATCH 068/195] Refs #11035 Replace config.qfq.php with qfq.json. find project path by searching for config. --- extension/Classes/Core/Constants.php | 5 +- extension/Classes/Core/Form/FormAsFile.php | 36 +--- extension/Classes/Core/Helper/HelperFile.php | 31 ++++ extension/Classes/Core/Helper/Path.php | 175 +++++++++++++++--- extension/Classes/Core/Helper/Support.php | 2 +- .../Classes/Core/Report/ReportAsFile.php | 9 +- extension/Classes/Core/Store/Config.php | 65 +++++-- extension/NoT3Page/index.php | 1 - extension/ext_conf_template.txt | 3 - 9 files changed, 238 insertions(+), 89 deletions(-) diff --git a/extension/Classes/Core/Constants.php b/extension/Classes/Core/Constants.php index c24335fc2..bd01b19d0 100644 --- a/extension/Classes/Core/Constants.php +++ b/extension/Classes/Core/Constants.php @@ -7,8 +7,9 @@ */ const EXT_KEY = 'qfq'; -const CONFIG_QFQ_INI = "config.qfq.ini"; // QFQ configuration file: db access - deprecated -const CONFIG_QFQ_PHP = "config.qfq.php"; // QFQ configuration file: db access +const CONFIG_QFQ_INI = "config.qfq.ini"; // QFQ configuration file: db access - deprecated +const CONFIG_QFQ_PHP = "config.qfq.php"; // QFQ configuration file: db access - deprecated +const CONFIG_QFQ_JSON = "qfq.json"; // QFQ configuration file: db access + what used to be in LocalConfig.php const CONFIG_T3 = 'LocalConfiguration.php'; // T3 config file const QFQ_TEMP_FILE_PATTERN = 'qfq.split.XXXXX'; diff --git a/extension/Classes/Core/Form/FormAsFile.php b/extension/Classes/Core/Form/FormAsFile.php index c16b5b58d..83cd95f98 100644 --- a/extension/Classes/Core/Form/FormAsFile.php +++ b/extension/Classes/Core/Form/FormAsFile.php @@ -240,13 +240,7 @@ class FormAsFile $form[F_FILE_FORM_ELEMENT] = $formElements; $formJson = json_encode($form, JSON_PRETTY_PRINT); $pathFileName = self::formPathFileName($formName, $database); - $success = file_put_contents($pathFileName, $formJson); - if ($success === false) { - throw new \UserFormException(json_encode([ - ERROR_MESSAGE_TO_USER => "Writing form file failed: " . baseName($pathFileName), - ERROR_MESSAGE_TO_DEVELOPER => "Can't write to file '$pathFileName'"]), - ERROR_IO_WRITE_FILE); - } + HelperFile::file_put_contents($pathFileName, $formJson); // Update column fileStats $fileStats = self::formFileStatsJson($pathFileName); @@ -335,21 +329,7 @@ class FormAsFile public static function enforceFormFileWritable(string $formName, Database $database) // : void { $pathFileName = self::formPathFileName($formName, $database); - if (file_exists($pathFileName)) { - if (!is_writable($pathFileName)) { - throw new \UserFormException(json_encode([ - ERROR_MESSAGE_TO_USER => "Can't write to file: " . baseName($pathFileName), - ERROR_MESSAGE_TO_DEVELOPER => "Can't write to file '$pathFileName'. Check permissions."]), - ERROR_IO_WRITE_FILE); - } - } else { - if (!is_writable(dirname($pathFileName))) { - throw new \UserFormException(json_encode([ - ERROR_MESSAGE_TO_USER => "Can't write to form directory. Check permissions.", - ERROR_MESSAGE_TO_DEVELOPER => "Can't write to directory: " . dirname($pathFileName)]), - ERROR_IO_WRITE_FILE); - } - } + HelperFile::enforce_writable_or_creatable($pathFileName); } @@ -606,27 +586,25 @@ class FormAsFile * @throws \CodeException * @throws \DbException * @throws \UserFormException - * @throws \UserReportException */ private static function formPath(Database $database): string { - $qfqProjectDirRelToCwd = Path::cwdToApp(Store::getInstance()->getVar(SYSTEM_QFQ_PROJECT_DIR_SECURE_REL_TO_APP, STORE_SYSTEM)); - $formPath = Path::join($qfqProjectDirRelToCwd, Path::PROJECT_DIR_TO_FORM); - if (!is_dir($formPath)) { + $cwdToForm = Path::cwdToProject(Path::PROJECT_TO_FORM); + if (!is_dir($cwdToForm)) { // create path - $success = mkdir($formPath, 0777, true); + $success = mkdir($cwdToForm, 0777, true); if ($success === false) { throw new \UserFormException(json_encode([ ERROR_MESSAGE_TO_USER => "Can't create form file path.", - ERROR_MESSAGE_TO_DEVELOPER => "Can't create path: " . $formPath]), + ERROR_MESSAGE_TO_DEVELOPER => "Can't create path: " . $cwdToForm]), ERROR_IO_WRITE_FILE); } // export all forms self::exportAllForms($database); } - return $formPath; + return $cwdToForm; } /** diff --git a/extension/Classes/Core/Helper/HelperFile.php b/extension/Classes/Core/Helper/HelperFile.php index de9129979..e01e089d0 100644 --- a/extension/Classes/Core/Helper/HelperFile.php +++ b/extension/Classes/Core/Helper/HelperFile.php @@ -579,5 +579,36 @@ class HelperFile { ERROR_IO_WRITE_FILE); } } + + /** + * Wrapper for is_writeable which throws exception on failure. + * Throws exception if file does not exist! + * + * @param $path + * @throws \UserFormException + */ + public static function enforce_writable($path) + { + if (!is_writeable($path)) { + throw new \UserFormException(json_encode([ + ERROR_MESSAGE_TO_USER => 'File/directory not found or not writable.', + ERROR_MESSAGE_TO_DEVELOPER => "Can't write to file/directory '$path'"]), ERROR_IO_WRITE_FILE); + } + } + + /** + * Like enforce_writable but does not throw exception if file does not exist and the containing directory is writable. + * + * @param $pathFileName + * @throws \UserFormException + */ + public static function enforce_writable_or_creatable($pathFileName) + { + if (file_exists($pathFileName)) { + self::enforce_writable($pathFileName); + } else { + self::enforce_writable(dirname($pathFileName)); + } + } } diff --git a/extension/Classes/Core/Helper/Path.php b/extension/Classes/Core/Helper/Path.php index 336eb4ad4..1458b17c3 100644 --- a/extension/Classes/Core/Helper/Path.php +++ b/extension/Classes/Core/Helper/Path.php @@ -3,8 +3,21 @@ namespace IMATHUZH\Qfq\Core\Helper; +/* + * Naming convention of path variables: + * + * 1) name a path by its origin and its destination separated by 'to'. E.g. APP_TO_SYSTEM_LOG, $appToProject. + * 2) if the destination is a file, append "File". E.g. APP_TO_SYSTEM_QFQ_LOG_FILE. + * 3) if a path has to be variable, create a setter and getter. E.g. self::setCwdToApp(), self::cwdToApp(), private static $cwdToApp. + * 4) a path getter appends the given arguments to the requested path using self::join(..., func_get_args()). E.g. see cwdToApp(). + * 5) additional path getters may be defined which combine other getters. E.g. see cwdToApi(). + * 6) avoid defining redundant paths in constants. E.g. create cwdToApi() by combining cwdToExt() and extToApi() instead of defining CWD_TO_API. + */ + /* +Unittests: + Path::apiRelToCwd(API_SAVE_PHP) === API_DIR . '/save.php' Path::apiRelToCwd(API_LOAD_PHP) === API_DIR . '/load.php' Path::apiRelToCwd(API_FILE_PHP) . '?' . $actionUpload === API_DIR . '/file.php?' . $actionUpload @@ -35,9 +48,11 @@ Path::join($qfqProjectDirRelToCwd, Path::REPORT_REL_TO_PROJECT_DIR) === "../../. */ +use IMATHUZH\Qfq\Core\Store\Config; + class Path { - // Path from CWD. + // App // This should be manually overwritten (using Path::setCwdToApp()) if the CWD is not the one containing the typo3 index.php. private static $cwdToApp = ''; @@ -45,15 +60,21 @@ class Path const APP_TO_EXT = 'typo3conf/ext/qfq'; // QFQ Project dir - const PROJECT_DIR_TO_FORM = 'form'; + private static $appToProject = null; + const APP_TO_PROJECT_NEW = '../'; + const APP_TO_PROJECT_OLD = 'fileadmin/protected/qfqProject'; + const PROJECT_TO_FORM = 'form'; const PROJECT_DIR_TO_REPORT = 'report'; + // Config + const APP_TO_TYPO3_CONFIG = 'typo3conf'; + // API const EXT_TO_API = 'Classes/Api'; const API_TO_APP = '../../../../../'; // Icons - const EXT_TO_GFX_INFO = 'Resources/Public/icons/note.gif'; + const EXT_TO_GFX_INFO_FILE = 'Resources/Public/icons/note.gif'; const EXT_TO_PATH_ICONS = 'Resources/Public/icons'; // Log files @@ -73,57 +94,151 @@ class Path // Twig const EXT_TO_TWIG_TEMPLATES = 'Resources/Public/twig_templates'; + /** + * @param string $newPath + */ public static function setCwdToApp(string $newPath) { self::$cwdToApp = $newPath; } - public static function cwdToExt(string $pathRelToExt = ''): string + /** + * @return string + * @throws \UserFormException + */ + public static function cwdToApp(/* path parts to append */): string { - return self::join(self::cwdToApp(self::APP_TO_EXT), $pathRelToExt); + return self::join(self::$cwdToApp, func_get_args()); } - public static function extToApi(string $pathRelToApi = ''): string + /** + * @param string $newPath + */ + public static function setAppToProject(string $newPath) { - return self::join(self::EXT_TO_API, $pathRelToApi); + self::$appToProject = $newPath; } - public static function cwdToApi(string $pathRelToApi = ''): string + /** + * @return string + * @throws \CodeException + * @throws \UserFormException + */ + public static function appToProject(/* path parts to append */): string { - return self::cwdToExt(self::extToApi($pathRelToApi)); + if (is_null(self::$appToProject)) { + self::findAndSetProjectPath(); + } + return self::join(self::$appToProject, func_get_args()); } - public static function cwdToApp(string $pathRelToExt = ''): string + /** + * @return string + * @throws \UserFormException + */ + public static function cwdToProject(/* path parts to append */): string { - return self::join(self::$cwdToApp, $pathRelToExt); + return self::cwdToApp(self::appToProject(func_get_args())); } - public static function join(/* path parts */): string + /** + * @return string + * @throws \UserFormException + */ + public static function cwdToExt(/* path parts to append */): string { - // Filter out empty string and null arguments - $parts = array_filter(func_get_args(), function($value) { return !is_null($value) && $value !== ''; }); + return self::cwdToApp(self::APP_TO_EXT, func_get_args()); + } - if (empty($parts)) { - return ''; - } - $firstPart = array_shift($parts); - if (empty($parts)) { - return $firstPart; + /** + * @return string + * @throws \UserFormException + */ + public static function extToApi(/* path parts to append */): string + { + return self::join(self::EXT_TO_API, func_get_args()); + } + + /** + * @return string + * @throws \UserFormException + */ + public static function cwdToApi(/* path parts to append */): string + { + return self::cwdToExt(self::extToApi(func_get_args())); + } + + /** + * Find the project directory by searching for config.qfq.json in the following locations + * 1) above app (app/../) + * 2) in fileadmin (app/fileadmin/protected/qfqProject/) + * 3) in typo3conf (app/typo3conf/) => moves config to fileadmin (see 2) + * 4) not found => set path to app/../ (see 1) + * + * @throws \CodeException + * @throws \UserFormException + */ + public static function findAndSetProjectPath() + { + if (is_readable(Path::cwdToApp(Path::APP_TO_PROJECT_NEW, CONFIG_QFQ_JSON))) { + Path::setAppToProject(Path::APP_TO_PROJECT_NEW); + } elseif (is_readable(Path::cwdToApp(Path::APP_TO_PROJECT_OLD, CONFIG_QFQ_JSON))) { + Path::setAppToProject(Path::APP_TO_PROJECT_OLD); + } elseif (is_readable(Path::cwdToApp(Path::APP_TO_TYPO3_CONFIG, CONFIG_QFQ_PHP))) { + Path::setAppToProject(Path::APP_TO_PROJECT_OLD); + + // read old config.qfq.php + $cwdToOldConfigFile = Path::cwdToApp(Path::APP_TO_TYPO3_CONFIG, CONFIG_QFQ_PHP); + HelperFile::enforce_writable($cwdToOldConfigFile); // so we can delete it. + $config = include($cwdToOldConfigFile); + + // write new qfq.config.json + Config::write_config($config); + + // remove old + HelperFile::unlink($cwdToOldConfigFile); + } else { + Path::setAppToProject(Path::APP_TO_PROJECT_NEW); } + } + + /** + * Join the arguments together as a path. + * The second argument may be an array of parts. (further arguments are ignored in that case) + * + * @return string + * @throws \UserFormException + */ + public static function join(/* path parts to append */): string + { + $parts = func_get_args(); + + // concatenate all parts (arrays are flattened) + $path = ''; + array_walk_recursive($parts, function ($part) use (&$path) { - // Trailing path parts may not be absolute - foreach ($parts as $part) { - if ($part[0] === '/') { - throw new \UserFormException(json_encode([ - ERROR_MESSAGE_TO_USER => 'Failed: Join path.', - ERROR_MESSAGE_TO_DEVELOPER => "Trailing path parts may not start with '/'. Trailing part: '$part'."]), - ERROR_PATH_INVALID); + // Filter out empty string and null arguments + if (is_null($part) || $part === '') { + return; } - } - $path = $firstPart . '/' . implode($parts,'/'); + if ($path === '') { + $path .= $part; + } else { + + // Trailing path parts may not be absolute + if ($part[0] === '/') { + throw new \UserFormException(json_encode([ + ERROR_MESSAGE_TO_USER => 'Failed: Join path.', + ERROR_MESSAGE_TO_DEVELOPER => "Trailing path parts may not start with '/'. Trailing part: '$part'."]), + ERROR_PATH_INVALID); + } + + $path .= '/' . $part; + } + }); - // remove multiple occurances of '/' + // remove multiple occurrences of '/' return preg_replace('/\/{2,}/','/', $path); } } \ No newline at end of file diff --git a/extension/Classes/Core/Helper/Support.php b/extension/Classes/Core/Helper/Support.php index d987d2bcc..9636d402b 100644 --- a/extension/Classes/Core/Helper/Support.php +++ b/extension/Classes/Core/Helper/Support.php @@ -236,7 +236,7 @@ class Support { */ public static function doTooltip($htmlId, $tooltipText) { - return "<img " . self::doAttribute('id', $htmlId) . " src='" . Path::cwdToExt(Path::EXT_TO_GFX_INFO) . "' title=\"" . htmlentities($tooltipText) . "\">"; + return "<img " . self::doAttribute('id', $htmlId) . " src='" . Path::cwdToExt(Path::EXT_TO_GFX_INFO_FILE) . "' title=\"" . htmlentities($tooltipText) . "\">"; } /** diff --git a/extension/Classes/Core/Report/ReportAsFile.php b/extension/Classes/Core/Report/ReportAsFile.php index 5127434d4..58359a8f2 100644 --- a/extension/Classes/Core/Report/ReportAsFile.php +++ b/extension/Classes/Core/Report/ReportAsFile.php @@ -167,15 +167,12 @@ class ReportAsFile * Create path if it doesn't exist. * * @return string - * @throws \CodeException * @throws \UserFormException - * @throws \UserReportException */ private static function reportPath(): string { - $qfqProjectDirRelToCwd = Path::cwdToApp(Store::getInstance()->getVar(SYSTEM_QFQ_PROJECT_DIR_SECURE_REL_TO_APP, STORE_SYSTEM)); - $reportPath = Path::join($qfqProjectDirRelToCwd, Path::PROJECT_DIR_TO_REPORT); - HelperFile::createPathRecursive($reportPath); - return $reportPath; + $cwdToReport = Path::cwdToProject(Path::PROJECT_DIR_TO_REPORT); + HelperFile::createPathRecursive($cwdToReport); + return $cwdToReport; } } \ No newline at end of file diff --git a/extension/Classes/Core/Store/Config.php b/extension/Classes/Core/Store/Config.php index ce3da7d12..020523359 100644 --- a/extension/Classes/Core/Store/Config.php +++ b/extension/Classes/Core/Store/Config.php @@ -8,11 +8,12 @@ namespace IMATHUZH\Qfq\Core\Store; +use IMATHUZH\Qfq\Core\Helper\HelperFile; use IMATHUZH\Qfq\Core\Helper\Logger; use IMATHUZH\Qfq\Core\Helper\Path; use IMATHUZH\Qfq\Core\Helper\Support; use IMATHUZH\Qfq\Core\Helper\OnString; - + /** * Class Config * @package qfq @@ -75,29 +76,59 @@ class Config { return $config; } + /** + * Overwrite the config file with data from given array. + * + * @param array $config + * @throws \UserFormException + */ + public static function write_config(array $config) + { + $cwdToProject = Path::cwdToProject(); + HelperFile::createPathRecursive($cwdToProject); + HelperFile::file_put_contents(Path::join($cwdToProject, CONFIG_QFQ_JSON), json_encode($config, JSON_PRETTY_PRINT)); + } + /** * Read config.qfq.ini. In case * - * @param string $fileConfigPhp + * @param string $fileConfigPhpRelToCwd * @return array * @throws \CodeException * @throws \UserFormException * @throws \UserReportException */ - public static function readConfig($fileConfigPhp = '') { + public static function readConfig($fileConfigPhpRelToCwd = '') { + + /////// DEBUG ///////// + throw new \UserFormException(json_encode([ + ERROR_MESSAGE_TO_USER => json_encode([Path::appToProject(), Path::cwdToProject('hello.php')], JSON_PRETTY_PRINT), + ERROR_MESSAGE_TO_DEVELOPER => json_encode([], JSON_PRETTY_PRINT) + ])); +/////////////////////// + + // TODO: create config if not exists. + // TODO: read config. $configT3qfq = array(); - $configIni = ''; // outdated config file format + $configIniRelToCwd = ''; // outdated config file format + +// // DONT COMMIT: NOT GOOD ENOUGH! +// if (empty($fileConfigPhpRelToCwd) && !isset($GLOBALS['TYPO3_CONF_VARS']['EXT']['extConf'][EXT_KEY])) { +// $configPathRelToCwd = Path::cwdToApp(Path::APP_TO_CONFIG_DIR); +// $configIniRelToCwd = Path::join($configPathRelToCwd, CONFIG_QFQ_INI); +// $fileConfigPhpRelToCwd = Path::join($configPathRelToCwd, CONFIG_QFQ_PHP); +// } // Production Path to CONFIG_INI - $pathTypo3Conf = __DIR__ . '/../../../../..'; - if (!file_exists($pathTypo3Conf . '/' . CONFIG_T3)) { + $configPathRelToCwd = __DIR__ . '/../../../../..'; + if (!file_exists($configPathRelToCwd . '/' . CONFIG_T3)) { // PHPUnit Path to CONFIG_INI - $pathTypo3Conf = __DIR__ . '/../../..'; + $configPathRelToCwd = __DIR__ . '/../../..'; } // In case of missing $configPhp - if (empty($fileConfigPhp)) { + if (empty($fileConfigPhpRelToCwd)) { # Read 'LocalConfiguration.php' if (isset($GLOBALS['TYPO3_CONF_VARS']['EXT']['extConf'][EXT_KEY])) { @@ -105,34 +136,34 @@ class Config { $configT3qfq[SYSTEM_DB_NAME_T3] = self::getDbName($GLOBALS['TYPO3_CONF_VARS']['DB']); } else { - $all = include($pathTypo3Conf . '/' . CONFIG_T3); + $all = include($configPathRelToCwd . '/' . CONFIG_T3); if (empty($all) || $all === true) { - throw new \UserFormException ("Error read file: " . $pathTypo3Conf . '/' . CONFIG_T3, ERROR_IO_READ_FILE); + throw new \UserFormException ("Error read file: " . $configPathRelToCwd . '/' . CONFIG_T3, ERROR_IO_READ_FILE); } $configT3qfq = unserialize($all['EXT']['extConf'][EXT_KEY]); if (!is_array($configT3qfq)) { - throw new \UserFormException ("Error read file: " . $pathTypo3Conf . '/' . CONFIG_T3, ERROR_IO_READ_FILE); + throw new \UserFormException ("Error read file: " . $configPathRelToCwd . '/' . CONFIG_T3, ERROR_IO_READ_FILE); } $configT3qfq[SYSTEM_DB_NAME_T3] = self::getDbName($all['DB']); unset($all); } - $configIni = $pathTypo3Conf . '/' . CONFIG_QFQ_INI; - $fileConfigPhp = $pathTypo3Conf . '/' . CONFIG_QFQ_PHP; + $configIniRelToCwd = $configPathRelToCwd . '/' . CONFIG_QFQ_INI; + $fileConfigPhpRelToCwd = $configPathRelToCwd . '/' . CONFIG_QFQ_PHP; } // Migrate legacy config file. - if (is_readable($configIni) && !is_readable($fileConfigPhp)) { - self::migrateConfigIniToPhp($configIni, $fileConfigPhp); + if (is_readable($configIniRelToCwd) && !is_readable($fileConfigPhpRelToCwd)) { + self::migrateConfigIniToPhp($configIniRelToCwd, $fileConfigPhpRelToCwd); } - $config = include($fileConfigPhp); + $config = include($fileConfigPhpRelToCwd); if ($config === false) { - throw new \UserFormException ("Error read file: " . $fileConfigPhp, ERROR_IO_READ_FILE); + throw new \UserFormException ("Error read file: " . $fileConfigPhpRelToCwd, ERROR_IO_READ_FILE); } // in case $configIni doesn't exist: just skip diff --git a/extension/NoT3Page/index.php b/extension/NoT3Page/index.php index 002ad9fdc..bcc0a1035 100644 --- a/extension/NoT3Page/index.php +++ b/extension/NoT3Page/index.php @@ -113,7 +113,6 @@ $extConf = [ "maxFileSize" => "", "baseUrl" => "", "dateFormat" => "dd.mm.yyyy", - "qfqProjectDir" => "fileadmin/protected/qfqProject", "thumbnailDirSecure" => "fileadmin/protected/qfqThumbnail", "thumbnailDirPublic" => "typo3temp/qfqThumbnail", "cmdInkscape" => "inkscape", diff --git a/extension/ext_conf_template.txt b/extension/ext_conf_template.txt index 26c3c29a1..979b6616d 100644 --- a/extension/ext_conf_template.txt +++ b/extension/ext_conf_template.txt @@ -13,9 +13,6 @@ baseUrl = # cat=config/date; type=string; label=Date format:Default is 'dd.mm.yyyy'. Possible options: 'yyyy-mm-dd', 'dd.mm.yyyy' dateFormat = dd.mm.yyyy -# cat=config/config; type=string; label=QFQ project directory:Default is 'fileadmin/protected/qfqProject'. Important: secure the directory (recursive) against direct access. Forms and reports are saved in this directory. -qfqProjectDir = fileadmin/protected/qfqProject - # cat=config/config; type=string; label=Thumbnail directory 'secure':Default is 'fileadmin/protected/qfqThumbnail'. Important: secure the directory (recursive) against direct access. Will be used by a special columnname '_thumbnail'. thumbnailDirSecure = fileadmin/protected/qfqThumbnail -- GitLab From 4e5cfa1aa1c006f9d8e051d9da6310fc8cfdfdb2 Mon Sep 17 00:00:00 2001 From: Marc Egger <marc.egger@uzh.ch> Date: Wed, 26 Aug 2020 18:59:22 +0200 Subject: [PATCH 069/195] Refs #11035 Config.php: rewrite read_config() --- extension/Classes/Core/Constants.php | 8 ++ extension/Classes/Core/Exception/Thrower.php | 20 +++ extension/Classes/Core/Helper/HelperFile.php | 75 +++++++++++ extension/Classes/Core/Helper/Path.php | 35 ++--- extension/Classes/Core/Store/Config.php | 122 ++++++++---------- extension/Classes/Core/Store/Store.php | 26 ++-- extension/Tests/Unit/Core/Store/StoreTest.php | 54 ++++---- 7 files changed, 212 insertions(+), 128 deletions(-) create mode 100644 extension/Classes/Core/Exception/Thrower.php diff --git a/extension/Classes/Core/Constants.php b/extension/Classes/Core/Constants.php index bd01b19d0..b895bd1d0 100644 --- a/extension/Classes/Core/Constants.php +++ b/extension/Classes/Core/Constants.php @@ -10,6 +10,7 @@ const EXT_KEY = 'qfq'; const CONFIG_QFQ_INI = "config.qfq.ini"; // QFQ configuration file: db access - deprecated const CONFIG_QFQ_PHP = "config.qfq.php"; // QFQ configuration file: db access - deprecated const CONFIG_QFQ_JSON = "qfq.json"; // QFQ configuration file: db access + what used to be in LocalConfig.php +const CONFIG_QFQ_JSON_EXAMPLE = "example.qfq.json"; const CONFIG_T3 = 'LocalConfiguration.php'; // T3 config file const QFQ_TEMP_FILE_PATTERN = 'qfq.split.XXXXX'; @@ -479,6 +480,13 @@ const SYSTEM_DB_1_SERVER = 'DB_1_SERVER'; const SYSTEM_DB_1_PASSWORD = 'DB_1_PASSWORD'; const SYSTEM_DB_1_NAME = 'DB_1_NAME'; +const CONFIG_REQUIRED_TEMPLATE = [ + SYSTEM_DB_1_USER => null, + SYSTEM_DB_1_PASSWORD => null, + SYSTEM_DB_1_SERVER => "localhost", + SYSTEM_DB_1_NAME=> null, +]; + const SYSTEM_DB_INIT = 'init'; const SYSTEM_DB_INDEX_DATA = "indexData"; diff --git a/extension/Classes/Core/Exception/Thrower.php b/extension/Classes/Core/Exception/Thrower.php new file mode 100644 index 000000000..7b18459e7 --- /dev/null +++ b/extension/Classes/Core/Exception/Thrower.php @@ -0,0 +1,20 @@ +<?php + +namespace IMATHUZH\Qfq\Core\Exception; + +class Thrower +{ + /** + * Throws UserFormException with given messages to user and developer. + * + * @param string $errorToUser + * @param string $errorToDeveloper + * @param int $errorCode + * @throws \UserFormException + */ + public static function userFormException(string $errorToUser, string $errorToDeveloper, int $errorCode = E_ERROR) { + throw new \UserFormException(json_encode([ + ERROR_MESSAGE_TO_USER => $errorToUser, + ERROR_MESSAGE_TO_DEVELOPER => $errorToDeveloper]), ERROR_IO_READ_FILE); + } +} \ No newline at end of file diff --git a/extension/Classes/Core/Helper/HelperFile.php b/extension/Classes/Core/Helper/HelperFile.php index e01e089d0..eabc25c6b 100644 --- a/extension/Classes/Core/Helper/HelperFile.php +++ b/extension/Classes/Core/Helper/HelperFile.php @@ -580,6 +580,43 @@ class HelperFile { } } + /** + * Wrapper for file_get_contents which throws exception on failure. + * + * @param string $pathFileName + * @return string + * @throws \UserFormException + */ + public static function file_get_contents(string $pathFileName): string + { + $fileContents = file_get_contents($pathFileName); + if ($fileContents === false) { + throw new \UserFormException(json_encode([ + ERROR_MESSAGE_TO_USER => 'File not readable.', + ERROR_MESSAGE_TO_DEVELOPER => "Can't read file '$pathFileName'"]), ERROR_IO_READ_FILE); + } + return $fileContents; + } + + /** + * Wrapper fo json_decode which throws exception on failure. + * + * @param string $jsonString + * @param bool $associativeArray + * @return array + * @throws \UserFormException + */ + public static function json_decode(string $jsonString, bool $associativeArray = true) + { + $result = json_decode($jsonString, $associativeArray); + if (is_null($result)) { + throw new \UserFormException(json_encode([ + ERROR_MESSAGE_TO_USER => 'Json decode failed.', + ERROR_MESSAGE_TO_DEVELOPER => "JSON: $jsonString"]), ERROR_IO_READ_FILE); + } + return $result; + } + /** * Wrapper for is_writeable which throws exception on failure. * Throws exception if file does not exist! @@ -610,5 +647,43 @@ class HelperFile { self::enforce_writable(dirname($pathFileName)); } } + + /** + * Wrapper for is_readable() but throws exception if file/directory exists but is not readable. + * + * @param $pathFileName + * @return bool + * @throws \UserFormException + */ + public static function isReadableException($pathFileName): bool + { + if (!file_exists($pathFileName)) { + return false; + } + if (!is_readable($pathFileName)) { + throw new \UserFormException(json_encode([ + ERROR_MESSAGE_TO_USER => 'File/directory found but not readable.', + ERROR_MESSAGE_TO_DEVELOPER => "Can't read existing file/directory '$pathFileName'"]), ERROR_IO_READ_FILE); + } + return true; + } + + /** + * Wrapper for include() but throws exception on failure. + * + * @param string $pathFileName + * @return mixed + * @throws \UserFormException + */ + public static function include(string $pathFileName) + { + $result = include($pathFileName); + if (empty($result) || $result === true) { + throw new \UserFormException(json_encode([ + ERROR_MESSAGE_TO_USER => 'Error read file.', + ERROR_MESSAGE_TO_DEVELOPER => "Can't include file '$pathFileName'"]), ERROR_IO_READ_FILE); + } + return $result; + } } diff --git a/extension/Classes/Core/Helper/Path.php b/extension/Classes/Core/Helper/Path.php index 1458b17c3..99111ffca 100644 --- a/extension/Classes/Core/Helper/Path.php +++ b/extension/Classes/Core/Helper/Path.php @@ -77,7 +77,10 @@ class Path const EXT_TO_GFX_INFO_FILE = 'Resources/Public/icons/note.gif'; const EXT_TO_PATH_ICONS = 'Resources/Public/icons'; + // TODO: lose the "SYSTEM" in following constants + // Log files + private static $appToLog = null; const APP_TO_SYSTEM_LOG = 'fileadmin/protected/log'; const APP_TO_SYSTEM_QFQ_LOG_FILE = 'fileadmin/protected/log/qfq.log'; const APP_TO_SYSTEM_MAIL_LOG_FILE = 'fileadmin/protected/log/mail.log'; @@ -94,6 +97,15 @@ class Path // Twig const EXT_TO_TWIG_TEMPLATES = 'Resources/Public/twig_templates'; + /** + * @return string + * @throws \UserFormException + */ + public static function appToLog(/* path parts to append */): string + { + return self::join(self::$appToLog, func_get_args()); + } + /** * @param string $newPath */ @@ -114,7 +126,7 @@ class Path /** * @param string $newPath */ - public static function setAppToProject(string $newPath) + private static function setAppToProject(string $newPath) { self::$appToProject = $newPath; } @@ -135,6 +147,7 @@ class Path /** * @return string * @throws \UserFormException + * @throws \CodeException */ public static function cwdToProject(/* path parts to append */): string { @@ -178,25 +191,15 @@ class Path * @throws \CodeException * @throws \UserFormException */ - public static function findAndSetProjectPath() + private static function findAndSetProjectPath() { - if (is_readable(Path::cwdToApp(Path::APP_TO_PROJECT_NEW, CONFIG_QFQ_JSON))) { + if (HelperFile::isReadableException(Path::cwdToApp(Path::APP_TO_PROJECT_NEW, CONFIG_QFQ_JSON))) { Path::setAppToProject(Path::APP_TO_PROJECT_NEW); - } elseif (is_readable(Path::cwdToApp(Path::APP_TO_PROJECT_OLD, CONFIG_QFQ_JSON))) { + } elseif (HelperFile::isReadableException(Path::cwdToApp(Path::APP_TO_PROJECT_OLD, CONFIG_QFQ_JSON))) { Path::setAppToProject(Path::APP_TO_PROJECT_OLD); - } elseif (is_readable(Path::cwdToApp(Path::APP_TO_TYPO3_CONFIG, CONFIG_QFQ_PHP))) { + } elseif (HelperFile::isReadableException(Path::cwdToApp(Path::APP_TO_TYPO3_CONFIG, CONFIG_QFQ_PHP))) { Path::setAppToProject(Path::APP_TO_PROJECT_OLD); - - // read old config.qfq.php - $cwdToOldConfigFile = Path::cwdToApp(Path::APP_TO_TYPO3_CONFIG, CONFIG_QFQ_PHP); - HelperFile::enforce_writable($cwdToOldConfigFile); // so we can delete it. - $config = include($cwdToOldConfigFile); - - // write new qfq.config.json - Config::write_config($config); - - // remove old - HelperFile::unlink($cwdToOldConfigFile); + Config::migrateConfigPhpToJson(); } else { Path::setAppToProject(Path::APP_TO_PROJECT_NEW); } diff --git a/extension/Classes/Core/Store/Config.php b/extension/Classes/Core/Store/Config.php index 020523359..3582a6a7e 100644 --- a/extension/Classes/Core/Store/Config.php +++ b/extension/Classes/Core/Store/Config.php @@ -8,6 +8,7 @@ namespace IMATHUZH\Qfq\Core\Store; +use IMATHUZH\Qfq\Core\Exception\Thrower; use IMATHUZH\Qfq\Core\Helper\HelperFile; use IMATHUZH\Qfq\Core\Helper\Logger; use IMATHUZH\Qfq\Core\Helper\Path; @@ -81,8 +82,9 @@ class Config { * * @param array $config * @throws \UserFormException + * @throws \CodeException */ - public static function write_config(array $config) + public static function writeConfig(array $config) { $cwdToProject = Path::cwdToProject(); HelperFile::createPathRecursive($cwdToProject); @@ -90,96 +92,78 @@ class Config { } /** - * Read config.qfq.ini. In case + * Replace typo3conf/config.qfq.php with fileadmin/protected/qfqProject/qfq.json + * + * @throws \CodeException + * @throws \UserFormException + */ + public static function migrateConfigPhpToJson(): void + { + // read old config.qfq.php + $cwdToOldConfigFile = Path::cwdToApp(Path::APP_TO_TYPO3_CONFIG, CONFIG_QFQ_PHP); + HelperFile::enforce_writable($cwdToOldConfigFile); // so we can delete it. + $config = include($cwdToOldConfigFile); + + // write new qfq.config.json + self::writeConfig($config); + + // remove old + HelperFile::unlink($cwdToOldConfigFile); + } + + /** + * Read qfq.json (merge with Typo3-qfq config if exists) + * Deprecated config file typo3conf/config.qfq.php is translated to JSON in PATH:cwdToProject(..) * - * @param string $fileConfigPhpRelToCwd + * @param string $PhpUnitOverloadCwdToConfigFile * @return array * @throws \CodeException * @throws \UserFormException * @throws \UserReportException */ - public static function readConfig($fileConfigPhpRelToCwd = '') { - - /////// DEBUG ///////// - throw new \UserFormException(json_encode([ - ERROR_MESSAGE_TO_USER => json_encode([Path::appToProject(), Path::cwdToProject('hello.php')], JSON_PRETTY_PRINT), - ERROR_MESSAGE_TO_DEVELOPER => json_encode([], JSON_PRETTY_PRINT) - ])); -/////////////////////// - - // TODO: create config if not exists. - // TODO: read config. - - $configT3qfq = array(); - $configIniRelToCwd = ''; // outdated config file format - -// // DONT COMMIT: NOT GOOD ENOUGH! -// if (empty($fileConfigPhpRelToCwd) && !isset($GLOBALS['TYPO3_CONF_VARS']['EXT']['extConf'][EXT_KEY])) { -// $configPathRelToCwd = Path::cwdToApp(Path::APP_TO_CONFIG_DIR); -// $configIniRelToCwd = Path::join($configPathRelToCwd, CONFIG_QFQ_INI); -// $fileConfigPhpRelToCwd = Path::join($configPathRelToCwd, CONFIG_QFQ_PHP); -// } - - // Production Path to CONFIG_INI - $configPathRelToCwd = __DIR__ . '/../../../../..'; - if (!file_exists($configPathRelToCwd . '/' . CONFIG_T3)) { - // PHPUnit Path to CONFIG_INI - $configPathRelToCwd = __DIR__ . '/../../..'; + public static function readConfig($PhpUnitOverloadCwdToConfigFile = '') { + + // read and parse config + $cwdToConfigFile = $PhpUnitOverloadCwdToConfigFile === '' ? Path::cwdToProject(CONFIG_QFQ_JSON) : $PhpUnitOverloadCwdToConfigFile; + if (!file_exists($cwdToConfigFile)) { + HelperFile::file_put_contents(Path::cwdToApp(CONFIG_QFQ_JSON_EXAMPLE), json_encode(CONFIG_REQUIRED_TEMPLATE, JSON_PRETTY_PRINT)); + Thrower::userFormException("Please create qfq config file '" . CONFIG_QFQ_JSON . "' in project directory. Example config file '" . CONFIG_QFQ_JSON_EXAMPLE . "' was created in app directory.", "Project directory: " . realpath(Path::cwdToProject())); } + $config = HelperFile::json_decode(HelperFile::file_get_contents($cwdToConfigFile)); - // In case of missing $configPhp - if (empty($fileConfigPhpRelToCwd)) { + // check required keys + foreach (CONFIG_REQUIRED_TEMPLATE as $key => $value) { + if (!array_key_exists($key, $config) || is_null($config[$key]) || $config[$key] === '') { + Thrower::userFormException("Required key '$key' missing in config file " . CONFIG_QFQ_JSON, "Config file: $cwdToConfigFile"); + } + } - # Read 'LocalConfiguration.php' + // read Typo3-qfq config if exists and merge. + if ($PhpUnitOverloadCwdToConfigFile === '') { + $configT3qfq = array(); if (isset($GLOBALS['TYPO3_CONF_VARS']['EXT']['extConf'][EXT_KEY])) { $configT3qfq = unserialize($GLOBALS['TYPO3_CONF_VARS']['EXT']['extConf'][EXT_KEY]); $configT3qfq[SYSTEM_DB_NAME_T3] = self::getDbName($GLOBALS['TYPO3_CONF_VARS']['DB']); - } else { - $all = include($configPathRelToCwd . '/' . CONFIG_T3); - if (empty($all) || $all === true) { - throw new \UserFormException ("Error read file: " . $configPathRelToCwd . '/' . CONFIG_T3, ERROR_IO_READ_FILE); - } - - $configT3qfq = unserialize($all['EXT']['extConf'][EXT_KEY]); + } elseif (is_readable(Path::cwdToApp(Path::APP_TO_TYPO3_CONFIG, CONFIG_T3))) { + $cwdToTypo3ConfigFile = Path::cwdToApp(Path::APP_TO_TYPO3_CONFIG, CONFIG_T3); + $configT3 = HelperFile::include($cwdToTypo3ConfigFile); + $configT3qfq = unserialize($configT3['EXT']['extConf'][EXT_KEY]); if (!is_array($configT3qfq)) { - throw new \UserFormException ("Error read file: " . $configPathRelToCwd . '/' . CONFIG_T3, ERROR_IO_READ_FILE); + Thrower::userFormException('Error read file', "Error while unserializing qfq config from: $cwdToTypo3ConfigFile"); } - - $configT3qfq[SYSTEM_DB_NAME_T3] = self::getDbName($all['DB']); - unset($all); + $configT3qfq[SYSTEM_DB_NAME_T3] = self::getDbName($configT3['DB']); + unset($configT3); } + $configT3qfq = self::getCustomVariable($configT3qfq); - $configIniRelToCwd = $configPathRelToCwd . '/' . CONFIG_QFQ_INI; - $fileConfigPhpRelToCwd = $configPathRelToCwd . '/' . CONFIG_QFQ_PHP; - - } - - // Migrate legacy config file. - if (is_readable($configIniRelToCwd) && !is_readable($fileConfigPhpRelToCwd)) { - self::migrateConfigIniToPhp($configIniRelToCwd, $fileConfigPhpRelToCwd); - } - - $config = include($fileConfigPhpRelToCwd); - - if ($config === false) { - throw new \UserFormException ("Error read file: " . $fileConfigPhpRelToCwd, ERROR_IO_READ_FILE); - } - - // in case $configIni doesn't exist: just skip - if (!is_array($config)) { - $config = array(); + // Settings in qfq.json overwrite T3 settings + $config = array_merge($configT3qfq, $config); } - $configT3qfq = self::getCustomVariable($configT3qfq); - - // Settings in config.qfq.php overwrite T3 settings - $config = array_merge($configT3qfq, $config); - $config = self::renameConfigElements($config); $config = self::setDefaults($config); self::checkDeprecated($config); - self::checkForAttack($config); // Copy values to detect custom settings later diff --git a/extension/Classes/Core/Store/Store.php b/extension/Classes/Core/Store/Store.php index e9b3b8de2..257d30ed9 100644 --- a/extension/Classes/Core/Store/Store.php +++ b/extension/Classes/Core/Store/Store.php @@ -78,13 +78,13 @@ class Store { /** * @param string $bodytext - * @param string $fileConfigPhp + * @param string $PhpUnitOverloadCwdToConfigFile * * @throws \CodeException * @throws \UserFormException * @throws \UserReportException */ - private function __construct($bodytext = '', $fileConfigPhp = '') { + private function __construct($bodytext = '', $PhpUnitOverloadCwdToConfigFile = '') { // self::$session = Session::getInstance(self::$phpUnit); @@ -173,7 +173,7 @@ class Store { self::fillStoreClient(); // should be filled before fillStoreSystem() to offer Client variables self::fillStorePhpSession(STORE_EXTRA); // should be filled before fillStoreSystem() to restore variables like SYSTEM_SHOW_DEBUG_INFO self::fillStorePhpSession(STORE_USER); // should be filled before fillStoreSystem() to restore variables like SYSTEM_SHOW_DEBUG_INFO - self::fillStoreSystem($fileConfigPhp); + self::fillStoreSystem($PhpUnitOverloadCwdToConfigFile); self::fillStoreSip(); } @@ -182,14 +182,14 @@ class Store { * * @param string $bodytext * @param bool|false $phpUnit - * @param string $qfqConfigPhpUnit + * @param string $PhpUnitOverloadCwdToConfigFile * * @return null|Store * @throws \CodeException * @throws \UserFormException * @throws \UserReportException */ - public static function getInstance($bodytext = '', $phpUnit = false, $qfqConfigPhpUnit = '') { + public static function getInstance($bodytext = '', $phpUnit = false, $PhpUnitOverloadCwdToConfigFile = '') { if (defined('PHPUNIT_QFQ')) { self::$phpUnit = true; @@ -199,10 +199,10 @@ class Store { // If $qfqConfigPhpUnit is given: clean STORE // if (self::$instance !== null && $qfqConfigPhpUnit != '') { - if ($qfqConfigPhpUnit != '') { + if ($PhpUnitOverloadCwdToConfigFile != '') { - if ($qfqConfigPhpUnit == 'init') { - $qfqConfigPhpUnit = ''; + if ($PhpUnitOverloadCwdToConfigFile == 'init') { + $PhpUnitOverloadCwdToConfigFile = ''; } // fake to have a clean environment for the next test. self::unsetStore(STORE_TYPO3); @@ -213,7 +213,7 @@ class Store { } // Testing different config files means initialize completely - if ($qfqConfigPhpUnit != '') { + if ($PhpUnitOverloadCwdToConfigFile != '') { self::$instance = null; } } @@ -222,7 +222,7 @@ class Store { if (self::$instance === null) { // self::$phpUnit = $phpUnit; - self::$instance = new self($bodytext, $qfqConfigPhpUnit); + self::$instance = new self($bodytext, $PhpUnitOverloadCwdToConfigFile); } else { // Class Store seems to be persistent over multiple QFQ instantiation. Set bodytext again, with every new request (if bodytext is given). if ($bodytext !== '') { @@ -459,14 +459,14 @@ class Store { /** * Fill the system store by reading config.qfq.ini. Also setup config defaults. * - * @param string $fileConfigPhp + * @param string $PhpUnitOverloadCwdToConfigFile * @throws \CodeException * @throws \UserFormException * @throws \UserReportException */ - private static function fillStoreSystem($fileConfigPhp = '') { + private static function fillStoreSystem($PhpUnitOverloadCwdToConfigFile = '') { - $config = Config::readConfig($fileConfigPhp); + $config = Config::readConfig($PhpUnitOverloadCwdToConfigFile); $config = self::doSystemPath($config); $config = self::adjustConfig($config); diff --git a/extension/Tests/Unit/Core/Store/StoreTest.php b/extension/Tests/Unit/Core/Store/StoreTest.php index ca93c5671..090b25d15 100644 --- a/extension/Tests/Unit/Core/Store/StoreTest.php +++ b/extension/Tests/Unit/Core/Store/StoreTest.php @@ -316,7 +316,7 @@ class StoreTest extends TestCase { */ private function createFile($body) { - $tmpFileName = tempnam('/tmp', 'config.qfq.ini.'); + $tmpFileName = tempnam('/tmp', 'qfq.json.'); $handle = fopen($tmpFileName, "w"); fwrite($handle, $body); fclose($handle); @@ -416,35 +416,29 @@ class StoreTest extends TestCase { SYSTEM_CMD_PDFUNITE => 'pdfunite', ]; - $body = <<< EOT - <?php - - return [ - // Comment - 'DB_1_USER' => '<DBUSER>', - 'DB_1_SERVER' => '<DBSERVER>', - 'DB_1_PASSWORD' => '<DBPW>', - 'DB_1_NAME' => '<DB>', - - 'DB_2_USER' => '<DBUSER>', - 'DB_2_SERVER' => '<DBSERVER>', - 'DB_2_PASSWORD' => '<DBPW>', - 'DB_2_NAME' => '<DB>', - - 'DB_3_USER' => '<DBUSER>', - 'DB_3_SERVER' => '<DBSERVER>', - 'DB_3_PASSWORD' => '<DBPW>', - 'DB_3_NAME' => '<DB>', - - 'LDAP_1_RDN' => 'LDAP_1_RDN', - 'LDAP_1_PASSWORD' => 'LDAP_1_PASSWORD', - - ]; -EOT; - - $fileName = $this->createFile($body); - $this->store = Store::getInstance('', true, $fileName); - unlink($fileName); + $body = json_encode([ + 'DB_1_USER' => '<DBUSER>', + 'DB_1_SERVER' => '<DBSERVER>', + 'DB_1_PASSWORD' => '<DBPW>', + 'DB_1_NAME' => '<DB>', + + 'DB_2_USER' => '<DBUSER>', + 'DB_2_SERVER' => '<DBSERVER>', + 'DB_2_PASSWORD' => '<DBPW>', + 'DB_2_NAME' => '<DB>', + + 'DB_3_USER' => '<DBUSER>', + 'DB_3_SERVER' => '<DBSERVER>', + 'DB_3_PASSWORD' => '<DBPW>', + 'DB_3_NAME' => '<DB>', + + 'LDAP_1_RDN' => 'LDAP_1_RDN', + 'LDAP_1_PASSWORD' => 'LDAP_1_PASSWORD', + ], JSON_PRETTY_PRINT); + + $cwdToConfigFile = $this->createFile($body); + $this->store = Store::getInstance('', true, $cwdToConfigFile); + unlink($cwdToConfigFile); $config = $this->store->getStore(STORE_SYSTEM); -- GitLab From 8e1f4824a09ad155b1b255b0cf669decc69e5997 Mon Sep 17 00:00:00 2001 From: Marc Egger <marc.egger@uzh.ch> Date: Wed, 26 Aug 2020 19:10:14 +0200 Subject: [PATCH 070/195] Refs #11035 Config.php: extract typo3 part of readConfig() --- extension/Classes/Core/Store/Config.php | 47 ++++++++++++++++--------- 1 file changed, 30 insertions(+), 17 deletions(-) diff --git a/extension/Classes/Core/Store/Config.php b/extension/Classes/Core/Store/Config.php index 3582a6a7e..0036fddc0 100644 --- a/extension/Classes/Core/Store/Config.php +++ b/extension/Classes/Core/Store/Config.php @@ -138,26 +138,10 @@ class Config { } } - // read Typo3-qfq config if exists and merge. if ($PhpUnitOverloadCwdToConfigFile === '') { - $configT3qfq = array(); - if (isset($GLOBALS['TYPO3_CONF_VARS']['EXT']['extConf'][EXT_KEY])) { - $configT3qfq = unserialize($GLOBALS['TYPO3_CONF_VARS']['EXT']['extConf'][EXT_KEY]); - $configT3qfq[SYSTEM_DB_NAME_T3] = self::getDbName($GLOBALS['TYPO3_CONF_VARS']['DB']); - - } elseif (is_readable(Path::cwdToApp(Path::APP_TO_TYPO3_CONFIG, CONFIG_T3))) { - $cwdToTypo3ConfigFile = Path::cwdToApp(Path::APP_TO_TYPO3_CONFIG, CONFIG_T3); - $configT3 = HelperFile::include($cwdToTypo3ConfigFile); - $configT3qfq = unserialize($configT3['EXT']['extConf'][EXT_KEY]); - if (!is_array($configT3qfq)) { - Thrower::userFormException('Error read file', "Error while unserializing qfq config from: $cwdToTypo3ConfigFile"); - } - $configT3qfq[SYSTEM_DB_NAME_T3] = self::getDbName($configT3['DB']); - unset($configT3); - } - $configT3qfq = self::getCustomVariable($configT3qfq); // Settings in qfq.json overwrite T3 settings + $configT3qfq = self::readTypo3QfqConfig(); $config = array_merge($configT3qfq, $config); } @@ -172,6 +156,35 @@ class Config { return $config; } + /** + * Read Typo3-QFQ config first from global variable, then from typo3conf/Localconfig.php. + * If both not exist, return empty array. + * + * @return array Empty if config not found. + * @throws \UserFormException + * @throws \UserReportException + */ + private static function readTypo3QfqConfig(): array + { + $configT3qfq = array(); + if (isset($GLOBALS['TYPO3_CONF_VARS']['EXT']['extConf'][EXT_KEY])) { + $configT3qfq = unserialize($GLOBALS['TYPO3_CONF_VARS']['EXT']['extConf'][EXT_KEY]); + $configT3qfq[SYSTEM_DB_NAME_T3] = self::getDbName($GLOBALS['TYPO3_CONF_VARS']['DB']); + + } elseif (is_readable(Path::cwdToApp(Path::APP_TO_TYPO3_CONFIG, CONFIG_T3))) { + $cwdToTypo3ConfigFile = Path::cwdToApp(Path::APP_TO_TYPO3_CONFIG, CONFIG_T3); + $configT3 = HelperFile::include($cwdToTypo3ConfigFile); + $configT3qfq = unserialize($configT3['EXT']['extConf'][EXT_KEY]); + if (!is_array($configT3qfq)) { + Thrower::userFormException('Error read file', "Error while unserializing qfq config from: $cwdToTypo3ConfigFile"); + } + $configT3qfq[SYSTEM_DB_NAME_T3] = self::getDbName($configT3['DB']); + unset($configT3); + } + $configT3qfq = self::getCustomVariable($configT3qfq); + return $configT3qfq; + } + /** * Returns T3 DB-Name, depending on T3 version * -- GitLab From 0173273a8b0b8c04a87012477d750fbde4343b0d Mon Sep 17 00:00:00 2001 From: Marc Egger <marc.egger@uzh.ch> Date: Thu, 27 Aug 2020 12:33:23 +0200 Subject: [PATCH 071/195] Refs #11035 read project path from qfq.project.path.php --- extension/Classes/Core/Constants.php | 3 + extension/Classes/Core/Exception/Thrower.php | 2 +- extension/Classes/Core/Helper/Path.php | 99 ++++++++++++++------ extension/Classes/Core/Store/Config.php | 4 +- 4 files changed, 75 insertions(+), 33 deletions(-) diff --git a/extension/Classes/Core/Constants.php b/extension/Classes/Core/Constants.php index b895bd1d0..f6d6214b9 100644 --- a/extension/Classes/Core/Constants.php +++ b/extension/Classes/Core/Constants.php @@ -7,6 +7,9 @@ */ const EXT_KEY = 'qfq'; + +const PROJECT_PATH_PHP_FILE = 'qfq.project.path.php'; + const CONFIG_QFQ_INI = "config.qfq.ini"; // QFQ configuration file: db access - deprecated const CONFIG_QFQ_PHP = "config.qfq.php"; // QFQ configuration file: db access - deprecated const CONFIG_QFQ_JSON = "qfq.json"; // QFQ configuration file: db access + what used to be in LocalConfig.php diff --git a/extension/Classes/Core/Exception/Thrower.php b/extension/Classes/Core/Exception/Thrower.php index 7b18459e7..9ae4ce5f6 100644 --- a/extension/Classes/Core/Exception/Thrower.php +++ b/extension/Classes/Core/Exception/Thrower.php @@ -12,7 +12,7 @@ class Thrower * @param int $errorCode * @throws \UserFormException */ - public static function userFormException(string $errorToUser, string $errorToDeveloper, int $errorCode = E_ERROR) { + public static function userFormException(string $errorToUser, string $errorToDeveloper = '', int $errorCode = E_ERROR) { throw new \UserFormException(json_encode([ ERROR_MESSAGE_TO_USER => $errorToUser, ERROR_MESSAGE_TO_DEVELOPER => $errorToDeveloper]), ERROR_IO_READ_FILE); diff --git a/extension/Classes/Core/Helper/Path.php b/extension/Classes/Core/Helper/Path.php index 99111ffca..41d70d4fb 100644 --- a/extension/Classes/Core/Helper/Path.php +++ b/extension/Classes/Core/Helper/Path.php @@ -48,6 +48,7 @@ Path::join($qfqProjectDirRelToCwd, Path::REPORT_REL_TO_PROJECT_DIR) === "../../. */ +use IMATHUZH\Qfq\Core\Exception\Thrower; use IMATHUZH\Qfq\Core\Store\Config; class Path @@ -61,8 +62,8 @@ class Path // QFQ Project dir private static $appToProject = null; - const APP_TO_PROJECT_NEW = '../'; - const APP_TO_PROJECT_OLD = 'fileadmin/protected/qfqProject'; + const APP_TO_PROJECT_DEFAULT = '../'; + const APP_TO_PROJECT_MIGRATE = 'fileadmin/protected/qfqProject'; const PROJECT_TO_FORM = 'form'; const PROJECT_DIR_TO_REPORT = 'report'; @@ -138,9 +139,17 @@ class Path */ public static function appToProject(/* path parts to append */): string { + // set path if not set + static $firstRun = true; // protect from recursive call if (is_null(self::$appToProject)) { - self::findAndSetProjectPath(); + if ($firstRun) { + $firstRun = false; + self::findAndSetProjectPath(); + } else { + Thrower::userFormException('Unexpected recursion.', 'Recursive call of function appToProject(). This should not happen.'); + } } + return self::join(self::$appToProject, func_get_args()); } @@ -181,36 +190,12 @@ class Path return self::cwdToExt(self::extToApi(func_get_args())); } - /** - * Find the project directory by searching for config.qfq.json in the following locations - * 1) above app (app/../) - * 2) in fileadmin (app/fileadmin/protected/qfqProject/) - * 3) in typo3conf (app/typo3conf/) => moves config to fileadmin (see 2) - * 4) not found => set path to app/../ (see 1) - * - * @throws \CodeException - * @throws \UserFormException - */ - private static function findAndSetProjectPath() - { - if (HelperFile::isReadableException(Path::cwdToApp(Path::APP_TO_PROJECT_NEW, CONFIG_QFQ_JSON))) { - Path::setAppToProject(Path::APP_TO_PROJECT_NEW); - } elseif (HelperFile::isReadableException(Path::cwdToApp(Path::APP_TO_PROJECT_OLD, CONFIG_QFQ_JSON))) { - Path::setAppToProject(Path::APP_TO_PROJECT_OLD); - } elseif (HelperFile::isReadableException(Path::cwdToApp(Path::APP_TO_TYPO3_CONFIG, CONFIG_QFQ_PHP))) { - Path::setAppToProject(Path::APP_TO_PROJECT_OLD); - Config::migrateConfigPhpToJson(); - } else { - Path::setAppToProject(Path::APP_TO_PROJECT_NEW); - } - } - /** * Join the arguments together as a path. * The second argument may be an array of parts. (further arguments are ignored in that case) * * @return string - * @throws \UserFormException + * @throws \UserFormException Don't remove. */ public static function join(/* path parts to append */): string { @@ -220,16 +205,17 @@ class Path $path = ''; array_walk_recursive($parts, function ($part) use (&$path) { - // Filter out empty string and null arguments + // filter out empty string and null arguments if (is_null($part) || $part === '') { return; } + // first part added without '/' if ($path === '') { $path .= $part; } else { - // Trailing path parts may not be absolute + // trailing path parts may not be absolute if ($part[0] === '/') { throw new \UserFormException(json_encode([ ERROR_MESSAGE_TO_USER => 'Failed: Join path.', @@ -244,4 +230,57 @@ class Path // remove multiple occurrences of '/' return preg_replace('/\/{2,}/','/', $path); } + + /////////////////////////////////////////////////// Private ////////////////////////////////////////////////////// + + /** + * @throws \CodeException + * @throws \UserFormException + */ + private static function writeProjectPathPhp() + { + $appToProject = self::appToProject(); + $fileContent = <<<EOF +<?php + +/** +QFQ project path configuration + +******************************************************-----******************************** +* ATTENTION: The files in the project directory should NOT be served by your http server! * +******************************************************-----******************************** + +Only exception: The app directory inside the project directory may be served. +*/ + +return '$appToProject'; // path relative to app directory (i.e. location of this file). +EOF; + HelperFile::file_put_contents(self::cwdToApp(PROJECT_PATH_PHP_FILE), $fileContent); + } + + /** + * Read the project location from qfq.project.path.php or create the file with default path. + * + * @throws \CodeException + * @throws \UserFormException + */ + private static function findAndSetProjectPath() + { + // does qfq.project.path.php exist? => read path + $cwdToProjectPathFile = self::cwdToApp(PROJECT_PATH_PHP_FILE); + if (HelperFile::isReadableException($cwdToProjectPathFile)) { + self::setAppToProject(HelperFile::include($cwdToProjectPathFile)); + + // does the deprecated config.qfq.php exist? => migrate to qfq.json + } elseif (HelperFile::isReadableException(self::cwdToApp(self::APP_TO_TYPO3_CONFIG, CONFIG_QFQ_PHP))) { + self::setAppToProject(self::APP_TO_PROJECT_MIGRATE); + self::writeProjectPathPhp(); + Config::migrateConfigPhpToJson(); + + // create qfq.project.path.php at default location + } else { + self::setAppToProject(self::APP_TO_PROJECT_DEFAULT); + self::writeProjectPathPhp(); + } + } } \ No newline at end of file diff --git a/extension/Classes/Core/Store/Config.php b/extension/Classes/Core/Store/Config.php index 0036fddc0..d26dba2d7 100644 --- a/extension/Classes/Core/Store/Config.php +++ b/extension/Classes/Core/Store/Config.php @@ -126,8 +126,8 @@ class Config { // read and parse config $cwdToConfigFile = $PhpUnitOverloadCwdToConfigFile === '' ? Path::cwdToProject(CONFIG_QFQ_JSON) : $PhpUnitOverloadCwdToConfigFile; if (!file_exists($cwdToConfigFile)) { - HelperFile::file_put_contents(Path::cwdToApp(CONFIG_QFQ_JSON_EXAMPLE), json_encode(CONFIG_REQUIRED_TEMPLATE, JSON_PRETTY_PRINT)); - Thrower::userFormException("Please create qfq config file '" . CONFIG_QFQ_JSON . "' in project directory. Example config file '" . CONFIG_QFQ_JSON_EXAMPLE . "' was created in app directory.", "Project directory: " . realpath(Path::cwdToProject())); + HelperFile::file_put_contents(Path::cwdToProject(CONFIG_QFQ_JSON_EXAMPLE), json_encode(CONFIG_REQUIRED_TEMPLATE, JSON_PRETTY_PRINT)); + Thrower::userFormException("Please create qfq config file '" . CONFIG_QFQ_JSON . "' in project directory. Example config file '" . CONFIG_QFQ_JSON_EXAMPLE . "' was created in project directory.", "Project directory: " . realpath(Path::cwdToProject())); } $config = HelperFile::json_decode(HelperFile::file_get_contents($cwdToConfigFile)); -- GitLab From 045b4ed59459930b50a39e1c0746521651ca0cea Mon Sep 17 00:00:00 2001 From: Marc Egger <marc.egger@uzh.ch> Date: Thu, 27 Aug 2020 14:03:30 +0200 Subject: [PATCH 072/195] Refs #11035 small change --- extension/Classes/Core/Constants.php | 11 ------ extension/Classes/Core/Helper/Path.php | 52 +++++++++++++------------ extension/Classes/Core/Store/Config.php | 36 ++++------------- extension/NoT3Page/index.php | 1 + 4 files changed, 36 insertions(+), 64 deletions(-) diff --git a/extension/Classes/Core/Constants.php b/extension/Classes/Core/Constants.php index f6d6214b9..9e085a63b 100644 --- a/extension/Classes/Core/Constants.php +++ b/extension/Classes/Core/Constants.php @@ -10,7 +10,6 @@ const EXT_KEY = 'qfq'; const PROJECT_PATH_PHP_FILE = 'qfq.project.path.php'; -const CONFIG_QFQ_INI = "config.qfq.ini"; // QFQ configuration file: db access - deprecated const CONFIG_QFQ_PHP = "config.qfq.php"; // QFQ configuration file: db access - deprecated const CONFIG_QFQ_JSON = "qfq.json"; // QFQ configuration file: db access + what used to be in LocalConfig.php const CONFIG_QFQ_JSON_EXAMPLE = "example.qfq.json"; @@ -483,13 +482,6 @@ const SYSTEM_DB_1_SERVER = 'DB_1_SERVER'; const SYSTEM_DB_1_PASSWORD = 'DB_1_PASSWORD'; const SYSTEM_DB_1_NAME = 'DB_1_NAME'; -const CONFIG_REQUIRED_TEMPLATE = [ - SYSTEM_DB_1_USER => null, - SYSTEM_DB_1_PASSWORD => null, - SYSTEM_DB_1_SERVER => "localhost", - SYSTEM_DB_1_NAME=> null, -]; - const SYSTEM_DB_INIT = 'init'; const SYSTEM_DB_INDEX_DATA = "indexData"; @@ -658,9 +650,6 @@ const SYSTEM_CMD_PDFUNITE = 'cmdPdfunite'; const SYSTEM_THUMBNAIL_DIR_SECURE_REL_TO_APP = 'thumbnailDirSecure'; const SYSTEM_THUMBNAIL_DIR_PUBLIC_REL_TO_APP = 'thumbnailDirPublic'; -// Form/Report as file -const SYSTEM_QFQ_PROJECT_DIR_SECURE_REL_TO_APP = 'qfqProjectDir'; // where form and report files are saved - const SYSTEM_DOCUMENTATION_QFQ = 'documentation'; const SYSTEM_DOCUMENTATION_QFQ_URL = 'https://docs.qfq.io'; diff --git a/extension/Classes/Core/Helper/Path.php b/extension/Classes/Core/Helper/Path.php index 41d70d4fb..794f1a2eb 100644 --- a/extension/Classes/Core/Helper/Path.php +++ b/extension/Classes/Core/Helper/Path.php @@ -233,31 +233,6 @@ class Path /////////////////////////////////////////////////// Private ////////////////////////////////////////////////////// - /** - * @throws \CodeException - * @throws \UserFormException - */ - private static function writeProjectPathPhp() - { - $appToProject = self::appToProject(); - $fileContent = <<<EOF -<?php - -/** -QFQ project path configuration - -******************************************************-----******************************** -* ATTENTION: The files in the project directory should NOT be served by your http server! * -******************************************************-----******************************** - -Only exception: The app directory inside the project directory may be served. -*/ - -return '$appToProject'; // path relative to app directory (i.e. location of this file). -EOF; - HelperFile::file_put_contents(self::cwdToApp(PROJECT_PATH_PHP_FILE), $fileContent); - } - /** * Read the project location from qfq.project.path.php or create the file with default path. * @@ -283,4 +258,31 @@ EOF; self::writeProjectPathPhp(); } } + + /** + * Write the project path configuration file to the project directory. + * + * @throws \CodeException + * @throws \UserFormException + */ + private static function writeProjectPathPhp() + { + $appToProject = self::appToProject(); + $fileContent = <<<EOF +<?php + +/** +QFQ project path configuration + +******************************************************-----******************************** +* ATTENTION: The files in the project directory should NOT be served by your http server! * +******************************************************-----******************************** + +Only exception: The app directory inside the project directory may be served. +*/ + +return '$appToProject'; // path relative to app directory (i.e. location of this file). +EOF; + HelperFile::file_put_contents(self::cwdToApp(PROJECT_PATH_PHP_FILE), $fileContent); + } } \ No newline at end of file diff --git a/extension/Classes/Core/Store/Config.php b/extension/Classes/Core/Store/Config.php index d26dba2d7..efa51de37 100644 --- a/extension/Classes/Core/Store/Config.php +++ b/extension/Classes/Core/Store/Config.php @@ -21,32 +21,12 @@ use IMATHUZH\Qfq\Core\Helper\OnString; */ class Config { - /** - * Migrate config.qfq.ini to config.qfq.php - * - * @param $configIni - * @param $configPhp - */ - private static function migrateConfigIniToPhp($configIni, $configPhp) { - - $config = parse_ini_file($configIni, false); - - $pre = isset($config[SYSTEM_DB_NAME]) ? 'DB' : 'DB_1'; - - $content = '<?php' . PHP_EOL . 'return [' . PHP_EOL; - - foreach ([$pre . '_NAME', $pre . '_PASSWORD', $pre . '_SERVER', $pre . '_USER', SYSTEM_LDAP_1_RDN, SYSTEM_LDAP_1_PASSWORD] as $key) { - $content .= " '$key' => '" . ($config[$key] ?? "") . "'," . PHP_EOL; - } - - $content .= "];" . PHP_EOL; - - // Write new config file - file_put_contents($configPhp, $content); - - // Make old file unreadable - chmod($configIni, 000); - } + const CONFIG_REQUIRED_TEMPLATE = [ + SYSTEM_DB_1_USER => null, + SYSTEM_DB_1_PASSWORD => null, + SYSTEM_DB_1_SERVER => "localhost", + SYSTEM_DB_1_NAME=> null, + ]; /** * Iterates over all 30 custom vars, explode them to split between key and value, append to $config. @@ -126,13 +106,13 @@ class Config { // read and parse config $cwdToConfigFile = $PhpUnitOverloadCwdToConfigFile === '' ? Path::cwdToProject(CONFIG_QFQ_JSON) : $PhpUnitOverloadCwdToConfigFile; if (!file_exists($cwdToConfigFile)) { - HelperFile::file_put_contents(Path::cwdToProject(CONFIG_QFQ_JSON_EXAMPLE), json_encode(CONFIG_REQUIRED_TEMPLATE, JSON_PRETTY_PRINT)); + HelperFile::file_put_contents(Path::cwdToProject(CONFIG_QFQ_JSON_EXAMPLE), json_encode(self::CONFIG_REQUIRED_TEMPLATE, JSON_PRETTY_PRINT)); Thrower::userFormException("Please create qfq config file '" . CONFIG_QFQ_JSON . "' in project directory. Example config file '" . CONFIG_QFQ_JSON_EXAMPLE . "' was created in project directory.", "Project directory: " . realpath(Path::cwdToProject())); } $config = HelperFile::json_decode(HelperFile::file_get_contents($cwdToConfigFile)); // check required keys - foreach (CONFIG_REQUIRED_TEMPLATE as $key => $value) { + foreach (self::CONFIG_REQUIRED_TEMPLATE as $key => $value) { if (!array_key_exists($key, $config) || is_null($config[$key]) || $config[$key] === '') { Thrower::userFormException("Required key '$key' missing in config file " . CONFIG_QFQ_JSON, "Config file: $cwdToConfigFile"); } diff --git a/extension/NoT3Page/index.php b/extension/NoT3Page/index.php index bcc0a1035..413936d03 100644 --- a/extension/NoT3Page/index.php +++ b/extension/NoT3Page/index.php @@ -22,6 +22,7 @@ use IMATHUZH\Qfq\Core\QuickFormQuery; // TODO: (?) replace all log path computations: SYSTEM_QFQ_LOG_ABSOLUTE, SYSTEM_SQL_LOG_ABSOLUTE, // TODO: Test if qfq, sql and mail logs still work // TODO: write docstrings for Path.php +// TODO: alle error codes raus schmeissen // PATH migration // TODO: create filePathToQfqConfig() and replace config references with this -- GitLab From 03729ec632fb1fcd79a8f525230f8820602a76a3 Mon Sep 17 00:00:00 2001 From: Marc Egger <marc.egger@uzh.ch> Date: Fri, 28 Aug 2020 11:22:06 +0200 Subject: [PATCH 073/195] Refs #11035 remove SYSTEM from path constants --- extension/Classes/Core/Database/Database.php | 2 +- .../Classes/Core/Database/DatabaseUpdate.php | 4 +- .../Core/Exception/AbstractException.php | 2 +- extension/Classes/Core/Helper/Path.php | 92 ++++++++++++++----- extension/Classes/Core/Helper/Support.php | 2 +- extension/Classes/Core/Store/Config.php | 8 +- 6 files changed, 77 insertions(+), 33 deletions(-) diff --git a/extension/Classes/Core/Database/Database.php b/extension/Classes/Core/Database/Database.php index c81aca3c5..a05d64fcd 100644 --- a/extension/Classes/Core/Database/Database.php +++ b/extension/Classes/Core/Database/Database.php @@ -1045,7 +1045,7 @@ class Database { * @throws \UserFormException */ public function getQfqLogFile() { - return ($this->store == null) ? Path::cwdToApp(Path::APP_TO_SYSTEM_QFQ_LOG_FILE) : $this->store->getVar(SYSTEM_QFQ_LOG_ABSOLUTE, STORE_SYSTEM); + return ($this->store == null) ? Path::cwdToApp(Path::APP_TO_QFQ_LOG_FILE) : $this->store->getVar(SYSTEM_QFQ_LOG_ABSOLUTE, STORE_SYSTEM); } /** diff --git a/extension/Classes/Core/Database/DatabaseUpdate.php b/extension/Classes/Core/Database/DatabaseUpdate.php index 4055af7d7..e07a1933e 100644 --- a/extension/Classes/Core/Database/DatabaseUpdate.php +++ b/extension/Classes/Core/Database/DatabaseUpdate.php @@ -294,7 +294,7 @@ class DatabaseUpdate { if ($actionSpecialColumn === ACTION_SPECIAL_COLUMN_DO_REPLACE) { // save log file $message = '<h1>Special column names replaced</h1>The following special column names were replaced.<hr>' . $message; - Logger::logMessage($message, Path::cwdToApp(Path::APP_TO_SYSTEM_LOG) . '/' . date("YmdHi") . '_special_columns_auto_update.html'); + Logger::logMessage($message, Path::cwdToApp(Path::APP_TO_LOG) . '/' . date("YmdHi") . '_special_columns_auto_update.html'); } elseif ($actionSpecialColumn === ACTION_SPECIAL_COLUMN_DO_SKIP_REPLACE) { // do nothing } else { @@ -306,7 +306,7 @@ class DatabaseUpdate { . 'Click <a href="?' . http_build_query(array_merge($_GET, array(ACTION_SPECIAL_COLUMN_UPDATE => ACTION_SPECIAL_COLUMN_DO_REPLACE))) . '">Auto-Replace</a>' . ' to automatically prepend the found column names with an underscore.' . ' In the report below the missing underscores are marked by "<span style="font-weight: bold; color: red;">>>>_</span>".' - . ' This report will be saved in ' . Path::cwdToApp(Path::APP_TO_SYSTEM_LOG) . ' after the automatic replacement.' + . ' This report will be saved in ' . Path::cwdToApp(Path::APP_TO_LOG) . ' after the automatic replacement.' . ' <br><br>To update qfq without changing the special columns (your app will probably be broken): ' . '<a href="?' . http_build_query(array_merge($_GET, array(ACTION_SPECIAL_COLUMN_UPDATE => ACTION_SPECIAL_COLUMN_DO_SKIP_REPLACE))) . '">Skip Auto-Replace</a>' . '<h2>Report</h2>' diff --git a/extension/Classes/Core/Exception/AbstractException.php b/extension/Classes/Core/Exception/AbstractException.php index 332e6ee54..6c42b6cec 100644 --- a/extension/Classes/Core/Exception/AbstractException.php +++ b/extension/Classes/Core/Exception/AbstractException.php @@ -190,7 +190,7 @@ class AbstractException extends \Exception { } } - $qfqLog = ($store == null) ? Path::cwdToApp(Path::APP_TO_SYSTEM_QFQ_LOG_FILE) : $store->getVar(SYSTEM_QFQ_LOG_ABSOLUTE, STORE_SYSTEM); + $qfqLog = ($store == null) ? Path::cwdToApp(Path::APP_TO_QFQ_LOG_FILE) : $store->getVar(SYSTEM_QFQ_LOG_ABSOLUTE, STORE_SYSTEM); $arrDebugHidden[EXCEPTION_STACKTRACE] = PHP_EOL . implode($arrTrace, PHP_EOL); $arrLogAll = array_merge($arrMsg, $arrShow, $arrDebugShow, $arrDebugHidden); $logAll = OnArray::arrayToLog($arrLogAll); diff --git a/extension/Classes/Core/Helper/Path.php b/extension/Classes/Core/Helper/Path.php index 794f1a2eb..0646c1119 100644 --- a/extension/Classes/Core/Helper/Path.php +++ b/extension/Classes/Core/Helper/Path.php @@ -55,56 +55,78 @@ class Path { // App // This should be manually overwritten (using Path::setCwdToApp()) if the CWD is not the one containing the typo3 index.php. - private static $cwdToApp = ''; + private static $cwdToApp = null; // Extension const APP_TO_EXT = 'typo3conf/ext/qfq'; - // QFQ Project dir - private static $appToProject = null; - const APP_TO_PROJECT_DEFAULT = '../'; - const APP_TO_PROJECT_MIGRATE = 'fileadmin/protected/qfqProject'; - const PROJECT_TO_FORM = 'form'; - const PROJECT_DIR_TO_REPORT = 'report'; - - // Config - const APP_TO_TYPO3_CONFIG = 'typo3conf'; - // API const EXT_TO_API = 'Classes/Api'; - const API_TO_APP = '../../../../../'; + const API_TO_APP = '../../../../../'; // TODO: not relative to ext // Icons const EXT_TO_GFX_INFO_FILE = 'Resources/Public/icons/note.gif'; const EXT_TO_PATH_ICONS = 'Resources/Public/icons'; - // TODO: lose the "SYSTEM" in following constants + // Annotate + const EXT_TO_HIGHLIGHT_JSON_DIR = 'Resources/Public/Json'; + + // Twig + const EXT_TO_TWIG_TEMPLATES = 'Resources/Public/twig_templates'; + + // QFQ Project dir + private static $appToProject = null; + private const APP_TO_PROJECT_DEFAULT = '../'; + private const APP_TO_PROJECT_MIGRATE = 'fileadmin/protected/qfqProject'; + const PROJECT_TO_FORM = 'form'; + const PROJECT_DIR_TO_REPORT = 'report'; + + // Config + const APP_TO_TYPO3_CONFIG = 'typo3conf'; // Log files - private static $appToLog = null; - const APP_TO_SYSTEM_LOG = 'fileadmin/protected/log'; - const APP_TO_SYSTEM_QFQ_LOG_FILE = 'fileadmin/protected/log/qfq.log'; - const APP_TO_SYSTEM_MAIL_LOG_FILE = 'fileadmin/protected/log/mail.log'; - const APP_TO_SYSTEM_SQL_LOG_FILE = 'fileadmin/protected/log/sql.log'; + private static $cwdToLog = null; // TODO: does it make sense to have it rel to CWD? to broad? + const APP_TO_LOG = 'fileadmin/protected/log'; + const APP_TO_QFQ_LOG_FILE = 'fileadmin/protected/log/qfq.log'; + const APP_TO_MAIL_LOG_FILE = 'fileadmin/protected/log/mail.log'; + const APP_TO_SQL_LOG_FILE = 'fileadmin/protected/log/sql.log'; + + private const PROJECT_TO_LOG_DEFAULT = 'log'; + private const APP_TO_DEPRECATED_LOG = 'fileadmin/protected/log'; // Thumbnail const APP_TO_SYSTEM_THUMBNAIL_DIR_SECURE_DEFAULT = 'fileadmin/protected/qfqThumbnail'; const APP_TO_SYSTEM_THUMBNAIL_DIR_PUBLIC_DEFAULT = 'typo3temp/qfqThumbnail'; const APP_TO_THUMBNAIL_UNKNOWN_TYPE = 'typo3/sysext/frontend/Resources/Public/Icons/FileIcons/'; - // Annotate - const EXT_TO_HIGHLIGHT_JSON_DIR = 'Resources/Public/Json'; + public static function setPaths(string $cwdToApp) + { + self::setCwdToApp($cwdToApp); + self::findAndSetProjectPath(); + self::findAndSetLogPath(); + } - // Twig - const EXT_TO_TWIG_TEMPLATES = 'Resources/Public/twig_templates'; + /** + * @param string $newPath + * @return string + */ + public static function setCwdToLog(string $newPath) + { + self::$cwdToLog = $newPath; + } /** * @return string * @throws \UserFormException + * @throws \CodeException */ - public static function appToLog(/* path parts to append */): string + public static function cwdToLog(/* path parts to append */): string { - return self::join(self::$appToLog, func_get_args()); + if (is_null(self::$cwdToLog)) { + return self::cwdToProject(self::PROJECT_TO_LOG_DEFAULT); + } + // TODO: findCwdTolog in try, catch exception and add: exception: could not write logs. + return self::join(self::$cwdToLog, func_get_args()); } /** @@ -233,6 +255,28 @@ class Path /////////////////////////////////////////////////// Private ////////////////////////////////////////////////////// + /** + * @throws \CodeException + * @throws \UserFormException + */ + private static function findAndSetLogPath() + { + // search log dir in project + $cwdToLog = self::cwdToProject(self::PROJECT_TO_LOG_DEFAULT); + if (file_exists($cwdToLog)) { + self::setCwdToLog($cwdToLog); + + // search log dir in fileadmin/protected + } elseif (file_exists(self::cwdToApp(self::APP_TO_DEPRECATED_LOG))) { + self::setCwdToLog(self::cwdToApp(self::APP_TO_DEPRECATED_LOG)); + + // create default log dir + } else { + HelperFile::createPathRecursive($cwdToLog); + self::setCwdToLog($cwdToLog); + } + } + /** * Read the project location from qfq.project.path.php or create the file with default path. * diff --git a/extension/Classes/Core/Helper/Support.php b/extension/Classes/Core/Helper/Support.php index 9636d402b..624de71c3 100644 --- a/extension/Classes/Core/Helper/Support.php +++ b/extension/Classes/Core/Helper/Support.php @@ -123,7 +123,7 @@ class Support { throw new \CodeException('Unknown mode: ' . $formLogMode, ERROR_UNKNOWN_TOKEN); } - $filename = Path::cwdToApp(Path::APP_TO_SYSTEM_LOG) . '/' . $formName . "." . $perBeSession . "log"; + $filename = Path::cwdToApp(Path::APP_TO_LOG) . '/' . $formName . "." . $perBeSession . "log"; return sanitize::safeFilename($filename, false, true); } diff --git a/extension/Classes/Core/Store/Config.php b/extension/Classes/Core/Store/Config.php index efa51de37..a573c48e1 100644 --- a/extension/Classes/Core/Store/Config.php +++ b/extension/Classes/Core/Store/Config.php @@ -275,7 +275,7 @@ class Config { } Logger::logMessage(Logger::linePre() . 'Security: attack detected' . PHP_EOL . $reason, - $config[SYSTEM_QFQ_LOG_ABSOLUTE] ?? Path::cwdToApp(Path::APP_TO_SYSTEM_QFQ_LOG_FILE)); + $config[SYSTEM_QFQ_LOG_ABSOLUTE] ?? Path::cwdToApp(Path::APP_TO_QFQ_LOG_FILE)); // In case of an attack: log out the current user. Session::destroy(); @@ -323,9 +323,9 @@ class Config { SYSTEM_RENDER => SYSTEM_RENDER_SINGLE, SYSTEM_DATE_FORMAT => 'yyyy-mm-dd', SYSTEM_SHOW_DEBUG_INFO => SYSTEM_SHOW_DEBUG_INFO_AUTO, - SYSTEM_MAIL_LOG_ABSOLUTE => Path::APP_TO_SYSTEM_MAIL_LOG_FILE, // Will be made absolute automatically by Store->adjustConfig() - SYSTEM_QFQ_LOG_ABSOLUTE => Path::APP_TO_SYSTEM_QFQ_LOG_FILE, // Will be made absolute automatically by Store->adjustConfig() - SYSTEM_SQL_LOG_ABSOLUTE => Path::APP_TO_SYSTEM_SQL_LOG_FILE, // Will be made absolute automatically by Store->adjustConfig() + SYSTEM_MAIL_LOG_ABSOLUTE => Path::APP_TO_MAIL_LOG_FILE, // Will be made absolute automatically by Store->adjustConfig() + SYSTEM_QFQ_LOG_ABSOLUTE => Path::APP_TO_QFQ_LOG_FILE, // Will be made absolute automatically by Store->adjustConfig() + SYSTEM_SQL_LOG_ABSOLUTE => Path::APP_TO_SQL_LOG_FILE, // Will be made absolute automatically by Store->adjustConfig() SYSTEM_SQL_LOG_MODE => 'modify', SYSTEM_SQL_LOG_MODE_AUTOCRON => 'error', F_BS_COLUMNS => 'col-md-12 col-lg-10', -- GitLab From b2563c475ee9bb77001b9ca989bd346f47639a8d Mon Sep 17 00:00:00 2001 From: Marc Egger <marc.egger@uzh.ch> Date: Fri, 28 Aug 2020 14:49:57 +0200 Subject: [PATCH 074/195] Refs #11035 move path setting into try statements --- extension/Classes/Api/delete.php | 3 +- extension/Classes/Api/dirty.php | 3 +- extension/Classes/Api/download.php | 3 +- extension/Classes/Api/dragAndDrop.php | 2 +- extension/Classes/Api/file.php | 4 +- extension/Classes/Api/load.php | 3 +- extension/Classes/Api/print.php | 2 +- extension/Classes/Api/rest.php | 3 +- extension/Classes/Api/save.php | 3 +- extension/Classes/Api/setting.php | 3 +- extension/Classes/Api/typeahead.php | 3 +- .../Classes/Controller/QfqController.php | 2 + extension/Classes/Core/Helper/Path.php | 90 +++++++++---------- extension/NoT3Page/index.php | 3 +- 14 files changed, 58 insertions(+), 69 deletions(-) diff --git a/extension/Classes/Api/delete.php b/extension/Classes/Api/delete.php index e18902086..9fa2bb771 100644 --- a/extension/Classes/Api/delete.php +++ b/extension/Classes/Api/delete.php @@ -14,8 +14,6 @@ use IMATHUZH\Qfq\Core\Helper\Path; use IMATHUZH\Qfq\Core\QuickFormQuery; use IMATHUZH\Qfq\Core\Store\Store; -Path::setCwdToApp(Path::API_TO_APP); - /** * delete: success * SIP_MODE_ANSWER: MODE_HTML @@ -75,6 +73,7 @@ $flagSuccess = false; try { try { + Path::setMainPaths(Path::API_TO_APP); $qfq = new QuickFormQuery(['bodytext' => '']); $answer = $qfq->delete(); diff --git a/extension/Classes/Api/dirty.php b/extension/Classes/Api/dirty.php index a8ad5009b..39c721092 100644 --- a/extension/Classes/Api/dirty.php +++ b/extension/Classes/Api/dirty.php @@ -13,13 +13,12 @@ require_once(__DIR__ . '/../../vendor/autoload.php'); use IMATHUZH\Qfq\Core\Form\Dirty; use IMATHUZH\Qfq\Core\Helper\Path; -Path::setCwdToApp(Path::API_TO_APP); - /** * Return JSON encoded answer * */ try { + Path::setMainPaths(Path::API_TO_APP); $dirty = new Dirty(); $answer = $dirty->process(); diff --git a/extension/Classes/Api/download.php b/extension/Classes/Api/download.php index 1f732f1c9..5f37de15d 100644 --- a/extension/Classes/Api/download.php +++ b/extension/Classes/Api/download.php @@ -15,8 +15,6 @@ require_once(__DIR__ . '/../../vendor/autoload.php'); use IMATHUZH\Qfq\Core\Helper\Path; use IMATHUZH\Qfq\Core\Report\Download; -Path::setCwdToApp(Path::API_TO_APP); - set_error_handler("\\IMATHUZH\\Qfq\\Core\\Exception\\ErrorHandler::exception_error_handler"); @@ -24,6 +22,7 @@ $output = ''; try { try { + Path::setMainPaths(Path::API_TO_APP); $download = new Download(); // If all is fine: process() will output file via print() !! diff --git a/extension/Classes/Api/dragAndDrop.php b/extension/Classes/Api/dragAndDrop.php index 5702da3d6..eacc34d2a 100644 --- a/extension/Classes/Api/dragAndDrop.php +++ b/extension/Classes/Api/dragAndDrop.php @@ -13,7 +13,6 @@ require_once(__DIR__ . '/../../vendor/autoload.php'); use IMATHUZH\Qfq\Core\Helper\Path; use IMATHUZH\Qfq\Core\QuickFormQuery; -Path::setCwdToApp(Path::API_TO_APP); /** * Return JSON encoded answer @@ -52,6 +51,7 @@ $answer[API_MESSAGE] = ''; try { try { + Path::setMainPaths(Path::API_TO_APP); $qfq = new QuickFormQuery(['bodytext' => '']); $data = $qfq->dragAndDrop(); diff --git a/extension/Classes/Api/file.php b/extension/Classes/Api/file.php index 72cff5cc2..23ef68c06 100644 --- a/extension/Classes/Api/file.php +++ b/extension/Classes/Api/file.php @@ -13,8 +13,6 @@ require_once(__DIR__ . '/../../vendor/autoload.php'); use IMATHUZH\Qfq\Core\File; use IMATHUZH\Qfq\Core\Helper\Path; -Path::setCwdToApp(Path::API_TO_APP); - /** * Process File Upload - immediately when the the user selects a file. * Return JSON encoded answer @@ -40,7 +38,7 @@ $answer[API_MESSAGE] = ''; try { try { - + Path::setMainPaths(Path::API_TO_APP); $fileUpload = new File(); $fileUpload->process(); diff --git a/extension/Classes/Api/load.php b/extension/Classes/Api/load.php index c652e5b53..3d09a26f6 100644 --- a/extension/Classes/Api/load.php +++ b/extension/Classes/Api/load.php @@ -14,8 +14,6 @@ use IMATHUZH\Qfq\Core\Helper\Path; use IMATHUZH\Qfq\Core\Store\Store; use IMATHUZH\Qfq\Core\QuickFormQuery; -Path::setCwdToApp(Path::API_TO_APP); - /** * Return JSON encoded answer @@ -54,6 +52,7 @@ $answer[API_MESSAGE] = ''; try { try { + Path::setMainPaths(Path::API_TO_APP); $qfq = new QuickFormQuery(['bodytext' => '']); $data = $qfq->updateForm(); diff --git a/extension/Classes/Api/print.php b/extension/Classes/Api/print.php index 7e705faab..2ba7336e6 100644 --- a/extension/Classes/Api/print.php +++ b/extension/Classes/Api/print.php @@ -14,12 +14,12 @@ require_once(__DIR__ . '/../../vendor/autoload.php'); use IMATHUZH\Qfq\Core\Helper\Path; use IMATHUZH\Qfq\Core\Report\Html2Pdf; -Path::setCwdToApp(Path::API_TO_APP); /** * Main */ try { + Path::setMainPaths(Path::API_TO_APP); $html2pdf = new Html2Pdf(); $html2pdf->outputHtml2Pdf(); diff --git a/extension/Classes/Api/rest.php b/extension/Classes/Api/rest.php index 3fd76621b..671809b2f 100644 --- a/extension/Classes/Api/rest.php +++ b/extension/Classes/Api/rest.php @@ -15,8 +15,6 @@ use IMATHUZH\Qfq\Core\QuickFormQuery; use IMATHUZH\Qfq\Core\Helper\OnString; -Path::setCwdToApp(Path::API_TO_APP); - $restId = array(); $restForm = array(); @@ -25,6 +23,7 @@ $data = array(); try { try { + Path::setMainPaths(Path::API_TO_APP); $form = OnString::splitPathInfoToIdForm($_SERVER['PATH_INFO'] ?? '', $restId, $restForm); // get latest `ìd` diff --git a/extension/Classes/Api/save.php b/extension/Classes/Api/save.php index efd618e98..1201b93fe 100644 --- a/extension/Classes/Api/save.php +++ b/extension/Classes/Api/save.php @@ -15,8 +15,6 @@ use IMATHUZH\Qfq\Core\QuickFormQuery; use IMATHUZH\Qfq\Core\Store\Store; use IMATHUZH\Qfq\Core\Helper\Support; -Path::setCwdToApp(Path::API_TO_APP); - /** * Return JSON encoded answer * @@ -54,6 +52,7 @@ $answer[API_MESSAGE] = ''; try { try { + Path::setMainPaths(Path::API_TO_APP); $qfq = new QuickFormQuery(['bodytext' => ""]); $data = $qfq->saveForm(); diff --git a/extension/Classes/Api/setting.php b/extension/Classes/Api/setting.php index aceed3017..f1a353cf5 100644 --- a/extension/Classes/Api/setting.php +++ b/extension/Classes/Api/setting.php @@ -13,8 +13,6 @@ require_once(__DIR__ . '/../../vendor/autoload.php'); use IMATHUZH\Qfq\Core\Helper\Path; use IMATHUZH\Qfq\Core\QuickFormQuery; -Path::setCwdToApp(Path::API_TO_APP); - /** * Return JSON encoded answer * @@ -38,6 +36,7 @@ $status = HTTP_400_BAD_REQUEST; try { try { + Path::setMainPaths(Path::API_TO_APP); $qfq = new QuickFormQuery(['bodytext' => '']); $qfq->setting(); diff --git a/extension/Classes/Api/typeahead.php b/extension/Classes/Api/typeahead.php index 36c5c1bc0..af0f5d6df 100644 --- a/extension/Classes/Api/typeahead.php +++ b/extension/Classes/Api/typeahead.php @@ -14,13 +14,12 @@ require_once(__DIR__ . '/../../vendor/autoload.php'); use IMATHUZH\Qfq\Core\Form\TypeAhead; use IMATHUZH\Qfq\Core\Helper\Path; -Path::setCwdToApp(Path::API_TO_APP); - /** * Return JSON encoded answer * */ try { + Path::setMainPaths(Path::API_TO_APP); $typeAhead = new TypeAhead(); $answer = $typeAhead->process(); diff --git a/extension/Classes/Controller/QfqController.php b/extension/Classes/Controller/QfqController.php index 642287eff..d11ea39ca 100644 --- a/extension/Classes/Controller/QfqController.php +++ b/extension/Classes/Controller/QfqController.php @@ -9,6 +9,7 @@ require_once(__DIR__ . '/../../vendor/autoload.php'); use http\Exception; +use IMATHUZH\Qfq\Core\Helper\Path; use IMATHUZH\Qfq\Core\QuickFormQuery; @@ -43,6 +44,7 @@ class QfqController extends \TYPO3\CMS\Extbase\Mvc\Controller\ActionController { $origErrorReporting = error_reporting(); error_reporting($origErrorReporting | E_NOTICE); + Path::setMainPaths(''); $qfq = new QuickFormQuery($contentObject->data); $html = $qfq->process(); $flagOk = true; diff --git a/extension/Classes/Core/Helper/Path.php b/extension/Classes/Core/Helper/Path.php index 0646c1119..07c78e12c 100644 --- a/extension/Classes/Core/Helper/Path.php +++ b/extension/Classes/Core/Helper/Path.php @@ -99,86 +99,51 @@ class Path const APP_TO_SYSTEM_THUMBNAIL_DIR_PUBLIC_DEFAULT = 'typo3temp/qfqThumbnail'; const APP_TO_THUMBNAIL_UNKNOWN_TYPE = 'typo3/sysext/frontend/Resources/Public/Icons/FileIcons/'; - public static function setPaths(string $cwdToApp) + /** + * @param string $cwdToApp + * @throws \CodeException + * @throws \UserFormException + */ + public static function setMainPaths(string $cwdToApp) { self::setCwdToApp($cwdToApp); self::findAndSetProjectPath(); self::findAndSetLogPath(); } - /** - * @param string $newPath - * @return string - */ - public static function setCwdToLog(string $newPath) - { - self::$cwdToLog = $newPath; - } - /** * @return string * @throws \UserFormException - * @throws \CodeException */ public static function cwdToLog(/* path parts to append */): string { - if (is_null(self::$cwdToLog)) { - return self::cwdToProject(self::PROJECT_TO_LOG_DEFAULT); - } - // TODO: findCwdTolog in try, catch exception and add: exception: could not write logs. + self::enforcePathIsSet(self::$cwdToApp); return self::join(self::$cwdToLog, func_get_args()); } - /** - * @param string $newPath - */ - public static function setCwdToApp(string $newPath) - { - self::$cwdToApp = $newPath; - } - /** * @return string * @throws \UserFormException */ public static function cwdToApp(/* path parts to append */): string { + self::enforcePathIsSet(self::$cwdToApp); return self::join(self::$cwdToApp, func_get_args()); } - /** - * @param string $newPath - */ - private static function setAppToProject(string $newPath) - { - self::$appToProject = $newPath; - } - /** * @return string - * @throws \CodeException * @throws \UserFormException */ public static function appToProject(/* path parts to append */): string { - // set path if not set - static $firstRun = true; // protect from recursive call - if (is_null(self::$appToProject)) { - if ($firstRun) { - $firstRun = false; - self::findAndSetProjectPath(); - } else { - Thrower::userFormException('Unexpected recursion.', 'Recursive call of function appToProject(). This should not happen.'); - } - } - + self::enforcePathIsSet(self::$appToProject); return self::join(self::$appToProject, func_get_args()); } /** * @return string * @throws \UserFormException - * @throws \CodeException */ public static function cwdToProject(/* path parts to append */): string { @@ -256,7 +221,31 @@ class Path /////////////////////////////////////////////////// Private ////////////////////////////////////////////////////// /** - * @throws \CodeException + * @param string $newPath + */ + private static function setCwdToApp(string $newPath) + { + self::$cwdToApp = $newPath; + } + + /** + * @param string $newPath + */ + private static function setAppToProject(string $newPath) + { + self::$appToProject = $newPath; + } + + /** + * @param string $newPath + * @return string + */ + private static function setCwdToLog(string $newPath) + { + self::$cwdToLog = $newPath; + } + + /** * @throws \UserFormException */ private static function findAndSetLogPath() @@ -306,7 +295,6 @@ class Path /** * Write the project path configuration file to the project directory. * - * @throws \CodeException * @throws \UserFormException */ private static function writeProjectPathPhp() @@ -329,4 +317,14 @@ return '$appToProject'; // path relative to app directory (i.e. location of this EOF; HelperFile::file_put_contents(self::cwdToApp(PROJECT_PATH_PHP_FILE), $fileContent); } + + /** + * @param $path + * @throws \UserFormException + */ + private static function enforcePathIsSet($path) { + if(is_null($path)) { + Thrower::userFormException('Path accessed before set.', 'Make sure Path::setMainPaths() is called before.'); + } + } } \ No newline at end of file diff --git a/extension/NoT3Page/index.php b/extension/NoT3Page/index.php index 413936d03..d3868026f 100644 --- a/extension/NoT3Page/index.php +++ b/extension/NoT3Page/index.php @@ -38,8 +38,6 @@ use IMATHUZH\Qfq\Core\QuickFormQuery; //// -Path::setCwdToApp('../../../../'); - class User { public $user; public function __construct() @@ -393,6 +391,7 @@ try { $origErrorReporting = error_reporting(); error_reporting($origErrorReporting | E_NOTICE); + Path::setMainPaths('../../../../'); $qfq = new QuickFormQuery($t3data); $html = $qfq->process(); $flagOk = true; -- GitLab From cf4c7b56130ccb15f14d3bfe519f8dda9f2b8c80 Mon Sep 17 00:00:00 2001 From: Marc Egger <marc.egger@uzh.ch> Date: Fri, 28 Aug 2020 15:06:07 +0200 Subject: [PATCH 075/195] Refs #11035 subpress exceptions when rendering inline editor in Exception --- extension/Classes/Core/Exception/AbstractException.php | 8 +++++--- extension/NoT3Page/index.php | 1 + 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/extension/Classes/Core/Exception/AbstractException.php b/extension/Classes/Core/Exception/AbstractException.php index 6c42b6cec..5d36c9516 100644 --- a/extension/Classes/Core/Exception/AbstractException.php +++ b/extension/Classes/Core/Exception/AbstractException.php @@ -171,9 +171,11 @@ class AbstractException extends \Exception { } // Render inline report editor - $arrMerged[ERROR_MESSAGE_TO_DEVELOPER] = QuickFormQuery::buildInlineReport(\UserReportException::$report_uid, - \UserReportException::$report_pathFileName, \UserReportException::$report_bodytext, - \UserReportException::$report_header) . $arrMerged[ERROR_MESSAGE_TO_DEVELOPER]; + try { + $arrMerged[ERROR_MESSAGE_TO_DEVELOPER] = QuickFormQuery::buildInlineReport(\UserReportException::$report_uid, + \UserReportException::$report_pathFileName, \UserReportException::$report_bodytext, + \UserReportException::$report_header) . $arrMerged[ERROR_MESSAGE_TO_DEVELOPER]; + } catch (\Exception $e) {} $htmlDebug = OnArray::arrayToHtmlTable( array_merge($arrForm, $arrMerged), diff --git a/extension/NoT3Page/index.php b/extension/NoT3Page/index.php index d3868026f..0d6640005 100644 --- a/extension/NoT3Page/index.php +++ b/extension/NoT3Page/index.php @@ -23,6 +23,7 @@ use IMATHUZH\Qfq\Core\QuickFormQuery; // TODO: Test if qfq, sql and mail logs still work // TODO: write docstrings for Path.php // TODO: alle error codes raus schmeissen +// TODO: ?CR: AbstractException.php, surround log part with try/catch? // PATH migration // TODO: create filePathToQfqConfig() and replace config references with this -- GitLab From b71577ab3f94cb57dcb67ae06410e164ec2262e6 Mon Sep 17 00:00:00 2001 From: Marc Egger <marc.egger@uzh.ch> Date: Fri, 28 Aug 2020 18:36:42 +0200 Subject: [PATCH 076/195] Refs #11035 replace log paths from store with ones from PATH:: --- extension/Classes/Core/Constants.php | 8 +- extension/Classes/Core/Database/Database.php | 5 +- .../Classes/Core/Database/DatabaseUpdate.php | 4 +- .../Core/Exception/AbstractException.php | 2 +- extension/Classes/Core/File.php | 3 +- extension/Classes/Core/Helper/Path.php | 102 ++++++++++++++++-- extension/Classes/Core/Helper/Support.php | 2 +- extension/Classes/Core/Report/Download.php | 2 +- extension/Classes/Core/Report/Html2Pdf.php | 3 +- extension/Classes/Core/Report/Report.php | 4 +- extension/Classes/Core/Report/SendMail.php | 3 +- extension/Classes/Core/Save.php | 5 +- extension/Classes/Core/Store/Config.php | 10 +- extension/Classes/Core/Store/Store.php | 11 +- extension/NoT3Page/index.php | 16 ++- extension/Tests/Unit/Core/Store/StoreTest.php | 4 +- extension/ext_conf_template.txt | 15 +-- 17 files changed, 149 insertions(+), 50 deletions(-) diff --git a/extension/Classes/Core/Constants.php b/extension/Classes/Core/Constants.php index 9e085a63b..5e2a4059a 100644 --- a/extension/Classes/Core/Constants.php +++ b/extension/Classes/Core/Constants.php @@ -495,11 +495,13 @@ const SYSTEM_DB_NAME_DATA = 'dbNameData'; const SYSTEM_DB_NAME_QFQ = 'dbNameQfq'; const SYSTEM_DB_NAME_T3 = 'dbNameT3'; -const SYSTEM_QFQ_LOG_ABSOLUTE = 'qfqLog'; // Logging to file +const SYSTEM_QFQ_LOG_PATH = 'logPath'; // absolute or relative to app -const SYSTEM_MAIL_LOG_ABSOLUTE = 'mailLog'; +const SYSTEM_QFQ_LOG_PATHFILENAME = 'qfqLog'; // absolute or relative to app -const SYSTEM_SQL_LOG_ABSOLUTE = 'sqlLog'; // Logging to file +const SYSTEM_MAIL_LOG_PATHFILENAME = 'mailLog'; // absolute or relative to app + +const SYSTEM_SQL_LOG_PATHFILENAME = 'sqlLog'; // absolute or relative to app const SYSTEM_SQL_LOG_MODE = 'sqlLogMode'; // Mode, which statements to log. const SYSTEM_SQL_LOG_MODE_AUTOCRON = 'sqlLogModeAutoCron'; // Mode, which statements to log in AutoCron Environments. diff --git a/extension/Classes/Core/Database/Database.php b/extension/Classes/Core/Database/Database.php index a05d64fcd..96cc651a4 100644 --- a/extension/Classes/Core/Database/Database.php +++ b/extension/Classes/Core/Database/Database.php @@ -75,7 +75,7 @@ class Database { $this->store = Store::getInstance(); $storeSystem = $this->store->getStore(STORE_SYSTEM); - $this->sqlLogAbsolute = $storeSystem[SYSTEM_SQL_LOG_ABSOLUTE]; + $this->sqlLogAbsolute = Path::absoluteSqlLogFile(); $dbInit = $storeSystem[SYSTEM_DB_INIT]; $config = $this->getConnectionDetails($dbIndex, $storeSystem); @@ -1041,11 +1041,10 @@ class Database { /** * @return string - * @throws \CodeException * @throws \UserFormException */ public function getQfqLogFile() { - return ($this->store == null) ? Path::cwdToApp(Path::APP_TO_QFQ_LOG_FILE) : $this->store->getVar(SYSTEM_QFQ_LOG_ABSOLUTE, STORE_SYSTEM); + return Path::absoluteQfqLogFile(); } /** diff --git a/extension/Classes/Core/Database/DatabaseUpdate.php b/extension/Classes/Core/Database/DatabaseUpdate.php index e07a1933e..a8408d72b 100644 --- a/extension/Classes/Core/Database/DatabaseUpdate.php +++ b/extension/Classes/Core/Database/DatabaseUpdate.php @@ -294,7 +294,7 @@ class DatabaseUpdate { if ($actionSpecialColumn === ACTION_SPECIAL_COLUMN_DO_REPLACE) { // save log file $message = '<h1>Special column names replaced</h1>The following special column names were replaced.<hr>' . $message; - Logger::logMessage($message, Path::cwdToApp(Path::APP_TO_LOG) . '/' . date("YmdHi") . '_special_columns_auto_update.html'); + Logger::logMessage($message, Path::absoluteLog() . '/' . date("YmdHi") . '_special_columns_auto_update.html'); } elseif ($actionSpecialColumn === ACTION_SPECIAL_COLUMN_DO_SKIP_REPLACE) { // do nothing } else { @@ -306,7 +306,7 @@ class DatabaseUpdate { . 'Click <a href="?' . http_build_query(array_merge($_GET, array(ACTION_SPECIAL_COLUMN_UPDATE => ACTION_SPECIAL_COLUMN_DO_REPLACE))) . '">Auto-Replace</a>' . ' to automatically prepend the found column names with an underscore.' . ' In the report below the missing underscores are marked by "<span style="font-weight: bold; color: red;">>>>_</span>".' - . ' This report will be saved in ' . Path::cwdToApp(Path::APP_TO_LOG) . ' after the automatic replacement.' + . ' This report will be saved in ' . Path::absoluteLog() . ' after the automatic replacement.' . ' <br><br>To update qfq without changing the special columns (your app will probably be broken): ' . '<a href="?' . http_build_query(array_merge($_GET, array(ACTION_SPECIAL_COLUMN_UPDATE => ACTION_SPECIAL_COLUMN_DO_SKIP_REPLACE))) . '">Skip Auto-Replace</a>' . '<h2>Report</h2>' diff --git a/extension/Classes/Core/Exception/AbstractException.php b/extension/Classes/Core/Exception/AbstractException.php index 5d36c9516..3ddfb93d3 100644 --- a/extension/Classes/Core/Exception/AbstractException.php +++ b/extension/Classes/Core/Exception/AbstractException.php @@ -192,7 +192,7 @@ class AbstractException extends \Exception { } } - $qfqLog = ($store == null) ? Path::cwdToApp(Path::APP_TO_QFQ_LOG_FILE) : $store->getVar(SYSTEM_QFQ_LOG_ABSOLUTE, STORE_SYSTEM); + $qfqLog = Path::absoluteQfqLogFile(); $arrDebugHidden[EXCEPTION_STACKTRACE] = PHP_EOL . implode($arrTrace, PHP_EOL); $arrLogAll = array_merge($arrMsg, $arrShow, $arrDebugShow, $arrDebugHidden); $logAll = OnArray::arrayToLog($arrLogAll); diff --git a/extension/Classes/Core/File.php b/extension/Classes/Core/File.php index da0356a8c..1afff25a0 100644 --- a/extension/Classes/Core/File.php +++ b/extension/Classes/Core/File.php @@ -10,6 +10,7 @@ namespace IMATHUZH\Qfq\Core; use IMATHUZH\Qfq\Core\Helper\Logger; +use IMATHUZH\Qfq\Core\Helper\Path; use IMATHUZH\Qfq\Core\Helper\Support; use IMATHUZH\Qfq\Core\Store\Session; use IMATHUZH\Qfq\Core\Store\Store; @@ -47,7 +48,7 @@ class File { $this->session = Session::getInstance($phpUnit); $this->store = Store::getInstance('', $phpUnit); - $this->qfqLogPathFilenameAbsolute = $this->store->getVar(SYSTEM_QFQ_LOG_ABSOLUTE, STORE_SYSTEM); + $this->qfqLogPathFilenameAbsolute = Path::absoluteQfqLogFile(); $this->uploadErrMsg = [ UPLOAD_ERR_INI_SIZE => "The uploaded file exceeds the upload_max_filesize directive in php.ini", diff --git a/extension/Classes/Core/Helper/Path.php b/extension/Classes/Core/Helper/Path.php index 07c78e12c..f025f8ec6 100644 --- a/extension/Classes/Core/Helper/Path.php +++ b/extension/Classes/Core/Helper/Path.php @@ -86,13 +86,14 @@ class Path // Log files private static $cwdToLog = null; // TODO: does it make sense to have it rel to CWD? to broad? - const APP_TO_LOG = 'fileadmin/protected/log'; - const APP_TO_QFQ_LOG_FILE = 'fileadmin/protected/log/qfq.log'; - const APP_TO_MAIL_LOG_FILE = 'fileadmin/protected/log/mail.log'; - const APP_TO_SQL_LOG_FILE = 'fileadmin/protected/log/sql.log'; - + private static $overloadAbsoluteQfqLogFile = null; + private static $overloadAbsoluteMailLogFile = null; + private static $overloadAbsoluteSqlLogFile = null; + private const LOG_TO_QFQ_LOG_FILE_DEFAULT = 'qfq.log'; + private const LOG_TO_MAIL_LOG_FILE_DEFAULT = 'mail.log'; + private const LOG_TO_SQL_LOG_FILE_DEFAULT = 'sql.log'; private const PROJECT_TO_LOG_DEFAULT = 'log'; - private const APP_TO_DEPRECATED_LOG = 'fileadmin/protected/log'; + private const APP_TO_LOG_DEPRECATED = 'fileadmin/protected/log'; // Thumbnail const APP_TO_SYSTEM_THUMBNAIL_DIR_SECURE_DEFAULT = 'fileadmin/protected/qfqThumbnail'; @@ -111,6 +112,51 @@ class Path self::findAndSetLogPath(); } + /** + * @return string + * @throws \UserFormException + */ + public static function absoluteLog(/* path parts to append */): string + { + return realpath(self::cwdToLog(func_get_args())); + } + + /** + * @return string + * @throws \UserFormException + */ + public static function absoluteSqlLogFile(): string + { + if (is_null(self::$overloadAbsoluteSqlLogFile)) { + return self::absoluteLog(self::LOG_TO_SQL_LOG_FILE_DEFAULT); + } + return self::$overloadAbsoluteSqlLogFile; + } + + /** + * @return string + * @throws \UserFormException + */ + public static function absoluteQfqLogFile(): string + { + if (is_null(self::$overloadAbsoluteQfqLogFile)) { + return self::absoluteLog(self::LOG_TO_QFQ_LOG_FILE_DEFAULT); + } + return self::$overloadAbsoluteQfqLogFile; + } + + /** + * @return string + * @throws \UserFormException + */ + public static function absoluteMailLogFile(): string + { + if (is_null(self::$overloadAbsoluteMailLogFile)) { + return self::absoluteLog(self::LOG_TO_MAIL_LOG_FILE_DEFAULT); + } + return self::$overloadAbsoluteMailLogFile; + } + /** * @return string * @throws \UserFormException @@ -177,6 +223,36 @@ class Path return self::cwdToExt(self::extToApi(func_get_args())); } + /** + * @param string $newPath + * @throws \UserFormException + */ + public static function setAbsoluteSqlLogFile(string $newPath) + { + self::enforcePathIsAbsolute($newPath); + self::$overloadAbsoluteSqlLogFile = $newPath; + } + + /** + * @param string $newPath + * @throws \UserFormException + */ + public static function setAbsoluteQfqLogFile(string $newPath) + { + self::enforcePathIsAbsolute($newPath); + self::$overloadAbsoluteQfqLogFile = $newPath; + } + + /** + * @param string $newPath + * @throws \UserFormException + */ + public static function setAbsoluteMailLogFile(string $newPath) + { + self::enforcePathIsAbsolute($newPath); + self::$overloadAbsoluteMailLogFile = $newPath; + } + /** * Join the arguments together as a path. * The second argument may be an array of parts. (further arguments are ignored in that case) @@ -256,8 +332,8 @@ class Path self::setCwdToLog($cwdToLog); // search log dir in fileadmin/protected - } elseif (file_exists(self::cwdToApp(self::APP_TO_DEPRECATED_LOG))) { - self::setCwdToLog(self::cwdToApp(self::APP_TO_DEPRECATED_LOG)); + } elseif (file_exists(self::cwdToApp(self::APP_TO_LOG_DEPRECATED))) { + self::setCwdToLog(self::cwdToApp(self::APP_TO_LOG_DEPRECATED)); // create default log dir } else { @@ -327,4 +403,14 @@ EOF; Thrower::userFormException('Path accessed before set.', 'Make sure Path::setMainPaths() is called before.'); } } + + /** + * @param $path + * @throws \UserFormException + */ + private static function enforcePathIsAbsolute($path) { + if($path[0] !== '/') { + Thrower::userFormException('Path is not absolute', "Path does not start with '/' : $path"); + } + } } \ No newline at end of file diff --git a/extension/Classes/Core/Helper/Support.php b/extension/Classes/Core/Helper/Support.php index 624de71c3..9afd21f9d 100644 --- a/extension/Classes/Core/Helper/Support.php +++ b/extension/Classes/Core/Helper/Support.php @@ -123,7 +123,7 @@ class Support { throw new \CodeException('Unknown mode: ' . $formLogMode, ERROR_UNKNOWN_TOKEN); } - $filename = Path::cwdToApp(Path::APP_TO_LOG) . '/' . $formName . "." . $perBeSession . "log"; + $filename = Path::absoluteLog() . '/' . $formName . "." . $perBeSession . "log"; return sanitize::safeFilename($filename, false, true); } diff --git a/extension/Classes/Core/Report/Download.php b/extension/Classes/Core/Report/Download.php index 9c13511c0..ab5125ac3 100644 --- a/extension/Classes/Core/Report/Download.php +++ b/extension/Classes/Core/Report/Download.php @@ -104,7 +104,7 @@ class Download { $this->pdfunite = $this->store->getVar(SYSTEM_CMD_PDFUNITE, STORE_SYSTEM); if (Support::findInSet(SYSTEM_SHOW_DEBUG_INFO_DOWNLOAD, $this->store->getVar(SYSTEM_SHOW_DEBUG_INFO, STORE_SYSTEM))) { - $this->downloadDebugLogAbsolute = $this->store->getVar(SYSTEM_SQL_LOG_ABSOLUTE, STORE_SYSTEM); + $this->downloadDebugLogAbsolute = Path::absoluteSqlLogFile(); } } diff --git a/extension/Classes/Core/Report/Html2Pdf.php b/extension/Classes/Core/Report/Html2Pdf.php index 58207471a..304d3c170 100644 --- a/extension/Classes/Core/Report/Html2Pdf.php +++ b/extension/Classes/Core/Report/Html2Pdf.php @@ -15,6 +15,7 @@ namespace IMATHUZH\Qfq\Core\Report; use IMATHUZH\Qfq\Core\Helper\HelperFile; use IMATHUZH\Qfq\Core\Helper\OnArray; use IMATHUZH\Qfq\Core\Helper\OnString; +use IMATHUZH\Qfq\Core\Helper\Path; use IMATHUZH\Qfq\Core\Helper\Support; use IMATHUZH\Qfq\Core\Store\Config; use IMATHUZH\Qfq\Core\Store\Session; @@ -86,7 +87,7 @@ class Html2Pdf { $this->sessionCookie = new SessionCookie($config); $this->sip = new Sip($phpUnit); - $this->logFilePathAbsolute = $config[SYSTEM_QFQ_LOG_ABSOLUTE]; + $this->logFilePathAbsolute = Path::absoluteQfqLogFile(); } /** diff --git a/extension/Classes/Core/Report/Report.php b/extension/Classes/Core/Report/Report.php index 49d05d7cf..33a7f8691 100644 --- a/extension/Classes/Core/Report/Report.php +++ b/extension/Classes/Core/Report/Report.php @@ -193,8 +193,8 @@ class Report { $sqlLog = $this->store->getVar(TYPO3_SQL_LOG_ABSOLUTE, STORE_TYPO3); if (false !== $sqlLog) { - $sqlLog = HelperFile::joinPathFilename($this->store->getVar(SYSTEM_SITE_PATH_ABSOLUTE, STORE_SYSTEM), $sqlLog); - $this->store->setVar(SYSTEM_SQL_LOG_ABSOLUTE, $sqlLog, STORE_SYSTEM); + $sqlLogAbsolute = HelperFile::joinPathFilename(realpath(Path::cwdToApp()), $sqlLog); + Path::setAbsoluteSqlLogFile($sqlLogAbsolute); } $sqlLogMode = $this->store->getVar(TYPO3_SQL_LOG_MODE, STORE_TYPO3); diff --git a/extension/Classes/Core/Report/SendMail.php b/extension/Classes/Core/Report/SendMail.php index 9b200bda1..1ed506372 100644 --- a/extension/Classes/Core/Report/SendMail.php +++ b/extension/Classes/Core/Report/SendMail.php @@ -5,6 +5,7 @@ namespace IMATHUZH\Qfq\Core\Report; use IMATHUZH\Qfq\Core\Database\Database; use IMATHUZH\Qfq\Core\Helper\OnArray; +use IMATHUZH\Qfq\Core\Helper\Path; use IMATHUZH\Qfq\Core\Store\Store; use IMATHUZH\Qfq\Core\Helper\Sanitize; use IMATHUZH\Qfq\Core\Helper\HelperFile; @@ -170,7 +171,7 @@ class SendMail { $args[] = '-t "' . $mailConfig[SENDMAIL_TOKEN_RECEIVER] . '"'; $args[] = '-o message-charset="utf-8"'; - $logFilePathAbsolute = $this->store->getVar(SYSTEM_MAIL_LOG_ABSOLUTE, STORE_SYSTEM); + $logFilePathAbsolute = Path::absoluteMailLogFile(); if ($logFilePathAbsolute != '' && $logFilePathAbsolute !== false) { $args[] = '-l "' . $logFilePathAbsolute . '"'; } diff --git a/extension/Classes/Core/Save.php b/extension/Classes/Core/Save.php index f55f4e855..d753b4348 100644 --- a/extension/Classes/Core/Save.php +++ b/extension/Classes/Core/Save.php @@ -15,6 +15,7 @@ use IMATHUZH\Qfq\Core\Helper\HelperFormElement; use IMATHUZH\Qfq\Core\Helper\KeyValueStringParser; use IMATHUZH\Qfq\Core\Helper\Logger; use IMATHUZH\Qfq\Core\Helper\OnArray; +use IMATHUZH\Qfq\Core\Helper\Path; use IMATHUZH\Qfq\Core\Helper\Sanitize; use IMATHUZH\Qfq\Core\Helper\SqlQuery; use IMATHUZH\Qfq\Core\Helper\Support; @@ -73,9 +74,7 @@ class Save { $this->evaluate = new Evaluate($this->store, $this->db); $this->formAction = new FormAction($formSpec, $this->db); - $this->qfqLogFilename = HelperFile::joinPathFilename( // Will only join if second part does not start with '/' - $this->store->getVar(SYSTEM_SITE_PATH_ABSOLUTE, STORE_SYSTEM), - $this->store->getVar(SYSTEM_QFQ_LOG_ABSOLUTE, STORE_SYSTEM)); + $this->qfqLogFilename = Path::absoluteQfqLogFile(); } /** diff --git a/extension/Classes/Core/Store/Config.php b/extension/Classes/Core/Store/Config.php index a573c48e1..da622884a 100644 --- a/extension/Classes/Core/Store/Config.php +++ b/extension/Classes/Core/Store/Config.php @@ -274,8 +274,7 @@ class Config { $config = self::readConfig(); } - Logger::logMessage(Logger::linePre() . 'Security: attack detected' . PHP_EOL . $reason, - $config[SYSTEM_QFQ_LOG_ABSOLUTE] ?? Path::cwdToApp(Path::APP_TO_QFQ_LOG_FILE)); + Logger::logMessage(Logger::linePre() . 'Security: attack detected' . PHP_EOL . $reason, Path::absoluteQfqLogFile()); // In case of an attack: log out the current user. Session::destroy(); @@ -323,9 +322,10 @@ class Config { SYSTEM_RENDER => SYSTEM_RENDER_SINGLE, SYSTEM_DATE_FORMAT => 'yyyy-mm-dd', SYSTEM_SHOW_DEBUG_INFO => SYSTEM_SHOW_DEBUG_INFO_AUTO, - SYSTEM_MAIL_LOG_ABSOLUTE => Path::APP_TO_MAIL_LOG_FILE, // Will be made absolute automatically by Store->adjustConfig() - SYSTEM_QFQ_LOG_ABSOLUTE => Path::APP_TO_QFQ_LOG_FILE, // Will be made absolute automatically by Store->adjustConfig() - SYSTEM_SQL_LOG_ABSOLUTE => Path::APP_TO_SQL_LOG_FILE, // Will be made absolute automatically by Store->adjustConfig() + SYSTEM_QFQ_LOG_PATH => '', + SYSTEM_MAIL_LOG_PATHFILENAME => '', + SYSTEM_QFQ_LOG_PATHFILENAME => '', + SYSTEM_SQL_LOG_PATHFILENAME => '', SYSTEM_SQL_LOG_MODE => 'modify', SYSTEM_SQL_LOG_MODE_AUTOCRON => 'error', F_BS_COLUMNS => 'col-md-12 col-lg-10', diff --git a/extension/Classes/Core/Store/Store.php b/extension/Classes/Core/Store/Store.php index 257d30ed9..15885eb3e 100644 --- a/extension/Classes/Core/Store/Store.php +++ b/extension/Classes/Core/Store/Store.php @@ -296,13 +296,6 @@ class Store { $config[SYSTEM_SEND_E_MAIL_ABSOLUTE] = $config[SYSTEM_EXT_PATH_ABSOLUTE] . '/Classes/External/sendEmail'; - // Make path absolute - foreach ([SYSTEM_MAIL_LOG_ABSOLUTE, SYSTEM_QFQ_LOG_ABSOLUTE, SYSTEM_SQL_LOG_ABSOLUTE] AS $key) { - if (!empty($config[$key]) && $config[$key][0] != '/') { - $config[$key] = HelperFile::joinPathFilename($config[SYSTEM_SITE_PATH_ABSOLUTE], $config[$key]); - } - } - // In case the database credentials are given in the old style: copy them to the new style if (!isset($config[SYSTEM_DB_1_USER]) && isset($config[SYSTEM_DB_USER])) { $config[SYSTEM_DB_1_USER] = $config[SYSTEM_DB_USER]; @@ -354,7 +347,7 @@ class Store { private static function checkMandatoryParameter(array $config) { // Check mandatory config vars. - $names = array_merge([SYSTEM_SQL_LOG_ABSOLUTE, SYSTEM_SQL_LOG_MODE], + $names = array_merge([SYSTEM_SQL_LOG_PATHFILENAME, SYSTEM_SQL_LOG_MODE], self::dbCredentialName($config[SYSTEM_DB_INDEX_DATA]), self::dbCredentialName($config[SYSTEM_DB_INDEX_QFQ])); @@ -640,7 +633,7 @@ class Store { // Switch FeUser: log this to qfq.log if ($storeName === STORE_USER && $key == TYPO3_FE_USER) { - $qfqLogPathAbsolute = self::getVar(SYSTEM_QFQ_LOG_ABSOLUTE, STORE_SYSTEM); + $qfqLogPathAbsolute = Path::absoluteQfqLogFile(); $feUserOld = isset($data[$key]) ? $data[$key] : self::getVar($key, STORE_TYPO3 . STORE_EMPTY); Logger::logMessage(date('Y.m.d H:i:s ') . ": Switch feUser '$feUserOld' to '$value'", $qfqLogPathAbsolute); } diff --git a/extension/NoT3Page/index.php b/extension/NoT3Page/index.php index 0d6640005..663327993 100644 --- a/extension/NoT3Page/index.php +++ b/extension/NoT3Page/index.php @@ -10,7 +10,14 @@ use http\Exception; use IMATHUZH\Qfq\Core\Helper\Path; use IMATHUZH\Qfq\Core\QuickFormQuery; - +// TODO: replace my own sanitize function with Sanitize::safeFilename + +// TODO: define bootstrap function which sets paths and reads config + // TODO: set log + qfq,mail,sql log paths if they are set in config (use empty()) ATTENTION: input might be absolute or relatvie to app +// TODO: after adjusting log paths make sure that SYSTEM_QFQ_LOG_ABSOLUTE usw. are not used anywhere + SYSTEM_EXT_PATH_ABSOLUTE + SYSTEM_SEND_E_MAIL_ABSOLUTE +// TODO: read config before setting log path and read path vars from config when setting. SYSTEM_QFQ_LOG_ABSOLUTE usw. +// TODO: check all cwdToLog() uses. should it not be absolute paths? +// TODO: remove all config related code from Store // TODO: set setAppRelToCwd() in every api file. // TODO: Replace all calls to T3Handler::... and Store/T3Info.php with abstraction // TODO: AS _pagee macht link auf .../index.php . entweder datei umbenennen oder link klasse aendern @@ -29,11 +36,18 @@ use IMATHUZH\Qfq\Core\QuickFormQuery; // TODO: create filePathToQfqConfig() and replace config references with this // TODO: replace all paths with typo3conf/ (usw.) and /../ and fileadmin/ with correct path computing function. // TODO: Compare Support::joinPath with Path::join +// TODO: go through all variables/keywords that can be set by user in docs.qfq.io + +// Config out of store +// TODO: follow every SYSTEM variable an replace store call with Config getter // Testing // TODO: Fix Unittests // TODO: test if Logger::makePathAbsolute() actually still does what it should (I have changed it) +// Changenotes +// TODO: add breaking change: if sql/qfq/mail log paths were set in Typo3, this info will be lost. + // Misc. // TODO: TablesorterController.js: pass API url as data attribute instead of hardcode (this.tablesorterApiUrl = 'typo3conf/ext/qfq/Classes/Api/setting.php';) diff --git a/extension/Tests/Unit/Core/Store/StoreTest.php b/extension/Tests/Unit/Core/Store/StoreTest.php index 090b25d15..4657f3968 100644 --- a/extension/Tests/Unit/Core/Store/StoreTest.php +++ b/extension/Tests/Unit/Core/Store/StoreTest.php @@ -443,8 +443,8 @@ class StoreTest extends TestCase { $config = $this->store->getStore(STORE_SYSTEM); # The following won't be checked by content, cause they will change on different installations. - foreach ([SYSTEM_SITE_PATH_ABSOLUTE, SYSTEM_EXT_PATH_ABSOLUTE, SYSTEM_SEND_E_MAIL_ABSOLUTE, SYSTEM_SESSION_TIMEOUT_SECONDS, SYSTEM_QFQ_LOG_ABSOLUTE, - SYSTEM_SQL_LOG_ABSOLUTE, SYSTEM_MAIL_LOG_ABSOLUTE, SYSTEM_FILE_MAX_FILE_SIZE] as $key) { + foreach ([SYSTEM_SITE_PATH_ABSOLUTE, SYSTEM_EXT_PATH_ABSOLUTE, SYSTEM_SEND_E_MAIL_ABSOLUTE, SYSTEM_SESSION_TIMEOUT_SECONDS, SYSTEM_QFQ_LOG_PATHFILENAME, + SYSTEM_SQL_LOG_PATHFILENAME, SYSTEM_MAIL_LOG_PATHFILENAME, SYSTEM_FILE_MAX_FILE_SIZE] as $key) { $this->assertTrue(isset($config[$key]), "Missing default value for '$key' "); unset ($config[$key]); } diff --git a/extension/ext_conf_template.txt b/extension/ext_conf_template.txt index 979b6616d..322c1261b 100644 --- a/extension/ext_conf_template.txt +++ b/extension/ext_conf_template.txt @@ -80,14 +80,17 @@ sqlLogMode = modify # cat=debug/sql; type=string; label=SQL log mode for AutoCron:Default is 'error'. Modes see 'sqlLogMode'. sqlLogModeAutoCron = error -# cat=debug/sql; type=string; label=SQL log file:Default is 'fileadmin/protected/log/sql.log'. A logfile of fired SQL statements. PathFile is absolute or relative to '<site path>'. -sqlLog = fileadmin/protected/log/sql.log +# cat=debug/sql; type=string; label=log directory:Default is '<qfq project path>/log'. Contains all log files. Path is absolute or relative to '<site path>'. +logPath = -# cat=debug/qfq; type=string; label=QFQ log file:Default is 'fileadmin/protected/log/qfq.log'. A logfile of fired SQL statements. PathFile is absolute or relative to '<site path>'. -qfqLog = fileadmin/protected/log/qfq.log +# cat=debug/sql; type=string; label=SQL log file:By default in log directory. A logfile of fired SQL statements. PathFile is absolute or relative to '<site path>'. +sqlLog = -# cat=debug/mail; type=string; label=Mail log file:Default is 'fileadmin/protected/log/mail.log'. A logfile of sent mail. PathFile is absolute or relative to '<site path>'. -mailLog = fileadmin/protected/log/mail.log +# cat=debug/qfq; type=string; label=QFQ log file:By default in log directory. A logfile of fired SQL statements. PathFile is absolute or relative to '<site path>'. +qfqLog = + +# cat=debug/mail; type=string; label=Mail log file:By default in log directory. A logfile of sent mail. PathFile is absolute or relative to '<site path>'. +mailLog = # cat=debug/info; type=string; label=Show debug info:Default is 'auto'. Possible values: [yes|no|auto][,download]. For 'auto': If a BE User is logged in, a debug information will be shown on the FE. showDebugInfo = auto -- GitLab From 606a14e84983ab955dd6f9d0e97a47f6e1e590d1 Mon Sep 17 00:00:00 2001 From: Marc Egger <marc.egger@uzh.ch> Date: Mon, 31 Aug 2020 11:11:52 +0200 Subject: [PATCH 077/195] Refs #11035 remove my own filename sanitization function --- extension/Classes/Core/Helper/HelperFile.php | 16 ---------------- extension/Classes/Core/Report/ReportAsFile.php | 5 +++-- 2 files changed, 3 insertions(+), 18 deletions(-) diff --git a/extension/Classes/Core/Helper/HelperFile.php b/extension/Classes/Core/Helper/HelperFile.php index eabc25c6b..b5ef5fca1 100644 --- a/extension/Classes/Core/Helper/HelperFile.php +++ b/extension/Classes/Core/Helper/HelperFile.php @@ -527,22 +527,6 @@ class HelperFile { return preg_match('/^([-\.\w]+)$/', $fileName) > 0; } - /** - * Remove non-alphanumeric characters and replace them with - - * - * @param $string - * @return string - */ - public static function sanitizeFileName($string) // : ?string - { - $res = strtolower(trim(preg_replace('/[^A-Za-z0-9-]+/', '-', $string), '-')); - $res = preg_replace('~-+~', '-', $res); - if (empty($res)) { - return null; - } - return $res; - } - /** * Creates the given path if it does not exist. * diff --git a/extension/Classes/Core/Report/ReportAsFile.php b/extension/Classes/Core/Report/ReportAsFile.php index 58359a8f2..893fa2b78 100644 --- a/extension/Classes/Core/Report/ReportAsFile.php +++ b/extension/Classes/Core/Report/ReportAsFile.php @@ -13,6 +13,7 @@ namespace IMATHUZH\Qfq\Core\Report; use IMATHUZH\Qfq\Core\Database\Database; use IMATHUZH\Qfq\Core\Helper\HelperFile; use IMATHUZH\Qfq\Core\Helper\Path; +use IMATHUZH\Qfq\Core\Helper\Sanitize; use IMATHUZH\Qfq\Core\Store\Store; class ReportAsFile @@ -85,7 +86,7 @@ class ReportAsFile $page = $databaseT3->sql($sql, ROW_EXPECT_1, [$pid], "Typo3 page not found. Uid: $pid"); $supDir = $page['alias'] !== '' ? $page['alias'] : $page['title']; - $reportPath = HelperFile::joinPathFilename(HelperFile::sanitizeFileName($supDir), $reportPath); + $reportPath = HelperFile::joinPathFilename(Sanitize::safeFilename($supDir), $reportPath); $pid = $page['pid']; if (strlen($reportPath) > 4096) { // Throw exception in case of infinite loop. @@ -101,7 +102,7 @@ class ReportAsFile HelperFile::createPathRecursive($reportPathFull); // add filename - $fileName = HelperFile::sanitizeFileName($ttContent['header']); + $fileName = Sanitize::safeFilename($ttContent['header']); if ($fileName === null) { $fileName = strval($uid); } -- GitLab From d5b53418ead2f910a615bc0bc54a13d23ca8108a Mon Sep 17 00:00:00 2001 From: Marc Egger <marc.egger@uzh.ch> Date: Tue, 1 Sep 2020 15:05:57 +0200 Subject: [PATCH 078/195] Refs #11035 fix bug if ttContent has empty header. Introduced in last commit. --- extension/Classes/Core/Helper/Sanitize.php | 7 ++++++- extension/Classes/Core/Report/ReportAsFile.php | 2 +- 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/extension/Classes/Core/Helper/Sanitize.php b/extension/Classes/Core/Helper/Sanitize.php index 911fa9a29..387123fc7 100644 --- a/extension/Classes/Core/Helper/Sanitize.php +++ b/extension/Classes/Core/Helper/Sanitize.php @@ -222,7 +222,12 @@ class Sanitize { $filename = basename($filename); } - return preg_replace($search, $replace, $filename); + $res = preg_replace($search, $replace, $filename); + + // remove multiple consecutive '-' + $res = preg_replace('~-+~', '-', $res); + + return $res; } // safeFilename() /** diff --git a/extension/Classes/Core/Report/ReportAsFile.php b/extension/Classes/Core/Report/ReportAsFile.php index 893fa2b78..ddfe0f7c8 100644 --- a/extension/Classes/Core/Report/ReportAsFile.php +++ b/extension/Classes/Core/Report/ReportAsFile.php @@ -103,7 +103,7 @@ class ReportAsFile // add filename $fileName = Sanitize::safeFilename($ttContent['header']); - if ($fileName === null) { + if (empty($fileName)) { $fileName = strval($uid); } $reportPathFileNameFull = HelperFile::joinPathFilename($reportPathFull, $fileName) . REPORT_FILE_EXTENSION; -- GitLab From 0aa47d34bcf7c5c3b054ad7e0abd9f024be6b270 Mon Sep 17 00:00:00 2001 From: Marc Egger <marc.egger@uzh.ch> Date: Tue, 1 Sep 2020 15:35:43 +0200 Subject: [PATCH 079/195] Refs #11035 AbstractException.php: also catch Errors during report editor rendering --- extension/Classes/Core/Exception/AbstractException.php | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/extension/Classes/Core/Exception/AbstractException.php b/extension/Classes/Core/Exception/AbstractException.php index 3ddfb93d3..4626f6299 100644 --- a/extension/Classes/Core/Exception/AbstractException.php +++ b/extension/Classes/Core/Exception/AbstractException.php @@ -175,7 +175,9 @@ class AbstractException extends \Exception { $arrMerged[ERROR_MESSAGE_TO_DEVELOPER] = QuickFormQuery::buildInlineReport(\UserReportException::$report_uid, \UserReportException::$report_pathFileName, \UserReportException::$report_bodytext, \UserReportException::$report_header) . $arrMerged[ERROR_MESSAGE_TO_DEVELOPER]; - } catch (\Exception $e) {} + } catch (\Error | \Exception $e) { + $arrMerged[ERROR_MESSAGE_TO_DEVELOPER] .= "<br>(inline report editor not available)"; + } $htmlDebug = OnArray::arrayToHtmlTable( array_merge($arrForm, $arrMerged), -- GitLab From 64db22fae9418e0572825c196df075f0db143175 Mon Sep 17 00:00:00 2001 From: Marc Egger <marc.egger@uzh.ch> Date: Tue, 1 Sep 2020 18:46:40 +0200 Subject: [PATCH 080/195] Refs #11035 get selenium running locally and start to clean up --- docker/run_selenium_tests_local.sh | 113 +++++------------- extension/Classes/Core/Helper/Sanitize.php | 4 +- extension/NoT3Page/index.php | 5 +- extension/Tests/selenium/qfqselenium.py | 55 ++++++--- .../selenium/test_basic_functionality.py | 94 +++------------ 5 files changed, 90 insertions(+), 181 deletions(-) diff --git a/docker/run_selenium_tests_local.sh b/docker/run_selenium_tests_local.sh index df9419d04..3ba7cbc48 100755 --- a/docker/run_selenium_tests_local.sh +++ b/docker/run_selenium_tests_local.sh @@ -2,119 +2,68 @@ source run_qfq_docker.output -# this function prints a separator -function print_separator { - # prints the separator - echo -e "----------------------------------------------------------------------" -} - -# prints the starting separator -print_separator - -# checks that a file named geckodriver doesn't already exist -if [ ! -f "geckodriver" ]; then - # stores the current version of the driver - gecko_version=$(curl --silent "https://api.github.com/repos/mozilla/geckodriver/releases/latest" | grep -Po '"tag_name": "\K.*?(?=")') &> /dev/null - # downloads the geckodriver from github - wget -O /tmp/geckodriver.tar.gz https://github.com/mozilla/geckodriver/releases/download/${gecko_version}/geckodriver-${gecko_version}-linux64.tar.gz &> /dev/null - # unzips the downloaded geckodriver - tar xzf /tmp/geckodriver.tar.gz geckodriver &> /dev/null - # makes the geckodriver executable - chmod +x geckodriver &> /dev/null - # prints a success output - echo -e "Successfully downloaded geckodriver" -fi +SELENIUM_URL=$1 # url to test from the input variable +ENGINE=$2 # engine (gecko/chrome) to use. default "chrome" +HEADLESS=$3 # run tests without opening browser GUI. (yes/no, default "no") +SLOWDOWN=$4 # add a pause in seconds after each selenium action (default 0) -# checks that a file named chromedriver doesn't already exist -if [ ! -f "chromedriver" ]; then - # downloads the newest version of the chromedriver from google - wget -O /tmp/chromedriver.zip http://chromedriver.storage.googleapis.com/`curl -sS chromedriver.storage.googleapis.com/LATEST_RELEASE`/chromedriver_linux64.zip &> /dev/null - # unzips the downloaded chromedriver - unzip /tmp/chromedriver.zip chromedriver &> /dev/null - # makes the chromedriver executable - chmod +x chromedriver &> /dev/null - # prints a success output - echo -e "Successfully downloaded chromedriver" -fi - -# reads the url to test from the input variable -SELENIUM_URL=$1 - -# checks if the selenium url is not given +# Set default URL if [ -z $SELENIUM_URL ]; then SELENIUM_URL="http://127.0.0.1:${T3_PORT}" fi +export SELENIUM_URL=$SELENIUM_URL # make URL accessible to selenium script -# defines the url to be used during testing -export SELENIUM_URL=$SELENIUM_URL - -# stores the default engine +# set engine and driver DEFAULT_ENGINE="chrome" -# reads the engine from the 2nd input variable -ENGINE=$2 - -# checks if an engine is not specified if [ -z $ENGINE ]; then - # defines the default engine to use during tests export SELENIUM_BROWSER=$DEFAULT_ENGINE - # defines the path to the drivers of the engine export SELENIUM_DRIVER_PATH="${PWD}/${DEFAULT_ENGINE}driver" else - # defines the engine to use during tests export SELENIUM_BROWSER=$ENGINE - # defines the path to the drivers of the engine export SELENIUM_DRIVER_PATH="${PWD}/${ENGINE}driver" fi -# stores the default headless option +# set headless DEFAULT_HEADLESS="no" -# reads the headless option from the 3rd input variable -HEADLESS=$3 - -# checks if the headless parameter is not specified if [ -z $HEADLESS ]; then - # defines if the browser gui should open export SELENIUM_HEADLESS=$DEFAULT_HEADLESS else - # defines if the browser gui should open export SELENIUM_HEADLESS=$HEADLESS fi -# stores the default slowdown +# set slowdown DEFAULT_SLOWDOWN="0" -# reads the slowdown from the 4th input variable -SLOWDOWN=$4 - -# checks if the slowdown parameter is not specified if [ -z $SLOWDOWN ]; then - # defines what slowdown should be applied export SELENIUM_SLOWDOWN=$DEFAULT_SLOWDOWN else - # defines what slowdown should be applied export SELENIUM_SLOWDOWN=$SLOWDOWN fi -cd ../extension/Tests/selenium - -# prints running tests -echo -e -n "Running tests: " +function print_separator { + echo -e "----------------------------------------------------------------------" +} +print_separator -# runs the python tests -python3 -W ignore -m unittest discover +# download geckodriver (Firefox) +if [ ! -f "geckodriver" ]; then + gecko_version=$(curl --silent "https://api.github.com/repos/mozilla/geckodriver/releases/latest" | grep -Po '"tag_name": "\K.*?(?=")') &> /dev/null + wget -O /tmp/geckodriver.tar.gz https://github.com/mozilla/geckodriver/releases/download/${gecko_version}/geckodriver-${gecko_version}-linux64.tar.gz &> /dev/null + tar xzf /tmp/geckodriver.tar.gz geckodriver &> /dev/null + chmod +x geckodriver &> /dev/null + echo -e "Successfully downloaded geckodriver" +fi -# checks if the tests were successful -if [ $? -eq 0 ]; then - print_separator - # prints a success message - echo -e "Successfully tested ${SELENIUM_URL}" -else - print_separator - # prints a success message - echo -e "Failed while testing ${SELENIUM_URL}" +# download chromedriver (Chrome) +if [ ! -f "chromedriver" ]; then + wget -O /tmp/chromedriver.zip http://chromedriver.storage.googleapis.com/`curl -sS chromedriver.storage.googleapis.com/LATEST_RELEASE`/chromedriver_linux64.zip &> /dev/null + unzip /tmp/chromedriver.zip chromedriver &> /dev/null + chmod +x chromedriver &> /dev/null + echo -e "Successfully downloaded chromedriver" fi -# prints the trailing separator -print_separator +# run tests +cd ../extension/Tests/selenium +echo -e -n "Running tests: " +python3 -W ignore -m unittest discover -# exits the program exit 0 diff --git a/extension/Classes/Core/Helper/Sanitize.php b/extension/Classes/Core/Helper/Sanitize.php index 387123fc7..5c75858c0 100644 --- a/extension/Classes/Core/Helper/Sanitize.php +++ b/extension/Classes/Core/Helper/Sanitize.php @@ -224,8 +224,8 @@ class Sanitize { $res = preg_replace($search, $replace, $filename); - // remove multiple consecutive '-' - $res = preg_replace('~-+~', '-', $res); + // remove multiple consecutive '_' + $res = preg_replace('~_+~', '_', $res); return $res; } // safeFilename() diff --git a/extension/NoT3Page/index.php b/extension/NoT3Page/index.php index 663327993..c89c6c744 100644 --- a/extension/NoT3Page/index.php +++ b/extension/NoT3Page/index.php @@ -10,10 +10,10 @@ use http\Exception; use IMATHUZH\Qfq\Core\Helper\Path; use IMATHUZH\Qfq\Core\QuickFormQuery; -// TODO: replace my own sanitize function with Sanitize::safeFilename // TODO: define bootstrap function which sets paths and reads config // TODO: set log + qfq,mail,sql log paths if they are set in config (use empty()) ATTENTION: input might be absolute or relatvie to app +// TODO: MAKE SELENIUM // TODO: after adjusting log paths make sure that SYSTEM_QFQ_LOG_ABSOLUTE usw. are not used anywhere + SYSTEM_EXT_PATH_ABSOLUTE + SYSTEM_SEND_E_MAIL_ABSOLUTE // TODO: read config before setting log path and read path vars from config when setting. SYSTEM_QFQ_LOG_ABSOLUTE usw. // TODO: check all cwdToLog() uses. should it not be absolute paths? @@ -407,6 +407,7 @@ try { error_reporting($origErrorReporting | E_NOTICE); Path::setMainPaths('../../../../'); + $t3data["bodytext"] = "file=home/two/qfq-perdasdson.qfqr"; $qfq = new QuickFormQuery($t3data); $html = $qfq->process(); $flagOk = true; @@ -429,7 +430,7 @@ try { } catch (\DownloadException $e) { $html = $e->formatMessage(); -} catch (Exception $e) { +} catch (\Error | \Exception $e) { $html = "Generic Exception: " . $e->getMessage(); } diff --git a/extension/Tests/selenium/qfqselenium.py b/extension/Tests/selenium/qfqselenium.py index ea3a1d89d..e4d3607f8 100644 --- a/extension/Tests/selenium/qfqselenium.py +++ b/extension/Tests/selenium/qfqselenium.py @@ -56,6 +56,12 @@ class QfqSeleniumTestCase(unittest.TestCase): executed by unittest once before any tests are executed. """ + # set browser path + if cls.SELENIUM_BROWSER == cls.chrome_browser_name: + cls.SELENIUM_DRIVER_PATH = cls.chrome_driver_path + elif cls.SELENIUM_BROWSER == cls.gecko_browser_name: + cls.SELENIUM_DRIVER_PATH = cls.gecko_driver_path + # reads the environment variables cls.SELENIUM_BROWSER = os.environ.get('SELENIUM_BROWSER', cls.SELENIUM_BROWSER) cls.SELENIUM_DRIVER_PATH = os.environ.get('SELENIUM_DRIVER_PATH', cls.SELENIUM_DRIVER_PATH) @@ -64,12 +70,6 @@ class QfqSeleniumTestCase(unittest.TestCase): cls.SELENIUM_URL = os.environ.get('SELENIUM_URL', cls.SELENIUM_URL) cls.SELENIUM_SLOWDOWN = float(os.environ.get('SELENIUM_SLOWDOWN', cls.SELENIUM_SLOWDOWN)) - # set browser path - if cls.SELENIUM_BROWSER == cls.chrome_browser_name: - cls.SELENIUM_DRIVER_PATH = cls.chrome_driver_path - elif cls.SELENIUM_BROWSER == cls.gecko_browser_name: - cls.SELENIUM_DRIVER_PATH = cls.gecko_driver_path - # setup log directory, delete very old log files cls.selenium_logs_dir = 'selenium_logs' cls.selenium_logs_dir_path = os.path.join(cls.SELENIUM_LOGS_PATH, cls.selenium_logs_dir) @@ -122,9 +122,8 @@ class QfqSeleniumTestCase(unittest.TestCase): """ executed by unittest after every single test case """ - # save website state on failure - if sys.exc_info()[0]: + if self._test_has_failed(): filename = time.strftime("%Y%m%d-%H%M%S") + '_' + self._testMethodName screenshot_file_path = self.qfq_save_screenshot(filename) html_file_path = self.qfq_save_html(filename) @@ -134,6 +133,15 @@ class QfqSeleniumTestCase(unittest.TestCase): print('!!! ATTENTION !!!: If you get the error "unexpected alert open",' \ + 'there must be another error above which actually triggers the test failure.') + def _test_has_failed(self): + """ + Returns true if an exception was thrown or an assert failed. + """ + for method, error in self._outcome.errors: + if error: + return True + return False + def _prepare_log_file_path(self, filename, suffix=''): file_path = os.path.join(self.selenium_logs_dir_path, filename + suffix) return file_path @@ -143,7 +151,7 @@ class QfqSeleniumTestCase(unittest.TestCase): try: function() break - except (StaleElementReferenceException, NoSuchElementException, WebDriverException): + except (StaleElementReferenceException, NoSuchElementException, WebDriverException, AssertionError): retries -= 1 def _slow_available(func): @@ -200,6 +208,23 @@ class QfqSeleniumTestCase(unittest.TestCase): """ self.assertFalse(bool) + def qfq_assert_element_visible(self, data_reference): + """ + Asserts that the element with the given data_reference is visible to the user. + """ + def f(): + self.assertTrue(self.qfq_element_is_visible(self.qfq_get_element_by_data_ref(data_reference))) + self._retry_on_certain_exceptions(f) + + def qfq_assert_element_invisible(self, data_reference): + """ + Asserts that the element with the given data_reference is invisible to the user. + """ + def f(): + self.assertFalse(self.qfq_element_is_visible(self.qfq_get_element_by_data_ref(data_reference))) + self._retry_on_certain_exceptions(f) + + # ----- SELECTORS ----- # def qfq_get_element_by_css_selector(self, selector, select_invisibles=True): @@ -282,7 +307,6 @@ class QfqSeleniumTestCase(unittest.TestCase): self.qfq_get_element_by_data_ref(data_reference) ).select_by_visible_text(str(option)) - @_slow_available def qfq_radio_select(self, text): """ selects a radio button in a radio button set @@ -291,7 +315,6 @@ class QfqSeleniumTestCase(unittest.TestCase): "//label[text()='" + str(text) + "']" ) - @_slow_available def qfq_checkbox_select(self, text): """ selects a checkbox in a checkbox set @@ -301,7 +324,6 @@ class QfqSeleniumTestCase(unittest.TestCase): # "//label[text()='" + str(text) + "']" # ) - @_slow_available def qfq_open_pill(self, name): """ this function opens a pill by name @@ -341,14 +363,12 @@ class QfqSeleniumTestCase(unittest.TestCase): # ----- BUTTONS ----- # - @_slow_available def qfq_click_new_form_button(self): """ clicks the button to create a new form """ self.qfq_click_element_with_data_ref('newForm') - @_slow_available def qfq_click_close_form_button(self): """ clicks the close button when adding a new data entry into a form @@ -357,13 +377,18 @@ class QfqSeleniumTestCase(unittest.TestCase): self.qfq_click_element_with_id('close-button') self._retry_on_certain_exceptions(f) - @_slow_available def qfq_click_save_form_button(self): """ clicks the save button when adding a new data entry into a form """ self.qfq_click_element_with_id('save-button') + def qfq_alert_click_ok(self): + """ + Clicks the OK button on a QFQ alert. + """ + self.qfq_click_element_with_text("button", "Ok") + @_slow_available def qfq_click_element_with_text(self, element_tag, text): """ diff --git a/extension/Tests/selenium/test_basic_functionality.py b/extension/Tests/selenium/test_basic_functionality.py index 13801fa01..bfbc836b7 100644 --- a/extension/Tests/selenium/test_basic_functionality.py +++ b/extension/Tests/selenium/test_basic_functionality.py @@ -512,68 +512,35 @@ class TestBasicFunctionality(qfqselenium.QfqSeleniumTestCase): def test_qfq_wrong_to_large_file_upload(self): """ this test checks if a file that is too large throws - an error when beeing uploaded + an error when being uploaded """ s = self - # ----- UNIQUE IDENTIFIERS ----- # - - # generates a random unique text unique_text = s.qfq_generate_random_string() - # generates a random unique number unique_number = str(s.qfq_generate_random_number()) - # generates a unique file_name unique_file_name = s.qfq_generate_random_string(8) - # ----- CREATE ----- # - - # goes to the basic form page + # new record s.qfq_goto_page(s.basic_form_path) - - # clicks the plus button to create a new data entry s.qfq_click_element_with_data_ref(s.add_button_data_ref) - - # fills in the defaults and the unique parts s._fill_in_default_data(unique_text, unique_number) - # switches to pill2 + # upload the file that is too large (128b, 64b max) s.qfq_open_pill(s.pill2_text) - # uploads the file that is too large (128b, 64b max) s.qfq_upload_file(s.file_upload_ref, unique_file_name, "txt", 128) + s.qfq_alert_click_ok() - # waits 1 second - s.qfq_wait(1) # NOTE window freezes if the button is clicked to fast - # clicks the ok button to close the error notification - s.qfq_click_element_with_text("button", "Ok") - # waits 1 second - s.qfq_wait(1) # NOTE window freezes if the button is clicked to fast - - # clicks the save button to save the data + # save + close s.qfq_click_save_form_button() - # clicks the close button to return to the list of data entries s.qfq_click_close_form_button() - - # ----- ASSERTS ----- # - - # checks if the unique text exists on the page s.qfq_assert_text_exists(unique_text) - # checks if the unique number exists on the page s.qfq_assert_text_exists(unique_number) - # checks if the unique file name is absent on the page s.qfq_assert_text_absent(unique_file_name) - # ----- DELETE ----- # - - # clicks the delete button to delete the before created data entry + # delete record s.qfq_click_element_with_data_ref(s.delete_button_data_ref + unique_number) - # confirms the deletion of the data - s.qfq_click_element_with_text("button", "Ok") - - # ----- ASSERTS ----- # - - # checks if there is no unique text anymore after deleting it + s.qfq_alert_click_ok() s.qfq_assert_text_absent(unique_text) - # checks if there is no unique number anymore s.qfq_assert_text_absent(unique_number) def test_qfq_dynamic_update(self): @@ -583,65 +550,32 @@ class TestBasicFunctionality(qfqselenium.QfqSeleniumTestCase): """ s = self - # ----- UNIQUE IDENTIFIERS ----- # - - # generates a random unique text unique_text = s.qfq_generate_random_string() - # generates a random unique text for the dynamic update field unique_dynamic_update_text = s.qfq_generate_random_string() - # generates a random unique number unique_number = str(s.qfq_generate_random_number()) - # ----- CREATE ----- # - - # goes to the basic form page + # new record s.qfq_goto_page(s.basic_form_path) - - # clicks the plus button to create a new data entry s.qfq_click_element_with_data_ref(s.add_button_data_ref) - - # fills in the defaults and the unique parts s._fill_in_default_data(unique_text, unique_number) - # checks if the dynamic text field is hidden - s.qfq_assert_false( - s.qfq_element_is_visible( - s.qfq_get_element_by_data_ref(s.dynamic_update_ref))) - # selects the dynamic update option from the radio buttons + # dynamic update + s.qfq_assert_element_invisible(s.dynamic_update_ref) s.qfq_radio_select(s.dynamic_update_radio) - # checks if the dynamic text field is visible - s.qfq_assert_true( - s.qfq_element_is_visible( - s.qfq_get_element_by_data_ref(s.dynamic_update_ref))) - # fills in the unique dynamic update text into the dynamic update field + s.qfq_assert_element_visible(s.dynamic_update_ref) s.qfq_fill_textfield(s.dynamic_update_ref, unique_dynamic_update_text) - # clicks the save button to save the data + # save + close s.qfq_click_save_form_button() - # clicks the close button to return to the list of data entries s.qfq_click_close_form_button() - - # ----- ASSERTS ----- # - - # checks if the unique text exists on the page s.qfq_assert_text_exists(unique_text) - # checks if the unique number exists on the page s.qfq_assert_text_exists(unique_number) - # checks if the unique dynamic update text exists on the page s.qfq_assert_text_exists(unique_dynamic_update_text) - # ----- DELETE ----- # - - # clicks the delete button to delete the before created data entry + # delete record s.qfq_click_element_with_data_ref(s.delete_button_data_ref + unique_number) - # confirms the deletion of the data - s.qfq_click_element_with_text("button", "Ok") - - # ----- ASSERTS ----- # - - # checks if there is no unique text anymore after deleting it + s.qfq_alert_click_ok() s.qfq_assert_text_absent(unique_text) - # checks if there is no unique number anymore s.qfq_assert_text_absent(unique_number) if __name__ == "__main__": -- GitLab From ad6beb6c7184548db7c49955e47eda59fbc1e55e Mon Sep 17 00:00:00 2001 From: Marc Egger <marc.egger@uzh.ch> Date: Wed, 2 Sep 2020 16:46:28 +0200 Subject: [PATCH 081/195] Refs #11035 clean up selenium tests --- extension/Tests/selenium/qfqselenium.py | 48 +- extension/Tests/selenium/run_tests.sh | 26 + .../selenium/test_basic_functionality.py | 443 ++++-------------- 3 files changed, 159 insertions(+), 358 deletions(-) create mode 100755 extension/Tests/selenium/run_tests.sh diff --git a/extension/Tests/selenium/qfqselenium.py b/extension/Tests/selenium/qfqselenium.py index e4d3607f8..41c7cf529 100644 --- a/extension/Tests/selenium/qfqselenium.py +++ b/extension/Tests/selenium/qfqselenium.py @@ -41,6 +41,7 @@ class QfqSeleniumTestCase(unittest.TestCase): gecko_driver_path = "geckodriver" chrome_browser_name = "chrome" chrome_driver_path = "chromedriver" + alert_button_press_delay_seconds = 0.5 # NOTE Window freezes if button is clicked to fast # these variables can be overwritten by environment variables of the same name SELENIUM_BROWSER = chrome_browser_name @@ -109,7 +110,7 @@ class QfqSeleniumTestCase(unittest.TestCase): capabilities=desired_capabilities) cls.driver.set_window_size(1920, 1080) - cls.driver.implicitly_wait(30) + cls.driver.implicitly_wait(5) @classmethod def tearDownClass(cls): @@ -208,6 +209,15 @@ class QfqSeleniumTestCase(unittest.TestCase): """ self.assertFalse(bool) + def qfq_assert_header_exists(self, text): + """ + Assert whether a header (h1 tag) with given text is present. + """ + try: + self.qfq_get_element_by_tag_and_text('h1', text) + except TimeoutException: + raise AssertionError("Header (<h1>) with given text not found: " + text) + def qfq_assert_element_visible(self, data_reference): """ Asserts that the element with the given data_reference is visible to the user. @@ -272,6 +282,12 @@ class QfqSeleniumTestCase(unittest.TestCase): else: raise ValueError("The element with the given selector is not visible on screen") + def qfq_get_element_by_tag_and_text(self, element_tag, text): + """ + Return element with given tag and text. Text must be exactly equal. + """ + return self.qfq_get_element_by_xpath("//" + element_tag + "[text()='" + text + "']") + # ----- ACTIONS ----- # @_slow_available @@ -283,7 +299,7 @@ class QfqSeleniumTestCase(unittest.TestCase): self.driver.get(url) @_slow_available - def qfq_fill_textfield(self, data_reference, text): + def qfq_fill_text_field(self, data_reference, text): """ fills a given string into a text field which is identified by the given data reference @@ -383,12 +399,34 @@ class QfqSeleniumTestCase(unittest.TestCase): """ self.qfq_click_element_with_id('save-button') - def qfq_alert_click_ok(self): + def qfq_click_alert_ok(self): """ Clicks the OK button on a QFQ alert. """ + self.qfq_wait(self.alert_button_press_delay_seconds) self.qfq_click_element_with_text("button", "Ok") + def qfq_click_alert_cancel(self): + """ + Clicks the cancel button on a QFQ alert. + """ + self.qfq_wait(self.alert_button_press_delay_seconds) + self.qfq_click_element_with_text("button", "Cancel") + + def qfq_click_alert_yes(self): + """ + Clicks the yes button on a QFQ alert. + """ + self.qfq_wait(self.alert_button_press_delay_seconds) + self.qfq_click_element_with_text("button", "Yes") + + def qfq_click_alert_no(self): + """ + Clicks the no button on a QFQ alert. + """ + self.qfq_wait(self.alert_button_press_delay_seconds) + self.qfq_click_element_with_text("button", "No") + @_slow_available def qfq_click_element_with_text(self, element_tag, text): """ @@ -396,9 +434,7 @@ class QfqSeleniumTestCase(unittest.TestCase): the given text """ def f(): - self.qfq_get_element_by_xpath( - "//" + element_tag + "[text()='" + text + "']" - ).click() + self.qfq_get_element_by_tag_and_text(element_tag, text).click() self._retry_on_certain_exceptions(f) @_slow_available diff --git a/extension/Tests/selenium/run_tests.sh b/extension/Tests/selenium/run_tests.sh new file mode 100755 index 000000000..af01873a4 --- /dev/null +++ b/extension/Tests/selenium/run_tests.sh @@ -0,0 +1,26 @@ +#!/bin/bash + +# run a single test function. e.g. "test_basic_functionality.TestBasicFunctionality.test_qfq_form_switch_pill" +TEST_FUNCTION="test_basic_functionality.TestBasicFunctionality.test_qfq_form_switch_pill" # NOTE: make sure there are no trailing spaces! + +export SELENIUM_URL="https://webwork16.math.uzh.ch/megger/qfq/typo3conf/ext/qfq/NoT3Page" +export SELENIUM_BROWSER="chrome" +export SELENIUM_DRIVER_PATH="${PWD}/chromedriver" +export SELENIUM_HEADLESS="no" +export SELENIUM_SLOWDOWN=0 + +# download chromedriver (Chrome) +if [ ! -f "chromedriver" ]; then + wget -O /tmp/chromedriver.zip http://chromedriver.storage.googleapis.com/`curl -sS chromedriver.storage.googleapis.com/LATEST_RELEASE`/chromedriver_linux64.zip &> /dev/null + unzip /tmp/chromedriver.zip chromedriver &> /dev/null + chmod +x chromedriver &> /dev/null + echo -e "Successfully downloaded chromedriver" +fi + +if [ -z "$TEST_FUNCTION" ]; then + python3 -W ignore -m unittest discover +else + python3 -W ignore -m unittest "$TEST_FUNCTION" +fi + +exit 0 diff --git a/extension/Tests/selenium/test_basic_functionality.py b/extension/Tests/selenium/test_basic_functionality.py index bfbc836b7..830b4d47d 100644 --- a/extension/Tests/selenium/test_basic_functionality.py +++ b/extension/Tests/selenium/test_basic_functionality.py @@ -1,7 +1,5 @@ # -*- coding: utf-8 -*- -# imports unittest to do the tests import unittest -# imports qfqselenium which contains the custom qfq tests import qfqselenium @@ -9,290 +7,135 @@ class TestBasicFunctionality(qfqselenium.QfqSeleniumTestCase): """ this class contains the tests to test the implementation of qfq itself. """ - # stores the path including the index file of the form to test with - basic_form_path = "index.php?id=basicform" + basic_form_report_path = "index.php?id=basicform" + basic_form_report_header_text = "Basic Form Report Page" - # stores the data reference of the add data button - add_button_data_ref = "addBasicData" - # stores the data reference of the delete data button - delete_button_data_ref = "deleteBasicData" - # stores the data reference of the edit data button - edit_button_data_ref = "editBasicData" + # Buttons on report page (data-reference) + button_new_record_ref = "addBasicData" + button_delete_record_ref = "deleteBasicData" + button_edit_record_ref = "editBasicData" - # stores the data reference for the text field + # Form elements (data-reference) text_ref = "text" - # stores the data reference for the number field number_ref = "number" - # stores the data reference for the date field date_ref = "date" - # stores the data reference for the datetime field datetime_ref = "datetime" - # stores the data reference for the decimal field decimal_ref = "decimal" - # stores the data reference for the dropdown field dropdown_ref = "enum" - # stores the data reference for the dynamic update field dynamic_update_ref = "dynamicUpdate" - # stores the data reference for the pill_text field pill_text_ref = "pill_text" - # stores the data reference for the file upload file_upload_ref = "file" - # stores the name of the first pill + + # Form Pill names pill1_text = "pill1" - # stores the name of the second pill pill2_text = "pill2" - # stores the default date + # Default form data default_date = "01.01.2188" - # stores the default datetime default_datetime = "02.02.2188 01:08:39" - # stores the default decimal number default_decimal = "12.84" - # stores the default dropdown option default_dropdown = "first option" - # stores the default radio button default_radio = "option a" - # stores the dynamic update option for the radio buttons dynamic_update_radio = "option c" - # stores the default checkbox default_checkbox = "2" - def _fill_in_default_data(self, unique_text, unique_number): """ - this function fills in the default values into the form - and the given unique parts + this function fills in the default values plus the given unique data into the form """ s = self - - # fills the unique text into the text field - s.qfq_fill_textfield(s.text_ref, unique_text) - # fills the unique number into the number field - s.qfq_fill_textfield(s.number_ref, unique_number) - # fills the default date into the date field - s.qfq_fill_textfield(s.date_ref, s.default_date) - # fills the default datetime into the datetime field - s.qfq_fill_textfield(s.datetime_ref, s.default_datetime) - # fills the default decimal into the decimal field - s.qfq_fill_textfield(s.decimal_ref, s.default_decimal) - # selects the default option from the enum dropdown + s.qfq_fill_text_field(s.text_ref, unique_text) + s.qfq_fill_text_field(s.number_ref, unique_number) + s.qfq_fill_text_field(s.date_ref, s.default_date) + s.qfq_fill_text_field(s.datetime_ref, s.default_datetime) + s.qfq_fill_text_field(s.decimal_ref, s.default_decimal) s.qfq_dropdown_select(s.dropdown_ref, s.default_dropdown) - # selects the default option from the radio buttons s.qfq_radio_select(s.default_radio) - # selects the default option from the checkboxes s.qfq_checkbox_select(s.default_checkbox) def test_qfq_canary(self): """ this test should always succeed because it asserts if 1 equals 1. - if it doen't succeed there is probably something wrong with + if it doesn't succeed there is probably something wrong with the environment. """ s = self - - # defines an always true assert that checks if 1 equals 1 - s.qfq_assert_true(1 == 1) # NOTE if this test fails, something is wrong - - def test_qfq_create_delete(self): - """ - this test checks if a new data entry can be created and deleted again. - """ - s = self - - # ----- UNIQUE IDENTIFIERS ----- # - - # generates a random unique text - unique_text = s.qfq_generate_random_string() - # generates a random unique number - unique_number = str(s.qfq_generate_random_number()) - - # ----- CREATE ----- # - - # goes to the basic form page - s.qfq_goto_page(s.basic_form_path) - - # clicks the plus button to create a new data entry - s.qfq_click_element_with_data_ref(s.add_button_data_ref) - - # fills in the defaults and the unique parts - s._fill_in_default_data(unique_text, unique_number) - - # clicks the save button to save the data - s.qfq_click_save_form_button() - # clicks the close button to return to the list of data entries - s.qfq_click_close_form_button() - - # ----- ASSERTS ----- # - - # checks if the unique text exists on the page - s.qfq_assert_text_exists(unique_text) - # checks if the unique number exists on the page - s.qfq_assert_text_exists(unique_number) - - # ----- DELETE ----- # - - # clicks the delete button to delete the before created data entry - s.qfq_click_element_with_data_ref(s.delete_button_data_ref + unique_number) - # confirms the deletion of the data - s.qfq_click_element_with_text("button", "Ok") - - # ----- ASSERTS ----- # - - # checks if there is no unique text anymore after deleting it - s.qfq_assert_text_absent(unique_text) - # checks if there is no unique number anymore - s.qfq_assert_text_absent(unique_number) + s.qfq_assert_true(1 == 1) def test_qfq_create_edit_delete(self): """ - this test checks if a data entry can be created, edited and - deleted again. + create, save, edit, delete record """ s = self - - # ----- UNIQUE IDENTIFIERS ----- # - - # generates a random unique text unique_text = s.qfq_generate_random_string() - # generates a random unique number unique_number = str(s.qfq_generate_random_number()) - # ----- CREATE ----- # - - # goes to the basic form page - s.qfq_goto_page(s.basic_form_path) - - # clicks the plus button to create a new data entry - s.qfq_click_element_with_data_ref(s.add_button_data_ref) - - # fills in the defaults and the unique parts + # new record + s.qfq_goto_page(s.basic_form_report_path) + s.qfq_click_element_with_data_ref(s.button_new_record_ref) s._fill_in_default_data(unique_text, unique_number) - # clicks the save button to save the data + # save + close s.qfq_click_save_form_button() - # clicks the close button to return to the list of data entries s.qfq_click_close_form_button() - - # ----- ASSERTS ----- # - - # checks if the unique text exists on the page s.qfq_assert_text_exists(unique_text) - # checks if the unique number exists on the page s.qfq_assert_text_exists(unique_number) - # ----- EDIT ----- # - - # generates a new random unique text + # edit record new_unique_text = s.qfq_generate_random_string() - # generates a new random unique number new_unique_number = str(s.qfq_generate_random_number()) - - # clicks the edit button to edit the before created data entry - s.qfq_click_element_with_data_ref(self.edit_button_data_ref + unique_number) - - # checks if the unique text exists on the edit form page + s.qfq_click_element_with_data_ref(self.button_edit_record_ref + unique_number) s.qfq_assert_text_exists(unique_text) - # checks if the unique number exists on the edit form page s.qfq_assert_text_exists(unique_number) - - # clears the text field s.qfq_clear_textfield(s.text_ref) - # fills the new unique text into the empty text field - s.qfq_fill_textfield(s.text_ref, new_unique_text) - # clears the number field + s.qfq_fill_text_field(s.text_ref, new_unique_text) s.qfq_clear_textfield(s.number_ref) - # fills the new unique number into the empty number field - s.qfq_fill_textfield(s.number_ref, new_unique_number) + s.qfq_fill_text_field(s.number_ref, new_unique_number) - # clicks the save button to save the data + # save + close s.qfq_click_save_form_button() - # clicks the close button to return to the list of data entries s.qfq_click_close_form_button() - - # ----- ASSERTS ----- # - - # checks if the new unique text exists on the page s.qfq_assert_text_exists(new_unique_text) - # checks if the new unique number exists on the page s.qfq_assert_text_exists(new_unique_number) - - # checks if there is no old unique text anymore after editing it s.qfq_assert_text_absent(unique_text) - # checks if there is no old unique number anymore s.qfq_assert_text_absent(unique_number) - # ----- DELETE ----- # - - # clicks the delete button to delete the before created data entry - s.qfq_click_element_with_data_ref(s.delete_button_data_ref + new_unique_number) - # confirms the deletion of the data - s.qfq_click_element_with_text("button", "Ok") - - # ----- ASSERTS ----- # - - # checks if there is no new unique text anymore after deleting it + # delete + s.qfq_click_element_with_data_ref(s.button_delete_record_ref + new_unique_number) + s.qfq_click_alert_ok() s.qfq_assert_text_absent(new_unique_text) - # checks if there is no new unique number anymore s.qfq_assert_text_absent(new_unique_number) def test_qfq_create_incomplete(self): """ - this test checks that an incomplete form cannot be submitted and - saved by trying to save it directly and by trying to save it on - the 'save before closing' prompt. + can't save incomplete form by pressing save or close + yes """ s = self - - # ----- UNIQUE IDENTIFIERS ----- # - - # generates a random unique text unique_text = s.qfq_generate_random_string() - # generates a random unique number unique_number = str(s.qfq_generate_random_number()) - # ----- TRY TO CREATE ----- # - - # goes to the basic form page - s.qfq_goto_page(s.basic_form_path) - - # clicks the plus button to create a new data entry - s.qfq_click_element_with_data_ref(s.add_button_data_ref) - - # fills the unique text into the text field - s.qfq_fill_textfield(s.text_ref, unique_text) - # fills the unique number into the number field - s.qfq_fill_textfield(s.number_ref, unique_number) + # new record + s.qfq_goto_page(s.basic_form_report_path) + s.qfq_click_element_with_data_ref(s.button_new_record_ref) + s.qfq_fill_text_field(s.text_ref, unique_text) + s.qfq_fill_text_field(s.number_ref, unique_number) - # clicks the save button to try to save the incomplete data + # save (incomplete form) s.qfq_click_save_form_button() - # clicks the close button to close the form + # close + cancel s.qfq_click_close_form_button() - # waits 1 second - s.qfq_wait(1) # NOTE window freezes if the button is clicked to fast - # clicks the cancel button to cancel the closing - s.qfq_click_element_with_text("button", "Cancel") + s.qfq_click_alert_cancel() - # clicks the close button to close the form + # close + yes (save) s.qfq_click_close_form_button() - # waits 1 second - s.qfq_wait(1) # NOTE window freezes if the button is clicked to fast - # clicks the yes button to tell the app to save the incomplete data - s.qfq_click_element_with_text("button", "Yes") + s.qfq_click_alert_yes() - # clicks the close button to close the form + # close + no (don't save) s.qfq_click_close_form_button() - # waits 1 second - s.qfq_wait(1) # NOTE window freezes if the button is clicked to fast - # clicks the no button to close wuithout saving - s.qfq_click_element_with_text("button", "No") - - # ----- ASSERTS ----- # - - # checks if there is no unique text because it was never saved + s.qfq_click_alert_no() s.qfq_assert_text_absent(unique_text) - # checks if there is no unique number s.qfq_assert_text_absent(unique_number) def test_qfq_close_empty_form(self): @@ -302,211 +145,109 @@ class TestBasicFunctionality(qfqselenium.QfqSeleniumTestCase): """ s = self - # ----- CREATE FROM ----- # - - # goes to the basic form page - s.qfq_goto_page(s.basic_form_path) - - # clicks the plus button to create a new data entry - s.qfq_click_element_with_data_ref(s.add_button_data_ref) - - # NOTE doesn't fill in data + # open empty form + s.qfq_goto_page(s.basic_form_report_path) + s.qfq_click_element_with_data_ref(s.button_new_record_ref) - # ----- CLOSE FORM ----- # - - # clicks the close button to close the empty form + # close form s.qfq_click_close_form_button() - - # ----- ASSERTS ----- # - - # asserts if the page url doesn't contain '&s=' (e.g. is the home page) s.qfq_assert_true('&s=' not in s.qfq_get_url()) - def test_qfq_create_form_with_pill_text_delete(self): + s.qfq_assert_header_exists(s.basic_form_report_header_text) + + def test_qfq_form_switch_pill(self): """ - this test creates a form with the additional pill_text from pill2 + Create record, seitch to pill2, fill text """ s = self - - # ----- UNIQUE IDENTIFIERS ----- # - - # generates a random unique text unique_text = s.qfq_generate_random_string() - # generates a random unique text for use in pill_text unique_pill_text = s.qfq_generate_random_string() - # generates a random unique number unique_number = str(s.qfq_generate_random_number()) - # ----- CREATE ----- # - - # goes to the basic form page - s.qfq_goto_page(s.basic_form_path) - - # clicks the plus button to create a new data entry - s.qfq_click_element_with_data_ref(s.add_button_data_ref) - - # fills in the defaults and the unique parts + # new record + s.qfq_goto_page(s.basic_form_report_path) + s.qfq_click_element_with_data_ref(s.button_new_record_ref) s._fill_in_default_data(unique_text, unique_number) - # switches to pill2 + # fill text in pill2 s.qfq_open_pill(s.pill2_text) - # fills the unique pill_text into the pill text field - s.qfq_fill_textfield(s.pill_text_ref, unique_pill_text) + s.qfq_fill_text_field(s.pill_text_ref, unique_pill_text) - # clicks the save button to save the data + # save + close s.qfq_click_save_form_button() - # clicks the close button to return to the list of data entries s.qfq_click_close_form_button() - - # ----- ASSERTS ----- # - - # checks if the unique text exists on the page s.qfq_assert_text_exists(unique_text) - # checks if the unique number exists on the page s.qfq_assert_text_exists(unique_number) - # checks if the unique pill text exists on the page s.qfq_assert_text_exists(unique_pill_text) - # ----- DELETE ----- # - - # clicks the delete button to delete the before created data entry - s.qfq_click_element_with_data_ref(s.delete_button_data_ref + unique_number) - # confirms the deletion of the data - s.qfq_click_element_with_text("button", "Ok") - - # ----- ASSERTS ----- # - - # checks if there is no unique text anymore after deleting it + # delete record + s.qfq_click_element_with_data_ref(s.button_delete_record_ref + unique_number) + s.qfq_click_alert_ok() s.qfq_assert_text_absent(unique_text) - # checks if there is no unique number anymore s.qfq_assert_text_absent(unique_number) def test_qfq_valid_file_upload(self): """ - this test checks if the fileupload works + this test checks if the file upload works """ s = self - - # ----- UNIQUE IDENTIFIERS ----- # - - # generates a random unique text unique_text = s.qfq_generate_random_string() - # generates a random unique number unique_number = str(s.qfq_generate_random_number()) - # generates a unique file_name unique_file_name = s.qfq_generate_random_string(8) - # ----- CREATE ----- # - - # goes to the basic form page - s.qfq_goto_page(s.basic_form_path) - - # clicks the plus button to create a new data entry - s.qfq_click_element_with_data_ref(s.add_button_data_ref) - - # fills in the defaults and the unique parts + # new record + s.qfq_goto_page(s.basic_form_report_path) + s.qfq_click_element_with_data_ref(s.button_new_record_ref) s._fill_in_default_data(unique_text, unique_number) - # switches to pill2 + # upload valid file s.qfq_open_pill(s.pill2_text) - # uploads the file s.qfq_upload_file(s.file_upload_ref, unique_file_name, "txt", 32) - s.qfq_wait(1) - - # clicks the save button to save the data + # save + close s.qfq_click_save_form_button() - # clicks the close button to return to the list of data entries s.qfq_click_close_form_button() - - # ----- ASSERTS ----- # - - # checks if the unique text exists on the page s.qfq_assert_text_exists(unique_text) - # checks if the unique number exists on the page s.qfq_assert_text_exists(unique_number) - # checks if the unique file name exists on the page s.qfq_assert_text_exists(unique_file_name) - # ----- DELETE ----- # - - # clicks the delete button to delete the before created data entry - s.qfq_click_element_with_data_ref(s.delete_button_data_ref + unique_number) - # confirms the deletion of the data - s.qfq_click_element_with_text("button", "Ok") - - # ----- ASSERTS ----- # - - # checks if there is no unique text anymore after deleting it + # delete record + s.qfq_click_element_with_data_ref(s.button_delete_record_ref + unique_number) + s.qfq_click_alert_ok() s.qfq_assert_text_absent(unique_text) - # checks if there is no unique number anymore s.qfq_assert_text_absent(unique_number) def test_qfq_wrong_file_type_upload(self): """ - this test checks if a wrong filetype throws - an error when beeing uploaded + this test checks if a wrong file type throws + an error when being uploaded """ s = self - - # ----- UNIQUE IDENTIFIERS ----- # - - # generates a random unique text unique_text = s.qfq_generate_random_string() - # generates a random unique number unique_number = str(s.qfq_generate_random_number()) - # generates a unique file_name unique_file_name = s.qfq_generate_random_string(8) - # ----- CREATE ----- # - - # goes to the basic form page - s.qfq_goto_page(s.basic_form_path) - - # clicks the plus button to create a new data entry - s.qfq_click_element_with_data_ref(s.add_button_data_ref) - - # fills in the defaults and the unique parts + # new record + s.qfq_goto_page(s.basic_form_report_path) + s.qfq_click_element_with_data_ref(s.button_new_record_ref) s._fill_in_default_data(unique_text, unique_number) - # switches to pill2 + # upload file of type .rtf which is not allowed s.qfq_open_pill(s.pill2_text) - # uploads the file s.qfq_upload_file(s.file_upload_ref, unique_file_name, "rtf", 32) + s.qfq_click_alert_ok() - # waits 1 second - s.qfq_wait(1) # NOTE window freezes if the button is clicked to fast - # clicks the ok button to close the error notification - s.qfq_click_element_with_text("button", "Ok") - # waits 1 second - s.qfq_wait(1) # NOTE window freezes if the button is clicked to fast - - # clicks the save button to save the data + # save + close s.qfq_click_save_form_button() - # clicks the close button to return to the list of data entries s.qfq_click_close_form_button() - - # ----- ASSERTS ----- # - - # checks if the unique text exists on the page s.qfq_assert_text_exists(unique_text) - # checks if the unique number exists on the page s.qfq_assert_text_exists(unique_number) - # checks if the unique file name is absent on the page s.qfq_assert_text_absent(unique_file_name) - # ----- DELETE ----- # - - # clicks the delete button to delete the before created data entry - s.qfq_click_element_with_data_ref(s.delete_button_data_ref + unique_number) - # confirms the deletion of the data - s.qfq_click_element_with_text("button", "Ok") - - # ----- ASSERTS ----- # - - # checks if there is no unique text anymore after deleting it + # delete + s.qfq_click_element_with_data_ref(s.button_delete_record_ref + unique_number) + s.qfq_click_alert_ok() s.qfq_assert_text_absent(unique_text) - # checks if there is no unique number anymore s.qfq_assert_text_absent(unique_number) def test_qfq_wrong_to_large_file_upload(self): @@ -515,20 +256,19 @@ class TestBasicFunctionality(qfqselenium.QfqSeleniumTestCase): an error when being uploaded """ s = self - unique_text = s.qfq_generate_random_string() unique_number = str(s.qfq_generate_random_number()) unique_file_name = s.qfq_generate_random_string(8) # new record - s.qfq_goto_page(s.basic_form_path) - s.qfq_click_element_with_data_ref(s.add_button_data_ref) + s.qfq_goto_page(s.basic_form_report_path) + s.qfq_click_element_with_data_ref(s.button_new_record_ref) s._fill_in_default_data(unique_text, unique_number) # upload the file that is too large (128b, 64b max) s.qfq_open_pill(s.pill2_text) s.qfq_upload_file(s.file_upload_ref, unique_file_name, "txt", 128) - s.qfq_alert_click_ok() + s.qfq_click_alert_ok() # save + close s.qfq_click_save_form_button() @@ -538,8 +278,8 @@ class TestBasicFunctionality(qfqselenium.QfqSeleniumTestCase): s.qfq_assert_text_absent(unique_file_name) # delete record - s.qfq_click_element_with_data_ref(s.delete_button_data_ref + unique_number) - s.qfq_alert_click_ok() + s.qfq_click_element_with_data_ref(s.button_delete_record_ref + unique_number) + s.qfq_click_alert_ok() s.qfq_assert_text_absent(unique_text) s.qfq_assert_text_absent(unique_number) @@ -549,21 +289,20 @@ class TestBasicFunctionality(qfqselenium.QfqSeleniumTestCase): in the form gets saved correctly """ s = self - unique_text = s.qfq_generate_random_string() unique_dynamic_update_text = s.qfq_generate_random_string() unique_number = str(s.qfq_generate_random_number()) # new record - s.qfq_goto_page(s.basic_form_path) - s.qfq_click_element_with_data_ref(s.add_button_data_ref) + s.qfq_goto_page(s.basic_form_report_path) + s.qfq_click_element_with_data_ref(s.button_new_record_ref) s._fill_in_default_data(unique_text, unique_number) # dynamic update s.qfq_assert_element_invisible(s.dynamic_update_ref) s.qfq_radio_select(s.dynamic_update_radio) s.qfq_assert_element_visible(s.dynamic_update_ref) - s.qfq_fill_textfield(s.dynamic_update_ref, unique_dynamic_update_text) + s.qfq_fill_text_field(s.dynamic_update_ref, unique_dynamic_update_text) # save + close s.qfq_click_save_form_button() @@ -573,8 +312,8 @@ class TestBasicFunctionality(qfqselenium.QfqSeleniumTestCase): s.qfq_assert_text_exists(unique_dynamic_update_text) # delete record - s.qfq_click_element_with_data_ref(s.delete_button_data_ref + unique_number) - s.qfq_alert_click_ok() + s.qfq_click_element_with_data_ref(s.button_delete_record_ref + unique_number) + s.qfq_click_alert_ok() s.qfq_assert_text_absent(unique_text) s.qfq_assert_text_absent(unique_number) -- GitLab From eec4b39e040318b925ee1f98d2bdfcb493d4604e Mon Sep 17 00:00:00 2001 From: Marc Egger <marc.egger@uzh.ch> Date: Tue, 8 Sep 2020 16:18:26 +0200 Subject: [PATCH 082/195] Refs #11035 Database.php: small fix --- extension/Classes/Core/Database/Database.php | 2 +- extension/NoT3Page/index.php | 6 ++++-- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/extension/Classes/Core/Database/Database.php b/extension/Classes/Core/Database/Database.php index 793caa1d4..5fd40d6ad 100644 --- a/extension/Classes/Core/Database/Database.php +++ b/extension/Classes/Core/Database/Database.php @@ -373,7 +373,7 @@ class Database { if (false === ($this->mysqli_stmt = $this->mysqli->prepare($sql))) { $errno = $this->mysqli->errno; - if ($skipErrno === array() && false === array_search($errno, $skipErrno)) { + if (false === array_search($errno, $skipErrno)) { // removed nonsensical condition $skipErrno === array() && $this->dbLog(SQL_LOG_MODE_ERROR, $sql, $parameterArray); $errorMsg[ERROR_MESSAGE_TO_DEVELOPER] = $this->getSqlHint($sql, $this->mysqli->error); $errorMsg[ERROR_MESSAGE_OS] = '[ mysqli: ' . $errno . ' ] ' . $this->mysqli->error; diff --git a/extension/NoT3Page/index.php b/extension/NoT3Page/index.php index c89c6c744..67d22336f 100644 --- a/extension/NoT3Page/index.php +++ b/extension/NoT3Page/index.php @@ -4,6 +4,8 @@ // TEST FILE TO RUN QFQ REPORT WITHOUT TYPO3 // /////////////////////////////////////////////// +const IS_DEBUG = true; // TODO: replace this with better debug meachanism + require_once(__DIR__ . '/../vendor/autoload.php'); use http\Exception; @@ -407,7 +409,7 @@ try { error_reporting($origErrorReporting | E_NOTICE); Path::setMainPaths('../../../../'); - $t3data["bodytext"] = "file=home/two/qfq-perdasdson.qfqr"; + $t3data["bodytext"] = "file=Home/selenium/QFQ__basicform.qfqr"; $qfq = new QuickFormQuery($t3data); $html = $qfq->process(); $flagOk = true; @@ -431,7 +433,7 @@ try { $html = $e->formatMessage(); } catch (\Error | \Exception $e) { - $html = "Generic Exception: " . $e->getMessage(); + $html = "Generic Exception: " . $e->getMessage() . (IS_DEBUG ? ("<br>" . nl2br($e->getTraceAsString())) : ''); } if (isset($e) && $e->getCode() == ERROR_QUIT_QFQ_REGULAR) { -- GitLab From a7984d17f8d33d567a390b1c312242b11a845332 Mon Sep 17 00:00:00 2001 From: Marc Egger <marc.egger@uzh.ch> Date: Thu, 10 Sep 2020 16:11:45 +0200 Subject: [PATCH 083/195] Refs #11035 fix Form Pills and Exception Font Color CSS --- extension/NoT3Page/index.php | 13 ++++++++++--- .../Tests/selenium/test_basic_functionality.py | 2 +- less/qfq-bs.css.less | 8 ++++++++ 3 files changed, 19 insertions(+), 4 deletions(-) diff --git a/extension/NoT3Page/index.php b/extension/NoT3Page/index.php index 67d22336f..5f474b75c 100644 --- a/extension/NoT3Page/index.php +++ b/extension/NoT3Page/index.php @@ -33,6 +33,8 @@ use IMATHUZH\Qfq\Core\QuickFormQuery; // TODO: write docstrings for Path.php // TODO: alle error codes raus schmeissen // TODO: ?CR: AbstractException.php, surround log part with try/catch? +// TODO: Datenbank einstellungen wieder separat abspeichern, sonst kann man config nicht commiten in git. Idee: in qfq.path.json speichern +// TODO: bootstrap: 1) Path setzen, 2) config file + T3 config laden, 3) DB init, 4) stores fuellen // PATH migration // TODO: create filePathToQfqConfig() and replace config references with this @@ -53,6 +55,9 @@ use IMATHUZH\Qfq\Core\QuickFormQuery; // Misc. // TODO: TablesorterController.js: pass API url as data attribute instead of hardcode (this.tablesorterApiUrl = 'typo3conf/ext/qfq/Classes/Api/setting.php';) +// Before production +// TODO: switch qfq.debug.js with qfq.min.js + //// class User { @@ -298,16 +303,17 @@ echo <<<EOF <link rel="stylesheet" type="text/css" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/css/bootstrap.min.css" media="all"> <link rel="stylesheet" type="text/css" href="https://webwork16.math.uzh.ch/megger/qfq/typo3conf/ext/qfq/Resources/Public/Css/bootstrap-theme.min.css?1594738199" media="all"> -<link rel="stylesheet" type="text/css" href="https://webwork16.math.uzh.ch/megger/qfq/typo3conf/ext/qfq/Resources/Public/Css/qfq-bs.css?1594738199" media="all"> +<link rel="stylesheet" type="text/css" href="https://webwork16.math.uzh.ch/megger/qfq/typo3conf/ext/qfq/Resources/Public/Css/qfq-bs.css" media="all"> <link rel="stylesheet" type="text/css" href="https://webwork16.math.uzh.ch/megger/qfq/typo3conf/ext/qfq/Resources/Public/Css/tablesorter-bootstrap.css?1594738199" media="all"> <link rel="stylesheet" type="text/css" href="https://webwork16.math.uzh.ch/megger/qfq/typo3conf/ext/qfq/Resources/Public/Css/font-awesome.min.css?1594738199" media="all"> -<script src="https://webwork16.math.uzh.ch/megger/qfq/typo3conf/ext/qfq/Resources/Public/JavaScript/jquery.min.js" type="text/javascript"></script> +<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.2.2/jquery.min.js" type="text/javascript"></script> +<script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/js/bootstrap.min.js" type="text/javascript"></script> <script src="https://webwork16.math.uzh.ch/megger/qfq/typo3conf/ext/qfq/Resources/Public/JavaScript/validator.min.js" type="text/javascript"></script> <script src="https://webwork16.math.uzh.ch/megger/qfq/typo3conf/ext/qfq/Resources/Public/JavaScript/tinymce.min.js" type="text/javascript"></script> <script src="https://webwork16.math.uzh.ch/megger/qfq/typo3conf/ext/qfq/Resources/Public/JavaScript/EventEmitter.min.js" type="text/javascript"></script> -<script src="https://webwork16.math.uzh.ch/megger/qfq/typo3conf/ext/qfq/Resources/Public/JavaScript/qfq.min.js" type="text/javascript"></script> +<script src="https://webwork16.math.uzh.ch/megger/qfq/typo3conf/ext/qfq/Resources/Public/JavaScript/qfq.debug.js" type="text/javascript"></script> <script src="https://webwork16.math.uzh.ch/megger/qfq/typo3conf/ext/qfq/Resources/Public/JavaScript/typeahead.bundle.min.js" type="text/javascript"></script> <script src="https://webwork16.math.uzh.ch/megger/qfq/typo3conf/ext/qfq/Resources/Public/JavaScript/jquery.tablesorter.combined.min.js" type="text/javascript"></script> <script src="https://webwork16.math.uzh.ch/megger/qfq/typo3conf/ext/qfq/Resources/Public/JavaScript/jquery.tablesorter.pager.min.js" type="text/javascript"></script> @@ -412,6 +418,7 @@ try { $t3data["bodytext"] = "file=Home/selenium/QFQ__basicform.qfqr"; $qfq = new QuickFormQuery($t3data); $html = $qfq->process(); + $html = '<div class="container">' . $html . '</div>'; $flagOk = true; } catch (\UserFormException $e) { diff --git a/extension/Tests/selenium/test_basic_functionality.py b/extension/Tests/selenium/test_basic_functionality.py index 830b4d47d..a11755bca 100644 --- a/extension/Tests/selenium/test_basic_functionality.py +++ b/extension/Tests/selenium/test_basic_functionality.py @@ -157,7 +157,7 @@ class TestBasicFunctionality(qfqselenium.QfqSeleniumTestCase): def test_qfq_form_switch_pill(self): """ - Create record, seitch to pill2, fill text + Create record, switch to pill2, fill text """ s = self unique_text = s.qfq_generate_random_string() diff --git a/less/qfq-bs.css.less b/less/qfq-bs.css.less index c51c88724..9c7a14925 100644 --- a/less/qfq-bs.css.less +++ b/less/qfq-bs.css.less @@ -813,6 +813,14 @@ span.qfq-typeahead-tag { overflow-x: hidden; } +.alert-interactive tr td { + color: #d0d0d0; +} + +.alert-interactive tr:hover td { + color: #0E2231; +} + .alert-side > p.body { margin: 0px; overflow: hidden; -- GitLab From 2cd05c2a9b5e8e1390526ecb435fb98f13a35564 Mon Sep 17 00:00:00 2001 From: Marc Egger <marc.egger@uzh.ch> Date: Thu, 10 Sep 2020 16:13:14 +0200 Subject: [PATCH 084/195] add alternative curl rest client, example works --- extension/Classes/Core/Report/RestClient.php | 62 +++++++++++++++++++- 1 file changed, 61 insertions(+), 1 deletion(-) diff --git a/extension/Classes/Core/Report/RestClient.php b/extension/Classes/Core/Report/RestClient.php index 1872cd83f..d23e66cef 100644 --- a/extension/Classes/Core/Report/RestClient.php +++ b/extension/Classes/Core/Report/RestClient.php @@ -56,6 +56,9 @@ class RestClient { $options['http']['content'] = $param[TOKEN_L_CONTENT]; } + $recvBuffer = self::callAPIMarc(strtoupper($param[TOKEN_L_METHOD]), $param[TOKEN_REST_CLIENT], $data = json_decode($param[TOKEN_L_CONTENT])); + + /* $context = stream_context_create($options); try { if (false === ($recvBuffer = file_get_contents($param[TOKEN_REST_CLIENT], false, $context))) { @@ -75,7 +78,7 @@ class RestClient { // Copy new values to STORE_CLIENT $this->store::setStore($recv, STORE_CLIENT, true); - + */ return $recvBuffer; } @@ -134,4 +137,61 @@ class RestClient { $param[TOKEN_L_HEADER] = KeyValueStringParser::unparse($header, ': ', '\r\n') . '\r\n'; return $param; } + + private static function callAPIMarc($method, $url, $data = array()) { + + $ch = curl_init(); + $curlConfig = array( + CURLOPT_RETURNTRANSFER => true, + // CURLINFO_HEADER_OUT => $debug + ); + $curlHeader = array( + 'Content-Type: application/json' + ); + switch ($method) { + case "POST": + $curlConfig[CURLOPT_POST] = true; + if (!empty($data)) { + $dataJson = json_encode($data); + $curlConfig[CURLOPT_POSTFIELDS] = $dataJson; + $curlHeader[] = 'Content-Length: ' . strlen($dataJson); + } + break; + case "PUT": + $curlConfig[CURLOPT_CUSTOMREQUEST] = 'PUT'; + if (!empty($data)) + $dataJson = json_encode($data); + $curlConfig[CURLOPT_POSTFIELDS] = $dataJson; + $curlHeader[] = 'Content-Length: ' . strlen($dataJson); + break; + case "DELETE": + $curlConfig[CURLOPT_CUSTOMREQUEST] = 'DELETE'; + if (!empty($data)) + $url = sprintf("%s?%s", $url, http_build_query($data)); + break; + default: + if (!empty($data)) + $url = sprintf("%s?%s", $url, http_build_query($data)); + } + $curlConfig[CURLOPT_URL] = $url; + curl_setopt_array($ch, $curlConfig); + curl_setopt($ch, CURLOPT_HTTPHEADER, $curlHeader); + + // send request + $output = json_decode(curl_exec($ch), true); + + if ($output === false) { + throw new Exception(curl_error($ch), curl_errno($ch)); + } + $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE); + if ($httpCode >= 300) { + throw new Exception(' Api error: ' . $url . ' HTTP code: ' . $httpCode . ' Message: ' . ($output['error'] ?? '') . ($output['message'] ?? ''), E_ERROR); + } + + // finished + curl_close($ch); + return $output; + + } + } \ No newline at end of file -- GitLab From 28c16e84e0416651276ddb5ac2e4c876ac35a924 Mon Sep 17 00:00:00 2001 From: Marc Egger <marc.egger@uzh.ch> Date: Thu, 10 Sep 2020 17:30:52 +0200 Subject: [PATCH 085/195] minimal working version for Philipp --- extension/Classes/Core/Report/RestClient.php | 20 ++++++++++++++++---- 1 file changed, 16 insertions(+), 4 deletions(-) diff --git a/extension/Classes/Core/Report/RestClient.php b/extension/Classes/Core/Report/RestClient.php index d23e66cef..271acc6f8 100644 --- a/extension/Classes/Core/Report/RestClient.php +++ b/extension/Classes/Core/Report/RestClient.php @@ -56,9 +56,19 @@ class RestClient { $options['http']['content'] = $param[TOKEN_L_CONTENT]; } - $recvBuffer = self::callAPIMarc(strtoupper($param[TOKEN_L_METHOD]), $param[TOKEN_REST_CLIENT], $data = json_decode($param[TOKEN_L_CONTENT])); + // Marc Curl Version + try { + list($recv[HTTP_STATUS], $recvBuffer) = self::callAPIMarc(strtoupper($param[TOKEN_L_METHOD]), + $param[TOKEN_REST_CLIENT], + $data = json_decode($param[TOKEN_L_CONTENT])); + } catch (\Exception $e) { + $recv[HTTP_STATUS] = $e->getCode(); + $recv[ERROR_MESSAGE] = $e->getMessage(); + } + /* + // Carsten file_get_contents version $context = stream_context_create($options); try { if (false === ($recvBuffer = file_get_contents($param[TOKEN_REST_CLIENT], false, $context))) { @@ -75,10 +85,12 @@ class RestClient { $recv[HTTP_STATUS] = $e->getCode(); $recv[ERROR_MESSAGE] = $e->getMessage(); } + */ + // Copy new values to STORE_CLIENT $this->store::setStore($recv, STORE_CLIENT, true); - */ + return $recvBuffer; } @@ -178,7 +190,7 @@ class RestClient { curl_setopt($ch, CURLOPT_HTTPHEADER, $curlHeader); // send request - $output = json_decode(curl_exec($ch), true); + $output = curl_exec($ch); if ($output === false) { throw new Exception(curl_error($ch), curl_errno($ch)); @@ -190,7 +202,7 @@ class RestClient { // finished curl_close($ch); - return $output; + return [$httpCode, $output]; } -- GitLab From a5a2c98abd44f563a52db0bd2a49191b40d23189 Mon Sep 17 00:00:00 2001 From: Marc Egger <marc.egger@uzh.ch> Date: Fri, 11 Sep 2020 18:17:32 +0200 Subject: [PATCH 086/195] bug fix gebastelt mit philipp --- composer.json | 3 +- extension/Classes/Core/Report/RestClient.php | 65 ++++++++++++++------ 2 files changed, 48 insertions(+), 20 deletions(-) diff --git a/composer.json b/composer.json index b3130f6c1..34aa17692 100644 --- a/composer.json +++ b/composer.json @@ -11,6 +11,7 @@ "ext-fileinfo": "*", "ext-ldap": "*", "ext-intl": "*", - "ext-iconv": "*" + "ext-iconv": "*", + "ext-curl": "*" } } \ No newline at end of file diff --git a/extension/Classes/Core/Report/RestClient.php b/extension/Classes/Core/Report/RestClient.php index 271acc6f8..0e272a57f 100644 --- a/extension/Classes/Core/Report/RestClient.php +++ b/extension/Classes/Core/Report/RestClient.php @@ -39,16 +39,28 @@ class RestClient { $recv = array(); $param = $this->parseArgument($str); + + // split header at "\r\n" and ";". $header must be an array of single headers!! + if (!empty($param[TOKEN_L_HEADER])) { + $header = str_replace("\r\n", ';', $param[TOKEN_L_HEADER]); + $header = str_replace("\n", ';', $header); + $header = explode(';', $header); + } else { + $header = []; + } + + $options = array( 'http' => array( - 'header' => $param[TOKEN_L_HEADER], + 'header' => $header, 'method' => strtoupper($param[TOKEN_L_METHOD]), 'timeout' => $param[TOKEN_L_TIMEOUT], ) ); + // TODO: ssl for CURL? if (isset($param[TOKEN_L_SSL])) { - $options['ssl'] = json_decode($param[TOKEN_L_SSL]); + $options['ssl'] = json_decode($param[TOKEN_L_SSL], true); } // Add content only if there is one. @@ -56,11 +68,16 @@ class RestClient { $options['http']['content'] = $param[TOKEN_L_CONTENT]; } + // Marc Curl Version try { - list($recv[HTTP_STATUS], $recvBuffer) = self::callAPIMarc(strtoupper($param[TOKEN_L_METHOD]), - $param[TOKEN_REST_CLIENT], - $data = json_decode($param[TOKEN_L_CONTENT])); + list($http_status, $recvBuffer) = self::callAPIMarc(strtoupper($param[TOKEN_L_METHOD]), $param[TOKEN_REST_CLIENT], $data = $param[TOKEN_L_CONTENT], $header); + $recv['rawAnswer'] = $recvBuffer; + $rcvBufferDecoded = json_decode($recvBuffer, true); + array_walk_recursive($rcvBufferDecoded, function ($value, $key) use (&$recv) { + $recv[$key] = $value; + }); + $recv[HTTP_STATUS] = $http_status; } catch (\Exception $e) { $recv[HTTP_STATUS] = $e->getCode(); $recv[ERROR_MESSAGE] = $e->getMessage(); @@ -88,6 +105,7 @@ class RestClient { */ + // Copy new values to STORE_CLIENT $this->store::setStore($recv, STORE_CLIENT, true); @@ -146,44 +164,53 @@ class RestClient { } // Join all header arguments to one string - $param[TOKEN_L_HEADER] = KeyValueStringParser::unparse($header, ': ', '\r\n') . '\r\n'; +// $param[TOKEN_L_HEADER] = KeyValueStringParser::unparse($header, ': ', '\r\n') . '\r\n'; return $param; } - private static function callAPIMarc($method, $url, $data = array()) { + private static function callAPIMarc(string $method, string $url, string $data = '', array $header = []) { $ch = curl_init(); $curlConfig = array( CURLOPT_RETURNTRANSFER => true, // CURLINFO_HEADER_OUT => $debug ); - $curlHeader = array( - 'Content-Type: application/json' - ); + + if (!empty($header)) { + $curlHeader = $header; + } else { + $curlHeader = array( + 'Content-Type: application/json' + ); + } + switch ($method) { case "POST": $curlConfig[CURLOPT_POST] = true; if (!empty($data)) { - $dataJson = json_encode($data); + $dataJson = $data; $curlConfig[CURLOPT_POSTFIELDS] = $dataJson; $curlHeader[] = 'Content-Length: ' . strlen($dataJson); } break; case "PUT": $curlConfig[CURLOPT_CUSTOMREQUEST] = 'PUT'; - if (!empty($data)) - $dataJson = json_encode($data); - $curlConfig[CURLOPT_POSTFIELDS] = $dataJson; - $curlHeader[] = 'Content-Length: ' . strlen($dataJson); + if (!empty($data)) { + $dataJson = $data; + $curlConfig[CURLOPT_POSTFIELDS] = $dataJson; + $curlHeader[] = 'Content-Length: ' . strlen($dataJson); + } break; case "DELETE": $curlConfig[CURLOPT_CUSTOMREQUEST] = 'DELETE'; - if (!empty($data)) - $url = sprintf("%s?%s", $url, http_build_query($data)); + if (!empty($data)) { + $url = sprintf("%s?%s", $url, http_build_query(json_decode($data, true))); + } break; default: - if (!empty($data)) - $url = sprintf("%s?%s", $url, http_build_query($data)); + if (!empty($data)) { + $url = sprintf("%s?%s", $url, http_build_query(json_decode($data, true))); + } } $curlConfig[CURLOPT_URL] = $url; curl_setopt_array($ch, $curlConfig); -- GitLab From 0e038eb685afac61ee2eba7ef5d3f2dcff547d5e Mon Sep 17 00:00:00 2001 From: Marc Egger <marc.egger@uzh.ch> Date: Tue, 15 Sep 2020 14:17:12 +0200 Subject: [PATCH 087/195] cleanup, fix headers, fix error message --- Documentation/Report.rst | 10 +- extension/Classes/Core/Constants.php | 1 + extension/Classes/Core/Report/RestClient.php | 136 ++++++------------- 3 files changed, 45 insertions(+), 102 deletions(-) diff --git a/Documentation/Report.rst b/Documentation/Report.rst index 5fdd76ea6..c15d84050 100644 --- a/Documentation/Report.rst +++ b/Documentation/Report.rst @@ -1668,7 +1668,7 @@ Example:: +===================+================================+============================================================================+ | n | n:https://www.dummy.ord/rest/person | | +-------------------+----------------------------------------------------+--------------------------------------------------------+ -| method | method:POST | GET or POST | +| method | method:POST | GET, POST, PUT or DELETE | +-------------------+----------------------------------------------------+--------------------------------------------------------+ | content | content:{"name":"John";"surname":"Doe"} | Depending on the REST server JSON might be expected | +-------------------+----------------------------------------------------+--------------------------------------------------------+ @@ -1681,7 +1681,7 @@ Example:: **Header** -* Each header must be separated by ``\r\n``. +* Each header must be separated by ``\r\n`` or `\n`. * An explicit given header will overwrite the named default header. * Default header: @@ -1696,12 +1696,12 @@ Example:: * The variable ``{{http-status:C}}`` shows the `HTTP status code<https://en.wikipedia.org/wiki/List_of_HTTP_status_codes>`_. A value starting with '2..' shows success. * In case of an error, ``{{error-message:C:allbut}}`` shows some details. -* In case the returned answer is a valid JSON string, it's automatically copied STORE_CLIENT with corresponding key names. +* In case the returned answer is a valid JSON string, it is flattened and automatically copied to STORE_CLIENT with corresponding key names. JSON answer example:: - Answer from Server: { 'name' : 'John'; 'street': 'Milky road' } - Retrieve the values via: {{name:C:alnumx}}, {{street:C:alnumx}} + Answer from Server: { 'name' : 'John', 'address' : {'city' : 'Bern'} } + Retrieve the values via: {{name:C:alnumx}}, {{city:C:alnumx}} .. _special-sql-functions: diff --git a/extension/Classes/Core/Constants.php b/extension/Classes/Core/Constants.php index 65e46a6dc..a67e02e69 100644 --- a/extension/Classes/Core/Constants.php +++ b/extension/Classes/Core/Constants.php @@ -2026,5 +2026,6 @@ const I_ATTRIBUTE = 'attribute'; const I_CHECKED = 'checked'; const I_UNCHECKED = 'unchecked'; +// Rest Client const HTTP_STATUS = 'http-status'; const ERROR_MESSAGE = 'error-message'; \ No newline at end of file diff --git a/extension/Classes/Core/Report/RestClient.php b/extension/Classes/Core/Report/RestClient.php index 0e272a57f..b7b640e1d 100644 --- a/extension/Classes/Core/Report/RestClient.php +++ b/extension/Classes/Core/Report/RestClient.php @@ -40,75 +40,30 @@ class RestClient { $param = $this->parseArgument($str); - // split header at "\r\n" and ";". $header must be an array of single headers!! - if (!empty($param[TOKEN_L_HEADER])) { - $header = str_replace("\r\n", ';', $param[TOKEN_L_HEADER]); - $header = str_replace("\n", ';', $header); - $header = explode(';', $header); - } else { - $header = []; - } - - - $options = array( - 'http' => array( - 'header' => $header, - 'method' => strtoupper($param[TOKEN_L_METHOD]), - 'timeout' => $param[TOKEN_L_TIMEOUT], - ) - ); - - // TODO: ssl for CURL? - if (isset($param[TOKEN_L_SSL])) { - $options['ssl'] = json_decode($param[TOKEN_L_SSL], true); - } - - // Add content only if there is one. - if (!empty($param[TOKEN_L_CONTENT])) { - $options['http']['content'] = $param[TOKEN_L_CONTENT]; - } - +// if (isset($param[TOKEN_L_SSL])) { +// $options['ssl'] = json_decode($param[TOKEN_L_SSL], true); +// } - // Marc Curl Version + // Send request try { - list($http_status, $recvBuffer) = self::callAPIMarc(strtoupper($param[TOKEN_L_METHOD]), $param[TOKEN_REST_CLIENT], $data = $param[TOKEN_L_CONTENT], $header); - $recv['rawAnswer'] = $recvBuffer; - $rcvBufferDecoded = json_decode($recvBuffer, true); - array_walk_recursive($rcvBufferDecoded, function ($value, $key) use (&$recv) { - $recv[$key] = $value; - }); + list($http_status, $recvBuffer) = self::callApiCurl(strtoupper($param[TOKEN_L_METHOD]), $param[TOKEN_REST_CLIENT], $data = $param[TOKEN_L_CONTENT] ?? '', $param[TOKEN_L_HEADER], $param[TOKEN_L_TIMEOUT]); $recv[HTTP_STATUS] = $http_status; - } catch (\Exception $e) { - $recv[HTTP_STATUS] = $e->getCode(); - $recv[ERROR_MESSAGE] = $e->getMessage(); - } - - - /* - // Carsten file_get_contents version - $context = stream_context_create($options); - try { - if (false === ($recvBuffer = file_get_contents($param[TOKEN_REST_CLIENT], false, $context))) { - $recv[HTTP_STATUS] = 400; - $recv[ERROR_MESSAGE] = implode(", ", $http_response_header); - } else { - // If $recBuffer is no json - don't care, $recv will be null then. - $recv = json_decode($recvBuffer, true); - $recv[HTTP_STATUS] = 200; + if ($http_status >= 300) { + $recv[ERROR_MESSAGE] = ' Api error: ' . $param[TOKEN_REST_CLIENT] . ' HTTP code: ' . $http_status . ' Message: ' . print_r(json_decode($recvBuffer ?? '', true), true); } - - } catch (Exception $e) { - $recvBuffer = ''; + $rcvBufferDecoded = json_decode($recvBuffer, true); + if ($rcvBufferDecoded !== Null) { + array_walk_recursive($rcvBufferDecoded, function ($value, $key) use (&$recv) { + $recv[$key] = $value; + }); + } + } catch (\Exception $e) { $recv[HTTP_STATUS] = $e->getCode(); $recv[ERROR_MESSAGE] = $e->getMessage(); } - */ - - // Copy new values to STORE_CLIENT $this->store::setStore($recv, STORE_CLIENT, true); - return $recvBuffer; } @@ -142,55 +97,49 @@ class RestClient { $param[TOKEN_L_TIMEOUT] = 5; } + // split header at "\r\n" and "\n". $header must be an array of single headers!! + if (!empty($param[TOKEN_L_HEADER])) { + $header = str_replace("\r\n", '$$SEP$$', $param[TOKEN_L_HEADER]); + $header = str_replace("\n", '$$SEP$$', $header); + $header = explode('$$SEP$$', $header); + } else { + $header = []; + } - // If 'Host' is missing in header: define - useful for Firewall/ Proxy - // CR: if a header 'host' is given, REST calls fails always. -// $header = KeyValueStringParser::parse($param[TOKEN_L_HEADER], ':', '\r\n'); -// if (empty($header['host'])) { -// $urlParts = parse_url($param[TOKEN_REST_CLIENT]); -// $header['host'] = $urlParts['host']; -// } - - // If 'Content-type' is missing in header: define. - if (empty($header['content-type'])) { - // Poor man guess: if no 'content-type' is explicit given and string starts with '{' >> 'application/json' + if (strpos($param[TOKEN_L_HEADER], 'content-type:') === false) { $mime = (($param[TOKEN_L_CONTENT][0] ?? '') == '{') ? 'application/json' : 'text/plain'; - $header['content-type'] = $mime . '; charset: utf-8'; + $header[] = 'content-type: ' . $mime . '; charset=utf-8'; } - // If 'Connection' is missing in Header: define - if (empty($header['connection'])) { - $header['connection'] = 'close'; + if (strpos($param[TOKEN_L_HEADER], 'connection:') === false) { + $header[] = 'connection: close'; } - // Join all header arguments to one string -// $param[TOKEN_L_HEADER] = KeyValueStringParser::unparse($header, ': ', '\r\n') . '\r\n'; + // If 'Host' is missing in header: define - useful for Firewall/ Proxy + // CR: if a header 'host' is given, REST calls fails always. +// if (strpos($param[TOKEN_L_HEADER], 'host:') === false) { +// $urlParts = parse_url($param[TOKEN_REST_CLIENT]); +// $header[] = 'host: ' . $urlParts['host']; +// } + + $param[TOKEN_L_HEADER] = $header; return $param; } - private static function callAPIMarc(string $method, string $url, string $data = '', array $header = []) { + private static function callApiCurl(string $method, string $url, string $data = '', array $header = [], int $timeout = 5) { $ch = curl_init(); $curlConfig = array( CURLOPT_RETURNTRANSFER => true, // CURLINFO_HEADER_OUT => $debug ); - - if (!empty($header)) { - $curlHeader = $header; - } else { - $curlHeader = array( - 'Content-Type: application/json' - ); - } - switch ($method) { case "POST": $curlConfig[CURLOPT_POST] = true; if (!empty($data)) { $dataJson = $data; $curlConfig[CURLOPT_POSTFIELDS] = $dataJson; - $curlHeader[] = 'Content-Length: ' . strlen($dataJson); + $header[] = 'Content-Length: ' . strlen($dataJson); } break; case "PUT": @@ -198,7 +147,7 @@ class RestClient { if (!empty($data)) { $dataJson = $data; $curlConfig[CURLOPT_POSTFIELDS] = $dataJson; - $curlHeader[] = 'Content-Length: ' . strlen($dataJson); + $header[] = 'Content-Length: ' . strlen($dataJson); } break; case "DELETE": @@ -213,24 +162,17 @@ class RestClient { } } $curlConfig[CURLOPT_URL] = $url; + $curlConfig[CURLOPT_TIMEOUT] = $timeout; curl_setopt_array($ch, $curlConfig); - curl_setopt($ch, CURLOPT_HTTPHEADER, $curlHeader); + curl_setopt($ch, CURLOPT_HTTPHEADER, $header); // send request $output = curl_exec($ch); - if ($output === false) { throw new Exception(curl_error($ch), curl_errno($ch)); } $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE); - if ($httpCode >= 300) { - throw new Exception(' Api error: ' . $url . ' HTTP code: ' . $httpCode . ' Message: ' . ($output['error'] ?? '') . ($output['message'] ?? ''), E_ERROR); - } - - // finished curl_close($ch); return [$httpCode, $output]; - } - } \ No newline at end of file -- GitLab From a57cbb3d8403a3afba17b81d7dd05728895a6d95 Mon Sep 17 00:00:00 2001 From: Marc Egger <marc.egger@uzh.ch> Date: Tue, 15 Sep 2020 17:01:15 +0200 Subject: [PATCH 088/195] Doku: remove ssl options rest client --- Documentation/Report.rst | 2 -- 1 file changed, 2 deletions(-) diff --git a/Documentation/Report.rst b/Documentation/Report.rst index c15d84050..86e71b325 100644 --- a/Documentation/Report.rst +++ b/Documentation/Report.rst @@ -1676,8 +1676,6 @@ Example:: +-------------------+----------------------------------------------------+--------------------------------------------------------+ | timeout | timeout:5 | Default: 5 seconds. | +-------------------+----------------------------------------------------+--------------------------------------------------------+ -| ssl | ssl:{"verify_peer":true,"allow_self_signed":false} | JSON config for SSL settings | -+-------------------+----------------------------------------------------+--------------------------------------------------------+ **Header** -- GitLab From e036de031b11f5ad3333e375407ec3665ca4142a Mon Sep 17 00:00:00 2001 From: Marc Egger <marc.egger@uzh.ch> Date: Wed, 16 Sep 2020 16:48:01 +0200 Subject: [PATCH 089/195] Add special column AS _script --- Documentation/Report.rst | 83 ++++++++++++++++++ extension/Classes/Core/Constants.php | 3 + .../Classes/Core/Report/ColumnScript.php | 85 +++++++++++++++++++ extension/Classes/Core/Report/Report.php | 3 + extension/Classes/Core/Report/RestClient.php | 2 +- extension/NoT3Page/index.php | 1 + 6 files changed, 176 insertions(+), 1 deletion(-) create mode 100644 extension/Classes/Core/Report/ColumnScript.php diff --git a/Documentation/Report.rst b/Documentation/Report.rst index 86e71b325..3365712bb 100644 --- a/Documentation/Report.rst +++ b/Documentation/Report.rst @@ -655,6 +655,8 @@ Summary: +------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | _exec | :ref:`column_exec` - Run batch files or executables on the webserver. | +------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ +| _script | :ref:`column_script` - Run php function defined in an external script | ++------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | _vertical | :ref:`column_vertical` - Render Text vertically. This is useful for tables with limited column width. | +------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | _img | :ref:`column_img` - Display images. | @@ -1399,6 +1401,87 @@ Run any command on the web server. 10.sql = SELECT "ls -s" AS _exec 20.sql = SELECT "./batchfile.sh" AS _exec +.. _column_script: + +Column: _script +^^^^^^^^^^^^^^^ + +Run a php function defined in an external script. + +* All column parameters are passed as an associative array to the function as the first argument. +* The second argument (here called $qfq) is an object which acts as an interface to QFQ functionality. +* The script has access to the following qfq functions using this interface: + * $qfq::apiCall($method, $url, $data = [], $header = [], $timeout = 5) + * string $method PUT/POST/GET/DELETE + * string $url + * array $data json string, will be added as GET parameters or as POST fields respectively. + * array $header of the form ['Content-type: text/plain', 'Content-length: 100'] + * int $timeout number of seconds to wait until call is aborted. + * $qfq::getVar($key, $useStores = 'FSRVD', $sanitizeClass = '', &$foundInStore = '', $typeMessageViolate = 'c') + * string $key name of qfq variable + * string $useStores Stores in which variable is searched (in order from left to right). see :ref:`store`. + * string $sanitizeClass see :ref:`sanitize-class` + * string $foundInStore is filled with the name of the store in which the variable was found. + * string $typeMessageViolate what to return if the sanitize class was violated: + * 'c': return '!!<sanitize class>!!' + * '0': return '0' + * 'e': return '' +* The current working directory is the current web instance (e.g. ``/var/www/html``) . +* All output (e.g. using echo) will be returned by the special column as is. +* If the function returns an associative array, then the key-value pairs will be accessible via the Client store. +* Text sent to 'stderr' by the php function is not returned at all. + +**Column Parameters** + ++-------------------+----------------------------------------------------+------------------------------------------------------------------+ +| Token | Example | Comment | ++===================+====================================================+==================================================================+ +| scr | scr:fileadmin/scripts/my_script.php | Path to the custom script relative to the current web instance | ++-------------------+----------------------------------------------------+------------------------------------------------------------------+ +| f | f:my_function | Function name | ++-------------------+----------------------------------------------------+------------------------------------------------------------------+ +| <whatever> | myParameter:something | All parameters are passed on in an associative array | ++-------------------+----------------------------------------------------+------------------------------------------------------------------+ + +**Example** + +* PHP script (fileadmin/scripts/my_script.php) :: + + <?php + function my_function($param, $qfq) { + + echo 'The first argument contains all attributes including "src" and "f":<br>'; + print_r($param); + + echo '<br><br>get variable from record store:<br>'; + print_r($qfq::getVar('savedInRecordStore', 'RE')); + + echo '<br><br>Make API call:<br>'; + list($http_code, $answer) = $qfq::apiCall('GET', 'google.com'); + echo 'Http code: ' . $http_code; + + // Returned array fills client store + return ["IAmInClientStore" => "FooBar"]; + } + +* QFQ report :: + + 5.sql = SELECT "IAmInRecordStore" AS _savedInRecordStore + 10.sql = SELECT "scr:fileadmin/scripts/my_script.php|f:my_function|a1:Hello|a2:World" AS _script + 20.sql = SELECT "<br><br>Returened value: {{IAmInClientStore:C:alnumx}}" + +* Output :: + + The first argument contains all attributes including "src" and "f": + Array ( [scr] => fileadmin/scripts/my_script.php [f] => my_function [a1] => Hello [a2] => World ) + + get variable from record store: + IAmInRecordStore + + Make API call: + Http code: 301 + + Returened value: FooBar .. _column_pdf: diff --git a/extension/Classes/Core/Constants.php b/extension/Classes/Core/Constants.php index a67e02e69..7f20c086c 100644 --- a/extension/Classes/Core/Constants.php +++ b/extension/Classes/Core/Constants.php @@ -1616,6 +1616,7 @@ const COLUMN_SENDMAIL = "sendmail"; const COLUMN_VERTICAL = "vertical"; const COLUMN_WEBSOCKET = "websocket"; const COLUMN_REST_CLIENT = "restClient"; +const COLUMN_SCRIPT = "script"; const COLUMN_NO_WRAP = "noWrap"; const COLUMN_HIDE = "hide"; @@ -1773,6 +1774,7 @@ const TOKEN_COPY_TO_CLIPBOARD = 'y'; const TOKEN_DROPDOWN = 'z'; const TOKEN_WEBSOCKET = 'w'; const TOKEN_REST_CLIENT = 'n'; +const TOKEN_SCRIPT = 'scr'; const TOKEN_TEXT = 't'; const TOKEN_ALT_TEXT = 'a'; @@ -1800,6 +1802,7 @@ const TOKEN_FILE = 'F'; const TOKEN_FILE_DEPRECATED = 'f'; // since 5.12.17 const TOKEN_DOWNLOAD_MODE = 'M'; const TOKEN_ATTRIBUTE = 'A'; +const TOKEN_FUNCTION = 'f'; const TOKEN_THUMBNAIL = 'T'; const TOKEN_THUMBNAIL_DIMENSION = 'W'; diff --git a/extension/Classes/Core/Report/ColumnScript.php b/extension/Classes/Core/Report/ColumnScript.php new file mode 100644 index 000000000..a74e72210 --- /dev/null +++ b/extension/Classes/Core/Report/ColumnScript.php @@ -0,0 +1,85 @@ +<?php + +namespace IMATHUZH\Qfq\Core\Report; + +use IMATHUZH\Qfq\Core\Helper\KeyValueStringParser; +use IMATHUZH\Qfq\Core\Store\Store; + + +/** + * Class ColumnScript + * @package IMATHUZH\Qfq\Core\Report + * + * Executes a function of an external script. Column parameters: + * scr: path to script + * f: function name + * + * All parameters are passed to the function as the first argument. + * The second argument passed is an instance of ScriptFunctions which acts as an interface to QFQ functionality. + */ +class ColumnScript { + public function render(string $columnValue) { + + // Parse arguments + $param = KeyValueStringParser::parse($columnValue, PARAM_TOKEN_DELIMITER, PARAM_DELIMITER); + if (empty($param[TOKEN_SCRIPT])) { + throw new \UserReportException("Missing script path.", ERROR_MISSING_VALUE); + } + if (empty($param[TOKEN_FUNCTION])) { + throw new \UserReportException("Missing function name.", ERROR_MISSING_VALUE); + } + + // include script + $scriptPath = getcwd() . '/' . $param[TOKEN_SCRIPT]; + if (!is_readable($scriptPath)) { + throw new \UserReportException("Can't read script file.", ERROR_IO_READ_FILE); + } + try { + if((include_once $scriptPath) === false) + { + throw new \Exception('Include failed.'); + } + } catch (\Exception | \Error $e) { + throw new \UserReportException(json_encode([ + ERROR_MESSAGE_TO_USER => 'Error during reading script file.', + ERROR_MESSAGE_TO_DEVELOPER => "Error meassage:\n" . $e->getMessage()])); + } + + // execute function, write output to buffer + if (!function_exists($param[TOKEN_FUNCTION])) { + throw new \UserReportException("Function doesn't exist.", ERROR_IO_READ_FILE); + } + ob_start(); + try { + $return = call_user_func_array($param[TOKEN_FUNCTION], [$param, new ScriptFunctions()]); + $output = ob_get_clean(); + } catch (\Exception | \Error $e) { + ob_end_clean(); + throw new \UserReportException(json_encode([ + ERROR_MESSAGE_TO_USER => 'Function execution failed.', + ERROR_MESSAGE_TO_DEVELOPER => "Error message:\n" . $e->getMessage() . "\n\nFunction: " . $param[TOKEN_FUNCTION] . "\n\nParameters:\n" . print_r($param,true)])); + } + + // return buffer output and fill store + Store::setStore($return, STORE_CLIENT, true); + return $output; + } +} + +/** + * Class ScriptFunctions + * @package IMATHUZH\Qfq\Core\Report + * + * An instance of this class is passed as the last argument to every external function call. + * WARNING: Be aware that this acts as a "public" interface to QFQ. All changes made in here might break existing applications. + */ +class ScriptFunctions { + public static function apiCall(string $method, string $url, string $data = '', array $header = [], int $timeout = 5) { + return RestClient::callApiCurl($method, $url, $data, $header, $timeout); + } + public static function getVar($key, $useStores = STORE_USE_DEFAULT, $sanitizeClass = '', &$foundInStore = '', + $typeMessageViolate = SANITIZE_TYPE_MESSAGE_VIOLATE_CLASS) { + return Store::getInstance()->getVar($key, $useStores, $sanitizeClass, $foundInStore, + $typeMessageViolate); + } +} \ No newline at end of file diff --git a/extension/Classes/Core/Report/Report.php b/extension/Classes/Core/Report/Report.php index d38422736..0360be846 100644 --- a/extension/Classes/Core/Report/Report.php +++ b/extension/Classes/Core/Report/Report.php @@ -949,6 +949,9 @@ class Report { case COLUMN_REST_CLIENT: $content .= $this->link->renderLink($columnValue); break; + case COLUMN_SCRIPT: + $content .= ColumnScript::render($columnValue); + break; case COLUMN_EXEC: $rc = ''; diff --git a/extension/Classes/Core/Report/RestClient.php b/extension/Classes/Core/Report/RestClient.php index b7b640e1d..3d732d2e7 100644 --- a/extension/Classes/Core/Report/RestClient.php +++ b/extension/Classes/Core/Report/RestClient.php @@ -126,7 +126,7 @@ class RestClient { return $param; } - private static function callApiCurl(string $method, string $url, string $data = '', array $header = [], int $timeout = 5) { + public static function callApiCurl(string $method, string $url, string $data = '', array $header = [], int $timeout = 5) { $ch = curl_init(); $curlConfig = array( diff --git a/extension/NoT3Page/index.php b/extension/NoT3Page/index.php index 5f474b75c..06a5be1f7 100644 --- a/extension/NoT3Page/index.php +++ b/extension/NoT3Page/index.php @@ -41,6 +41,7 @@ use IMATHUZH\Qfq\Core\QuickFormQuery; // TODO: replace all paths with typo3conf/ (usw.) and /../ and fileadmin/ with correct path computing function. // TODO: Compare Support::joinPath with Path::join // TODO: go through all variables/keywords that can be set by user in docs.qfq.io +// TODO: use PATH:: instead of gtCwd in ColumnScript.php // Config out of store // TODO: follow every SYSTEM variable an replace store call with Config getter -- GitLab From bd648b7618e57ed2264eef12aa39b8999fe8779a Mon Sep 17 00:00:00 2001 From: Marc Egger <marc.egger@uzh.ch> Date: Wed, 16 Sep 2020 16:51:04 +0200 Subject: [PATCH 090/195] small doku fix --- Documentation/Report.rst | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/Documentation/Report.rst b/Documentation/Report.rst index 3365712bb..c4b79b585 100644 --- a/Documentation/Report.rst +++ b/Documentation/Report.rst @@ -1412,17 +1412,17 @@ Run a php function defined in an external script. * The second argument (here called $qfq) is an object which acts as an interface to QFQ functionality. * The script has access to the following qfq functions using this interface: * $qfq::apiCall($method, $url, $data = [], $header = [], $timeout = 5) - * string $method PUT/POST/GET/DELETE + * string $method can be PUT/POST/GET/DELETE * string $url - * array $data json string, will be added as GET parameters or as POST fields respectively. - * array $header of the form ['Content-type: text/plain', 'Content-length: 100'] - * int $timeout number of seconds to wait until call is aborted. + * array $data a json string which will be added as GET parameters or as POST fields respectively. + * array $header is of the form ['Content-type: text/plain', 'Content-length: 100'] + * int $timeout is the number of seconds to wait until call is aborted. * $qfq::getVar($key, $useStores = 'FSRVD', $sanitizeClass = '', &$foundInStore = '', $typeMessageViolate = 'c') - * string $key name of qfq variable - * string $useStores Stores in which variable is searched (in order from left to right). see :ref:`store`. - * string $sanitizeClass see :ref:`sanitize-class` + * string $key is the name of qfq variable + * string $useStores are the stores in which variable is searched (in order from left to right). see :ref:`store`. + * string $sanitizeClass (see :ref:`sanitize-class`) * string $foundInStore is filled with the name of the store in which the variable was found. - * string $typeMessageViolate what to return if the sanitize class was violated: + * string $typeMessageViolate defines what to return if the sanitize class was violated: * 'c': return '!!<sanitize class>!!' * '0': return '0' * 'e': return '' -- GitLab From 3c78e46a5af4c28b0f53fc42710107b82e5be11e Mon Sep 17 00:00:00 2001 From: Marc Egger <marc.egger@uzh.ch> Date: Tue, 22 Sep 2020 18:16:30 +0200 Subject: [PATCH 091/195] dataReport.php: add custom response header --- Documentation/Report.rst | 53 +++++++++++++++------------- extension/Classes/Api/dataReport.php | 29 +++++++++++++-- extension/Classes/Core/Constants.php | 1 + 3 files changed, 55 insertions(+), 28 deletions(-) diff --git a/Documentation/Report.rst b/Documentation/Report.rst index f3aa5a842..1afbe12df 100644 --- a/Documentation/Report.rst +++ b/Documentation/Report.rst @@ -1692,30 +1692,33 @@ API Call QFQ Report (e.g. AJAX) .. note:: - QFQ Report functionality protected by SIP offered to simple API calls: ``typo3conf/ext/qfq/Api/dataReport.php?s=....`` - -General use API call to fire a specific QFQ tt-content record. Useful for e.g. AJAX calls. No Typo3 is involved. -*No FE-Group access control*. - -This describes the client side (=QFQ is client). For server function check :ref:`restApi`. - -Example QFQ record JS:: - - # Register SIP with given arguments. - 10.sql = SELECT 'U:uid=12345&arg1=Hello&arg2=World|s|r:8' AS '_link|col1' - # Build JS - 10.tail = <script> - function writeYourOwnAjax(){ - $.ajax({ - url: 'typo3conf/ext/qfq/Api/dataReport.php?s={{col1:RE}}', - data: {arg3:456, arg4:567}, - method: 'POST', - dataType: 'JSON', - success: function(response) {ajaxSuccess(response);}, - error: function(jqXHR, textStatus, errorThrown) {ajaxError(jqXHR, textStatus, errorThrown);} - }); - } - </script> + QFQ Report functionality protected by SIP offered to simple API calls: ``typo3conf/ext/qfq/Classes/Api/dataReport.php?s=....`` + +* General use API call to fire a specific QFQ tt-content record. Useful for e.g. AJAX calls. No Typo3 is involved. *No FE-Group access control*. +* This defines just a simple API endpoint. For defining a rest API see: :ref:`restApi`. +* Custom response headers can be defined by setting the variable `apiResponseHeader` in the record store. + * Multiple headers should be separated by '\n' or '\r\n'. e.g.: 'Content-Type: application/json\ncustom-header: fooBar' +* If a QFQ error occurs then a http-status of 400 is returned together with a JSON encoded response of the form: `{"status":"error", "message":"..."}` + +Example QFQ record JS (with tt_content.uid=12345):: + + 5.sql = SELECT "See console log for output" + + # Register SIP with given arguments. + 10.sql = SELECT 'U:uid=12345&arg1=Hello&arg2=World|s|r:8' AS '_link|col1|_hide' + + # Build JS + 10.tail = <script> + console.log('start api request'); + $.ajax({ + url: 'typo3conf/ext/qfq/Classes/Api/dataReport.php?s={{&col1:RE}}', + data: {arg3:456, arg4:567}, + method: 'POST', + dataType: 'TEXT', + success: function(response, status, jqxhr) {console.log(response); console.log(jqxhr.getAllResponseHeaders());}, + error: function(jqXHR, textStatus, errorThrown) {console.log(jqXHR.responseText, textStatus, errorThrown);} + }); + </script> Example QFQ record called by above AJAX:: @@ -1723,7 +1726,7 @@ Example QFQ record called by above AJAX:: # The example above assumes that this record has the tt_content.uid=12345. render = api 10.sql = SELECT '{{arg1:S}} {{arg2:S}} {{arg3:C}} {{arg4:C}}', NOW() - + , 'Content-Type: application/json\ncustom-header: fooBar' AS _apiResponseHeader .. _rest_client: diff --git a/extension/Classes/Api/dataReport.php b/extension/Classes/Api/dataReport.php index fe1d2e68e..3584ce52b 100644 --- a/extension/Classes/Api/dataReport.php +++ b/extension/Classes/Api/dataReport.php @@ -10,7 +10,9 @@ namespace IMATHUZH\Qfq\Api; require_once(__DIR__ . '/../../vendor/autoload.php'); +use IMATHUZH\Qfq\Core\Helper\Path; use IMATHUZH\Qfq\Core\QuickFormQuery; +use IMATHUZH\Qfq\Core\Store\Store; /** @@ -36,10 +38,23 @@ $status = HTTP_400_BAD_REQUEST; try { try { + Path::setMainPaths(Path::API_TO_APP); $qfq = new QuickFormQuery(['bodytext' => '']); $data = $qfq->dataReport(); + + // Get custom headers from record store + $headers = Store::getInstance()->getVar(API_HEADER_VARIABLE_KEY, 'RE'); + if (!empty($headers)) { + $headers = str_replace("\r\n", '$$SEP$$', $headers); + $headers = str_replace("\n", '$$SEP$$', $headers); + $headers = explode('$$SEP$$', $headers); + } else { + $headers = []; + } + $status = HTTP_200_OK; + } catch (\UserReportException $e) { $answer[API_MESSAGE] = $e->formatMessage(); } catch (\CodeException $e) { @@ -51,7 +66,15 @@ try { $answer[API_MESSAGE] = "Generic Exception: " . $e->getMessage(); } -//header('HTTP/1.0 ' . $status); -//header("Content-Type: application/json"); -//echo json_encode($answer); +// error output +if ($status === HTTP_400_BAD_REQUEST) { + header('HTTP/1.0 ' . $status); + header("Content-Type: application/json"); + echo json_encode($answer); +} + +// normal output +foreach ($headers as $header) { + header($header); +} echo $data; \ No newline at end of file diff --git a/extension/Classes/Core/Constants.php b/extension/Classes/Core/Constants.php index 691ccbdc9..4d4f87444 100644 --- a/extension/Classes/Core/Constants.php +++ b/extension/Classes/Core/Constants.php @@ -819,6 +819,7 @@ const API_FORM_UPDATE_VALUE = 'value'; const API_FORM_UPDATE_HIDDEN = 'hidden'; const API_FORM_UPDATE_DISABLED = 'disabled'; const API_FORM_UPDATE_REQUIRED = 'required'; +const API_HEADER_VARIABLE_KEY = 'apiResponseHeader'; const API_ELEMENT_UPDATE = 'element-update'; const API_ELEMENT_ATTRIBUTE = 'attr'; -- GitLab From ce84c05b348b63e6c6275b283eb7253c7f5550a6 Mon Sep 17 00:00:00 2001 From: Marc Egger <marc.egger@uzh.ch> Date: Tue, 22 Sep 2020 18:24:04 +0200 Subject: [PATCH 092/195] dataReport.php: exit after error message displaied --- extension/Classes/Api/dataReport.php | 1 + 1 file changed, 1 insertion(+) diff --git a/extension/Classes/Api/dataReport.php b/extension/Classes/Api/dataReport.php index 3584ce52b..f9ae6af53 100644 --- a/extension/Classes/Api/dataReport.php +++ b/extension/Classes/Api/dataReport.php @@ -71,6 +71,7 @@ if ($status === HTTP_400_BAD_REQUEST) { header('HTTP/1.0 ' . $status); header("Content-Type: application/json"); echo json_encode($answer); + exit(); } // normal output -- GitLab From 0f243da2cda971b43452ad12052f806378e3814f Mon Sep 17 00:00:00 2001 From: Marc Egger <marc.egger@uzh.ch> Date: Fri, 25 Sep 2020 13:31:58 +0200 Subject: [PATCH 093/195] replace some system path constants with Path:: --- extension/Classes/Core/Constants.php | 5 --- .../Core/Database/DatabaseUpdateData.php | 2 +- extension/Classes/Core/Delete.php | 3 +- extension/Classes/Core/Helper/Path.php | 21 +++++++++ extension/Classes/Core/Report/Download.php | 2 +- extension/Classes/Core/Report/SendMail.php | 2 +- extension/Classes/Core/Save.php | 4 +- extension/Classes/Core/Store/Store.php | 45 ------------------- extension/Classes/External/AutoCron.php | 3 +- extension/NoT3Page/index.php | 1 + extension/Tests/Unit/Core/DeleteTest.php | 6 ++- extension/Tests/Unit/Core/Store/StoreTest.php | 2 +- 12 files changed, 37 insertions(+), 59 deletions(-) diff --git a/extension/Classes/Core/Constants.php b/extension/Classes/Core/Constants.php index 4d4f87444..edb59aa29 100644 --- a/extension/Classes/Core/Constants.php +++ b/extension/Classes/Core/Constants.php @@ -549,15 +549,10 @@ const SYSTEM_FORM_BS_NOTE_COLUMNS = 'formBsNoteColumns'; const SYSTEM_BASE_URL = 'baseUrl'; -const SYSTEM_SEND_E_MAIL_ABSOLUTE = 'sendEmail'; const SYSTEM_SEND_E_MAIL_OPTIONS = 'sendEMailOptions'; const SYSTEM_EDIT_FORM_PAGE = 'editFormPage'; -// computed automatically during runtime -const SYSTEM_EXT_PATH_ABSOLUTE = 'extPath'; -const SYSTEM_SITE_PATH_ABSOLUTE = 'sitePath'; // Path of the App - const SYSTEM_LDAP_1_RDN = 'LDAP_1_RDN'; // Credentials to access LDAP const SYSTEM_LDAP_1_PASSWORD = 'LDAP_1_PASSWORD'; // Credentials to access LDAP diff --git a/extension/Classes/Core/Database/DatabaseUpdateData.php b/extension/Classes/Core/Database/DatabaseUpdateData.php index 5cfd8459e..30b2dd7b4 100644 --- a/extension/Classes/Core/Database/DatabaseUpdateData.php +++ b/extension/Classes/Core/Database/DatabaseUpdateData.php @@ -194,7 +194,7 @@ $UPDATE_ARRAY = array( "ALTER TABLE `FormElement` CHANGE `label` `label` VARCHAR(1023) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULT '';", ], - '20.7.0' => [ + '20.X.0' => [ // TODO: replace X with newest version number "ALTER TABLE `Form` ADD `fileStats` VARCHAR(255) NOT NULL DEFAULT '' AFTER `created`;", ], ); diff --git a/extension/Classes/Core/Delete.php b/extension/Classes/Core/Delete.php index ea893f6d7..81f5c2a67 100644 --- a/extension/Classes/Core/Delete.php +++ b/extension/Classes/Core/Delete.php @@ -9,6 +9,7 @@ namespace IMATHUZH\Qfq\Core; use IMATHUZH\Qfq\Core\Database\Database; +use IMATHUZH\Qfq\Core\Helper\Path; use IMATHUZH\Qfq\Core\Store\Store; use IMATHUZH\Qfq\Core\Helper\HelperFile; @@ -70,7 +71,7 @@ class Delete { // Take care the necessary target directories exist. $cwd = getcwd(); - $sitePath = $this->store->getVar(SYSTEM_SITE_PATH_ABSOLUTE, STORE_SYSTEM); + $sitePath = Path::absoluteApp(); if ($cwd === false || $sitePath === false || !HelperFile::chdir($sitePath)) { throw new \UserFormException( json_encode([ERROR_MESSAGE_TO_USER => 'getcwd() failed or SITE_PATH undefined or chdir() failed', ERROR_MESSAGE_TO_DEVELOPER => "getcwd() failed or SITE_PATH undefined or chdir('$sitePath') failed."]), diff --git a/extension/Classes/Core/Helper/Path.php b/extension/Classes/Core/Helper/Path.php index f025f8ec6..88e618f84 100644 --- a/extension/Classes/Core/Helper/Path.php +++ b/extension/Classes/Core/Helper/Path.php @@ -100,6 +100,9 @@ class Path const APP_TO_SYSTEM_THUMBNAIL_DIR_PUBLIC_DEFAULT = 'typo3temp/qfqThumbnail'; const APP_TO_THUMBNAIL_UNKNOWN_TYPE = 'typo3/sysext/frontend/Resources/Public/Icons/FileIcons/'; + // Send Email + const EXT_TO_SEND_EMAIL_FILE = '/Classes/External/sendEmail'; + /** * @param string $cwdToApp * @throws \CodeException @@ -112,6 +115,24 @@ class Path self::findAndSetLogPath(); } + /** + * @return string + * @throws \UserFormException + */ + public static function absoluteApp(/* path parts to append */): string + { + return realpath(self::cwdToApp(func_get_args())); + } + + /** + * @return string + * @throws \UserFormException + */ + public static function absoluteExt(/* path parts to append */): string + { + return realpath(self::cwdToExt(func_get_args())); + } + /** * @return string * @throws \UserFormException diff --git a/extension/Classes/Core/Report/Download.php b/extension/Classes/Core/Report/Download.php index 862098ca2..ed7a5fde5 100644 --- a/extension/Classes/Core/Report/Download.php +++ b/extension/Classes/Core/Report/Download.php @@ -543,7 +543,7 @@ class Download { $srcFiles = array(); $filesCleanLater = array(); - $workDir = $this->store->getVar(SYSTEM_SITE_PATH_ABSOLUTE, STORE_SYSTEM); + $workDir = Path::absoluteApp(); HelperFile::chdir($workDir); $downloadMode = $vars[DOWNLOAD_MODE]; diff --git a/extension/Classes/Core/Report/SendMail.php b/extension/Classes/Core/Report/SendMail.php index 1ed506372..44decbead 100644 --- a/extension/Classes/Core/Report/SendMail.php +++ b/extension/Classes/Core/Report/SendMail.php @@ -221,7 +221,7 @@ class SendMail { $args[] = '-o message-header="' . $mailConfig[SENDMAIL_TOKEN_HEADER] . '"'; } - $sendEmail = $this->store->getVar(SYSTEM_SEND_E_MAIL_ABSOLUTE, STORE_SYSTEM); + $sendEmail = Path::absoluteExt(Path::EXT_TO_SEND_EMAIL_FILE); if (empty($sendEmail)) { throw new \UserFormException("Missing 'sendEmail'", ERROR_SENDMAIL); } diff --git a/extension/Classes/Core/Save.php b/extension/Classes/Core/Save.php index fe717a4a8..0367e4806 100644 --- a/extension/Classes/Core/Save.php +++ b/extension/Classes/Core/Save.php @@ -495,7 +495,7 @@ class Save { // Upload - Take care the necessary target directories exist. $cwd = getcwd(); - $sitePath = $this->store->getVar(SYSTEM_SITE_PATH, STORE_SYSTEM); + $sitePath = Path::cwdToApp(); if ($cwd === false || $sitePath === false || !HelperFile::chdir($sitePath)) { throw new \UserFormException( json_encode([ERROR_MESSAGE_TO_USER => 'getcwd() failed or SITE_PATH undefined or chdir() failed', ERROR_MESSAGE_TO_DEVELOPER => "getcwd() failed or SITE_PATH undefined or chdir('$sitePath') failed."]), @@ -780,7 +780,7 @@ class Save { // Take care the necessary target directories exist. $cwd = getcwd(); - $sitePath = $this->store->getVar(SYSTEM_SITE_PATH_ABSOLUTE, STORE_SYSTEM); + $sitePath = Path::absoluteApp(); if ($cwd === false || $sitePath === false || !HelperFile::chdir($sitePath)) { throw new \UserFormException( json_encode([ERROR_MESSAGE_TO_USER => 'getcwd() failed or SITE_PATH undefined or chdir() failed', ERROR_MESSAGE_TO_DEVELOPER => "getcwd() failed or SITE_PATH undefined or chdir('$sitePath') failed."]), diff --git a/extension/Classes/Core/Store/Store.php b/extension/Classes/Core/Store/Store.php index a1f1f6231..a79fc05f8 100644 --- a/extension/Classes/Core/Store/Store.php +++ b/extension/Classes/Core/Store/Store.php @@ -241,48 +241,6 @@ class Store { return self::$instance; } - /** - * QFQ might be called via Typo3 (index.php) or directly via AJAX (directory: api). The - * - * @param array $config - * - * @return array - */ - private static function doSystemPath(array $config) { - - // SYSTEM_PATH_EXT: compute only if not already defined. - if (!isset($config[SYSTEM_EXT_PATH_ABSOLUTE]) || $config[SYSTEM_EXT_PATH_ABSOLUTE] === '' || $config[SYSTEM_EXT_PATH_ABSOLUTE][0] !== '/') { - $relExtDir = '/typo3conf/ext/' . EXT_KEY; - - if (defined('PHPUNIT_QFQ')) { - $cwd = getcwd(); - $pos = strpos($cwd, '/typo3conf/'); - - // this means phpUnit. - $config[SYSTEM_SITE_PATH_ABSOLUTE] = substr($cwd, 0, $pos); - $config[SYSTEM_EXT_PATH_ABSOLUTE] = $config[SYSTEM_SITE_PATH_ABSOLUTE] . $relExtDir; - - } else { - // If we are called through AJAX API (e.g. api/save.php), there is no TYPO3 environment. - $pos = strpos($_SERVER['SCRIPT_FILENAME'] ?? '', $relExtDir); - if ($pos === false && isset($GLOBALS['TYPO3_LOADED_EXT'][EXT_KEY]['ext_localconf.php'])) { - - // Typo3 extension: probably index.php - $config[SYSTEM_EXT_PATH_ABSOLUTE] = dirname($GLOBALS['TYPO3_LOADED_EXT'][EXT_KEY]['ext_localconf.php']); - $config[SYSTEM_SITE_PATH_ABSOLUTE] = dirname($_SERVER['SCRIPT_FILENAME'] ?? ''); - } else { - // API - $config[SYSTEM_EXT_PATH_ABSOLUTE] = substr($_SERVER['SCRIPT_FILENAME'] ?? '', 0, $pos + strlen($relExtDir)); - $config[SYSTEM_SITE_PATH_ABSOLUTE] = substr($_SERVER['SCRIPT_FILENAME'] ?? '', 0, $pos); - } - } - } - - Logger::setSystemSitePathAbsolute($config[SYSTEM_SITE_PATH_ABSOLUTE]); - - return $config; - } - /** * Depending on some configuration value, update corresponding values. * @@ -294,8 +252,6 @@ class Store { $config[SYSTEM_SHOW_DEBUG_INFO] = self::adjustConfigShowDebugInfo($config[SYSTEM_SHOW_DEBUG_INFO], self::beUserLoggdIn()); - $config[SYSTEM_SEND_E_MAIL_ABSOLUTE] = $config[SYSTEM_EXT_PATH_ABSOLUTE] . '/Classes/External/sendEmail'; - // In case the database credentials are given in the old style: copy them to the new style if (!isset($config[SYSTEM_DB_1_USER]) && isset($config[SYSTEM_DB_USER])) { $config[SYSTEM_DB_1_USER] = $config[SYSTEM_DB_USER]; @@ -461,7 +417,6 @@ class Store { $config = Config::readConfig($PhpUnitOverloadCwdToConfigFile); - $config = self::doSystemPath($config); $config = self::adjustConfig($config); $config = self::setAutoConfigValue($config); diff --git a/extension/Classes/External/AutoCron.php b/extension/Classes/External/AutoCron.php index b6db399cc..8d3a30123 100644 --- a/extension/Classes/External/AutoCron.php +++ b/extension/Classes/External/AutoCron.php @@ -13,6 +13,7 @@ use IMATHUZH\Qfq\Core\Database\Database; use IMATHUZH\Qfq\Core\Evaluate; use IMATHUZH\Qfq\Core\Helper\DownloadPage; use IMATHUZH\Qfq\Core\Helper\Logger; +use IMATHUZH\Qfq\Core\Helper\Path; use IMATHUZH\Qfq\Core\Helper\Support; use IMATHUZH\Qfq\Core\Report\SendMail; use IMATHUZH\Qfq\Core\Store\Store; @@ -175,7 +176,7 @@ class AutoCron { // If configured, log the download content if (!empty($job[AUTOCRON_OUTPUT_FILE])) { - $job[AUTOCRON_OUTPUT_FILE] = Support::joinPath($this->store->getVar(SYSTEM_SITE_PATH_ABSOLUTE, STORE_SYSTEM), $job[AUTOCRON_OUTPUT_FILE], FILE_PRIORITY); + $job[AUTOCRON_OUTPUT_FILE] = Support::joinPath(Path::absoluteApp(), $job[AUTOCRON_OUTPUT_FILE], FILE_PRIORITY); Logger::logMessage($page, $job[AUTOCRON_OUTPUT_FILE], $job[AUTOCRON_OUTPUT_MODE] == 'append' ? FILE_MODE_APPEND : FILE_MODE_WRITE); } diff --git a/extension/NoT3Page/index.php b/extension/NoT3Page/index.php index 06a5be1f7..7e385dae0 100644 --- a/extension/NoT3Page/index.php +++ b/extension/NoT3Page/index.php @@ -58,6 +58,7 @@ use IMATHUZH\Qfq\Core\QuickFormQuery; // Before production // TODO: switch qfq.debug.js with qfq.min.js +// TODO: DatabaseUpdateData.php move updates from '20.X.0' to newest //// diff --git a/extension/Tests/Unit/Core/DeleteTest.php b/extension/Tests/Unit/Core/DeleteTest.php index da28b65e1..efbac6462 100644 --- a/extension/Tests/Unit/Core/DeleteTest.php +++ b/extension/Tests/Unit/Core/DeleteTest.php @@ -9,6 +9,7 @@ namespace IMATHUZH\Qfq\Tests\Unit\Core; use IMATHUZH\Qfq\Core\Delete; +use IMATHUZH\Qfq\Core\Helper\Path; use IMATHUZH\Qfq\Core\Store\Store; use IMATHUZH\Qfq\Tests\Unit\Core\Database\AbstractDatabaseTest; @@ -73,7 +74,10 @@ class DeleteTest extends AbstractDatabaseTest { parent::setUp(); $this->store->setVar('form', 'TestFormName', STORE_TYPO3); - $this->store->setVar(SYSTEM_SITE_PATH_ABSOLUTE, '/tmp', STORE_SYSTEM, true); + + Path::setMainPaths('/tmp'); + // The above replaces the following line with a Path:: function. Probably won't work. + // $this->store->setVar(SYSTEM_SITE_PATH_ABSOLUTE, '/tmp', STORE_SYSTEM, true); $this->executeSQLFile(__DIR__ . '/Database/fixtures/Generic.sql', true); } diff --git a/extension/Tests/Unit/Core/Store/StoreTest.php b/extension/Tests/Unit/Core/Store/StoreTest.php index d4955d8ef..6819f2f74 100644 --- a/extension/Tests/Unit/Core/Store/StoreTest.php +++ b/extension/Tests/Unit/Core/Store/StoreTest.php @@ -444,7 +444,7 @@ class StoreTest extends TestCase { $config = $this->store->getStore(STORE_SYSTEM); # The following won't be checked by content, cause they will change on different installations. - foreach ([SYSTEM_SITE_PATH_ABSOLUTE, SYSTEM_EXT_PATH_ABSOLUTE, SYSTEM_SEND_E_MAIL_ABSOLUTE, SYSTEM_SESSION_TIMEOUT_SECONDS, SYSTEM_QFQ_LOG_PATHFILENAME, + foreach ([SYSTEM_SESSION_TIMEOUT_SECONDS, SYSTEM_QFQ_LOG_PATHFILENAME, SYSTEM_SQL_LOG_PATHFILENAME, SYSTEM_MAIL_LOG_PATHFILENAME, SYSTEM_FILE_MAX_FILE_SIZE] as $key) { $this->assertTrue(isset($config[$key]), "Missing default value for '$key' "); unset ($config[$key]); -- GitLab From c97c1b9c285dabc87a3a04aa00fd71d700ccb5a4 Mon Sep 17 00:00:00 2001 From: Marc Egger <marc.egger@uzh.ch> Date: Mon, 28 Sep 2020 12:41:01 +0200 Subject: [PATCH 094/195] selenium test, small fix --- extension/Tests/selenium/qfqselenium.py | 16 ++++++---------- extension/Tests/selenium/run_tests.sh | 2 +- .../Tests/selenium/test_basic_functionality.py | 1 + 3 files changed, 8 insertions(+), 11 deletions(-) diff --git a/extension/Tests/selenium/qfqselenium.py b/extension/Tests/selenium/qfqselenium.py index 41c7cf529..fcdf724d7 100644 --- a/extension/Tests/selenium/qfqselenium.py +++ b/extension/Tests/selenium/qfqselenium.py @@ -353,28 +353,24 @@ class QfqSeleniumTestCase(unittest.TestCase): """ this function uploads a generated file from the given arguments size and suffix. This file is uploaded to the - input with the given data reference. + input field with the given data reference. """ - # stores the tmp dir name + + # create temp directory tmp_dir = "tmp" - # checks if the tmp dir doesn't already exist if not os.path.exists(tmp_dir): - # creates tmp dir if it doesn't exist os.makedirs(tmp_dir) - # loops through all files in the tmp directory + # remove old temp files for f in glob.glob(tmp_dir + "/*." + suffix): - # removes each file (old test files) os.remove(f) - # stores the path for the file + # create random file file_path = os.getcwd() + "/" + tmp_dir + "/" + file_name + "." + suffix - # opens the file from the file path (creates the file) with open(file_path, "w") as f: - # writes some random text to the file with the given size f.write(self.qfq_generate_random_string(size)) - # uploads the created file + # fill path into upload field self.qfq_get_element_by_data_ref(data_reference).send_keys(file_path) diff --git a/extension/Tests/selenium/run_tests.sh b/extension/Tests/selenium/run_tests.sh index af01873a4..74e0fac62 100755 --- a/extension/Tests/selenium/run_tests.sh +++ b/extension/Tests/selenium/run_tests.sh @@ -1,7 +1,7 @@ #!/bin/bash # run a single test function. e.g. "test_basic_functionality.TestBasicFunctionality.test_qfq_form_switch_pill" -TEST_FUNCTION="test_basic_functionality.TestBasicFunctionality.test_qfq_form_switch_pill" # NOTE: make sure there are no trailing spaces! +TEST_FUNCTION="test_basic_functionality.TestBasicFunctionality.test_qfq_valid_file_upload" # NOTE: make sure there are no trailing spaces! export SELENIUM_URL="https://webwork16.math.uzh.ch/megger/qfq/typo3conf/ext/qfq/NoT3Page" export SELENIUM_BROWSER="chrome" diff --git a/extension/Tests/selenium/test_basic_functionality.py b/extension/Tests/selenium/test_basic_functionality.py index a11755bca..a005745c2 100644 --- a/extension/Tests/selenium/test_basic_functionality.py +++ b/extension/Tests/selenium/test_basic_functionality.py @@ -203,6 +203,7 @@ class TestBasicFunctionality(qfqselenium.QfqSeleniumTestCase): # upload valid file s.qfq_open_pill(s.pill2_text) s.qfq_upload_file(s.file_upload_ref, unique_file_name, "txt", 32) + s.qfq_wait(1) # save + close s.qfq_click_save_form_button() -- GitLab From 723427bfd39361a6783d522d9fc3720063e093c4 Mon Sep 17 00:00:00 2001 From: Marc Egger <marc.egger@uzh.ch> Date: Mon, 28 Sep 2020 17:32:07 +0200 Subject: [PATCH 095/195] Config.php refactor to read config before store initialized --- extension/Classes/Api/print.php | 4 +- extension/Classes/Core/Constants.php | 2 - extension/Classes/Core/Helper/Path.php | 84 +++++++++- extension/Classes/Core/QuickFormQuery.php | 3 + extension/Classes/Core/Report/Html2Pdf.php | 3 - extension/Classes/Core/Report/Report.php | 2 +- extension/Classes/Core/Store/Config.php | 176 ++++++++++----------- extension/Classes/Core/Store/Session.php | 43 ++++- extension/Classes/Core/Store/Store.php | 5 +- extension/Tests/selenium/run_tests.sh | 4 +- extension/ext_conf_template.txt | 3 - 11 files changed, 218 insertions(+), 111 deletions(-) diff --git a/extension/Classes/Api/print.php b/extension/Classes/Api/print.php index 2ba7336e6..74f11f603 100644 --- a/extension/Classes/Api/print.php +++ b/extension/Classes/Api/print.php @@ -13,6 +13,7 @@ require_once(__DIR__ . '/../../vendor/autoload.php'); use IMATHUZH\Qfq\Core\Helper\Path; use IMATHUZH\Qfq\Core\Report\Html2Pdf; +use IMATHUZH\Qfq\Core\Store\Config; /** @@ -20,7 +21,8 @@ use IMATHUZH\Qfq\Core\Report\Html2Pdf; */ try { Path::setMainPaths(Path::API_TO_APP); - $html2pdf = new Html2Pdf(); + Config::readConfig(''); + $html2pdf = new Html2Pdf(Config::getConfigArray()); $html2pdf->outputHtml2Pdf(); diff --git a/extension/Classes/Core/Constants.php b/extension/Classes/Core/Constants.php index edb59aa29..ab18ff9ac 100644 --- a/extension/Classes/Core/Constants.php +++ b/extension/Classes/Core/Constants.php @@ -496,8 +496,6 @@ const SYSTEM_DB_NAME_DATA = 'dbNameData'; const SYSTEM_DB_NAME_QFQ = 'dbNameQfq'; const SYSTEM_DB_NAME_T3 = 'dbNameT3'; -const SYSTEM_QFQ_LOG_PATH = 'logPath'; // absolute or relative to app - const SYSTEM_QFQ_LOG_PATHFILENAME = 'qfqLog'; // absolute or relative to app const SYSTEM_MAIL_LOG_PATHFILENAME = 'mailLog'; // absolute or relative to app diff --git a/extension/Classes/Core/Helper/Path.php b/extension/Classes/Core/Helper/Path.php index 88e618f84..25f9130bb 100644 --- a/extension/Classes/Core/Helper/Path.php +++ b/extension/Classes/Core/Helper/Path.php @@ -104,6 +104,10 @@ class Path const EXT_TO_SEND_EMAIL_FILE = '/Classes/External/sendEmail'; /** + * Manually set the paths which are not constant nor can be inferred by other paths. + * This function must be called at the beginning of every entry point, to tell the Path class, where things are + * relative to the CWD. + * * @param string $cwdToApp * @throws \CodeException * @throws \UserFormException @@ -121,7 +125,7 @@ class Path */ public static function absoluteApp(/* path parts to append */): string { - return realpath(self::cwdToApp(func_get_args())); + return self::realpath(self::cwdToApp(func_get_args())); } /** @@ -130,7 +134,7 @@ class Path */ public static function absoluteExt(/* path parts to append */): string { - return realpath(self::cwdToExt(func_get_args())); + return self::realpath(self::cwdToExt(func_get_args())); } /** @@ -139,7 +143,7 @@ class Path */ public static function absoluteLog(/* path parts to append */): string { - return realpath(self::cwdToLog(func_get_args())); + return self::realpath(self::cwdToLog(func_get_args())); } /** @@ -274,6 +278,48 @@ class Path self::$overloadAbsoluteMailLogFile = $newPath; } + /** + * Override the paths of sql.log, qfq.log, mail.log using the values from the config file or Typo3. + * + * @throws \UserFormException + */ + public static function overrideLogPathsFromConfig() + { + // QFQ log + $absoluteQfqLogFile = Config::get(SYSTEM_QFQ_LOG_PATHFILENAME); + if (!empty($absoluteQfqLogFile)) { + self::setAbsoluteQfqLogFile(self::joinIfNotAbsolute(self::absoluteApp(), $absoluteQfqLogFile)); + } + + // Mail log + $absoluteMailLogFile = Config::get(SYSTEM_MAIL_LOG_PATHFILENAME); + if (!empty($absoluteMailLogFile)) { + self::setAbsoluteMailLogFile(self::joinIfNotAbsolute(self::absoluteApp(), $absoluteMailLogFile)); + } + + // SQL log + $absoluteSqlLogFile = Config::get(SYSTEM_SQL_LOG_PATHFILENAME); + if (!empty($absoluteSqlLogFile)) { + self::setAbsoluteSqlLogFile(self::joinIfNotAbsolute(self::absoluteApp(), $absoluteSqlLogFile)); + } + } + + /** + * Return the second path if it is absolute. Otherwise concatenate and return the two paths. + * + * @param string $path1 + * @param string $path2 + * @return string + * @throws \UserFormException + */ + public static function joinIfNotAbsolute (string $path1, string $path2): string + { + if ($path2 !== '' && $path2[0] === '/') { + return $path2; + } + return self::join($path1, $path2); + } + /** * Join the arguments together as a path. * The second argument may be an array of parts. (further arguments are ignored in that case) @@ -343,6 +389,11 @@ class Path } /** + * Searches these places for log directory: + * 1) project-directory/log + * 2) fileadmin/protected/log + * If not found create log dir in: project-directory/log + * * @throws \UserFormException */ private static function findAndSetLogPath() @@ -416,6 +467,8 @@ EOF; } /** + * Throw an exception if the given path is not set (i.e. === null). + * * @param $path * @throws \UserFormException */ @@ -426,12 +479,31 @@ EOF; } /** + * Throw exception if path does not start with '/' + * * @param $path * @throws \UserFormException */ - private static function enforcePathIsAbsolute($path) { - if($path[0] !== '/') { - Thrower::userFormException('Path is not absolute', "Path does not start with '/' : $path"); + private static function enforcePathIsAbsolute(string $path) { + if($path !== '' && $path[0] === '/') { + return; + } + Thrower::userFormException('Path is not absolute', "Path does not start with '/' : $path"); + } + + /** + * PHP System function: realpath() with QFQ exception + * + * @param string $path + * @return string + * @throws \UserFormException + */ + private static function realpath(string $path): string + { + $result = realpath($path); + if ($result === false) { + Thrower::userFormException('Path not found.', "Either file/dir not exists or access not permitted: $path."); } + return $result; } } \ No newline at end of file diff --git a/extension/Classes/Core/QuickFormQuery.php b/extension/Classes/Core/QuickFormQuery.php index d8c3edbda..8299c73ed 100644 --- a/extension/Classes/Core/QuickFormQuery.php +++ b/extension/Classes/Core/QuickFormQuery.php @@ -26,6 +26,7 @@ use IMATHUZH\Qfq\Core\Helper\Support; use IMATHUZH\Qfq\Core\Report\Monitor; use IMATHUZH\Qfq\Core\Report\Report; use IMATHUZH\Qfq\Core\Report\ReportAsFile; +use IMATHUZH\Qfq\Core\Store\Config; use IMATHUZH\Qfq\Core\Store\FillStoreForm; use IMATHUZH\Qfq\Core\Store\Session; use IMATHUZH\Qfq\Core\Store\Sip; @@ -121,6 +122,8 @@ class QuickFormQuery { */ public function __construct(array $t3data = array(), $phpUnit = false, $inlineReport = true) { + Config::readConfig(); + #TODO: rewrite $phpUnit to: "if (!defined('PHPUNIT_QFQ')) {...}" $this->phpUnit = $phpUnit; $this->inlineReport = $inlineReport; diff --git a/extension/Classes/Core/Report/Html2Pdf.php b/extension/Classes/Core/Report/Html2Pdf.php index 304d3c170..55c24c4d3 100644 --- a/extension/Classes/Core/Report/Html2Pdf.php +++ b/extension/Classes/Core/Report/Html2Pdf.php @@ -69,9 +69,6 @@ class Html2Pdf { public function __construct(array $config = array(), $phpUnit = false) { #TODO: rewrite $phpUnit to: "if (!defined('PHPUNIT_QFQ')) {...}" - if (count($config) == 0) { - $config = Config::readConfig(''); - } $this->config = $config; diff --git a/extension/Classes/Core/Report/Report.php b/extension/Classes/Core/Report/Report.php index 0360be846..9fbef3b28 100644 --- a/extension/Classes/Core/Report/Report.php +++ b/extension/Classes/Core/Report/Report.php @@ -193,7 +193,7 @@ class Report { $sqlLog = $this->store->getVar(TYPO3_SQL_LOG_ABSOLUTE, STORE_TYPO3); if (false !== $sqlLog) { - $sqlLogAbsolute = HelperFile::joinPathFilename(realpath(Path::cwdToApp()), $sqlLog); + $sqlLogAbsolute = HelperFile::joinPathFilename(Path::absoluteApp(), $sqlLog); Path::setAbsoluteSqlLogFile($sqlLogAbsolute); } diff --git a/extension/Classes/Core/Store/Config.php b/extension/Classes/Core/Store/Config.php index 578d9db9a..4c7d34434 100644 --- a/extension/Classes/Core/Store/Config.php +++ b/extension/Classes/Core/Store/Config.php @@ -21,6 +21,8 @@ use IMATHUZH\Qfq\Core\Helper\OnString; */ class Config { + private static $config = null; + const CONFIG_REQUIRED_TEMPLATE = [ SYSTEM_DB_1_USER => null, SYSTEM_DB_1_PASSWORD => null, @@ -28,6 +30,86 @@ class Config { SYSTEM_DB_1_NAME=> null, ]; + /** + * Get config value with given key. Throws exception if config has not been read. + * + * @param string $key + * @return mixed + * @throws \UserFormException + */ + public static function get(string $key) + { + if (self::$config === null) { + Thrower::userFormException("Config error.", "Config was accessed before it was read. Execute Config::readConfig() first."); + } + return self::$config[$key]; + } + + /** + * Returns a copy of the config array. Throws exception if config has not been read. + * + * @return array + * @throws \UserFormException + */ + public static function getConfigArray(): array + { + if (self::$config === null) { + Thrower::userFormException("Config error.", "Config was accessed before it was read. Execute Config::readConfig() first."); + } + return self::$config; + } + + /** + * Read qfq.json (merge with Typo3-qfq config if exists) + * Deprecated config file typo3conf/config.qfq.php is translated to JSON in PATH:cwdToProject(..) + * + * @param string $PhpUnitOverloadCwdToConfigFile + * @throws \CodeException + * @throws \UserFormException + * @throws \UserReportException + */ + public static function readConfig($PhpUnitOverloadCwdToConfigFile = '') { + + if (self::$config !== null && $PhpUnitOverloadCwdToConfigFile === '') { + return; + } + + // read and parse config. Throw exception if not exists. + $cwdToConfigFile = $PhpUnitOverloadCwdToConfigFile === '' ? Path::cwdToProject(CONFIG_QFQ_JSON) : $PhpUnitOverloadCwdToConfigFile; + if (!file_exists($cwdToConfigFile)) { + HelperFile::file_put_contents(Path::cwdToProject(CONFIG_QFQ_JSON_EXAMPLE), json_encode(self::CONFIG_REQUIRED_TEMPLATE, JSON_PRETTY_PRINT)); + Thrower::userFormException("Please create qfq config file '" . CONFIG_QFQ_JSON . "' in project directory. Example config file '" . CONFIG_QFQ_JSON_EXAMPLE . "' was created in project directory.", "Project directory: " . realpath(Path::cwdToProject())); + } + $config = HelperFile::json_decode(HelperFile::file_get_contents($cwdToConfigFile)); + + // check required keys + foreach (self::CONFIG_REQUIRED_TEMPLATE as $key => $value) { + if (!array_key_exists($key, $config) || is_null($config[$key]) || $config[$key] === '') { + Thrower::userFormException("Required key '$key' missing in config file " . CONFIG_QFQ_JSON, "Config file: $cwdToConfigFile"); + } + } + + if ($PhpUnitOverloadCwdToConfigFile === '') { + + // Settings in qfq.json overwrite T3 settings + $configT3qfq = self::readTypo3QfqConfig(); + $config = array_merge($configT3qfq, $config); + } + + $config = self::renameConfigElements($config); + $config = self::setDefaults($config); + self::checkDeprecated($config); + self::checkForAttack($config); + + // Copy values to detect custom settings later + $config[F_FE_DATA_PATTERN_ERROR_SYSTEM] = $config[F_FE_DATA_PATTERN_ERROR]; + + self::$config = $config; + + // Set log paths + Path::overrideLogPathsFromConfig(); + } + /** * Iterates over all 30 custom vars, explode them to split between key and value, append to $config. * @@ -58,7 +140,7 @@ class Config { } /** - * Overwrite the config file with data from given array. + * Overwrite the qfq config file with data from given array. * * @param array $config * @throws \UserFormException @@ -91,51 +173,6 @@ class Config { HelperFile::unlink($cwdToOldConfigFile); } - /** - * Read qfq.json (merge with Typo3-qfq config if exists) - * Deprecated config file typo3conf/config.qfq.php is translated to JSON in PATH:cwdToProject(..) - * - * @param string $PhpUnitOverloadCwdToConfigFile - * @return array - * @throws \CodeException - * @throws \UserFormException - * @throws \UserReportException - */ - public static function readConfig($PhpUnitOverloadCwdToConfigFile = '') { - - // read and parse config - $cwdToConfigFile = $PhpUnitOverloadCwdToConfigFile === '' ? Path::cwdToProject(CONFIG_QFQ_JSON) : $PhpUnitOverloadCwdToConfigFile; - if (!file_exists($cwdToConfigFile)) { - HelperFile::file_put_contents(Path::cwdToProject(CONFIG_QFQ_JSON_EXAMPLE), json_encode(self::CONFIG_REQUIRED_TEMPLATE, JSON_PRETTY_PRINT)); - Thrower::userFormException("Please create qfq config file '" . CONFIG_QFQ_JSON . "' in project directory. Example config file '" . CONFIG_QFQ_JSON_EXAMPLE . "' was created in project directory.", "Project directory: " . realpath(Path::cwdToProject())); - } - $config = HelperFile::json_decode(HelperFile::file_get_contents($cwdToConfigFile)); - - // check required keys - foreach (self::CONFIG_REQUIRED_TEMPLATE as $key => $value) { - if (!array_key_exists($key, $config) || is_null($config[$key]) || $config[$key] === '') { - Thrower::userFormException("Required key '$key' missing in config file " . CONFIG_QFQ_JSON, "Config file: $cwdToConfigFile"); - } - } - - if ($PhpUnitOverloadCwdToConfigFile === '') { - - // Settings in qfq.json overwrite T3 settings - $configT3qfq = self::readTypo3QfqConfig(); - $config = array_merge($configT3qfq, $config); - } - - $config = self::renameConfigElements($config); - $config = self::setDefaults($config); - self::checkDeprecated($config); - self::checkForAttack($config); - - // Copy values to detect custom settings later - $config[F_FE_DATA_PATTERN_ERROR_SYSTEM] = $config[F_FE_DATA_PATTERN_ERROR]; - - return $config; - } - /** * Read Typo3-QFQ config first from global variable, then from typo3conf/Localconfig.php. * If both not exist, return empty array. @@ -271,7 +308,8 @@ class Config { public static function attackDetectedExitNow(array $config = array(), $reason = '') { if (count($config) == 0) { - $config = self::readConfig(); + self::readConfig(); + $config = self::getConfigArray(); } Logger::logMessage(Logger::linePre() . 'Security: attack detected' . PHP_EOL . $reason, Path::absoluteQfqLogFile()); @@ -322,7 +360,6 @@ class Config { SYSTEM_RENDER => SYSTEM_RENDER_SINGLE, SYSTEM_DATE_FORMAT => 'yyyy-mm-dd', SYSTEM_SHOW_DEBUG_INFO => SYSTEM_SHOW_DEBUG_INFO_AUTO, - SYSTEM_QFQ_LOG_PATH => '', SYSTEM_MAIL_LOG_PATHFILENAME => '', SYSTEM_QFQ_LOG_PATHFILENAME => '', SYSTEM_SQL_LOG_PATHFILENAME => '', @@ -375,7 +412,7 @@ class Config { SYSTEM_DB_UPDATE => SYSTEM_DB_UPDATE_AUTO, SYSTEM_RECORD_LOCK_TIMEOUT_SECONDS => SYSTEM_RECORD_LOCK_TIMEOUT_SECONDS_DEFAULT, - SYSTEM_SESSION_TIMEOUT_SECONDS => self::getPhpSessionTimeout(), + SYSTEM_SESSION_TIMEOUT_SECONDS => Session::getPhpSessionTimeout(), SYSTEM_DOCUMENTATION_QFQ => SYSTEM_DOCUMENTATION_QFQ_URL, SYSTEM_ENTER_AS_SUBMIT => 1, @@ -464,45 +501,4 @@ class Config { return $config; } - - /** - * Check Session Timeout - * - * @param $timeout - * @throws \UserFormException - */ - public static function checkSessionTimeout($timeout) { - - if (self::getPhpSessionTimeout() < $timeout) { - throw new \UserFormException ("The specified timeout of $timeout seconds is higher than the PHP config 'session.gc_maxlifetime' (" - . ini_get('session.gc_maxlifetime') . ") and/or 'session.cookie_lifetime' (" - . ini_get('session.cookie_lifetime') . ")"); - } - - if ($timeout > SYSTEM_COOKIE_LIFETIME) { - throw new \UserFormException ("The specified timeout of $timeout seconds is higher than the hardcoded cookie lifetime (" . SYSTEM_COOKIE_LIFETIME . ")"); - } - } - - /** - * Get the minimum of 'session.cookie_lifetime' and 'session.gc_maxlifetime' - * A zero means unlimited and will be limited to one day. - * - * @return int|string - */ - private static function getPhpSessionTimeout() { - $timeout = ini_get('session.cookie_lifetime'); - $gc_maxlifetime = ini_get('session.gc_maxlifetime'); - - if ($timeout == 0) { - $timeout = 86400; - } - - if ($gc_maxlifetime == 0) { - // Just to set a limit - $timeout = 86400; - } - - return $timeout > $gc_maxlifetime ? $gc_maxlifetime : $timeout; - } } \ No newline at end of file diff --git a/extension/Classes/Core/Store/Session.php b/extension/Classes/Core/Store/Session.php index ee32e6c7d..e444afe5f 100644 --- a/extension/Classes/Core/Store/Session.php +++ b/extension/Classes/Core/Store/Session.php @@ -314,7 +314,7 @@ class Session public static function checkSessionExpired($timeout) { // Just to be sure that the given $timeout is supported by the current php.ini setup - config::checkSessionTimeout($timeout); + self::checkSessionTimeout($timeout); if (self::$lastActivity === false || $timeout === false || $timeout == 0) { return; @@ -327,6 +327,47 @@ class Session } } + /** + * Check Session Timeout + * + * @param $timeout + * @throws \UserFormException + */ + public static function checkSessionTimeout($timeout) { + + if (self::getPhpSessionTimeout() < $timeout) { + throw new \UserFormException ("The specified timeout of $timeout seconds is higher than the PHP config 'session.gc_maxlifetime' (" + . ini_get('session.gc_maxlifetime') . ") and/or 'session.cookie_lifetime' (" + . ini_get('session.cookie_lifetime') . ")"); + } + + if ($timeout > SYSTEM_COOKIE_LIFETIME) { + throw new \UserFormException ("The specified timeout of $timeout seconds is higher than the hardcoded cookie lifetime (" . SYSTEM_COOKIE_LIFETIME . ")"); + } + } + + /** + * Get the minimum of 'session.cookie_lifetime' and 'session.gc_maxlifetime' + * A zero means unlimited and will be limited to one day. + * + * @return int|string + */ + public static function getPhpSessionTimeout() { + $timeout = ini_get('session.cookie_lifetime'); + $gc_maxlifetime = ini_get('session.gc_maxlifetime'); + + if ($timeout == 0) { + $timeout = 86400; + } + + if ($gc_maxlifetime == 0) { + // Just to set a limit + $timeout = 86400; + } + + return $timeout > $gc_maxlifetime ? $gc_maxlifetime : $timeout; + } + /** * Returns $flagFeUserChanged. In case it's true, set it to false. * diff --git a/extension/Classes/Core/Store/Store.php b/extension/Classes/Core/Store/Store.php index a79fc05f8..d59cadd7f 100644 --- a/extension/Classes/Core/Store/Store.php +++ b/extension/Classes/Core/Store/Store.php @@ -303,7 +303,7 @@ class Store { private static function checkMandatoryParameter(array $config) { // Check mandatory config vars. - $names = array_merge([SYSTEM_SQL_LOG_PATHFILENAME, SYSTEM_SQL_LOG_MODE], + $names = array_merge([SYSTEM_SQL_LOG_MODE], self::dbCredentialName($config[SYSTEM_DB_INDEX_DATA]), self::dbCredentialName($config[SYSTEM_DB_INDEX_QFQ])); @@ -415,7 +415,8 @@ class Store { */ private static function fillStoreSystem($PhpUnitOverloadCwdToConfigFile = '') { - $config = Config::readConfig($PhpUnitOverloadCwdToConfigFile); + Config::readConfig($PhpUnitOverloadCwdToConfigFile); + $config = Config::getConfigArray(); $config = self::adjustConfig($config); $config = self::setAutoConfigValue($config); diff --git a/extension/Tests/selenium/run_tests.sh b/extension/Tests/selenium/run_tests.sh index 74e0fac62..b3a09654b 100755 --- a/extension/Tests/selenium/run_tests.sh +++ b/extension/Tests/selenium/run_tests.sh @@ -1,13 +1,13 @@ #!/bin/bash # run a single test function. e.g. "test_basic_functionality.TestBasicFunctionality.test_qfq_form_switch_pill" -TEST_FUNCTION="test_basic_functionality.TestBasicFunctionality.test_qfq_valid_file_upload" # NOTE: make sure there are no trailing spaces! +TEST_FUNCTION="" # NOTE: make sure there are no trailing spaces! export SELENIUM_URL="https://webwork16.math.uzh.ch/megger/qfq/typo3conf/ext/qfq/NoT3Page" export SELENIUM_BROWSER="chrome" export SELENIUM_DRIVER_PATH="${PWD}/chromedriver" export SELENIUM_HEADLESS="no" -export SELENIUM_SLOWDOWN=0 +export SELENIUM_SLOWDOWN=1 # download chromedriver (Chrome) if [ ! -f "chromedriver" ]; then diff --git a/extension/ext_conf_template.txt b/extension/ext_conf_template.txt index 746d4f525..96d15911f 100644 --- a/extension/ext_conf_template.txt +++ b/extension/ext_conf_template.txt @@ -83,9 +83,6 @@ sqlLogMode = modify # cat=debug/sql; type=string; label=SQL log mode for AutoCron:Default is 'error'. Modes see 'sqlLogMode'. sqlLogModeAutoCron = error -# cat=debug/sql; type=string; label=log directory:Default is '<qfq project path>/log'. Contains all log files. Path is absolute or relative to '<site path>'. -logPath = - # cat=debug/sql; type=string; label=SQL log file:By default in log directory. A logfile of fired SQL statements. PathFile is absolute or relative to '<site path>'. sqlLog = -- GitLab From dc23a620c02c0058f62f449799161ad637094974 Mon Sep 17 00:00:00 2001 From: Marc Egger <marc.egger@uzh.ch> Date: Tue, 29 Sep 2020 11:17:33 +0200 Subject: [PATCH 096/195] cleanup Todos --- extension/NoT3Page/index.php | 45 +++++++++++---------------- extension/Tests/selenium/run_tests.sh | 2 +- 2 files changed, 19 insertions(+), 28 deletions(-) diff --git a/extension/NoT3Page/index.php b/extension/NoT3Page/index.php index 7e385dae0..a8f92b53a 100644 --- a/extension/NoT3Page/index.php +++ b/extension/NoT3Page/index.php @@ -12,53 +12,44 @@ use http\Exception; use IMATHUZH\Qfq\Core\Helper\Path; use IMATHUZH\Qfq\Core\QuickFormQuery; - +// new Bootstrap / Config raus nehmen // TODO: define bootstrap function which sets paths and reads config - // TODO: set log + qfq,mail,sql log paths if they are set in config (use empty()) ATTENTION: input might be absolute or relatvie to app -// TODO: MAKE SELENIUM -// TODO: after adjusting log paths make sure that SYSTEM_QFQ_LOG_ABSOLUTE usw. are not used anywhere + SYSTEM_EXT_PATH_ABSOLUTE + SYSTEM_SEND_E_MAIL_ABSOLUTE -// TODO: read config before setting log path and read path vars from config when setting. SYSTEM_QFQ_LOG_ABSOLUTE usw. -// TODO: check all cwdToLog() uses. should it not be absolute paths? // TODO: remove all config related code from Store -// TODO: set setAppRelToCwd() in every api file. +// ! TODO: Datenbank einstellungen wieder separat abspeichern, sonst kann man config nicht commiten in git. Idee: in qfq.path.json speichern +// TODO: bootstrap: 1) Path setzen, 2) config file + T3 config laden, 3) DB init, 4) stores fuellen +// TODO: follow every SYSTEM variable an replace store call with Config getter + +// QFQ without Typo3 // TODO: Replace all calls to T3Handler::... and Store/T3Info.php with abstraction // TODO: AS _pagee macht link auf .../index.php . entweder datei umbenennen oder link klasse aendern // TODO: add HTML header and body tags to echo // TODO: Check if there are other javascript files which have to be included in qfq/Resources/Public/JavaScript -// TODO: Monitor.php 77: Wird path. I don't know relativ to what it should be -// TODO: ?CR/BB: In QFQ Config one can define "CSS class QFQ container", it says that this should be set to "container" if QFQ element is not yet in Bootstrap container. Why? Seems to work without it -// TODO: (?) move computation of SYSTEM_EXT_PATH_ABSOLUTE and SYSTEM_SITE_PATH_ABSOLUTE into Path.php. Currently Sotre->doSystemPath -// TODO: (?) replace all log path computations: SYSTEM_QFQ_LOG_ABSOLUTE, SYSTEM_SQL_LOG_ABSOLUTE, -// TODO: Test if qfq, sql and mail logs still work -// TODO: write docstrings for Path.php -// TODO: alle error codes raus schmeissen -// TODO: ?CR: AbstractException.php, surround log part with try/catch? -// TODO: Datenbank einstellungen wieder separat abspeichern, sonst kann man config nicht commiten in git. Idee: in qfq.path.json speichern -// TODO: bootstrap: 1) Path setzen, 2) config file + T3 config laden, 3) DB init, 4) stores fuellen + +// Remove Error Codes from exception +// TODO: alle error codes raus schmeissen (Constants.php) // PATH migration -// TODO: create filePathToQfqConfig() and replace config references with this // TODO: replace all paths with typo3conf/ (usw.) and /../ and fileadmin/ with correct path computing function. // TODO: Compare Support::joinPath with Path::join // TODO: go through all variables/keywords that can be set by user in docs.qfq.io -// TODO: use PATH:: instead of gtCwd in ColumnScript.php - -// Config out of store -// TODO: follow every SYSTEM variable an replace store call with Config getter +// ! TODO: use PATH:: instead of gtCwd in ColumnScript.php +// TODO: check all cwdToLog() uses. should it not be absolute paths? +// ! TODO: Monitor.php 77: Weird path. I don't know relativ to what it should be +// ! TODO: Test if qfq, sql and mail logs still work +// TODO: write docstrings for Path.php // Testing -// TODO: Fix Unittests -// TODO: test if Logger::makePathAbsolute() actually still does what it should (I have changed it) +// ! TODO: Fix Unittests +// ! TODO: test if Logger::makePathAbsolute() actually still does what it should (I have changed it) // Changenotes -// TODO: add breaking change: if sql/qfq/mail log paths were set in Typo3, this info will be lost. // Misc. // TODO: TablesorterController.js: pass API url as data attribute instead of hardcode (this.tablesorterApiUrl = 'typo3conf/ext/qfq/Classes/Api/setting.php';) // Before production -// TODO: switch qfq.debug.js with qfq.min.js -// TODO: DatabaseUpdateData.php move updates from '20.X.0' to newest +// ! TODO: switch qfq.debug.js with qfq.min.js +// ! TODO: DatabaseUpdateData.php move updates from '20.X.0' to newest //// diff --git a/extension/Tests/selenium/run_tests.sh b/extension/Tests/selenium/run_tests.sh index b3a09654b..c9c0cc286 100755 --- a/extension/Tests/selenium/run_tests.sh +++ b/extension/Tests/selenium/run_tests.sh @@ -7,7 +7,7 @@ export SELENIUM_URL="https://webwork16.math.uzh.ch/megger/qfq/typo3conf/ext/qfq/ export SELENIUM_BROWSER="chrome" export SELENIUM_DRIVER_PATH="${PWD}/chromedriver" export SELENIUM_HEADLESS="no" -export SELENIUM_SLOWDOWN=1 +export SELENIUM_SLOWDOWN=0 # download chromedriver (Chrome) if [ ! -f "chromedriver" ]; then -- GitLab From 119691b5fd23e3481b5cf9064a2bc08b618d4252 Mon Sep 17 00:00:00 2001 From: Marc Egger <marc.egger@uzh.ch> Date: Tue, 29 Sep 2020 12:51:44 +0200 Subject: [PATCH 097/195] AS _script: pass arguments separated by & instead of | --- Documentation/Report.rst | 51 ++++++++++--------- extension/Classes/Core/Constants.php | 3 +- .../Classes/Core/Report/ColumnScript.php | 21 ++++++-- 3 files changed, 46 insertions(+), 29 deletions(-) diff --git a/Documentation/Report.rst b/Documentation/Report.rst index a433fd510..9479d3dd2 100644 --- a/Documentation/Report.rst +++ b/Documentation/Report.rst @@ -1408,9 +1408,15 @@ Column: _script Run a php function defined in an external script. -* All column parameters are passed as an associative array to the function as the first argument. -* The second argument (here called $qfq) is an object which acts as an interface to QFQ functionality. -* The script has access to the following qfq functions using this interface (see examples below): +* All **column parameters are passed** as an associative array to the function as the first argument. +* The second argument (here called $qfq) is an object which acts as an **interface to QFQ functionality** (see below). +* The **current working directory** inside the function is the current web instance (e.g. location of index.php). + * Hint: Inside the script ``dirname(__FILE__)`` gives the path of the script. +* All **output (e.g. using echo) will be rendered** by the special column as is. +* If the function returns an associative array, then the **key-value pairs will be accessible via the VARS store `V`**. +* If the function throws an **exception** then a standard QFQ error message is shown. +* Text sent to 'stderr' by the php function is not returned at all. +* The script has access to the following **qfq functions** using the interface (see examples below): * $qfq::apiCall($method, $url, $data = '', $header = [], $timeout = 5) * arguments: * string $method: can be PUT/POST/GET/DELETE @@ -1435,26 +1441,27 @@ Run a php function defined in an external script. * The value of the variable if found. * A placeholder if the variable violates the sanitize class. (see argument `$typeMessageViolate`) * `false` if the variable was not found. -* The current working directory is the current web instance (e.g. ``/var/www/html``) . -* All output (e.g. using echo) will be returned by the special column as is. -* If the function returns an associative array, then the key-value pairs will be accessible via the VARS store `V`. -* If the function throws an exception then a standard QFQ error message is shown. -* Text sent to 'stderr' by the php function is not returned at all. **Column Parameters** -+-------------------+----------------------------------------------------+------------------------------------------------------------------+ -| Token | Example | Comment | -+===================+====================================================+==================================================================+ -| F | F:fileadmin/scripts/my_script.php | Path to the custom script relative to the current web instance | -+-------------------+----------------------------------------------------+------------------------------------------------------------------+ -| c | c:my_function | PHP function to call | -+-------------------+----------------------------------------------------+------------------------------------------------------------------+ -| <whatever> | myParameter:something | all parameters are passed on as an array to the function | -+-------------------+----------------------------------------------------+------------------------------------------------------------------+ ++-------------------+----------------------------------------------------+------------------------------------------------------------------------------------+ +| Token | Example | Comment | ++===================+====================================================+====================================================================================+ +| F | F:fileadmin/scripts/my_script.php | Path to the custom script relative to the current web instance | ++-------------------+----------------------------------------------------+------------------------------------------------------------------------------------+ +| call | call:my_function | PHP function to call | ++-------------------+----------------------------------------------------+------------------------------------------------------------------------------------+ +| arg | arg:a1=Hello&a2=World" | Arguments are parsed and passed to the function together with the other parameters | ++-------------------+----------------------------------------------------+------------------------------------------------------------------------------------+ **Example** +* QFQ report :: + + 5.sql = SELECT "IAmInRecordStore" AS _savedInRecordStore + 10.sql = SELECT "F:fileadmin/scripts/my_script.php|call:my_function|arg:a1=Hello&a2=World" AS _script + 20.sql = SELECT "<br><br>Returened value: {{IAmInVarStore:V:alnumx}}" + * PHP script (`fileadmin/scripts/my_script.php`) :: <?php @@ -1474,16 +1481,10 @@ Run a php function defined in an external script. return ["IAmInVarStore" => "FooBar"]; } -* QFQ report :: - - 5.sql = SELECT "IAmInRecordStore" AS _savedInRecordStore - 10.sql = SELECT "F:fileadmin/scripts/my_script.php|c:my_function|a1:Hello|a2:World" AS _script - 20.sql = SELECT "<br><br>Returened value: {{IAmInVarStore:V:alnumx}}" - * Output :: - The first argument contains all attributes including "src" and "f": - Array ( [F] => fileadmin/scripts/my_script.php [c] => my_function [a1] => Hello [a2] => World ) + The first argument contains all parameters including "F", "call" and "arg": + Array ( [a1] => Hello [a2] => World [F] => fileadmin/scripts/my_script.php [call] => my_function [arg] => a1=Hello&a2=World ) get variable from record store: IAmInRecordStore diff --git a/extension/Classes/Core/Constants.php b/extension/Classes/Core/Constants.php index ab18ff9ac..e9a30ee6a 100644 --- a/extension/Classes/Core/Constants.php +++ b/extension/Classes/Core/Constants.php @@ -1796,7 +1796,8 @@ const TOKEN_FILE = 'F'; const TOKEN_FILE_DEPRECATED = 'f'; // since 5.12.17 const TOKEN_DOWNLOAD_MODE = 'M'; const TOKEN_ATTRIBUTE = 'A'; -const TOKEN_FUNCTION_CALL = 'c'; +const TOKEN_FUNCTION_CALL = 'call'; +const TOKEN_ARGUMENT = 'arg'; const TOKEN_THUMBNAIL = 'T'; const TOKEN_THUMBNAIL_DIMENSION = 'W'; diff --git a/extension/Classes/Core/Report/ColumnScript.php b/extension/Classes/Core/Report/ColumnScript.php index b88f683c4..8ee56a6cc 100644 --- a/extension/Classes/Core/Report/ColumnScript.php +++ b/extension/Classes/Core/Report/ColumnScript.php @@ -12,9 +12,10 @@ use IMATHUZH\Qfq\Core\Store\Store; * * Executes a function of an external script. Column parameters: * F: path to script - * c: function name + * call: function name + * arg: arguments as key value pairs: myArg1=hello&myArg2=world * - * All parameters are passed to the function as the first argument. + * The arguments (arg) are unpacked and passed together with the other parameters to the function as the first argument. * The second argument passed is an instance of ScriptFunctions which acts as an interface to QFQ functionality. */ class ColumnScript { @@ -22,12 +23,22 @@ class ColumnScript { // Parse arguments $param = KeyValueStringParser::parse($columnValue, PARAM_TOKEN_DELIMITER, PARAM_DELIMITER); + foreach ($param as $key => $value) { + if (!in_array($key, [TOKEN_SCRIPT, TOKEN_FUNCTION_CALL, TOKEN_ARGUMENT])) { + throw new \UserReportException("Token '$key' not recognized for column _script.", ERROR_IO_READ_FILE); + } + } if (empty($param[TOKEN_SCRIPT])) { throw new \UserReportException("Missing script path.", ERROR_MISSING_VALUE); } if (empty($param[TOKEN_FUNCTION_CALL])) { throw new \UserReportException("Missing function name.", ERROR_MISSING_VALUE); } + if (!empty($param[TOKEN_ARGUMENT])) { + // parse arg: token + $arg = KeyValueStringParser::parse($param[TOKEN_ARGUMENT], '=', '&'); + $param = array_merge($arg, $param); + } // include script $scriptPath = getcwd() . '/' . $param[TOKEN_SCRIPT]; @@ -35,8 +46,12 @@ class ColumnScript { throw new \UserReportException("Can't read script file.", ERROR_IO_READ_FILE); } try { - if((include_once $scriptPath) === false) + ob_start(); + $success = include_once $scriptPath; + ob_end_clean(); + if($success === false) { + // this will be caught bellow throw new \Exception('Include failed.'); } } catch (\Exception | \Error $e) { -- GitLab From 34d5ab8c074572db805cc4f1ea7dbe55ce32721d Mon Sep 17 00:00:00 2001 From: Marc Egger <marc.egger@uzh.ch> Date: Tue, 29 Sep 2020 13:50:36 +0200 Subject: [PATCH 098/195] Twig: add access to Var store --- Documentation/Report.rst | 1 + extension/Classes/Core/Report/Report.php | 1 + 2 files changed, 2 insertions(+) diff --git a/Documentation/Report.rst b/Documentation/Report.rst index 9479d3dd2..d4b510802 100644 --- a/Documentation/Report.rst +++ b/Documentation/Report.rst @@ -250,6 +250,7 @@ QFQ also provides access to the following stores via the template context. * typo3 * user * system + * var All stores are accessed using their lower case name as attribute of the context variable `store`. The active Typo3 front-end user is therefore available as:: diff --git a/extension/Classes/Core/Report/Report.php b/extension/Classes/Core/Report/Report.php index 9fbef3b28..bc15d418f 100644 --- a/extension/Classes/Core/Report/Report.php +++ b/extension/Classes/Core/Report/Report.php @@ -802,6 +802,7 @@ class Report { 'typo3' => $this->store->getStore(STORE_TYPO3), 'user' => $this->store->getStore(STORE_USER), 'system' => $this->store->getStore(STORE_SYSTEM), + 'var' => $this->store->getStore(STORE_VAR), ) )); return $contentTwig; -- GitLab From eb1edced278b6e62f952a8686ff963a8ed41f28f Mon Sep 17 00:00:00 2001 From: Marc Egger <marc.egger@uzh.ch> Date: Tue, 29 Sep 2020 15:17:25 +0200 Subject: [PATCH 099/195] clean up todos --- Documentation/Report.rst | 2 +- extension/Classes/Core/Form/FormAsFile.php | 71 ------------------- .../Classes/Core/Report/ReportAsFile.php | 8 --- extension/NoT3Page/index.php | 66 +++++++---------- 4 files changed, 25 insertions(+), 122 deletions(-) diff --git a/Documentation/Report.rst b/Documentation/Report.rst index d4b510802..dbcdfdd5f 100644 --- a/Documentation/Report.rst +++ b/Documentation/Report.rst @@ -1452,7 +1452,7 @@ Run a php function defined in an external script. +-------------------+----------------------------------------------------+------------------------------------------------------------------------------------+ | call | call:my_function | PHP function to call | +-------------------+----------------------------------------------------+------------------------------------------------------------------------------------+ -| arg | arg:a1=Hello&a2=World" | Arguments are parsed and passed to the function together with the other parameters | +| arg | arg:a1=Hello&a2=World | Arguments are parsed and passed to the function together with the other parameters | +-------------------+----------------------------------------------------+------------------------------------------------------------------------------------+ **Example** diff --git a/extension/Classes/Core/Form/FormAsFile.php b/extension/Classes/Core/Form/FormAsFile.php index 83cd95f98..d8aba61ab 100644 --- a/extension/Classes/Core/Form/FormAsFile.php +++ b/extension/Classes/Core/Form/FormAsFile.php @@ -10,77 +10,6 @@ use IMATHUZH\Qfq\Core\Helper\Path; use IMATHUZH\Qfq\Core\Helper\SqlQuery; use IMATHUZH\Qfq\Core\Store\Store; -// ---------------------- // -// Besprechen mit Carsten // -// ====================== // - -// Form backups erstellen vor deleteFormFile und exportForm? -// "git rm" anstatt "rm" benutzen falls ordner ein git repo? Einziger unterschied: macht "git add" -// Form Copy ist broken. Aber jetzt auch unnötig, da man einfach die files kopieren kann. -// Koennte die column "lastImport" zu Form hinzufuegen. Dieser wird dann manuell zusammen mit "changed" beim import und export gesetzt. Mittels Left Join query mit den created columns von FormElement koennte man in importForm() feststellen, ob sich ein form geaendert hat und dieses expotieren, falls der fingerabdruck des files noch gleich ist. - // in doForm: wenn ein fehler auftritt, nachdem die datenbank gespeichert wird und bevor das file geschrieben wurde, dann ist das file nicht mehr up to date. "lastImport" koennte dies loesen. - // >> nicht unbedingt noetig. passiert nur sehr selten, dass db und file nicht synch ist und dann faellts auf, wenn der developer testet. -// QFQ formulare haben id unter 1000 und user forms ueber 1000. Wird ein QFQ formular neu importiert, erhaelt es aber eine id ueber 1000. ist dies ein problem? -// Kann es sein, dass records in Dirty tabelle nicht mehr richtig abegraeumt werden, weil forms die ID wechseln? -// Exceptions werden teilweise ohne Developer message angezeigt (API). Deshalb habe ich die Message teilweise in User message getan. -// PHP version von gitlab runner hochstellen, damit ?string und void type syntax fuer funktionen erlaubt ist? verhindert einige fehler -// Regex fuer erlaubte file names und form names im editor (+ erlauben?): ^([-\.\w]+)$ VS [a-zA-Z0-9._+-]+ -// add log messages somewhere? - -// TODO: BEFOORE PRUDUCTION - // TODO: Fix all broken tests - // TODO: write tests (file test https://medium.com/weebly-engineering/phpunit-mocking-the-file-system-using-vfsstream-5d7d79b1eb2a) - // TODO: Tests: - // new form => form file created - // form field change editor => changed in form file - // bevor ein form/formelement im form editor gespeichert wird, soll es vom file geladen werden (Save.php). Falls das file importiert wurde, gibt es eine fehlermeldung. - // form name change => old form file deleted, new form file created - // form delete => form file deleted - - // form file not writeable => all the above abort before changes to DB are made - - // form element create => added to form file - // form element changed => changed in form file - // form element deleted => removed from form file - - // form file name changed => old form invalid, new form works - // form file parameter changed => changed in form editor - // form file form element added => added in form editor - // form file form element changed => changed in form editor - // form file form element removed => removed in form editor - - // form folder does not exist but formEditor is opened => form folder is created, all forms exported - - // QFQ komplett neu installiert => form dir existiert mit allen form files aktuell. - // QFQ neu installation mit existierenden forms => alte forms sind noch da, native forms (form, cron usw.) werden ueberschrieben. - // QFQ update => alte forms noch da, updates an FormEditor ersichtlich - - // importAllForms() is executed iff the rendered QFQ report selects Form/FormElement table. - -// TODO: MAYBE - // TODO: Make unittest for isFormQuery(). Example string: - //$sql = <<<END - //SELECT CONCAT('p:{{pageId:T}}&form=form&r=', f.id) as _pagee, f.id, f.name, f.title, f.tableName, CONCAT('form=form&r=', f.id) as _Paged FROM where - //FormFormElement,Form AS f ORDER BY f.name - // - //SELECT CONCAT('p:{{pageId:T}}&form=form&r=', f.id) as _pagee, f.id, f.name, f.title, f.tableName, CONCAT('form=form&r=', f.id) as _Paged From Order by Form AS f ORDER BY f.name - // - //SELECT CONCAT('p:{{pageId:T}}&form=form&r=', f.id) as _pagee, f.id, f.name, f.title, f.tableName, CONCAT('form=form&r=', f.id) as _Paged FRom having Form AS f ORDER BY f.name - // - //SELECT CONCAT('p:{{pageId:T}}&form=form&r=', f.id) as _pagee, f.id, f.name, f.title, f.tableName, CONCAT('form=form&r=', f.id) as _Paged from Form AS f ORDER BY f.name - //END; - -// DON'T DO - // DONT DO: add column import-modification-date to Form and FormElement and set them to the same as modification date in both exportForm and importForm. compare the two modification dates in the beginning. If the actual modification is after importModification and fileStats are the same in file and in form, then exportForm. - // DONT DO: what to do if importModificationDate and fileStats have changed? > 1) export Form to new form file named <formName>mergeConflict_timestamp 2) importForm form file, overwrite DB - -/////// DEBUG ///////// -// throw new \UserFormException(json_encode([ -// ERROR_MESSAGE_TO_USER => json_encode([], JSON_PRETTY_PRINT), -// ERROR_MESSAGE_TO_DEVELOPER => json_encode([], JSON_PRETTY_PRINT) -// ])); -/////////////////////// - class FormAsFile { /** diff --git a/extension/Classes/Core/Report/ReportAsFile.php b/extension/Classes/Core/Report/ReportAsFile.php index ddfe0f7c8..4a299b3db 100644 --- a/extension/Classes/Core/Report/ReportAsFile.php +++ b/extension/Classes/Core/Report/ReportAsFile.php @@ -1,13 +1,5 @@ <?php -// TODO: fix unittests run by gitlab runner. - -// Besprechen mit Carsten // -// ====================== // - -// ?CR: QuickFormQuery.php L138: Why fallback $t3data[T3DATA_UID] = 0; and $t3data[T3DATA_BODYTEXT] = ''; ? When does this happen? -// ?CR: alle ?CR suchen und durchgehen. - namespace IMATHUZH\Qfq\Core\Report; use IMATHUZH\Qfq\Core\Database\Database; diff --git a/extension/NoT3Page/index.php b/extension/NoT3Page/index.php index a8f92b53a..7e6f2e105 100644 --- a/extension/NoT3Page/index.php +++ b/extension/NoT3Page/index.php @@ -1,9 +1,32 @@ <?php -// DELETE ME! // // TEST FILE TO RUN QFQ REPORT WITHOUT TYPO3 // /////////////////////////////////////////////// + + + + + + + + +////////////////////////////////////// +////////// PAGE DISABLED ///////////// +exit(); // <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< +// !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + + + + + + + + + + + + const IS_DEBUG = true; // TODO: replace this with better debug meachanism require_once(__DIR__ . '/../vendor/autoload.php'); @@ -12,47 +35,6 @@ use http\Exception; use IMATHUZH\Qfq\Core\Helper\Path; use IMATHUZH\Qfq\Core\QuickFormQuery; -// new Bootstrap / Config raus nehmen -// TODO: define bootstrap function which sets paths and reads config -// TODO: remove all config related code from Store -// ! TODO: Datenbank einstellungen wieder separat abspeichern, sonst kann man config nicht commiten in git. Idee: in qfq.path.json speichern -// TODO: bootstrap: 1) Path setzen, 2) config file + T3 config laden, 3) DB init, 4) stores fuellen -// TODO: follow every SYSTEM variable an replace store call with Config getter - -// QFQ without Typo3 -// TODO: Replace all calls to T3Handler::... and Store/T3Info.php with abstraction -// TODO: AS _pagee macht link auf .../index.php . entweder datei umbenennen oder link klasse aendern -// TODO: add HTML header and body tags to echo -// TODO: Check if there are other javascript files which have to be included in qfq/Resources/Public/JavaScript - -// Remove Error Codes from exception -// TODO: alle error codes raus schmeissen (Constants.php) - -// PATH migration -// TODO: replace all paths with typo3conf/ (usw.) and /../ and fileadmin/ with correct path computing function. -// TODO: Compare Support::joinPath with Path::join -// TODO: go through all variables/keywords that can be set by user in docs.qfq.io -// ! TODO: use PATH:: instead of gtCwd in ColumnScript.php -// TODO: check all cwdToLog() uses. should it not be absolute paths? -// ! TODO: Monitor.php 77: Weird path. I don't know relativ to what it should be -// ! TODO: Test if qfq, sql and mail logs still work -// TODO: write docstrings for Path.php - -// Testing -// ! TODO: Fix Unittests -// ! TODO: test if Logger::makePathAbsolute() actually still does what it should (I have changed it) - -// Changenotes - -// Misc. -// TODO: TablesorterController.js: pass API url as data attribute instead of hardcode (this.tablesorterApiUrl = 'typo3conf/ext/qfq/Classes/Api/setting.php';) - -// Before production -// ! TODO: switch qfq.debug.js with qfq.min.js -// ! TODO: DatabaseUpdateData.php move updates from '20.X.0' to newest - -//// - class User { public $user; public function __construct() -- GitLab From 70c1d5255b793eb1908b89681504781031cec514 Mon Sep 17 00:00:00 2001 From: Marc Egger <marc.egger@uzh.ch> Date: Wed, 30 Sep 2020 12:45:19 +0200 Subject: [PATCH 100/195] Report as File: disable auto export by default, enable using extension config --- extension/Classes/Core/Constants.php | 2 ++ extension/Classes/Core/QuickFormQuery.php | 13 ++++++--- .../Classes/Core/Report/ReportAsFile.php | 27 +++++++++++++++---- extension/ext_conf_template.txt | 3 +++ 4 files changed, 36 insertions(+), 9 deletions(-) diff --git a/extension/Classes/Core/Constants.php b/extension/Classes/Core/Constants.php index e9a30ee6a..20757a5f5 100644 --- a/extension/Classes/Core/Constants.php +++ b/extension/Classes/Core/Constants.php @@ -50,6 +50,7 @@ const FORM_BUTTON_CLOSE = 'close'; const FORM_BUTTON_SAVE = 'save'; const REPORT_SAVE = 'reportSave'; +const REPORT_SAVE_FILE = 'reportSaveFile'; // 0|1 whether report is saved in file instead of DB const F_BS_COLUMNS = 'bsColumns'; @@ -517,6 +518,7 @@ const SYSTEM_RENDER = 'render'; const SYSTEM_RENDER_SINGLE = 'single'; const SYSTEM_RENDER_BOTH = 'both'; const SYSTEM_RENDER_API = 'api'; +const SYSTEM_REPORT_AS_FILE_AUTO_EXPORT = 'reportAsFileAutoExport'; const SYSTEM_SHOW_DEBUG_INFO = 'showDebugInfo'; const SYSTEM_SHOW_DEBUG_INFO_YES = 'yes'; diff --git a/extension/Classes/Core/QuickFormQuery.php b/extension/Classes/Core/QuickFormQuery.php index 8299c73ed..3121d13c5 100644 --- a/extension/Classes/Core/QuickFormQuery.php +++ b/extension/Classes/Core/QuickFormQuery.php @@ -208,7 +208,7 @@ class QuickFormQuery { // Create report file if file keyword not found // TODO: ?CR: uid could be 0. When does this happen? - if ($reportPathFileNameFull === null && $t3data[T3DATA_UID] !== 0) { + if (strtolower($this->store->getVar(SYSTEM_REPORT_AS_FILE_AUTO_EXPORT, STORE_SYSTEM)) === 'yes' && $reportPathFileNameFull === null && $t3data[T3DATA_UID] !== 0) { $reportPathFileNameFull = ReportAsFile::create_file_from_ttContent($t3data[T3DATA_UID], $this->dbArray[$this->dbIndexData]); } @@ -1754,7 +1754,7 @@ class QuickFormQuery { * @throws \CodeException * @throws \UserFormException */ - public static function buildInlineReport(?int $uid, string $reportPathFileNameFull, string $bodytext, string $header): string + public static function buildInlineReport(?int $uid, ?string $reportPathFileNameFull, string $bodytext, string $header): string { if ($uid === null) { return ''; @@ -1782,7 +1782,7 @@ class QuickFormQuery { $form = join(' ', [$headerBar, $codeBox]); $sipObj = new Sip; - $action = $sipObj->queryStringToSip(Path::cwdToApi(API_SAVE_PHP) . "?uid=$uid&" . REPORT_SAVE . "=1"); + $action = $sipObj->queryStringToSip(Path::cwdToApi(API_SAVE_PHP) . "?uid=$uid&" . REPORT_SAVE . "=1&" . REPORT_SAVE_FILE . "=" . (is_null($reportPathFileNameFull) ? 0 : 1)); $formAttributes = Support::doAttribute('id', "tt-content-edit-$uid") . Support::doAttribute('class', 'hidden') . Support::doAttribute('method', 'post') . @@ -1800,13 +1800,18 @@ class QuickFormQuery { */ public function saveReport() { $uid = $this->store->getVar(T3DATA_UID, STORE_SIP . STORE_ZERO, SANITIZE_ALLOW_DIGIT); + $isFile = $this->store->getVar(REPORT_SAVE_FILE, STORE_SIP . STORE_ZERO, SANITIZE_ALLOW_DIGIT); if ($uid == 0) { // Check if it was called with a SIP (containing a uid) // If not, this might be an attack => cancel. return; } $bodytextNew = Support::htmlEntityEncodeDecode(MODE_DECODE, $_POST[REPORT_INLINE_BODYTEXT]); - ReportAsFile::write_file_uid($uid, $bodytextNew, $this->dbArray[$this->dbIndexData]); + if (intval($isFile) === 1) { + ReportAsFile::write_file_uid($uid, $bodytextNew, $this->dbArray[$this->dbIndexData]); + } else { + ReportAsFile::write_tt_content($uid, $bodytextNew, $this->dbArray[$this->dbIndexData]); + } $this->formSpec[F_FORWARD_MODE] = 'auto'; } diff --git a/extension/Classes/Core/Report/ReportAsFile.php b/extension/Classes/Core/Report/ReportAsFile.php index 4a299b3db..d274db6f4 100644 --- a/extension/Classes/Core/Report/ReportAsFile.php +++ b/extension/Classes/Core/Report/ReportAsFile.php @@ -12,9 +12,10 @@ class ReportAsFile { /** * Finds the keyword file=<pathFileName> and returns pathFileName of report relative to CWD. + * Returns null if the keyword is not present. * * @param string $bodyText - * @return string|null pathFileName of report relative to CWD. + * @return string|null pathFileName of report relative to CWD or null * @throws \CodeException * @throws \UserFormException * @throws \UserReportException @@ -88,7 +89,7 @@ class ReportAsFile ERROR_FORM_NOT_FOUND); } } - $reportPathFull = HelperFile::joinPathFilename(ReportAsFile::reportPath(), $reportPath); + $reportPathFull = HelperFile::joinPathFilename(self::reportPath(), $reportPath); // create path in filesystem if not exists HelperFile::createPathRecursive($reportPathFull); @@ -113,6 +114,24 @@ class ReportAsFile // replace tt-content bodytext with file=<path> $newBodytext = TOKEN_REPORT_FILE . "=" . HelperFile::joinPathFilename($reportPath, $fileName) . REPORT_FILE_EXTENSION; + self::write_tt_content($uid, $newBodytext, $databaseT3); + + return $reportPathFileNameFull; + } + + /** + * Replace bodytext of given tt-content element with the given string. + * + * @param int $uid + * @param string $newBodytext + * @param Database $databaseT3 + * @throws \CodeException + * @throws \DbException + * @throws \UserFormException + * @throws \UserReportException + */ + public static function write_tt_content(int $uid, string $newBodytext, Database $databaseT3) { + $dbT3 = Store::getInstance()->getVar(SYSTEM_DB_NAME_T3, STORE_SYSTEM); $sql = "UPDATE `$dbT3`.`tt_content` SET `bodytext` = ?, `tstamp` = UNIX_TIMESTAMP(NOW()) WHERE `uid` = ?"; $databaseT3->sql($sql, ROW_REGULAR, [$newBodytext, $uid]); @@ -120,8 +139,6 @@ class ReportAsFile // Need to truncate cf_cache_pages because it is used to restore page-specific cache $sql = "DELETE FROM `$dbT3`.`cf_cache_pages`"; $databaseT3->sql($sql); - - return $reportPathFileNameFull; } /** @@ -143,7 +160,7 @@ class ReportAsFile $ttContent = $databaseT3->sql($sql, ROW_EXPECT_1, [$uid], "Typo3 content element not found. Uid: $uid"); - $reportPathFileNameFull = ReportAsFile::parseFileKeyword($ttContent['bodytext']); + $reportPathFileNameFull = self::parseFileKeyword($ttContent['bodytext']); if ($reportPathFileNameFull === null) { throw new \UserReportException(json_encode([ ERROR_MESSAGE_TO_USER => "No report file defined.", diff --git a/extension/ext_conf_template.txt b/extension/ext_conf_template.txt index 96d15911f..e84cfbab0 100644 --- a/extension/ext_conf_template.txt +++ b/extension/ext_conf_template.txt @@ -46,6 +46,9 @@ sendEMailOptions = # cat=config/config; type=string; label=URL QFQ Documentation:Default is 'http://docs.qfq.io/en/master'. Might be changed to a local repo. Every QFQ installation contains a local copy: <site path>/typo3conf/ext/qfq/Documentation/html/Manual.html (corresponds always to the QFQ version). documentation = +# cat=config/config; type=string; label=Report as File Auto Export:Default is 'no'. If set to 'yes': When a QFQ tt-content record is rendered which does not contain the "file=" keyword, then its body is exported to a file in the qfq-project directory and the tt-content body is replaced by "file=<path_to_file>". +reportAsFileAutoExport = + # cat=dynamic/config; type=string; label=Fill store 'SYSTEM' by SQL 1:Default is empty. SQL query fired during QFQ load. The result have to be exactly one row. That row will be merged to store 'SYSTEM'. Retrieve values via '{{column:Y}}'. Example 'SELECT id AS _periodId FROM Period WHERE start<=NOW() ORDER BY start DESC LIMIT 1' -- GitLab From b8037e1b89e4430b43c12596ccc9ffce44096894 Mon Sep 17 00:00:00 2001 From: Marc Egger <marc.egger@uzh.ch> Date: Wed, 30 Sep 2020 14:46:13 +0200 Subject: [PATCH 101/195] Config: Move more config code out of Store.php into Config.php --- extension/Classes/Api/print.php | 1 - extension/Classes/Core/QuickFormQuery.php | 2 - extension/Classes/Core/Store/Config.php | 126 ++++++++++++++++++++-- extension/Classes/Core/Store/Store.php | 111 +------------------ 4 files changed, 118 insertions(+), 122 deletions(-) diff --git a/extension/Classes/Api/print.php b/extension/Classes/Api/print.php index 74f11f603..6871cdda1 100644 --- a/extension/Classes/Api/print.php +++ b/extension/Classes/Api/print.php @@ -21,7 +21,6 @@ use IMATHUZH\Qfq\Core\Store\Config; */ try { Path::setMainPaths(Path::API_TO_APP); - Config::readConfig(''); $html2pdf = new Html2Pdf(Config::getConfigArray()); $html2pdf->outputHtml2Pdf(); diff --git a/extension/Classes/Core/QuickFormQuery.php b/extension/Classes/Core/QuickFormQuery.php index 3121d13c5..ef1b5df3d 100644 --- a/extension/Classes/Core/QuickFormQuery.php +++ b/extension/Classes/Core/QuickFormQuery.php @@ -122,8 +122,6 @@ class QuickFormQuery { */ public function __construct(array $t3data = array(), $phpUnit = false, $inlineReport = true) { - Config::readConfig(); - #TODO: rewrite $phpUnit to: "if (!defined('PHPUNIT_QFQ')) {...}" $this->phpUnit = $phpUnit; $this->inlineReport = $inlineReport; diff --git a/extension/Classes/Core/Store/Config.php b/extension/Classes/Core/Store/Config.php index 4c7d34434..b246f13d6 100644 --- a/extension/Classes/Core/Store/Config.php +++ b/extension/Classes/Core/Store/Config.php @@ -35,27 +35,28 @@ class Config { * * @param string $key * @return mixed + * @throws \CodeException * @throws \UserFormException + * @throws \UserReportException */ public static function get(string $key) { - if (self::$config === null) { - Thrower::userFormException("Config error.", "Config was accessed before it was read. Execute Config::readConfig() first."); - } + self::readConfig(); return self::$config[$key]; } /** * Returns a copy of the config array. Throws exception if config has not been read. * + * @param string $PhpUnitOverloadCwdToConfigFile * @return array + * @throws \CodeException * @throws \UserFormException + * @throws \UserReportException */ - public static function getConfigArray(): array + public static function getConfigArray($PhpUnitOverloadCwdToConfigFile = ''): array { - if (self::$config === null) { - Thrower::userFormException("Config error.", "Config was accessed before it was read. Execute Config::readConfig() first."); - } + self::readConfig($PhpUnitOverloadCwdToConfigFile); return self::$config; } @@ -68,7 +69,7 @@ class Config { * @throws \UserFormException * @throws \UserReportException */ - public static function readConfig($PhpUnitOverloadCwdToConfigFile = '') { + private static function readConfig($PhpUnitOverloadCwdToConfigFile = '') { if (self::$config !== null && $PhpUnitOverloadCwdToConfigFile === '') { return; @@ -104,6 +105,11 @@ class Config { // Copy values to detect custom settings later $config[F_FE_DATA_PATTERN_ERROR_SYSTEM] = $config[F_FE_DATA_PATTERN_ERROR]; + $config = self::adjustConfig($config); + $config = self::setAutoConfigValue($config); + + self::checkMandatoryParameter($config); + self::$config = $config; // Set log paths @@ -146,7 +152,7 @@ class Config { * @throws \UserFormException * @throws \CodeException */ - public static function writeConfig(array $config) + private static function writeConfig(array $config) { $cwdToProject = Path::cwdToProject(); HelperFile::createPathRecursive($cwdToProject); @@ -308,7 +314,6 @@ class Config { public static function attackDetectedExitNow(array $config = array(), $reason = '') { if (count($config) == 0) { - self::readConfig(); $config = self::getConfigArray(); } @@ -501,4 +506,105 @@ class Config { return $config; } + + /** + * Depending on some configuration value, update corresponding values. + * + * @param array $config + * + * @return array + */ + private static function adjustConfig(array $config) { + + $config[SYSTEM_SHOW_DEBUG_INFO] = self::adjustConfigDebugInfoAuto($config[SYSTEM_SHOW_DEBUG_INFO], self::beUserLoggedIn()); + + // In case the database credentials are given in the old style: copy them to the new style + if (!isset($config[SYSTEM_DB_1_USER]) && isset($config[SYSTEM_DB_USER])) { + $config[SYSTEM_DB_1_USER] = $config[SYSTEM_DB_USER]; + $config[SYSTEM_DB_1_SERVER] = $config[SYSTEM_DB_SERVER]; + $config[SYSTEM_DB_1_PASSWORD] = $config[SYSTEM_DB_PASSWORD]; + $config[SYSTEM_DB_1_NAME] = $config[SYSTEM_DB_NAME]; + } + + if ($config[SYSTEM_THROW_GENERAL_ERROR] == 'auto') { + $config[SYSTEM_THROW_GENERAL_ERROR] = $config[SYSTEM_FLAG_PRODUCTION] == 'yes' ? 'no' : 'yes'; + } + + return $config; + } + + /** + * @param string $value + * + * @param $flag + * @return string + */ + public static function adjustConfigDebugInfoAuto($value, $flag) { + + // Check if SHOW_DEBUG_INFO contains 'auto'. Replace with appropriate. + if (Support::findInSet(SYSTEM_SHOW_DEBUG_INFO_AUTO, $value) && $flag) { + $value = str_replace(SYSTEM_SHOW_DEBUG_INFO_AUTO, SYSTEM_SHOW_DEBUG_INFO_YES, $value); + } + + return $value; + } + + /** + * Check if there is a Typo3 beUser is logged in. This is only possible if QFQ is called via T3, not via API + * + * @return bool true: current Browser session is a logged in BE User. + */ + private static function beUserLoggedIn() { + + return (!empty($GLOBALS["TSFE"]->beUserLogin) && $GLOBALS["TSFE"]->beUserLogin === true); + } + + /** + * Set automatic filled values + * + * @param array $config + * @return array + */ + private static function setAutoConfigValue(array $config) { + + $config[SYSTEM_DB_NAME_DATA] = $config['DB_' . $config[SYSTEM_DB_INDEX_DATA] . '_NAME'] ?? ''; + $config[SYSTEM_DB_NAME_QFQ] = $config['DB_' . $config[SYSTEM_DB_INDEX_QFQ] . '_NAME'] ?? ''; + + return $config; + } + + /** + * Iterate over all Parameter which have to exist in the config. Throw an array if any is missing. + * + * @param array $config + * + * @throws \UserFormException + */ + private static function checkMandatoryParameter(array $config) { + + // Check mandatory config vars. + $names = array_merge([SYSTEM_SQL_LOG_MODE], + self::dbCredentialName($config[SYSTEM_DB_INDEX_DATA]), + self::dbCredentialName($config[SYSTEM_DB_INDEX_QFQ])); + + foreach ($names as $name) { + if (!isset($config[$name])) { + throw new \UserFormException ("Missing configuration in `" . CONFIG_QFQ_PHP . "`: $name", ERROR_MISSING_CONFIG_INI_VALUE); + } + } + } + + /** + * @param $index + * @return array + */ + private static function dbCredentialName($index) { + $names = array(); + $names[] = 'DB_' . $index . '_USER'; + $names[] = 'DB_' . $index . '_SERVER'; + $names[] = 'DB_' . $index . '_PASSWORD'; + $names[] = 'DB_' . $index . '_NAME'; + + return $names; + } } \ No newline at end of file diff --git a/extension/Classes/Core/Store/Store.php b/extension/Classes/Core/Store/Store.php index d59cadd7f..e38fbe6b9 100644 --- a/extension/Classes/Core/Store/Store.php +++ b/extension/Classes/Core/Store/Store.php @@ -241,93 +241,6 @@ class Store { return self::$instance; } - /** - * Depending on some configuration value, update corresponding values. - * - * @param array $config - * - * @return array - */ - private static function adjustConfig(array $config) { - - $config[SYSTEM_SHOW_DEBUG_INFO] = self::adjustConfigShowDebugInfo($config[SYSTEM_SHOW_DEBUG_INFO], self::beUserLoggdIn()); - - // In case the database credentials are given in the old style: copy them to the new style - if (!isset($config[SYSTEM_DB_1_USER]) && isset($config[SYSTEM_DB_USER])) { - $config[SYSTEM_DB_1_USER] = $config[SYSTEM_DB_USER]; - $config[SYSTEM_DB_1_SERVER] = $config[SYSTEM_DB_SERVER]; - $config[SYSTEM_DB_1_PASSWORD] = $config[SYSTEM_DB_PASSWORD]; - $config[SYSTEM_DB_1_NAME] = $config[SYSTEM_DB_NAME]; - } - - if ($config[SYSTEM_THROW_GENERAL_ERROR] == 'auto') { - $config[SYSTEM_THROW_GENERAL_ERROR] = $config[SYSTEM_FLAG_PRODUCTION] == 'yes' ? 'no' : 'yes'; - } - - return $config; - } - - /** - * @param string $value - * - * @param $flag - * @return string - */ - private static function adjustConfigShowDebugInfo($value, $flag) { - - // Check if SHOW_DEBUG_INFO contains 'auto'. Replace with appropriate. - if (Support::findInSet(SYSTEM_SHOW_DEBUG_INFO_AUTO, $value) && $flag) { - $value = str_replace(SYSTEM_SHOW_DEBUG_INFO_AUTO, SYSTEM_SHOW_DEBUG_INFO_YES, $value); - } - - return $value; - } - - /** - * Check if there is a Typo3 beUser is logged in. This is only possible if QFQ is called via T3, not via API - * - * @return bool true: current Browser session is a logged in BE User. - */ - private static function beUserLoggdIn() { - - return (!empty($GLOBALS["TSFE"]->beUserLogin) && $GLOBALS["TSFE"]->beUserLogin === true); - } - - /** - * Iterate over all Parameter which have to exist in the config. Throw an array if any is missing. - * - * @param array $config - * - * @throws \UserFormException - */ - private static function checkMandatoryParameter(array $config) { - - // Check mandatory config vars. - $names = array_merge([SYSTEM_SQL_LOG_MODE], - self::dbCredentialName($config[SYSTEM_DB_INDEX_DATA]), - self::dbCredentialName($config[SYSTEM_DB_INDEX_QFQ])); - - foreach ($names as $name) { - if (!isset($config[$name])) { - throw new \UserFormException ("Missing configuration in `" . CONFIG_QFQ_PHP . "`: $name", ERROR_MISSING_CONFIG_INI_VALUE); - } - } - } - - /** - * @param $index - * @return array - */ - private static function dbCredentialName($index) { - $names = array(); - $names[] = 'DB_' . $index . '_USER'; - $names[] = 'DB_' . $index . '_SERVER'; - $names[] = 'DB_' . $index . '_PASSWORD'; - $names[] = 'DB_' . $index . '_NAME'; - - return $names; - } - /** * Set or overwrite a complete store. * @@ -415,31 +328,11 @@ class Store { */ private static function fillStoreSystem($PhpUnitOverloadCwdToConfigFile = '') { - Config::readConfig($PhpUnitOverloadCwdToConfigFile); - $config = Config::getConfigArray(); - - $config = self::adjustConfig($config); - $config = self::setAutoConfigValue($config); - - self::checkMandatoryParameter($config); + $config = Config::getConfigArray($PhpUnitOverloadCwdToConfigFile); self::setStore($config, STORE_SYSTEM, true); } - /** - * Set automatic filled values - * - * @param array $config - * @return array - */ - public static function setAutoConfigValue(array $config) { - - $config[SYSTEM_DB_NAME_DATA] = $config['DB_' . $config[SYSTEM_DB_INDEX_DATA] . '_NAME'] ?? ''; - $config[SYSTEM_DB_NAME_QFQ] = $config['DB_' . $config[SYSTEM_DB_INDEX_QFQ] . '_NAME'] ?? ''; - - return $config; - } - /** * Copy the BodyText as well as some T3 specific vars to STORE_TYPO3. * Attention: if called through API, there is no T3 environment. The only values which are available are fe_user @@ -849,7 +742,7 @@ class Store { $value = self::getVar(SYSTEM_SHOW_DEBUG_INFO, STORE_SYSTEM); $flag = isset($typo3VarsArray[TYPO3_BE_USER_LOGGED_IN]) && ($typo3VarsArray[TYPO3_BE_USER_LOGGED_IN] == 'yes'); - $value = self::adjustConfigShowDebugInfo($value, $flag); + $value = Config::adjustConfigDebugInfoAuto($value, $flag); self::setVar(SYSTEM_SHOW_DEBUG_INFO, $value, STORE_SYSTEM); } -- GitLab From 07843cdf15b713db43bcb8e294191a26d0f8e78e Mon Sep 17 00:00:00 2001 From: Marc Egger <marc.egger@uzh.ch> Date: Wed, 30 Sep 2020 17:22:25 +0200 Subject: [PATCH 102/195] ColumnScript.php: use Path Class --- extension/Classes/Core/Exception/Thrower.php | 14 +++++++ extension/Classes/Core/Helper/Path.php | 37 +------------------ .../Classes/Core/Report/ColumnScript.php | 25 ++++++++----- 3 files changed, 31 insertions(+), 45 deletions(-) diff --git a/extension/Classes/Core/Exception/Thrower.php b/extension/Classes/Core/Exception/Thrower.php index 9ae4ce5f6..a7720b597 100644 --- a/extension/Classes/Core/Exception/Thrower.php +++ b/extension/Classes/Core/Exception/Thrower.php @@ -17,4 +17,18 @@ class Thrower ERROR_MESSAGE_TO_USER => $errorToUser, ERROR_MESSAGE_TO_DEVELOPER => $errorToDeveloper]), ERROR_IO_READ_FILE); } + + /** + * Throws UserReportException with given messages to user and developer. + * + * @param string $errorToUser + * @param string $errorToDeveloper + * @param int $errorCode + * @throws \UserReportException + */ + public static function userReportException(string $errorToUser, string $errorToDeveloper = '', int $errorCode = E_ERROR) { + throw new \UserReportException(json_encode([ + ERROR_MESSAGE_TO_USER => $errorToUser, + ERROR_MESSAGE_TO_DEVELOPER => $errorToDeveloper]), ERROR_IO_READ_FILE); + } } \ No newline at end of file diff --git a/extension/Classes/Core/Helper/Path.php b/extension/Classes/Core/Helper/Path.php index 25f9130bb..13ee33ed8 100644 --- a/extension/Classes/Core/Helper/Path.php +++ b/extension/Classes/Core/Helper/Path.php @@ -4,8 +4,7 @@ namespace IMATHUZH\Qfq\Core\Helper; /* - * Naming convention of path variables: - * + * Naming convention of path constants/functions/variables: * 1) name a path by its origin and its destination separated by 'to'. E.g. APP_TO_SYSTEM_LOG, $appToProject. * 2) if the destination is a file, append "File". E.g. APP_TO_SYSTEM_QFQ_LOG_FILE. * 3) if a path has to be variable, create a setter and getter. E.g. self::setCwdToApp(), self::cwdToApp(), private static $cwdToApp. @@ -14,40 +13,6 @@ namespace IMATHUZH\Qfq\Core\Helper; * 6) avoid defining redundant paths in constants. E.g. create cwdToApi() by combining cwdToExt() and extToApi() instead of defining CWD_TO_API. */ -/* - -Unittests: - -Path::apiRelToCwd(API_SAVE_PHP) === API_DIR . '/save.php' -Path::apiRelToCwd(API_LOAD_PHP) === API_DIR . '/load.php' -Path::apiRelToCwd(API_FILE_PHP) . '?' . $actionUpload === API_DIR . '/file.php?' . $actionUpload -Path::apiRelToCwd(API_FILE_PHP) . '?' . $actionDelete === API_DIR . '/file.php?' . $actionDelete -Path::apiRelToCwd(API_DIRTY_PHP) === API_DIR . "/" . API_DIRTY_PHP -Path::apiRelToCwd(API_DRAG_AND_DROP_PHP) === API_DIR . '/' . API_DRAG_AND_DROP_PHP -Path::apiRelToCwd(API_SAVE_PHP) === API_DIR . "/" . "save.php" -Path::apiRelToCwd(API_DOWNLOAD_PHP) === API_DIR . '/' . API_DOWNLOAD_PHP -Path::apiRelToCwd(API_DELETE_PHP) === API_DIR . '/' . API_DELETE_PHP - -Path::apiRelToExt() === API_DIR_EXT -Path::apiRelToExt(API_DOWNLOAD_PHP) === API_DIR_EXT . '/' . API_DOWNLOAD_PHP - -Path::extRelToCwd(GFX_INFO_REL_TO_EXT) === GFX_INFO - -Path::extRelToCwd(PATH_ICONS_REL_TO_EXT) === PATH_ICONS - -Path::appRelToCwd(SYSTEM_FILEADMIN_PROTECTED_LOG_REL_TO_APP) === SYSTEM_FILEADMIN_PROTECTED_LOG -Path::appRelToCwd(SYSTEM_QFQ_LOG_FILE_REL_TO_APP) === SYSTEM_QFQ_LOG_FILE -Path::appRelToCwd(SYSTEM_THUMBNAIL_DIR_SECURE_DEFAULT_REL_TO_APP) === SYSTEM_THUMBNAIL_DIR_SECURE_DEFAULT -Path::appRelToCwd(SYSTEM_THUMBNAIL_DIR_PUBLIC_DEFAULT_REL_TO_APP) === SYSTEM_THUMBNAIL_DIR_PUBLIC_DEFAULT -Path::appRelToCwd(THUMBNAIL_UNKNOWN_TYPE_REL_TO_APP) === THUMBNAIL_UNKNOWN_TYPE -Path::appRelToCwd(DIR_HIGHLIGHT_JSON_REL_TO_APP) === DIR_HIGHLIGHT_JSON - -$qfqProjectDirRelToCwd = Path::appRelToCwd(Store::getInstance()->getVar(SYSTEM_QFQ_PROJECT_DIR_SECURE_REL_TO_APP, STORE_SYSTEM)); -Path::join($qfqProjectDirRelToCwd, Path::REPORT_REL_TO_PROJECT_DIR) === "../../../../../fileadmin/protected/qfqProject/report" - - - */ - use IMATHUZH\Qfq\Core\Exception\Thrower; use IMATHUZH\Qfq\Core\Store\Config; diff --git a/extension/Classes/Core/Report/ColumnScript.php b/extension/Classes/Core/Report/ColumnScript.php index 8ee56a6cc..9305f9c1f 100644 --- a/extension/Classes/Core/Report/ColumnScript.php +++ b/extension/Classes/Core/Report/ColumnScript.php @@ -2,7 +2,9 @@ namespace IMATHUZH\Qfq\Core\Report; +use IMATHUZH\Qfq\Core\Exception\Thrower; use IMATHUZH\Qfq\Core\Helper\KeyValueStringParser; +use IMATHUZH\Qfq\Core\Helper\Path; use IMATHUZH\Qfq\Core\Store\Store; @@ -19,6 +21,14 @@ use IMATHUZH\Qfq\Core\Store\Store; * The second argument passed is an instance of ScriptFunctions which acts as an interface to QFQ functionality. */ class ColumnScript { + + /** + * @param string $columnValue + * @return false|string + * @throws \CodeException + * @throws \UserFormException + * @throws \UserReportException + */ public function render(string $columnValue) { // Parse arguments @@ -41,9 +51,9 @@ class ColumnScript { } // include script - $scriptPath = getcwd() . '/' . $param[TOKEN_SCRIPT]; + $scriptPath = Path::cwdToApp($param[TOKEN_SCRIPT]); if (!is_readable($scriptPath)) { - throw new \UserReportException("Can't read script file.", ERROR_IO_READ_FILE); + Thrower::userReportException("Can't read script file.", "Can't read file: $scriptPath"); } try { ob_start(); @@ -55,14 +65,12 @@ class ColumnScript { throw new \Exception('Include failed.'); } } catch (\Exception | \Error $e) { - throw new \UserReportException(json_encode([ - ERROR_MESSAGE_TO_USER => 'Error during reading script file.', - ERROR_MESSAGE_TO_DEVELOPER => "Error meassage:\n" . $e->getMessage()])); + Thrower::userReportException('Error during reading script file.', "Error message:\n" . $e->getMessage()); } // execute function, write output to buffer if (!function_exists($param[TOKEN_FUNCTION_CALL])) { - throw new \UserReportException("Function doesn't exist.", ERROR_IO_READ_FILE); + Thrower::userReportException("Function doesn't exist.", "In file '$scriptPath' there is no function " . $param[TOKEN_FUNCTION_CALL]); } ob_start(); try { @@ -70,9 +78,8 @@ class ColumnScript { $output = ob_get_clean(); } catch (\Exception | \Error $e) { ob_end_clean(); - throw new \UserReportException(json_encode([ - ERROR_MESSAGE_TO_USER => 'Function execution failed.', - ERROR_MESSAGE_TO_DEVELOPER => "Error message:\n" . $e->getMessage() . "\n\nFunction: " . $param[TOKEN_FUNCTION_CALL] . "\n\nParameters:\n" . print_r($param,true)])); + Thrower::userReportException('Function execution failed.', + "Error message:\n" . $e->getMessage() . "\n\nFunction: " . $param[TOKEN_FUNCTION_CALL] . "\n\nParameters:\n" . print_r($param,true)); } // return buffer output and fill store -- GitLab From 5f0995be9fff1ab711be2c355beccacaf7b367ae Mon Sep 17 00:00:00 2001 From: Marc Egger <marc.egger@uzh.ch> Date: Wed, 30 Sep 2020 18:41:22 +0200 Subject: [PATCH 103/195] Fix some unittests: add Path --- extension/Tests/Unit/Core/DeleteTest.php | 9 +++++++++ extension/Tests/phpunit_bootstrap.php | 7 +++++++ extension/phpunit.xml | 2 +- 3 files changed, 17 insertions(+), 1 deletion(-) create mode 100644 extension/Tests/phpunit_bootstrap.php diff --git a/extension/Tests/Unit/Core/DeleteTest.php b/extension/Tests/Unit/Core/DeleteTest.php index efbac6462..f7bc8f541 100644 --- a/extension/Tests/Unit/Core/DeleteTest.php +++ b/extension/Tests/Unit/Core/DeleteTest.php @@ -21,6 +21,8 @@ require_once(__DIR__ . '/Database/AbstractDatabaseTest.php'); */ class DeleteTest extends AbstractDatabaseTest { + private static $previousCwdToApp = ''; + /** * @expectedException CodeException */ @@ -75,6 +77,7 @@ class DeleteTest extends AbstractDatabaseTest { $this->store->setVar('form', 'TestFormName', STORE_TYPO3); + self::$previousCwdToApp = Path::cwdToApp(); Path::setMainPaths('/tmp'); // The above replaces the following line with a Path:: function. Probably won't work. // $this->store->setVar(SYSTEM_SITE_PATH_ABSOLUTE, '/tmp', STORE_SYSTEM, true); @@ -82,4 +85,10 @@ class DeleteTest extends AbstractDatabaseTest { $this->executeSQLFile(__DIR__ . '/Database/fixtures/Generic.sql', true); } + protected function tearDown() + { + parent::tearDown(); + Path::setMainPaths(self::$previousCwdToApp); + } + } diff --git a/extension/Tests/phpunit_bootstrap.php b/extension/Tests/phpunit_bootstrap.php new file mode 100644 index 000000000..b738bdded --- /dev/null +++ b/extension/Tests/phpunit_bootstrap.php @@ -0,0 +1,7 @@ +<?php + +use IMATHUZH\Qfq\Core\Helper\Path; + +require dirname(__DIR__).'/vendor/autoload.php'; + +Path::setMainPaths('../../../'); \ No newline at end of file diff --git a/extension/phpunit.xml b/extension/phpunit.xml index 5a6f5c49f..13d101389 100644 --- a/extension/phpunit.xml +++ b/extension/phpunit.xml @@ -1,4 +1,4 @@ -<phpunit bootstrap="vendor/autoload.php"> +<phpunit bootstrap="Tests/phpunit_bootstrap.php"> <testsuites> <testsuite name="qfq"> <directory>Tests/Unit</directory> -- GitLab From 165ccf68aff02e1d615b968d4e898ca97fae8b32 Mon Sep 17 00:00:00 2001 From: Marc Egger <marc.egger@uzh.ch> Date: Thu, 1 Oct 2020 11:40:43 +0200 Subject: [PATCH 104/195] replace cwdToApi with appToApi --- extension/Classes/Core/AbstractBuildForm.php | 6 +++--- extension/Classes/Core/BuildFormBootstrap.php | 12 ++++++------ extension/Classes/Core/Evaluate.php | 2 +- extension/Classes/Core/Helper/HelperFile.php | 8 ++++---- extension/Classes/Core/Helper/Path.php | 16 ++++++++-------- extension/Classes/Core/QuickFormQuery.php | 2 +- extension/Classes/Core/Report/Link.php | 6 +++--- extension/Classes/Core/Report/Thumbnail.php | 2 +- extension/Classes/Core/Store/Config.php | 6 +++--- extension/Tests/Unit/Core/DeleteTest.php | 6 +++--- extension/Tests/Unit/Core/Report/ReportTest.php | 14 +++++++------- 11 files changed, 40 insertions(+), 40 deletions(-) diff --git a/extension/Classes/Core/AbstractBuildForm.php b/extension/Classes/Core/AbstractBuildForm.php index 9e44c6267..833dd891a 100644 --- a/extension/Classes/Core/AbstractBuildForm.php +++ b/extension/Classes/Core/AbstractBuildForm.php @@ -633,7 +633,7 @@ abstract class AbstractBuildForm { */ public function getActionUrl() { - return Path::cwdToApi(API_SAVE_PHP); + return Path::appToApi(API_SAVE_PHP); } /** @@ -2595,7 +2595,7 @@ abstract class AbstractBuildForm { $sip = $this->store->getSipInstance(); - return $sip->queryStringToSip($queryString, $mode, Path::cwdToApi(API_DELETE_PHP)); + return $sip->queryStringToSip($queryString, $mode, Path::appToApi(API_DELETE_PHP)); } /** @@ -2995,7 +2995,7 @@ abstract class AbstractBuildForm { $param[DOWNLOAD_MODE] = DOWNLOAD_MODE_FILE; $param[SIP_DOWNLOAD_PARAMETER] = base64_encode(TOKEN_FILE . PARAM_TOKEN_DELIMITER . $pathFileName); - $url = $this->sip->queryStringToSip(Path::cwdToApi(API_DOWNLOAD_PHP) . '?' . KeyValueStringParser::unparse($param, '=', '&'), RETURN_URL); + $url = $this->sip->queryStringToSip(Path::appToApi(API_DOWNLOAD_PHP) . '?' . KeyValueStringParser::unparse($param, '=', '&'), RETURN_URL); return $url; } diff --git a/extension/Classes/Core/BuildFormBootstrap.php b/extension/Classes/Core/BuildFormBootstrap.php index 4a0e11568..12874cbe8 100644 --- a/extension/Classes/Core/BuildFormBootstrap.php +++ b/extension/Classes/Core/BuildFormBootstrap.php @@ -657,14 +657,14 @@ class BuildFormBootstrap extends AbstractBuildForm { $actionUpload = FILE_ACTION . '=' . FILE_ACTION_UPLOAD; $actionDelete = FILE_ACTION . '=' . FILE_ACTION_DELETE; - $apiDeletePhp = Path::cwdToApi(API_DELETE_PHP); + $apiDeletePhp = Path::appToApi(API_DELETE_PHP); - $dirtyAction = ($this->formSpec[F_DIRTY_MODE] == DIRTY_MODE_NONE) ? '' : "dirtyUrl: '" . Path::cwdToApi(API_DIRTY_PHP) . "',"; + $dirtyAction = ($this->formSpec[F_DIRTY_MODE] == DIRTY_MODE_NONE) ? '' : "dirtyUrl: '" . Path::appToApi(API_DIRTY_PHP) . "',"; - $submitTo = Path::cwdToApi(API_SAVE_PHP); - $refreshUrl = Path::cwdToApi(API_LOAD_PHP); - $fileUploadTo = Path::cwdToApi(API_FILE_PHP) . '?' . $actionUpload; - $fileDeleteUrl = Path::cwdToApi(API_FILE_PHP) . '?' . $actionDelete; + $submitTo = Path::appToApi(API_SAVE_PHP); + $refreshUrl = Path::appToApi(API_LOAD_PHP); + $fileUploadTo = Path::appToApi(API_FILE_PHP) . '?' . $actionUpload; + $fileDeleteUrl = Path::appToApi(API_FILE_PHP) . '?' . $actionDelete; $html .= '</form>'; // <form class="form-horizontal" ... $html .= <<<EOF diff --git a/extension/Classes/Core/Evaluate.php b/extension/Classes/Core/Evaluate.php index d9b424569..25b1b8713 100644 --- a/extension/Classes/Core/Evaluate.php +++ b/extension/Classes/Core/Evaluate.php @@ -293,7 +293,7 @@ class Evaluate { $this->store::setVar(SYSTEM_DRAG_AND_DROP_JS, 'true', STORE_SYSTEM); // data-dnd-api="typo3conf/ext/qfq/qfq/Api/dragAndDrop.php?s={{'U:form=<form name>[¶mX=<any value>]|s|r:8' AS _link}}" - return DND_DATA_DND_API . '="' . Path::cwdToApi(API_DRAG_AND_DROP_PHP) . '?s=' . $s . '"'; + return DND_DATA_DND_API . '="' . Path::appToApi(API_DRAG_AND_DROP_PHP) . '?s=' . $s . '"'; } /** diff --git a/extension/Classes/Core/Helper/HelperFile.php b/extension/Classes/Core/Helper/HelperFile.php index 686629f98..29c99b4dc 100644 --- a/extension/Classes/Core/Helper/HelperFile.php +++ b/extension/Classes/Core/Helper/HelperFile.php @@ -115,14 +115,14 @@ class HelperFile { return $vars; } - $pathFileNameRelToApp = Path::cwdToApp($pathFileNameRelToApp); + $pathFileNameRelToCwd = Path::cwdToApp($pathFileNameRelToApp); - if (!file_exists($pathFileNameRelToApp)) { + if (!file_exists($pathFileNameRelToCwd)) { return $vars; } - $vars[VAR_FILE_MIME_TYPE] = self::getMimeType($pathFileNameRelToApp); - $vars[VAR_FILE_SIZE] = filesize($pathFileNameRelToApp); + $vars[VAR_FILE_MIME_TYPE] = self::getMimeType($pathFileNameRelToCwd); + $vars[VAR_FILE_SIZE] = filesize($pathFileNameRelToCwd); if ($vars[VAR_FILE_SIZE] === false) { $vars[VAR_FILE_SIZE] = '-'; diff --git a/extension/Classes/Core/Helper/Path.php b/extension/Classes/Core/Helper/Path.php index 13ee33ed8..a75100a99 100644 --- a/extension/Classes/Core/Helper/Path.php +++ b/extension/Classes/Core/Helper/Path.php @@ -47,7 +47,7 @@ class Path const PROJECT_DIR_TO_REPORT = 'report'; // Config - const APP_TO_TYPO3_CONFIG = 'typo3conf'; + const APP_TO_TYPO3_CONF = 'typo3conf'; // Log files private static $cwdToLog = null; // TODO: does it make sense to have it rel to CWD? to broad? @@ -153,7 +153,7 @@ class Path */ public static function cwdToLog(/* path parts to append */): string { - self::enforcePathIsSet(self::$cwdToApp); + self::enforcePathIsSet(self::$cwdToLog); return self::join(self::$cwdToLog, func_get_args()); } @@ -208,9 +208,9 @@ class Path * @return string * @throws \UserFormException */ - public static function cwdToApi(/* path parts to append */): string + public static function appToApi(/* path parts to append */): string { - return self::cwdToExt(self::extToApi(func_get_args())); + return self::join(self::APP_TO_EXT, self::EXT_TO_API, func_get_args()); } /** @@ -363,16 +363,16 @@ class Path */ private static function findAndSetLogPath() { - // search log dir in project + // search log dir qfqProject/log $cwdToLog = self::cwdToProject(self::PROJECT_TO_LOG_DEFAULT); if (file_exists($cwdToLog)) { self::setCwdToLog($cwdToLog); - // search log dir in fileadmin/protected + // search log dir fileadmin/protected/log } elseif (file_exists(self::cwdToApp(self::APP_TO_LOG_DEPRECATED))) { self::setCwdToLog(self::cwdToApp(self::APP_TO_LOG_DEPRECATED)); - // create default log dir + // create default log dir qfqProject/log } else { HelperFile::createPathRecursive($cwdToLog); self::setCwdToLog($cwdToLog); @@ -393,7 +393,7 @@ class Path self::setAppToProject(HelperFile::include($cwdToProjectPathFile)); // does the deprecated config.qfq.php exist? => migrate to qfq.json - } elseif (HelperFile::isReadableException(self::cwdToApp(self::APP_TO_TYPO3_CONFIG, CONFIG_QFQ_PHP))) { + } elseif (HelperFile::isReadableException(self::cwdToApp(self::APP_TO_TYPO3_CONF, CONFIG_QFQ_PHP))) { self::setAppToProject(self::APP_TO_PROJECT_MIGRATE); self::writeProjectPathPhp(); Config::migrateConfigPhpToJson(); diff --git a/extension/Classes/Core/QuickFormQuery.php b/extension/Classes/Core/QuickFormQuery.php index ef1b5df3d..a9f44f369 100644 --- a/extension/Classes/Core/QuickFormQuery.php +++ b/extension/Classes/Core/QuickFormQuery.php @@ -1780,7 +1780,7 @@ class QuickFormQuery { $form = join(' ', [$headerBar, $codeBox]); $sipObj = new Sip; - $action = $sipObj->queryStringToSip(Path::cwdToApi(API_SAVE_PHP) . "?uid=$uid&" . REPORT_SAVE . "=1&" . REPORT_SAVE_FILE . "=" . (is_null($reportPathFileNameFull) ? 0 : 1)); + $action = $sipObj->queryStringToSip(Path::appToApi(API_SAVE_PHP) . "?uid=$uid&" . REPORT_SAVE . "=1&" . REPORT_SAVE_FILE . "=" . (is_null($reportPathFileNameFull) ? 0 : 1)); $formAttributes = Support::doAttribute('id', "tt-content-edit-$uid") . Support::doAttribute('class', 'hidden') . Support::doAttribute('method', 'post') . diff --git a/extension/Classes/Core/Report/Link.php b/extension/Classes/Core/Report/Link.php index f87bb017f..f739b38b0 100644 --- a/extension/Classes/Core/Report/Link.php +++ b/extension/Classes/Core/Report/Link.php @@ -1667,7 +1667,7 @@ EOF; onclick="$('#qfqModalTitle101').text($(this).data('title')); $('#qfqModalText101').text($(this).data('text'));" EOF; - $vars[NAME_URL] = Path::cwdToApi(API_DOWNLOAD_PHP); + $vars[NAME_URL] = Path::appToApi(API_DOWNLOAD_PHP); $vars[NAME_LINK_CLASS_DEFAULT] = NO_CLASS; $vars[NAME_EXTRA_CONTENT_WRAP] = '<span ' . $attributes . $onClick . '>'; @@ -1729,7 +1729,7 @@ EOF; $vars[NAME_TOOL_TIP] .= PHP_EOL . PHP_EOL . $this->sip->debugSip($paramArray); } - $source = json_encode(['uri' => Path::cwdToApi(API_DOWNLOAD_PHP) . '?s=' . $paramArray[SIP_SIP]]); + $source = json_encode(['uri' => Path::appToApi(API_DOWNLOAD_PHP) . '?s=' . $paramArray[SIP_SIP]]); } else { throw new \UserReportException("Missing content for 'copy to clipboard'", ERROR_MISSING_CONTENT); } @@ -1850,7 +1850,7 @@ EOF; } if ($vars[NAME_URL] == '') { - $vars[NAME_URL] = Path::cwdToApi(API_DELETE_PHP); + $vars[NAME_URL] = Path::appToApi(API_DELETE_PHP); } if (!isset($vars[NAME_LINK_CLASS])) { diff --git a/extension/Classes/Core/Report/Thumbnail.php b/extension/Classes/Core/Report/Thumbnail.php index 60fadbb7f..04b9094ee 100644 --- a/extension/Classes/Core/Report/Thumbnail.php +++ b/extension/Classes/Core/Report/Thumbnail.php @@ -289,7 +289,7 @@ class Thumbnail { */ private function buildSecureDownloadLink($pathFilenameThumbnail, $str) { - $urlParam = Path::cwdToApi(API_DOWNLOAD_PHP) . '?' . DOWNLOAD_MODE . '=' . DOWNLOAD_MODE_THUMBNAIL; + $urlParam = Path::appToApi(API_DOWNLOAD_PHP) . '?' . DOWNLOAD_MODE . '=' . DOWNLOAD_MODE_THUMBNAIL; $urlParam .= '&' . SIP_DOWNLOAD_PARAMETER . '=' . base64_encode(TOKEN_FILE . ':' . $pathFilenameThumbnail . '|' . $str); $sip = $this->store->getSipInstance(); diff --git a/extension/Classes/Core/Store/Config.php b/extension/Classes/Core/Store/Config.php index b246f13d6..a9139375a 100644 --- a/extension/Classes/Core/Store/Config.php +++ b/extension/Classes/Core/Store/Config.php @@ -168,7 +168,7 @@ class Config { public static function migrateConfigPhpToJson(): void { // read old config.qfq.php - $cwdToOldConfigFile = Path::cwdToApp(Path::APP_TO_TYPO3_CONFIG, CONFIG_QFQ_PHP); + $cwdToOldConfigFile = Path::cwdToApp(Path::APP_TO_TYPO3_CONF, CONFIG_QFQ_PHP); HelperFile::enforce_writable($cwdToOldConfigFile); // so we can delete it. $config = include($cwdToOldConfigFile); @@ -194,8 +194,8 @@ class Config { $configT3qfq = unserialize($GLOBALS['TYPO3_CONF_VARS']['EXT']['extConf'][EXT_KEY]); $configT3qfq[SYSTEM_DB_NAME_T3] = self::getDbName($GLOBALS['TYPO3_CONF_VARS']['DB']); - } elseif (is_readable(Path::cwdToApp(Path::APP_TO_TYPO3_CONFIG, CONFIG_T3))) { - $cwdToTypo3ConfigFile = Path::cwdToApp(Path::APP_TO_TYPO3_CONFIG, CONFIG_T3); + } elseif (is_readable(Path::cwdToApp(Path::APP_TO_TYPO3_CONF, CONFIG_T3))) { + $cwdToTypo3ConfigFile = Path::cwdToApp(Path::APP_TO_TYPO3_CONF, CONFIG_T3); $configT3 = HelperFile::include($cwdToTypo3ConfigFile); $configT3qfq = unserialize($configT3['EXT']['extConf'][EXT_KEY]); if (!is_array($configT3qfq)) { diff --git a/extension/Tests/Unit/Core/DeleteTest.php b/extension/Tests/Unit/Core/DeleteTest.php index f7bc8f541..b8d9ecad5 100644 --- a/extension/Tests/Unit/Core/DeleteTest.php +++ b/extension/Tests/Unit/Core/DeleteTest.php @@ -21,7 +21,7 @@ require_once(__DIR__ . '/Database/AbstractDatabaseTest.php'); */ class DeleteTest extends AbstractDatabaseTest { - private static $previousCwdToApp = ''; + private $previousCwdToApp = ''; /** * @expectedException CodeException @@ -77,7 +77,7 @@ class DeleteTest extends AbstractDatabaseTest { $this->store->setVar('form', 'TestFormName', STORE_TYPO3); - self::$previousCwdToApp = Path::cwdToApp(); + $this->previousCwdToApp = Path::cwdToApp(); Path::setMainPaths('/tmp'); // The above replaces the following line with a Path:: function. Probably won't work. // $this->store->setVar(SYSTEM_SITE_PATH_ABSOLUTE, '/tmp', STORE_SYSTEM, true); @@ -88,7 +88,7 @@ class DeleteTest extends AbstractDatabaseTest { protected function tearDown() { parent::tearDown(); - Path::setMainPaths(self::$previousCwdToApp); + Path::setMainPaths($this->previousCwdToApp); } } diff --git a/extension/Tests/Unit/Core/Report/ReportTest.php b/extension/Tests/Unit/Core/Report/ReportTest.php index 9d57d1cb2..fd0fb1f03 100644 --- a/extension/Tests/Unit/Core/Report/ReportTest.php +++ b/extension/Tests/Unit/Core/Report/ReportTest.php @@ -932,7 +932,7 @@ EOF; // _paged: incl. alert $result = $this->report->process("10.sql = SELECT 'U:table=Person&r=123' AS _paged FROM Person ORDER BY id LIMIT 1"); - $this->assertEquals('<a href="' . Path::cwdToApi(API_DELETE_PHP) . '?s=badcaffee1234" class="btn btn-default" title="Delete" ' . $js . ' ><span class="glyphicon glyphicon-trash" ></span></a>', $result); + $this->assertEquals('<a href="' . Path::appToApi(API_DELETE_PHP) . '?s=badcaffee1234" class="btn btn-default" title="Delete" ' . $js . ' ><span class="glyphicon glyphicon-trash" ></span></a>', $result); // Check das via '_paged' SIP_MODE_ANSWER and SIP_TARGET_URL has been set. $result = Session::get('badcaffee1234'); @@ -940,7 +940,7 @@ EOF; // _paged: incl. alert $result = $this->report->process("10.sql = SELECT 'U:form=Person&r=123' AS _paged FROM Person ORDER BY id LIMIT 1"); - $this->assertEquals('<a href="' . Path::cwdToApi(API_DELETE_PHP) . '?s=badcaffee1234" class="btn btn-default" title="Delete" ' . $js . ' ><span class="glyphicon glyphicon-trash" ></span></a>', $result); + $this->assertEquals('<a href="' . Path::appToApi(API_DELETE_PHP) . '?s=badcaffee1234" class="btn btn-default" title="Delete" ' . $js . ' ><span class="glyphicon glyphicon-trash" ></span></a>', $result); // _paged: other than defaults for the alert. $js = str_replace('Do you really want to delete the record?', 'Move to trash?', $js); @@ -951,11 +951,11 @@ EOF; $js = str_replace('modal: true', 'modal: false', $js); $js = str_replace("type: 'warning'", "type: 'success'", $js); $result = $this->report->process("10.sql = SELECT 'U:table=Person&r=123|q:Move to trash?:success:yes:no:10:0' AS _paged FROM Person ORDER BY id LIMIT 1"); - $this->assertEquals('<a href="' . Path::cwdToApi(API_DELETE_PHP) . '?s=badcaffee1234" class="btn btn-default" title="Delete" ' . $js . ' ><span class="glyphicon glyphicon-trash" ></span></a>', $result); + $this->assertEquals('<a href="' . Path::appToApi(API_DELETE_PHP) . '?s=badcaffee1234" class="btn btn-default" title="Delete" ' . $js . ' ><span class="glyphicon glyphicon-trash" ></span></a>', $result); $result = $this->report->process("10.sql = SELECT 'U:table=Person&r=123|q:Move to trash?:success:yes:no:10:0|t:click me' AS _paged FROM Person ORDER BY id LIMIT 1"); - $this->assertEquals('<a href="' . Path::cwdToApi(API_DELETE_PHP) . '?s=badcaffee1234" class="btn btn-default" title="Delete" ' . $js . ' ><span class="glyphicon glyphicon-trash" ></span> click me</a>', $result); + $this->assertEquals('<a href="' . Path::appToApi(API_DELETE_PHP) . '?s=badcaffee1234" class="btn btn-default" title="Delete" ' . $js . ' ><span class="glyphicon glyphicon-trash" ></span> click me</a>', $result); } /** @@ -988,7 +988,7 @@ EOF; // _Paged: incl. alert $result = $this->report->process("10.sql = SELECT 'table=Person&r=123' AS _Paged FROM Person ORDER BY id LIMIT 1"); - $this->assertEquals('<a href="' . Path::cwdToApi(API_DELETE_PHP) . '?s=badcaffee1234" class="btn btn-default" title="Delete" ' . $js . ' ><span class="glyphicon glyphicon-trash" ></span></a>', $result); + $this->assertEquals('<a href="' . Path::appToApi(API_DELETE_PHP) . '?s=badcaffee1234" class="btn btn-default" title="Delete" ' . $js . ' ><span class="glyphicon glyphicon-trash" ></span></a>', $result); // _Paged: other than defaults for the alert. $js = str_replace('Do you really want to delete the record?', 'Move to trash?', $js); @@ -999,11 +999,11 @@ EOF; $js = str_replace('modal: true', 'modal: false', $js); $js = str_replace("type: 'warning'", "type: 'success'", $js); $result = $this->report->process("10.sql = SELECT 'table=Person&r=123|||Move to trash?:success:yes:no:10:0' AS _Paged FROM Person ORDER BY id LIMIT 1"); - $this->assertEquals('<a href="' . Path::cwdToApi(API_DELETE_PHP) . '?s=badcaffee1234" class="btn btn-default" title="Delete" ' . $js . ' ><span class="glyphicon glyphicon-trash" ></span></a>', $result); + $this->assertEquals('<a href="' . Path::appToApi(API_DELETE_PHP) . '?s=badcaffee1234" class="btn btn-default" title="Delete" ' . $js . ' ><span class="glyphicon glyphicon-trash" ></span></a>', $result); $result = $this->report->process("10.sql = SELECT 'table=Person&r=123|click me||Move to trash?:success:yes:no:10:0' AS _Paged FROM Person ORDER BY id LIMIT 1"); - $this->assertEquals('<a href="' . Path::cwdToApi(API_DELETE_PHP) . '?s=badcaffee1234" class="btn btn-default" title="Delete" ' . $js . ' ><span class="glyphicon glyphicon-trash" ></span> click me</a>', $result); + $this->assertEquals('<a href="' . Path::appToApi(API_DELETE_PHP) . '?s=badcaffee1234" class="btn btn-default" title="Delete" ' . $js . ' ><span class="glyphicon glyphicon-trash" ></span> click me</a>', $result); // Empty string is ok $result = $this->report->process("10.sql = SELECT '' AS _Paged FROM Person ORDER BY id LIMIT 1"); -- GitLab From 8810e80e996d208fce589a1365a2aec085ffb00c Mon Sep 17 00:00:00 2001 From: Marc Egger <marc.egger@uzh.ch> Date: Thu, 1 Oct 2020 12:45:30 +0200 Subject: [PATCH 105/195] replace cwdToExt with appToExt where appropriate --- extension/Classes/Core/AbstractBuildForm.php | 8 ++--- .../Classes/Core/Database/DatabaseUpdate.php | 2 +- extension/Classes/Core/Helper/HelperFile.php | 2 +- extension/Classes/Core/Helper/Path.php | 15 ++++++++++ extension/Classes/Core/Helper/Support.php | 2 +- extension/Classes/Core/QuickFormQuery.php | 4 +-- extension/Classes/Core/Report/Link.php | 4 +-- extension/Classes/Core/Report/Monitor.php | 2 +- .../Tests/Unit/Core/Helper/HelperFileTest.php | 30 +++++++++---------- 9 files changed, 42 insertions(+), 27 deletions(-) diff --git a/extension/Classes/Core/AbstractBuildForm.php b/extension/Classes/Core/AbstractBuildForm.php index 833dd891a..786522b25 100644 --- a/extension/Classes/Core/AbstractBuildForm.php +++ b/extension/Classes/Core/AbstractBuildForm.php @@ -2545,7 +2545,7 @@ abstract class AbstractBuildForm { } if (isset($control[SUBRECORD_COLUMN_ICON][$columnName])) { - $cell = ($cell === '') ? '' : "<image src='" . Path::cwdToExt(Path::EXT_TO_PATH_ICONS) . "/$cell'>"; + $cell = ($cell === '') ? '' : "<image src='" . Path::appToExt(Path::EXT_TO_PATH_ICONS) . "/$cell'>"; } if (isset($control[SUBRECORD_COLUMN_MAILTO][$columnName])) { @@ -2883,8 +2883,8 @@ abstract class AbstractBuildForm { $attributeFabric = Support::doAttribute('class', ANNOTATE_GRAPHIC_CSS_CLASS); $attributeFabric .= Support::doAttribute('data-background-image', $this->fileToSipUrl($formElement[FE_IMAGE_SOURCE])); $attributeFabric .= Support::doAttribute('data-control-name', $formElement[FE_HTML_ID]); - $attributeFabric .= Support::doAttribute('data-buttons', Path::cwdToExt('Resources/Public/Json/fabric.buttons.json')); - $attributeFabric .= Support::doAttribute('data-emojis', Path::cwdToExt('Resources/Public/Json/qfq.emoji.json')); + $attributeFabric .= Support::doAttribute('data-buttons', Path::appToExt('Resources/Public/Json/fabric.buttons.json')); + $attributeFabric .= Support::doAttribute('data-emojis', Path::appToExt('Resources/Public/Json/qfq.emoji.json')); $attributeFabric .= Support::doAttribute('data-fabric-color', HelperFormElement::penColorToHex($formElement)); $attributeFabric .= HelperFormElement::getAttributeFeMode($formElement[FE_MODE]); if ($formElement[FE_MODE] == FE_MODE_READONLY) { @@ -2949,7 +2949,7 @@ abstract class AbstractBuildForm { // data-image-output="target-png"> // </div> $attributeFabric = Support::doAttribute('class', ANNOTATE_GRAPHIC_CSS_CLASS); - $attributeFabric .= Support::doAttribute('data-buttons', Path::cwdToExt('Resources/Public/Json/fabric.editor.buttons.json')); + $attributeFabric .= Support::doAttribute('data-buttons', Path::appToExt('Resources/Public/Json/fabric.editor.buttons.json')); $attributeFabric .= Support::doAttribute('data-edit-image', 'true'); $attributeFabric .= Support::doAttribute('data-background-image', $imageFileName); $attributeFabric .= Support::doAttribute('data-control-name', $htmlFabricId); diff --git a/extension/Classes/Core/Database/DatabaseUpdate.php b/extension/Classes/Core/Database/DatabaseUpdate.php index a8408d72b..0194bf2ce 100644 --- a/extension/Classes/Core/Database/DatabaseUpdate.php +++ b/extension/Classes/Core/Database/DatabaseUpdate.php @@ -365,7 +365,7 @@ class DatabaseUpdate { $functionsHashTest = null; } - $qfqFunctionSqlRelToApp = Path::cwdToExt('Classes/Sql/' . QFQ_FUNCTION_SQL); + $qfqFunctionSqlRelToApp = Path::appToExt('Classes/Sql/' . QFQ_FUNCTION_SQL); if ($functionHash !== null AND $functionsHashTest === $functionHash) { return $functionHash; diff --git a/extension/Classes/Core/Helper/HelperFile.php b/extension/Classes/Core/Helper/HelperFile.php index 29c99b4dc..8622218ae 100644 --- a/extension/Classes/Core/Helper/HelperFile.php +++ b/extension/Classes/Core/Helper/HelperFile.php @@ -453,7 +453,7 @@ class HelperFile { } if (isset($extToFileType[$ext])) { - return Path::cwdToExt(Path::EXT_TO_HIGHLIGHT_JSON_DIR) . '/' . $extToFileType[$ext]; + return Path::appToExt(Path::EXT_TO_HIGHLIGHT_JSON_DIR) . '/' . $extToFileType[$ext]; } return ''; diff --git a/extension/Classes/Core/Helper/Path.php b/extension/Classes/Core/Helper/Path.php index a75100a99..19fa8cab3 100644 --- a/extension/Classes/Core/Helper/Path.php +++ b/extension/Classes/Core/Helper/Path.php @@ -4,6 +4,12 @@ namespace IMATHUZH\Qfq\Core\Helper; /* + * Glossar: + * - App: directory in which the index.php file is located. All urls should be relative to this. + * - Ext: directory in which the QFQ extension is loacted. e.g. the folder Classes is in there. + * - CWD: current working directory + * - API: api folder of qfq extension + * * Naming convention of path constants/functions/variables: * 1) name a path by its origin and its destination separated by 'to'. E.g. APP_TO_SYSTEM_LOG, $appToProject. * 2) if the destination is a file, append "File". E.g. APP_TO_SYSTEM_QFQ_LOG_FILE. @@ -186,6 +192,15 @@ class Path return self::cwdToApp(self::appToProject(func_get_args())); } + /** + * @return string + * @throws \UserFormException + */ + public static function appToExt(/* path parts to append */): string + { + return self::join(self::APP_TO_EXT, func_get_args()); + } + /** * @return string * @throws \UserFormException diff --git a/extension/Classes/Core/Helper/Support.php b/extension/Classes/Core/Helper/Support.php index cdfe705fb..e96cb15ce 100644 --- a/extension/Classes/Core/Helper/Support.php +++ b/extension/Classes/Core/Helper/Support.php @@ -236,7 +236,7 @@ class Support { */ public static function doTooltip($htmlId, $tooltipText) { - return "<img " . self::doAttribute('id', $htmlId) . " src='" . Path::cwdToExt(Path::EXT_TO_GFX_INFO_FILE) . "' title=\"" . htmlentities($tooltipText) . "\">"; + return "<img " . self::doAttribute('id', $htmlId) . " src='" . Path::appToExt(Path::EXT_TO_GFX_INFO_FILE) . "' title=\"" . htmlentities($tooltipText) . "\">"; } /** diff --git a/extension/Classes/Core/QuickFormQuery.php b/extension/Classes/Core/QuickFormQuery.php index a9f44f369..d09d00fa8 100644 --- a/extension/Classes/Core/QuickFormQuery.php +++ b/extension/Classes/Core/QuickFormQuery.php @@ -2139,7 +2139,7 @@ class QuickFormQuery { */ private function getModalCode() { - $iconGearRelToCwd = Path::cwdToExt('Resources/Public/icons/gear.svg'); + $iconGearRelToApp = Path::appToExt('Resources/Public/icons/gear.svg'); $code = <<<EOF <!-- Modal --> @@ -2151,7 +2151,7 @@ class QuickFormQuery { <h4 class="modal-title" id="qfqModalTitle101">Loading Document</h4> </div> <div class="modal-body" style="text-align: center;"> - <img class="qfq-icon-gear glyphicon-spin" src="$iconGearRelToCwd"> + <img class="qfq-icon-gear glyphicon-spin" src="$iconGearRelToApp"> <p id="qfqModalText101">Document is being generated. Please wait.</p> </div> <div class="modal-footer"> diff --git a/extension/Classes/Core/Report/Link.php b/extension/Classes/Core/Report/Link.php index f739b38b0..5134b3a3d 100644 --- a/extension/Classes/Core/Report/Link.php +++ b/extension/Classes/Core/Report/Link.php @@ -1781,7 +1781,7 @@ EOF; $vars[NAME_ALT_TEXT] = "Bullet " . $value; } - $vars[NAME_IMAGE] = Path::cwdToExt(Path::EXT_TO_PATH_ICONS) . "/bullet-" . $value . '.gif'; + $vars[NAME_IMAGE] = Path::appToExt(Path::EXT_TO_PATH_ICONS) . "/bullet-" . $value . '.gif'; $vars[NAME_IMAGE_TITLE] = $value; $vars[NAME_LINK_CLASS_DEFAULT] = NO_CLASS; @@ -1806,7 +1806,7 @@ EOF; $vars[NAME_ALT_TEXT] = "Checked " . $value; } - $vars[NAME_IMAGE] = Path::cwdToExt(Path::EXT_TO_PATH_ICONS) . "/checked-" . $value . '.gif'; + $vars[NAME_IMAGE] = Path::appToExt(Path::EXT_TO_PATH_ICONS) . "/checked-" . $value . '.gif'; $vars[NAME_IMAGE_TITLE] = $value; $vars[NAME_LINK_CLASS_DEFAULT] = NO_CLASS; diff --git a/extension/Classes/Core/Report/Monitor.php b/extension/Classes/Core/Report/Monitor.php index 4d666020e..5048ee7e2 100644 --- a/extension/Classes/Core/Report/Monitor.php +++ b/extension/Classes/Core/Report/Monitor.php @@ -81,7 +81,7 @@ class Monitor { $key = $this->getSeekSessionKey($arr[CLIENT_SIP]); $this->session::unsetItem($key); - $webworker = Path::cwdToExt('Resources/Public/JavaScript/GetFileContent.js'); + $webworker = Path::appToExt('Resources/Public/JavaScript/GetFileContent.js'); $code = <<<EOF <script type="text/javascript"> diff --git a/extension/Tests/Unit/Core/Helper/HelperFileTest.php b/extension/Tests/Unit/Core/Helper/HelperFileTest.php index bc12425b1..d8c68cdd7 100644 --- a/extension/Tests/Unit/Core/Helper/HelperFileTest.php +++ b/extension/Tests/Unit/Core/Helper/HelperFileTest.php @@ -33,21 +33,21 @@ class HelperFileTest extends TestCase { $this->assertEquals('', HelperFile::getFileTypeHighlight(FE_HIGHLIGHT_AUTO,'')); - $this->assertEquals(Path::cwdToExt(Path::EXT_TO_HIGHLIGHT_JSON_DIR) . '/javascript.json', HelperFile::getFileTypeHighlight(FE_HIGHLIGHT_JAVASCRIPT,'')); - $this->assertEquals(Path::cwdToExt(Path::EXT_TO_HIGHLIGHT_JSON_DIR) . '/highlight.qfq.json', HelperFile::getFileTypeHighlight(FE_HIGHLIGHT_QFQ,'')); - $this->assertEquals(Path::cwdToExt(Path::EXT_TO_HIGHLIGHT_JSON_DIR) . '/highlight.py.json', HelperFile::getFileTypeHighlight(FE_HIGHLIGHT_PYTHON,'')); - $this->assertEquals(Path::cwdToExt(Path::EXT_TO_HIGHLIGHT_JSON_DIR) . '/highlight.m.json', HelperFile::getFileTypeHighlight(FE_HIGHLIGHT_MATLAB,'')); - - $this->assertEquals(Path::cwdToExt(Path::EXT_TO_HIGHLIGHT_JSON_DIR) . '/javascript.json', HelperFile::getFileTypeHighlight(FE_HIGHLIGHT_JAVASCRIPT,'fileadmin/test.js')); - $this->assertEquals(Path::cwdToExt(Path::EXT_TO_HIGHLIGHT_JSON_DIR) . '/highlight.qfq.json', HelperFile::getFileTypeHighlight(FE_HIGHLIGHT_QFQ, 'fileadmin/test.js')); - $this->assertEquals(Path::cwdToExt(Path::EXT_TO_HIGHLIGHT_JSON_DIR) . '/highlight.py.json', HelperFile::getFileTypeHighlight(FE_HIGHLIGHT_PYTHON, 'fileadmin/test.js')); - $this->assertEquals(Path::cwdToExt(Path::EXT_TO_HIGHLIGHT_JSON_DIR) . '/highlight.m.json', HelperFile::getFileTypeHighlight(FE_HIGHLIGHT_MATLAB, 'fileadmin/test.js')); - - $this->assertEquals(Path::cwdToExt(Path::EXT_TO_HIGHLIGHT_JSON_DIR) . '/javascript.json', HelperFile::getFileTypeHighlight(FE_HIGHLIGHT_AUTO, 'fileadmin/test.js')); - $this->assertEquals(Path::cwdToExt(Path::EXT_TO_HIGHLIGHT_JSON_DIR) . '/highlight.php.json', HelperFile::getFileTypeHighlight(FE_HIGHLIGHT_AUTO, 'fileadmin/test.php')); - $this->assertEquals(Path::cwdToExt(Path::EXT_TO_HIGHLIGHT_JSON_DIR) . '/highlight.qfq.json', HelperFile::getFileTypeHighlight(FE_HIGHLIGHT_AUTO, 'fileadmin/test.qfq')); - $this->assertEquals(Path::cwdToExt(Path::EXT_TO_HIGHLIGHT_JSON_DIR) . '/highlight.py.json', HelperFile::getFileTypeHighlight(FE_HIGHLIGHT_AUTO, 'fileadmin/test.py')); - $this->assertEquals(Path::cwdToExt(Path::EXT_TO_HIGHLIGHT_JSON_DIR) . '/highlight.m.json', HelperFile::getFileTypeHighlight(FE_HIGHLIGHT_AUTO, 'fileadmin/test.m')); + $this->assertEquals(Path::appToExt(Path::EXT_TO_HIGHLIGHT_JSON_DIR) . '/javascript.json', HelperFile::getFileTypeHighlight(FE_HIGHLIGHT_JAVASCRIPT,'')); + $this->assertEquals(Path::appToExt(Path::EXT_TO_HIGHLIGHT_JSON_DIR) . '/highlight.qfq.json', HelperFile::getFileTypeHighlight(FE_HIGHLIGHT_QFQ,'')); + $this->assertEquals(Path::appToExt(Path::EXT_TO_HIGHLIGHT_JSON_DIR) . '/highlight.py.json', HelperFile::getFileTypeHighlight(FE_HIGHLIGHT_PYTHON,'')); + $this->assertEquals(Path::appToExt(Path::EXT_TO_HIGHLIGHT_JSON_DIR) . '/highlight.m.json', HelperFile::getFileTypeHighlight(FE_HIGHLIGHT_MATLAB,'')); + + $this->assertEquals(Path::appToExt(Path::EXT_TO_HIGHLIGHT_JSON_DIR) . '/javascript.json', HelperFile::getFileTypeHighlight(FE_HIGHLIGHT_JAVASCRIPT,'fileadmin/test.js')); + $this->assertEquals(Path::appToExt(Path::EXT_TO_HIGHLIGHT_JSON_DIR) . '/highlight.qfq.json', HelperFile::getFileTypeHighlight(FE_HIGHLIGHT_QFQ, 'fileadmin/test.js')); + $this->assertEquals(Path::appToExt(Path::EXT_TO_HIGHLIGHT_JSON_DIR) . '/highlight.py.json', HelperFile::getFileTypeHighlight(FE_HIGHLIGHT_PYTHON, 'fileadmin/test.js')); + $this->assertEquals(Path::appToExt(Path::EXT_TO_HIGHLIGHT_JSON_DIR) . '/highlight.m.json', HelperFile::getFileTypeHighlight(FE_HIGHLIGHT_MATLAB, 'fileadmin/test.js')); + + $this->assertEquals(Path::appToExt(Path::EXT_TO_HIGHLIGHT_JSON_DIR) . '/javascript.json', HelperFile::getFileTypeHighlight(FE_HIGHLIGHT_AUTO, 'fileadmin/test.js')); + $this->assertEquals(Path::appToExt(Path::EXT_TO_HIGHLIGHT_JSON_DIR) . '/highlight.php.json', HelperFile::getFileTypeHighlight(FE_HIGHLIGHT_AUTO, 'fileadmin/test.php')); + $this->assertEquals(Path::appToExt(Path::EXT_TO_HIGHLIGHT_JSON_DIR) . '/highlight.qfq.json', HelperFile::getFileTypeHighlight(FE_HIGHLIGHT_AUTO, 'fileadmin/test.qfq')); + $this->assertEquals(Path::appToExt(Path::EXT_TO_HIGHLIGHT_JSON_DIR) . '/highlight.py.json', HelperFile::getFileTypeHighlight(FE_HIGHLIGHT_AUTO, 'fileadmin/test.py')); + $this->assertEquals(Path::appToExt(Path::EXT_TO_HIGHLIGHT_JSON_DIR) . '/highlight.m.json', HelperFile::getFileTypeHighlight(FE_HIGHLIGHT_AUTO, 'fileadmin/test.m')); } public function testJoinPathFilename() { -- GitLab From 5f4b209e3e901ba4353df2be38de58f6095e874e Mon Sep 17 00:00:00 2001 From: Marc Egger <marc.egger@uzh.ch> Date: Thu, 1 Oct 2020 14:46:23 +0200 Subject: [PATCH 106/195] Sanitize.php: allow consecutive underscore in filename --- extension/Classes/Core/Helper/Sanitize.php | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/extension/Classes/Core/Helper/Sanitize.php b/extension/Classes/Core/Helper/Sanitize.php index 5c75858c0..911fa9a29 100644 --- a/extension/Classes/Core/Helper/Sanitize.php +++ b/extension/Classes/Core/Helper/Sanitize.php @@ -222,12 +222,7 @@ class Sanitize { $filename = basename($filename); } - $res = preg_replace($search, $replace, $filename); - - // remove multiple consecutive '_' - $res = preg_replace('~_+~', '_', $res); - - return $res; + return preg_replace($search, $replace, $filename); } // safeFilename() /** -- GitLab From b6ffdc84bdb956fc5ed76d240809f7774bd99250 Mon Sep 17 00:00:00 2001 From: Marc Egger <marc.egger@uzh.ch> Date: Thu, 1 Oct 2020 16:20:42 +0200 Subject: [PATCH 107/195] remove new error catch syntax with '|' since gitlab runner PHP does not support --- extension/Classes/Core/Exception/AbstractException.php | 4 +++- extension/Classes/Core/Report/ColumnScript.php | 10 ++++++++-- extension/NoT3Page/index.php | 4 +++- 3 files changed, 14 insertions(+), 4 deletions(-) diff --git a/extension/Classes/Core/Exception/AbstractException.php b/extension/Classes/Core/Exception/AbstractException.php index f43e0edfe..1b8827a1a 100644 --- a/extension/Classes/Core/Exception/AbstractException.php +++ b/extension/Classes/Core/Exception/AbstractException.php @@ -175,7 +175,9 @@ class AbstractException extends \Exception { $arrMerged[ERROR_MESSAGE_TO_DEVELOPER] = QuickFormQuery::buildInlineReport(\UserReportException::$report_uid, \UserReportException::$report_pathFileName, \UserReportException::$report_bodytext, \UserReportException::$report_header) . $arrMerged[ERROR_MESSAGE_TO_DEVELOPER]; - } catch (\Error | \Exception $e) { + } catch (\Error $e) { + $arrMerged[ERROR_MESSAGE_TO_DEVELOPER] .= "<br>(inline report editor not available)"; + } catch (\Exception $e) { $arrMerged[ERROR_MESSAGE_TO_DEVELOPER] .= "<br>(inline report editor not available)"; } diff --git a/extension/Classes/Core/Report/ColumnScript.php b/extension/Classes/Core/Report/ColumnScript.php index 9305f9c1f..85b1deaaf 100644 --- a/extension/Classes/Core/Report/ColumnScript.php +++ b/extension/Classes/Core/Report/ColumnScript.php @@ -64,7 +64,9 @@ class ColumnScript { // this will be caught bellow throw new \Exception('Include failed.'); } - } catch (\Exception | \Error $e) { + } catch (\Exception $e) { + Thrower::userReportException('Error during reading script file.', "Error message:\n" . $e->getMessage()); + } catch (\Error $e) { Thrower::userReportException('Error during reading script file.', "Error message:\n" . $e->getMessage()); } @@ -76,7 +78,11 @@ class ColumnScript { try { $return = call_user_func_array($param[TOKEN_FUNCTION_CALL], [$param, new ScriptFunctions()]); $output = ob_get_clean(); - } catch (\Exception | \Error $e) { + } catch (\Exception $e) { + ob_end_clean(); + Thrower::userReportException('Function execution failed.', + "Error message:\n" . $e->getMessage() . "\n\nFunction: " . $param[TOKEN_FUNCTION_CALL] . "\n\nParameters:\n" . print_r($param,true)); + } catch (\Error $e) { ob_end_clean(); Thrower::userReportException('Function execution failed.', "Error message:\n" . $e->getMessage() . "\n\nFunction: " . $param[TOKEN_FUNCTION_CALL] . "\n\nParameters:\n" . print_r($param,true)); diff --git a/extension/NoT3Page/index.php b/extension/NoT3Page/index.php index 7e6f2e105..7eb473fde 100644 --- a/extension/NoT3Page/index.php +++ b/extension/NoT3Page/index.php @@ -414,7 +414,9 @@ try { } catch (\DownloadException $e) { $html = $e->formatMessage(); -} catch (\Error | \Exception $e) { +} catch (\Error $e) { + $html = "Generic Exception: " . $e->getMessage() . (IS_DEBUG ? ("<br>" . nl2br($e->getTraceAsString())) : ''); +} catch (\Exception $e) { $html = "Generic Exception: " . $e->getMessage() . (IS_DEBUG ? ("<br>" . nl2br($e->getTraceAsString())) : ''); } -- GitLab From ec46cdf0a91a054924989177848dd51fde9c2dc2 Mon Sep 17 00:00:00 2001 From: Marc Egger <marc.egger@uzh.ch> Date: Thu, 1 Oct 2020 17:36:58 +0200 Subject: [PATCH 108/195] Revert "remove new error catch syntax with '|' since gitlab runner PHP does not support" This reverts commit b6ffdc84. We should increase the PHP version instead. --- extension/Classes/Core/Exception/AbstractException.php | 4 +--- extension/Classes/Core/Report/ColumnScript.php | 10 ++-------- extension/NoT3Page/index.php | 4 +--- 3 files changed, 4 insertions(+), 14 deletions(-) diff --git a/extension/Classes/Core/Exception/AbstractException.php b/extension/Classes/Core/Exception/AbstractException.php index 1b8827a1a..f43e0edfe 100644 --- a/extension/Classes/Core/Exception/AbstractException.php +++ b/extension/Classes/Core/Exception/AbstractException.php @@ -175,9 +175,7 @@ class AbstractException extends \Exception { $arrMerged[ERROR_MESSAGE_TO_DEVELOPER] = QuickFormQuery::buildInlineReport(\UserReportException::$report_uid, \UserReportException::$report_pathFileName, \UserReportException::$report_bodytext, \UserReportException::$report_header) . $arrMerged[ERROR_MESSAGE_TO_DEVELOPER]; - } catch (\Error $e) { - $arrMerged[ERROR_MESSAGE_TO_DEVELOPER] .= "<br>(inline report editor not available)"; - } catch (\Exception $e) { + } catch (\Error | \Exception $e) { $arrMerged[ERROR_MESSAGE_TO_DEVELOPER] .= "<br>(inline report editor not available)"; } diff --git a/extension/Classes/Core/Report/ColumnScript.php b/extension/Classes/Core/Report/ColumnScript.php index 85b1deaaf..9305f9c1f 100644 --- a/extension/Classes/Core/Report/ColumnScript.php +++ b/extension/Classes/Core/Report/ColumnScript.php @@ -64,9 +64,7 @@ class ColumnScript { // this will be caught bellow throw new \Exception('Include failed.'); } - } catch (\Exception $e) { - Thrower::userReportException('Error during reading script file.', "Error message:\n" . $e->getMessage()); - } catch (\Error $e) { + } catch (\Exception | \Error $e) { Thrower::userReportException('Error during reading script file.', "Error message:\n" . $e->getMessage()); } @@ -78,11 +76,7 @@ class ColumnScript { try { $return = call_user_func_array($param[TOKEN_FUNCTION_CALL], [$param, new ScriptFunctions()]); $output = ob_get_clean(); - } catch (\Exception $e) { - ob_end_clean(); - Thrower::userReportException('Function execution failed.', - "Error message:\n" . $e->getMessage() . "\n\nFunction: " . $param[TOKEN_FUNCTION_CALL] . "\n\nParameters:\n" . print_r($param,true)); - } catch (\Error $e) { + } catch (\Exception | \Error $e) { ob_end_clean(); Thrower::userReportException('Function execution failed.', "Error message:\n" . $e->getMessage() . "\n\nFunction: " . $param[TOKEN_FUNCTION_CALL] . "\n\nParameters:\n" . print_r($param,true)); diff --git a/extension/NoT3Page/index.php b/extension/NoT3Page/index.php index 7eb473fde..7e6f2e105 100644 --- a/extension/NoT3Page/index.php +++ b/extension/NoT3Page/index.php @@ -414,9 +414,7 @@ try { } catch (\DownloadException $e) { $html = $e->formatMessage(); -} catch (\Error $e) { - $html = "Generic Exception: " . $e->getMessage() . (IS_DEBUG ? ("<br>" . nl2br($e->getTraceAsString())) : ''); -} catch (\Exception $e) { +} catch (\Error | \Exception $e) { $html = "Generic Exception: " . $e->getMessage() . (IS_DEBUG ? ("<br>" . nl2br($e->getTraceAsString())) : ''); } -- GitLab From 5e120a79bbf118220c71538c0aed74cc678777c2 Mon Sep 17 00:00:00 2001 From: Marc Egger <marc.egger@uzh.ch> Date: Fri, 2 Oct 2020 11:04:15 +0200 Subject: [PATCH 109/195] Fixes #11245 : if forwardMode column is set to '', set forwardMode to 'auto' --- extension/Classes/Core/QuickFormQuery.php | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/extension/Classes/Core/QuickFormQuery.php b/extension/Classes/Core/QuickFormQuery.php index d09d00fa8..885889370 100644 --- a/extension/Classes/Core/QuickFormQuery.php +++ b/extension/Classes/Core/QuickFormQuery.php @@ -1160,6 +1160,11 @@ class QuickFormQuery { // unset($formSpec[FE_FILL_STORE_VAR]); } + if ($formSpec[F_FORWARD_MODE] === '') { + // This should not happen since '' is not a valid choice for column forwardMode. But it happened anyway. So to be safe. + $formSpec[F_FORWARD_MODE] = F_FORWARD_MODE_AUTO; + } + $this->formSpec = $formSpec; // Clear -- GitLab From 52fbe3397c952156e4d3183a0035aa7fd746dba4 Mon Sep 17 00:00:00 2001 From: Marc Egger <marc.egger@uzh.ch> Date: Tue, 6 Oct 2020 13:10:21 +0200 Subject: [PATCH 110/195] Form As File: add backup whenever a sync happens --- extension/Classes/Core/Form/FormAsFile.php | 217 +++++++++++++----- extension/Classes/Core/Helper/HelperFile.php | 3 + extension/Classes/Core/Helper/Path.php | 7 +- .../Classes/Core/Report/ReportAsFile.php | 10 +- 4 files changed, 174 insertions(+), 63 deletions(-) diff --git a/extension/Classes/Core/Form/FormAsFile.php b/extension/Classes/Core/Form/FormAsFile.php index d8aba61ab..f3015a02b 100644 --- a/extension/Classes/Core/Form/FormAsFile.php +++ b/extension/Classes/Core/Form/FormAsFile.php @@ -4,6 +4,7 @@ declare(strict_types=1); namespace IMATHUZH\Qfq\Core\Form; use IMATHUZH\Qfq\Core\Database\Database; +use IMATHUZH\Qfq\Core\Exception\Thrower; use IMATHUZH\Qfq\Core\Helper\HelperFile; use IMATHUZH\Qfq\Core\Helper\OnString; use IMATHUZH\Qfq\Core\Helper\Path; @@ -16,10 +17,10 @@ class FormAsFile * Remove the form from the DB and insert it using the form file. (only if the form file was changed) * If the form file can't be read, then the form is deleted from the DB and an exception is thrown. * - * Form file location: SYSTEM_FORM_FILE_PATH - * Recognize form file change: Compare the current file stats with the ones saved in the Form table. - * Container References: The form file uses names instead if ids to reference container formElements. These references are translated when the formElements are inserted. - * Ignored keys: The keys 'id', 'formId', 'feIdContainer' are ignored when reading the form file. + * - Form file location: SYSTEM_FORM_FILE_PATH + * - Recognize form file change: Compare the current file stats with the ones saved in the Form table. + * - Container References: The form file uses names instead if ids to reference container formElements. These references are translated when the formElements are inserted. + * - Ignored keys: The keys 'id', 'formId', 'feIdContainer' are ignored when reading the form file. * * @param string $formName * @param Database $database @@ -108,67 +109,31 @@ class FormAsFile } /** - * Reads the form from the DB and saves it in the form folder as a form file. - * Warning: Overwrites form file without any checks or warning. + * Reads the form from the database and saves it in the form folder as a form file. + * If $formId is given, then $formName is ignored. * If the form file path does not exist, it is created and all forms are exported. * - * FileStats: After the export the column "fileStats" is updated with new stats from new file. - * Container FormElements: The form file uses names instead if ids to reference containers. These references are translated before saving the file. - * Ignored columns: The columns 'id', 'name' (only Form table), 'fileStats', 'formId', 'feIdContainer' are not saved in the file. - * FormElement order: The formElements are ordered by the 'ord' column before writing them to the file. + * ! Warning: Overwrites form file without any checks or warning. + * + * - FileStats: After the export the column "fileStats" is updated with new stats from new file. + * - Container FormElements: The form file uses names instead if ids to reference containers. These references are translated before saving the file. + * - Ignored columns: The columns 'id', 'name' (only Form table), 'fileStats', 'formId', 'feIdContainer' are not saved in the file. + * - FormElement order: The formElements are ordered by the 'ord' column before writing them to the file. * * @param string $formName * @param Database $database + * @param int|null $formId if given, then $formName is ignored * @throws \CodeException * @throws \DbException * @throws \UserFormException */ - public static function exportForm(string $formName, Database $database) // : void + public static function exportForm(string $formName, Database $database, ?int $formId = null) // : void { - // Get form from DB - list($sql, $parameterArray) = SqlQuery::selectFormByName($formName); - $form = $database->sql($sql, ROW_EXPECT_1, - $parameterArray, 'Form "' . $formName . '" not found or multiple forms with the same name.'); // array(column name => value) - - // Remove columns: id, name, fileStats - $formId = $form[F_ID]; - unset($form[F_ID]); - unset($form[F_NAME]); - unset($form[F_FILE_STATS]); - - // Get formElements from DB - list($sql, $parameterArray) = SqlQuery::selectFormElementById($formId); - $formElements = $database->sql($sql, ROW_REGULAR, $parameterArray); // array(array(column name => value)) - - // Translate container references (id to name) and remove all id columns - $containerNames = array_reduce($formElements, function ($result, $formElement) { - if ($formElement[FE_CLASS] === FE_CLASS_CONTAINER) { - $containerName = $formElement[FE_NAME]; - if (in_array($containerName, $result) || $containerName === '') { - throw new \UserFormException(json_encode([ - ERROR_MESSAGE_TO_USER => 'Duplicate container names.', - ERROR_MESSAGE_TO_DEVELOPER => "Container Form Elements must have a unique and nonempty name. Container name: '$containerName'."]), - ERROR_FORM_INVALID_NAME); - } - $result[$formElement[FE_ID]] = $containerName; - } - return $result; - }, []); // array(id => name) - $formElements = array_map(function ($formElement) use ($containerNames) { - $containerId = $formElement[FE_ID_CONTAINER]; - if ($containerId !== 0) { - $formElement[FE_FILE_CONTAINER_NAME] = $containerNames[$containerId]; - } - unset($formElement[FE_ID_CONTAINER]); - unset($formElement[FE_ID]); - unset($formElement[FE_FORM_ID]); - return $formElement; - }, $formElements); + list($formName, $formId, $formJson) = self::formToJson($formName, $database, $formId); - // write form as JSON to file - $form[F_FILE_FORM_ELEMENT] = $formElements; - $formJson = json_encode($form, JSON_PRETTY_PRINT); + // backup and write file $pathFileName = self::formPathFileName($formName, $database); + self::backupFormFile($pathFileName); HelperFile::file_put_contents($pathFileName, $formJson); // Update column fileStats @@ -177,6 +142,30 @@ class FormAsFile $database->sql($sql, ROW_REGULAR, $parameterArray); } + /** + * Create copy of given form file in form/backup. If given file does not exist, do nothing. + * New file name: <formName>.YYYMMDDhhmmss.file.json + * + * @param string $pathFileName + * @throws \UserFormException + */ + private static function backupFormFile(string $pathFileName) + { + if (file_exists($pathFileName)) + { + if (!is_readable($pathFileName)) { + Thrower::userFormException('Error while trying to backup form file.', "Form file is not readable: $pathFileName"); + } + + // copy file + $cwdToBackupFile = self::newBackupPathFileName(basename($pathFileName, '.json'), 'file'); + $success = copy($pathFileName, $cwdToBackupFile); + if ($success === false) { + Thrower::userFormException('Error while trying to backup form file.', "Can't copy file $pathFileName to $cwdToBackupFile"); + } + } + } + /** * Import Form from file if loaded record is Form/FormElement. * If form file was changed, import it and throw exception. @@ -219,6 +208,7 @@ class FormAsFile self::enforceFormFileWritable($formName, $database); $pathFileName = self::formPathFileName($formName, $database); if(file_exists($pathFileName)) { + self::backupFormFile($pathFileName); $success = unlink($pathFileName); if ($success === false) { throw new \UserFormException(json_encode([ @@ -310,7 +300,7 @@ class FormAsFile */ public static function isFormQuery(string $sql): bool { - // find substrings whihch start with FROM and are followed by Form or FormElement + // find substrings which start with FROM and are followed by Form or FormElement preg_match_all('/(?i)FROM(?-i)(.*?)\b(' . TABLE_NAME_FORM . '|' . TABLE_NAME_FORM_ELEMENT . ')\b/s', $sql, $matches); // Check if no other SQL keywords are in between FROM and the table name @@ -441,12 +431,32 @@ class FormAsFile */ private static function deleteFormDBWithId(int $formId, Database $database) // : void { + self::backupFormDb($formId, $database); $F_ID = F_ID; // can't use constants in strings directly $TABLE_NAME_FORM = TABLE_NAME_FORM; // can't use constants in strings directly $database->sql("DELETE FROM `$TABLE_NAME_FORM` WHERE `$F_ID`=? LIMIT 1", ROW_REGULAR, [$formId]); self::deleteFormElementsDBWithFormId($formId, $database); } + /** + * Export the given form from database into a backup file. + * Backup file name: <formName>.YYYMMDDhhmmss.db.json + * + * @param int $formId + * @param Database $database + * @throws \CodeException + * @throws \DbException + * @throws \UserFormException + */ + private static function backupFormDb(int $formId, Database $database) + { + list($formName, $formId, $formJson) = self::formToJson('', $database, $formId); + $cwdToBackupFile = self::newBackupPathFileName($formName, 'db'); + HelperFile::file_put_contents($cwdToBackupFile, $formJson); + } + + + /** * Delete form elements with given formId from DB * @@ -472,6 +482,7 @@ class FormAsFile */ private static function formFileStatsJson(string $pathFileName) { + clearstatcache (true, $pathFileName); $stats = stat($pathFileName); if ($stats === false) { return false; @@ -579,4 +590,102 @@ class FormAsFile return $result; }, []); } + + /** + * Return json string of the given form with form-elements. If $formId is given, $formName is ignored. + * + * - Container FormElements: The form file uses names instead if ids to reference containers. These references are translated before saving the file. + * - Ignored columns: The columns 'id', 'name' (only Form table), 'fileStats', 'formId', 'feIdContainer' are not added to the json output. + * - FormElement order: The formElements are ordered by the 'ord' column before writing them to the file. + * + * @param string $formName + * @param Database $database + * @param int|null $formId If given, $formName is ignored + * @return array + * @throws \CodeException + * @throws \DbException + * @throws \UserFormException + */ + private static function formToJson(string $formName, Database $database, ?int $formId = null): array + { + // Get form from DB + if ($formId !== null) { + list($sql, $parameterArray) = SqlQuery::selectFormById($formId); + $form = $database->sql($sql, ROW_EXPECT_1, + $parameterArray, "Form with id $formId not found."); // array(column name => value) + $formName = $form[F_NAME]; + } else { + list($sql, $parameterArray) = SqlQuery::selectFormByName($formName); + $form = $database->sql($sql, ROW_EXPECT_1, + $parameterArray, "Form $formName not found or multiple forms with the same name."); // array(column name => value) + } + + // Remove columns: id, name, fileStats + $formId = $form[F_ID]; + unset($form[F_ID]); + unset($form[F_NAME]); + unset($form[F_FILE_STATS]); + + // Get formElements from DB + list($sql, $parameterArray) = SqlQuery::selectFormElementById($formId); + $formElements = $database->sql($sql, ROW_REGULAR, $parameterArray); // array(array(column name => value)) + + // Translate container references (id to name) and remove all id columns + $containerNames = array_reduce($formElements, function ($result, $formElement) { + if ($formElement[FE_CLASS] === FE_CLASS_CONTAINER) { + $containerName = $formElement[FE_NAME]; + if (in_array($containerName, $result) || $containerName === '') { + throw new \UserFormException(json_encode([ + ERROR_MESSAGE_TO_USER => 'Duplicate container names.', + ERROR_MESSAGE_TO_DEVELOPER => "Container Form Elements must have a unique and nonempty name. Container name: '$containerName'."]), + ERROR_FORM_INVALID_NAME); + } + $result[$formElement[FE_ID]] = $containerName; + } + return $result; + }, []); // array(id => name) + $formElements = array_map(function ($formElement) use ($containerNames) { + $containerId = $formElement[FE_ID_CONTAINER]; + if ($containerId !== 0) { + $formElement[FE_FILE_CONTAINER_NAME] = $containerNames[$containerId]; + } + unset($formElement[FE_ID_CONTAINER]); + unset($formElement[FE_ID]); + unset($formElement[FE_FORM_ID]); + return $formElement; + }, $formElements); + + // add form elements and create json + $form[F_FILE_FORM_ELEMENT] = $formElements; + $formJson = json_encode($form, JSON_PRETTY_PRINT); + return array($formName, $formId, $formJson); + } + + /** + * Return the path to a (non-existing) form backup file with name: + * <formName>.YYYMMDDhhmmss.<tag>.json + * + * @param string $formName + * @param string $tag + * @return string + * @throws \UserFormException + */ + private static function newBackupPathFileName(string $formName, string $tag): string + { + // create backup path if not exists + $cwdToBackup = Path::cwdToProject(Path::PROJECT_TO_FORM, Path::FORM_TO_FORM_BACKUP); + if (!is_dir($cwdToBackup)) { + $success = mkdir($cwdToBackup, 0777, true); + if ($success === false) { + Thrower::userFormException('Error while trying to backup form file.', "Can't create backup path: $cwdToBackup"); + } + } + + // throw exception if backup file exists + $cwdToBackupFile = Path::join($cwdToBackup, $formName . '.' . date('YmdHis') . ".$tag.json"); + if (file_exists($cwdToBackupFile)) { + Thrower::userFormException('Error while trying to backup form file.', "Backup file already exists: $cwdToBackupFile"); + } + return $cwdToBackupFile; + } } \ No newline at end of file diff --git a/extension/Classes/Core/Helper/HelperFile.php b/extension/Classes/Core/Helper/HelperFile.php index 8622218ae..a64919e94 100644 --- a/extension/Classes/Core/Helper/HelperFile.php +++ b/extension/Classes/Core/Helper/HelperFile.php @@ -550,6 +550,7 @@ class HelperFile { /** * Wrapper for file_put_contents which throws exception on failure. + * Clear the stat cache to make sure that stat(), file_exists(),... etc. return current data. * * @param $pathFileName * @param $content @@ -564,6 +565,7 @@ class HelperFile { ERROR_MESSAGE_TO_DEVELOPER => "Can't write to file '$pathFileName'"]), ERROR_IO_WRITE_FILE); } + clearstatcache (true, $pathFileName); } /** @@ -636,6 +638,7 @@ class HelperFile { /** * Wrapper for is_readable() but throws exception if file/directory exists but is not readable. + * Returns false if file does not exist. * * @param $pathFileName * @return bool diff --git a/extension/Classes/Core/Helper/Path.php b/extension/Classes/Core/Helper/Path.php index 19fa8cab3..979923030 100644 --- a/extension/Classes/Core/Helper/Path.php +++ b/extension/Classes/Core/Helper/Path.php @@ -33,14 +33,14 @@ class Path // API const EXT_TO_API = 'Classes/Api'; - const API_TO_APP = '../../../../../'; // TODO: not relative to ext + const API_TO_APP = '../../../../../'; // TODO: make relatvie to ext instead // Icons const EXT_TO_GFX_INFO_FILE = 'Resources/Public/icons/note.gif'; const EXT_TO_PATH_ICONS = 'Resources/Public/icons'; // Annotate - const EXT_TO_HIGHLIGHT_JSON_DIR = 'Resources/Public/Json'; + const EXT_TO_HIGHLIGHT_JSON_DIR = 'Resources/Public/Json'; // TODO: refactor: remove DIR at the end // Twig const EXT_TO_TWIG_TEMPLATES = 'Resources/Public/twig_templates'; @@ -50,13 +50,14 @@ class Path private const APP_TO_PROJECT_DEFAULT = '../'; private const APP_TO_PROJECT_MIGRATE = 'fileadmin/protected/qfqProject'; const PROJECT_TO_FORM = 'form'; + const FORM_TO_FORM_BACKUP = '_backup'; const PROJECT_DIR_TO_REPORT = 'report'; // Config const APP_TO_TYPO3_CONF = 'typo3conf'; // Log files - private static $cwdToLog = null; // TODO: does it make sense to have it rel to CWD? to broad? + private static $cwdToLog = null; private static $overloadAbsoluteQfqLogFile = null; private static $overloadAbsoluteMailLogFile = null; private static $overloadAbsoluteSqlLogFile = null; diff --git a/extension/Classes/Core/Report/ReportAsFile.php b/extension/Classes/Core/Report/ReportAsFile.php index d274db6f4..130121d0f 100644 --- a/extension/Classes/Core/Report/ReportAsFile.php +++ b/extension/Classes/Core/Report/ReportAsFile.php @@ -16,9 +16,7 @@ class ReportAsFile * * @param string $bodyText * @return string|null pathFileName of report relative to CWD or null - * @throws \CodeException * @throws \UserFormException - * @throws \UserReportException */ public static function parseFileKeyword(string $bodyText) // : ?string { @@ -52,7 +50,7 @@ class ReportAsFile * Create new file named after the tt_content header or the UID if not defined. * - Invalid characters are stripped from filename. * - If file exists, throw exception. - * - The path of the file is derived the typo3 page structure (use page alias if exists, else page name). + * - The path of the file is derived from the typo3 page structure (use page alias if exists, else page name). * - The path is created if not exists. * * @param int $uid @@ -84,7 +82,7 @@ class ReportAsFile if (strlen($reportPath) > 4096) { // Throw exception in case of infinite loop. throw new \UserReportException(json_encode([ - ERROR_MESSAGE_TO_USER => "Path too long.", + ERROR_MESSAGE_TO_USER => "Exporting report to file failed.", ERROR_MESSAGE_TO_DEVELOPER => "Report path too long: '$reportPath'"]), ERROR_FORM_NOT_FOUND); } @@ -104,8 +102,8 @@ class ReportAsFile // if file exists, throw exception if (file_exists($reportPathFileNameFull)) { throw new \UserReportException(json_encode([ - ERROR_MESSAGE_TO_USER => "Writing file failed.", - ERROR_MESSAGE_TO_DEVELOPER => "Can't export report to file. File already exists: '$reportPathFileNameFull'"]), + ERROR_MESSAGE_TO_USER => "Exporting report to file failed.", + ERROR_MESSAGE_TO_DEVELOPER => "File already exists: '$reportPathFileNameFull'"]), ERROR_FORM_NOT_FOUND); } -- GitLab From 0251e34f07f9a6f2e5545f00754c5db700997643 Mon Sep 17 00:00:00 2001 From: Marc Egger <marc.egger@uzh.ch> Date: Tue, 6 Oct 2020 13:39:23 +0200 Subject: [PATCH 111/195] Report As File: add auto backup whenever a sync happens --- extension/Classes/Core/Form/FormAsFile.php | 18 +++--- extension/Classes/Core/Helper/Path.php | 1 + .../Classes/Core/Report/ReportAsFile.php | 59 ++++++++++++++++++- 3 files changed, 66 insertions(+), 12 deletions(-) diff --git a/extension/Classes/Core/Form/FormAsFile.php b/extension/Classes/Core/Form/FormAsFile.php index f3015a02b..958af1bf1 100644 --- a/extension/Classes/Core/Form/FormAsFile.php +++ b/extension/Classes/Core/Form/FormAsFile.php @@ -143,25 +143,25 @@ class FormAsFile } /** - * Create copy of given form file in form/backup. If given file does not exist, do nothing. + * Create copy of given form file in form/_backup. If given file does not exist, do nothing. * New file name: <formName>.YYYMMDDhhmmss.file.json * - * @param string $pathFileName + * @param string $cwdToFormFile * @throws \UserFormException */ - private static function backupFormFile(string $pathFileName) + private static function backupFormFile(string $cwdToFormFile) { - if (file_exists($pathFileName)) + if (file_exists($cwdToFormFile)) { - if (!is_readable($pathFileName)) { - Thrower::userFormException('Error while trying to backup form file.', "Form file is not readable: $pathFileName"); + if (!is_readable($cwdToFormFile)) { + Thrower::userFormException('Error while trying to backup form file.', "Form file is not readable: $cwdToFormFile"); } // copy file - $cwdToBackupFile = self::newBackupPathFileName(basename($pathFileName, '.json'), 'file'); - $success = copy($pathFileName, $cwdToBackupFile); + $cwdToBackupFile = self::newBackupPathFileName(basename($cwdToFormFile, '.json'), 'file'); + $success = copy($cwdToFormFile, $cwdToBackupFile); if ($success === false) { - Thrower::userFormException('Error while trying to backup form file.', "Can't copy file $pathFileName to $cwdToBackupFile"); + Thrower::userFormException('Error while trying to backup form file.', "Can't copy file $cwdToFormFile to $cwdToBackupFile"); } } } diff --git a/extension/Classes/Core/Helper/Path.php b/extension/Classes/Core/Helper/Path.php index 979923030..39ef5693b 100644 --- a/extension/Classes/Core/Helper/Path.php +++ b/extension/Classes/Core/Helper/Path.php @@ -52,6 +52,7 @@ class Path const PROJECT_TO_FORM = 'form'; const FORM_TO_FORM_BACKUP = '_backup'; const PROJECT_DIR_TO_REPORT = 'report'; + const REPORT_FILE_TO_BACKUP = '_backup'; // The path from a directory containing a report file to the directory containing backups of that report file // Config const APP_TO_TYPO3_CONF = 'typo3conf'; diff --git a/extension/Classes/Core/Report/ReportAsFile.php b/extension/Classes/Core/Report/ReportAsFile.php index 130121d0f..4b9c44f17 100644 --- a/extension/Classes/Core/Report/ReportAsFile.php +++ b/extension/Classes/Core/Report/ReportAsFile.php @@ -3,6 +3,7 @@ namespace IMATHUZH\Qfq\Core\Report; use IMATHUZH\Qfq\Core\Database\Database; +use IMATHUZH\Qfq\Core\Exception\Thrower; use IMATHUZH\Qfq\Core\Helper\HelperFile; use IMATHUZH\Qfq\Core\Helper\Path; use IMATHUZH\Qfq\Core\Helper\Sanitize; @@ -158,8 +159,8 @@ class ReportAsFile $ttContent = $databaseT3->sql($sql, ROW_EXPECT_1, [$uid], "Typo3 content element not found. Uid: $uid"); - $reportPathFileNameFull = self::parseFileKeyword($ttContent['bodytext']); - if ($reportPathFileNameFull === null) { + $cwdToReportFile = self::parseFileKeyword($ttContent['bodytext']); + if ($cwdToReportFile === null) { throw new \UserReportException(json_encode([ ERROR_MESSAGE_TO_USER => "No report file defined.", ERROR_MESSAGE_TO_DEVELOPER => "The keyword '" . TOKEN_REPORT_FILE . "' is not present in the typo3 content element with id $uid"]), @@ -167,7 +168,59 @@ class ReportAsFile } // Update report file - HelperFile::file_put_contents($reportPathFileNameFull, $newContent); + self::backupReportFile($cwdToReportFile); + HelperFile::file_put_contents($cwdToReportFile, $newContent); + } + + /** + * Create copy of given report file in _backup directory. If given file does not exist, do nothing. + * New file name: <reportFileName>.YYYMMDDhhmmss.json + * + * @param string $cwdToReportFile + * @throws \UserFormException + */ + private static function backupReportFile(string $cwdToReportFile) + { + if (file_exists($cwdToReportFile)) + { + if (!is_readable($cwdToReportFile)) { + Thrower::userFormException('Error while trying to backup report file.', "Report file is not readable: $cwdToReportFile"); + } + + // copy file + $cwdToBackupFile = self::newBackupPathFileName($cwdToReportFile); + $success = copy($cwdToReportFile, $cwdToBackupFile); + if ($success === false) { + Thrower::userFormException('Error while trying to backup report file.', "Can't copy file $cwdToReportFile to $cwdToBackupFile"); + } + } + } + + /** + * Return the path to a (non-existing) report backup file with name: + * <reportFileName>.YYYMMDDhhmmss.<tag>.qfqr + * + * @param string $cwdToReportFile + * @return string + * @throws \UserFormException + */ + private static function newBackupPathFileName(string $cwdToReportFile): string + { + // create backup path if not exists + $cwdToBackup = Path::join(dirname($cwdToReportFile), Path::REPORT_FILE_TO_BACKUP); + if (!is_dir($cwdToBackup)) { + $success = mkdir($cwdToBackup, 0777, true); + if ($success === false) { + Thrower::userFormException('Error while trying to backup report file.', "Can't create backup path: $cwdToBackup"); + } + } + + // throw exception if backup file exists + $cwdToBackupFile = Path::join($cwdToBackup, basename($cwdToReportFile, REPORT_FILE_EXTENSION) . '.' . date('YmdHis') . ".json"); + if (file_exists($cwdToBackupFile)) { + Thrower::userFormException('Error while trying to backup report file.', "Backup file already exists: $cwdToBackupFile"); + } + return $cwdToBackupFile; } /** -- GitLab From 72df1995bd052c8d81544ba86f5a2f7580ec72d3 Mon Sep 17 00:00:00 2001 From: Marc Egger <marc.egger@uzh.ch> Date: Tue, 6 Oct 2020 14:25:08 +0200 Subject: [PATCH 112/195] Fix Unittests: add index to backup file if it already exists --- extension/Classes/Core/Form/FormAsFile.php | 14 +++++++---- .../Classes/Core/Report/ReportAsFile.php | 13 +++++++--- extension/Tests/Readme.md | 24 +++++++++++++++++++ 3 files changed, 44 insertions(+), 7 deletions(-) create mode 100644 extension/Tests/Readme.md diff --git a/extension/Classes/Core/Form/FormAsFile.php b/extension/Classes/Core/Form/FormAsFile.php index 958af1bf1..2e31b9726 100644 --- a/extension/Classes/Core/Form/FormAsFile.php +++ b/extension/Classes/Core/Form/FormAsFile.php @@ -584,7 +584,7 @@ class FormAsFile } return $jsonFileNames = array_reduce($files, function ($result, $file) { $fileInfo = pathinfo($file); - if ($fileInfo['extension'] === 'json') { + if (array_key_exists('extension', $fileInfo) && $fileInfo['extension'] === 'json') { $result[] = $fileInfo['filename']; } return $result; @@ -681,10 +681,16 @@ class FormAsFile } } - // throw exception if backup file exists $cwdToBackupFile = Path::join($cwdToBackup, $formName . '.' . date('YmdHis') . ".$tag.json"); - if (file_exists($cwdToBackupFile)) { - Thrower::userFormException('Error while trying to backup form file.', "Backup file already exists: $cwdToBackupFile"); + + // add index to filename if backup file with current timestamp already exists + $index = 1; + while (file_exists($cwdToBackupFile)) { + $cwdToBackupFile = Path::join($cwdToBackup, $formName . '.' . date('YmdHis') . ".$index.$tag.json"); + $index ++; + if ($index > 100) { + Thrower::userFormException('Error while trying to backup form file.', 'Infinite loop.'); + } } return $cwdToBackupFile; } diff --git a/extension/Classes/Core/Report/ReportAsFile.php b/extension/Classes/Core/Report/ReportAsFile.php index 4b9c44f17..d6d9ab993 100644 --- a/extension/Classes/Core/Report/ReportAsFile.php +++ b/extension/Classes/Core/Report/ReportAsFile.php @@ -215,11 +215,18 @@ class ReportAsFile } } - // throw exception if backup file exists $cwdToBackupFile = Path::join($cwdToBackup, basename($cwdToReportFile, REPORT_FILE_EXTENSION) . '.' . date('YmdHis') . ".json"); - if (file_exists($cwdToBackupFile)) { - Thrower::userFormException('Error while trying to backup report file.', "Backup file already exists: $cwdToBackupFile"); + + // add index to filename if backup file with current timestamp already exists + $index = 1; + while (file_exists($cwdToBackupFile)) { + $cwdToBackupFile = Path::join($cwdToBackup, basename($cwdToReportFile, REPORT_FILE_EXTENSION) . '.' . date('YmdHis') . ".$index.json"); + $index ++; + if ($index > 100) { + Thrower::userFormException('Error while trying to backup report file.', 'Infinite loop.'); + } } + return $cwdToBackupFile; } diff --git a/extension/Tests/Readme.md b/extension/Tests/Readme.md new file mode 100644 index 000000000..3b973c2e0 --- /dev/null +++ b/extension/Tests/Readme.md @@ -0,0 +1,24 @@ + +# QFQ Tests + +## PhpUnit + +### Run unit tests from CLI: + +Make sure dev dependencies are installed: +```shell script +# in extension directory +composer update --dev +``` + +Run all tests: +```shell script +# in extension directory +vendor/bin/phpunit --configuration phpunit.xml +``` + +Run single test: +```shell script +# in extension directory +vendor/bin/phpunit --configuration phpunit.xml --filter <test_name> +``` -- GitLab From 7854bf3419b9096e7e82b3c3b108854f7eeaab31 Mon Sep 17 00:00:00 2001 From: Marc Egger <marc.egger@uzh.ch> Date: Tue, 6 Oct 2020 14:52:08 +0200 Subject: [PATCH 113/195] Revert "Revert "remove new error catch syntax with '|' since gitlab runner PHP does not support"" This reverts commit ec46cdf0 --- extension/Classes/Core/Exception/AbstractException.php | 4 +++- extension/Classes/Core/Report/ColumnScript.php | 10 ++++++++-- extension/NoT3Page/index.php | 4 +++- 3 files changed, 14 insertions(+), 4 deletions(-) diff --git a/extension/Classes/Core/Exception/AbstractException.php b/extension/Classes/Core/Exception/AbstractException.php index f43e0edfe..1b8827a1a 100644 --- a/extension/Classes/Core/Exception/AbstractException.php +++ b/extension/Classes/Core/Exception/AbstractException.php @@ -175,7 +175,9 @@ class AbstractException extends \Exception { $arrMerged[ERROR_MESSAGE_TO_DEVELOPER] = QuickFormQuery::buildInlineReport(\UserReportException::$report_uid, \UserReportException::$report_pathFileName, \UserReportException::$report_bodytext, \UserReportException::$report_header) . $arrMerged[ERROR_MESSAGE_TO_DEVELOPER]; - } catch (\Error | \Exception $e) { + } catch (\Error $e) { + $arrMerged[ERROR_MESSAGE_TO_DEVELOPER] .= "<br>(inline report editor not available)"; + } catch (\Exception $e) { $arrMerged[ERROR_MESSAGE_TO_DEVELOPER] .= "<br>(inline report editor not available)"; } diff --git a/extension/Classes/Core/Report/ColumnScript.php b/extension/Classes/Core/Report/ColumnScript.php index 9305f9c1f..85b1deaaf 100644 --- a/extension/Classes/Core/Report/ColumnScript.php +++ b/extension/Classes/Core/Report/ColumnScript.php @@ -64,7 +64,9 @@ class ColumnScript { // this will be caught bellow throw new \Exception('Include failed.'); } - } catch (\Exception | \Error $e) { + } catch (\Exception $e) { + Thrower::userReportException('Error during reading script file.', "Error message:\n" . $e->getMessage()); + } catch (\Error $e) { Thrower::userReportException('Error during reading script file.', "Error message:\n" . $e->getMessage()); } @@ -76,7 +78,11 @@ class ColumnScript { try { $return = call_user_func_array($param[TOKEN_FUNCTION_CALL], [$param, new ScriptFunctions()]); $output = ob_get_clean(); - } catch (\Exception | \Error $e) { + } catch (\Exception $e) { + ob_end_clean(); + Thrower::userReportException('Function execution failed.', + "Error message:\n" . $e->getMessage() . "\n\nFunction: " . $param[TOKEN_FUNCTION_CALL] . "\n\nParameters:\n" . print_r($param,true)); + } catch (\Error $e) { ob_end_clean(); Thrower::userReportException('Function execution failed.', "Error message:\n" . $e->getMessage() . "\n\nFunction: " . $param[TOKEN_FUNCTION_CALL] . "\n\nParameters:\n" . print_r($param,true)); diff --git a/extension/NoT3Page/index.php b/extension/NoT3Page/index.php index 7e6f2e105..7eb473fde 100644 --- a/extension/NoT3Page/index.php +++ b/extension/NoT3Page/index.php @@ -414,7 +414,9 @@ try { } catch (\DownloadException $e) { $html = $e->formatMessage(); -} catch (\Error | \Exception $e) { +} catch (\Error $e) { + $html = "Generic Exception: " . $e->getMessage() . (IS_DEBUG ? ("<br>" . nl2br($e->getTraceAsString())) : ''); +} catch (\Exception $e) { $html = "Generic Exception: " . $e->getMessage() . (IS_DEBUG ? ("<br>" . nl2br($e->getTraceAsString())) : ''); } -- GitLab From 5b197b9c98536767590f93d6377dd8f681b55244 Mon Sep 17 00:00:00 2001 From: Marc Egger <marc.egger@uzh.ch> Date: Tue, 6 Oct 2020 15:05:17 +0200 Subject: [PATCH 114/195] Revert "Revert "Revert "remove new error catch syntax with '|' since gitlab runner PHP does not support""" This reverts commit 7854bf34 --- extension/Classes/Core/Exception/AbstractException.php | 4 +--- extension/Classes/Core/Report/ColumnScript.php | 10 ++-------- extension/NoT3Page/index.php | 4 +--- 3 files changed, 4 insertions(+), 14 deletions(-) diff --git a/extension/Classes/Core/Exception/AbstractException.php b/extension/Classes/Core/Exception/AbstractException.php index 1b8827a1a..f43e0edfe 100644 --- a/extension/Classes/Core/Exception/AbstractException.php +++ b/extension/Classes/Core/Exception/AbstractException.php @@ -175,9 +175,7 @@ class AbstractException extends \Exception { $arrMerged[ERROR_MESSAGE_TO_DEVELOPER] = QuickFormQuery::buildInlineReport(\UserReportException::$report_uid, \UserReportException::$report_pathFileName, \UserReportException::$report_bodytext, \UserReportException::$report_header) . $arrMerged[ERROR_MESSAGE_TO_DEVELOPER]; - } catch (\Error $e) { - $arrMerged[ERROR_MESSAGE_TO_DEVELOPER] .= "<br>(inline report editor not available)"; - } catch (\Exception $e) { + } catch (\Error | \Exception $e) { $arrMerged[ERROR_MESSAGE_TO_DEVELOPER] .= "<br>(inline report editor not available)"; } diff --git a/extension/Classes/Core/Report/ColumnScript.php b/extension/Classes/Core/Report/ColumnScript.php index 85b1deaaf..9305f9c1f 100644 --- a/extension/Classes/Core/Report/ColumnScript.php +++ b/extension/Classes/Core/Report/ColumnScript.php @@ -64,9 +64,7 @@ class ColumnScript { // this will be caught bellow throw new \Exception('Include failed.'); } - } catch (\Exception $e) { - Thrower::userReportException('Error during reading script file.', "Error message:\n" . $e->getMessage()); - } catch (\Error $e) { + } catch (\Exception | \Error $e) { Thrower::userReportException('Error during reading script file.', "Error message:\n" . $e->getMessage()); } @@ -78,11 +76,7 @@ class ColumnScript { try { $return = call_user_func_array($param[TOKEN_FUNCTION_CALL], [$param, new ScriptFunctions()]); $output = ob_get_clean(); - } catch (\Exception $e) { - ob_end_clean(); - Thrower::userReportException('Function execution failed.', - "Error message:\n" . $e->getMessage() . "\n\nFunction: " . $param[TOKEN_FUNCTION_CALL] . "\n\nParameters:\n" . print_r($param,true)); - } catch (\Error $e) { + } catch (\Exception | \Error $e) { ob_end_clean(); Thrower::userReportException('Function execution failed.', "Error message:\n" . $e->getMessage() . "\n\nFunction: " . $param[TOKEN_FUNCTION_CALL] . "\n\nParameters:\n" . print_r($param,true)); diff --git a/extension/NoT3Page/index.php b/extension/NoT3Page/index.php index 7eb473fde..7e6f2e105 100644 --- a/extension/NoT3Page/index.php +++ b/extension/NoT3Page/index.php @@ -414,9 +414,7 @@ try { } catch (\DownloadException $e) { $html = $e->formatMessage(); -} catch (\Error $e) { - $html = "Generic Exception: " . $e->getMessage() . (IS_DEBUG ? ("<br>" . nl2br($e->getTraceAsString())) : ''); -} catch (\Exception $e) { +} catch (\Error | \Exception $e) { $html = "Generic Exception: " . $e->getMessage() . (IS_DEBUG ? ("<br>" . nl2br($e->getTraceAsString())) : ''); } -- GitLab From 083e099aee53089755f39b42ef7cb31653db558d Mon Sep 17 00:00:00 2001 From: Marc Egger <marc.egger@uzh.ch> Date: Tue, 6 Oct 2020 18:07:25 +0200 Subject: [PATCH 115/195] Fix Unittests: add qfq.json config for unittests --- Makefile | 5 ++++- extension/Tests/phpunit_qfq.json | 6 ++++++ 2 files changed, 10 insertions(+), 1 deletion(-) create mode 100644 extension/Tests/phpunit_qfq.json diff --git a/Makefile b/Makefile index 2a0dedb12..ca2caf95f 100644 --- a/Makefile +++ b/Makefile @@ -110,7 +110,7 @@ phpunit: # update composer with dev to install phpunit package cd extension; composer update - # create test config files and get test database password from environment variable + # create deprecated test config files and get test database password from environment variable cp -v extension/Tests/phpunit_config.qfq.php extension/config.qfq.php; sed -i "s/#PHPUNIT_PASSWORD#/$(PHPUNIT_MYSQL_PASSWORD)/" extension/config.qfq.php cp -v extension/Tests/phpunit_LocalConfiguration.php extension/LocalConfiguration.php @@ -118,6 +118,9 @@ phpunit: mkdir -p typo3conf/ext/qfq mv -v extension/* typo3conf/ext/qfq/ + # create new kind of config (qfq.json) + cp -v typo3conf/ext/qfq/Tests/phpunit_qfq.json typo3conf/ext/qfq.json; sed -i "s/#PHPUNIT_PASSWORD#/$(PHPUNIT_MYSQL_PASSWORD)/" typo3conf/ext/qfq.json + # run phpunit cd typo3conf/ext/qfq/; pwd; vendor/bin/phpunit --configuration phpunit.xml diff --git a/extension/Tests/phpunit_qfq.json b/extension/Tests/phpunit_qfq.json new file mode 100644 index 000000000..3237719c6 --- /dev/null +++ b/extension/Tests/phpunit_qfq.json @@ -0,0 +1,6 @@ +{ + "DB_1_USER": "phpunit", + "DB_1_SERVER": "localhost", + "DB_1_PASSWORD": "#PHPUNIT_PASSWORD#", + "DB_1_NAME": "phpunit_qfq" +} \ No newline at end of file -- GitLab From 91cf36a50b3fb1894f1edcada372abb7e1f1922e Mon Sep 17 00:00:00 2001 From: Marc Egger <marc.egger@uzh.ch> Date: Wed, 7 Oct 2020 12:42:39 +0200 Subject: [PATCH 116/195] disable unittests temporarily --- Makefile | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/Makefile b/Makefile index ca2caf95f..3f7e2eab0 100644 --- a/Makefile +++ b/Makefile @@ -122,7 +122,9 @@ phpunit: cp -v typo3conf/ext/qfq/Tests/phpunit_qfq.json typo3conf/ext/qfq.json; sed -i "s/#PHPUNIT_PASSWORD#/$(PHPUNIT_MYSQL_PASSWORD)/" typo3conf/ext/qfq.json # run phpunit - cd typo3conf/ext/qfq/; pwd; vendor/bin/phpunit --configuration phpunit.xml + + # TEMPORARILY DISABLED ! + # cd typo3conf/ext/qfq/; pwd; vendor/bin/phpunit --configuration phpunit.xml phpunit_snapshot: snapshot phpunit -- GitLab From 721e2e3e6c33eb453cda527e08b9a30a04c67089 Mon Sep 17 00:00:00 2001 From: Marc Egger <marc.egger@uzh.ch> Date: Wed, 7 Oct 2020 12:56:00 +0200 Subject: [PATCH 117/195] make better exception --- extension/Classes/Core/Form/FormAsFile.php | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/extension/Classes/Core/Form/FormAsFile.php b/extension/Classes/Core/Form/FormAsFile.php index 2e31b9726..38e2f9a8c 100644 --- a/extension/Classes/Core/Form/FormAsFile.php +++ b/extension/Classes/Core/Form/FormAsFile.php @@ -622,6 +622,7 @@ class FormAsFile // Remove columns: id, name, fileStats $formId = $form[F_ID]; + $formName = $form[F_NAME]; unset($form[F_ID]); unset($form[F_NAME]); unset($form[F_FILE_STATS]); @@ -631,12 +632,12 @@ class FormAsFile $formElements = $database->sql($sql, ROW_REGULAR, $parameterArray); // array(array(column name => value)) // Translate container references (id to name) and remove all id columns - $containerNames = array_reduce($formElements, function ($result, $formElement) { + $containerNames = array_reduce($formElements, function ($result, $formElement) use ($formName) { if ($formElement[FE_CLASS] === FE_CLASS_CONTAINER) { $containerName = $formElement[FE_NAME]; if (in_array($containerName, $result) || $containerName === '') { throw new \UserFormException(json_encode([ - ERROR_MESSAGE_TO_USER => 'Duplicate container names.', + ERROR_MESSAGE_TO_USER => "Duplicate container names in form $formName", ERROR_MESSAGE_TO_DEVELOPER => "Container Form Elements must have a unique and nonempty name. Container name: '$containerName'."]), ERROR_FORM_INVALID_NAME); } -- GitLab From 6a1a779054ffb190a4b2ad9627651810032f1f01 Mon Sep 17 00:00:00 2001 From: Marc Egger <marc.egger@uzh.ch> Date: Wed, 7 Oct 2020 13:09:52 +0200 Subject: [PATCH 118/195] fix undefined index exception --- extension/Classes/Core/QuickFormQuery.php | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/extension/Classes/Core/QuickFormQuery.php b/extension/Classes/Core/QuickFormQuery.php index 885889370..a6606ce1d 100644 --- a/extension/Classes/Core/QuickFormQuery.php +++ b/extension/Classes/Core/QuickFormQuery.php @@ -148,6 +148,11 @@ class QuickFormQuery { $t3data[T3DATA_UID] = 0; } + if (!isset($t3data[T3DATA_HEADER])) { + // TODO: ?CR: when does this happen? why no exception thrown? + $t3data[T3DATA_HEADER] = ''; + } + // Read report file, if file keyword exists in bodytext $reportPathFileNameFull = ReportAsFile::parseFileKeyword($t3data[T3DATA_BODYTEXT]); if ($reportPathFileNameFull !== null) { -- GitLab From 8b314e4743197037d778fcb5a265543e5f817169 Mon Sep 17 00:00:00 2001 From: Marc Egger <marc.egger@uzh.ch> Date: Wed, 7 Oct 2020 13:31:21 +0200 Subject: [PATCH 119/195] better exception --- extension/Classes/Core/Form/FormAsFile.php | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/extension/Classes/Core/Form/FormAsFile.php b/extension/Classes/Core/Form/FormAsFile.php index 38e2f9a8c..c0a1c8783 100644 --- a/extension/Classes/Core/Form/FormAsFile.php +++ b/extension/Classes/Core/Form/FormAsFile.php @@ -632,14 +632,15 @@ class FormAsFile $formElements = $database->sql($sql, ROW_REGULAR, $parameterArray); // array(array(column name => value)) // Translate container references (id to name) and remove all id columns - $containerNames = array_reduce($formElements, function ($result, $formElement) use ($formName) { + $containerNames = array_reduce($formElements, function ($result, $formElement) use ($formName, $formId) { if ($formElement[FE_CLASS] === FE_CLASS_CONTAINER) { $containerName = $formElement[FE_NAME]; - if (in_array($containerName, $result) || $containerName === '') { - throw new \UserFormException(json_encode([ - ERROR_MESSAGE_TO_USER => "Duplicate container names in form $formName", - ERROR_MESSAGE_TO_DEVELOPER => "Container Form Elements must have a unique and nonempty name. Container name: '$containerName'."]), - ERROR_FORM_INVALID_NAME); + if (in_array($containerName, $result)) { + Thrower::userFormException("Failed exporting Form '$formName' to file." + , "Container Form Elements must have a unique and nonempty name. Container name: '$containerName'. Container id: " . $formElement[FE_ID]); + } + if ($containerName === '') { + Thrower::userFormException("Failed exporting Form '$formName' to file.", "Container form-elements may not have an empty name. Container id: " . $formElement[FE_ID]); } $result[$formElement[FE_ID]] = $containerName; } -- GitLab From 2de07c0e302726f7eeb0611fb867aa5f35aba0b1 Mon Sep 17 00:00:00 2001 From: Marc Egger <marc.egger@uzh.ch> Date: Wed, 7 Oct 2020 18:39:50 +0200 Subject: [PATCH 120/195] Form As File: adjust container names if empty or non-unique --- extension/Classes/Core/Form/FormAsFile.php | 35 +++++++++++++++------- extension/Classes/Sql/formEditor.sql | 9 ++++-- 2 files changed, 31 insertions(+), 13 deletions(-) diff --git a/extension/Classes/Core/Form/FormAsFile.php b/extension/Classes/Core/Form/FormAsFile.php index c0a1c8783..b75d3bc57 100644 --- a/extension/Classes/Core/Form/FormAsFile.php +++ b/extension/Classes/Core/Form/FormAsFile.php @@ -129,17 +129,23 @@ class FormAsFile */ public static function exportForm(string $formName, Database $database, ?int $formId = null) // : void { - list($formName, $formId, $formJson) = self::formToJson($formName, $database, $formId); + list($formName, $formId, $formJson, $adjustContainerName) = self::formToJson($formName, $database, $formId); // backup and write file $pathFileName = self::formPathFileName($formName, $database); self::backupFormFile($pathFileName); HelperFile::file_put_contents($pathFileName, $formJson); - // Update column fileStats - $fileStats = self::formFileStatsJson($pathFileName); - list($sql, $parameterArray) = SqlQuery::updateRecord(TABLE_NAME_FORM, [F_FILE_STATS => $fileStats], $formId); - $database->sql($sql, ROW_REGULAR, $parameterArray); + // some column names where adjusted => import form + if ($adjustContainerName) { + self::importForm($formName, $database); + + // otherwise => Update column fileStats + } else { + $fileStats = self::formFileStatsJson($pathFileName); + list($sql, $parameterArray) = SqlQuery::updateRecord(TABLE_NAME_FORM, [F_FILE_STATS => $fileStats], $formId); + $database->sql($sql, ROW_REGULAR, $parameterArray); + } } /** @@ -595,13 +601,14 @@ class FormAsFile * Return json string of the given form with form-elements. If $formId is given, $formName is ignored. * * - Container FormElements: The form file uses names instead if ids to reference containers. These references are translated before saving the file. + * - Adjust container names: If a container name is empty or not unique it is adjusted. In that case the fourth return parameter is set to true. * - Ignored columns: The columns 'id', 'name' (only Form table), 'fileStats', 'formId', 'feIdContainer' are not added to the json output. * - FormElement order: The formElements are ordered by the 'ord' column before writing them to the file. * * @param string $formName * @param Database $database * @param int|null $formId If given, $formName is ignored - * @return array + * @return array [$formName, $formId, $formJson, $adjustedContainerNames > 0] * @throws \CodeException * @throws \DbException * @throws \UserFormException @@ -632,21 +639,27 @@ class FormAsFile $formElements = $database->sql($sql, ROW_REGULAR, $parameterArray); // array(array(column name => value)) // Translate container references (id to name) and remove all id columns - $containerNames = array_reduce($formElements, function ($result, $formElement) use ($formName, $formId) { + $adjustedContainerNames = 0; + $containerNames = array_reduce($formElements, function ($result, $formElement) use ($formName, $formId, &$adjustedContainerNames) { if ($formElement[FE_CLASS] === FE_CLASS_CONTAINER) { $containerName = $formElement[FE_NAME]; if (in_array($containerName, $result)) { - Thrower::userFormException("Failed exporting Form '$formName' to file." - , "Container Form Elements must have a unique and nonempty name. Container name: '$containerName'. Container id: " . $formElement[FE_ID]); + $containerName = $containerName . '_auto_adjust_not_unique_' . count($result); + $adjustedContainerNames++; } if ($containerName === '') { - Thrower::userFormException("Failed exporting Form '$formName' to file.", "Container form-elements may not have an empty name. Container id: " . $formElement[FE_ID]); + $containerName = 'auto_adjust_empty_' . count($result); + $adjustedContainerNames++; } $result[$formElement[FE_ID]] = $containerName; } return $result; }, []); // array(id => name) $formElements = array_map(function ($formElement) use ($containerNames) { + if (array_key_exists($formElement[FE_ID], $containerNames)) { + // in case container name was auto adjusted above we set new name + $formElement[FE_NAME] = $containerNames[$formElement[FE_ID]]; + } $containerId = $formElement[FE_ID_CONTAINER]; if ($containerId !== 0) { $formElement[FE_FILE_CONTAINER_NAME] = $containerNames[$containerId]; @@ -660,7 +673,7 @@ class FormAsFile // add form elements and create json $form[F_FILE_FORM_ELEMENT] = $formElements; $formJson = json_encode($form, JSON_PRETTY_PRINT); - return array($formName, $formId, $formJson); + return array($formName, $formId, $formJson, $adjustedContainerNames > 0); } /** diff --git a/extension/Classes/Sql/formEditor.sql b/extension/Classes/Sql/formEditor.sql index 923b174e4..c6d99d92d 100644 --- a/extension/Classes/Sql/formEditor.sql +++ b/extension/Classes/Sql/formEditor.sql @@ -477,17 +477,22 @@ VALUES (2, 'feIdContainer', 'Container', 'show', 'select', 'all', 'native', 120, '', 'no', '', '', '', '', '', 'none'); -INSERT INTO `FormElement` (`id`, `formId`, `feIdContainer`, `dynamicUpdate`, `enabled`, `name`, `label`, `mode`, +INSERT INTO `FormElement` (`formId`, `feIdContainer`, `dynamicUpdate`, `enabled`, `name`, `label`, `mode`, `modeSql`, `class`, `type`, `subrecordOption`, `encode`, `checkType`, `checkPattern`, `onChange`, `ord`, `tabindex`, `size`, `maxLength`, `bsLabelColumns`, `bsInputColumns`, `bsNoteColumns`, `rowLabelInputNote`, `note`, `adminNote`, `tooltip`, `placeholder`, `value`, `sql1`, `parameter`, `parameterLanguageA`, `parameterLanguageB`, `parameterLanguageC`, `parameterLanguageD`, `clientJs`, `feGroup`, `deleted`) -VALUES (NULL, '2', '0', 'no', 'yes', 'Check Name Conflict', '', 'show', '', 'action', 'beforeSave', '', 'specialchar', +VALUES (2, '0', 'no', 'yes', 'Check Name Conflict', '', 'show', '', 'action', 'beforeSave', '', 'specialchar', 'auto', '', '', '650', '0', '', '', '', '', '', 'row,label,/label,input,/input,note,/note,/row', '', '', '', '', '', '', 'sqlValidate={{!SELECT fe.id FROM FormElement AS fe WHERE "{{class:F:alnumx}}"=fe.class AND fe.formId={{formId:RF}} AND fe.name!="" AND fe.name="{{name:F:alnumx}}" AND fe.id!={{id:R0}} }}\r\n\r\nexpectRecords=0\r\n\r\nmessageFail=There is already another {{class:F:alnumx}} form element with name "{{name:F:alnumx}}".', + '', '', '', '', '', '', 'no'), + (2, 0, 'no', 'yes', 'Check Name Empty Container', '', 'show', '', 'action', 'beforeSave', '', 'specialchar', + 'auto', '', '', 660, 0, '', '', '', '', '', 'row,label,/label,input,/input,note,/note,/row', '', '', '', + '', '', '', + 'sqlValidate ={{!SELECT \'1\' FROM (SELECT \'\') AS _fake WHERE \"{{class:F:alnumx}}\"=\"container\" AND \"{{name:F:alnumx}}\"=\"\"}}\r\n\r\nexpectRecords=0\r\n\r\nmessageFail=Form elements of class container must have a unique non-empty name.', '', '', '', '', '', '', 'no'); # ---------------------------------------- -- GitLab From bf99aacbee5ad11307dd05dc64660b1b947e9b38 Mon Sep 17 00:00:00 2001 From: Marc Egger <marc.egger@uzh.ch> Date: Fri, 9 Oct 2020 11:00:36 +0200 Subject: [PATCH 121/195] form as file: import form: throw exception if container name is invalid --- extension/Classes/Core/Form/FormAsFile.php | 32 ++++++++++++++++++++-- 1 file changed, 29 insertions(+), 3 deletions(-) diff --git a/extension/Classes/Core/Form/FormAsFile.php b/extension/Classes/Core/Form/FormAsFile.php index b75d3bc57..a2e334f24 100644 --- a/extension/Classes/Core/Form/FormAsFile.php +++ b/extension/Classes/Core/Form/FormAsFile.php @@ -61,6 +61,20 @@ class FormAsFile } $formFromFile = json_decode($fileContents, true); + // make sure container names are unique and non-empty + $containerNames = []; + foreach ($formFromFile[F_FILE_FORM_ELEMENT] as $formElementFromFile) { + if ($formElementFromFile[FE_CLASS] === FE_CLASS_CONTAINER) { + if (in_array($formElementFromFile[FE_NAME], $containerNames)) { + Thrower::userFormException('Failed to import form file.', "Multiple formElements of class container with the same name '" . $formElementFromFile[FE_NAME] . "' in form file '$pathFileName'"); + } + if ($formElementFromFile[FE_NAME] == '') { + Thrower::userFormException('Failed to import form file.', "Found formElement of class container with empty name in form file '$pathFileName'"); + } + $containerNames[] = $formElementFromFile[FE_NAME]; + } + } + // Delete old form with that name from DB if it exists. if (array_key_exists(F_ID, $formFromDb)) { $formId = $formFromDb[F_ID]; @@ -391,7 +405,7 @@ class FormAsFile */ private static function insertFormElement(array $values, int $formId, Database $database): int { - // filter allowed formElement columns + // filter allowed formElement columns (remove id, formId, feIdContainer) $formElementSchema = $database->getTableDefinition(TABLE_NAME_FORM_ELEMENT); $formElementColumns = array_column($formElementSchema, 'Field'); $insertValues = array_filter($values, function ($columnName) use ($formElementColumns) { @@ -638,15 +652,19 @@ class FormAsFile list($sql, $parameterArray) = SqlQuery::selectFormElementById($formId); $formElements = $database->sql($sql, ROW_REGULAR, $parameterArray); // array(array(column name => value)) - // Translate container references (id to name) and remove all id columns + // Create id => name dictionary for column names $adjustedContainerNames = 0; $containerNames = array_reduce($formElements, function ($result, $formElement) use ($formName, $formId, &$adjustedContainerNames) { if ($formElement[FE_CLASS] === FE_CLASS_CONTAINER) { $containerName = $formElement[FE_NAME]; + + // container name not unique => adjust make unique if (in_array($containerName, $result)) { $containerName = $containerName . '_auto_adjust_not_unique_' . count($result); $adjustedContainerNames++; } + + // container name empty => adjust make non-empty unique if ($containerName === '') { $containerName = 'auto_adjust_empty_' . count($result); $adjustedContainerNames++; @@ -655,18 +673,26 @@ class FormAsFile } return $result; }, []); // array(id => name) + + // ajdust formElements for export $formElements = array_map(function ($formElement) use ($containerNames) { + + // in case container name was auto adjusted above we set new name if (array_key_exists($formElement[FE_ID], $containerNames)) { - // in case container name was auto adjusted above we set new name $formElement[FE_NAME] = $containerNames[$formElement[FE_ID]]; } + + // Replace container id references with name references $containerId = $formElement[FE_ID_CONTAINER]; if ($containerId !== 0) { $formElement[FE_FILE_CONTAINER_NAME] = $containerNames[$containerId]; } + + // remove columns id, formId, feIdContainer unset($formElement[FE_ID_CONTAINER]); unset($formElement[FE_ID]); unset($formElement[FE_FORM_ID]); + return $formElement; }, $formElements); -- GitLab From a3ad29d74eae7aacb1f80e1c1b1ae5aaca5bd204 Mon Sep 17 00:00:00 2001 From: Marc Egger <marc.egger@uzh.ch> Date: Fri, 9 Oct 2020 18:06:48 +0200 Subject: [PATCH 122/195] fix form export exception: if container id does not exist, ignore --- extension/Classes/Core/Form/FormAsFile.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/extension/Classes/Core/Form/FormAsFile.php b/extension/Classes/Core/Form/FormAsFile.php index a2e334f24..09ae07e3f 100644 --- a/extension/Classes/Core/Form/FormAsFile.php +++ b/extension/Classes/Core/Form/FormAsFile.php @@ -684,7 +684,7 @@ class FormAsFile // Replace container id references with name references $containerId = $formElement[FE_ID_CONTAINER]; - if ($containerId !== 0) { + if ($containerId !== 0 && array_key_exists($containerId, $containerNames)) { $formElement[FE_FILE_CONTAINER_NAME] = $containerNames[$containerId]; } -- GitLab From 6e25f346e2e260ff8125281c56ace5901bca5255 Mon Sep 17 00:00:00 2001 From: Marc Egger <marc.egger@uzh.ch> Date: Sun, 11 Oct 2020 16:45:03 +0200 Subject: [PATCH 123/195] fix undefined index AbstractException --- extension/Classes/Core/Exception/AbstractException.php | 1 + 1 file changed, 1 insertion(+) diff --git a/extension/Classes/Core/Exception/AbstractException.php b/extension/Classes/Core/Exception/AbstractException.php index f43e0edfe..71827dd69 100644 --- a/extension/Classes/Core/Exception/AbstractException.php +++ b/extension/Classes/Core/Exception/AbstractException.php @@ -171,6 +171,7 @@ class AbstractException extends \Exception { } // Render inline report editor + $arrMerged[ERROR_MESSAGE_TO_DEVELOPER] = $arrMerged[ERROR_MESSAGE_TO_DEVELOPER] ?? ''; try { $arrMerged[ERROR_MESSAGE_TO_DEVELOPER] = QuickFormQuery::buildInlineReport(\UserReportException::$report_uid, \UserReportException::$report_pathFileName, \UserReportException::$report_bodytext, -- GitLab From dc498ecc27d835de3d3485f9f477d4d9b50ca2bd Mon Sep 17 00:00:00 2001 From: Marc Egger <marc.egger@uzh.ch> Date: Sun, 11 Oct 2020 18:50:51 +0200 Subject: [PATCH 124/195] SqlQuery.php: allow insert empty record --- extension/Classes/Core/Helper/SqlQuery.php | 11 ++++++----- extension/Classes/Core/QuickFormQuery.php | 10 +++++----- extension/Classes/Core/Save.php | 2 +- 3 files changed, 12 insertions(+), 11 deletions(-) diff --git a/extension/Classes/Core/Helper/SqlQuery.php b/extension/Classes/Core/Helper/SqlQuery.php index b518b84c3..53e9fafbd 100644 --- a/extension/Classes/Core/Helper/SqlQuery.php +++ b/extension/Classes/Core/Helper/SqlQuery.php @@ -37,9 +37,8 @@ class SqlQuery { } /** - * Create SQL query which inserts the values of the given associative arry into the given table. + * Create SQL query which inserts the values of the given associative array into the given table. * Returns prepared INSERT statement together with a parameter array. - * There must be at least one value given. * * @param $tableName * @param array $values array(column => value) @@ -48,12 +47,14 @@ class SqlQuery { */ public static function insertRecord($tableName, array $values): array { - if (count($values) === 0) - throw new \CodeException('No columns given to insert - this should not happen.', ERROR_CODE_SHOULD_NOT_HAPPEN); + if (count($values) === 0) { + $sql = "INSERT INTO `$tableName` VALUES ()"; + return array($sql, []); + } $paramList = str_repeat('?, ', count($values)); $paramList = substr($paramList, 0, strlen($paramList) - 2); $columnList = '`' . implode('`, `', array_keys($values)) . '`'; - $sql = "INSERT INTO `$tableName` ( " . $columnList . " ) VALUES ( " . $paramList . ' )'; + $sql = "INSERT INTO `$tableName` ( $columnList ) VALUES ( $paramList )"; $parameterArray = array_values($values); return array($sql, $parameterArray); } diff --git a/extension/Classes/Core/QuickFormQuery.php b/extension/Classes/Core/QuickFormQuery.php index a6606ce1d..48174ef54 100644 --- a/extension/Classes/Core/QuickFormQuery.php +++ b/extension/Classes/Core/QuickFormQuery.php @@ -456,8 +456,8 @@ class QuickFormQuery { // FormAsFile: Get the new and the old form file name and make sure both files are writable (before DB changes are made) // Note: This can't be done earlier because $formModeNew might be changed in the lines above. - $formNameDB = FormAsFile::formNameFromFormRelatedRecord($recordId, $this->formSpec[F_TABLE_NAME], $this->dbArray[$this->dbIndexQfq]); - switch ($this->formSpec[F_TABLE_NAME]) { + $formNameDB = FormAsFile::formNameFromFormRelatedRecord($recordId, $this->formSpec[F_TABLE_NAME] ?? '', $this->dbArray[$this->dbIndexQfq]); + switch ($this->formSpec[F_TABLE_NAME] ?? '') { case TABLE_NAME_FORM: // cases covered: new form, existing form, existing form but form name changed $formFileName = $this->store->getVar(F_NAME, STORE_FORM, SANITIZE_ALLOW_ALNUMX); $formFileName = $formFileName === false ? $formNameDB : $formFileName; @@ -683,7 +683,7 @@ class QuickFormQuery { FormAsFile::exportForm($formFileName, $this->dbArray[$this->dbIndexQfq]); break; case FORM_DELETE: - if (TABLE_NAME_FORM_ELEMENT === $this->formSpec[F_TABLE_NAME]) { + if (TABLE_NAME_FORM_ELEMENT === ($this->formSpec[F_TABLE_NAME] ?? '')) { FormAsFile::exportForm($formFileName, $this->dbArray[$this->dbIndexQfq]); } else { FormAsFile::deleteFormFile($formFileName, $this->dbArray[$this->dbIndexQfq]); @@ -1743,8 +1743,8 @@ class QuickFormQuery { $beUserLoggedIn = $this->store->getVar(TYPO3_BE_USER, STORE_TYPO3, SANITIZE_ALLOW_ALNUMX); if ($beUserLoggedIn && $this->inlineReport) { - $html .= $this->buildInlineReport($this->t3data[T3DATA_UID], $this->t3data[T3DATA_REPORT_PATH_FILENAME], - $this->t3data[T3DATA_BODYTEXT_RAW], $this->t3data[T3DATA_HEADER]); + $html .= $this->buildInlineReport($this->t3data[T3DATA_UID] ?? null, $this->t3data[T3DATA_REPORT_PATH_FILENAME] ?? null, + $this->t3data[T3DATA_BODYTEXT_RAW] ?? '', $this->t3data[T3DATA_HEADER] ?? ''); } $html .= $report->process($this->t3data[T3DATA_BODYTEXT]); diff --git a/extension/Classes/Core/Save.php b/extension/Classes/Core/Save.php index 0367e4806..6f77468da 100644 --- a/extension/Classes/Core/Save.php +++ b/extension/Classes/Core/Save.php @@ -447,7 +447,7 @@ class Save { * @param int $recordId * @param string $primaryKey * - * @return bool|int false if $values is empty, else affectedrows + * @return bool|int false if $values is empty, else affected rows * @throws \CodeException * @throws \DbException * @throws \UserFormException -- GitLab From bf85b689e6a19481ce7b01410f0ea51ddba1bf79 Mon Sep 17 00:00:00 2001 From: Marc Egger <marc.egger@uzh.ch> Date: Mon, 12 Oct 2020 12:59:39 +0200 Subject: [PATCH 125/195] FormAsFile.php: add key existence checks on form import --- extension/Classes/Core/Form/FormAsFile.php | 41 ++++++++++++++-------- extension/Classes/Core/Helper/OnArray.php | 12 +++++++ 2 files changed, 38 insertions(+), 15 deletions(-) diff --git a/extension/Classes/Core/Form/FormAsFile.php b/extension/Classes/Core/Form/FormAsFile.php index 09ae07e3f..ecdfa4fe9 100644 --- a/extension/Classes/Core/Form/FormAsFile.php +++ b/extension/Classes/Core/Form/FormAsFile.php @@ -6,6 +6,7 @@ namespace IMATHUZH\Qfq\Core\Form; use IMATHUZH\Qfq\Core\Database\Database; use IMATHUZH\Qfq\Core\Exception\Thrower; use IMATHUZH\Qfq\Core\Helper\HelperFile; +use IMATHUZH\Qfq\Core\Helper\OnArray; use IMATHUZH\Qfq\Core\Helper\OnString; use IMATHUZH\Qfq\Core\Helper\Path; use IMATHUZH\Qfq\Core\Helper\SqlQuery; @@ -32,16 +33,16 @@ class FormAsFile public static function importForm(string $formName, Database $database): bool { // Get file stats both from file system and DB and exit if they are equal - $pathFileName = self::formPathFileName($formName, $database); + $cwdToFormFile = self::formPathFileName($formName, $database); $fileReadException = new \UserFormException(json_encode([ - ERROR_MESSAGE_TO_USER => "Form file not found or missing permission: " . baseName($pathFileName), - ERROR_MESSAGE_TO_DEVELOPER => "Form definition file not found or no permission to read file: '$pathFileName'"]), + ERROR_MESSAGE_TO_USER => "Form file not found or missing permission: " . baseName($cwdToFormFile), + ERROR_MESSAGE_TO_DEVELOPER => "Form definition file not found or no permission to read file: '$cwdToFormFile'"]), ERROR_FORM_NOT_FOUND); - if(!file_exists($pathFileName)) { + if(!file_exists($cwdToFormFile)) { self::deleteFormDB($formName, $database); throw $fileReadException; } - $fileStatsNew = self::formFileStatsJson($pathFileName); + $fileStatsNew = self::formFileStatsJson($cwdToFormFile); if ($fileStatsNew === false) { self::deleteFormDB($formName, $database); throw $fileReadException; @@ -54,22 +55,31 @@ class FormAsFile } // Read form file - $fileContents = file_get_contents($pathFileName); + $fileContents = file_get_contents($cwdToFormFile); if ($fileContents === false) { self::deleteFormDB($formName, $database); throw $fileReadException; } $formFromFile = json_decode($fileContents, true); + // form elements exist? + if (!isset($formFromFile[F_FILE_FORM_ELEMENT])) { + Thrower::userFormException('Failed to import form file.', "Json key '" . F_FILE_FORM_ELEMENT . "' in file '$cwdToFormFile' is missing."); + } + // make sure container names are unique and non-empty $containerNames = []; foreach ($formFromFile[F_FILE_FORM_ELEMENT] as $formElementFromFile) { + $keysNotSet = OnArray::keysNotSet([FE_CLASS, FE_NAME], $formElementFromFile); + if (!empty($keysNotSet)) { + Thrower::userFormException('Failed to import form file.', "One or more required keys are missing in FormElement definition in file: '$cwdToFormFile'. Missing keys: " . implode(', ', $keysNotSet)); + } if ($formElementFromFile[FE_CLASS] === FE_CLASS_CONTAINER) { if (in_array($formElementFromFile[FE_NAME], $containerNames)) { - Thrower::userFormException('Failed to import form file.', "Multiple formElements of class container with the same name '" . $formElementFromFile[FE_NAME] . "' in form file '$pathFileName'"); + Thrower::userFormException('Failed to import form file.', "Multiple formElements of class container with the same name '" . $formElementFromFile[FE_NAME] . "' in form file '$cwdToFormFile'"); } if ($formElementFromFile[FE_NAME] == '') { - Thrower::userFormException('Failed to import form file.', "Found formElement of class container with empty name in form file '$pathFileName'"); + Thrower::userFormException('Failed to import form file.', "Found formElement of class container with empty name in form file '$cwdToFormFile'"); } $containerNames[] = $formElementFromFile[FE_NAME]; } @@ -77,8 +87,7 @@ class FormAsFile // Delete old form with that name from DB if it exists. if (array_key_exists(F_ID, $formFromDb)) { - $formId = $formFromDb[F_ID]; - self::deleteFormDBWithId($formId, $database); + self::deleteFormDBWithId($formFromDb[F_ID], $database); } // Insert new Form to DB (after filtering allowed columns and adding column 'name') @@ -108,6 +117,9 @@ class FormAsFile foreach ($formFromFile[F_FILE_FORM_ELEMENT] as &$formElementFromFile) { if (array_key_exists(FE_FILE_CONTAINER_NAME, $formElementFromFile)) { $containerName = $formElementFromFile[FE_FILE_CONTAINER_NAME]; + if (!isset($containerIds[$containerName])) { + Thrower::userFormException('Failed to import form file.', "Key '" . FE_FILE_CONTAINER_NAME . "' points to non-existing container with name '$containerName' in definition of formElement with name '" . $formElementFromFile[FE_NAME] . "' in file '$cwdToFormFile'"); + } $containerId = $containerIds[$containerName]; $feId = $formElementFromFile[FE_ID]; list($sql, $parameterArray) = SqlQuery::updateRecord(TABLE_NAME_FORM_ELEMENT, [FE_ID_CONTAINER => $containerId], $feId); @@ -604,7 +616,7 @@ class FormAsFile } return $jsonFileNames = array_reduce($files, function ($result, $file) { $fileInfo = pathinfo($file); - if (array_key_exists('extension', $fileInfo) && $fileInfo['extension'] === 'json') { + if (isset($fileInfo['extension']) && isset($fileInfo['filename']) && $fileInfo['extension'] === 'json') { $result[] = $fileInfo['filename']; } return $result; @@ -629,12 +641,11 @@ class FormAsFile */ private static function formToJson(string $formName, Database $database, ?int $formId = null): array { - // Get form from DB + // Get form from DB (either by id or by name) if ($formId !== null) { list($sql, $parameterArray) = SqlQuery::selectFormById($formId); $form = $database->sql($sql, ROW_EXPECT_1, $parameterArray, "Form with id $formId not found."); // array(column name => value) - $formName = $form[F_NAME]; } else { list($sql, $parameterArray) = SqlQuery::selectFormByName($formName); $form = $database->sql($sql, ROW_EXPECT_1, @@ -678,13 +689,13 @@ class FormAsFile $formElements = array_map(function ($formElement) use ($containerNames) { // in case container name was auto adjusted above we set new name - if (array_key_exists($formElement[FE_ID], $containerNames)) { + if (isset($containerNames[$formElement[FE_ID]])) { $formElement[FE_NAME] = $containerNames[$formElement[FE_ID]]; } // Replace container id references with name references $containerId = $formElement[FE_ID_CONTAINER]; - if ($containerId !== 0 && array_key_exists($containerId, $containerNames)) { + if ($containerId !== 0 && isset($containerNames[$containerId])) { $formElement[FE_FILE_CONTAINER_NAME] = $containerNames[$containerId]; } diff --git a/extension/Classes/Core/Helper/OnArray.php b/extension/Classes/Core/Helper/OnArray.php index 7e9be89d1..18def73c2 100644 --- a/extension/Classes/Core/Helper/OnArray.php +++ b/extension/Classes/Core/Helper/OnArray.php @@ -450,4 +450,16 @@ class OnArray { return '[' . substr($json, 1) . ']'; } + + /** + * return subset of keys in $keys which are not set in $array. + * + * @param array $keys + * @param array $array + * @return array + */ + public static function keysNotSet(array $keys, array $array) + { + return array_filter($keys, function($key) use ($array) {return !isset($array[$key]);}); + } } \ No newline at end of file -- GitLab From c17824b99ae103cd5ca22c04e393fdfdb2c74560 Mon Sep 17 00:00:00 2001 From: Marc Egger <marc.egger@uzh.ch> Date: Mon, 12 Oct 2020 13:38:43 +0200 Subject: [PATCH 126/195] FormAsFile.php: keep old form during import and delete only at the end --- extension/Classes/Core/Form/FormAsFile.php | 25 +++++++++++++--------- 1 file changed, 15 insertions(+), 10 deletions(-) diff --git a/extension/Classes/Core/Form/FormAsFile.php b/extension/Classes/Core/Form/FormAsFile.php index ecdfa4fe9..31a2f728e 100644 --- a/extension/Classes/Core/Form/FormAsFile.php +++ b/extension/Classes/Core/Form/FormAsFile.php @@ -85,10 +85,9 @@ class FormAsFile } } - // Delete old form with that name from DB if it exists. - if (array_key_exists(F_ID, $formFromDb)) { - self::deleteFormDBWithId($formFromDb[F_ID], $database); - } + // keep old form ID for deletion later & define temporary name for new form + $formIdOld = $formFromDb[F_ID] ?? null; + $newFormTempName = $formName . '_FAILED_IMPORT'; // will be renamed at the end // Insert new Form to DB (after filtering allowed columns and adding column 'name') $formSchema = $database->getTableDefinition(TABLE_NAME_FORM); @@ -96,17 +95,18 @@ class FormAsFile $insertValues = array_filter($formFromFile, function ($columnName) use ($formColumns) { return $columnName !== F_ID && in_array($columnName, $formColumns); }, ARRAY_FILTER_USE_KEY); // array(column => value) - $insertValues[F_NAME] = $formName; + $insertValues[F_NAME] = $newFormTempName; + $insertValues[F_FILE_STATS] = $fileStatsNew; list($sqlFormInsert, $parameterArrayFormInsert) = SqlQuery::insertRecord(TABLE_NAME_FORM, $insertValues); - $formId = $database->sql($sqlFormInsert, ROW_REGULAR, $parameterArrayFormInsert); + $formIdNew = $database->sql($sqlFormInsert, ROW_REGULAR, $parameterArrayFormInsert); // Delete stale formElements with the new form id (these should not exist, but better make sure) - self::deleteFormElementsDBWithFormId($formId, $database); + self::deleteFormElementsDBWithFormId($formIdNew, $database); // Insert FormElements to DB and collect container ids $containerIds = []; // array(container_name => id) foreach ($formFromFile[F_FILE_FORM_ELEMENT] as &$formElementFromFile) { - $feId = self::insertFormElement($formElementFromFile, $formId, $database); + $feId = self::insertFormElement($formElementFromFile, $formIdNew, $database); $formElementFromFile[FE_ID] = $feId; if ($formElementFromFile[FE_CLASS] === FE_CLASS_CONTAINER) { $containerIds[$formElementFromFile[FE_NAME]] = $feId; @@ -127,8 +127,13 @@ class FormAsFile } } - // Update column fileStats if everything went well - list($sql, $parameterArray) = SqlQuery::updateRecord(TABLE_NAME_FORM, [F_FILE_STATS => $fileStatsNew], $formId); + // Delete old form if everything went well + if ($formIdOld !== null) { + self::deleteFormDBWithId($formIdOld, $database); + } + + // Replace temporary name of new form + list($sql, $parameterArray) = SqlQuery::updateRecord(TABLE_NAME_FORM, [F_NAME => $formName], $formIdNew); $database->sql($sql, ROW_REGULAR, $parameterArray); return true; -- GitLab From edfda4bd0203d90a94eca7e5008f00049b0a542f Mon Sep 17 00:00:00 2001 From: Marc Egger <marc.egger@uzh.ch> Date: Mon, 12 Oct 2020 14:43:27 +0200 Subject: [PATCH 127/195] FormAsFile.php: add logging to qfq.log whenever file/database-record is deleted or overwritten --- extension/Classes/Core/Database/Database.php | 8 ---- .../Classes/Core/Database/DatabaseUpdate.php | 3 +- extension/Classes/Core/Form/FormAsFile.php | 48 ++++++++++++------- extension/Classes/Core/QuickFormQuery.php | 4 +- 4 files changed, 33 insertions(+), 30 deletions(-) diff --git a/extension/Classes/Core/Database/Database.php b/extension/Classes/Core/Database/Database.php index 5fd40d6ad..ba9fb7edc 100644 --- a/extension/Classes/Core/Database/Database.php +++ b/extension/Classes/Core/Database/Database.php @@ -1027,14 +1027,6 @@ class Database { } - /** - * @return string - * @throws \UserFormException - */ - public function getQfqLogFile() { - return Path::absoluteQfqLogFile(); - } - /** * Selects in table 'Split' all records with tableName='$tableName' and xId='$xId'. Deletes all referenced files and records. * diff --git a/extension/Classes/Core/Database/DatabaseUpdate.php b/extension/Classes/Core/Database/DatabaseUpdate.php index 0194bf2ce..b62cc0d6b 100644 --- a/extension/Classes/Core/Database/DatabaseUpdate.php +++ b/extension/Classes/Core/Database/DatabaseUpdate.php @@ -170,8 +170,7 @@ class DatabaseUpdate { FormAsFIle::exportAllForms($this->db, true); } - $qfqLog = $this->db->getQfqLogFile(); - Logger::logMessage(date('Y.m.d H:i:s ') . ": Updated from QFQ version '$old' to '$new'", $qfqLog); + Logger::logMessage(date('Y.m.d H:i:s ') . ": Updated from QFQ version '$old' to '$new'", Path::absoluteQfqLogFile()); // Finally write the latest version number. $versionInfo[QFQ_VERSION_KEY] = $new; diff --git a/extension/Classes/Core/Form/FormAsFile.php b/extension/Classes/Core/Form/FormAsFile.php index 31a2f728e..9dbc8d66c 100644 --- a/extension/Classes/Core/Form/FormAsFile.php +++ b/extension/Classes/Core/Form/FormAsFile.php @@ -6,6 +6,7 @@ namespace IMATHUZH\Qfq\Core\Form; use IMATHUZH\Qfq\Core\Database\Database; use IMATHUZH\Qfq\Core\Exception\Thrower; use IMATHUZH\Qfq\Core\Helper\HelperFile; +use IMATHUZH\Qfq\Core\Helper\Logger; use IMATHUZH\Qfq\Core\Helper\OnArray; use IMATHUZH\Qfq\Core\Helper\OnString; use IMATHUZH\Qfq\Core\Helper\Path; @@ -39,12 +40,12 @@ class FormAsFile ERROR_MESSAGE_TO_DEVELOPER => "Form definition file not found or no permission to read file: '$cwdToFormFile'"]), ERROR_FORM_NOT_FOUND); if(!file_exists($cwdToFormFile)) { - self::deleteFormDB($formName, $database); + self::deleteFormDB($formName, $database, "No corresponding form file found."); throw $fileReadException; } $fileStatsNew = self::formFileStatsJson($cwdToFormFile); if ($fileStatsNew === false) { - self::deleteFormDB($formName, $database); + self::deleteFormDB($formName, $database, "Failed to read form file stats."); throw $fileReadException; } list($sql, $parameterArray) = SqlQuery::selectFormByName($formName, [F_ID, F_FILE_STATS]); @@ -57,7 +58,7 @@ class FormAsFile // Read form file $fileContents = file_get_contents($cwdToFormFile); if ($fileContents === false) { - self::deleteFormDB($formName, $database); + self::deleteFormDB($formName, $database, "Failed to read form file."); throw $fileReadException; } $formFromFile = json_decode($fileContents, true); @@ -101,7 +102,7 @@ class FormAsFile $formIdNew = $database->sql($sqlFormInsert, ROW_REGULAR, $parameterArrayFormInsert); // Delete stale formElements with the new form id (these should not exist, but better make sure) - self::deleteFormElementsDBWithFormId($formIdNew, $database); + self::deleteFormElementsDBWithFormId($formIdNew, $database, "Inserted new form with id $formIdNew."); // Insert FormElements to DB and collect container ids $containerIds = []; // array(container_name => id) @@ -129,7 +130,7 @@ class FormAsFile // Delete old form if everything went well if ($formIdOld !== null) { - self::deleteFormDBWithId($formIdOld, $database); + self::deleteFormDBWithId($formIdOld, $database, "New version of form $formName was imported successfully. New form id: $formIdNew"); } // Replace temporary name of new form @@ -166,6 +167,7 @@ class FormAsFile $pathFileName = self::formPathFileName($formName, $database); self::backupFormFile($pathFileName); HelperFile::file_put_contents($pathFileName, $formJson); + Logger::logMessage(date('Y.m.d H:i:s ') . ": Overwrote form file '$pathFileName'. Reason: Export new version of form from database.", Path::absoluteQfqLogFile()); // some column names where adjusted => import form if ($adjustContainerName) { @@ -236,11 +238,12 @@ class FormAsFile * * @param $formName * @param Database $database + * @param string $logMessageReason * @throws \CodeException * @throws \DbException * @throws \UserFormException */ - public static function deleteFormFile($formName, Database $database) // : void + public static function deleteFormFile($formName, Database $database, string $logMessageReason = '') // : void { self::enforceFormFileWritable($formName, $database); $pathFileName = self::formPathFileName($formName, $database); @@ -253,6 +256,7 @@ class FormAsFile ERROR_MESSAGE_TO_DEVELOPER => "Can't delete form file '$pathFileName'"]), ERROR_IO_WRITE_FILE); } + Logger::logMessage(date('Y.m.d H:i:s ') . ": Removed form file '$pathFileName'. Reason: $logMessageReason", Path::absoluteQfqLogFile()); } } @@ -378,7 +382,7 @@ class FormAsFile $formNamesDB = self::queryAllFormNames($database); $formsToDelete = array_diff($formNamesDB, $formFileNames); foreach ($formsToDelete as $formToDelete) { - self::deleteFormDB($formToDelete, $database); + self::deleteFormDB($formToDelete, $database, "No corresponding form file found."); } } } @@ -403,7 +407,7 @@ class FormAsFile $formFileNames = self::formFileNames($database); $filesToDelete = array_diff($formFileNames, $formNamesDB); foreach ($filesToDelete as $fileToDelete) { - self::deleteFormFile($fileToDelete, $database); + self::deleteFormFile($fileToDelete, $database, "Export all forms from database. No form with name '$fileToDelete' in database."); } } } @@ -442,37 +446,42 @@ class FormAsFile * * @param string $formName * @param Database $database + * @param string $logMessageReason * @return void * @throws \CodeException * @throws \DbException * @throws \UserFormException */ - private static function deleteFormDB(string $formName, Database $database) // : void + private static function deleteFormDB(string $formName, Database $database, string $logMessageReason = '') // : void { list($sql, $parameterArray) = SqlQuery::selectFormByName($formName, [F_ID]); $formFromDb = $database->sql($sql, ROW_EXPECT_0_1, $parameterArray, "Multiple forms with the same name: '$formName'"); if (array_key_exists(F_ID, $formFromDb)) { - self::deleteFormDBWithId($formFromDb[F_ID], $database); + self::deleteFormDBWithId($formFromDb[F_ID], $database, $logMessageReason . " Form name '$formName'."); } } /** * Delete form with given id and its form elements from DB * - * @param $formId + * @param int $formId * @param Database $database + * @param string $logMessageReason * @throws \CodeException * @throws \DbException * @throws \UserFormException */ - private static function deleteFormDBWithId(int $formId, Database $database) // : void + private static function deleteFormDBWithId(int $formId, Database $database, string $logMessageReason = '') // : void { self::backupFormDb($formId, $database); $F_ID = F_ID; // can't use constants in strings directly $TABLE_NAME_FORM = TABLE_NAME_FORM; // can't use constants in strings directly - $database->sql("DELETE FROM `$TABLE_NAME_FORM` WHERE `$F_ID`=? LIMIT 1", ROW_REGULAR, [$formId]); - self::deleteFormElementsDBWithFormId($formId, $database); + $rowsAffected = $database->sql("DELETE FROM `$TABLE_NAME_FORM` WHERE `$F_ID`=? LIMIT 1", ROW_REGULAR, [$formId]); + if ($rowsAffected > 0) { + Logger::logMessage(date('Y.m.d H:i:s ') . ": Remove form with id $formId from database. Reason: $logMessageReason", Path::absoluteQfqLogFile()); + } + self::deleteFormElementsDBWithFormId($formId, $database, 'Remove form. ' . $logMessageReason); } /** @@ -493,21 +502,24 @@ class FormAsFile } - /** * Delete form elements with given formId from DB * - * @param $formId + * @param int $formId * @param Database $database + * @param string $logMessageReason * @throws \CodeException * @throws \DbException * @throws \UserFormException */ - private static function deleteFormElementsDBWithFormId(int $formId, Database $database) // : void + private static function deleteFormElementsDBWithFormId(int $formId, Database $database, string $logMessageReason = '') // : void { $TABLE_NAME_FORM_ELEMENT = TABLE_NAME_FORM_ELEMENT; // can't use constants in strings directly $FE_FORM_ID = FE_FORM_ID; // can't use constants in strings directly - $database->sql("DELETE FROM `$TABLE_NAME_FORM_ELEMENT` WHERE `$FE_FORM_ID`=?", ROW_REGULAR, [$formId]); + $affectedRows = $database->sql("DELETE FROM `$TABLE_NAME_FORM_ELEMENT` WHERE `$FE_FORM_ID`=?", ROW_REGULAR, [$formId]); + if ($affectedRows > 0) { + Logger::logMessage(date('Y.m.d H:i:s ') . ": Removed $affectedRows formElements with formId $formId from database. Reason: $logMessageReason", Path::absoluteQfqLogFile()); + } } /** diff --git a/extension/Classes/Core/QuickFormQuery.php b/extension/Classes/Core/QuickFormQuery.php index 48174ef54..014606ad9 100644 --- a/extension/Classes/Core/QuickFormQuery.php +++ b/extension/Classes/Core/QuickFormQuery.php @@ -686,7 +686,7 @@ class QuickFormQuery { if (TABLE_NAME_FORM_ELEMENT === ($this->formSpec[F_TABLE_NAME] ?? '')) { FormAsFile::exportForm($formFileName, $this->dbArray[$this->dbIndexQfq]); } else { - FormAsFile::deleteFormFile($formFileName, $this->dbArray[$this->dbIndexQfq]); + FormAsFile::deleteFormFile($formFileName, $this->dbArray[$this->dbIndexQfq], 'Form was deleted using form-editor.'); } break; } @@ -694,7 +694,7 @@ class QuickFormQuery { // delete old form file if form name was changed if (isset($formFileNameDelete)) { - FormAsFile::deleteFormFile($formFileNameDelete, $this->dbArray[$this->dbIndexQfq]); + FormAsFile::deleteFormFile($formFileNameDelete, $this->dbArray[$this->dbIndexQfq], "Form was renamed to: '$formFileName'."); } return $data; -- GitLab From 6419148b82b0e30b9a5366df6deb57ed3d3401ce Mon Sep 17 00:00:00 2001 From: Marc Egger <marc.egger@uzh.ch> Date: Mon, 12 Oct 2020 15:22:49 +0200 Subject: [PATCH 128/195] Config.php replace old style config variables when migrating to json --- extension/Classes/Core/Helper/OnArray.php | 19 +++++++++++++++++++ extension/Classes/Core/Store/Config.php | 9 +++++++++ 2 files changed, 28 insertions(+) diff --git a/extension/Classes/Core/Helper/OnArray.php b/extension/Classes/Core/Helper/OnArray.php index 18def73c2..5a13cee87 100644 --- a/extension/Classes/Core/Helper/OnArray.php +++ b/extension/Classes/Core/Helper/OnArray.php @@ -462,4 +462,23 @@ class OnArray { { return array_filter($keys, function($key) use ($array) {return !isset($array[$key]);}); } + + /** + * Rename keys according to the associative array given as first argument (only if the key exists). + * Return changed array. + * + * @param array $renameMap old-key => new-key + * @param array $array + * @param bool $overwrite overwrite value from existing new-key with value of old-key + * @return array + */ + public static function renameKeys(array $renameMap, array $array, bool $overwrite = false) { + foreach ($renameMap as $keyOld => $keyNew) { + if (isset($array[$keyOld]) && (!isset($array[$keyNew]) || $overwrite)) { + $array[$keyNew] = $array[$keyOld]; + unset($array[$keyOld]); + } + } + return $array; + } } \ No newline at end of file diff --git a/extension/Classes/Core/Store/Config.php b/extension/Classes/Core/Store/Config.php index a9139375a..79d14545b 100644 --- a/extension/Classes/Core/Store/Config.php +++ b/extension/Classes/Core/Store/Config.php @@ -11,6 +11,7 @@ namespace IMATHUZH\Qfq\Core\Store; use IMATHUZH\Qfq\Core\Exception\Thrower; use IMATHUZH\Qfq\Core\Helper\HelperFile; use IMATHUZH\Qfq\Core\Helper\Logger; +use IMATHUZH\Qfq\Core\Helper\OnArray; use IMATHUZH\Qfq\Core\Helper\Path; use IMATHUZH\Qfq\Core\Helper\Support; use IMATHUZH\Qfq\Core\Helper\OnString; @@ -172,6 +173,14 @@ class Config { HelperFile::enforce_writable($cwdToOldConfigFile); // so we can delete it. $config = include($cwdToOldConfigFile); + // In case the database credentials are given in the old style: rename the keys + $config = OnArray::renameKeys([ + SYSTEM_DB_USER => SYSTEM_DB_1_USER, + SYSTEM_DB_SERVER => SYSTEM_DB_1_SERVER, + SYSTEM_DB_PASSWORD => SYSTEM_DB_1_PASSWORD, + SYSTEM_DB_NAME => SYSTEM_DB_1_NAME + ], $config); + // write new qfq.config.json self::writeConfig($config); -- GitLab From 429c2d9af474a7a93a072c8364d5efa43422406d Mon Sep 17 00:00:00 2001 From: Marc Egger <marc.egger@uzh.ch> Date: Mon, 12 Oct 2020 17:12:37 +0200 Subject: [PATCH 129/195] refs #10554 : fix extrabuttonlock with script tag --- extension/Classes/Core/Helper/HelperFormElement.php | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/extension/Classes/Core/Helper/HelperFormElement.php b/extension/Classes/Core/Helper/HelperFormElement.php index b969ac401..5498d2c6a 100644 --- a/extension/Classes/Core/Helper/HelperFormElement.php +++ b/extension/Classes/Core/Helper/HelperFormElement.php @@ -431,8 +431,6 @@ EOF; // LOCK if (!$skip && HelperFormElement::booleParameter($formElement[FE_INPUT_EXTRA_BUTTON_LOCK] ?? '-')) { - $formElement[FE_MODE] = FE_MODE_READONLY; - switch ($formElement[FE_TYPE]) { case FE_TYPE_CHECKBOX: case FE_TYPE_RADIO: @@ -449,6 +447,7 @@ EOF; onclick="$('#$id').prop('readonly',!$('#$id').prop('readonly'))"> <span class="glyphicon glyphicon-lock" aria-hidden="true"></span> </button> + <script>$('#$id').prop('readonly', true)</script> EOF; break; -- GitLab From 142f3922fe0e922e1f3465ddcd2ac67f01f4e914 Mon Sep 17 00:00:00 2001 From: Marc Egger <marc.egger@uzh.ch> Date: Mon, 12 Oct 2020 17:38:25 +0200 Subject: [PATCH 130/195] refs #10554 : fix extrabuttonlock also for radio and checkbox --- extension/Classes/Core/Helper/HelperFormElement.php | 1 + 1 file changed, 1 insertion(+) diff --git a/extension/Classes/Core/Helper/HelperFormElement.php b/extension/Classes/Core/Helper/HelperFormElement.php index 5498d2c6a..90f7bd282 100644 --- a/extension/Classes/Core/Helper/HelperFormElement.php +++ b/extension/Classes/Core/Helper/HelperFormElement.php @@ -439,6 +439,7 @@ EOF; onclick="$('[id^=$id]').parent('label').toggleClass('qfq-disabled')"> <span class="glyphicon glyphicon-lock" aria-hidden="true"></span> </button> + <script>$('[id^=$id]').parent('label').addClass('qfq-disabled')</script> EOF; break; default: -- GitLab From 7254320512005ce7a9ea54fecb547e3fa7a9e4c7 Mon Sep 17 00:00:00 2001 From: Marc Egger <marc.egger@uzh.ch> Date: Mon, 12 Oct 2020 18:01:48 +0200 Subject: [PATCH 131/195] refs #10554 : fix extrabuttonlock also for select --- extension/Classes/Core/Helper/HelperFormElement.php | 9 +++++++++ less/qfq-bs.css.less | 1 + 2 files changed, 10 insertions(+) diff --git a/extension/Classes/Core/Helper/HelperFormElement.php b/extension/Classes/Core/Helper/HelperFormElement.php index 90f7bd282..dd182b64a 100644 --- a/extension/Classes/Core/Helper/HelperFormElement.php +++ b/extension/Classes/Core/Helper/HelperFormElement.php @@ -432,6 +432,15 @@ EOF; // LOCK if (!$skip && HelperFormElement::booleParameter($formElement[FE_INPUT_EXTRA_BUTTON_LOCK] ?? '-')) { switch ($formElement[FE_TYPE]) { + case FE_TYPE_SELECT: + $extraButton .= <<<EOF + <button class="btn btn-info" + onclick="$('#$id').toggleClass('qfq-disabled')"> + <span class="glyphicon glyphicon-lock" aria-hidden="true"></span> + </button> + <script>$('#$id').addClass('qfq-disabled')</script> +EOF; + break; case FE_TYPE_CHECKBOX: case FE_TYPE_RADIO: $extraButton .= <<<EOF diff --git a/less/qfq-bs.css.less b/less/qfq-bs.css.less index 9c7a14925..4dc4a8bb4 100644 --- a/less/qfq-bs.css.less +++ b/less/qfq-bs.css.less @@ -167,6 +167,7 @@ i.@{spinner_class} { .qfq-disabled { cursor: not-allowed !important; pointer-events: none !important; + background: #eee !important; } -- GitLab From 5d0e91c8a664afa5f3a860cfab61a2247f900f95 Mon Sep 17 00:00:00 2001 From: Marc Egger <marc.egger@uzh.ch> Date: Tue, 13 Oct 2020 10:25:26 +0200 Subject: [PATCH 132/195] reenable phpunit in makefile --- Makefile | 4 +--- extension/Classes/Core/QuickFormQuery.php | 23 ++++++----------------- extension/Classes/Core/Store/Config.php | 6 +++--- 3 files changed, 10 insertions(+), 23 deletions(-) diff --git a/Makefile b/Makefile index 3f7e2eab0..ca2caf95f 100644 --- a/Makefile +++ b/Makefile @@ -122,9 +122,7 @@ phpunit: cp -v typo3conf/ext/qfq/Tests/phpunit_qfq.json typo3conf/ext/qfq.json; sed -i "s/#PHPUNIT_PASSWORD#/$(PHPUNIT_MYSQL_PASSWORD)/" typo3conf/ext/qfq.json # run phpunit - - # TEMPORARILY DISABLED ! - # cd typo3conf/ext/qfq/; pwd; vendor/bin/phpunit --configuration phpunit.xml + cd typo3conf/ext/qfq/; pwd; vendor/bin/phpunit --configuration phpunit.xml phpunit_snapshot: snapshot phpunit diff --git a/extension/Classes/Core/QuickFormQuery.php b/extension/Classes/Core/QuickFormQuery.php index 014606ad9..bae3aba9e 100644 --- a/extension/Classes/Core/QuickFormQuery.php +++ b/extension/Classes/Core/QuickFormQuery.php @@ -138,20 +138,10 @@ class QuickFormQuery { // PHPExcel set_include_path(get_include_path() . PATH_SEPARATOR . '../../Resources/Private/Classes/'); - if (!isset($t3data[T3DATA_BODYTEXT])) { - // TODO: ?CR: when does this happen? why no exception thrown? - $t3data[T3DATA_BODYTEXT] = ''; - } - - if (!isset($t3data[T3DATA_UID])) { - // TODO: ?CR: when does this happen? why no exception thrown? - $t3data[T3DATA_UID] = 0; - } - - if (!isset($t3data[T3DATA_HEADER])) { - // TODO: ?CR: when does this happen? why no exception thrown? - $t3data[T3DATA_HEADER] = ''; - } + // set dummy values if QuickFormQuery is not called by Typo3 + $t3data[T3DATA_BODYTEXT] = $t3data[T3DATA_BODYTEXT] ?? ''; + $t3data[T3DATA_UID] = $t3data[T3DATA_UID] ?? 0; + $t3data[T3DATA_HEADER] = $t3data[T3DATA_HEADER] ?? ''; // Read report file, if file keyword exists in bodytext $reportPathFileNameFull = ReportAsFile::parseFileKeyword($t3data[T3DATA_BODYTEXT]); @@ -209,9 +199,8 @@ class QuickFormQuery { $dbIndex = ($dbIndex == '') ? DB_INDEX_DEFAULT : $dbIndex; $this->store->setVar(TOKEN_DB_INDEX, $dbIndex, STORE_TYPO3); - // Create report file if file keyword not found - // TODO: ?CR: uid could be 0. When does this happen? - if (strtolower($this->store->getVar(SYSTEM_REPORT_AS_FILE_AUTO_EXPORT, STORE_SYSTEM)) === 'yes' && $reportPathFileNameFull === null && $t3data[T3DATA_UID] !== 0) { + // Create report file if file keyword not found (and auto export is enabled in qfq settings) + if ($reportPathFileNameFull === null && $t3data[T3DATA_UID] !== 0 && strtolower($this->store->getVar(SYSTEM_REPORT_AS_FILE_AUTO_EXPORT, STORE_SYSTEM)) === 'yes') { $reportPathFileNameFull = ReportAsFile::create_file_from_ttContent($t3data[T3DATA_UID], $this->dbArray[$this->dbIndexData]); } diff --git a/extension/Classes/Core/Store/Config.php b/extension/Classes/Core/Store/Config.php index 79d14545b..8714e54e2 100644 --- a/extension/Classes/Core/Store/Config.php +++ b/extension/Classes/Core/Store/Config.php @@ -62,8 +62,8 @@ class Config { } /** - * Read qfq.json (merge with Typo3-qfq config if exists) - * Deprecated config file typo3conf/config.qfq.php is translated to JSON in PATH:cwdToProject(..) + * Read qfq.json (merge with Typo3-qfq config if exists). + * Note: Deprecated config file typo3conf/config.qfq.php is translated to JSON in PATH:cwdToProject(..) * * @param string $PhpUnitOverloadCwdToConfigFile * @throws \CodeException @@ -92,9 +92,9 @@ class Config { } if ($PhpUnitOverloadCwdToConfigFile === '') { + $configT3qfq = self::readTypo3QfqConfig(); // Settings in qfq.json overwrite T3 settings - $configT3qfq = self::readTypo3QfqConfig(); $config = array_merge($configT3qfq, $config); } -- GitLab From 6cfb87736c00ac66bc203c17246dcea9f101d897 Mon Sep 17 00:00:00 2001 From: Marc Egger <marc.egger@uzh.ch> Date: Tue, 13 Oct 2020 11:20:53 +0200 Subject: [PATCH 133/195] Path.php: add path part functionality to realpath to allow non-existing paths --- extension/Classes/Core/Helper/Path.php | 33 ++++++++++++++++---------- 1 file changed, 20 insertions(+), 13 deletions(-) diff --git a/extension/Classes/Core/Helper/Path.php b/extension/Classes/Core/Helper/Path.php index 39ef5693b..78d426ad2 100644 --- a/extension/Classes/Core/Helper/Path.php +++ b/extension/Classes/Core/Helper/Path.php @@ -93,30 +93,33 @@ class Path } /** + * @param array $pathPartsToAppend * @return string * @throws \UserFormException */ - public static function absoluteApp(/* path parts to append */): string + public static function absoluteApp(...$pathPartsToAppend): string { - return self::realpath(self::cwdToApp(func_get_args())); + return self::realpath(self::cwdToApp(), ...$pathPartsToAppend); } /** + * @param array $pathPartsToAppend * @return string * @throws \UserFormException */ - public static function absoluteExt(/* path parts to append */): string + public static function absoluteExt(...$pathPartsToAppend): string { - return self::realpath(self::cwdToExt(func_get_args())); + return self::realpath(self::cwdToExt(), ...$pathPartsToAppend); } /** + * @param array $pathPartsToAppend * @return string * @throws \UserFormException */ - public static function absoluteLog(/* path parts to append */): string + public static function absoluteLog(...$pathPartsToAppend): string { - return self::realpath(self::cwdToLog(func_get_args())); + return self::realpath(self::cwdToLog(), ...$pathPartsToAppend); } /** @@ -263,7 +266,9 @@ class Path /** * Override the paths of sql.log, qfq.log, mail.log using the values from the config file or Typo3. * + * @throws \CodeException * @throws \UserFormException + * @throws \UserReportException */ public static function overrideLogPathsFromConfig() { @@ -474,18 +479,20 @@ EOF; } /** - * PHP System function: realpath() with QFQ exception + * PHP System function: realpath() with QFQ exception. + * The first argument must be a path from CWD to something that exists. Otherwise an exception is thrown! * - * @param string $path + * @param string $cwdToSomethingThatExists This file/dir MUST exist! Otherwise exception! + * @param array $pathPartsToAppend The appended path doesnt have to exist. * @return string * @throws \UserFormException */ - private static function realpath(string $path): string + private static function realpath(string $cwdToSomethingThatExists, ...$pathPartsToAppend): string { - $result = realpath($path); - if ($result === false) { - Thrower::userFormException('Path not found.', "Either file/dir not exists or access not permitted: $path."); + $absolutePath = realpath($cwdToSomethingThatExists); + if ($absolutePath === false) { + Thrower::userFormException('Path not found.', "Either file/dir not exists or access not permitted: $cwdToSomethingThatExists."); } - return $result; + return self::join($absolutePath, ...$pathPartsToAppend); } } \ No newline at end of file -- GitLab From a6d83b6bb3fec7e55773ca28feb712c32b074c12 Mon Sep 17 00:00:00 2001 From: Marc Egger <marc.egger@uzh.ch> Date: Tue, 13 Oct 2020 12:58:29 +0200 Subject: [PATCH 134/195] temporarily disable unittests --- Makefile | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/Makefile b/Makefile index ca2caf95f..bb09e4269 100644 --- a/Makefile +++ b/Makefile @@ -122,7 +122,9 @@ phpunit: cp -v typo3conf/ext/qfq/Tests/phpunit_qfq.json typo3conf/ext/qfq.json; sed -i "s/#PHPUNIT_PASSWORD#/$(PHPUNIT_MYSQL_PASSWORD)/" typo3conf/ext/qfq.json # run phpunit - cd typo3conf/ext/qfq/; pwd; vendor/bin/phpunit --configuration phpunit.xml + + # temporarily disabled + # cd typo3conf/ext/qfq/; pwd; vendor/bin/phpunit --configuration phpunit.xml phpunit_snapshot: snapshot phpunit -- GitLab From b992fe2fe222bc1493393188d6898d046d775e39 Mon Sep 17 00:00:00 2001 From: Marc Egger <marc.egger@uzh.ch> Date: Tue, 13 Oct 2020 13:00:16 +0200 Subject: [PATCH 135/195] Path.php: replace func_get_args() with ...$var unpacking notation --- extension/Classes/Core/Helper/Path.php | 60 +++++++++++++++----------- 1 file changed, 35 insertions(+), 25 deletions(-) diff --git a/extension/Classes/Core/Helper/Path.php b/extension/Classes/Core/Helper/Path.php index 78d426ad2..2af5aa94d 100644 --- a/extension/Classes/Core/Helper/Path.php +++ b/extension/Classes/Core/Helper/Path.php @@ -99,7 +99,7 @@ class Path */ public static function absoluteApp(...$pathPartsToAppend): string { - return self::realpath(self::cwdToApp(), ...$pathPartsToAppend); + return self::realpath(self::cwdToApp(), $pathPartsToAppend); } /** @@ -109,7 +109,7 @@ class Path */ public static function absoluteExt(...$pathPartsToAppend): string { - return self::realpath(self::cwdToExt(), ...$pathPartsToAppend); + return self::realpath(self::cwdToExt(), $pathPartsToAppend); } /** @@ -119,7 +119,7 @@ class Path */ public static function absoluteLog(...$pathPartsToAppend): string { - return self::realpath(self::cwdToLog(), ...$pathPartsToAppend); + return self::realpath(self::cwdToLog(), $pathPartsToAppend); } /** @@ -159,78 +159,86 @@ class Path } /** + * @param array $pathPartsToAppend * @return string * @throws \UserFormException */ - public static function cwdToLog(/* path parts to append */): string + public static function cwdToLog(...$pathPartsToAppend): string { self::enforcePathIsSet(self::$cwdToLog); - return self::join(self::$cwdToLog, func_get_args()); + return self::join(self::$cwdToLog, $pathPartsToAppend); } /** + * @param array $pathPartsToAppend * @return string * @throws \UserFormException */ - public static function cwdToApp(/* path parts to append */): string + public static function cwdToApp(...$pathPartsToAppend): string { self::enforcePathIsSet(self::$cwdToApp); - return self::join(self::$cwdToApp, func_get_args()); + return self::join(self::$cwdToApp, $pathPartsToAppend); } /** + * @param array $pathPartsToAppend * @return string * @throws \UserFormException */ - public static function appToProject(/* path parts to append */): string + public static function appToProject(...$pathPartsToAppend): string { self::enforcePathIsSet(self::$appToProject); - return self::join(self::$appToProject, func_get_args()); + return self::join(self::$appToProject, $pathPartsToAppend); } /** + * @param array $pathPartsToAppend * @return string * @throws \UserFormException */ - public static function cwdToProject(/* path parts to append */): string + public static function cwdToProject(...$pathPartsToAppend): string { - return self::cwdToApp(self::appToProject(func_get_args())); + return self::cwdToApp(self::appToProject($pathPartsToAppend)); } /** + * @param array $pathPartsToAppend * @return string * @throws \UserFormException */ - public static function appToExt(/* path parts to append */): string + public static function appToExt(...$pathPartsToAppend): string { - return self::join(self::APP_TO_EXT, func_get_args()); + return self::join(self::APP_TO_EXT, $pathPartsToAppend); } /** + * @param array $pathPartsToAppend * @return string * @throws \UserFormException */ - public static function cwdToExt(/* path parts to append */): string + public static function cwdToExt(...$pathPartsToAppend): string { - return self::cwdToApp(self::APP_TO_EXT, func_get_args()); + return self::cwdToApp(self::APP_TO_EXT, $pathPartsToAppend); } /** + * @param array $pathPartsToAppend * @return string * @throws \UserFormException */ - public static function extToApi(/* path parts to append */): string + public static function extToApi(...$pathPartsToAppend): string { - return self::join(self::EXT_TO_API, func_get_args()); + return self::join(self::EXT_TO_API, $pathPartsToAppend); } /** + * @param array $pathPartsToAppend * @return string * @throws \UserFormException */ - public static function appToApi(/* path parts to append */): string + public static function appToApi(...$pathPartsToAppend): string { - return self::join(self::APP_TO_EXT, self::EXT_TO_API, func_get_args()); + return self::join(self::APP_TO_EXT, self::EXT_TO_API, $pathPartsToAppend); } /** @@ -308,15 +316,17 @@ class Path } /** - * Join the arguments together as a path. - * The second argument may be an array of parts. (further arguments are ignored in that case) + * Join the arguments together as a path. Array arguments are flattened! + * Trailing path parts may not start with '/'. * + * join(['this', 'is'], 'my/wonderful', [['path/of', 'nice'], 'things']) === 'this/is/my/wonderful/path/of/nice/things' + * + * @param array $pathPartsToAppend * @return string - * @throws \UserFormException Don't remove. */ - public static function join(/* path parts to append */): string + public static function join(...$pathPartsToAppend): string { - $parts = func_get_args(); + $parts = $pathPartsToAppend; // concatenate all parts (arrays are flattened) $path = ''; @@ -493,6 +503,6 @@ EOF; if ($absolutePath === false) { Thrower::userFormException('Path not found.', "Either file/dir not exists or access not permitted: $cwdToSomethingThatExists."); } - return self::join($absolutePath, ...$pathPartsToAppend); + return self::join($absolutePath, $pathPartsToAppend); } } \ No newline at end of file -- GitLab From f60cedfd800912448598075b1a4088839d59d70e Mon Sep 17 00:00:00 2001 From: Marc Egger <marc.egger@uzh.ch> Date: Tue, 13 Oct 2020 13:26:28 +0200 Subject: [PATCH 136/195] print username in gitlab ci --- .gitlab-ci.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 0722da987..960779ad4 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -27,6 +27,7 @@ snapshot: paths: - build/ script: + - echo "CURRENT USER '${USER}'" - make VERSION=${VERSION} phpunit_snapshot - chmod a+r qfq_${VERSION}_*.zip - echo "mv qfq_${VERSION}_*.zip qfq_${VERSION}_${RELDATE}-${CI_BUILD_REF_NAME}.zip" -- GitLab From 8299e1de3a6697fe17f6cad6f304cee04408a93b Mon Sep 17 00:00:00 2001 From: Marc Egger <marc.egger@uzh.ch> Date: Tue, 13 Oct 2020 13:32:05 +0200 Subject: [PATCH 137/195] output npm version in makefile --- .gitlab-ci.yml | 1 - Makefile | 3 +++ 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 960779ad4..0722da987 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -27,7 +27,6 @@ snapshot: paths: - build/ script: - - echo "CURRENT USER '${USER}'" - make VERSION=${VERSION} phpunit_snapshot - chmod a+r qfq_${VERSION}_*.zip - echo "mv qfq_${VERSION}_*.zip qfq_${VERSION}_${RELDATE}-${CI_BUILD_REF_NAME}.zip" diff --git a/Makefile b/Makefile index bb09e4269..dff6e04a6 100644 --- a/Makefile +++ b/Makefile @@ -74,6 +74,9 @@ basic: .npmpackages .virtual_env touch $@ .npmpackages: + echo "CURRENT USER '${USER}'" + npm --version + node --version npm ls -g grunt-cli 2>/dev/null || { echo "Please install grunt-cli npm package using 'npm install -g grunt-cli'" 1>&2 ; exit 1; } # update npm at persistent location and copy node_modules (to speed up process) -- GitLab From 1d86c1a0e9a5f222bf364040a1809f94771f828c Mon Sep 17 00:00:00 2001 From: Marc Egger <marc.egger@uzh.ch> Date: Tue, 13 Oct 2020 13:36:04 +0200 Subject: [PATCH 138/195] add which node & npm to makefile --- Makefile | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Makefile b/Makefile index dff6e04a6..cf063322a 100644 --- a/Makefile +++ b/Makefile @@ -76,7 +76,9 @@ basic: .npmpackages .virtual_env .npmpackages: echo "CURRENT USER '${USER}'" npm --version + which npm node --version + which node npm ls -g grunt-cli 2>/dev/null || { echo "Please install grunt-cli npm package using 'npm install -g grunt-cli'" 1>&2 ; exit 1; } # update npm at persistent location and copy node_modules (to speed up process) -- GitLab From 777a680682bbbd8c619339484e0793b2d8f1a18d Mon Sep 17 00:00:00 2001 From: Marc Egger <marc.egger@uzh.ch> Date: Tue, 13 Oct 2020 13:56:19 +0200 Subject: [PATCH 139/195] echo path in makefile --- Makefile | 1 + 1 file changed, 1 insertion(+) diff --git a/Makefile b/Makefile index cf063322a..08332e45d 100644 --- a/Makefile +++ b/Makefile @@ -79,6 +79,7 @@ basic: .npmpackages .virtual_env which npm node --version which node + echo $PATH npm ls -g grunt-cli 2>/dev/null || { echo "Please install grunt-cli npm package using 'npm install -g grunt-cli'" 1>&2 ; exit 1; } # update npm at persistent location and copy node_modules (to speed up process) -- GitLab From 670f6331b03987959e0194fc686f8e07dab37d03 Mon Sep 17 00:00:00 2001 From: Marc Egger <marc.egger@uzh.ch> Date: Tue, 13 Oct 2020 13:58:35 +0200 Subject: [PATCH 140/195] fix echo path in makefile --- Makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Makefile b/Makefile index 08332e45d..b8d33b880 100644 --- a/Makefile +++ b/Makefile @@ -79,7 +79,7 @@ basic: .npmpackages .virtual_env which npm node --version which node - echo $PATH + echo "${PATH}" npm ls -g grunt-cli 2>/dev/null || { echo "Please install grunt-cli npm package using 'npm install -g grunt-cli'" 1>&2 ; exit 1; } # update npm at persistent location and copy node_modules (to speed up process) -- GitLab From 9d17aa5a75f89b4017f15c869040c8faf3f7227c Mon Sep 17 00:00:00 2001 From: Marc Egger <marc.egger@uzh.ch> Date: Tue, 13 Oct 2020 14:26:07 +0200 Subject: [PATCH 141/195] reenable phpunit --- Makefile | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/Makefile b/Makefile index b8d33b880..f66c768ed 100644 --- a/Makefile +++ b/Makefile @@ -128,9 +128,7 @@ phpunit: cp -v typo3conf/ext/qfq/Tests/phpunit_qfq.json typo3conf/ext/qfq.json; sed -i "s/#PHPUNIT_PASSWORD#/$(PHPUNIT_MYSQL_PASSWORD)/" typo3conf/ext/qfq.json # run phpunit - - # temporarily disabled - # cd typo3conf/ext/qfq/; pwd; vendor/bin/phpunit --configuration phpunit.xml + cd typo3conf/ext/qfq/; pwd; vendor/bin/phpunit --configuration phpunit.xml phpunit_snapshot: snapshot phpunit -- GitLab From 6d258d2026f8ca39d322c783ba76bcfd5c25a7ef Mon Sep 17 00:00:00 2001 From: Marc Egger <marc.egger@uzh.ch> Date: Tue, 13 Oct 2020 14:43:05 +0200 Subject: [PATCH 142/195] REVERT ME!!!! debug phpunit --- extension/Classes/Core/Helper/HelperFile.php | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/extension/Classes/Core/Helper/HelperFile.php b/extension/Classes/Core/Helper/HelperFile.php index a64919e94..6a28ca259 100644 --- a/extension/Classes/Core/Helper/HelperFile.php +++ b/extension/Classes/Core/Helper/HelperFile.php @@ -9,6 +9,8 @@ namespace IMATHUZH\Qfq\Core\Helper; +use IMATHUZH\Qfq\Core\Exception\Thrower; + /** * Class HelperFile * @package qfq @@ -538,7 +540,13 @@ class HelperFile { public static function createPathRecursive($path) // : void { if (!is_dir($path)) { - $success = mkdir($path, 0777, true); + + try { + $success = mkdir($path, 0777, true); + } catch (\Error | \Exception $e) { + Thrower::userFormException('HEREEEE: ' . $path . ' >>> MESSAGE: ' . $e->getMessage()); + } + if ($success === false) { throw new \UserFormException(json_encode([ ERROR_MESSAGE_TO_USER => "Can't create file path.", -- GitLab From f4df287967090d84e9da67a29054735a555a42a2 Mon Sep 17 00:00:00 2001 From: Marc Egger <marc.egger@uzh.ch> Date: Tue, 13 Oct 2020 14:50:30 +0200 Subject: [PATCH 143/195] DeleteTest.php change path since logs are written outside --- extension/Tests/Unit/Core/DeleteTest.php | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/extension/Tests/Unit/Core/DeleteTest.php b/extension/Tests/Unit/Core/DeleteTest.php index b8d9ecad5..4028d9ae2 100644 --- a/extension/Tests/Unit/Core/DeleteTest.php +++ b/extension/Tests/Unit/Core/DeleteTest.php @@ -78,7 +78,8 @@ class DeleteTest extends AbstractDatabaseTest { $this->store->setVar('form', 'TestFormName', STORE_TYPO3); $this->previousCwdToApp = Path::cwdToApp(); - Path::setMainPaths('/tmp'); + mkdir('/tmp/deleteTest'); + Path::setMainPaths('/tmp/deleteTest'); // The above replaces the following line with a Path:: function. Probably won't work. // $this->store->setVar(SYSTEM_SITE_PATH_ABSOLUTE, '/tmp', STORE_SYSTEM, true); -- GitLab From c7a2fcc41c059b2e4785d9b5bb41dea7c2747e2a Mon Sep 17 00:00:00 2001 From: Marc Egger <marc.egger@uzh.ch> Date: Tue, 13 Oct 2020 14:55:07 +0200 Subject: [PATCH 144/195] DeleteTest.php only create temp path if not exists --- extension/Classes/Core/Helper/HelperFile.php | 2 ++ extension/Tests/Unit/Core/DeleteTest.php | 5 ++++- 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/extension/Classes/Core/Helper/HelperFile.php b/extension/Classes/Core/Helper/HelperFile.php index 6a28ca259..35e9436d1 100644 --- a/extension/Classes/Core/Helper/HelperFile.php +++ b/extension/Classes/Core/Helper/HelperFile.php @@ -544,7 +544,9 @@ class HelperFile { try { $success = mkdir($path, 0777, true); } catch (\Error | \Exception $e) { + // DEBUG Thrower::userFormException('HEREEEE: ' . $path . ' >>> MESSAGE: ' . $e->getMessage()); + // END DEBUG } if ($success === false) { diff --git a/extension/Tests/Unit/Core/DeleteTest.php b/extension/Tests/Unit/Core/DeleteTest.php index 4028d9ae2..213c26142 100644 --- a/extension/Tests/Unit/Core/DeleteTest.php +++ b/extension/Tests/Unit/Core/DeleteTest.php @@ -78,7 +78,10 @@ class DeleteTest extends AbstractDatabaseTest { $this->store->setVar('form', 'TestFormName', STORE_TYPO3); $this->previousCwdToApp = Path::cwdToApp(); - mkdir('/tmp/deleteTest'); + $tempAppDir = '/tmp/deleteTest'; + if (!is_dir($tempAppDir)) { + mkdir('/tmp/deleteTest'); + } Path::setMainPaths('/tmp/deleteTest'); // The above replaces the following line with a Path:: function. Probably won't work. // $this->store->setVar(SYSTEM_SITE_PATH_ABSOLUTE, '/tmp', STORE_SYSTEM, true); -- GitLab From 27fc13832e06d9a152003e61d2a6ddeba167689f Mon Sep 17 00:00:00 2001 From: Marc Egger <marc.egger@uzh.ch> Date: Wed, 14 Oct 2020 09:40:15 +0200 Subject: [PATCH 145/195] HelperFile.php: throw custom exception if mkdir throws permission Error --- .gitlab-ci.yml | 1 + extension/Classes/Core/Helper/HelperFile.php | 8 ++++---- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 0722da987..ad00e7067 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -5,6 +5,7 @@ before_script: variables: SELENIUM_LOGS_PATH: "/scratch/tmp/7/" + GIT_STRATEGY: clone stages: - before diff --git a/extension/Classes/Core/Helper/HelperFile.php b/extension/Classes/Core/Helper/HelperFile.php index 35e9436d1..31469ec45 100644 --- a/extension/Classes/Core/Helper/HelperFile.php +++ b/extension/Classes/Core/Helper/HelperFile.php @@ -541,18 +541,18 @@ class HelperFile { { if (!is_dir($path)) { + $errorMessage = ''; try { $success = mkdir($path, 0777, true); } catch (\Error | \Exception $e) { - // DEBUG - Thrower::userFormException('HEREEEE: ' . $path . ' >>> MESSAGE: ' . $e->getMessage()); - // END DEBUG + $errorMessage = 'Reason: ' . $e->getMessage(); + $success = false; } if ($success === false) { throw new \UserFormException(json_encode([ ERROR_MESSAGE_TO_USER => "Can't create file path.", - ERROR_MESSAGE_TO_DEVELOPER => "Can't create path: " . $path]), + ERROR_MESSAGE_TO_DEVELOPER => "Can't create path: '$path' $errorMessage"]), ERROR_IO_WRITE_FILE); } } -- GitLab From 276117b2284e101860d221c8fd4a9ad74ef4e2a0 Mon Sep 17 00:00:00 2001 From: Marc Egger <marc.egger@uzh.ch> Date: Wed, 14 Oct 2020 10:41:59 +0200 Subject: [PATCH 146/195] debug gitlab CI --- extension/Classes/Core/Store/Config.php | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/extension/Classes/Core/Store/Config.php b/extension/Classes/Core/Store/Config.php index 8714e54e2..66a3e9984 100644 --- a/extension/Classes/Core/Store/Config.php +++ b/extension/Classes/Core/Store/Config.php @@ -80,7 +80,12 @@ class Config { $cwdToConfigFile = $PhpUnitOverloadCwdToConfigFile === '' ? Path::cwdToProject(CONFIG_QFQ_JSON) : $PhpUnitOverloadCwdToConfigFile; if (!file_exists($cwdToConfigFile)) { HelperFile::file_put_contents(Path::cwdToProject(CONFIG_QFQ_JSON_EXAMPLE), json_encode(self::CONFIG_REQUIRED_TEMPLATE, JSON_PRETTY_PRINT)); - Thrower::userFormException("Please create qfq config file '" . CONFIG_QFQ_JSON . "' in project directory. Example config file '" . CONFIG_QFQ_JSON_EXAMPLE . "' was created in project directory.", "Project directory: " . realpath(Path::cwdToProject())); + Thrower::userFormException("Please create qfq config file '" . CONFIG_QFQ_JSON . "' in project directory. Example config file '" . CONFIG_QFQ_JSON_EXAMPLE . "' was created in project directory.", "Project directory: " . realpath(Path::cwdToProject()) + + // DEBUG + . print_r([Path::appToProject(), Path::cwdToProject(), Path::cwdToApp(), Path::cwdToLog(), "cwd" => getcwd(), Path::absoluteApp()],true) + // END DEBUG + ); } $config = HelperFile::json_decode(HelperFile::file_get_contents($cwdToConfigFile)); -- GitLab From 91e26b7f91780ca8a59c14b6c85beb1939e88d7a Mon Sep 17 00:00:00 2001 From: Marc Egger <marc.egger@uzh.ch> Date: Wed, 14 Oct 2020 11:25:18 +0200 Subject: [PATCH 147/195] debug gitlab CI --- Makefile | 1 + 1 file changed, 1 insertion(+) diff --git a/Makefile b/Makefile index f66c768ed..7843c690f 100644 --- a/Makefile +++ b/Makefile @@ -126,6 +126,7 @@ phpunit: # create new kind of config (qfq.json) cp -v typo3conf/ext/qfq/Tests/phpunit_qfq.json typo3conf/ext/qfq.json; sed -i "s/#PHPUNIT_PASSWORD#/$(PHPUNIT_MYSQL_PASSWORD)/" typo3conf/ext/qfq.json + cp -v typo3conf/ext/qfq/Tests/phpunit_qfq.json typo3conf/ext/qfq.json; sed -i "s/#PHPUNIT_PASSWORD#/$(PHPUNIT_MYSQL_PASSWORD)/" ../qfq.json # run phpunit cd typo3conf/ext/qfq/; pwd; vendor/bin/phpunit --configuration phpunit.xml -- GitLab From 771c60302f829b310e78a4e41c51488812a5cfa2 Mon Sep 17 00:00:00 2001 From: Marc Egger <marc.egger@uzh.ch> Date: Wed, 14 Oct 2020 11:29:54 +0200 Subject: [PATCH 148/195] debug gitlab CI --- Makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Makefile b/Makefile index 7843c690f..ae87bc3c2 100644 --- a/Makefile +++ b/Makefile @@ -126,7 +126,7 @@ phpunit: # create new kind of config (qfq.json) cp -v typo3conf/ext/qfq/Tests/phpunit_qfq.json typo3conf/ext/qfq.json; sed -i "s/#PHPUNIT_PASSWORD#/$(PHPUNIT_MYSQL_PASSWORD)/" typo3conf/ext/qfq.json - cp -v typo3conf/ext/qfq/Tests/phpunit_qfq.json typo3conf/ext/qfq.json; sed -i "s/#PHPUNIT_PASSWORD#/$(PHPUNIT_MYSQL_PASSWORD)/" ../qfq.json + cp -v typo3conf/ext/qfq/Tests/phpunit_qfq.json ../qfq.json; sed -i "s/#PHPUNIT_PASSWORD#/$(PHPUNIT_MYSQL_PASSWORD)/" ../qfq.json # run phpunit cd typo3conf/ext/qfq/; pwd; vendor/bin/phpunit --configuration phpunit.xml -- GitLab From 71404bbcc70f383e4b19854fa875742e21c29641 Mon Sep 17 00:00:00 2001 From: Marc Egger <marc.egger@uzh.ch> Date: Wed, 14 Oct 2020 15:00:57 +0200 Subject: [PATCH 149/195] debug gitlab CI --- extension/Classes/Core/Store/Config.php | 7 +------ extension/Tests/Unit/Core/BuildFormPlainTest.php | 10 +++++++++- 2 files changed, 10 insertions(+), 7 deletions(-) diff --git a/extension/Classes/Core/Store/Config.php b/extension/Classes/Core/Store/Config.php index 66a3e9984..8714e54e2 100644 --- a/extension/Classes/Core/Store/Config.php +++ b/extension/Classes/Core/Store/Config.php @@ -80,12 +80,7 @@ class Config { $cwdToConfigFile = $PhpUnitOverloadCwdToConfigFile === '' ? Path::cwdToProject(CONFIG_QFQ_JSON) : $PhpUnitOverloadCwdToConfigFile; if (!file_exists($cwdToConfigFile)) { HelperFile::file_put_contents(Path::cwdToProject(CONFIG_QFQ_JSON_EXAMPLE), json_encode(self::CONFIG_REQUIRED_TEMPLATE, JSON_PRETTY_PRINT)); - Thrower::userFormException("Please create qfq config file '" . CONFIG_QFQ_JSON . "' in project directory. Example config file '" . CONFIG_QFQ_JSON_EXAMPLE . "' was created in project directory.", "Project directory: " . realpath(Path::cwdToProject()) - - // DEBUG - . print_r([Path::appToProject(), Path::cwdToProject(), Path::cwdToApp(), Path::cwdToLog(), "cwd" => getcwd(), Path::absoluteApp()],true) - // END DEBUG - ); + Thrower::userFormException("Please create qfq config file '" . CONFIG_QFQ_JSON . "' in project directory. Example config file '" . CONFIG_QFQ_JSON_EXAMPLE . "' was created in project directory.", "Project directory: " . realpath(Path::cwdToProject())); } $config = HelperFile::json_decode(HelperFile::file_get_contents($cwdToConfigFile)); diff --git a/extension/Tests/Unit/Core/BuildFormPlainTest.php b/extension/Tests/Unit/Core/BuildFormPlainTest.php index f0ae715dd..e02c38b16 100644 --- a/extension/Tests/Unit/Core/BuildFormPlainTest.php +++ b/extension/Tests/Unit/Core/BuildFormPlainTest.php @@ -6,7 +6,8 @@ namespace IMATHUZH\Qfq\Tests\Unit\Core; use IMATHUZH\Qfq\Core\BuildFormPlain; - + +use IMATHUZH\Qfq\Core\Helper\Path; use IMATHUZH\Qfq\Core\Helper\Support; use IMATHUZH\Qfq\Core\QuickFormQuery; use IMATHUZH\Qfq\Tests\Unit\Core\Database\AbstractDatabaseTest; @@ -406,6 +407,13 @@ class BuildFormPlainTest extends AbstractDatabaseTest { $formElement[SUBRECORD_PARAMETER_FORM] = 'Person'; $formElement[FE_SUBRECORD_OPTION] = ''; + // DEBUG + throw new \UserFormException(json_encode( + [ERROR_MESSAGE_TO_USER => print_r([is_readable(Path::cwdToApp(Path::APP_TO_TYPO3_CONF, CONFIG_T3)), Path::cwdToApp(Path::APP_TO_TYPO3_CONF, CONFIG_T3)], true), + ERROR_MESSAGE_TO_DEVELOPER => FE_DND_TABLE . ' or ' . SUBRECORD_PARAMETER_FORM]), + ERROR_MISSING_TABLE_NAME); + // END DEBUG + $result = $build->buildSubrecord($formElement, 'name:1', '', $json); $this->assertEquals('<table class="table table-hover qfq-subrecord-table qfq-color-grey-2" id="1-123" ><thead><tr><th>id</th><th>name</th><th>firstName</th></tr></thead><tbody ><tr class="record" ><td><span class="text-muted">1</span></td><td>Doe</td><td>John</td></tr><tr class="record" ><td><span class="text-muted">2</span></td><td>Smith</td><td>Jane</td></tr></tbody></table>', $result); // $this->assertEquals('Please save this record first.', $result); -- GitLab From b57c78aaf9cdbb646d9fb214148843f2b006fd88 Mon Sep 17 00:00:00 2001 From: Marc Egger <marc.egger@uzh.ch> Date: Wed, 14 Oct 2020 15:39:51 +0200 Subject: [PATCH 150/195] debug gitlab CI --- Makefile | 1 + extension/Tests/Unit/Core/BuildFormPlainTest.php | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/Makefile b/Makefile index ae87bc3c2..28e67aabe 100644 --- a/Makefile +++ b/Makefile @@ -127,6 +127,7 @@ phpunit: # create new kind of config (qfq.json) cp -v typo3conf/ext/qfq/Tests/phpunit_qfq.json typo3conf/ext/qfq.json; sed -i "s/#PHPUNIT_PASSWORD#/$(PHPUNIT_MYSQL_PASSWORD)/" typo3conf/ext/qfq.json cp -v typo3conf/ext/qfq/Tests/phpunit_qfq.json ../qfq.json; sed -i "s/#PHPUNIT_PASSWORD#/$(PHPUNIT_MYSQL_PASSWORD)/" ../qfq.json + cp -v typo3conf/ext/qfq/Tests/phpunit_LocalConfiguration.php typo3conf/LocalConfiguration.php # run phpunit cd typo3conf/ext/qfq/; pwd; vendor/bin/phpunit --configuration phpunit.xml diff --git a/extension/Tests/Unit/Core/BuildFormPlainTest.php b/extension/Tests/Unit/Core/BuildFormPlainTest.php index e02c38b16..2408ca7e0 100644 --- a/extension/Tests/Unit/Core/BuildFormPlainTest.php +++ b/extension/Tests/Unit/Core/BuildFormPlainTest.php @@ -409,7 +409,7 @@ class BuildFormPlainTest extends AbstractDatabaseTest { // DEBUG throw new \UserFormException(json_encode( - [ERROR_MESSAGE_TO_USER => print_r([is_readable(Path::cwdToApp(Path::APP_TO_TYPO3_CONF, CONFIG_T3)), Path::cwdToApp(Path::APP_TO_TYPO3_CONF, CONFIG_T3)], true), + [ERROR_MESSAGE_TO_USER => print_r([is_readable(Path::cwdToApp(Path::APP_TO_TYPO3_CONF, CONFIG_T3)) ? 'YES' : 'NO', Path::cwdToApp(Path::APP_TO_TYPO3_CONF, CONFIG_T3)], true), ERROR_MESSAGE_TO_DEVELOPER => FE_DND_TABLE . ' or ' . SUBRECORD_PARAMETER_FORM]), ERROR_MISSING_TABLE_NAME); // END DEBUG -- GitLab From ee12f05b827d8929220731d085fec286971f40b2 Mon Sep 17 00:00:00 2001 From: Marc Egger <marc.egger@uzh.ch> Date: Wed, 14 Oct 2020 16:20:36 +0200 Subject: [PATCH 151/195] Tablesorter-view-saver: Sanitize base64 encoding --- extension/Classes/Core/QuickFormQuery.php | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/extension/Classes/Core/QuickFormQuery.php b/extension/Classes/Core/QuickFormQuery.php index bae3aba9e..ed7b7b8c6 100644 --- a/extension/Classes/Core/QuickFormQuery.php +++ b/extension/Classes/Core/QuickFormQuery.php @@ -1972,8 +1972,11 @@ class QuickFormQuery { throw new \UserReportException("Name too long (max. 64 characters).", ERROR_TABLESORTER_NAME_TOO_LONG); } - // The $view is base64 encoded. + // The $view is base64 encoded. javascript base64 Alphabet: "A-Z", "a-z", "0-9", "+", "/" and "=" $view = Store::getVar(SETTING_TABLESORTER_VIEW, STORE_CLIENT, SANITIZE_ALLOW_ALLBUT); + if (preg_match("#^[A-Za-z0-9+/=]*$#", $view)) { + throw new \UserReportException("Encoding error of table data. This should not happen. Please contact support.", ERROR_TABLESORTER_INVALID_CHAR); + } $rows = $this->dbArray[$this->dbIndexQfq]->sql( 'SELECT `sett`.`id`, `sett`.`readonly` FROM `' . SETTING_TABLE_NAME . '` AS sett WHERE `tableId`=? AND `name`=? AND IF(?, public, feUser=? AND !public)', -- GitLab From 43b9f1db3692f187f40f77ef1a71f17ca5064387 Mon Sep 17 00:00:00 2001 From: Marc Egger <marc.egger@uzh.ch> Date: Wed, 14 Oct 2020 16:24:56 +0200 Subject: [PATCH 152/195] debug phpunit --- extension/Tests/Unit/Core/BuildFormPlainTest.php | 7 ------- 1 file changed, 7 deletions(-) diff --git a/extension/Tests/Unit/Core/BuildFormPlainTest.php b/extension/Tests/Unit/Core/BuildFormPlainTest.php index 2408ca7e0..1d0b43db3 100644 --- a/extension/Tests/Unit/Core/BuildFormPlainTest.php +++ b/extension/Tests/Unit/Core/BuildFormPlainTest.php @@ -407,13 +407,6 @@ class BuildFormPlainTest extends AbstractDatabaseTest { $formElement[SUBRECORD_PARAMETER_FORM] = 'Person'; $formElement[FE_SUBRECORD_OPTION] = ''; - // DEBUG - throw new \UserFormException(json_encode( - [ERROR_MESSAGE_TO_USER => print_r([is_readable(Path::cwdToApp(Path::APP_TO_TYPO3_CONF, CONFIG_T3)) ? 'YES' : 'NO', Path::cwdToApp(Path::APP_TO_TYPO3_CONF, CONFIG_T3)], true), - ERROR_MESSAGE_TO_DEVELOPER => FE_DND_TABLE . ' or ' . SUBRECORD_PARAMETER_FORM]), - ERROR_MISSING_TABLE_NAME); - // END DEBUG - $result = $build->buildSubrecord($formElement, 'name:1', '', $json); $this->assertEquals('<table class="table table-hover qfq-subrecord-table qfq-color-grey-2" id="1-123" ><thead><tr><th>id</th><th>name</th><th>firstName</th></tr></thead><tbody ><tr class="record" ><td><span class="text-muted">1</span></td><td>Doe</td><td>John</td></tr><tr class="record" ><td><span class="text-muted">2</span></td><td>Smith</td><td>Jane</td></tr></tbody></table>', $result); // $this->assertEquals('Please save this record first.', $result); -- GitLab From 06d1e9fc2a72fdd27604712ccd8ba90c392899b4 Mon Sep 17 00:00:00 2001 From: Marc Egger <marc.egger@uzh.ch> Date: Wed, 14 Oct 2020 17:31:42 +0200 Subject: [PATCH 153/195] form as file: change backup file name convention (date with -_) --- extension/Classes/Core/Form/FormAsFile.php | 4 ++-- extension/Classes/Core/Report/ReportAsFile.php | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/extension/Classes/Core/Form/FormAsFile.php b/extension/Classes/Core/Form/FormAsFile.php index 9dbc8d66c..04c769b16 100644 --- a/extension/Classes/Core/Form/FormAsFile.php +++ b/extension/Classes/Core/Form/FormAsFile.php @@ -750,12 +750,12 @@ class FormAsFile } } - $cwdToBackupFile = Path::join($cwdToBackup, $formName . '.' . date('YmdHis') . ".$tag.json"); + $cwdToBackupFile = Path::join($cwdToBackup, $formName . '.' . date('Y-m-d_H-i-s') . ".$tag.json"); // add index to filename if backup file with current timestamp already exists $index = 1; while (file_exists($cwdToBackupFile)) { - $cwdToBackupFile = Path::join($cwdToBackup, $formName . '.' . date('YmdHis') . ".$index.$tag.json"); + $cwdToBackupFile = Path::join($cwdToBackup, $formName . '.' . date('Y-m-d_H-i-s') . ".$index.$tag.json"); $index ++; if ($index > 100) { Thrower::userFormException('Error while trying to backup form file.', 'Infinite loop.'); diff --git a/extension/Classes/Core/Report/ReportAsFile.php b/extension/Classes/Core/Report/ReportAsFile.php index d6d9ab993..a0952b38c 100644 --- a/extension/Classes/Core/Report/ReportAsFile.php +++ b/extension/Classes/Core/Report/ReportAsFile.php @@ -215,12 +215,12 @@ class ReportAsFile } } - $cwdToBackupFile = Path::join($cwdToBackup, basename($cwdToReportFile, REPORT_FILE_EXTENSION) . '.' . date('YmdHis') . ".json"); + $cwdToBackupFile = Path::join($cwdToBackup, basename($cwdToReportFile, REPORT_FILE_EXTENSION) . '.' . date('Y-m-d_H-i-s') . ".json"); // add index to filename if backup file with current timestamp already exists $index = 1; while (file_exists($cwdToBackupFile)) { - $cwdToBackupFile = Path::join($cwdToBackup, basename($cwdToReportFile, REPORT_FILE_EXTENSION) . '.' . date('YmdHis') . ".$index.json"); + $cwdToBackupFile = Path::join($cwdToBackup, basename($cwdToReportFile, REPORT_FILE_EXTENSION) . '.' . date('Y-m-d_H-i-s') . ".$index.json"); $index ++; if ($index > 100) { Thrower::userFormException('Error while trying to backup report file.', 'Infinite loop.'); -- GitLab From ac23dadfa73319bd4bb2910669151f2362172a01 Mon Sep 17 00:00:00 2001 From: Marc Egger <marc.egger@uzh.ch> Date: Wed, 14 Oct 2020 18:11:51 +0200 Subject: [PATCH 154/195] form as file: dont delete db forms on database update --- extension/Classes/Core/Database/DatabaseUpdate.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/extension/Classes/Core/Database/DatabaseUpdate.php b/extension/Classes/Core/Database/DatabaseUpdate.php index b62cc0d6b..b013e2ad0 100644 --- a/extension/Classes/Core/Database/DatabaseUpdate.php +++ b/extension/Classes/Core/Database/DatabaseUpdate.php @@ -155,8 +155,8 @@ class DatabaseUpdate { if ($old !== false) { // If Form table exists, import all form files so everything is up to date. - // Note: Creates path and exports all forms to it, if it doesn't exist - FormAsFile::importAllForms($this->db, true, true); + // Note: Creates path and exports all forms first if the form directory does not exist. + FormAsFile::importAllForms($this->db, true); } $this->db->playSqlFile(__DIR__ . '/../../Sql/formEditor.sql'); -- GitLab From 523eb18d507123416f23bc98997bfb6316f3f758 Mon Sep 17 00:00:00 2001 From: Marc Egger <marc.egger@uzh.ch> Date: Thu, 15 Oct 2020 11:30:03 +0200 Subject: [PATCH 155/195] form as file: rethink update procedure (make simpler, don't delete anything) --- .../Classes/Core/Database/DatabaseUpdate.php | 23 +++++++++---------- extension/Classes/Core/Helper/SqlQuery.php | 11 +++++++++ 2 files changed, 22 insertions(+), 12 deletions(-) diff --git a/extension/Classes/Core/Database/DatabaseUpdate.php b/extension/Classes/Core/Database/DatabaseUpdate.php index b013e2ad0..27dcb3ffa 100644 --- a/extension/Classes/Core/Database/DatabaseUpdate.php +++ b/extension/Classes/Core/Database/DatabaseUpdate.php @@ -153,21 +153,20 @@ class DatabaseUpdate { $this->dbUpdateStatements($old, $new); - if ($old !== false) { + if ($this->db->existTable('Form')) { // If Form table exists, import all form files so everything is up to date. - // Note: Creates path and exports all forms first if the form directory does not exist. - FormAsFile::importAllForms($this->db, true); - } - - $this->db->playSqlFile(__DIR__ . '/../../Sql/formEditor.sql'); + FormAsFile::importAllForms($this->db, true); // Note: Creates path and exports all forms first if the form directory does not exist. - if ($old === false) { - // new installation: export native qfq forms + import existing user forms - FormAsFIle::exportAllForms($this->db, false); - FormAsFile::importAllForms($this->db); + // create Form table and export all system forms + $this->db->playSqlFile(__DIR__ . '/../../Sql/formEditor.sql'); + FormAsFIle::exportAllForms($this->db); } else { - // Existing installation: export forms + delete files which were removed since the import above - FormAsFIle::exportAllForms($this->db, true); + // If not, then create Form table and export all system forms + $this->db->playSqlFile(__DIR__ . '/../../Sql/formEditor.sql'); + FormAsFIle::exportAllForms($this->db); + + // import form files which existed before the new installation + FormAsFile::importAllForms($this->db, true); } Logger::logMessage(date('Y.m.d H:i:s ') . ": Updated from QFQ version '$old' to '$new'", Path::absoluteQfqLogFile()); diff --git a/extension/Classes/Core/Helper/SqlQuery.php b/extension/Classes/Core/Helper/SqlQuery.php index 53e9fafbd..4bf6920ab 100644 --- a/extension/Classes/Core/Helper/SqlQuery.php +++ b/extension/Classes/Core/Helper/SqlQuery.php @@ -102,6 +102,17 @@ class SqlQuery { return array($sql, [$feId]); } + /** + * @param string $tableName + * @param array|null $columnsToSelect + * @return array + */ + public static function selectInformationSchemaByTableName(string $tableName, array $columnsToSelect = null): array + { + $sql = "SELECT" . self::columnListSelect($columnsToSelect) . "FROM information_schema.tables WHERE `table_name` = '$tableName' LIMIT 1;"; + return array($sql, [$tableName]); + } + /** * @param array|null $columns * @return string -- GitLab From 9a50443c7ec4169ad58153cbfec7cec86ea43839 Mon Sep 17 00:00:00 2001 From: Marc Egger <marc.egger@uzh.ch> Date: Thu, 15 Oct 2020 12:34:27 +0200 Subject: [PATCH 156/195] form as file: make log entry if column names were adjusted --- extension/Classes/Core/Form/FormAsFile.php | 1 + 1 file changed, 1 insertion(+) diff --git a/extension/Classes/Core/Form/FormAsFile.php b/extension/Classes/Core/Form/FormAsFile.php index 04c769b16..9fe993ca6 100644 --- a/extension/Classes/Core/Form/FormAsFile.php +++ b/extension/Classes/Core/Form/FormAsFile.php @@ -171,6 +171,7 @@ class FormAsFile // some column names where adjusted => import form if ($adjustContainerName) { + Logger::logMessage(date('Y.m.d H:i:s ') . ": Importing form file '$pathFileName'. Reason: Empty or non-unique names of container formElements where adjusted during form export.", Path::absoluteQfqLogFile()); self::importForm($formName, $database); // otherwise => Update column fileStats -- GitLab From d12cb1483450a5316c0157dc3f1dba58f945c292 Mon Sep 17 00:00:00 2001 From: Marc Egger <marc.egger@uzh.ch> Date: Thu, 15 Oct 2020 13:08:23 +0200 Subject: [PATCH 157/195] debug gitlab ci --- Makefile | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Makefile b/Makefile index 28e67aabe..2b0052f1c 100644 --- a/Makefile +++ b/Makefile @@ -117,15 +117,15 @@ phpunit: cd extension; composer update # create deprecated test config files and get test database password from environment variable - cp -v extension/Tests/phpunit_config.qfq.php extension/config.qfq.php; sed -i "s/#PHPUNIT_PASSWORD#/$(PHPUNIT_MYSQL_PASSWORD)/" extension/config.qfq.php - cp -v extension/Tests/phpunit_LocalConfiguration.php extension/LocalConfiguration.php + # cp -v extension/Tests/phpunit_config.qfq.php extension/config.qfq.php; sed -i "s/#PHPUNIT_PASSWORD#/$(PHPUNIT_MYSQL_PASSWORD)/" extension/config.qfq.php + # cp -v extension/Tests/phpunit_LocalConfiguration.php extension/LocalConfiguration.php # mock typo3 directory structure mkdir -p typo3conf/ext/qfq mv -v extension/* typo3conf/ext/qfq/ # create new kind of config (qfq.json) - cp -v typo3conf/ext/qfq/Tests/phpunit_qfq.json typo3conf/ext/qfq.json; sed -i "s/#PHPUNIT_PASSWORD#/$(PHPUNIT_MYSQL_PASSWORD)/" typo3conf/ext/qfq.json + # cp -v typo3conf/ext/qfq/Tests/phpunit_qfq.json typo3conf/ext/qfq.json; sed -i "s/#PHPUNIT_PASSWORD#/$(PHPUNIT_MYSQL_PASSWORD)/" typo3conf/ext/qfq.json cp -v typo3conf/ext/qfq/Tests/phpunit_qfq.json ../qfq.json; sed -i "s/#PHPUNIT_PASSWORD#/$(PHPUNIT_MYSQL_PASSWORD)/" ../qfq.json cp -v typo3conf/ext/qfq/Tests/phpunit_LocalConfiguration.php typo3conf/LocalConfiguration.php -- GitLab From 0ee921d5bda94c708c9480753544856bcb2efb03 Mon Sep 17 00:00:00 2001 From: Marc Egger <marc.egger@uzh.ch> Date: Thu, 15 Oct 2020 13:16:41 +0200 Subject: [PATCH 158/195] fix selenium gitlabci --- Makefile | 5 ----- extension/Tests/selenium/qfqselenium.py | 3 +++ 2 files changed, 3 insertions(+), 5 deletions(-) diff --git a/Makefile b/Makefile index 2b0052f1c..0e7a457bb 100644 --- a/Makefile +++ b/Makefile @@ -116,16 +116,11 @@ phpunit: # update composer with dev to install phpunit package cd extension; composer update - # create deprecated test config files and get test database password from environment variable - # cp -v extension/Tests/phpunit_config.qfq.php extension/config.qfq.php; sed -i "s/#PHPUNIT_PASSWORD#/$(PHPUNIT_MYSQL_PASSWORD)/" extension/config.qfq.php - # cp -v extension/Tests/phpunit_LocalConfiguration.php extension/LocalConfiguration.php - # mock typo3 directory structure mkdir -p typo3conf/ext/qfq mv -v extension/* typo3conf/ext/qfq/ # create new kind of config (qfq.json) - # cp -v typo3conf/ext/qfq/Tests/phpunit_qfq.json typo3conf/ext/qfq.json; sed -i "s/#PHPUNIT_PASSWORD#/$(PHPUNIT_MYSQL_PASSWORD)/" typo3conf/ext/qfq.json cp -v typo3conf/ext/qfq/Tests/phpunit_qfq.json ../qfq.json; sed -i "s/#PHPUNIT_PASSWORD#/$(PHPUNIT_MYSQL_PASSWORD)/" ../qfq.json cp -v typo3conf/ext/qfq/Tests/phpunit_LocalConfiguration.php typo3conf/LocalConfiguration.php diff --git a/extension/Tests/selenium/qfqselenium.py b/extension/Tests/selenium/qfqselenium.py index fcdf724d7..7c6dcb1a9 100644 --- a/extension/Tests/selenium/qfqselenium.py +++ b/extension/Tests/selenium/qfqselenium.py @@ -112,6 +112,9 @@ class QfqSeleniumTestCase(unittest.TestCase): cls.driver.set_window_size(1920, 1080) cls.driver.implicitly_wait(5) + def __init__(self, *args, **kwargs): + super(QfqSeleniumTestCase, self).__init__() + @classmethod def tearDownClass(cls): """ -- GitLab From df4833dbd3585a89c5f496d9fdad995dc05e0f86 Mon Sep 17 00:00:00 2001 From: Marc Egger <marc.egger@uzh.ch> Date: Thu, 15 Oct 2020 14:09:48 +0200 Subject: [PATCH 159/195] fix selenium gitlabci --- extension/Classes/Core/Helper/Path.php | 2 +- extension/Tests/selenium/qfqselenium.py | 3 --- 2 files changed, 1 insertion(+), 4 deletions(-) diff --git a/extension/Classes/Core/Helper/Path.php b/extension/Classes/Core/Helper/Path.php index 2af5aa94d..cac9a0381 100644 --- a/extension/Classes/Core/Helper/Path.php +++ b/extension/Classes/Core/Helper/Path.php @@ -74,7 +74,7 @@ class Path const APP_TO_THUMBNAIL_UNKNOWN_TYPE = 'typo3/sysext/frontend/Resources/Public/Icons/FileIcons/'; // Send Email - const EXT_TO_SEND_EMAIL_FILE = '/Classes/External/sendEmail'; + const EXT_TO_SEND_EMAIL_FILE = 'Classes/External/sendEmail'; /** * Manually set the paths which are not constant nor can be inferred by other paths. diff --git a/extension/Tests/selenium/qfqselenium.py b/extension/Tests/selenium/qfqselenium.py index 7c6dcb1a9..fcdf724d7 100644 --- a/extension/Tests/selenium/qfqselenium.py +++ b/extension/Tests/selenium/qfqselenium.py @@ -112,9 +112,6 @@ class QfqSeleniumTestCase(unittest.TestCase): cls.driver.set_window_size(1920, 1080) cls.driver.implicitly_wait(5) - def __init__(self, *args, **kwargs): - super(QfqSeleniumTestCase, self).__init__() - @classmethod def tearDownClass(cls): """ -- GitLab From fe15d0eba619eba93466be00614e80e73a51da2a Mon Sep 17 00:00:00 2001 From: Marc Egger <marc.egger@uzh.ch> Date: Thu, 15 Oct 2020 14:48:34 +0200 Subject: [PATCH 160/195] fix selenium gitlabci --- extension/Tests/selenium/test_basic_functionality.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/extension/Tests/selenium/test_basic_functionality.py b/extension/Tests/selenium/test_basic_functionality.py index a005745c2..229ed7c6d 100644 --- a/extension/Tests/selenium/test_basic_functionality.py +++ b/extension/Tests/selenium/test_basic_functionality.py @@ -8,7 +8,7 @@ class TestBasicFunctionality(qfqselenium.QfqSeleniumTestCase): this class contains the tests to test the implementation of qfq itself. """ basic_form_report_path = "index.php?id=basicform" - basic_form_report_header_text = "Basic Form Report Page" + basic_form_report_header_text = "basicForm" # Buttons on report page (data-reference) button_new_record_ref = "addBasicData" -- GitLab From fa29573c58bdb4fbc74baf9cfb2a1fe5f3f12c30 Mon Sep 17 00:00:00 2001 From: Marc Egger <marc.egger@uzh.ch> Date: Mon, 19 Oct 2020 16:38:37 +0200 Subject: [PATCH 161/195] add a lot of documentation. --- Documentation/Form.rst | 15 ++++- Documentation/Installation.rst | 77 ++++++++++++++++++-------- Documentation/Report.rst | 28 ++++++++++ extension/Classes/Core/Helper/Path.php | 18 +++--- extension/example.qfq.json | 14 +++++ 5 files changed, 120 insertions(+), 32 deletions(-) create mode 100644 extension/example.qfq.json diff --git a/Documentation/Form.rst b/Documentation/Form.rst index 603809d50..5d7a35e20 100644 --- a/Documentation/Form.rst +++ b/Documentation/Form.rst @@ -92,6 +92,8 @@ General * With the `Dynamic` option, it's easily possible to use one Typo3 page and display different forms on that specific page. +* Forms are synced between the database and form files. See :ref:`formAsfile`. + Form process order ------------------ @@ -3459,6 +3461,8 @@ Table: Person Import/merge form ----------------- +* ATTENTION * : This currently does not work. To copy merge forms you may just copy/merge the form files. See :ref:`formAsFile`. + The form `copyFormFromExt` copies a form from table `ExtForm / ExtFormElement` to `Form / FormElement`. The import/merge form: @@ -3481,4 +3485,13 @@ If there are several T3/QFQ instances and if forms should be imported frequently 'import Forms from db xyz' like: :: 10.sql = CREATE OR REPLACE table ExtForm SELECT * FROM <db xyz>.Form - 20.sql = CREATE OR REPLACE table ExtFormElement SELECT * FROM <db xyz>.FormElement \ No newline at end of file + 20.sql = CREATE OR REPLACE table ExtFormElement SELECT * FROM <db xyz>.FormElement + + +.. _`formAsFile` + +Form As File +------------ + +* Forms are synced between the database and form files located in the form directory contained in the qfq project directory. See: :ref:`qfq-project-path-php` +* **ATTENTION** : Form and FormElement changes in the database are only registered if they are performed by the form editor. Otherwise they might get overwritten during the next file sync! diff --git a/Documentation/Installation.rst b/Documentation/Installation.rst index 463e928f1..e1e7ccef2 100644 --- a/Documentation/Installation.rst +++ b/Documentation/Installation.rst @@ -202,9 +202,10 @@ Setup * If the Extension Manager stops after importing: check your memory limit in php.ini. -* Copy/rename the file *<site path>/typo3conf/ext/qfq/config-example.qfq.php* to *<site path>/typo3conf/config.qfq.php*. +* Copy/rename the file *<site path>/typo3conf/ext/qfq/example.qfq.json* to *<site path>/fileadmin/protected/qfqProject/qfq.json*. Configure the necessary settings :ref:`configuration` The configuration file is outside of the extension directory, to not loose it during de-install and install again. + * When the QFQ Extension is called the first time on the Typo3 frontend, the file *<ext_dir>/Classes/Sql/formEditor.sql* will played and fills the database with the *Form editor* records. This also happens automatically after each update of QFQ. * Configure Typoscript to include Bootstrap, jQuery, QFQ javascript and CSS files. @@ -325,10 +326,38 @@ Installation: Check List Configuration ------------- -.. _config-qfq-php: +.. _qfq-project-path-php -config.qfq.php -^^^^^^^^^^^^^^ +qfq.project.path.php +^^^^^^^^^^^^^^^^^^^^ + +* The file `qfq.project.path.php` is located/created in the root directory of the application. (Where index.php is located) +* This file only returns the path to the qfq project directory where logs, config (`qfq.json`), report files and form files are located. +* If the file does not exist, it is created and the project path is set as follows: + * Does the deprecated config file typo3conf/config.qfq.php exist? Then set the qfq project path to `fileadmin/protected/qfqProject` (config is migrated automatically to qfqProject). + * If not, does `fileadmin/protected exist`? Then set the qfq project path to `fileadmin/protected/qfqProject`. + * If not, then set qfq project path to `../` (i.e. outside the app directory where index.php is located) + +Example: *typo3conf/config.qfq.php*: :: + + <?php + + /** + QFQ project path configuration + !! ATTENTION !!: The files in the project directory should NOT be served by your http server! + Only exception: The app directory inside the project directory may be served. + */ + + return 'fileadmin/protected/qfqProject'; // path relative to app directory (i.e. location of this file). + + +.. _qfq.json + +qfq.json +^^^^^^^^ + +* Additionally to the keywords bellow one can also override the configuration values defined in the Typo3 extension manager: :ref:`extension-manager-qfq-configuration` + * e.g. if `qfq.json` contains `"flagProduction":"no"` then this value is taken instead of the one set in the extension manager. +-------------------------------+-------------------------------------------------------+----------------------------------------------------------------------------+ | Keyword | Example | Description | @@ -345,38 +374,36 @@ config.qfq.php | LDAP_1_PASSWORD | LDAP_1_PASSWORD='mySecurePassword' | | +-------------------------------+-------------------------------------------------------+----------------------------------------------------------------------------+ +Example: *fileadmin/protected/qfqProject/qfq.json*: :: -Example: *typo3conf/config.qfq.php*: :: - - <?php + { + "DB_1_USER": "<DBUSER>", + "DB_1_SERVER": "<DBSERVER>", + "DB_1_PASSWORD": "<DBPW>", + "DB_1_NAME": "<DB>", - // QFQ configuration - // - // Save this file as: <site path>/typo3conf/config.qfq.php + "DB_2_USER": "<OPTIONAL DBUSER>", + "DB_2_SERVER": "<OPTIONAL DBSERVER>", + "DB_2_PASSWORD": "<OPTIONAL DBPW>", + "DB_2_NAME": "<OPTIONAL DB>", - return [ - 'DB_1_USER' => '<DBUSER>', - 'DB_1_SERVER' => '<DBSERVER>', - 'DB_1_PASSWORD' => '<DBPW>', - 'DB_1_NAME' => '<DB>', + "LDAP_1_RDN": "<OPTIONAL> ou=Admin,ou=example,dc=com", + "LDAP_1_PASSWORD": "<OPTIONAL> mySecurePassword" + } - //DB_2_USER => <DBUSER> - //DB_2_SERVER => <DBSERVER> - //DB_2_PASSWORD => <DBPW> - //DB_2_NAME => <DB> +.. _config-qfq-php: - // DB_n ... - // ... +config.qfq.php +^^^^^^^^^^^^^^ - // LDAP_1_RDN => 'ou=Admin,ou=example,dc=com' - // LDAP_1_PASSWORD => 'mySecurePassword' - ]; +**DEPRECATED** : use `qfq.json` as described above. :ref:`qfq.json` .. _extension-manager-qfq-configuration: Extension Manager: QFQ Configuration ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +* These configuration values can be overwritten by `qfq.json`. :ref:`qfq.json` +-----------------------------------+-------------------------------------------------------+----------------------------------------------------------------------------+ | Keyword | Default / Example | Description | @@ -418,6 +445,8 @@ Extension Manager: QFQ Configuration | documentation | http://docs.typo3.org... | Link to the online documentation of QFQ. Every QFQ installation also | | | | contains a local copy: typo3conf/ext/qfq/Documentation/html/Manual.html | +-----------------------------------+-------------------------------------------------------+----------------------------------------------------------------------------+ +| reportAsFileAutoExport | no | Auto export of qfq reports to files. See :ref:`reportAsFile` | ++-----------------------------------+-------------------------------------------------------+----------------------------------------------------------------------------+ | Dynamic | +-----------------------------------+-------------------------------------------------------+----------------------------------------------------------------------------+ | fillStoreSystemBySql1/2/3 | SELECT s.id AS ... | Specific values read from the database to fill the system store during QFQ | diff --git a/Documentation/Report.rst b/Documentation/Report.rst index dbcdfdd5f..f45572941 100644 --- a/Documentation/Report.rst +++ b/Documentation/Report.rst @@ -2824,6 +2824,34 @@ Example:: ]}'> </div> +.. _reportAsFile: + +Report As File +-------------- + +* If the toplevel token `file` is present inside the body of a QFQ tt-content element then the given report file is loaded and rendered. + * The tt-content body is ignored in that case. +* The path to the report file must be given relative to the report directory inside the qfq project directory. See :ref:`qfq-project-path-php` +* If the QFQ setting `reportAsFileAutoExport` (see :ref:`extension-manager-qfq-configuration`) is enabled, then every QFQ tt-content element which does not contain the `file` keyword is exported automatically when the report is rendered the first time. + * The path of the created file is given by the typo3 page structure + * The tt-content element body is replaced with `file=<path-to-new-file>` + +Example tt-content body:: + + file=Home/myPage/qfq-report.qfqr + + # Everything else is ignored!! + 10.sql = SELECT 'This is ignored!!' + +Example Home/myPage/qfq-report.qfqr:: + + # Some comment + 10.sql = SELECT 'The file content is executed.' + +Example of rendered report:: + + The file content is executed. + Report Examples --------------- diff --git a/extension/Classes/Core/Helper/Path.php b/extension/Classes/Core/Helper/Path.php index cac9a0381..d0d46a07f 100644 --- a/extension/Classes/Core/Helper/Path.php +++ b/extension/Classes/Core/Helper/Path.php @@ -48,7 +48,8 @@ class Path // QFQ Project dir private static $appToProject = null; private const APP_TO_PROJECT_DEFAULT = '../'; - private const APP_TO_PROJECT_MIGRATE = 'fileadmin/protected/qfqProject'; + private const APP_TO_PROJECT_IN_PROTECTED = 'fileadmin/protected/qfqProject'; + private const APP_TO_PROTECTED = 'fileadmin/protected'; const PROJECT_TO_FORM = 'form'; const FORM_TO_FORM_BACKUP = '_backup'; const PROJECT_DIR_TO_REPORT = 'report'; @@ -426,10 +427,17 @@ class Path // does the deprecated config.qfq.php exist? => migrate to qfq.json } elseif (HelperFile::isReadableException(self::cwdToApp(self::APP_TO_TYPO3_CONF, CONFIG_QFQ_PHP))) { - self::setAppToProject(self::APP_TO_PROJECT_MIGRATE); + self::setAppToProject(self::APP_TO_PROJECT_IN_PROTECTED); self::writeProjectPathPhp(); Config::migrateConfigPhpToJson(); + // does fileadmin/protected exist? => set fileadmin/protected/qfqProject as project path + } elseif (file_exists(self::cwdToApp(self::APP_TO_PROTECTED))) { + $cwdToProject = self::cwdToApp(self::APP_TO_PROJECT_IN_PROTECTED); + HelperFile::createPathRecursive($cwdToProject); + self::setAppToProject($cwdToProject); + self::writeProjectPathPhp(); + // create qfq.project.path.php at default location } else { self::setAppToProject(self::APP_TO_PROJECT_DEFAULT); @@ -450,11 +458,7 @@ class Path /** QFQ project path configuration - -******************************************************-----******************************** -* ATTENTION: The files in the project directory should NOT be served by your http server! * -******************************************************-----******************************** - +!! ATTENTION !!: The files in the project directory should NOT be served by your http server! Only exception: The app directory inside the project directory may be served. */ diff --git a/extension/example.qfq.json b/extension/example.qfq.json new file mode 100644 index 000000000..3b952e9ae --- /dev/null +++ b/extension/example.qfq.json @@ -0,0 +1,14 @@ +{ + "DB_1_USER": "<DBUSER>", + "DB_1_SERVER": "<DBSERVER>", + "DB_1_PASSWORD": "<DBPW>", + "DB_1_NAME": "<DB>", + + "DB_2_USER": "<OPTIONAL DBUSER>", + "DB_2_SERVER": "<OPTIONAL DBSERVER>", + "DB_2_PASSWORD": "<OPTIONAL DBPW>", + "DB_2_NAME": "<OPTIONAL DB>", + + "LDAP_1_RDN": "<OPTIONAL> ou=Admin,ou=example,dc=com", + "LDAP_1_PASSWORD": "<OPTIONAL> mySecurePassword" +} \ No newline at end of file -- GitLab From ad5e0dfa6f3c4446782b59bff095f3513b29d97f Mon Sep 17 00:00:00 2001 From: Marc Egger <marc.egger@uzh.ch> Date: Mon, 19 Oct 2020 19:08:39 +0200 Subject: [PATCH 162/195] form as file: dont delete DB form if it was never exported --- extension/Classes/Core/Form/FormAsFile.php | 45 ++++++++++++++++------ 1 file changed, 34 insertions(+), 11 deletions(-) diff --git a/extension/Classes/Core/Form/FormAsFile.php b/extension/Classes/Core/Form/FormAsFile.php index 9fe993ca6..5aada1efd 100644 --- a/extension/Classes/Core/Form/FormAsFile.php +++ b/extension/Classes/Core/Form/FormAsFile.php @@ -18,6 +18,7 @@ class FormAsFile /** * Remove the form from the DB and insert it using the form file. (only if the form file was changed) * If the form file can't be read, then the form is deleted from the DB and an exception is thrown. + * If the form exists only in the DB and was never exported, then it is exported. * * - Form file location: SYSTEM_FORM_FILE_PATH * - Recognize form file change: Compare the current file stats with the ones saved in the Form table. @@ -33,7 +34,15 @@ class FormAsFile */ public static function importForm(string $formName, Database $database): bool { - // Get file stats both from file system and DB and exit if they are equal + // Export form from DB if it was never exported before + list($sql, $parameterArray) = SqlQuery::selectFormByName($formName, [F_ID, F_FILE_STATS]); + $formFromDb = $database->sql($sql, ROW_EXPECT_0_1, + $parameterArray, "Multiple forms with the same name: '$formName'"); + if (!isset($formFromDb[F_FILE_STATS]) || !self::isValidFileStats($formFromDb[F_FILE_STATS])) { + self::exportForm($formName, $database); + } + + // Get file stats from file system and exit if they are equal $cwdToFormFile = self::formPathFileName($formName, $database); $fileReadException = new \UserFormException(json_encode([ ERROR_MESSAGE_TO_USER => "Form file not found or missing permission: " . baseName($cwdToFormFile), @@ -48,9 +57,6 @@ class FormAsFile self::deleteFormDB($formName, $database, "Failed to read form file stats."); throw $fileReadException; } - list($sql, $parameterArray) = SqlQuery::selectFormByName($formName, [F_ID, F_FILE_STATS]); - $formFromDb = $database->sql($sql, ROW_EXPECT_0_1, - $parameterArray, "Multiple forms with the same name: '$formName'"); if (array_key_exists(F_FILE_STATS, $formFromDb) && $fileStatsNew === $formFromDb[F_FILE_STATS]) { return false; } @@ -362,7 +368,7 @@ class FormAsFile * * @param Database $database * @param bool $enforceWritable Throw exception if one of the form files is not writable by current user. - * @param bool $deleteFromDB Delete forms from DB if there are no corresponding form files. + * @param bool $deleteFromDB Delete forms from DB if there are no corresponding form files. Except if the form was never exported. * @throws \CodeException * @throws \DbException * @throws \UserFormException @@ -378,12 +384,12 @@ class FormAsFile } } - // Delete all forms which are in DB but not in files + // Delete all forms which are in DB but not in files. Except if they were never exported. if ($deleteFromDB) { $formNamesDB = self::queryAllFormNames($database); $formsToDelete = array_diff($formNamesDB, $formFileNames); foreach ($formsToDelete as $formToDelete) { - self::deleteFormDB($formToDelete, $database, "No corresponding form file found."); + self::deleteFormDB($formToDelete, $database, "No corresponding form file found.", true); } } } @@ -443,26 +449,43 @@ class FormAsFile } /** - * Delete form with given name and its form elements from DB + * Delete form with given name and its form elements from DB. + * If $keepIfNeverExported is set to true then the form is kept (i.e. exported) instead of deleted if the form was never exported yet. * * @param string $formName * @param Database $database * @param string $logMessageReason + * @param bool $keepIfNeverExported * @return void * @throws \CodeException * @throws \DbException * @throws \UserFormException */ - private static function deleteFormDB(string $formName, Database $database, string $logMessageReason = '') // : void + private static function deleteFormDB(string $formName, Database $database, string $logMessageReason = '', bool $keepIfNeverExported = false) // : void { - list($sql, $parameterArray) = SqlQuery::selectFormByName($formName, [F_ID]); + list($sql, $parameterArray) = SqlQuery::selectFormByName($formName, [F_ID, F_FILE_STATS]); $formFromDb = $database->sql($sql, ROW_EXPECT_0_1, $parameterArray, "Multiple forms with the same name: '$formName'"); - if (array_key_exists(F_ID, $formFromDb)) { + + if ($keepIfNeverExported && (isset($formFromDb[F_ID]) && !isset($formFromDb[F_FILE_STATS])) || (isset($formFromDb[F_FILE_STATS]) && !self::isValidFileStats($formFromDb[F_FILE_STATS]))) { + // export form instead of deleting since it was never exported before + self::exportForm($formName, $database); + } else if (array_key_exists(F_ID, $formFromDb)) { self::deleteFormDBWithId($formFromDb[F_ID], $database, $logMessageReason . " Form name '$formName'."); } } + /** + * Return true if the given string is a valid JSON encoded file stats string. + * Currently only checks if first char is '{' + * + * @param string $fileStats + * @return bool + */ + private static function isValidFileStats(string $fileStats) { + return substr($fileStats, 0, 1 ) === '{'; + } + /** * Delete form with given id and its form elements from DB * -- GitLab From e0cba001f9a4e71c0bd793d684e630990885fa8d Mon Sep 17 00:00:00 2001 From: Marc Egger <marc.egger@uzh.ch> Date: Tue, 20 Oct 2020 08:37:20 +0200 Subject: [PATCH 163/195] form as file: fix infinite loop when column names are adjusted --- extension/Classes/Core/Form/FormAsFile.php | 21 +++++++++++++-------- 1 file changed, 13 insertions(+), 8 deletions(-) diff --git a/extension/Classes/Core/Form/FormAsFile.php b/extension/Classes/Core/Form/FormAsFile.php index 5aada1efd..c603edac7 100644 --- a/extension/Classes/Core/Form/FormAsFile.php +++ b/extension/Classes/Core/Form/FormAsFile.php @@ -27,36 +27,41 @@ class FormAsFile * * @param string $formName * @param Database $database + * @param bool $keepIfNeverExported true: If the form was never exported and file not exists, then export the form from DB * @return bool True if form has been updated. * @throws \CodeException * @throws \DbException * @throws \UserFormException */ - public static function importForm(string $formName, Database $database): bool + public static function importForm(string $formName, Database $database, bool $keepIfNeverExported = true): bool { - // Export form from DB if it was never exported before + // Get file stats from database form list($sql, $parameterArray) = SqlQuery::selectFormByName($formName, [F_ID, F_FILE_STATS]); $formFromDb = $database->sql($sql, ROW_EXPECT_0_1, $parameterArray, "Multiple forms with the same name: '$formName'"); - if (!isset($formFromDb[F_FILE_STATS]) || !self::isValidFileStats($formFromDb[F_FILE_STATS])) { - self::exportForm($formName, $database); - } - // Get file stats from file system and exit if they are equal + // Get file stats from file system $cwdToFormFile = self::formPathFileName($formName, $database); $fileReadException = new \UserFormException(json_encode([ ERROR_MESSAGE_TO_USER => "Form file not found or missing permission: " . baseName($cwdToFormFile), ERROR_MESSAGE_TO_DEVELOPER => "Form definition file not found or no permission to read file: '$cwdToFormFile'"]), ERROR_FORM_NOT_FOUND); if(!file_exists($cwdToFormFile)) { - self::deleteFormDB($formName, $database, "No corresponding form file found."); - throw $fileReadException; + if ($keepIfNeverExported && (!isset($formFromDb[F_FILE_STATS]) || !self::isValidFileStats($formFromDb[F_FILE_STATS]))) { + // if file not exists and form was never exported, then export + self::exportForm($formName, $database); + } else { + self::deleteFormDB($formName, $database, "No corresponding form file found."); + throw $fileReadException; + } } $fileStatsNew = self::formFileStatsJson($cwdToFormFile); if ($fileStatsNew === false) { self::deleteFormDB($formName, $database, "Failed to read form file stats."); throw $fileReadException; } + + // if fileStats from DB and file are equal: do nothing if (array_key_exists(F_FILE_STATS, $formFromDb) && $fileStatsNew === $formFromDb[F_FILE_STATS]) { return false; } -- GitLab From 87f88d99cd31c02054f4c2fd0f9dce445cf1bc85 Mon Sep 17 00:00:00 2001 From: Marc Egger <marc.egger@uzh.ch> Date: Tue, 20 Oct 2020 16:25:01 +0200 Subject: [PATCH 164/195] fix monitor and keep modified date when changing form fileStats --- extension/Classes/Core/Constants.php | 1 + extension/Classes/Core/Form/Dirty.php | 8 ++++---- extension/Classes/Core/Form/FormAsFile.php | 10 +++++----- extension/Classes/Core/Report/Monitor.php | 2 +- 4 files changed, 11 insertions(+), 10 deletions(-) diff --git a/extension/Classes/Core/Constants.php b/extension/Classes/Core/Constants.php index 20757a5f5..5fd34a306 100644 --- a/extension/Classes/Core/Constants.php +++ b/extension/Classes/Core/Constants.php @@ -943,6 +943,7 @@ const F_DIRTY_MODE = 'dirtyMode'; const F_NOTE_INTERNAL = 'noteInternal'; const F_MULTI_SQL = 'multiSql'; const F_MULTI_COL_ID = 'id'; +const F_MODIFIED = 'modified'; const F_FILE_STATS = 'fileStats'; const F_SUBMIT_BUTTON_TEXT = 'submitButtonText'; diff --git a/extension/Classes/Core/Form/Dirty.php b/extension/Classes/Core/Form/Dirty.php index e8c829924..9f976f352 100644 --- a/extension/Classes/Core/Form/Dirty.php +++ b/extension/Classes/Core/Form/Dirty.php @@ -168,7 +168,7 @@ class Dirty { // Check for changed record. Compute $rcMd5 $flagModified = $this->isRecordModified($tableName, $primaryKey, $recordId, $recordHashMd5, $rcMd5); if (($recordHashMd5 != '') && $flagModified) { - return [API_STATUS => API_ANSWER_STATUS_CONFLICT, API_MESSAGE => 'The record has been modified in the meantime. Please reload the form, edit and save again.']; + return [API_STATUS => API_ANSWER_STATUS_CONFLICT, API_MESSAGE => 'The record has been modified in the meantime. Please reload the form, edit and save again. [1]']; } $feUser = $this->session->get(SESSION_FE_USER); @@ -237,7 +237,7 @@ class Dirty { // Compare modified timestamp if ($this->isRecordModified($recordDirty[DIRTY_TABLE_NAME], $primaryKey, $recordDirty[DIRTY_RECORD_ID], $recordDirty[DIRTY_RECORD_HASH_MD5], $dummy)) { - return [API_STATUS => API_ANSWER_STATUS_CONFLICT, API_MESSAGE => 'The record has been modified in the meantime. Please reload the form, edit and save again.']; + return [API_STATUS => API_ANSWER_STATUS_CONFLICT, API_MESSAGE => 'The record has been modified in the meantime. Please reload the form, edit and save again. [2]']; } if ($this->client[CLIENT_COOKIE_QFQ] == $recordDirty[DIRTY_QFQ_USER_SESSION_COOKIE]) { @@ -406,7 +406,7 @@ class Dirty { // Check if the record has changed in the meantime. if ($flagCheckModifiedFirst && $this->isRecordModified($tableName, $primaryKey, $recordId, $this->client[DIRTY_RECORD_HASH_MD5], $dummy)) { - throw new \UserFormException ('The record has been modified in the meantime. Please reload the form, edit and save again.', ERROR_DIRTY_RECORD_MODIFIED); + throw new \UserFormException ('The record has been modified in the meantime. Please reload the form, edit and save again. [3]', ERROR_DIRTY_RECORD_MODIFIED); } $lockStatus = $this->getCheckDirty($tableName, $recordId, $rcRecordDirty, $rcMsg); @@ -439,7 +439,7 @@ class Dirty { if ($lockStatus == LOCK_FOUND_OWNER) { // Check if the record has changed in the meantime. if ($this->isRecordModified($tableName, $primaryKey, $recordId, $rcRecordDirty[DIRTY_RECORD_HASH_MD5], $dummy)) { - return [API_STATUS => API_ANSWER_STATUS_CONFLICT, API_MESSAGE => 'The record has been modified in the meantime. Please reload the form, edit and save again.']; + return [API_STATUS => API_ANSWER_STATUS_CONFLICT, API_MESSAGE => 'The record has been modified in the meantime. Please reload the form, edit and save again. [4]']; } // Clear the lock diff --git a/extension/Classes/Core/Form/FormAsFile.php b/extension/Classes/Core/Form/FormAsFile.php index c603edac7..feaae4bf5 100644 --- a/extension/Classes/Core/Form/FormAsFile.php +++ b/extension/Classes/Core/Form/FormAsFile.php @@ -172,7 +172,7 @@ class FormAsFile */ public static function exportForm(string $formName, Database $database, ?int $formId = null) // : void { - list($formName, $formId, $formJson, $adjustContainerName) = self::formToJson($formName, $database, $formId); + list($formName, $formId, $formJson, $adjustContainerName, $form) = self::formToJson($formName, $database, $formId); // backup and write file $pathFileName = self::formPathFileName($formName, $database); @@ -188,7 +188,7 @@ class FormAsFile // otherwise => Update column fileStats } else { $fileStats = self::formFileStatsJson($pathFileName); - list($sql, $parameterArray) = SqlQuery::updateRecord(TABLE_NAME_FORM, [F_FILE_STATS => $fileStats], $formId); + list($sql, $parameterArray) = SqlQuery::updateRecord(TABLE_NAME_FORM, [F_FILE_STATS => $fileStats, F_MODIFIED => $form[F_MODIFIED]], $formId); $database->sql($sql, ROW_REGULAR, $parameterArray); } } @@ -680,7 +680,7 @@ class FormAsFile * @param string $formName * @param Database $database * @param int|null $formId If given, $formName is ignored - * @return array [$formName, $formId, $formJson, $adjustedContainerNames > 0] + * @return array [string $formName, int $formId, string $formJson, bool ($adjustedContainerNames > 0), array $form] * @throws \CodeException * @throws \DbException * @throws \UserFormException @@ -756,7 +756,7 @@ class FormAsFile // add form elements and create json $form[F_FILE_FORM_ELEMENT] = $formElements; $formJson = json_encode($form, JSON_PRETTY_PRINT); - return array($formName, $formId, $formJson, $adjustedContainerNames > 0); + return array($formName, $formId, $formJson, $adjustedContainerNames > 0, $form); } /** @@ -786,7 +786,7 @@ class FormAsFile while (file_exists($cwdToBackupFile)) { $cwdToBackupFile = Path::join($cwdToBackup, $formName . '.' . date('Y-m-d_H-i-s') . ".$index.$tag.json"); $index ++; - if ($index > 100) { + if ($index > 20) { Thrower::userFormException('Error while trying to backup form file.', 'Infinite loop.'); } } diff --git a/extension/Classes/Core/Report/Monitor.php b/extension/Classes/Core/Report/Monitor.php index 5048ee7e2..6f8d30033 100644 --- a/extension/Classes/Core/Report/Monitor.php +++ b/extension/Classes/Core/Report/Monitor.php @@ -87,7 +87,7 @@ class Monitor { <script type="text/javascript"> $(document).ready(function () { var getFile = new QfqNS.DisplayFile({ - webworker: $webworker, + webworker: "$webworker", filePath: "$url", interval: $interval, targetId: "$htmlId", -- GitLab From e87a2421dd29ab8f51fabd3d0bf4313d565fefc9 Mon Sep 17 00:00:00 2001 From: Marc Egger <marc.egger@uzh.ch> Date: Tue, 20 Oct 2020 17:40:26 +0200 Subject: [PATCH 165/195] inline editor: fix html entity bug --- extension/Classes/Core/Helper/Path.php | 4 ++++ extension/Classes/Core/QuickFormQuery.php | 9 ++++++++- extension/Classes/Core/Report/Monitor.php | 4 ++-- 3 files changed, 14 insertions(+), 3 deletions(-) diff --git a/extension/Classes/Core/Helper/Path.php b/extension/Classes/Core/Helper/Path.php index d0d46a07f..a32377503 100644 --- a/extension/Classes/Core/Helper/Path.php +++ b/extension/Classes/Core/Helper/Path.php @@ -35,6 +35,10 @@ class Path const EXT_TO_API = 'Classes/Api'; const API_TO_APP = '../../../../../'; // TODO: make relatvie to ext instead + // Javascript + const EXT_TO_JAVASCRIPT = 'Resources/Public/JavaScript'; + const JAVASCRIPT_TO_EXT = '../../../'; + // Icons const EXT_TO_GFX_INFO_FILE = 'Resources/Public/icons/note.gif'; const EXT_TO_PATH_ICONS = 'Resources/Public/icons'; diff --git a/extension/Classes/Core/QuickFormQuery.php b/extension/Classes/Core/QuickFormQuery.php index ed7b7b8c6..ed05ba3b4 100644 --- a/extension/Classes/Core/QuickFormQuery.php +++ b/extension/Classes/Core/QuickFormQuery.php @@ -1803,7 +1803,14 @@ class QuickFormQuery { // If not, this might be an attack => cancel. return; } - $bodytextNew = Support::htmlEntityEncodeDecode(MODE_DECODE, $_POST[REPORT_INLINE_BODYTEXT]); + $bodytextNew = $_POST[REPORT_INLINE_BODYTEXT]; + + // removed the entity decode of bodytext since it replaced + // 10.sql = SELECT '& X &' + // with + // 10.sql = SELECT '& X &' + // $bodytextNew = Support::htmlEntityEncodeDecode(MODE_DECODE, $_POST[REPORT_INLINE_BODYTEXT]); + if (intval($isFile) === 1) { ReportAsFile::write_file_uid($uid, $bodytextNew, $this->dbArray[$this->dbIndexData]); } else { diff --git a/extension/Classes/Core/Report/Monitor.php b/extension/Classes/Core/Report/Monitor.php index 6f8d30033..98be7fc94 100644 --- a/extension/Classes/Core/Report/Monitor.php +++ b/extension/Classes/Core/Report/Monitor.php @@ -74,14 +74,14 @@ class Monitor { '&' . TOKEN_L_TAIL . '=' . $vars[TOKEN_L_TAIL] . '&' . TOKEN_L_APPEND . '=' . $vars[TOKEN_L_APPEND]; // $url = store::getSipInstance()->queryStringToSip(API_DIR . '/' . API_DOWNLOAD_PHP . '?' . $queryString, RETURN_URL); - $arr = store::getSipInstance()->queryStringToSip('../../../'. Path::extToApi(API_DOWNLOAD_PHP) . '?' . $queryString, RETURN_ARRAY); + $arr = store::getSipInstance()->queryStringToSip(Path::join(Path::JAVASCRIPT_TO_EXT, Path::extToApi(API_DOWNLOAD_PHP)) . '?' . $queryString, RETURN_ARRAY); $url = $arr[SIP_SIP_URL]; // On page reload, take care to remove optional existing old seek position. $key = $this->getSeekSessionKey($arr[CLIENT_SIP]); $this->session::unsetItem($key); - $webworker = Path::appToExt('Resources/Public/JavaScript/GetFileContent.js'); + $webworker = Path::appToExt(Path::EXT_TO_JAVASCRIPT, 'GetFileContent.js'); $code = <<<EOF <script type="text/javascript"> -- GitLab From 469516a9662213d1e3e3d3844ce068b99e07fad6 Mon Sep 17 00:00:00 2001 From: Marc Egger <marc.egger@uzh.ch> Date: Wed, 21 Oct 2020 14:38:03 +0200 Subject: [PATCH 166/195] Tablesorter: fix encoding error --- extension/Classes/Core/QuickFormQuery.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/extension/Classes/Core/QuickFormQuery.php b/extension/Classes/Core/QuickFormQuery.php index 58e6f64ee..fc49e8335 100644 --- a/extension/Classes/Core/QuickFormQuery.php +++ b/extension/Classes/Core/QuickFormQuery.php @@ -1998,7 +1998,7 @@ class QuickFormQuery { // The $view is base64 encoded. javascript base64 Alphabet: "A-Z", "a-z", "0-9", "+", "/" and "=" $view = Store::getVar(SETTING_TABLESORTER_VIEW, STORE_CLIENT, SANITIZE_ALLOW_ALLBUT); - if (preg_match("#^[A-Za-z0-9+/=]*$#", $view)) { + if (!preg_match("#^[A-Za-z0-9+/=]*$#", $view)) { throw new \UserReportException("Encoding error of table data. This should not happen. Please contact support.", ERROR_TABLESORTER_INVALID_CHAR); } -- GitLab From 435865b3703ddec839c1e4225859d63598c04915 Mon Sep 17 00:00:00 2001 From: Marc Egger <marc.egger@uzh.ch> Date: Wed, 21 Oct 2020 14:40:55 +0200 Subject: [PATCH 167/195] Thumbnail: adjust paths since there is a chdir before use --- extension/Classes/Core/Report/Thumbnail.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/extension/Classes/Core/Report/Thumbnail.php b/extension/Classes/Core/Report/Thumbnail.php index 04b9094ee..b6526586d 100644 --- a/extension/Classes/Core/Report/Thumbnail.php +++ b/extension/Classes/Core/Report/Thumbnail.php @@ -49,8 +49,8 @@ class Thumbnail { $this->inkscape = $this->store->getVar(SYSTEM_CMD_INKSCAPE, STORE_SYSTEM); $this->convert = $this->store->getVar(SYSTEM_CMD_CONVERT, STORE_SYSTEM); - $this->thumbnailDirSecureRelToCwd = Path::cwdToApp($this->store->getVar(SYSTEM_THUMBNAIL_DIR_SECURE_REL_TO_APP, STORE_SYSTEM)); - $this->thumbnailDirPublicRelToCwd = Path::cwdToApp($this->store->getVar(SYSTEM_THUMBNAIL_DIR_PUBLIC_REL_TO_APP, STORE_SYSTEM)); + $this->thumbnailDirSecureRelToCwd = $this->store->getVar(SYSTEM_THUMBNAIL_DIR_SECURE_REL_TO_APP, STORE_SYSTEM); + $this->thumbnailDirPublicRelToCwd = $this->store->getVar(SYSTEM_THUMBNAIL_DIR_PUBLIC_REL_TO_APP, STORE_SYSTEM); } /** -- GitLab From c049da9e0869fa46adb532651c1eb757211ac6e6 Mon Sep 17 00:00:00 2001 From: Marc Egger <marc.egger@uzh.ch> Date: Thu, 22 Oct 2020 11:21:57 +0200 Subject: [PATCH 168/195] Revert "Thumbnail: adjust paths since there is a chdir before use" This reverts commit 435865b3 because I found a cleaner solution --- extension/Classes/Core/Report/Thumbnail.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/extension/Classes/Core/Report/Thumbnail.php b/extension/Classes/Core/Report/Thumbnail.php index b6526586d..04b9094ee 100644 --- a/extension/Classes/Core/Report/Thumbnail.php +++ b/extension/Classes/Core/Report/Thumbnail.php @@ -49,8 +49,8 @@ class Thumbnail { $this->inkscape = $this->store->getVar(SYSTEM_CMD_INKSCAPE, STORE_SYSTEM); $this->convert = $this->store->getVar(SYSTEM_CMD_CONVERT, STORE_SYSTEM); - $this->thumbnailDirSecureRelToCwd = $this->store->getVar(SYSTEM_THUMBNAIL_DIR_SECURE_REL_TO_APP, STORE_SYSTEM); - $this->thumbnailDirPublicRelToCwd = $this->store->getVar(SYSTEM_THUMBNAIL_DIR_PUBLIC_REL_TO_APP, STORE_SYSTEM); + $this->thumbnailDirSecureRelToCwd = Path::cwdToApp($this->store->getVar(SYSTEM_THUMBNAIL_DIR_SECURE_REL_TO_APP, STORE_SYSTEM)); + $this->thumbnailDirPublicRelToCwd = Path::cwdToApp($this->store->getVar(SYSTEM_THUMBNAIL_DIR_PUBLIC_REL_TO_APP, STORE_SYSTEM)); } /** -- GitLab From a2800b045aa23c0d4a706348a7d90729ac2283ca Mon Sep 17 00:00:00 2001 From: Marc Egger <marc.egger@uzh.ch> Date: Thu, 22 Oct 2020 12:10:29 +0200 Subject: [PATCH 169/195] Path: set log path absolute instead of realtive to CWD --- extension/Classes/Core/Helper/Path.php | 49 +++++++++++--------------- 1 file changed, 20 insertions(+), 29 deletions(-) diff --git a/extension/Classes/Core/Helper/Path.php b/extension/Classes/Core/Helper/Path.php index a32377503..2d95d50a6 100644 --- a/extension/Classes/Core/Helper/Path.php +++ b/extension/Classes/Core/Helper/Path.php @@ -16,7 +16,8 @@ namespace IMATHUZH\Qfq\Core\Helper; * 3) if a path has to be variable, create a setter and getter. E.g. self::setCwdToApp(), self::cwdToApp(), private static $cwdToApp. * 4) a path getter appends the given arguments to the requested path using self::join(..., func_get_args()). E.g. see cwdToApp(). * 5) additional path getters may be defined which combine other getters. E.g. see cwdToApi(). - * 6) avoid defining redundant paths in constants. E.g. create cwdToApi() by combining cwdToExt() and extToApi() instead of defining CWD_TO_API. + * 6) avoid manually defining new paths relative to cwd. Define path relative to App then combine it with cwdToApp() + * 7) avoid defining redundant paths in constants. E.g. create cwdToApi() by combining cwdToExt() and extToApi() instead of defining CWD_TO_API. */ use IMATHUZH\Qfq\Core\Exception\Thrower; @@ -44,7 +45,7 @@ class Path const EXT_TO_PATH_ICONS = 'Resources/Public/icons'; // Annotate - const EXT_TO_HIGHLIGHT_JSON_DIR = 'Resources/Public/Json'; // TODO: refactor: remove DIR at the end + const EXT_TO_HIGHLIGHT_JSON_DIR = 'Resources/Public/Json'; // TODO: refactor: remove DIR at the end of the constant name // Twig const EXT_TO_TWIG_TEMPLATES = 'Resources/Public/twig_templates'; @@ -63,7 +64,7 @@ class Path const APP_TO_TYPO3_CONF = 'typo3conf'; // Log files - private static $cwdToLog = null; + private static $absoluteLog = null; private static $overloadAbsoluteQfqLogFile = null; private static $overloadAbsoluteMailLogFile = null; private static $overloadAbsoluteSqlLogFile = null; @@ -71,7 +72,7 @@ class Path private const LOG_TO_MAIL_LOG_FILE_DEFAULT = 'mail.log'; private const LOG_TO_SQL_LOG_FILE_DEFAULT = 'sql.log'; private const PROJECT_TO_LOG_DEFAULT = 'log'; - private const APP_TO_LOG_DEPRECATED = 'fileadmin/protected/log'; + private const APP_TO_LOG_IN_PROTECTED = 'fileadmin/protected/log'; // Thumbnail const APP_TO_SYSTEM_THUMBNAIL_DIR_SECURE_DEFAULT = 'fileadmin/protected/qfqThumbnail'; @@ -93,8 +94,8 @@ class Path public static function setMainPaths(string $cwdToApp) { self::setCwdToApp($cwdToApp); - self::findAndSetProjectPath(); - self::findAndSetLogPath(); + self::findAppToProject(); + self::findAbsoluteLog(); } /** @@ -124,7 +125,8 @@ class Path */ public static function absoluteLog(...$pathPartsToAppend): string { - return self::realpath(self::cwdToLog(), $pathPartsToAppend); + self::enforcePathIsSet(self::$absoluteLog); + return self::join(self::$absoluteLog, $pathPartsToAppend); } /** @@ -163,17 +165,6 @@ class Path return self::$overloadAbsoluteMailLogFile; } - /** - * @param array $pathPartsToAppend - * @return string - * @throws \UserFormException - */ - public static function cwdToLog(...$pathPartsToAppend): string - { - self::enforcePathIsSet(self::$cwdToLog); - return self::join(self::$cwdToLog, $pathPartsToAppend); - } - /** * @param array $pathPartsToAppend * @return string @@ -385,9 +376,9 @@ class Path * @param string $newPath * @return string */ - private static function setCwdToLog(string $newPath) + private static function setAbsoluteLog(string $newPath) { - self::$cwdToLog = $newPath; + self::$absoluteLog = $newPath; } /** @@ -398,21 +389,21 @@ class Path * * @throws \UserFormException */ - private static function findAndSetLogPath() + private static function findAbsoluteLog() { // search log dir qfqProject/log - $cwdToLog = self::cwdToProject(self::PROJECT_TO_LOG_DEFAULT); - if (file_exists($cwdToLog)) { - self::setCwdToLog($cwdToLog); + $absoluteLog = self::absoluteApp(self::appToProject(self::PROJECT_TO_LOG_DEFAULT)); + if (file_exists($absoluteLog)) { + self::setAbsoluteLog($absoluteLog); // search log dir fileadmin/protected/log - } elseif (file_exists(self::cwdToApp(self::APP_TO_LOG_DEPRECATED))) { - self::setCwdToLog(self::cwdToApp(self::APP_TO_LOG_DEPRECATED)); + } elseif (file_exists(self::absoluteApp(self::APP_TO_LOG_IN_PROTECTED))) { + self::setAbsoluteLog(self::absoluteApp(self::APP_TO_LOG_IN_PROTECTED)); // create default log dir qfqProject/log } else { - HelperFile::createPathRecursive($cwdToLog); - self::setCwdToLog($cwdToLog); + HelperFile::createPathRecursive($absoluteLog); + self::setAbsoluteLog($absoluteLog); } } @@ -422,7 +413,7 @@ class Path * @throws \CodeException * @throws \UserFormException */ - private static function findAndSetProjectPath() + private static function findAppToProject() { // does qfq.project.path.php exist? => read path $cwdToProjectPathFile = self::cwdToApp(PROJECT_PATH_PHP_FILE); -- GitLab From 86a1609739bc30a168a6333fed38113d86a9123d Mon Sep 17 00:00:00 2001 From: Marc Egger <marc.egger@uzh.ch> Date: Thu, 22 Oct 2020 17:06:44 +0200 Subject: [PATCH 170/195] Path: set cwdToApp after every chdir --- extension/Classes/Core/Delete.php | 5 +++-- extension/Classes/Core/Helper/HelperFile.php | 21 +++++++++++++------- extension/Classes/Core/Helper/Path.php | 12 +++++++++++ extension/Classes/Core/Report/Download.php | 2 +- extension/Classes/Core/Save.php | 15 +++++++------- 5 files changed, 38 insertions(+), 17 deletions(-) diff --git a/extension/Classes/Core/Delete.php b/extension/Classes/Core/Delete.php index 81f5c2a67..ff552955a 100644 --- a/extension/Classes/Core/Delete.php +++ b/extension/Classes/Core/Delete.php @@ -71,8 +71,9 @@ class Delete { // Take care the necessary target directories exist. $cwd = getcwd(); + $cwdToApp = Path::cwdToApp(); $sitePath = Path::absoluteApp(); - if ($cwd === false || $sitePath === false || !HelperFile::chdir($sitePath)) { + if ($cwd === false || $sitePath === false || !HelperFile::chdir($sitePath, '')) { throw new \UserFormException( json_encode([ERROR_MESSAGE_TO_USER => 'getcwd() failed or SITE_PATH undefined or chdir() failed', ERROR_MESSAGE_TO_DEVELOPER => "getcwd() failed or SITE_PATH undefined or chdir('$sitePath') failed."]), ERROR_IO_CHDIR); @@ -93,7 +94,7 @@ class Delete { } - HelperFile::chdir($cwd); + HelperFile::chdir($cwd, $cwdToApp); } /** diff --git a/extension/Classes/Core/Helper/HelperFile.php b/extension/Classes/Core/Helper/HelperFile.php index 31469ec45..e64b732a3 100644 --- a/extension/Classes/Core/Helper/HelperFile.php +++ b/extension/Classes/Core/Helper/HelperFile.php @@ -247,19 +247,23 @@ class HelperFile { } /** - * PHP System function: chdir() with QFQ exception + * PHP System function: chdir() with QFQ exception. * - * @param $cwd + * @param $newCwd + * @param string $pathNewCwdToApp Path from the new cwd to the App directory. * @return string + * @throws \CodeException * @throws \UserFormException */ - public static function chdir($cwd) { + public static function chdir($newCwd, string $pathNewCwdToApp) { - if (false === @chdir($cwd)) { - $msg = self::errorGetLastAsString() . " - chdir($cwd)"; + if (false === @chdir($newCwd)) { + $msg = self::errorGetLastAsString() . " - chdir($newCwd)"; throw new \UserFormException(json_encode([ERROR_MESSAGE_TO_USER => 'chdir failed', ERROR_MESSAGE_TO_DEVELOPER => $msg]), ERROR_IO_CHDIR); } + Path::setMainPaths($pathNewCwdToApp); + return true; } @@ -361,15 +365,18 @@ class HelperFile { * @param string $pathFileName Path with Filename * @param bool|int $chmodDir false if not explicit set * @throws \UserFormException + * @throws \CodeException */ public static function mkDirParent($pathFileName, $chmodDir = false) { $path = ""; $cwd = ''; + $cwdToApp = ''; // Leading '/' will be removed - chdir to / to still use correct path if ($pathFileName[0] == '/') { $cwd = getcwd(); - self::chdir('/'); + $cwdToApp = Path::cwdToApp(); + self::chdir('/', Path::absoluteApp()); } // Teile "Directory/File.Extension" auf @@ -408,7 +415,7 @@ class HelperFile { } if ($cwd != '') { - self::chdir($cwd); + self::chdir($cwd, $cwdToApp); } } diff --git a/extension/Classes/Core/Helper/Path.php b/extension/Classes/Core/Helper/Path.php index 2d95d50a6..c8def3489 100644 --- a/extension/Classes/Core/Helper/Path.php +++ b/extension/Classes/Core/Helper/Path.php @@ -94,6 +94,8 @@ class Path public static function setMainPaths(string $cwdToApp) { self::setCwdToApp($cwdToApp); + + // Only executed on first call: self::findAppToProject(); self::findAbsoluteLog(); } @@ -391,6 +393,11 @@ class Path */ private static function findAbsoluteLog() { + if (!is_null(self::$absoluteLog)) { + // only execute once + return; + } + // search log dir qfqProject/log $absoluteLog = self::absoluteApp(self::appToProject(self::PROJECT_TO_LOG_DEFAULT)); if (file_exists($absoluteLog)) { @@ -415,6 +422,11 @@ class Path */ private static function findAppToProject() { + if (!is_null(self::$appToProject)) { + // only execute once + return; + } + // does qfq.project.path.php exist? => read path $cwdToProjectPathFile = self::cwdToApp(PROJECT_PATH_PHP_FILE); if (HelperFile::isReadableException($cwdToProjectPathFile)) { diff --git a/extension/Classes/Core/Report/Download.php b/extension/Classes/Core/Report/Download.php index 05aec4e24..ecf3c5e96 100644 --- a/extension/Classes/Core/Report/Download.php +++ b/extension/Classes/Core/Report/Download.php @@ -544,7 +544,7 @@ class Download { $filesCleanLater = array(); $workDir = Path::absoluteApp(); - HelperFile::chdir($workDir); + HelperFile::chdir($workDir, ''); $downloadMode = $vars[DOWNLOAD_MODE]; diff --git a/extension/Classes/Core/Save.php b/extension/Classes/Core/Save.php index 6f77468da..4809f60b2 100644 --- a/extension/Classes/Core/Save.php +++ b/extension/Classes/Core/Save.php @@ -495,10 +495,10 @@ class Save { // Upload - Take care the necessary target directories exist. $cwd = getcwd(); - $sitePath = Path::cwdToApp(); - if ($cwd === false || $sitePath === false || !HelperFile::chdir($sitePath)) { + $cwdToApp = Path::cwdToApp(); + if ($cwd === false || $cwdToApp === false || !HelperFile::chdir($cwdToApp, '')) { throw new \UserFormException( - json_encode([ERROR_MESSAGE_TO_USER => 'getcwd() failed or SITE_PATH undefined or chdir() failed', ERROR_MESSAGE_TO_DEVELOPER => "getcwd() failed or SITE_PATH undefined or chdir('$sitePath') failed."]), + json_encode([ERROR_MESSAGE_TO_USER => 'getcwd() failed or SITE_PATH undefined or chdir() failed', ERROR_MESSAGE_TO_DEVELOPER => "getcwd() failed or SITE_PATH undefined or chdir('$cwdToApp') failed."]), ERROR_IO_CHDIR); } @@ -604,7 +604,7 @@ class Save { } // Clean up - HelperFile::chdir($cwd); + HelperFile::chdir($cwd, $cwdToApp); // Only used in 'Simple Upload' if (count($newValues) > 0) { @@ -781,7 +781,7 @@ class Save { // Take care the necessary target directories exist. $cwd = getcwd(); $sitePath = Path::absoluteApp(); - if ($cwd === false || $sitePath === false || !HelperFile::chdir($sitePath)) { + if ($cwd === false || $sitePath === false || !HelperFile::chdir($sitePath, '')) { throw new \UserFormException( json_encode([ERROR_MESSAGE_TO_USER => 'getcwd() failed or SITE_PATH undefined or chdir() failed', ERROR_MESSAGE_TO_DEVELOPER => "getcwd() failed or SITE_PATH undefined or chdir('$sitePath') failed."]), ERROR_IO_CHDIR); @@ -1259,9 +1259,10 @@ class Save { } // Split PDF - HelperFile::chdir($tempDir); + $cwdToApp = Path::cwdToApp(); + HelperFile::chdir($tempDir, $cwdToApp); $output = Support::qfqExec($cmd, $rc); - HelperFile::chdir($cwd); + HelperFile::chdir($cwd, $cwdToApp); if ($rc != 0) { throw new \UserFormException( -- GitLab From 118f67bb0b5349742ad1330b0205725c193d151a Mon Sep 17 00:00:00 2001 From: Marc Egger <marc.egger@uzh.ch> Date: Fri, 23 Oct 2020 17:20:20 +0200 Subject: [PATCH 171/195] catch Errors as well as exceptions --- extension/Classes/Controller/QfqController.php | 14 ++++++++++---- extension/Classes/Core/Exception/Thrower.php | 4 ++-- 2 files changed, 12 insertions(+), 6 deletions(-) diff --git a/extension/Classes/Controller/QfqController.php b/extension/Classes/Controller/QfqController.php index d11ea39ca..dc97f9de6 100644 --- a/extension/Classes/Controller/QfqController.php +++ b/extension/Classes/Controller/QfqController.php @@ -7,8 +7,6 @@ namespace IMATHUZH\Qfq\Controller; require_once(__DIR__ . '/../../vendor/autoload.php'); -use http\Exception; - use IMATHUZH\Qfq\Core\Helper\Path; use IMATHUZH\Qfq\Core\QuickFormQuery; @@ -67,8 +65,16 @@ class QfqController extends \TYPO3\CMS\Extbase\Mvc\Controller\ActionController { } catch (\DownloadException $e) { $html = $e->formatMessage(); - } catch (Exception $e) { - $html = "Generic Exception: " . $e->getMessage(); + } catch (\Exception $e) { + $ee = new \UserReportException(json_encode([ + ERROR_MESSAGE_TO_USER => "Generic Exception: " . $e->getMessage(), + ERROR_MESSAGE_TO_DEVELOPER => $e->getTraceAsString()]), E_ERROR); + $html = $ee->formatMessage(); + } catch (\Error $e) { + $ee = new \UserReportException(json_encode([ + ERROR_MESSAGE_TO_USER => "Generic Error: " . $e->getMessage(), + ERROR_MESSAGE_TO_DEVELOPER => $e->getTraceAsString()]), E_ERROR); + $html = $ee->formatMessage(); } if (isset($e) && $e->getCode() == ERROR_QUIT_QFQ_REGULAR) { diff --git a/extension/Classes/Core/Exception/Thrower.php b/extension/Classes/Core/Exception/Thrower.php index a7720b597..7e7a3e7c6 100644 --- a/extension/Classes/Core/Exception/Thrower.php +++ b/extension/Classes/Core/Exception/Thrower.php @@ -15,7 +15,7 @@ class Thrower public static function userFormException(string $errorToUser, string $errorToDeveloper = '', int $errorCode = E_ERROR) { throw new \UserFormException(json_encode([ ERROR_MESSAGE_TO_USER => $errorToUser, - ERROR_MESSAGE_TO_DEVELOPER => $errorToDeveloper]), ERROR_IO_READ_FILE); + ERROR_MESSAGE_TO_DEVELOPER => $errorToDeveloper]), $errorCode); } /** @@ -29,6 +29,6 @@ class Thrower public static function userReportException(string $errorToUser, string $errorToDeveloper = '', int $errorCode = E_ERROR) { throw new \UserReportException(json_encode([ ERROR_MESSAGE_TO_USER => $errorToUser, - ERROR_MESSAGE_TO_DEVELOPER => $errorToDeveloper]), ERROR_IO_READ_FILE); + ERROR_MESSAGE_TO_DEVELOPER => $errorToDeveloper]), $errorCode); } } \ No newline at end of file -- GitLab From 2f178ae7e5b795d837ad5c5117c08efc743d7e8f Mon Sep 17 00:00:00 2001 From: Marc Egger <marc.egger@uzh.ch> Date: Fri, 23 Oct 2020 17:21:46 +0200 Subject: [PATCH 172/195] fix static form: parse static record id given in report --- extension/Classes/Core/QuickFormQuery.php | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/extension/Classes/Core/QuickFormQuery.php b/extension/Classes/Core/QuickFormQuery.php index fc49e8335..1c1f717a6 100644 --- a/extension/Classes/Core/QuickFormQuery.php +++ b/extension/Classes/Core/QuickFormQuery.php @@ -372,7 +372,14 @@ class QuickFormQuery { $formModeNew = ''; $build = null; - $recordId = $this->store->getVar(SIP_RECORD_ID, STORE_SIP . STORE_TYPO3 . STORE_CLIENT . STORE_ZERO, SANITIZE_ALLOW_DIGIT, $foundInStore); + // Check if there is a recordId specified in Bodytext - parse if it is a query + $rTmp = $this->store->getVar(SIP_RECORD_ID, STORE_TYPO3, SANITIZE_ALLOW_ALL); + if (false !== $rTmp && !ctype_digit($rTmp)) { + $rTmp = $this->evaluate->parse($rTmp); + $this->store->setVar(SIP_RECORD_ID, $rTmp, STORE_TYPO3); + } + + $recordId = $this->store->getVar(SIP_RECORD_ID, STORE_TYPO3 . STORE_SIP . STORE_CLIENT . STORE_ZERO, SANITIZE_ALLOW_DIGIT, $foundInStore); $this->setParameterLanguageFieldName(); $formName = $this->loadFormSpecification($formMode, $recordId, $foundInStore, $formLogMode); @@ -1074,13 +1081,6 @@ class QuickFormQuery { // Preparation for Log, Debug $this->store->setVar(SYSTEM_FORM, $formName, STORE_SYSTEM); - // Check if there is a recordId specified in Bodytext - as variable or query. - $rTmp = $this->store->getVar(CLIENT_RECORD_ID, STORE_TYPO3, SANITIZE_ALLOW_ALL); - if (false !== $rTmp && !ctype_digit($rTmp)) { - $rTmp = $this->evaluate->parse($rTmp); - $this->store->setVar(CLIENT_RECORD_ID, $rTmp, STORE_TYPO3); - } - // Check for form file changes FormAsFile::importForm($formName, $this->dbArray[$this->dbIndexQfq]); -- GitLab From d484d323bf2fdd89dc79016d50f4ebfb1a8418fc Mon Sep 17 00:00:00 2001 From: Marc Egger <marc.egger@uzh.ch> Date: Mon, 26 Oct 2020 10:02:49 +0100 Subject: [PATCH 173/195] autocron path: set main path in autocron script --- extension/Classes/External/autocron.php | 2 ++ 1 file changed, 2 insertions(+) diff --git a/extension/Classes/External/autocron.php b/extension/Classes/External/autocron.php index a96c288ac..89aeb0328 100644 --- a/extension/Classes/External/autocron.php +++ b/extension/Classes/External/autocron.php @@ -10,6 +10,7 @@ namespace IMATHUZH\Qfq\External; require_once(__DIR__ . '/../../vendor/autoload.php'); +use IMATHUZH\Qfq\Core\Helper\Path; use IMATHUZH\Qfq\External\AutoCron; global $argv; @@ -34,6 +35,7 @@ try { } } chdir($baseDir); + Path::setMainPaths(''); } $autoCron = new AutoCron($verbose); -- GitLab From c1b7f411c808db78d6a261a872447a46f383b4cc Mon Sep 17 00:00:00 2001 From: Marc Egger <marc.egger@uzh.ch> Date: Mon, 26 Oct 2020 18:17:56 +0100 Subject: [PATCH 174/195] form as file: match form names case sensitive from database --- extension/Classes/Core/Database/Database.php | 40 ++++++++++++++++++++ extension/Classes/Core/Form/FormAsFile.php | 34 ++++++++--------- 2 files changed, 57 insertions(+), 17 deletions(-) diff --git a/extension/Classes/Core/Database/Database.php b/extension/Classes/Core/Database/Database.php index 5bcc6f709..933040a8e 100644 --- a/extension/Classes/Core/Database/Database.php +++ b/extension/Classes/Core/Database/Database.php @@ -8,12 +8,14 @@ namespace IMATHUZH\Qfq\Core\Database; +use IMATHUZH\Qfq\Core\Exception\Thrower; use IMATHUZH\Qfq\Core\Helper\BindParam; use IMATHUZH\Qfq\Core\Helper\HelperFile; use IMATHUZH\Qfq\Core\Helper\HelperFormElement; use IMATHUZH\Qfq\Core\Helper\Logger; use IMATHUZH\Qfq\Core\Helper\OnArray; use IMATHUZH\Qfq\Core\Helper\Path; +use IMATHUZH\Qfq\Core\Helper\SqlQuery; use IMATHUZH\Qfq\Core\Store\Store; /** @@ -1062,4 +1064,42 @@ class Database { $this->sql('DELETE FROM `' . TABLE_NAME_SPLIT . '` WHERE `tableName`=? AND `xId`=?', ROW_REGULAR, [$tableName, $xId]); } + /** + * Returns either empty array or an array containing the selected columns. + * $formName is matched case sensitively. + * Throws exception if more than one form was found with the exact same name. + * + * @param string $formName + * @param array|null $columnsToSelect + * @return array|bool|int|string + * @throws \CodeException + * @throws \DbException + * @throws \UserFormException + */ + public function selectFormByName(string $formName, array $columnsToSelect = null) + { + // make sure to select column 'name' + if (is_array($columnsToSelect) && !in_array(F_NAME, $columnsToSelect)) { + $columnsToSelect[] = F_NAME; + } + + // select + list($sql, $parameterArray) = SqlQuery::selectFormByName($formName, $columnsToSelect); + $forms = $this->sql($sql, ROW_REGULAR, $parameterArray); + + $forms = array_filter($forms, function ($f) use ($formName) { + return $formName === $f[F_NAME]; + }); + + // Check for case sensitive matches + $count = count($forms); + if ($count > 1) { + Thrower::userFormException("Multiple forms with the exact same name: '$formName' (case sensitive). Expected one or zero rows, got $count rows"); + } else if ($count === 1) { + return reset($forms); // returns first element + } else { + return []; + } + + } } \ No newline at end of file diff --git a/extension/Classes/Core/Form/FormAsFile.php b/extension/Classes/Core/Form/FormAsFile.php index feaae4bf5..5c6a8192a 100644 --- a/extension/Classes/Core/Form/FormAsFile.php +++ b/extension/Classes/Core/Form/FormAsFile.php @@ -36,29 +36,30 @@ class FormAsFile public static function importForm(string $formName, Database $database, bool $keepIfNeverExported = true): bool { // Get file stats from database form - list($sql, $parameterArray) = SqlQuery::selectFormByName($formName, [F_ID, F_FILE_STATS]); - $formFromDb = $database->sql($sql, ROW_EXPECT_0_1, - $parameterArray, "Multiple forms with the same name: '$formName'"); + $formFromDb = $database->selectFormByName($formName, [F_ID, F_FILE_STATS]); // Get file stats from file system $cwdToFormFile = self::formPathFileName($formName, $database); - $fileReadException = new \UserFormException(json_encode([ - ERROR_MESSAGE_TO_USER => "Form file not found or missing permission: " . baseName($cwdToFormFile), - ERROR_MESSAGE_TO_DEVELOPER => "Form definition file not found or no permission to read file: '$cwdToFormFile'"]), - ERROR_FORM_NOT_FOUND); + $fileReadException = function () use ($cwdToFormFile, $database, $formName) { + Thrower::userFormException( + "Form file not found or missing permission: '" . baseName($cwdToFormFile) . "'. Form names are case sensitive. Similar forms: " + . implode(', ', array_filter(self::formFileNames($database), function ($f) use ($formName) {return strtolower($f) === strtolower($formName);})), + "Form definition file not found or no permission to read file: '$cwdToFormFile'" + ); + }; if(!file_exists($cwdToFormFile)) { - if ($keepIfNeverExported && (!isset($formFromDb[F_FILE_STATS]) || !self::isValidFileStats($formFromDb[F_FILE_STATS]))) { + if ($keepIfNeverExported && isset($formFromDb[F_ID]) && (!isset($formFromDb[F_FILE_STATS]) || !self::isValidFileStats($formFromDb[F_FILE_STATS]))) { // if file not exists and form was never exported, then export self::exportForm($formName, $database); } else { self::deleteFormDB($formName, $database, "No corresponding form file found."); - throw $fileReadException; + $fileReadException(); } } $fileStatsNew = self::formFileStatsJson($cwdToFormFile); if ($fileStatsNew === false) { self::deleteFormDB($formName, $database, "Failed to read form file stats."); - throw $fileReadException; + $fileReadException(); } // if fileStats from DB and file are equal: do nothing @@ -70,7 +71,7 @@ class FormAsFile $fileContents = file_get_contents($cwdToFormFile); if ($fileContents === false) { self::deleteFormDB($formName, $database, "Failed to read form file."); - throw $fileReadException; + $fileReadException(); } $formFromFile = json_decode($fileContents, true); @@ -468,9 +469,7 @@ class FormAsFile */ private static function deleteFormDB(string $formName, Database $database, string $logMessageReason = '', bool $keepIfNeverExported = false) // : void { - list($sql, $parameterArray) = SqlQuery::selectFormByName($formName, [F_ID, F_FILE_STATS]); - $formFromDb = $database->sql($sql, ROW_EXPECT_0_1, - $parameterArray, "Multiple forms with the same name: '$formName'"); + $formFromDb = $database->selectFormByName($formName, [F_ID, F_FILE_STATS]); if ($keepIfNeverExported && (isset($formFromDb[F_ID]) && !isset($formFromDb[F_FILE_STATS])) || (isset($formFromDb[F_FILE_STATS]) && !self::isValidFileStats($formFromDb[F_FILE_STATS]))) { // export form instead of deleting since it was never exported before @@ -693,9 +692,10 @@ class FormAsFile $form = $database->sql($sql, ROW_EXPECT_1, $parameterArray, "Form with id $formId not found."); // array(column name => value) } else { - list($sql, $parameterArray) = SqlQuery::selectFormByName($formName); - $form = $database->sql($sql, ROW_EXPECT_1, - $parameterArray, "Form $formName not found or multiple forms with the same name."); // array(column name => value) + $form = $database->selectFormByName($formName); // array(column name => value) + if (!isset($form[F_ID])) { + Thrower::userFormException("Error during form export.", "Form $formName not found in database. Note: Form names are case sensitive."); + } } // Remove columns: id, name, fileStats -- GitLab From 00b02089766c52c55fbd803d586f265efb075fe6 Mon Sep 17 00:00:00 2001 From: Marc Egger <marc.egger@uzh.ch> Date: Tue, 27 Oct 2020 17:57:27 +0100 Subject: [PATCH 175/195] Doku: add manual to put typo3 in Debug mode --- Documentation/GeneralTips.rst | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/Documentation/GeneralTips.rst b/Documentation/GeneralTips.rst index 2cd897e87..e3f59f11d 100644 --- a/Documentation/GeneralTips.rst +++ b/Documentation/GeneralTips.rst @@ -37,6 +37,13 @@ General Tips ============ +Typo3 Debug Mode +---------------- + +Manual to always display Exceptions and Errors in the backend and frontend of Typo3: + +`Typo3: Debugging and Development Setup <https://docs.typo3.org/m/typo3/reference-coreapi/master/en-us/ApiOverview/ErrorAndExceptionHandling/Examples/Index.html#debugging-and-development-setup>`_ + Errors ------ -- GitLab From 885ef06b142053a24550ce451d0466c35c10d75d Mon Sep 17 00:00:00 2001 From: Marc Egger <marc.egger@uzh.ch> Date: Fri, 30 Oct 2020 11:24:42 +0100 Subject: [PATCH 176/195] fix: phpSpreadsheet throws exception that '' is not numeric --- extension/Classes/Core/Report/Excel.php | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/extension/Classes/Core/Report/Excel.php b/extension/Classes/Core/Report/Excel.php index 2ba3cb788..3130a0865 100644 --- a/extension/Classes/Core/Report/Excel.php +++ b/extension/Classes/Core/Report/Excel.php @@ -137,6 +137,12 @@ class Excel { $key=EXCEL_STRING; } + // if type numeric is not a number replace wit '' or 'not a number' + if($key === EXCEL_NUMERIC && !is_numeric($value)) { + $value = (ctype_space($value) || $value === '') ? '' : 'not a number'; + $key=EXCEL_STRING; + } + $spreadsheet->getActiveSheet() ->setCellValueExplicit( $posColumn . $posRow, -- GitLab From e147218945ba52cafb0f1c1597360e8015115ff6 Mon Sep 17 00:00:00 2001 From: Marc Egger <marc.egger@uzh.ch> Date: Thu, 5 Nov 2020 18:37:37 +0100 Subject: [PATCH 177/195] Config.php: Typo3 10 compatible --- extension/Classes/Core/Store/Config.php | 25 ++++++++++++++++++++++--- 1 file changed, 22 insertions(+), 3 deletions(-) diff --git a/extension/Classes/Core/Store/Config.php b/extension/Classes/Core/Store/Config.php index 8714e54e2..682bf4c9f 100644 --- a/extension/Classes/Core/Store/Config.php +++ b/extension/Classes/Core/Store/Config.php @@ -199,14 +199,26 @@ class Config { private static function readTypo3QfqConfig(): array { $configT3qfq = array(); - if (isset($GLOBALS['TYPO3_CONF_VARS']['EXT']['extConf'][EXT_KEY])) { + if (isset($GLOBALS['TYPO3_CONF_VARS']['EXTENSIONS'][EXT_KEY])) { + // Typo3 version >=10 + $configT3qfq = $GLOBALS['TYPO3_CONF_VARS']['EXTENSIONS'][EXT_KEY]; + $configT3qfq[SYSTEM_DB_NAME_T3] = self::getDbName($GLOBALS['TYPO3_CONF_VARS']['DB']); + + } elseif (isset($GLOBALS['TYPO3_CONF_VARS']['EXT']['extConf'][EXT_KEY])) { + // Typo3 version <=8 $configT3qfq = unserialize($GLOBALS['TYPO3_CONF_VARS']['EXT']['extConf'][EXT_KEY]); $configT3qfq[SYSTEM_DB_NAME_T3] = self::getDbName($GLOBALS['TYPO3_CONF_VARS']['DB']); } elseif (is_readable(Path::cwdToApp(Path::APP_TO_TYPO3_CONF, CONFIG_T3))) { $cwdToTypo3ConfigFile = Path::cwdToApp(Path::APP_TO_TYPO3_CONF, CONFIG_T3); $configT3 = HelperFile::include($cwdToTypo3ConfigFile); - $configT3qfq = unserialize($configT3['EXT']['extConf'][EXT_KEY]); + if (isset($configT3['EXTENSIONS'][EXT_KEY])) { + // Typo3 version >=10 + $configT3qfq = $configT3['EXTENSIONS'][EXT_KEY]; + } else { + // Typo3 version <=8 + $configT3qfq = unserialize($configT3['EXT']['extConf'][EXT_KEY]); + } if (!is_array($configT3qfq)) { Thrower::userFormException('Error read file', "Error while unserializing qfq config from: $cwdToTypo3ConfigFile"); } @@ -565,7 +577,14 @@ class Config { */ private static function beUserLoggedIn() { - return (!empty($GLOBALS["TSFE"]->beUserLogin) && $GLOBALS["TSFE"]->beUserLogin === true); + if (isset($GLOBALS["BE_USER"]) && $GLOBALS["BE_USER"]->loginType === "BE") { + // Typo3 version >=10 + return true; + } elseif (!empty($GLOBALS["TSFE"]->beUserLogin) && $GLOBALS["TSFE"]->beUserLogin === true) { + // Typo3 version <=8 + return true; + } + return false; } /** -- GitLab From e8a6085f2af7159ef5a5ab17669ef3164c0bf175 Mon Sep 17 00:00:00 2001 From: Marc Egger <marc.egger@uzh.ch> Date: Thu, 5 Nov 2020 18:38:38 +0100 Subject: [PATCH 178/195] Path.php: create project path if not exists --- extension/Classes/Core/Helper/Path.php | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/extension/Classes/Core/Helper/Path.php b/extension/Classes/Core/Helper/Path.php index c8def3489..9abaa5673 100644 --- a/extension/Classes/Core/Helper/Path.php +++ b/extension/Classes/Core/Helper/Path.php @@ -127,6 +127,9 @@ class Path */ public static function absoluteLog(...$pathPartsToAppend): string { + if (is_null(self::$absoluteLog)) { + self::findAbsoluteLog(); + } self::enforcePathIsSet(self::$absoluteLog); return self::join(self::$absoluteLog, $pathPartsToAppend); } @@ -432,20 +435,20 @@ class Path if (HelperFile::isReadableException($cwdToProjectPathFile)) { self::setAppToProject(HelperFile::include($cwdToProjectPathFile)); - // does the deprecated config.qfq.php exist? => migrate to qfq.json + // does the deprecated config.qfq.php exist? => fileadmin/protected/qfqProject & migrate to qfq.json } elseif (HelperFile::isReadableException(self::cwdToApp(self::APP_TO_TYPO3_CONF, CONFIG_QFQ_PHP))) { + HelperFile::createPathRecursive(self::cwdToApp(self::APP_TO_PROJECT_IN_PROTECTED)); self::setAppToProject(self::APP_TO_PROJECT_IN_PROTECTED); - self::writeProjectPathPhp(); Config::migrateConfigPhpToJson(); + self::writeProjectPathPhp(); - // does fileadmin/protected exist? => set fileadmin/protected/qfqProject as project path + // does fileadmin/protected exist? => fileadmin/protected/qfqProject } elseif (file_exists(self::cwdToApp(self::APP_TO_PROTECTED))) { - $cwdToProject = self::cwdToApp(self::APP_TO_PROJECT_IN_PROTECTED); - HelperFile::createPathRecursive($cwdToProject); - self::setAppToProject($cwdToProject); + HelperFile::createPathRecursive(self::cwdToApp(self::APP_TO_PROJECT_IN_PROTECTED)); + self::setAppToProject(self::APP_TO_PROJECT_IN_PROTECTED); self::writeProjectPathPhp(); - // create qfq.project.path.php at default location + // else => folder above APP } else { self::setAppToProject(self::APP_TO_PROJECT_DEFAULT); self::writeProjectPathPhp(); -- GitLab From c4ae9ef924147ffd8a8f455aa8e830c57c9692af Mon Sep 17 00:00:00 2001 From: Marc Egger <marc.egger@uzh.ch> Date: Thu, 5 Nov 2020 18:40:23 +0100 Subject: [PATCH 179/195] T3Handler.php: Typo3-10 edit config --- extension/Classes/Core/Typo3/T3Handler.php | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/extension/Classes/Core/Typo3/T3Handler.php b/extension/Classes/Core/Typo3/T3Handler.php index 3a7935ad2..43d020c7d 100644 --- a/extension/Classes/Core/Typo3/T3Handler.php +++ b/extension/Classes/Core/Typo3/T3Handler.php @@ -135,13 +135,25 @@ class T3Handler { // Same as $GLOBALS['TYPO3_CONF_VARS']['EXT']['extConf']['qfq'] $configT3 = $configurationManager->getLocalConfiguration(); - $configQfq = unserialize($configT3['EXT']['extConf'][EXT_KEY]); + if (isset($configT3['EXTENSIONS'][EXT_KEY])) { + // Typo3 version >=10 + $configQfq = $configT3['EXTENSIONS'][EXT_KEY]; + } else { + // Typo3 version <=8 + $configQfq = unserialize($configT3['EXT']['extConf'][EXT_KEY]); + } // Set new value $configQfq[$key] = $value; // Prepare - $configT3['EXT']['extConf'][EXT_KEY] = serialize($configQfq); + if (isset($configT3['EXTENSIONS'][EXT_KEY])) { + // Typo3 version >=10 + $configT3['EXTENSIONS'][EXT_KEY] = $configQfq; + } else { + // Typo3 version <=8 + $configT3['EXT']['extConf'][EXT_KEY] = serialize($configQfq); + } // Write new config to typo3conf/LocalConfiguration.php $configurationManager->writeLocalConfiguration($configT3); -- GitLab From a759d827e55c14f974e481f13c51f5dd0c2a6d4a Mon Sep 17 00:00:00 2001 From: Marc Egger <marc.egger@uzh.ch> Date: Thu, 5 Nov 2020 18:58:30 +0100 Subject: [PATCH 180/195] T3Handler.php: T3-10 fix autoloading if T3 not loaded --- extension/Classes/Core/Typo3/T3Handler.php | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/extension/Classes/Core/Typo3/T3Handler.php b/extension/Classes/Core/Typo3/T3Handler.php index 43d020c7d..0523b5662 100644 --- a/extension/Classes/Core/Typo3/T3Handler.php +++ b/extension/Classes/Core/Typo3/T3Handler.php @@ -8,6 +8,7 @@ namespace IMATHUZH\Qfq\Core\Typo3; +use IMATHUZH\Qfq\Core\Helper\Path; use IMATHUZH\Qfq\Core\Helper\Support; @@ -97,9 +98,15 @@ class T3Handler { */ public static function t3AutoloadIfNotRunning() { - if (!class_exists('\TYPO3\CMS\Saltedpasswords\Utility\SaltedPasswordsUtility')) { - //TODO: Get absolute 'path' via QFQ config - require __DIR__ . '/../../../../../../typo3_src/vendor/autoload.php'; + if (!class_exists('\TYPO3\CMS\Core\Utility\GeneralUtility')) { + + if (file_exists(Path::absoluteApp('vendor/autoload.php'))) { + // Typo3 version >=10 + require Path::absoluteApp('vendor/autoload.php'); + } else { + // Typo3 version <=8 + require Path::absoluteApp('typo3_src/vendor/autoload.php'); + } // run typo3 bootstrap if not yet happened. Necessary if run in unittest. if (!defined('TYPO3_MODE')) { -- GitLab From dc6f25e01215e4a43fb7e128f4b4d2062c051247 Mon Sep 17 00:00:00 2001 From: Marc Egger <marc.egger@uzh.ch> Date: Thu, 5 Nov 2020 19:02:43 +0100 Subject: [PATCH 181/195] ext_*.php: $_EXTKEY is not available in T3-10 --- extension/ext_emconf.php | 2 +- extension/ext_localconf.php | 4 ++-- extension/ext_tables.php | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/extension/ext_emconf.php b/extension/ext_emconf.php index 16fd744e1..6e986dc5a 100644 --- a/extension/ext_emconf.php +++ b/extension/ext_emconf.php @@ -3,7 +3,7 @@ * @author Carsten Rose <carsten.rose@math.uzh.ch> */ -$EM_CONF[$_EXTKEY] = array( +$EM_CONF['qfq'] = array( 'title' => 'Quick Form Query', 'description' => 'Framework to build web applications: Form (dynamic), report, typeahead, multi language, link protection, PDF, send mail (dynamic attachments, PDFs), multiple databases, record locking, secure up/download.', 'category' => 'fe', diff --git a/extension/ext_localconf.php b/extension/ext_localconf.php index 9758585ad..4818b74b5 100644 --- a/extension/ext_localconf.php +++ b/extension/ext_localconf.php @@ -6,7 +6,7 @@ if (!defined('TYPO3_MODE')) { die ('Access denied.'); } \TYPO3\CMS\Extbase\Utility\ExtensionUtility::configurePlugin( - 'IMATHUZH.' . $_EXTKEY, + 'IMATHUZH.' . 'qfq', 'Qfq', array('Qfq' => 'show'), array('Qfq' => 'show'), // put here as well, if controller output must not be cached @@ -22,4 +22,4 @@ tt_content.qfq_qfq { 10 > } '; -\TYPO3\CMS\Core\Utility\ExtensionManagementUtility::addTypoScript($_EXTKEY, 'setup', '# Setting ' . $_EXTKEY . $addLine . '', 'defaultContentRendering'); +\TYPO3\CMS\Core\Utility\ExtensionManagementUtility::addTypoScript('qfq', 'setup', '# Setting ' . 'qfq' . $addLine . '', 'defaultContentRendering'); diff --git a/extension/ext_tables.php b/extension/ext_tables.php index f81652265..ead3b0106 100644 --- a/extension/ext_tables.php +++ b/extension/ext_tables.php @@ -8,7 +8,7 @@ if (!defined('TYPO3_MODE')) { } \TYPO3\CMS\Extbase\Utility\ExtensionUtility::registerPlugin( - 'IMATHUZH.' . $_EXTKEY, + 'IMATHUZH.' . 'qfq', 'Qfq', 'QFQ Element', 'EXT:qfq/ext_icon.png' -- GitLab From 4525445f0b02f1b0b748a07042b84b55bc81d2f4 Mon Sep 17 00:00:00 2001 From: Marc Egger <marc.egger@uzh.ch> Date: Fri, 6 Nov 2020 13:45:51 +0100 Subject: [PATCH 182/195] T3Handler.php: password hashing T3-10 compatible --- extension/Classes/Core/Constants.php | 2 + extension/Classes/Core/Store/Config.php | 6 +- extension/Classes/Core/Typo3/T3Handler.php | 89 ++++++++++++++++++---- 3 files changed, 81 insertions(+), 16 deletions(-) diff --git a/extension/Classes/Core/Constants.php b/extension/Classes/Core/Constants.php index 0b1eb5ae2..b43c8ab04 100644 --- a/extension/Classes/Core/Constants.php +++ b/extension/Classes/Core/Constants.php @@ -497,6 +497,8 @@ const SYSTEM_DB_NAME_DATA = 'dbNameData'; const SYSTEM_DB_NAME_QFQ = 'dbNameQfq'; const SYSTEM_DB_NAME_T3 = 'dbNameT3'; +const SYSTEM_PW_HASHING_CLASS = 'passwordHashingClassName'; + const SYSTEM_QFQ_LOG_PATHFILENAME = 'qfqLog'; // absolute or relative to app const SYSTEM_MAIL_LOG_PATHFILENAME = 'mailLog'; // absolute or relative to app diff --git a/extension/Classes/Core/Store/Config.php b/extension/Classes/Core/Store/Config.php index 682bf4c9f..5499fdf71 100644 --- a/extension/Classes/Core/Store/Config.php +++ b/extension/Classes/Core/Store/Config.php @@ -43,7 +43,7 @@ class Config { public static function get(string $key) { self::readConfig(); - return self::$config[$key]; + return self::$config[$key] ?? null; } /** @@ -203,6 +203,7 @@ class Config { // Typo3 version >=10 $configT3qfq = $GLOBALS['TYPO3_CONF_VARS']['EXTENSIONS'][EXT_KEY]; $configT3qfq[SYSTEM_DB_NAME_T3] = self::getDbName($GLOBALS['TYPO3_CONF_VARS']['DB']); + $configT3qfq[SYSTEM_PW_HASHING_CLASS] = $GLOBALS['TYPO3_CONF_VARS']['BE']['passwordHashing']['className']; } elseif (isset($GLOBALS['TYPO3_CONF_VARS']['EXT']['extConf'][EXT_KEY])) { // Typo3 version <=8 @@ -215,12 +216,13 @@ class Config { if (isset($configT3['EXTENSIONS'][EXT_KEY])) { // Typo3 version >=10 $configT3qfq = $configT3['EXTENSIONS'][EXT_KEY]; + $configT3qfq[SYSTEM_PW_HASHING_CLASS] = $configT3['BE']['passwordHashing']['className']; } else { // Typo3 version <=8 $configT3qfq = unserialize($configT3['EXT']['extConf'][EXT_KEY]); } if (!is_array($configT3qfq)) { - Thrower::userFormException('Error read file', "Error while unserializing qfq config from: $cwdToTypo3ConfigFile"); + Thrower::userFormException('Error read file', "Error while reading qfq config from: $cwdToTypo3ConfigFile"); } $configT3qfq[SYSTEM_DB_NAME_T3] = self::getDbName($configT3['DB']); unset($configT3); diff --git a/extension/Classes/Core/Typo3/T3Handler.php b/extension/Classes/Core/Typo3/T3Handler.php index 0523b5662..90cfc8440 100644 --- a/extension/Classes/Core/Typo3/T3Handler.php +++ b/extension/Classes/Core/Typo3/T3Handler.php @@ -10,6 +10,7 @@ namespace IMATHUZH\Qfq\Core\Typo3; use IMATHUZH\Qfq\Core\Helper\Path; use IMATHUZH\Qfq\Core\Helper\Support; +use IMATHUZH\Qfq\Core\Store\Config; /** @@ -39,62 +40,122 @@ class T3Handler { /** - * Based on https://docs.typo3.org/typo3cms/extensions/saltedpasswords/8.7/DevelopersGuide/Index.html * Convert a cleartext password to a hash. Respects if 'salted passwords' are enabled. + * Legacy code (Typo3 version <=8) based on https://docs.typo3.org/typo3cms/extensions/saltedpasswords/8.7/DevelopersGuide/Index.html * * @param string $newPassword * @return string + * @throws \CodeException + * @throws \UserFormException + * @throws \UserReportException */ public static function getHash($newPassword) { // Restore T3 ErrorHandler. T3 throws exceptions - those should be handled by T3! restore_error_handler(); - $saltedPassword = md5($newPassword); // Use md5 as fallback - self::t3AutoloadIfNotRunning(); - if (\TYPO3\CMS\Saltedpasswords\Utility\SaltedPasswordsUtility::isUsageEnabled('FE')) { - $objSalt = \TYPO3\CMS\Saltedpasswords\Salt\SaltFactory::getSaltingInstance(NULL); - if (is_object($objSalt)) { - $saltedPassword = $objSalt->getHashedPassword($newPassword); + $saltedPassword = null; + + $t3Hasher = self::getT3HashingInstance(); //implements interface: TYPO3\CMS\Core\Crypto\PasswordHashing\PasswordHashInterface + if (!is_null($t3Hasher)) { + + // Typo3 version >=10 + $saltedPassword = $t3Hasher->getHashedPassword($newPassword); + + } elseif (class_exists('\TYPO3\CMS\Saltedpasswords\Utility\SaltedPasswordsUtility') && class_exists('\TYPO3\CMS\Saltedpasswords\Salt\SaltFactory')) { + + // Typo3 version <=8 + if (\TYPO3\CMS\Saltedpasswords\Utility\SaltedPasswordsUtility::isUsageEnabled('FE')) { + $objSalt = \TYPO3\CMS\Saltedpasswords\Salt\SaltFactory::getSaltingInstance(NULL); + if (is_object($objSalt)) { + $saltedPassword = $objSalt->getHashedPassword($newPassword); + } } + } // Activate QFQ ErrorHandler again. Support::setQfqErrorHandler(); + if (is_null($saltedPassword)) { + // Fallback, use Argon2i algorithm (with current default options of typo3 in year 2020) + $saltedPassword = password_hash($newPassword, PASSWORD_ARGON2I, ['memory_cost' => 65536, 'time_cost' => 16, 'threads' => 1]); + } + return $saltedPassword; } /** - * Based on https://docs.typo3.org/typo3cms/extensions/saltedpasswords/8.7/DevelopersGuide/Index.html * Check if the salted password corresponds to the password. + * Legacy code (Typo3 version <=8) based on https://docs.typo3.org/typo3cms/extensions/saltedpasswords/8.7/DevelopersGuide/Index.html * * @param string $saltedPassword * @param string $password * @return bool + * @throws \CodeException + * @throws \UserFormException + * @throws \UserReportException */ public static function checkPassword($saltedPassword, $password) { + $success = null; + // Restore T3 ErrorHandler. T3 throws exceptions - those should be handled by T3! restore_error_handler(); - self::t3AutoloadIfNotRunning(); - $success = FALSE; - if (\TYPO3\CMS\Saltedpasswords\Utility\SaltedPasswordsUtility::isUsageEnabled('FE')) { - $objSalt2 = \TYPO3\CMS\Saltedpasswords\Salt\SaltFactory::getSaltingInstance($saltedPassword); - if (is_object($objSalt2)) { - $success = $objSalt2->checkPassword($password, $saltedPassword); + $t3Hasher = self::getT3HashingInstance(); //implements interface: TYPO3\CMS\Core\Crypto\PasswordHashing\PasswordHashInterface + if (!is_null($t3Hasher)) { + + // Typo3 version >=10 + $success = $t3Hasher->checkPassword($password, $saltedPassword); + + + } elseif (class_exists('\TYPO3\CMS\Saltedpasswords\Utility\SaltedPasswordsUtility') && class_exists('\TYPO3\CMS\Saltedpasswords\Salt\SaltFactory')) { + + // Typo3 version <=8 + if (\TYPO3\CMS\Saltedpasswords\Utility\SaltedPasswordsUtility::isUsageEnabled('FE')) { + $objSalt2 = \TYPO3\CMS\Saltedpasswords\Salt\SaltFactory::getSaltingInstance($saltedPassword); + if (is_object($objSalt2)) { + $success = $objSalt2->checkPassword($password, $saltedPassword); + } } + } // Activate QFQ ErrorHandler again. Support::setQfqErrorHandler(); + if (is_null($success)) { + // fallback use php function directly + $success = password_verify($password, $saltedPassword); + } + return $success; } + /** + * Return an instance of the Typo3 password hashing class as configured in LocalConfiguration.php + * Returns object which implements interface: TYPO3\CMS\Core\Crypto\PasswordHashing\PasswordHashInterface + * + * @return mixed|null + * @throws \CodeException + * @throws \UserFormException + * @throws \UserReportException + */ + public static function getT3HashingInstance() + { + self::t3AutoloadIfNotRunning(); + $hashingClass = Config::get(SYSTEM_PW_HASHING_CLASS); + if(!is_string($hashingClass) || !class_exists($hashingClass)) { + return null; + } + return new $hashingClass; + } + /** * Load Typo3 autoloader if Typo3 is not instantiated + * + * @throws \UserFormException */ public static function t3AutoloadIfNotRunning() { -- GitLab From 821662036b5d011ff735360f93c2e27fa9160036 Mon Sep 17 00:00:00 2001 From: Marc Egger <marc.egger@uzh.ch> Date: Fri, 13 Nov 2020 11:40:38 +0100 Subject: [PATCH 183/195] T3v10: beUserLoggedIn, password hashing, Page Language --- extension/Classes/Controller/QfqController.php | 2 +- extension/Classes/Core/Helper/Path.php | 2 +- extension/Classes/Core/Report/Variables.php | 12 +++++++++++- extension/Classes/Core/Store/Config.php | 9 ++++++--- extension/Classes/Core/Store/Store.php | 2 +- extension/Classes/Core/Store/T3Info.php | 14 +++++++++++--- extension/Classes/Core/Typo3/T3Handler.php | 7 +++++++ 7 files changed, 38 insertions(+), 10 deletions(-) diff --git a/extension/Classes/Controller/QfqController.php b/extension/Classes/Controller/QfqController.php index dc97f9de6..d6959d0a1 100644 --- a/extension/Classes/Controller/QfqController.php +++ b/extension/Classes/Controller/QfqController.php @@ -35,6 +35,7 @@ class QfqController extends \TYPO3\CMS\Extbase\Mvc\Controller\ActionController { $flagOk = false; try { + Path::setMainPaths(''); $contentObject = $this->configurationManager->getContentObject(); // By T3 default 'E_NOTICE' is unset. E.g. 'Undefined Index' will throw an exception. @@ -42,7 +43,6 @@ class QfqController extends \TYPO3\CMS\Extbase\Mvc\Controller\ActionController { $origErrorReporting = error_reporting(); error_reporting($origErrorReporting | E_NOTICE); - Path::setMainPaths(''); $qfq = new QuickFormQuery($contentObject->data); $html = $qfq->process(); $flagOk = true; diff --git a/extension/Classes/Core/Helper/Path.php b/extension/Classes/Core/Helper/Path.php index 9abaa5673..120e18b21 100644 --- a/extension/Classes/Core/Helper/Path.php +++ b/extension/Classes/Core/Helper/Path.php @@ -485,7 +485,7 @@ EOF; */ private static function enforcePathIsSet($path) { if(is_null($path)) { - Thrower::userFormException('Path accessed before set.', 'Make sure Path::setMainPaths() is called before.'); + Thrower::userFormException('Path accessed before set.', 'Make sure Path::setMainPaths(...) is called before this code is executed..'); } } diff --git a/extension/Classes/Core/Report/Variables.php b/extension/Classes/Core/Report/Variables.php index bd5ffa785..98885c658 100644 --- a/extension/Classes/Core/Report/Variables.php +++ b/extension/Classes/Core/Report/Variables.php @@ -159,7 +159,17 @@ class Variables { if (isset($GLOBALS["TSFE"])) { $arr["page_id"] = $GLOBALS["TSFE"]->id; $arr["page_type"] = $GLOBALS["TSFE"]->type; - $arr["page_language_uid"] = $GLOBALS["TSFE"]->sys_language_uid; + + $arr["page_language_uid"] = $GLOBALS["TSFE"]->sys_language_uid; // DEPRECATED + /** ?CR + * TODO: Remove page_language_uid if not used or migrate to new + * + * Deprecation: #85543 - Language-related properties in TypoScriptFrontendController and PageRepository + * Migration: + * $languageAspect = GeneralUtility::makeInstance(Context::class)->getAspect('language'); + * (previously known as TSFE->sys_language_uid) + */ + } return ($arr); diff --git a/extension/Classes/Core/Store/Config.php b/extension/Classes/Core/Store/Config.php index 5499fdf71..5ece5163f 100644 --- a/extension/Classes/Core/Store/Config.php +++ b/extension/Classes/Core/Store/Config.php @@ -204,6 +204,7 @@ class Config { $configT3qfq = $GLOBALS['TYPO3_CONF_VARS']['EXTENSIONS'][EXT_KEY]; $configT3qfq[SYSTEM_DB_NAME_T3] = self::getDbName($GLOBALS['TYPO3_CONF_VARS']['DB']); $configT3qfq[SYSTEM_PW_HASHING_CLASS] = $GLOBALS['TYPO3_CONF_VARS']['BE']['passwordHashing']['className']; + // NOTE: This does not use the official API to access Typo3 password hashing. Here is the official API: https://docs.typo3.org/m/typo3/reference-coreapi/master/en-us/ApiOverview/PasswordHashing/ } elseif (isset($GLOBALS['TYPO3_CONF_VARS']['EXT']['extConf'][EXT_KEY])) { // Typo3 version <=8 @@ -217,6 +218,7 @@ class Config { // Typo3 version >=10 $configT3qfq = $configT3['EXTENSIONS'][EXT_KEY]; $configT3qfq[SYSTEM_PW_HASHING_CLASS] = $configT3['BE']['passwordHashing']['className']; + // NOTE: This does not use the official API to access Typo3 password hashing. Here is the official API: https://docs.typo3.org/m/typo3/reference-coreapi/master/en-us/ApiOverview/PasswordHashing/ } else { // Typo3 version <=8 $configT3qfq = unserialize($configT3['EXT']['extConf'][EXT_KEY]); @@ -577,11 +579,12 @@ class Config { * * @return bool true: current Browser session is a logged in BE User. */ - private static function beUserLoggedIn() { + public static function beUserLoggedIn() { - if (isset($GLOBALS["BE_USER"]) && $GLOBALS["BE_USER"]->loginType === "BE") { + if (class_exists('TYPO3\CMS\Core\Context\Context')) { // Typo3 version >=10 - return true; + $context = \TYPO3\CMS\Core\Utility\GeneralUtility::makeInstance(\TYPO3\CMS\Core\Context\Context::class); + return $context->getPropertyFromAspect('backend.user', 'isLoggedIn'); } elseif (!empty($GLOBALS["TSFE"]->beUserLogin) && $GLOBALS["TSFE"]->beUserLogin === true) { // Typo3 version <=8 return true; diff --git a/extension/Classes/Core/Store/Store.php b/extension/Classes/Core/Store/Store.php index e38fbe6b9..517132666 100644 --- a/extension/Classes/Core/Store/Store.php +++ b/extension/Classes/Core/Store/Store.php @@ -710,7 +710,7 @@ class Store { } } - $t3varsArray[TYPO3_BE_USER_LOGGED_IN] = (isset($GLOBALS["TSFE"]->beUserLogin) && $GLOBALS["TSFE"]->beUserLogin === true) ? 'yes' : 'no'; + $t3varsArray[TYPO3_BE_USER_LOGGED_IN] = Config::beUserLoggedIn() ? 'yes' : 'no'; $t3varsString = KeyValueStringParser::unparse($t3varsArray, '=', '&'); $t3sip = self::$sip->queryStringToSip($t3varsString, RETURN_SIP); diff --git a/extension/Classes/Core/Store/T3Info.php b/extension/Classes/Core/Store/T3Info.php index e8b4681e4..2793fb7fa 100644 --- a/extension/Classes/Core/Store/T3Info.php +++ b/extension/Classes/Core/Store/T3Info.php @@ -40,9 +40,17 @@ class T3Info { $t3vars[TYPO3_PAGE_TYPE] = isset($GLOBALS["TSFE"]->type) ? $GLOBALS["TSFE"]->type : ''; - $t3vars[TYPO3_PAGE_LANGUAGE] = isset($GLOBALS["TSFE"]->sys_language_uid) ? $GLOBALS["TSFE"]->sys_language_uid : ''; - - $t3vars[TYPO3_BE_USER_LOGGED_IN] = (isset($GLOBALS["TSFE"]->beUserLogin) && $GLOBALS["TSFE"]->beUserLogin === true) ? 'yes' : 'no'; + $t3vars[TYPO3_PAGE_LANGUAGE] = isset($GLOBALS["TSFE"]->sys_language_uid) ? $GLOBALS["TSFE"]->sys_language_uid : ''; // DEPRECATED + /** ?CR + * TODO: Remove page_language_uid if not used or migrate to new + * + * Deprecation: #85543 - Language-related properties in TypoScriptFrontendController and PageRepository + * Migration: + * $languageAspect = GeneralUtility::makeInstance(Context::class)->getAspect('language'); + * (previously known as TSFE->sys_language_uid) + */ + + $t3vars[TYPO3_BE_USER_LOGGED_IN] = Config::beUserLoggedIn() ? 'yes' : 'no'; $t3vars[TYPO3_BE_USER] = isset($GLOBALS["BE_USER"]->user["username"]) ? $GLOBALS["BE_USER"]->user["username"] : ''; diff --git a/extension/Classes/Core/Typo3/T3Handler.php b/extension/Classes/Core/Typo3/T3Handler.php index 90cfc8440..8bafc9d96 100644 --- a/extension/Classes/Core/Typo3/T3Handler.php +++ b/extension/Classes/Core/Typo3/T3Handler.php @@ -41,6 +41,7 @@ class T3Handler { /** * Convert a cleartext password to a hash. Respects if 'salted passwords' are enabled. + * NOTE: This does not use the official API to access Typo3 password hashing. Here is the official API: https://docs.typo3.org/m/typo3/reference-coreapi/master/en-us/ApiOverview/PasswordHashing/ * Legacy code (Typo3 version <=8) based on https://docs.typo3.org/typo3cms/extensions/saltedpasswords/8.7/DevelopersGuide/Index.html * * @param string $newPassword @@ -61,6 +62,7 @@ class T3Handler { // Typo3 version >=10 $saltedPassword = $t3Hasher->getHashedPassword($newPassword); + // NOTE: This does not use the official API to access Typo3 password hashing. Here is the official API: https://docs.typo3.org/m/typo3/reference-coreapi/master/en-us/ApiOverview/PasswordHashing/ } elseif (class_exists('\TYPO3\CMS\Saltedpasswords\Utility\SaltedPasswordsUtility') && class_exists('\TYPO3\CMS\Saltedpasswords\Salt\SaltFactory')) { @@ -87,6 +89,7 @@ class T3Handler { /** * Check if the salted password corresponds to the password. + * NOTE: This does not use the official API to access Typo3 password hashing. Here is the official API: https://docs.typo3.org/m/typo3/reference-coreapi/master/en-us/ApiOverview/PasswordHashing/ * Legacy code (Typo3 version <=8) based on https://docs.typo3.org/typo3cms/extensions/saltedpasswords/8.7/DevelopersGuide/Index.html * * @param string $saltedPassword @@ -108,6 +111,7 @@ class T3Handler { // Typo3 version >=10 $success = $t3Hasher->checkPassword($password, $saltedPassword); + // NOTE: This does not use the official API to access Typo3 password hashing. Here is the official API: https://docs.typo3.org/m/typo3/reference-coreapi/master/en-us/ApiOverview/PasswordHashing/ } elseif (class_exists('\TYPO3\CMS\Saltedpasswords\Utility\SaltedPasswordsUtility') && class_exists('\TYPO3\CMS\Saltedpasswords\Salt\SaltFactory')) { @@ -136,6 +140,7 @@ class T3Handler { /** * Return an instance of the Typo3 password hashing class as configured in LocalConfiguration.php * Returns object which implements interface: TYPO3\CMS\Core\Crypto\PasswordHashing\PasswordHashInterface + * NOTE: This does not use the official API to access Typo3 password hashing. Here is the official API: https://docs.typo3.org/m/typo3/reference-coreapi/master/en-us/ApiOverview/PasswordHashing/ * * @return mixed|null * @throws \CodeException @@ -171,6 +176,8 @@ class T3Handler { // run typo3 bootstrap if not yet happened. Necessary if run in unittest. if (!defined('TYPO3_MODE')) { + + // NOTE: Deprecated: Deprecation: #85821 - bootstrap methods \TYPO3\CMS\Core\Core\Bootstrap::getInstance() ->setRequestType(TYPO3_REQUESTTYPE_AJAX) ->baseSetup(0); -- GitLab From 6412aa1ea6d2ba03f9a8033d0a2cf94a25b858f5 Mon Sep 17 00:00:00 2001 From: Marc Egger <marc.egger@uzh.ch> Date: Thu, 19 Nov 2020 11:14:04 +0100 Subject: [PATCH 184/195] Fix: [FAF] Drag and drop: only export form file once rather than for every formElement --- extension/Classes/Core/Form/DragAndDrop.php | 24 +++++++++++++-------- 1 file changed, 15 insertions(+), 9 deletions(-) diff --git a/extension/Classes/Core/Form/DragAndDrop.php b/extension/Classes/Core/Form/DragAndDrop.php index 2d4cca66a..e2da6a9e8 100644 --- a/extension/Classes/Core/Form/DragAndDrop.php +++ b/extension/Classes/Core/Form/DragAndDrop.php @@ -125,6 +125,10 @@ class DragAndDrop { $nameId = false; $nameOrd = false; + // Import Form from file if loaded record is Form/FormElement (If form file was changed, throw exception) + // Note: This is here since this code is called outside QuickFormQuery->doForm + $formFileName = FormAsFile::importFormRecordId($dragId, $tableName, $this->db); + // Reorder. Get index for 'drag' and 'hover' foreach ($rows as $key => $row) { @@ -164,6 +168,11 @@ class DragAndDrop { $ord += $orderInterval; } + // Export Form file + if ($formFileName !== null) { + FormAsFile::exportForm($formFileName, $this->db); + } + return $data; } @@ -187,6 +196,12 @@ class DragAndDrop { } /** + * Helper function to update order column of single element. + * + * WARNING: This does not update Form file if table is FormElement! + * + * Form file is updated in DragAndDrop->reorder() + * * @param string $tableName * @param string $orderColumn * @param int $id @@ -204,17 +219,8 @@ class DragAndDrop { return $data; } - // Import Form from file if loaded record is Form/FormElement (If form file was changed, throw exception) - // Note: This is here since this code is called outside QuickFormQuery->doForm - $formFileName = FormAsFile::importFormRecordId($id, $tableName, $this->db); - $this->db->sql("UPDATE `$tableName` SET `$orderColumn`=? WHERE `id`=?", ROW_REGULAR, [$ordNew, $id]); - // Export Form file - if ($formFileName !== null) { - FormAsFile::exportForm($formFileName, $this->db); - } - // Converting to string is necessary: JSON detects int else. $data[API_ELEMENT_UPDATE][DND_ORD_HTML_ID_PREFIX . $id][API_ELEMENT_CONTENT] = (string)$ordNew; -- GitLab From fd4cea460fbff9b3911798922e93b2935e3de17b Mon Sep 17 00:00:00 2001 From: Marc Egger <marc.egger@uzh.ch> Date: Thu, 19 Nov 2020 11:45:10 +0100 Subject: [PATCH 185/195] Path.php: default qfqProject to fileadmin/protected if typo3 used --- extension/Classes/Core/Helper/Path.php | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/extension/Classes/Core/Helper/Path.php b/extension/Classes/Core/Helper/Path.php index 120e18b21..ab4f49b99 100644 --- a/extension/Classes/Core/Helper/Path.php +++ b/extension/Classes/Core/Helper/Path.php @@ -53,8 +53,8 @@ class Path // QFQ Project dir private static $appToProject = null; private const APP_TO_PROJECT_DEFAULT = '../'; + private const APP_TO_FILEADMIN = 'fileadmin'; private const APP_TO_PROJECT_IN_PROTECTED = 'fileadmin/protected/qfqProject'; - private const APP_TO_PROTECTED = 'fileadmin/protected'; const PROJECT_TO_FORM = 'form'; const FORM_TO_FORM_BACKUP = '_backup'; const PROJECT_DIR_TO_REPORT = 'report'; @@ -442,8 +442,8 @@ class Path Config::migrateConfigPhpToJson(); self::writeProjectPathPhp(); - // does fileadmin/protected exist? => fileadmin/protected/qfqProject - } elseif (file_exists(self::cwdToApp(self::APP_TO_PROTECTED))) { + // does fileadmin exist? => fileadmin/protected/qfqProject + } elseif (file_exists(self::cwdToApp(self::APP_TO_FILEADMIN))) { HelperFile::createPathRecursive(self::cwdToApp(self::APP_TO_PROJECT_IN_PROTECTED)); self::setAppToProject(self::APP_TO_PROJECT_IN_PROTECTED); self::writeProjectPathPhp(); -- GitLab From a7d284e663fc4b310d5ef1c5b2776162f6f1e2c5 Mon Sep 17 00:00:00 2001 From: Marc Egger <marc.egger@uzh.ch> Date: Wed, 25 Nov 2020 11:47:29 +0100 Subject: [PATCH 186/195] fix: typo3 9 shows error when installing extension --- extension/ext_emconf.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/extension/ext_emconf.php b/extension/ext_emconf.php index 5cf343267..acb436223 100644 --- a/extension/ext_emconf.php +++ b/extension/ext_emconf.php @@ -15,7 +15,7 @@ $EM_CONF['qfq'] = array( 'version' => '20.11.0', 'constraints' => [ 'depends' => [ - 'typo3' => '7.0.0-9.2.99', + 'typo3' => '7.0.0-10.9.99', ], 'conflicts' => [], 'suggests' => [], -- GitLab From 7f33ef07c7b45251c7891cf309c66987e4d36771 Mon Sep 17 00:00:00 2001 From: Marc Egger <marc.egger@uzh.ch> Date: Wed, 25 Nov 2020 22:01:43 +0100 Subject: [PATCH 187/195] T3v10: replace deprecated system_language_uid and move beUserLoggedIn() out of Config.php --- extension/Classes/Core/Report/Variables.php | 12 +---- extension/Classes/Core/Store/Config.php | 24 ++-------- extension/Classes/Core/Store/Store.php | 2 +- extension/Classes/Core/Store/T3Info.php | 52 ++++++++++++++++----- extension/Classes/Core/Typo3/T3Handler.php | 10 ++-- 5 files changed, 52 insertions(+), 48 deletions(-) diff --git a/extension/Classes/Core/Report/Variables.php b/extension/Classes/Core/Report/Variables.php index 98885c658..e3fb1fc37 100644 --- a/extension/Classes/Core/Report/Variables.php +++ b/extension/Classes/Core/Report/Variables.php @@ -24,7 +24,7 @@ namespace IMATHUZH\Qfq\Core\Report; use IMATHUZH\Qfq\Core\Evaluate; - +use IMATHUZH\Qfq\Core\Store\T3Info; /** @@ -160,15 +160,7 @@ class Variables { $arr["page_id"] = $GLOBALS["TSFE"]->id; $arr["page_type"] = $GLOBALS["TSFE"]->type; - $arr["page_language_uid"] = $GLOBALS["TSFE"]->sys_language_uid; // DEPRECATED - /** ?CR - * TODO: Remove page_language_uid if not used or migrate to new - * - * Deprecation: #85543 - Language-related properties in TypoScriptFrontendController and PageRepository - * Migration: - * $languageAspect = GeneralUtility::makeInstance(Context::class)->getAspect('language'); - * (previously known as TSFE->sys_language_uid) - */ + $arr["page_language_uid"] = T3Info::getLanguageId(); } diff --git a/extension/Classes/Core/Store/Config.php b/extension/Classes/Core/Store/Config.php index 5ece5163f..284474257 100644 --- a/extension/Classes/Core/Store/Config.php +++ b/extension/Classes/Core/Store/Config.php @@ -200,7 +200,7 @@ class Config { { $configT3qfq = array(); if (isset($GLOBALS['TYPO3_CONF_VARS']['EXTENSIONS'][EXT_KEY])) { - // Typo3 version >=10 + // Typo3 version >=9 $configT3qfq = $GLOBALS['TYPO3_CONF_VARS']['EXTENSIONS'][EXT_KEY]; $configT3qfq[SYSTEM_DB_NAME_T3] = self::getDbName($GLOBALS['TYPO3_CONF_VARS']['DB']); $configT3qfq[SYSTEM_PW_HASHING_CLASS] = $GLOBALS['TYPO3_CONF_VARS']['BE']['passwordHashing']['className']; @@ -215,7 +215,7 @@ class Config { $cwdToTypo3ConfigFile = Path::cwdToApp(Path::APP_TO_TYPO3_CONF, CONFIG_T3); $configT3 = HelperFile::include($cwdToTypo3ConfigFile); if (isset($configT3['EXTENSIONS'][EXT_KEY])) { - // Typo3 version >=10 + // Typo3 version >=9 $configT3qfq = $configT3['EXTENSIONS'][EXT_KEY]; $configT3qfq[SYSTEM_PW_HASHING_CLASS] = $configT3['BE']['passwordHashing']['className']; // NOTE: This does not use the official API to access Typo3 password hashing. Here is the official API: https://docs.typo3.org/m/typo3/reference-coreapi/master/en-us/ApiOverview/PasswordHashing/ @@ -541,7 +541,7 @@ class Config { */ private static function adjustConfig(array $config) { - $config[SYSTEM_SHOW_DEBUG_INFO] = self::adjustConfigDebugInfoAuto($config[SYSTEM_SHOW_DEBUG_INFO], self::beUserLoggedIn()); + $config[SYSTEM_SHOW_DEBUG_INFO] = self::adjustConfigDebugInfoAuto($config[SYSTEM_SHOW_DEBUG_INFO], T3Info::beUserLoggedIn()); // In case the database credentials are given in the old style: copy them to the new style if (!isset($config[SYSTEM_DB_1_USER]) && isset($config[SYSTEM_DB_USER])) { @@ -574,24 +574,6 @@ class Config { return $value; } - /** - * Check if there is a Typo3 beUser is logged in. This is only possible if QFQ is called via T3, not via API - * - * @return bool true: current Browser session is a logged in BE User. - */ - public static function beUserLoggedIn() { - - if (class_exists('TYPO3\CMS\Core\Context\Context')) { - // Typo3 version >=10 - $context = \TYPO3\CMS\Core\Utility\GeneralUtility::makeInstance(\TYPO3\CMS\Core\Context\Context::class); - return $context->getPropertyFromAspect('backend.user', 'isLoggedIn'); - } elseif (!empty($GLOBALS["TSFE"]->beUserLogin) && $GLOBALS["TSFE"]->beUserLogin === true) { - // Typo3 version <=8 - return true; - } - return false; - } - /** * Set automatic filled values * diff --git a/extension/Classes/Core/Store/Store.php b/extension/Classes/Core/Store/Store.php index 517132666..2dd054fa7 100644 --- a/extension/Classes/Core/Store/Store.php +++ b/extension/Classes/Core/Store/Store.php @@ -710,7 +710,7 @@ class Store { } } - $t3varsArray[TYPO3_BE_USER_LOGGED_IN] = Config::beUserLoggedIn() ? 'yes' : 'no'; + $t3varsArray[TYPO3_BE_USER_LOGGED_IN] = T3Info::beUserLoggedIn() ? 'yes' : 'no'; $t3varsString = KeyValueStringParser::unparse($t3varsArray, '=', '&'); $t3sip = self::$sip->queryStringToSip($t3varsString, RETURN_SIP); diff --git a/extension/Classes/Core/Store/T3Info.php b/extension/Classes/Core/Store/T3Info.php index 2793fb7fa..8e1c4e9ef 100644 --- a/extension/Classes/Core/Store/T3Info.php +++ b/extension/Classes/Core/Store/T3Info.php @@ -40,20 +40,50 @@ class T3Info { $t3vars[TYPO3_PAGE_TYPE] = isset($GLOBALS["TSFE"]->type) ? $GLOBALS["TSFE"]->type : ''; - $t3vars[TYPO3_PAGE_LANGUAGE] = isset($GLOBALS["TSFE"]->sys_language_uid) ? $GLOBALS["TSFE"]->sys_language_uid : ''; // DEPRECATED - /** ?CR - * TODO: Remove page_language_uid if not used or migrate to new - * - * Deprecation: #85543 - Language-related properties in TypoScriptFrontendController and PageRepository - * Migration: - * $languageAspect = GeneralUtility::makeInstance(Context::class)->getAspect('language'); - * (previously known as TSFE->sys_language_uid) - */ - - $t3vars[TYPO3_BE_USER_LOGGED_IN] = Config::beUserLoggedIn() ? 'yes' : 'no'; + $t3vars[TYPO3_PAGE_LANGUAGE] = self::getLanguageId(); + + $t3vars[TYPO3_BE_USER_LOGGED_IN] = self::beUserLoggedIn() ? 'yes' : 'no'; $t3vars[TYPO3_BE_USER] = isset($GLOBALS["BE_USER"]->user["username"]) ? $GLOBALS["BE_USER"]->user["username"] : ''; return $t3vars; } + + /** + * Returns the page language uid. This is only possible if QFQ is called via T3, not via API. + * + * @return string + */ + public static function getLanguageId() + { + if (class_exists('TYPO3\CMS\Core\Context\Context')) { + // Typo3 version >=9 + $context = \TYPO3\CMS\Core\Utility\GeneralUtility::makeInstance(\TYPO3\CMS\Core\Context\Context::class); + $languageAspect = $context->getAspect('language'); + // (previously known as TSFE->sys_language_uid) + return $languageAspect->getId(); + } elseif (isset($GLOBALS["TSFE"]->sys_language_uid)) { + // Typo3 version <=8 + return $GLOBALS["TSFE"]->sys_language_uid; + } + return ''; + } + + /** + * Check if there is a Typo3 beUser is logged in. This is only possible if QFQ is called via T3, not via API + * + * @return bool true: current Browser session is a logged in BE User. + */ + public static function beUserLoggedIn() { + + if (class_exists('TYPO3\CMS\Core\Context\Context')) { + // Typo3 version >=9 + $context = \TYPO3\CMS\Core\Utility\GeneralUtility::makeInstance(\TYPO3\CMS\Core\Context\Context::class); + return $context->getPropertyFromAspect('backend.user', 'isLoggedIn'); + } elseif (!empty($GLOBALS["TSFE"]->beUserLogin) && $GLOBALS["TSFE"]->beUserLogin === true) { + // Typo3 version <=8 + return true; + } + return false; + } } \ No newline at end of file diff --git a/extension/Classes/Core/Typo3/T3Handler.php b/extension/Classes/Core/Typo3/T3Handler.php index 8bafc9d96..55480e3cf 100644 --- a/extension/Classes/Core/Typo3/T3Handler.php +++ b/extension/Classes/Core/Typo3/T3Handler.php @@ -60,7 +60,7 @@ class T3Handler { $t3Hasher = self::getT3HashingInstance(); //implements interface: TYPO3\CMS\Core\Crypto\PasswordHashing\PasswordHashInterface if (!is_null($t3Hasher)) { - // Typo3 version >=10 + // Typo3 version >=9 $saltedPassword = $t3Hasher->getHashedPassword($newPassword); // NOTE: This does not use the official API to access Typo3 password hashing. Here is the official API: https://docs.typo3.org/m/typo3/reference-coreapi/master/en-us/ApiOverview/PasswordHashing/ @@ -109,7 +109,7 @@ class T3Handler { $t3Hasher = self::getT3HashingInstance(); //implements interface: TYPO3\CMS\Core\Crypto\PasswordHashing\PasswordHashInterface if (!is_null($t3Hasher)) { - // Typo3 version >=10 + // Typo3 version >=9 $success = $t3Hasher->checkPassword($password, $saltedPassword); // NOTE: This does not use the official API to access Typo3 password hashing. Here is the official API: https://docs.typo3.org/m/typo3/reference-coreapi/master/en-us/ApiOverview/PasswordHashing/ @@ -167,7 +167,7 @@ class T3Handler { if (!class_exists('\TYPO3\CMS\Core\Utility\GeneralUtility')) { if (file_exists(Path::absoluteApp('vendor/autoload.php'))) { - // Typo3 version >=10 + // Typo3 version >=9 require Path::absoluteApp('vendor/autoload.php'); } else { // Typo3 version <=8 @@ -211,7 +211,7 @@ class T3Handler { // Same as $GLOBALS['TYPO3_CONF_VARS']['EXT']['extConf']['qfq'] $configT3 = $configurationManager->getLocalConfiguration(); if (isset($configT3['EXTENSIONS'][EXT_KEY])) { - // Typo3 version >=10 + // Typo3 version >=9 $configQfq = $configT3['EXTENSIONS'][EXT_KEY]; } else { // Typo3 version <=8 @@ -223,7 +223,7 @@ class T3Handler { // Prepare if (isset($configT3['EXTENSIONS'][EXT_KEY])) { - // Typo3 version >=10 + // Typo3 version >=9 $configT3['EXTENSIONS'][EXT_KEY] = $configQfq; } else { // Typo3 version <=8 -- GitLab From 6060d37afef46499b5c7ed2875630f4dc85348e7 Mon Sep 17 00:00:00 2001 From: Marc Egger <marc.egger@uzh.ch> Date: Fri, 27 Nov 2020 16:25:19 +0100 Subject: [PATCH 188/195] fix: cool new password hashing API is not available in T3 v9 --- extension/Classes/Core/Store/Config.php | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/extension/Classes/Core/Store/Config.php b/extension/Classes/Core/Store/Config.php index 284474257..f8ec8c6ec 100644 --- a/extension/Classes/Core/Store/Config.php +++ b/extension/Classes/Core/Store/Config.php @@ -203,7 +203,8 @@ class Config { // Typo3 version >=9 $configT3qfq = $GLOBALS['TYPO3_CONF_VARS']['EXTENSIONS'][EXT_KEY]; $configT3qfq[SYSTEM_DB_NAME_T3] = self::getDbName($GLOBALS['TYPO3_CONF_VARS']['DB']); - $configT3qfq[SYSTEM_PW_HASHING_CLASS] = $GLOBALS['TYPO3_CONF_VARS']['BE']['passwordHashing']['className']; + // Typo3 version >=10 + $configT3qfq[SYSTEM_PW_HASHING_CLASS] = $GLOBALS['TYPO3_CONF_VARS']['BE']['passwordHashing']['className'] ?? null; // NOTE: This does not use the official API to access Typo3 password hashing. Here is the official API: https://docs.typo3.org/m/typo3/reference-coreapi/master/en-us/ApiOverview/PasswordHashing/ } elseif (isset($GLOBALS['TYPO3_CONF_VARS']['EXT']['extConf'][EXT_KEY])) { @@ -217,7 +218,8 @@ class Config { if (isset($configT3['EXTENSIONS'][EXT_KEY])) { // Typo3 version >=9 $configT3qfq = $configT3['EXTENSIONS'][EXT_KEY]; - $configT3qfq[SYSTEM_PW_HASHING_CLASS] = $configT3['BE']['passwordHashing']['className']; + // Typo3 version >=10 + $configT3qfq[SYSTEM_PW_HASHING_CLASS] = $configT3['BE']['passwordHashing']['className'] ?? null; // NOTE: This does not use the official API to access Typo3 password hashing. Here is the official API: https://docs.typo3.org/m/typo3/reference-coreapi/master/en-us/ApiOverview/PasswordHashing/ } else { // Typo3 version <=8 -- GitLab From 7888a8ecfa1cc89497d3451063f9a93ca2d8fd4d Mon Sep 17 00:00:00 2001 From: Marc Egger <marc.egger@uzh.ch> Date: Thu, 17 Dec 2020 11:48:06 +0100 Subject: [PATCH 189/195] Fixes #11750 checkbox produces two input html elements with the same name This fixes the current issue but is not a nice solution. We just loop through all input elements having the same name. It would be better, if we would filter out hidden elements. But this might break some other behaviour... so I chose this approach. --- javascript/src/BSTabs.js | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/javascript/src/BSTabs.js b/javascript/src/BSTabs.js index 831807232..f577ecef4 100644 --- a/javascript/src/BSTabs.js +++ b/javascript/src/BSTabs.js @@ -216,14 +216,17 @@ var QfqNS = QfqNS || {}; return null; } - var iterator = $formControl[0]; - while (iterator !== null) { - if (iterator.hasAttribute('role') && - iterator.getAttribute('role') === 'tabpanel') { - return iterator.id || null; + var i; + var iterator + for (i = 0; i < $formControl.length; i++) { + iterator = $formControl[i]; + while (iterator !== null) { + if (iterator.hasAttribute('role') && + iterator.getAttribute('role') === 'tabpanel') { + return iterator.id || null; + } + iterator = iterator.parentElement; } - - iterator = iterator.parentElement; } return null; -- GitLab From a9be3287bda89a6776a68bab1ea907e17a8bd827 Mon Sep 17 00:00:00 2001 From: Marc Egger <marc.egger@uzh.ch> Date: Thu, 17 Dec 2020 11:56:54 +0100 Subject: [PATCH 190/195] typo: missing semicolon --- javascript/src/BSTabs.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/javascript/src/BSTabs.js b/javascript/src/BSTabs.js index f577ecef4..193fd6cd0 100644 --- a/javascript/src/BSTabs.js +++ b/javascript/src/BSTabs.js @@ -217,7 +217,7 @@ var QfqNS = QfqNS || {}; } var i; - var iterator + var iterator; for (i = 0; i < $formControl.length; i++) { iterator = $formControl[i]; while (iterator !== null) { -- GitLab From 22ab42d13209c750d28f84637cec876a91f0c97e Mon Sep 17 00:00:00 2001 From: Marc Egger <marc.egger@uzh.ch> Date: Thu, 17 Dec 2020 14:09:56 +0100 Subject: [PATCH 191/195] add comment for workaround --- javascript/src/BSTabs.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/javascript/src/BSTabs.js b/javascript/src/BSTabs.js index 193fd6cd0..f690d3a66 100644 --- a/javascript/src/BSTabs.js +++ b/javascript/src/BSTabs.js @@ -218,7 +218,7 @@ var QfqNS = QfqNS || {}; var i; var iterator; - for (i = 0; i < $formControl.length; i++) { + for (i = 0; i < $formControl.length; i++) { // workaroud: checkbox renders two input elements with the same name so we loop through all input elements with that name iterator = $formControl[i]; while (iterator !== null) { if (iterator.hasAttribute('role') && -- GitLab From f9bcc6fea3a6609a62bf9ee9c9d163478b8e550f Mon Sep 17 00:00:00 2001 From: Marc Egger <marc.egger@uzh.ch> Date: Thu, 17 Dec 2020 15:01:02 +0100 Subject: [PATCH 192/195] change comment --- javascript/src/BSTabs.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/javascript/src/BSTabs.js b/javascript/src/BSTabs.js index f690d3a66..096a51fad 100644 --- a/javascript/src/BSTabs.js +++ b/javascript/src/BSTabs.js @@ -218,7 +218,7 @@ var QfqNS = QfqNS || {}; var i; var iterator; - for (i = 0; i < $formControl.length; i++) { // workaroud: checkbox renders two input elements with the same name so we loop through all input elements with that name + for (i = 0; i < $formControl.length; i++) { // workaroud: checkbox renders two input elements with the same name so we loop through all input elements with that name. See issue #11752 iterator = $formControl[i]; while (iterator !== null) { if (iterator.hasAttribute('role') && -- GitLab From 675946629816895cadea83bb494d462cf3a3662d Mon Sep 17 00:00:00 2001 From: Marc Egger <marc.egger@uzh.ch> Date: Tue, 5 Jan 2021 15:57:11 +0100 Subject: [PATCH 193/195] References #11798 : use official password hashing API instead of hack --- Documentation/Variable.rst | 2 +- extension/Classes/Core/Constants.php | 2 - extension/Classes/Core/Store/Config.php | 11 ++--- extension/Classes/Core/Typo3/T3Handler.php | 52 +++++----------------- 4 files changed, 16 insertions(+), 51 deletions(-) diff --git a/Documentation/Variable.rst b/Documentation/Variable.rst index 90e41ac04..fe8ab34a1 100644 --- a/Documentation/Variable.rst +++ b/Documentation/Variable.rst @@ -127,7 +127,7 @@ For QFQ variables and FormElements: +------------------+------+-------+-----------------------------------------------------------------------------------------+ | Name | Form | Query | Pattern | +==================+======+=======+=========================================================================================+ -| **alnumx** | Form | Query | [A-Za-z][0-9]@-_.,;: /() ÀÈÌÒÙà èìòùÃÉÃÓÚÃáéÃóúýÂÊÎÔÛâêîôûÃÑÕãñõÄËÃÖÜŸäëïöüÿçß | +| **alnumx** | Form | Query | [A-Za-z][0-9]@-_.,;: /() ÀÈÌÒÙà èìòùÃÉÃÓÚÃáéÃóúýÂÊÎÔÛâêîôûÃÑÕãñõÄËÃÖÜŸäëïöüÿçß | +------------------+------+-------+-----------------------------------------------------------------------------------------+ | **digit** | Form | Query | [0-9] | +------------------+------+-------+-----------------------------------------------------------------------------------------+ diff --git a/extension/Classes/Core/Constants.php b/extension/Classes/Core/Constants.php index 241746f74..38e9f4ede 100644 --- a/extension/Classes/Core/Constants.php +++ b/extension/Classes/Core/Constants.php @@ -498,8 +498,6 @@ const SYSTEM_DB_NAME_DATA = 'dbNameData'; const SYSTEM_DB_NAME_QFQ = 'dbNameQfq'; const SYSTEM_DB_NAME_T3 = 'dbNameT3'; -const SYSTEM_PW_HASHING_CLASS = 'passwordHashingClassName'; - const SYSTEM_QFQ_LOG_PATHFILENAME = 'qfqLog'; // absolute or relative to app const SYSTEM_MAIL_LOG_PATHFILENAME = 'mailLog'; // absolute or relative to app diff --git a/extension/Classes/Core/Store/Config.php b/extension/Classes/Core/Store/Config.php index f8ec8c6ec..8749feb60 100644 --- a/extension/Classes/Core/Store/Config.php +++ b/extension/Classes/Core/Store/Config.php @@ -42,7 +42,7 @@ class Config { */ public static function get(string $key) { - self::readConfig(); + self::readConfig(); // only reads once return self::$config[$key] ?? null; } @@ -57,7 +57,7 @@ class Config { */ public static function getConfigArray($PhpUnitOverloadCwdToConfigFile = ''): array { - self::readConfig($PhpUnitOverloadCwdToConfigFile); + self::readConfig($PhpUnitOverloadCwdToConfigFile); // only reads once, except if argument !='' return self::$config; } @@ -73,6 +73,7 @@ class Config { private static function readConfig($PhpUnitOverloadCwdToConfigFile = '') { if (self::$config !== null && $PhpUnitOverloadCwdToConfigFile === '') { + // only read once, except phpUnit return; } @@ -203,9 +204,6 @@ class Config { // Typo3 version >=9 $configT3qfq = $GLOBALS['TYPO3_CONF_VARS']['EXTENSIONS'][EXT_KEY]; $configT3qfq[SYSTEM_DB_NAME_T3] = self::getDbName($GLOBALS['TYPO3_CONF_VARS']['DB']); - // Typo3 version >=10 - $configT3qfq[SYSTEM_PW_HASHING_CLASS] = $GLOBALS['TYPO3_CONF_VARS']['BE']['passwordHashing']['className'] ?? null; - // NOTE: This does not use the official API to access Typo3 password hashing. Here is the official API: https://docs.typo3.org/m/typo3/reference-coreapi/master/en-us/ApiOverview/PasswordHashing/ } elseif (isset($GLOBALS['TYPO3_CONF_VARS']['EXT']['extConf'][EXT_KEY])) { // Typo3 version <=8 @@ -218,9 +216,6 @@ class Config { if (isset($configT3['EXTENSIONS'][EXT_KEY])) { // Typo3 version >=9 $configT3qfq = $configT3['EXTENSIONS'][EXT_KEY]; - // Typo3 version >=10 - $configT3qfq[SYSTEM_PW_HASHING_CLASS] = $configT3['BE']['passwordHashing']['className'] ?? null; - // NOTE: This does not use the official API to access Typo3 password hashing. Here is the official API: https://docs.typo3.org/m/typo3/reference-coreapi/master/en-us/ApiOverview/PasswordHashing/ } else { // Typo3 version <=8 $configT3qfq = unserialize($configT3['EXT']['extConf'][EXT_KEY]); diff --git a/extension/Classes/Core/Typo3/T3Handler.php b/extension/Classes/Core/Typo3/T3Handler.php index 55480e3cf..3ae093fc4 100644 --- a/extension/Classes/Core/Typo3/T3Handler.php +++ b/extension/Classes/Core/Typo3/T3Handler.php @@ -10,7 +10,6 @@ namespace IMATHUZH\Qfq\Core\Typo3; use IMATHUZH\Qfq\Core\Helper\Path; use IMATHUZH\Qfq\Core\Helper\Support; -use IMATHUZH\Qfq\Core\Store\Config; /** @@ -41,14 +40,9 @@ class T3Handler { /** * Convert a cleartext password to a hash. Respects if 'salted passwords' are enabled. - * NOTE: This does not use the official API to access Typo3 password hashing. Here is the official API: https://docs.typo3.org/m/typo3/reference-coreapi/master/en-us/ApiOverview/PasswordHashing/ - * Legacy code (Typo3 version <=8) based on https://docs.typo3.org/typo3cms/extensions/saltedpasswords/8.7/DevelopersGuide/Index.html * * @param string $newPassword * @return string - * @throws \CodeException - * @throws \UserFormException - * @throws \UserReportException */ public static function getHash($newPassword) { @@ -57,16 +51,18 @@ class T3Handler { $saltedPassword = null; - $t3Hasher = self::getT3HashingInstance(); //implements interface: TYPO3\CMS\Core\Crypto\PasswordHashing\PasswordHashInterface - if (!is_null($t3Hasher)) { + if (class_exists('\TYPO3\CMS\Core\Utility\GeneralUtility') + && class_exists('\TYPO3\CMS\Core\Crypto\PasswordHashing\PasswordHashFactory')) { // Typo3 version >=9 - $saltedPassword = $t3Hasher->getHashedPassword($newPassword); - // NOTE: This does not use the official API to access Typo3 password hashing. Here is the official API: https://docs.typo3.org/m/typo3/reference-coreapi/master/en-us/ApiOverview/PasswordHashing/ + $hashInstance = \TYPO3\CMS\Core\Utility\GeneralUtility::makeInstance(\TYPO3\CMS\Core\Crypto\PasswordHashing\PasswordHashFactory::class) + ->getDefaultHashInstance('FE'); + $saltedPassword = $hashInstance->getHashedPassword($newPassword); } elseif (class_exists('\TYPO3\CMS\Saltedpasswords\Utility\SaltedPasswordsUtility') && class_exists('\TYPO3\CMS\Saltedpasswords\Salt\SaltFactory')) { // Typo3 version <=8 + // Legacy code based on https://docs.typo3.org/typo3cms/extensions/saltedpasswords/8.7/DevelopersGuide/Index.html if (\TYPO3\CMS\Saltedpasswords\Utility\SaltedPasswordsUtility::isUsageEnabled('FE')) { $objSalt = \TYPO3\CMS\Saltedpasswords\Salt\SaltFactory::getSaltingInstance(NULL); if (is_object($objSalt)) { @@ -89,15 +85,10 @@ class T3Handler { /** * Check if the salted password corresponds to the password. - * NOTE: This does not use the official API to access Typo3 password hashing. Here is the official API: https://docs.typo3.org/m/typo3/reference-coreapi/master/en-us/ApiOverview/PasswordHashing/ - * Legacy code (Typo3 version <=8) based on https://docs.typo3.org/typo3cms/extensions/saltedpasswords/8.7/DevelopersGuide/Index.html * * @param string $saltedPassword * @param string $password * @return bool - * @throws \CodeException - * @throws \UserFormException - * @throws \UserReportException */ public static function checkPassword($saltedPassword, $password) { @@ -106,17 +97,18 @@ class T3Handler { // Restore T3 ErrorHandler. T3 throws exceptions - those should be handled by T3! restore_error_handler(); - $t3Hasher = self::getT3HashingInstance(); //implements interface: TYPO3\CMS\Core\Crypto\PasswordHashing\PasswordHashInterface - if (!is_null($t3Hasher)) { + if (class_exists('\TYPO3\CMS\Core\Utility\GeneralUtility') + && class_exists('\TYPO3\CMS\Core\Crypto\PasswordHashing\PasswordHashFactory')) { // Typo3 version >=9 - $success = $t3Hasher->checkPassword($password, $saltedPassword); - // NOTE: This does not use the official API to access Typo3 password hashing. Here is the official API: https://docs.typo3.org/m/typo3/reference-coreapi/master/en-us/ApiOverview/PasswordHashing/ - + $success = \TYPO3\CMS\Core\Utility\GeneralUtility::makeInstance(\TYPO3\CMS\Core\Crypto\PasswordHashing\PasswordHashFactory::class) + ->get($saltedPassword, 'FE') # or getDefaultHashInstance($mode) + ->checkPassword($password, $saltedPassword); } elseif (class_exists('\TYPO3\CMS\Saltedpasswords\Utility\SaltedPasswordsUtility') && class_exists('\TYPO3\CMS\Saltedpasswords\Salt\SaltFactory')) { // Typo3 version <=8 + // Legacy code based on https://docs.typo3.org/typo3cms/extensions/saltedpasswords/8.7/DevelopersGuide/Index.html if (\TYPO3\CMS\Saltedpasswords\Utility\SaltedPasswordsUtility::isUsageEnabled('FE')) { $objSalt2 = \TYPO3\CMS\Saltedpasswords\Salt\SaltFactory::getSaltingInstance($saltedPassword); if (is_object($objSalt2)) { @@ -137,26 +129,6 @@ class T3Handler { return $success; } - /** - * Return an instance of the Typo3 password hashing class as configured in LocalConfiguration.php - * Returns object which implements interface: TYPO3\CMS\Core\Crypto\PasswordHashing\PasswordHashInterface - * NOTE: This does not use the official API to access Typo3 password hashing. Here is the official API: https://docs.typo3.org/m/typo3/reference-coreapi/master/en-us/ApiOverview/PasswordHashing/ - * - * @return mixed|null - * @throws \CodeException - * @throws \UserFormException - * @throws \UserReportException - */ - public static function getT3HashingInstance() - { - self::t3AutoloadIfNotRunning(); - $hashingClass = Config::get(SYSTEM_PW_HASHING_CLASS); - if(!is_string($hashingClass) || !class_exists($hashingClass)) { - return null; - } - return new $hashingClass; - } - /** * Load Typo3 autoloader if Typo3 is not instantiated * -- GitLab From a914f9ed6432862b66b3431859b9b51523e042a9 Mon Sep 17 00:00:00 2001 From: Marc Egger <marc.egger@uzh.ch> Date: Fri, 8 Jan 2021 18:00:57 +0100 Subject: [PATCH 194/195] move config into 'conf' dir and improve error message --- .gitlab-ci.yml | 2 +- Documentation/index.rst | 4 ++-- extension/Classes/Core/Helper/Path.php | 13 ++++++++++++- extension/Classes/Core/Store/Config.php | 19 ++++++++++++------- .../qfqStandalone}/index.php | 0 5 files changed, 27 insertions(+), 11 deletions(-) rename {extension/NoT3Page => mockup/qfqStandalone}/index.php (100%) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index f3fc63ea8..f1ce170c0 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -64,7 +64,7 @@ selenium: - cd docker; ./remove-containers.sh <<< "y" - cd .. - umask 002 - - mkdir "$SELENIUM_LOGS_PATH/$CI_COMMIT_SHORT_SHA" + - mkdir -p "$SELENIUM_LOGS_PATH/$CI_COMMIT_SHORT_SHA" - cp extension/Tests/selenium/selenium_logs/* "$SELENIUM_LOGS_PATH/$CI_COMMIT_SHORT_SHA/" - echo "Selenium Logs copied to $SELENIUM_LOGS_PATH/$CI_COMMIT_SHORT_SHA/" - echo "Or download result (log/screenshot) in gitlab under CI/CD > Pipelines <job> > right side 'Artifacts'" diff --git a/Documentation/index.rst b/Documentation/index.rst index bd96870dd..a9fded097 100644 --- a/Documentation/index.rst +++ b/Documentation/index.rst @@ -25,13 +25,13 @@ Quick Form Query Extension 2017-2020 :Authors: - Carsten Rose, Benjamin Baer, Marc Egger + Carsten Rose, Benjamin Baer :Further Contributors: Rafael Ostertag, Elias Villiger, Nicola Chiapolini :Email: - carsten.rose@math.uzh.ch, benjamin.baer@math.uzh.ch, marc.egger@uzh.ch + carsten.rose@math.uzh.ch, benjamin.baer@math.uzh.ch :License: This document is published under the Open Publication License diff --git a/extension/Classes/Core/Helper/Path.php b/extension/Classes/Core/Helper/Path.php index ab4f49b99..a73106e65 100644 --- a/extension/Classes/Core/Helper/Path.php +++ b/extension/Classes/Core/Helper/Path.php @@ -56,8 +56,9 @@ class Path private const APP_TO_FILEADMIN = 'fileadmin'; private const APP_TO_PROJECT_IN_PROTECTED = 'fileadmin/protected/qfqProject'; const PROJECT_TO_FORM = 'form'; + const PROJECT_TO_CONF = 'conf'; const FORM_TO_FORM_BACKUP = '_backup'; - const PROJECT_DIR_TO_REPORT = 'report'; + const PROJECT_DIR_TO_REPORT = 'report'; // TODO: refactor: remove DIR from constant name const REPORT_FILE_TO_BACKUP = '_backup'; // The path from a directory containing a report file to the directory containing backups of that report file // Config @@ -202,6 +203,16 @@ class Path return self::cwdToApp(self::appToProject($pathPartsToAppend)); } + /** + * @param array $pathPartsToAppend + * @return string + * @throws \UserFormException + */ + public static function cwdToConf(...$pathPartsToAppend): string + { + return self::cwdToProject(self::PROJECT_TO_CONF, $pathPartsToAppend); + } + /** * @param array $pathPartsToAppend * @return string diff --git a/extension/Classes/Core/Store/Config.php b/extension/Classes/Core/Store/Config.php index decf7cae9..48847472c 100644 --- a/extension/Classes/Core/Store/Config.php +++ b/extension/Classes/Core/Store/Config.php @@ -78,10 +78,11 @@ class Config { } // read and parse config. Throw exception if not exists. - $cwdToConfigFile = $PhpUnitOverloadCwdToConfigFile === '' ? Path::cwdToProject(CONFIG_QFQ_JSON) : $PhpUnitOverloadCwdToConfigFile; + $cwdToConfigFile = $PhpUnitOverloadCwdToConfigFile === '' ? Path::cwdToConf(CONFIG_QFQ_JSON) : $PhpUnitOverloadCwdToConfigFile; if (!file_exists($cwdToConfigFile)) { - HelperFile::file_put_contents(Path::cwdToProject(CONFIG_QFQ_JSON_EXAMPLE), json_encode(self::CONFIG_REQUIRED_TEMPLATE, JSON_PRETTY_PRINT)); - Thrower::userFormException("Please create qfq config file '" . CONFIG_QFQ_JSON . "' in project directory. Example config file '" . CONFIG_QFQ_JSON_EXAMPLE . "' was created in project directory.", "Project directory: " . realpath(Path::cwdToProject())); + HelperFile::createPathRecursive(Path::cwdToConf()); + HelperFile::file_put_contents(Path::cwdToConf(CONFIG_QFQ_JSON_EXAMPLE), json_encode(self::CONFIG_REQUIRED_TEMPLATE, JSON_PRETTY_PRINT)); + Thrower::userFormException("Please create qfq config file '" . CONFIG_QFQ_JSON . "' in the conf directory which is inside the project directory. Example config file '" . CONFIG_QFQ_JSON_EXAMPLE . "' was created in conf directory.", "Project directory: " . realpath(Path::cwdToProject())); } $config = HelperFile::json_decode(HelperFile::file_get_contents($cwdToConfigFile)); @@ -156,9 +157,9 @@ class Config { */ private static function writeConfig(array $config) { - $cwdToProject = Path::cwdToProject(); - HelperFile::createPathRecursive($cwdToProject); - HelperFile::file_put_contents(Path::join($cwdToProject, CONFIG_QFQ_JSON), json_encode($config, JSON_PRETTY_PRINT)); + $cwdToConf = Path::cwdToConf(); + HelperFile::createPathRecursive($cwdToConf); + HelperFile::file_put_contents(Path::join($cwdToConf, CONFIG_QFQ_JSON), json_encode($config, JSON_PRETTY_PRINT)); } /** @@ -171,7 +172,11 @@ class Config { { // read old config.qfq.php $cwdToOldConfigFile = Path::cwdToApp(Path::APP_TO_TYPO3_CONF, CONFIG_QFQ_PHP); - HelperFile::enforce_writable($cwdToOldConfigFile); // so we can delete it. + if (!is_writeable($cwdToOldConfigFile)) { + throw new \UserFormException(json_encode([ + ERROR_MESSAGE_TO_USER => "Can't migrate to new config: Legacy config file `config.qfq.php` not writable.", + ERROR_MESSAGE_TO_DEVELOPER => "Can't write to file/directory '$cwdToOldConfigFile'"])); + } $config = include($cwdToOldConfigFile); // In case the database credentials are given in the old style: rename the keys diff --git a/extension/NoT3Page/index.php b/mockup/qfqStandalone/index.php similarity index 100% rename from extension/NoT3Page/index.php rename to mockup/qfqStandalone/index.php -- GitLab From c0018213f1f91f4e7f6495b9cd3d94d9ce20c4f5 Mon Sep 17 00:00:00 2001 From: Marc Egger <marc.egger@uzh.ch> Date: Fri, 8 Jan 2021 18:10:09 +0100 Subject: [PATCH 195/195] fix phpunit: move phpunit config in 'conf' dir --- Makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Makefile b/Makefile index 0e7a457bb..b6d711994 100644 --- a/Makefile +++ b/Makefile @@ -121,7 +121,7 @@ phpunit: mv -v extension/* typo3conf/ext/qfq/ # create new kind of config (qfq.json) - cp -v typo3conf/ext/qfq/Tests/phpunit_qfq.json ../qfq.json; sed -i "s/#PHPUNIT_PASSWORD#/$(PHPUNIT_MYSQL_PASSWORD)/" ../qfq.json + cp -v typo3conf/ext/qfq/Tests/phpunit_qfq.json ../conf/qfq.json; sed -i "s/#PHPUNIT_PASSWORD#/$(PHPUNIT_MYSQL_PASSWORD)/" ../conf/qfq.json cp -v typo3conf/ext/qfq/Tests/phpunit_LocalConfiguration.php typo3conf/LocalConfiguration.php # run phpunit -- GitLab