From 2b6f3b5fd3885848205cd37af91a731f567c2a66 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Je=CC=81ro=CC=82me=20Vieilledent?= Date: Fri, 24 Jan 2014 16:50:52 +0100 Subject: [PATCH] Fix EZP-22239: When the preview siteaccess runs in legacy mode, it falls back into ezpublish_legacy.default.view_default_layout --- .../Resources/config/services.yml | 5 +- .../Controller/PreviewController.php | 44 ++++++++++ .../Resources/config/services.yml | 10 +++ .../Controller/PreviewControllerTest.php | 68 ++++++++++++++ .../Controller/Content/PreviewController.php | 44 +++++++--- .../Content/PreviewControllerTest.php | 88 +++++++++++-------- 6 files changed, 209 insertions(+), 50 deletions(-) create mode 100644 eZ/Bundle/EzPublishLegacyBundle/Controller/PreviewController.php create mode 100644 eZ/Bundle/EzPublishLegacyBundle/Tests/Controller/PreviewControllerTest.php diff --git a/eZ/Bundle/EzPublishCoreBundle/Resources/config/services.yml b/eZ/Bundle/EzPublishCoreBundle/Resources/config/services.yml index d4c54aa6cf0..47fa444673f 100644 --- a/eZ/Bundle/EzPublishCoreBundle/Resources/config/services.yml +++ b/eZ/Bundle/EzPublishCoreBundle/Resources/config/services.yml @@ -50,7 +50,7 @@ services: arguments: [@ezpublish.view_manager] parent: ezpublish.controller.base - ezpublish.controller.content.preview: + ezpublish.controller.content.preview.core: class: %ezpublish.controller.content.preview.class% arguments: - @ezpublish.api.service.content @@ -60,6 +60,9 @@ services: calls: - [setRequest, [@?request=]] + ezpublish.controller.content.preview: + alias: ezpublish.controller.content.preview.core + ezpublish.controller.page.view: class: %ezpublish.controller.page.view.class% arguments: [@ezpublish.view_manager, @ezpublish.fieldType.ezpage.pageService] diff --git a/eZ/Bundle/EzPublishLegacyBundle/Controller/PreviewController.php b/eZ/Bundle/EzPublishLegacyBundle/Controller/PreviewController.php new file mode 100644 index 00000000000..b331b451ecb --- /dev/null +++ b/eZ/Bundle/EzPublishLegacyBundle/Controller/PreviewController.php @@ -0,0 +1,44 @@ +configResolver = $configResolver; + } + + protected function getForwardRequest( Location $location, Content $content, SiteAccess $previewSiteAccess ) + { + $request = parent::getForwardRequest( $location, $content, $previewSiteAccess ); + // If the preview siteaccess is configured in legacy_mode, we forward to the LegacyKernelController. + if ( $this->configResolver->getParameter( 'legacy_mode', 'ezsettings', $previewSiteAccess->name ) ) + { + $request->attributes->set( '_controller', 'ezpublish_legacy.controller:indexAction' ); + } + + return $request; + } +} diff --git a/eZ/Bundle/EzPublishLegacyBundle/Resources/config/services.yml b/eZ/Bundle/EzPublishLegacyBundle/Resources/config/services.yml index ff6cfbb00dc..90d9e68eb3c 100644 --- a/eZ/Bundle/EzPublishLegacyBundle/Resources/config/services.yml +++ b/eZ/Bundle/EzPublishLegacyBundle/Resources/config/services.yml @@ -13,6 +13,7 @@ parameters: ezpublish_legacy.treemenu.controller.class: eZ\Bundle\EzPublishLegacyBundle\Controller\LegacyTreeMenuController ezpublish_legacy.treemenu.controller.options: {} ezpublish_legacy.setup.controller.class: eZ\Bundle\EzPublishLegacyBundle\Controller\LegacySetupController + ezpublish_legacy.preview.controller.class: eZ\Bundle\EzPublishLegacyBundle\Controller\PreviewController ezpublish_legacy.kernel_handler.cli.class: eZ\Publish\Core\MVC\Legacy\Kernel\CLIHandler ezpublish_legacy.kernel_handler.cli.options: {} @@ -128,6 +129,15 @@ services: - @ezpublish_legacy.configuration_mapper - @ezpublish_legacy.security_mapper + ezpublish_legacy.preview.controller: + class: %ezpublish_legacy.preview.controller.class% + parent: ezpublish.controller.content.preview.core + calls: + - [setConfigResolver, [@ezpublish.config.resolver]] + + ezpublish.controller.content.preview: + alias: ezpublish_legacy.preview.controller + ezpublish_legacy.router: class: %ezpublish_legacy.router.class% arguments: [@ezpublish_legacy.url_generator, @?request_context, @?logger] diff --git a/eZ/Bundle/EzPublishLegacyBundle/Tests/Controller/PreviewControllerTest.php b/eZ/Bundle/EzPublishLegacyBundle/Tests/Controller/PreviewControllerTest.php new file mode 100644 index 00000000000..bb21c1fd49e --- /dev/null +++ b/eZ/Bundle/EzPublishLegacyBundle/Tests/Controller/PreviewControllerTest.php @@ -0,0 +1,68 @@ +configResolver = $this->getMock( 'eZ\Publish\Core\MVC\ConfigResolverInterface' ); + } + + /** + * @return \eZ\Bundle\EzPublishLegacyBundle\Controller\PreviewController + */ + protected function getPreviewController() + { + $controller = new PreviewController( + $this->contentService, + $this->httpKernel, + $this->previewHelper, + $this->securityContext + ); + $controller->setConfigResolver( $this->configResolver ); + + return $controller; + } + + protected function getDuplicatedRequest( Location $location, Content $content, SiteAccess $previewSiteAccess ) + { + $request = parent::getDuplicatedRequest( + $location, + $content, + $previewSiteAccess + ); + $request->attributes->set( '_controller', 'ezpublish_legacy.controller:indexAction' ); + + return $request; + } + + public function testPreview() + { + $this->configResolver + ->expects( $this->any() ) + ->method( 'getParameter' ) + ->with( 'legacy_mode' ) + ->will( $this->returnValue( true ) ); + parent::testPreview(); + } +} diff --git a/eZ/Publish/Core/MVC/Symfony/Controller/Content/PreviewController.php b/eZ/Publish/Core/MVC/Symfony/Controller/Content/PreviewController.php index f83a7879416..b649ca2eaf5 100644 --- a/eZ/Publish/Core/MVC/Symfony/Controller/Content/PreviewController.php +++ b/eZ/Publish/Core/MVC/Symfony/Controller/Content/PreviewController.php @@ -11,7 +11,10 @@ use eZ\Publish\API\Repository\ContentService; use eZ\Publish\API\Repository\Exceptions\UnauthorizedException; +use eZ\Publish\API\Repository\Values\Content\Content; +use eZ\Publish\API\Repository\Values\Content\Location; use eZ\Publish\Core\Helper\ContentPreviewHelper; +use eZ\Publish\Core\MVC\Symfony\SiteAccess; use eZ\Publish\Core\MVC\Symfony\View\ViewManagerInterface; use eZ\Publish\Core\MVC\Symfony\Security\Authorization\Attribute as AuthorizationAttribute; use Symfony\Component\HttpFoundation\Request; @@ -84,17 +87,7 @@ public function previewContentAction( $contentId, $versionNo, $language, $siteAc $newSiteAccess = $this->previewHelper->changeConfigScope( $siteAccessName ); $response = $this->kernel->handle( - $this->request->duplicate( - null, null, - array( - '_controller' => 'ez_content:viewLocation', - 'location' => $location, - 'viewType' => ViewManagerInterface::VIEW_TYPE_FULL, - 'layout' => true, - 'params' => array( 'content' => $content, 'location' => $location, 'isPreview' => true ), - 'siteaccess' => $newSiteAccess - ) - ), + $this->getForwardRequest( $location, $content, $newSiteAccess ), HttpKernelInterface::SUB_REQUEST ); $response->headers->remove( 'cache-control' ); @@ -104,4 +97,33 @@ public function previewContentAction( $contentId, $versionNo, $language, $siteAc return $response; } + + /** + * Returns the Request object that will be forwarded to the kernel for previewing the content. + * + * @param \eZ\Publish\API\Repository\Values\Content\Location $location + * @param \eZ\Publish\API\Repository\Values\Content\Content $content + * @param \eZ\Publish\Core\MVC\Symfony\SiteAccess $previewSiteAccess + * + * @return \Symfony\Component\HttpFoundation\Request + */ + protected function getForwardRequest( Location $location, Content $content, SiteAccess $previewSiteAccess ) + { + return $this->request->duplicate( + null, null, + array( + '_controller' => 'ez_content:viewLocation', + 'location' => $location, + 'viewType' => ViewManagerInterface::VIEW_TYPE_FULL, + 'layout' => true, + 'params' => array( + 'content' => $content, + 'location' => $location, + 'isPreview' => true + ), + 'siteaccess' => $previewSiteAccess, + 'semanticPathinfo' => $this->request->attributes->get( 'semanticPathinfo' ), + ) + ); + } } diff --git a/eZ/Publish/Core/MVC/Symfony/Controller/Tests/Controller/Content/PreviewControllerTest.php b/eZ/Publish/Core/MVC/Symfony/Controller/Tests/Controller/Content/PreviewControllerTest.php index e1b29130961..2086d5de801 100644 --- a/eZ/Publish/Core/MVC/Symfony/Controller/Tests/Controller/Content/PreviewControllerTest.php +++ b/eZ/Publish/Core/MVC/Symfony/Controller/Tests/Controller/Content/PreviewControllerTest.php @@ -9,6 +9,8 @@ namespace eZ\Publish\Core\MVC\Symfony\Controller\Tests\Controller\Content; +use eZ\Publish\API\Repository\Values\Content\Content; +use eZ\Publish\API\Repository\Values\Content\Location; use eZ\Publish\Core\Base\Exceptions\UnauthorizedException; use eZ\Publish\Core\MVC\Symfony\Controller\Content\PreviewController; use eZ\Publish\Core\MVC\Symfony\SiteAccess; @@ -24,27 +26,22 @@ class PreviewControllerTest extends PHPUnit_Framework_TestCase /** * @var \PHPUnit_Framework_MockObject_MockObject */ - private $repository; + protected $contentService; /** * @var \PHPUnit_Framework_MockObject_MockObject */ - private $contentService; + protected $httpKernel; /** * @var \PHPUnit_Framework_MockObject_MockObject */ - private $httpKernel; + protected $previewHelper; /** * @var \PHPUnit_Framework_MockObject_MockObject */ - private $previewHelper; - - /** - * @var \PHPUnit_Framework_MockObject_MockObject - */ - private $securityContext; + protected $securityContext; protected function setUp() { @@ -60,9 +57,9 @@ protected function setUp() } /** - * @expectedException \Symfony\Component\Security\Core\Exception\AccessDeniedException + * @return PreviewController */ - public function testPreviewUnauthorized() + protected function getPreviewController() { $controller = new PreviewController( $this->contentService, @@ -70,6 +67,16 @@ public function testPreviewUnauthorized() $this->previewHelper, $this->securityContext ); + + return $controller; + } + + /** + * @expectedException \Symfony\Component\Security\Core\Exception\AccessDeniedException + */ + public function testPreviewUnauthorized() + { + $controller = $this->getPreviewController(); $contentId = 123; $lang = 'eng-GB'; $versionNo = 3; @@ -86,12 +93,7 @@ public function testPreviewUnauthorized() */ public function testPreviewCanUserFail() { - $controller = new PreviewController( - $this->contentService, - $this->httpKernel, - $this->previewHelper, - $this->securityContext - ); + $controller = $this->getPreviewController(); $contentId = 123; $lang = 'eng-GB'; $versionNo = 3; @@ -164,21 +166,7 @@ public function testPreview() ->method( 'restoreConfigScope' ); // Request expectations - $duplicatedRequest = new Request(); - $duplicatedRequest->attributes->add( - array( - '_controller' => 'ez_content:viewLocation', - 'location' => $location, - 'viewType' => ViewManagerInterface::VIEW_TYPE_FULL, - 'layout' => true, - 'params' => array( - 'content' => $content, - 'location' => $location, - 'isPreview' => true, - 'siteaccess' => $previewSiteAccess - ) - ) - ); + $duplicatedRequest = $this->getDuplicatedRequest( $location, $content, $previewSiteAccess ); $request ->expects( $this->once() ) ->method( 'duplicate' ) @@ -192,16 +180,40 @@ public function testPreview() ->with( $duplicatedRequest, HttpKernelInterface::SUB_REQUEST ) ->will( $this->returnValue( $expectedResponse ) ); - $controller = new PreviewController( - $this->contentService, - $this->httpKernel, - $this->previewHelper, - $this->securityContext - ); + $controller = $this->getPreviewController(); $controller->setRequest( $request ); $this->assertSame( $expectedResponse, $controller->previewContentAction( $contentId, $versionNo, $lang, $previewSiteAccessName ) ); } + + /** + * @param $location + * @param $content + * @param $previewSiteAccess + * + * @return Request + */ + protected function getDuplicatedRequest( Location $location, Content $content, SiteAccess $previewSiteAccess ) + { + $duplicatedRequest = new Request(); + $duplicatedRequest->attributes->add( + array( + '_controller' => 'ez_content:viewLocation', + 'location' => $location, + 'viewType' => ViewManagerInterface::VIEW_TYPE_FULL, + 'layout' => true, + 'semanticPathinfo' => '/foo/bar', + 'params' => array( + 'content' => $content, + 'location' => $location, + 'isPreview' => true, + 'siteaccess' => $previewSiteAccess + ) + ) + ); + + return $duplicatedRequest; + } }