‪TYPO3CMS  ‪main
FormDefinitionArrayConverter.php
Go to the documentation of this file.
1 <?php
2 
3 declare(strict_types=1);
4 
5 /*
6  * This file is part of the TYPO3 CMS project.
7  *
8  * It is free software; you can redistribute it and/or modify it under
9  * the terms of the GNU General Public License, either version 2
10  * of the License, or any later version.
11  *
12  * For the full copyright and license information, please read the
13  * LICENSE.txt file that was distributed with this source code.
14  *
15  * The TYPO3 project - inspiring people to share!
16  */
17 
19 
30 
37 {
41  protected ‪$configurationService;
42 
52  public function ‪convertFrom($source, $targetType, array $convertedChildProperties = [], ‪PropertyMappingConfigurationInterface $configuration = null)
53  {
54  $rawFormDefinitionArray = json_decode($source, true);
55 
56  if (json_last_error() !== JSON_ERROR_NONE) {
57  throw new ‪PropertyException('Unable to decode JSON source: ' . json_last_error_msg(), 1512578002);
58  }
59 
60  $formDefinitionValidationService = $this->‪getFormDefinitionValidationService();
61  $formDefinitionConversionService = $this->‪getFormDefinitionConversionService();
62 
63  // Extend the hmac hashing key with the "per form editor session (load / save)" unique key.
64  // @see \TYPO3\CMS\Form\Domain\Configuration\FormDefinitionConversionService::addHmacData
65  $sessionToken = $this->‪retrieveSessionToken();
66 
67  $prototypeName = $rawFormDefinitionArray['prototypeName'] ?? null;
68  ‪$identifier = $rawFormDefinitionArray['identifier'] ?? null;
69 
70  // A modification of the properties "prototypeName" and "identifier" from the root form element
71  // through the form editor is always forbidden.
72  try {
73  if (!$formDefinitionValidationService->isPropertyValueEqualToHistoricalValue([‪$identifier, 'identifier'], ‪$identifier, $rawFormDefinitionArray['_orig_identifier'] ?? [], $sessionToken)) {
74  throw new ‪PropertyException('Unauthorized modification of "identifier".', 1528538324);
75  }
76 
77  if (!$formDefinitionValidationService->isPropertyValueEqualToHistoricalValue([‪$identifier, 'prototypeName'], $prototypeName, $rawFormDefinitionArray['_orig_prototypeName'] ?? [], $sessionToken)) {
78  throw new ‪PropertyException('Unauthorized modification of "prototype name".', 1528538323);
79  }
80  } catch (‪PropertyException $e) {
81  throw new ‪PropertyException('Unauthorized modification of "prototype name" or "identifier".', 1528538322);
82  }
83 
84  $formDefinitionValidationService->validateFormDefinitionProperties($rawFormDefinitionArray, $prototypeName, $sessionToken);
85 
86  // @todo move all the transformations to FormDefinitionConversionService
87  $rawFormDefinitionArray = $this->‪filterEmptyArrays($rawFormDefinitionArray);
88  $rawFormDefinitionArray = $this->‪transformMultiValueElementsForFormFramework($rawFormDefinitionArray);
89  // @todo: replace with rte parsing
90  $rawFormDefinitionArray = ArrayUtility::stripTagsFromValuesRecursive($rawFormDefinitionArray);
91  $rawFormDefinitionArray = $formDefinitionConversionService->removeHmacData($rawFormDefinitionArray);
92 
93  $formDefinitionArray = GeneralUtility::makeInstance(FormDefinitionArray::class, $rawFormDefinitionArray);
94  return $formDefinitionArray;
95  }
96 
115  protected function ‪transformMultiValueElementsForFormFramework(array $input): array
116  {
117  ‪$output = [];
118 
119  foreach ($input as $key => $value) {
120  if (is_int($key) && is_array($value) && isset($value['_label']) && isset($value['_value'])) {
121  $key = $value['_value'];
122  $value = $value['_label'];
123  }
124 
125  if (is_array($value)) {
127  } else {
128  ‪$output[$key] = $value;
129  }
130  }
131 
132  return ‪$output;
133  }
134 
140  protected function ‪filterEmptyArrays(array $array): array
141  {
142  foreach ($array as $key => $value) {
143  if (!is_array($value)) {
144  continue;
145  }
146  if (empty($value)) {
147  unset($array[$key]);
148  continue;
149  }
150  $array[$key] = $this->‪filterEmptyArrays($value);
151  if (empty($array[$key])) {
152  unset($array[$key]);
153  }
154  }
155 
156  return $array;
157  }
158 
159  protected function ‪retrieveSessionToken(): string
160  {
161  return $this->‪getBackendUser()->getSessionData('extFormProtectionSessionToken');
162  }
163 
165  {
166  return GeneralUtility::makeInstance(FormDefinitionValidationService::class);
167  }
168 
170  {
171  return GeneralUtility::makeInstance(FormDefinitionConversionService::class);
172  }
173 
174  protected function ‪getBackendUser(): ‪BackendUserAuthentication
175  {
176  return ‪$GLOBALS['BE_USER'];
177  }
178 }
‪TYPO3\CMS\Extbase\Property\Exception
Definition: DuplicateObjectException.php:18
‪TYPO3\CMS\Form\Mvc\Property\TypeConverter\FormDefinitionArrayConverter\transformMultiValueElementsForFormFramework
‪transformMultiValueElementsForFormFramework(array $input)
Definition: FormDefinitionArrayConverter.php:114
‪TYPO3\CMS\Form\Domain\Configuration\FormDefinitionConversionService
Definition: FormDefinitionConversionService.php:35
‪TYPO3\CMS\Form\Domain\Configuration\FormDefinitionValidationService
Definition: FormDefinitionValidationService.php:36
‪TYPO3\CMS\Form\Mvc\Property\TypeConverter\FormDefinitionArrayConverter\$configurationService
‪ConfigurationService $configurationService
Definition: FormDefinitionArrayConverter.php:40
‪TYPO3\CMS\Form\Mvc\Property\TypeConverter
Definition: FormDefinitionArrayConverter.php:18
‪TYPO3\CMS\Form\Mvc\Property\TypeConverter\FormDefinitionArrayConverter\convertFrom
‪FormDefinitionArray convertFrom($source, $targetType, array $convertedChildProperties=[], PropertyMappingConfigurationInterface $configuration=null)
Definition: FormDefinitionArrayConverter.php:51
‪TYPO3\CMS\Extbase\Property\PropertyMappingConfigurationInterface
Definition: PropertyMappingConfigurationInterface.php:22
‪TYPO3\CMS\Form\Mvc\Property\TypeConverter\FormDefinitionArrayConverter\getFormDefinitionValidationService
‪getFormDefinitionValidationService()
Definition: FormDefinitionArrayConverter.php:163
‪TYPO3\CMS\Form\Mvc\Property\TypeConverter\FormDefinitionArrayConverter\getFormDefinitionConversionService
‪getFormDefinitionConversionService()
Definition: FormDefinitionArrayConverter.php:168
‪TYPO3\CMS\Form\Mvc\Property\TypeConverter\FormDefinitionArrayConverter\getBackendUser
‪getBackendUser()
Definition: FormDefinitionArrayConverter.php:173
‪TYPO3\CMS\Form\Type\FormDefinitionArray
Definition: FormDefinitionArray.php:24
‪TYPO3\CMS\Form\Mvc\Property\TypeConverter\FormDefinitionArrayConverter\filterEmptyArrays
‪filterEmptyArrays(array $array)
Definition: FormDefinitionArrayConverter.php:139
‪TYPO3\CMS\Core\Authentication\BackendUserAuthentication
Definition: BackendUserAuthentication.php:62
‪TYPO3\CMS\Form\Domain\Configuration\ConfigurationService
Definition: ConfigurationService.php:50
‪$output
‪$output
Definition: annotationChecker.php:114
‪TYPO3\CMS\Extbase\Property\TypeConverter\AbstractTypeConverter
Definition: AbstractTypeConverter.php:29
‪TYPO3\CMS\Core\Utility\ArrayUtility
Definition: ArrayUtility.php:26
‪$GLOBALS
‪$GLOBALS['TYPO3_CONF_VARS']['EXTCONF']['adminpanel']['modules']
Definition: ext_localconf.php:25
‪TYPO3\CMS\Core\Utility\GeneralUtility
Definition: GeneralUtility.php:52
‪TYPO3\CMS\Form\Mvc\Property\TypeConverter\FormDefinitionArrayConverter
Definition: FormDefinitionArrayConverter.php:37
‪TYPO3\CMS\Form\Mvc\Property\TypeConverter\FormDefinitionArrayConverter\retrieveSessionToken
‪retrieveSessionToken()
Definition: FormDefinitionArrayConverter.php:158
‪TYPO3\CMS\Form\Domain\Configuration\Exception\PropertyException
Definition: PropertyException.php:25
‪TYPO3\CMS\Webhooks\Message\$identifier
‪identifier readonly string $identifier
Definition: FileAddedMessage.php:37