From 53d39fa31e4fd71d979633e030bf2d71a14d444a Mon Sep 17 00:00:00 2001 From: Silvio Kranzusch Date: Tue, 30 Sep 2025 08:39:31 +0200 Subject: [PATCH 1/3] enable TYPO3 v13 compatibility --- Classes/Security/HashScope.php | 34 ++++++++++++++++++ .../Form/RegisterFieldViewHelper.php | 34 ------------------ .../Form/SelectFieldViewHelper.php | 8 ++--- Classes/ViewHelpers/FormViewHelper.php | 36 +++++++++++-------- .../Private/Partials/Form/Field/Check.html | 4 +-- .../Private/Partials/Form/Field/Country.html | 4 +-- .../Private/Partials/Form/Field/Radio.html | 4 +-- .../Private/Partials/Form/Field/Select.html | 4 +-- Resources/Private/Templates/Form/Form.html | 1 + composer.json | 4 +-- ext_emconf.php | 6 ++-- 11 files changed, 70 insertions(+), 69 deletions(-) create mode 100644 Classes/Security/HashScope.php diff --git a/Classes/Security/HashScope.php b/Classes/Security/HashScope.php new file mode 100644 index 0000000..cdc56a1 --- /dev/null +++ b/Classes/Security/HashScope.php @@ -0,0 +1,34 @@ +value; + } +} diff --git a/Classes/ViewHelpers/Form/RegisterFieldViewHelper.php b/Classes/ViewHelpers/Form/RegisterFieldViewHelper.php index 4087d60..fb92eb1 100644 --- a/Classes/ViewHelpers/Form/RegisterFieldViewHelper.php +++ b/Classes/ViewHelpers/Form/RegisterFieldViewHelper.php @@ -20,44 +20,10 @@ */ class RegisterFieldViewHelper extends AbstractFormFieldViewHelper { - public function initializeArguments(): void - { - $this->registerArgument('name', 'string', 'Name of input tag'); - $this->registerArgument('value', 'mixed', 'Value of input tag'); - $this->registerArgument( - 'property', - 'string', - 'Name of Object Property. If used in conjunction with , "name" and "value" properties will be ignored.' - ); - $this->registerArgument('additionalAttributes', 'array', 'Additional tag attributes. They will be added directly to the resulting HTML tag.', false); - $this->registerArgument('checked', 'bool', 'Specifies that the input element should be preselected'); - $this->registerArgument('multiple', 'bool', 'Specifies whether this checkbox belongs to a multivalue (is part of a checkbox group)', false, false); - } - public function render(): string { $nameAttribute = $this->getName(); - $checked = $this->arguments['checked']; - $multiple = $this->arguments['multiple']; - - $propertyValue = null; - if ($this->hasMappingErrorOccurred()) { - $propertyValue = $this->getLastSubmittedFormData(); - } - if ($checked === null && $propertyValue === null) { - $propertyValue = $this->getPropertyValue(); - } - - if ($propertyValue instanceof \Traversable) { - $propertyValue = iterator_to_array($propertyValue); - } - if (is_array($propertyValue)) { - $nameAttribute .= '[]'; - } elseif ($multiple === true) { - $nameAttribute .= '[]'; - } - $this->registerFieldNameForFormTokenGeneration($nameAttribute); return ''; diff --git a/Classes/ViewHelpers/Form/SelectFieldViewHelper.php b/Classes/ViewHelpers/Form/SelectFieldViewHelper.php index b20017e..da058c6 100644 --- a/Classes/ViewHelpers/Form/SelectFieldViewHelper.php +++ b/Classes/ViewHelpers/Form/SelectFieldViewHelper.php @@ -27,7 +27,7 @@ protected function renderOptionTags(array $options): string $optionTags = []; foreach ($options as $value => $label) { $isSelected = $this->isSelectedAlternative($this->getOptionFromOriginalOptionsByValue((string)$value)); - $optionTags[] = $this->renderOptionTag((string)$value, (string)$label, $isSelected); + $optionTags[] = json_decode($this->renderOptionTag((string)$value, (string)$label, $isSelected),true); } return json_encode($optionTags); } @@ -40,12 +40,12 @@ protected function renderOptionTags(array $options): string * @param bool $isSelected specifies wether or not to add selected attribute * @return string the rendered option tag */ - protected function renderOptionTag($value, $label, $isSelected = false) + protected function renderOptionTag($value, $label, $isSelected = false): string { - return [ + return json_encode([ 'value' => $value, 'label' => $label, 'isSelected' => $isSelected, - ]; + ]); } } diff --git a/Classes/ViewHelpers/FormViewHelper.php b/Classes/ViewHelpers/FormViewHelper.php index 7edd514..60b4823 100644 --- a/Classes/ViewHelpers/FormViewHelper.php +++ b/Classes/ViewHelpers/FormViewHelper.php @@ -15,10 +15,13 @@ * The TYPO3 project - inspiring people to share! */ +use \TYPO3\CMS\Extbase\Mvc\RequestInterface; use TYPO3\CMS\Core\Utility\GeneralUtility; use TYPO3\CMS\Extbase\DomainObject\AbstractDomainObject; use TYPO3\CMS\Extbase\Mvc\Web\Routing\UriBuilder; use TYPO3\CMS\Extbase\Persistence\Generic\LazyLoadingProxy; +use Psr\Http\Message\ServerRequestInterface; +use FriendsOfTYPO3\HeadlessPowermail\Security\HashScope; /** * Form ViewHelper. Generates a :html:`
` Tag. @@ -124,10 +127,7 @@ protected function setFormActionUri(): void ); } - /** @var RenderingContext $renderingContext */ - $renderingContext = $this->renderingContext; - /** @var RequestInterface $request */ - $request = $renderingContext->getRequest(); + $request = $this->getRequest(); /** @var UriBuilder $uriBuilder */ $uriBuilder = GeneralUtility::makeInstance(UriBuilder::class); $uriBuilder @@ -142,11 +142,6 @@ protected function setFormActionUri(): void ->setArgumentsToBeExcludedFromQueryString(isset($this->arguments['argumentsToBeExcludedFromQueryString']) ? (array)$this->arguments['argumentsToBeExcludedFromQueryString'] : []) ->setFormat($this->arguments['format'] ?? ''); - $addQueryStringMethod = $this->arguments['addQueryStringMethod'] ?? null; - if (is_string($addQueryStringMethod)) { - $uriBuilder->setAddQueryStringMethod($addQueryStringMethod); - } - $pageUid = (int)($this->arguments['pageUid'] ?? 0); if ($pageUid > 0) { $uriBuilder->setTargetPageUid($pageUid); @@ -192,10 +187,7 @@ protected function renderAdditionalIdentityFields(): string */ protected function renderHiddenReferrerFields(): string { - /** @var RenderingContext $renderingContext */ - $renderingContext = $this->renderingContext; - /** @var RequestInterface $request */ - $request = $renderingContext->getRequest(); + $request = $this->getRequest(); $extensionName = $request->getControllerExtensionName(); $controllerName = $request->getControllerName(); $actionName = $request->getControllerActionName(); @@ -207,7 +199,8 @@ protected function renderHiddenReferrerFields(): string $this->addHiddenField($this->prefixFieldName('__referrer[@extension]'), $extensionName); $this->addHiddenField($this->prefixFieldName('__referrer[@controller]'), $controllerName); $this->addHiddenField($this->prefixFieldName('__referrer[@action]'), $actionName); - $this->addHiddenField($this->prefixFieldName('__referrer[@request]'), $this->hashService->appendHmac(json_encode($actionRequest))); + $this->addHiddenField($this->prefixFieldName('__referrer[arguments]'), $this->hashService->appendHmac(base64_encode(serialize($request->getArguments())),HashScope::ReferringArguments->prefix())); + $this->addHiddenField($this->prefixFieldName('__referrer[@request]'), $this->hashService->appendHmac(json_encode($actionRequest),HashScope::ReferringArguments->prefix())); return ''; } @@ -289,4 +282,19 @@ protected function addHiddenField($name, $value) $this->data['hiddenFields'][$this->i]['value'] = $value; $this->i++; } + + protected function getRequest(): RequestInterface + { + $renderingContext = $this->renderingContext; + if ( + method_exists($renderingContext, 'getAttribute') && + method_exists($renderingContext, 'hasAttribute') && + $renderingContext->hasAttribute(ServerRequestInterface::class) + ) { + $request = $renderingContext->getAttribute(ServerRequestInterface::class); + } else { + $request = $renderingContext->getRequest(); + } + return $request; + } } diff --git a/Resources/Private/Partials/Form/Field/Check.html b/Resources/Private/Partials/Form/Field/Check.html index efa1933..d6453b9 100644 --- a/Resources/Private/Partials/Form/Field/Check.html +++ b/Resources/Private/Partials/Form/Field/Check.html @@ -1,8 +1,6 @@ {namespace vh=In2code\Powermail\ViewHelpers} - + - + + - + diff --git a/composer.json b/composer.json index 54d0f84..76e1f97 100644 --- a/composer.json +++ b/composer.json @@ -28,8 +28,8 @@ } ], "require": { - "typo3/cms-core": "^12.4", - "in2code/powermail": "^12.0" + "typo3/cms-core": "^13.4", + "in2code/powermail": "^13.0" }, "suggest": { "friendsoftypo3/headless": "^4.0" diff --git a/ext_emconf.php b/ext_emconf.php index 561e5dc..1858035 100644 --- a/ext_emconf.php +++ b/ext_emconf.php @@ -7,11 +7,11 @@ 'author' => 'Oskar Dydo', 'author_email' => 'extensions@macopedia.pl', 'category' => 'fe', - 'version' => '3.0.0', + 'version' => '4.0.0', 'constraints' => [ 'depends' => [ - 'typo3' => '12.4.0-12.4.99', - 'powermail' => '12.0.0-12.99.99', + 'typo3' => '12.4.0-13.4.99', + 'powermail' => '12.0.0-13.99.99', ], 'conflicts' => [], 'suggests' => [], From 0b318a525b4dce222fda7a3e2646af36261e2b71 Mon Sep 17 00:00:00 2001 From: Silvio Kranzusch Date: Tue, 30 Sep 2025 08:47:49 +0200 Subject: [PATCH 2/3] revert usage of outsourced HashScope --- Classes/Security/HashScope.php | 34 -------------------------- Classes/ViewHelpers/FormViewHelper.php | 2 +- 2 files changed, 1 insertion(+), 35 deletions(-) delete mode 100644 Classes/Security/HashScope.php diff --git a/Classes/Security/HashScope.php b/Classes/Security/HashScope.php deleted file mode 100644 index cdc56a1..0000000 --- a/Classes/Security/HashScope.php +++ /dev/null @@ -1,34 +0,0 @@ -value; - } -} diff --git a/Classes/ViewHelpers/FormViewHelper.php b/Classes/ViewHelpers/FormViewHelper.php index 60b4823..59b8c5e 100644 --- a/Classes/ViewHelpers/FormViewHelper.php +++ b/Classes/ViewHelpers/FormViewHelper.php @@ -21,7 +21,7 @@ use TYPO3\CMS\Extbase\Mvc\Web\Routing\UriBuilder; use TYPO3\CMS\Extbase\Persistence\Generic\LazyLoadingProxy; use Psr\Http\Message\ServerRequestInterface; -use FriendsOfTYPO3\HeadlessPowermail\Security\HashScope; +use TYPO3\CMS\Extbase\Security\HashScope; /** * Form ViewHelper. Generates a :html:`` Tag. From a1fa68292b77ba8d60a687cc50673a593a5fb4e0 Mon Sep 17 00:00:00 2001 From: Silvio Kranzusch Date: Tue, 18 Nov 2025 17:14:07 +0100 Subject: [PATCH 3/3] Update minimum requirements --- ext_emconf.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/ext_emconf.php b/ext_emconf.php index 1858035..7b5f7bf 100644 --- a/ext_emconf.php +++ b/ext_emconf.php @@ -10,8 +10,8 @@ 'version' => '4.0.0', 'constraints' => [ 'depends' => [ - 'typo3' => '12.4.0-13.4.99', - 'powermail' => '12.0.0-13.99.99', + 'typo3' => '13.4.0-13.4.99', + 'powermail' => '13.0.0-13.99.99', ], 'conflicts' => [], 'suggests' => [],