‪TYPO3CMS  ‪main
FormDefinitionValidationService.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 
31 
36 {
141  array $currentFormElement,
142  string $prototypeName,
143  string $sessionToken
144  ): void {
145  $renderables = $currentFormElement['renderables'] ?? [];
146  $propertyCollectionElements = $currentFormElement['finishers'] ?? $currentFormElement['validators'] ?? [];
147  $propertyCollectionName = $currentFormElement['type'] === 'Form' ? 'finishers' : 'validators';
148  unset($currentFormElement['renderables'], $currentFormElement['finishers'], $currentFormElement['validators']);
149 
150  $validationDto = GeneralUtility::makeInstance(
151  ValidationDto::class,
152  $prototypeName,
153  $currentFormElement['type'],
154  $currentFormElement['identifier'],
155  null,
156  $propertyCollectionName
157  );
158 
159  $configurationService = GeneralUtility::makeInstance(ConfigurationService::class);
160  if ($configurationService->isFormElementTypeCreatableByFormEditor($validationDto)) {
162  $currentFormElement,
163  $sessionToken,
164  $validationDto
165  );
166 
167  foreach ($propertyCollectionElements as $propertyCollectionElement) {
168  $validationDto = $validationDto->withPropertyCollectionElementIdentifier(
169  $propertyCollectionElement['identifier']
170  );
171 
172  if ($configurationService->isPropertyCollectionElementIdentifierCreatableByFormEditor($validationDto)) {
174  $propertyCollectionElement,
175  $sessionToken,
176  $validationDto
177  );
178  } else {
180  $propertyCollectionElement,
181  $sessionToken,
182  $validationDto
183  );
184  }
185  }
186  } else {
187  $this->‪validateAllFormElementPropertyValuesByHmac($currentFormElement, $sessionToken, $validationDto);
188 
189  foreach ($propertyCollectionElements as $propertyCollectionElement) {
191  $propertyCollectionElement,
192  $sessionToken,
193  $validationDto
194  );
195  }
196  }
197 
198  foreach ($renderables as $renderable) {
199  $this->‪validateFormDefinitionProperties($renderable, $prototypeName, $sessionToken);
200  }
201  }
202 
219  array $hmacContent,
220  $propertyValue,
221  array $hmacData,
222  string $sessionToken
223  ): bool {
224  $this->‪checkHmacDataIntegrity($hmacData, $hmacContent, $sessionToken);
225  $hmacContent[] = $propertyValue;
226 
227  $hashService = GeneralUtility::makeInstance(HashService::class);
228  $expectedHash = $hashService->hmac(serialize($hmacContent), $sessionToken);
229  return hash_equals($expectedHash, $hmacData['hmac']);
230  }
231 
239  protected function ‪checkHmacDataIntegrity(array $hmacData, array $hmacContent, string $sessionToken)
240  {
241  $hmac = $hmacData['hmac'] ?? null;
242  if (empty($hmac)) {
243  throw new ‪PropertyException('Hmac must not be empty. #1528538222', 1528538222);
244  }
245 
246  $hmacContent[] = $hmacData['value'] ?? '';
247  $hashService = GeneralUtility::makeInstance(HashService::class);
248  $expectedHash = $hashService->hmac(serialize($hmacContent), $sessionToken);
249 
250  if (!hash_equals($expectedHash, $hmac)) {
251  throw new ‪PropertyException('Unauthorized modification of historical data. #1528538252', 1528538252);
252  }
253  }
254 
262  array $currentElement,
263  $sessionToken,
264  ‪ValidationDto $validationDto
265  ): void {
266  GeneralUtility::makeInstance(ArrayProcessor::class, $currentElement)->forEach(
267  GeneralUtility::makeInstance(
268  ArrayProcessing::class,
269  'validateProperties',
270  '^(?!(_orig_.*|.*\._orig_.*)$).*',
271  GeneralUtility::makeInstance(
272  FormElementHmacDataValidator::class,
273  $currentElement,
274  $sessionToken,
275  $validationDto
276  )
277  )
278  );
279  }
280 
288  array $currentElement,
289  $sessionToken,
290  ‪ValidationDto $validationDto
291  ): void {
292  GeneralUtility::makeInstance(ArrayProcessor::class, $currentElement)->forEach(
293  GeneralUtility::makeInstance(
294  ArrayProcessing::class,
295  'validateProperties',
296  '^(?!(_orig_.*|.*\._orig_.*)$).*',
297  GeneralUtility::makeInstance(
298  PropertyCollectionElementHmacDataValidator::class,
299  $currentElement,
300  $sessionToken,
301  $validationDto
302  )
303  )
304  );
305  }
306 
317  array $currentElement,
318  $sessionToken,
319  ‪ValidationDto $validationDto
320  ): void {
321  GeneralUtility::makeInstance(ArrayProcessor::class, $currentElement)->forEach(
322  GeneralUtility::makeInstance(
323  ArrayProcessing::class,
324  'validateProperties',
325  '^(?!(_orig_.*|.*\._orig_.*|type|identifier)$).*',
326  GeneralUtility::makeInstance(
327  CreatableFormElementPropertiesValidator::class,
328  $currentElement,
329  $sessionToken,
330  $validationDto
331  )
332  )
333  );
334  }
335 
346  array $currentElement,
347  $sessionToken,
348  ‪ValidationDto $validationDto
349  ): void {
350  GeneralUtility::makeInstance(ArrayProcessor::class, $currentElement)->forEach(
351  GeneralUtility::makeInstance(
352  ArrayProcessing::class,
353  'validateProperties',
354  '^(?!(_orig_.*|.*\._orig_.*|identifier)$).*',
355  GeneralUtility::makeInstance(
356  CreatablePropertyCollectionElementPropertiesValidator::class,
357  $currentElement,
358  $sessionToken,
359  $validationDto
360  )
361  )
362  );
363  }
364 }
‪TYPO3\CMS\Extbase\Property\Exception
Definition: DuplicateObjectException.php:18
‪TYPO3\CMS\Form\Domain\Configuration
‪TYPO3\CMS\Form\Domain\Configuration\FormDefinitionValidationService\validateAllPropertyValuesFromCreatablePropertyCollectionElement
‪validateAllPropertyValuesFromCreatablePropertyCollectionElement(array $currentElement, $sessionToken, ValidationDto $validationDto)
Definition: FormDefinitionValidationService.php:345
‪TYPO3\CMS\Form\Domain\Configuration\FormDefinition\Validators\ValidationDto
Definition: ValidationDto.php:23
‪TYPO3\CMS\Form\Domain\Configuration\FormDefinitionValidationService
Definition: FormDefinitionValidationService.php:36
‪TYPO3\CMS\Form\Domain\Configuration\FormDefinitionValidationService\validateAllPropertyValuesFromCreatableFormElement
‪validateAllPropertyValuesFromCreatableFormElement(array $currentElement, $sessionToken, ValidationDto $validationDto)
Definition: FormDefinitionValidationService.php:316
‪TYPO3\CMS\Form\Domain\Configuration\FormDefinitionValidationService\checkHmacDataIntegrity
‪checkHmacDataIntegrity(array $hmacData, array $hmacContent, string $sessionToken)
Definition: FormDefinitionValidationService.php:239
‪TYPO3\CMS\Form\Domain\Configuration\FormDefinition\Validators\CreatableFormElementPropertiesValidator
Definition: CreatableFormElementPropertiesValidator.php:27
‪TYPO3\CMS\Form\Domain\Configuration\ArrayProcessing\ArrayProcessing
Definition: ArrayProcessing.php:27
‪TYPO3\CMS\Form\Domain\Configuration\FormDefinitionValidationService\isPropertyValueEqualToHistoricalValue
‪isPropertyValueEqualToHistoricalValue(array $hmacContent, $propertyValue, array $hmacData, string $sessionToken)
Definition: FormDefinitionValidationService.php:218
‪TYPO3\CMS\Form\Domain\Configuration\ArrayProcessing\ArrayProcessor
Definition: ArrayProcessor.php:30
‪TYPO3\CMS\Form\Domain\Configuration\FormDefinition\Validators\CreatablePropertyCollectionElementPropertiesValidator
Definition: CreatablePropertyCollectionElementPropertiesValidator.php:27
‪TYPO3\CMS\Form\Domain\Configuration\FormDefinition\Validators\PropertyCollectionElementHmacDataValidator
Definition: PropertyCollectionElementHmacDataValidator.php:24
‪TYPO3\CMS\Core\SingletonInterface
Definition: SingletonInterface.php:22
‪TYPO3\CMS\Form\Domain\Configuration\FormDefinitionValidationService\validateFormDefinitionProperties
‪validateFormDefinitionProperties(array $currentFormElement, string $prototypeName, string $sessionToken)
Definition: FormDefinitionValidationService.php:140
‪TYPO3\CMS\Form\Domain\Configuration\FormDefinitionValidationService\validateAllFormElementPropertyValuesByHmac
‪validateAllFormElementPropertyValuesByHmac(array $currentElement, $sessionToken, ValidationDto $validationDto)
Definition: FormDefinitionValidationService.php:261
‪TYPO3\CMS\Form\Domain\Configuration\FormDefinitionValidationService\validateAllPropertyCollectionElementValuesByHmac
‪validateAllPropertyCollectionElementValuesByHmac(array $currentElement, $sessionToken, ValidationDto $validationDto)
Definition: FormDefinitionValidationService.php:287
‪TYPO3\CMS\Core\Utility\GeneralUtility
Definition: GeneralUtility.php:52
‪TYPO3\CMS\Form\Domain\Configuration\FormDefinition\Validators\FormElementHmacDataValidator
Definition: FormElementHmacDataValidator.php:24
‪TYPO3\CMS\Form\Domain\Configuration\Exception\PropertyException
Definition: PropertyException.php:25
‪TYPO3\CMS\Core\Crypto\HashService
Definition: HashService.php:27