From 5e9bb4632fff1812a9180c0d6d205fd23d8e0894 Mon Sep 17 00:00:00 2001 From: Axel Guckelsberger Date: Tue, 28 Dec 2021 14:01:42 +0100 Subject: [PATCH] add CSRF tokens to duplicate action --- .../Controller/PageController.php | 8 ++++++++ .../Zikula/ContentModule/Menu/MenuBuilder.php | 19 +++++++++++++++++-- 2 files changed, 25 insertions(+), 2 deletions(-) diff --git a/src/extensions/Zikula/ContentModule/Controller/PageController.php b/src/extensions/Zikula/ContentModule/Controller/PageController.php index 5a8fa7edc..e7839e2cd 100644 --- a/src/extensions/Zikula/ContentModule/Controller/PageController.php +++ b/src/extensions/Zikula/ContentModule/Controller/PageController.php @@ -443,6 +443,10 @@ public function adminDuplicate( HookHelper $hookHelper, string $slug = '' ): RedirectResponse { + if (!$this->isCsrfTokenValid('duplicate-page', $request->query->get('token'))) { + throw new AccessDeniedException(); + } + return $this->duplicateInternal($request, $router, $permissionHelper, $entityFactory, $workflowHelper, $modelHelper, $hookHelper, $slug, true); } @@ -462,6 +466,10 @@ public function duplicate( HookHelper $hookHelper, string $slug = '' ): RedirectResponse { + if (!$this->isCsrfTokenValid('duplicate-page', $request->query->get('token'))) { + throw new AccessDeniedException(); + } + return $this->duplicateInternal($request, $router, $permissionHelper, $entityFactory, $workflowHelper, $modelHelper, $hookHelper, $slug, false); } diff --git a/src/extensions/Zikula/ContentModule/Menu/MenuBuilder.php b/src/extensions/Zikula/ContentModule/Menu/MenuBuilder.php index a5615d62f..035b8c99f 100644 --- a/src/extensions/Zikula/ContentModule/Menu/MenuBuilder.php +++ b/src/extensions/Zikula/ContentModule/Menu/MenuBuilder.php @@ -17,6 +17,7 @@ namespace Zikula\ContentModule\Menu; use Knp\Menu\ItemInterface; +use Symfony\Component\Security\Csrf\CsrfTokenManagerInterface; use Symfony\Contracts\Translation\TranslatorInterface; use Zikula\ContentModule\Entity\PageEntity; use Zikula\ContentModule\Menu\Base\AbstractMenuBuilder; @@ -32,6 +33,11 @@ class MenuBuilder extends AbstractMenuBuilder */ private $translator; + /** + * @var CsrfTokenManagerInterface + */ + private $csrfTokenManager; + /** * @var bool */ @@ -95,9 +101,11 @@ public function createItemActionsMenu(array $options = []): ItemInterface ; } if ($hasEditPermissions) { + $routeParameters = $entity->createUrlArgs(); + $routeParameters['token'] = $this->getCsrfToken('duplicate-page'); $menu->addChild('Duplicate', [ 'route' => $routePrefix . $routeArea . 'duplicate', - 'routeParameters' => $entity->createUrlArgs(), + 'routeParameters' => $routeParameters, ]) ->setLinkAttribute( 'title', @@ -135,9 +143,16 @@ public function createItemActionsMenu(array $options = []): ItemInterface */ public function setAdditionalDependencies( TranslatorInterface $translator, - VariableApiInterface $variableApi + CsrfTokenManagerInterface $csrfTokenManager, + VariableApiInterface $variableApi, ): void { $this->translator = $translator; + $this->csrfTokenManager = $csrfTokenManager; $this->multilingual = $variableApi->getSystemVar('multilingual', true); } + + private function getCsrfToken(string $tokenId): string + { + return $this->csrfTokenManager->getToken($tokenId)->getValue(); + } }