Skip to content

Commit

Permalink
Merge pull request #699 from ezsystems/fix_EZP-22239_previewContentSi…
Browse files Browse the repository at this point in the history
…teaccessLegacyMode

Fix EZP-22239: When the preview siteaccess runs in legacy mode, it falls...
  • Loading branch information
lolautruche committed Jan 28, 2014
2 parents 89f00b2 + 2b6f3b5 commit fe53fbf
Show file tree
Hide file tree
Showing 6 changed files with 209 additions and 50 deletions.
5 changes: 4 additions & 1 deletion eZ/Bundle/EzPublishCoreBundle/Resources/config/services.yml
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -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]
Expand Down
44 changes: 44 additions & 0 deletions eZ/Bundle/EzPublishLegacyBundle/Controller/PreviewController.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
<?php
/**
* File containing the PreviewController class.
*
* @copyright Copyright (C) 1999-2014 eZ Systems AS. All rights reserved.
* @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2
* @version //autogentag//
*/

namespace eZ\Bundle\EzPublishLegacyBundle\Controller;

use eZ\Publish\API\Repository\Values\Content\Content;
use eZ\Publish\API\Repository\Values\Content\Location;
use eZ\Publish\Core\MVC\ConfigResolverInterface;
use eZ\Publish\Core\MVC\Symfony\Controller\Content\PreviewController as BasePreviewController;
use eZ\Publish\Core\MVC\Symfony\SiteAccess;

class PreviewController extends BasePreviewController
{
/**
* @var \eZ\Publish\Core\MVC\ConfigResolverInterface
*/
private $configResolver;

/**
* @param \eZ\Publish\Core\MVC\ConfigResolverInterface $configResolver
*/
public function setConfigResolver( ConfigResolverInterface $configResolver )
{
$this->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;
}
}
10 changes: 10 additions & 0 deletions eZ/Bundle/EzPublishLegacyBundle/Resources/config/services.yml
Original file line number Diff line number Diff line change
Expand Up @@ -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: {}
Expand Down Expand Up @@ -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]
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,68 @@
<?php
/**
* File containing the PreviewControllerTest class.
*
* @copyright Copyright (C) 1999-2014 eZ Systems AS. All rights reserved.
* @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2
* @version //autogentag//
*/

namespace eZ\Bundle\EzPublishLegacyBundle\Tests\Controller;

use eZ\Bundle\EzPublishLegacyBundle\Controller\PreviewController;
use eZ\Publish\API\Repository\Values\Content\Content;
use eZ\Publish\API\Repository\Values\Content\Location;
use eZ\Publish\Core\MVC\Symfony\Controller\Tests\Controller\Content\PreviewControllerTest as BasePreviewControllerTest;
use eZ\Publish\Core\MVC\Symfony\SiteAccess;

class PreviewControllerTest extends BasePreviewControllerTest
{
/**
* @var \PHPUnit_Framework_MockObject_MockObject
*/
protected $configResolver;

protected function setUp()
{
parent::setUp();
$this->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();
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -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' );
Expand All @@ -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' ),
)
);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -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()
{
Expand All @@ -60,16 +57,26 @@ protected function setUp()
}

/**
* @expectedException \Symfony\Component\Security\Core\Exception\AccessDeniedException
* @return PreviewController
*/
public function testPreviewUnauthorized()
protected function getPreviewController()
{
$controller = new PreviewController(
$this->contentService,
$this->httpKernel,
$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;
Expand All @@ -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;
Expand Down Expand Up @@ -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' )
Expand All @@ -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;
}
}

0 comments on commit fe53fbf

Please sign in to comment.