‪TYPO3CMS  11.5
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 
30 
35 {
143  array $currentFormElement,
144  string $prototypeName,
145  string $sessionToken
146  ): void {
147  $renderables = $currentFormElement['renderables'] ?? [];
148  $propertyCollectionElements = $currentFormElement['finishers'] ?? $currentFormElement['validators'] ?? [];
149  $propertyCollectionName = $currentFormElement['type'] === 'Form' ? 'finishers' : 'validators';
150  unset($currentFormElement['renderables'], $currentFormElement['finishers'], $currentFormElement['validators']);
151 
152  $validationDto = GeneralUtility::makeInstance(
153  ValidationDto::class,
154  $prototypeName,
155  $currentFormElement['type'],
156  $currentFormElement['identifier'],
157  null,
158  $propertyCollectionName
159  );
160 
161  $configurationService = GeneralUtility::makeInstance(ConfigurationService::class);
162  if ($configurationService->isFormElementTypeCreatableByFormEditor($validationDto)) {
164  $currentFormElement,
165  $sessionToken,
166  $validationDto
167  );
168 
169  foreach ($propertyCollectionElements as $propertyCollectionElement) {
170  $validationDto = $validationDto->withPropertyCollectionElementIdentifier(
171  $propertyCollectionElement['identifier']
172  );
173 
174  if ($configurationService->isPropertyCollectionElementIdentifierCreatableByFormEditor($validationDto)) {
176  $propertyCollectionElement,
177  $sessionToken,
178  $validationDto
179  );
180  } else {
182  $propertyCollectionElement,
183  $sessionToken,
184  $validationDto
185  );
186  }
187  }
188  } else {
189  $this->‪validateAllFormElementPropertyValuesByHmac($currentFormElement, $sessionToken, $validationDto);
190 
191  foreach ($propertyCollectionElements as $propertyCollectionElement) {
193  $propertyCollectionElement,
194  $sessionToken,
195  $validationDto
196  );
197  }
198  }
199 
200  foreach ($renderables as $renderable) {
201  $this->‪validateFormDefinitionProperties($renderable, $prototypeName, $sessionToken);
202  }
203  }
204 
225  array $hmacContent,
226  $propertyValue,
227  array $hmacData,
228  string $sessionToken
229  ): bool {
230  $this->‪checkHmacDataIntegrity($hmacData, $hmacContent, $sessionToken);
231  $hmacContent[] = $propertyValue;
232 
233  $expectedHash = GeneralUtility::hmac(serialize($hmacContent), $sessionToken);
234  return hash_equals($expectedHash, $hmacData['hmac']);
235  }
236 
247  protected function ‪checkHmacDataIntegrity(array $hmacData, array $hmacContent, string $sessionToken)
248  {
249  $hmac = $hmacData['hmac'] ?? null;
250  if (empty($hmac)) {
251  throw new ‪PropertyException('Hmac must not be empty. #1528538222', 1528538222);
252  }
253 
254  $hmacContent[] = $hmacData['value'] ?? '';
255  $expectedHash = GeneralUtility::hmac(serialize($hmacContent), $sessionToken);
256 
257  if (!hash_equals($expectedHash, $hmac)) {
258  throw new ‪PropertyException('Unauthorized modification of historical data. #1528538252', 1528538252);
259  }
260  }
261 
271  array $currentElement,
272  $sessionToken,
273  ‪ValidationDto $validationDto
274  ): void {
275  GeneralUtility::makeInstance(ArrayProcessor::class, $currentElement)->forEach(
276  GeneralUtility::makeInstance(
277  ArrayProcessing::class,
278  'validateProperties',
279  '^(?!(_orig_.*|.*\._orig_.*)$).*',
280  GeneralUtility::makeInstance(
281  FormElementHmacDataValidator::class,
282  $currentElement,
283  $sessionToken,
284  $validationDto
285  )
286  )
287  );
288  }
289 
299  array $currentElement,
300  $sessionToken,
301  ‪ValidationDto $validationDto
302  ): void {
303  GeneralUtility::makeInstance(ArrayProcessor::class, $currentElement)->forEach(
304  GeneralUtility::makeInstance(
305  ArrayProcessing::class,
306  'validateProperties',
307  '^(?!(_orig_.*|.*\._orig_.*)$).*',
308  GeneralUtility::makeInstance(
309  PropertyCollectionElementHmacDataValidator::class,
310  $currentElement,
311  $sessionToken,
312  $validationDto
313  )
314  )
315  );
316  }
317 
330  array $currentElement,
331  $sessionToken,
332  ‪ValidationDto $validationDto
333  ): void {
334  GeneralUtility::makeInstance(ArrayProcessor::class, $currentElement)->forEach(
335  GeneralUtility::makeInstance(
336  ArrayProcessing::class,
337  'validateProperties',
338  '^(?!(_orig_.*|.*\._orig_.*|type|identifier)$).*',
339  GeneralUtility::makeInstance(
340  CreatableFormElementPropertiesValidator::class,
341  $currentElement,
342  $sessionToken,
343  $validationDto
344  )
345  )
346  );
347  }
348 
361  array $currentElement,
362  $sessionToken,
363  ‪ValidationDto $validationDto
364  ): void {
365  GeneralUtility::makeInstance(ArrayProcessor::class, $currentElement)->forEach(
366  GeneralUtility::makeInstance(
367  ArrayProcessing::class,
368  'validateProperties',
369  '^(?!(_orig_.*|.*\._orig_.*|identifier)$).*',
370  GeneralUtility::makeInstance(
371  CreatablePropertyCollectionElementPropertiesValidator::class,
372  $currentElement,
373  $sessionToken,
374  $validationDto
375  )
376  )
377  );
378  }
379 }
‪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:360
‪TYPO3\CMS\Form\Domain\Configuration\FormDefinition\Validators\ValidationDto
Definition: ValidationDto.php:23
‪TYPO3\CMS\Form\Domain\Configuration\FormDefinitionValidationService
Definition: FormDefinitionValidationService.php:35
‪TYPO3\CMS\Form\Domain\Configuration\FormDefinitionValidationService\validateAllPropertyValuesFromCreatableFormElement
‪validateAllPropertyValuesFromCreatableFormElement(array $currentElement, $sessionToken, ValidationDto $validationDto)
Definition: FormDefinitionValidationService.php:329
‪TYPO3\CMS\Form\Domain\Configuration\FormDefinitionValidationService\checkHmacDataIntegrity
‪checkHmacDataIntegrity(array $hmacData, array $hmacContent, string $sessionToken)
Definition: FormDefinitionValidationService.php:247
‪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\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:142
‪TYPO3\CMS\Form\Domain\Configuration\FormDefinitionValidationService\validateAllFormElementPropertyValuesByHmac
‪validateAllFormElementPropertyValuesByHmac(array $currentElement, $sessionToken, ValidationDto $validationDto)
Definition: FormDefinitionValidationService.php:270
‪TYPO3\CMS\Form\Domain\Configuration\FormDefinitionValidationService\validateAllPropertyCollectionElementValuesByHmac
‪validateAllPropertyCollectionElementValuesByHmac(array $currentElement, $sessionToken, ValidationDto $validationDto)
Definition: FormDefinitionValidationService.php:298
‪TYPO3\CMS\Core\Utility\GeneralUtility
Definition: GeneralUtility.php:50
‪TYPO3\CMS\Form\Domain\Configuration\FormDefinition\Validators\FormElementHmacDataValidator
Definition: FormElementHmacDataValidator.php:24
‪TYPO3\CMS\Form\Domain\Configuration\FormDefinitionValidationService\isPropertyValueEqualToHistoricalValue
‪bool isPropertyValueEqualToHistoricalValue(array $hmacContent, $propertyValue, array $hmacData, string $sessionToken)
Definition: FormDefinitionValidationService.php:224
‪TYPO3\CMS\Form\Domain\Configuration\Exception\PropertyException
Definition: PropertyException.php:25