Skip to content

Commit fe53fbf

Browse files
committed
Merge pull request #699 from ezsystems/fix_EZP-22239_previewContentSiteaccessLegacyMode
Fix EZP-22239: When the preview siteaccess runs in legacy mode, it falls...
2 parents 89f00b2 + 2b6f3b5 commit fe53fbf

File tree

6 files changed

+209
-50
lines changed

6 files changed

+209
-50
lines changed

eZ/Bundle/EzPublishCoreBundle/Resources/config/services.yml

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,7 @@ services:
5050
arguments: [@ezpublish.view_manager]
5151
parent: ezpublish.controller.base
5252

53-
ezpublish.controller.content.preview:
53+
ezpublish.controller.content.preview.core:
5454
class: %ezpublish.controller.content.preview.class%
5555
arguments:
5656
- @ezpublish.api.service.content
@@ -60,6 +60,9 @@ services:
6060
calls:
6161
- [setRequest, [@?request=]]
6262

63+
ezpublish.controller.content.preview:
64+
alias: ezpublish.controller.content.preview.core
65+
6366
ezpublish.controller.page.view:
6467
class: %ezpublish.controller.page.view.class%
6568
arguments: [@ezpublish.view_manager, @ezpublish.fieldType.ezpage.pageService]
Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
<?php
2+
/**
3+
* File containing the PreviewController class.
4+
*
5+
* @copyright Copyright (C) 1999-2014 eZ Systems AS. All rights reserved.
6+
* @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2
7+
* @version //autogentag//
8+
*/
9+
10+
namespace eZ\Bundle\EzPublishLegacyBundle\Controller;
11+
12+
use eZ\Publish\API\Repository\Values\Content\Content;
13+
use eZ\Publish\API\Repository\Values\Content\Location;
14+
use eZ\Publish\Core\MVC\ConfigResolverInterface;
15+
use eZ\Publish\Core\MVC\Symfony\Controller\Content\PreviewController as BasePreviewController;
16+
use eZ\Publish\Core\MVC\Symfony\SiteAccess;
17+
18+
class PreviewController extends BasePreviewController
19+
{
20+
/**
21+
* @var \eZ\Publish\Core\MVC\ConfigResolverInterface
22+
*/
23+
private $configResolver;
24+
25+
/**
26+
* @param \eZ\Publish\Core\MVC\ConfigResolverInterface $configResolver
27+
*/
28+
public function setConfigResolver( ConfigResolverInterface $configResolver )
29+
{
30+
$this->configResolver = $configResolver;
31+
}
32+
33+
protected function getForwardRequest( Location $location, Content $content, SiteAccess $previewSiteAccess )
34+
{
35+
$request = parent::getForwardRequest( $location, $content, $previewSiteAccess );
36+
// If the preview siteaccess is configured in legacy_mode, we forward to the LegacyKernelController.
37+
if ( $this->configResolver->getParameter( 'legacy_mode', 'ezsettings', $previewSiteAccess->name ) )
38+
{
39+
$request->attributes->set( '_controller', 'ezpublish_legacy.controller:indexAction' );
40+
}
41+
42+
return $request;
43+
}
44+
}

eZ/Bundle/EzPublishLegacyBundle/Resources/config/services.yml

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ parameters:
1313
ezpublish_legacy.treemenu.controller.class: eZ\Bundle\EzPublishLegacyBundle\Controller\LegacyTreeMenuController
1414
ezpublish_legacy.treemenu.controller.options: {}
1515
ezpublish_legacy.setup.controller.class: eZ\Bundle\EzPublishLegacyBundle\Controller\LegacySetupController
16+
ezpublish_legacy.preview.controller.class: eZ\Bundle\EzPublishLegacyBundle\Controller\PreviewController
1617

1718
ezpublish_legacy.kernel_handler.cli.class: eZ\Publish\Core\MVC\Legacy\Kernel\CLIHandler
1819
ezpublish_legacy.kernel_handler.cli.options: {}
@@ -128,6 +129,15 @@ services:
128129
- @ezpublish_legacy.configuration_mapper
129130
- @ezpublish_legacy.security_mapper
130131

132+
ezpublish_legacy.preview.controller:
133+
class: %ezpublish_legacy.preview.controller.class%
134+
parent: ezpublish.controller.content.preview.core
135+
calls:
136+
- [setConfigResolver, [@ezpublish.config.resolver]]
137+
138+
ezpublish.controller.content.preview:
139+
alias: ezpublish_legacy.preview.controller
140+
131141
ezpublish_legacy.router:
132142
class: %ezpublish_legacy.router.class%
133143
arguments: [@ezpublish_legacy.url_generator, @?request_context, @?logger]
Lines changed: 68 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,68 @@
1+
<?php
2+
/**
3+
* File containing the PreviewControllerTest class.
4+
*
5+
* @copyright Copyright (C) 1999-2014 eZ Systems AS. All rights reserved.
6+
* @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2
7+
* @version //autogentag//
8+
*/
9+
10+
namespace eZ\Bundle\EzPublishLegacyBundle\Tests\Controller;
11+
12+
use eZ\Bundle\EzPublishLegacyBundle\Controller\PreviewController;
13+
use eZ\Publish\API\Repository\Values\Content\Content;
14+
use eZ\Publish\API\Repository\Values\Content\Location;
15+
use eZ\Publish\Core\MVC\Symfony\Controller\Tests\Controller\Content\PreviewControllerTest as BasePreviewControllerTest;
16+
use eZ\Publish\Core\MVC\Symfony\SiteAccess;
17+
18+
class PreviewControllerTest extends BasePreviewControllerTest
19+
{
20+
/**
21+
* @var \PHPUnit_Framework_MockObject_MockObject
22+
*/
23+
protected $configResolver;
24+
25+
protected function setUp()
26+
{
27+
parent::setUp();
28+
$this->configResolver = $this->getMock( 'eZ\Publish\Core\MVC\ConfigResolverInterface' );
29+
}
30+
31+
/**
32+
* @return \eZ\Bundle\EzPublishLegacyBundle\Controller\PreviewController
33+
*/
34+
protected function getPreviewController()
35+
{
36+
$controller = new PreviewController(
37+
$this->contentService,
38+
$this->httpKernel,
39+
$this->previewHelper,
40+
$this->securityContext
41+
);
42+
$controller->setConfigResolver( $this->configResolver );
43+
44+
return $controller;
45+
}
46+
47+
protected function getDuplicatedRequest( Location $location, Content $content, SiteAccess $previewSiteAccess )
48+
{
49+
$request = parent::getDuplicatedRequest(
50+
$location,
51+
$content,
52+
$previewSiteAccess
53+
);
54+
$request->attributes->set( '_controller', 'ezpublish_legacy.controller:indexAction' );
55+
56+
return $request;
57+
}
58+
59+
public function testPreview()
60+
{
61+
$this->configResolver
62+
->expects( $this->any() )
63+
->method( 'getParameter' )
64+
->with( 'legacy_mode' )
65+
->will( $this->returnValue( true ) );
66+
parent::testPreview();
67+
}
68+
}

eZ/Publish/Core/MVC/Symfony/Controller/Content/PreviewController.php

Lines changed: 33 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,10 @@
1111

1212
use eZ\Publish\API\Repository\ContentService;
1313
use eZ\Publish\API\Repository\Exceptions\UnauthorizedException;
14+
use eZ\Publish\API\Repository\Values\Content\Content;
15+
use eZ\Publish\API\Repository\Values\Content\Location;
1416
use eZ\Publish\Core\Helper\ContentPreviewHelper;
17+
use eZ\Publish\Core\MVC\Symfony\SiteAccess;
1518
use eZ\Publish\Core\MVC\Symfony\View\ViewManagerInterface;
1619
use eZ\Publish\Core\MVC\Symfony\Security\Authorization\Attribute as AuthorizationAttribute;
1720
use Symfony\Component\HttpFoundation\Request;
@@ -84,17 +87,7 @@ public function previewContentAction( $contentId, $versionNo, $language, $siteAc
8487
$newSiteAccess = $this->previewHelper->changeConfigScope( $siteAccessName );
8588

8689
$response = $this->kernel->handle(
87-
$this->request->duplicate(
88-
null, null,
89-
array(
90-
'_controller' => 'ez_content:viewLocation',
91-
'location' => $location,
92-
'viewType' => ViewManagerInterface::VIEW_TYPE_FULL,
93-
'layout' => true,
94-
'params' => array( 'content' => $content, 'location' => $location, 'isPreview' => true ),
95-
'siteaccess' => $newSiteAccess
96-
)
97-
),
90+
$this->getForwardRequest( $location, $content, $newSiteAccess ),
9891
HttpKernelInterface::SUB_REQUEST
9992
);
10093
$response->headers->remove( 'cache-control' );
@@ -104,4 +97,33 @@ public function previewContentAction( $contentId, $versionNo, $language, $siteAc
10497

10598
return $response;
10699
}
100+
101+
/**
102+
* Returns the Request object that will be forwarded to the kernel for previewing the content.
103+
*
104+
* @param \eZ\Publish\API\Repository\Values\Content\Location $location
105+
* @param \eZ\Publish\API\Repository\Values\Content\Content $content
106+
* @param \eZ\Publish\Core\MVC\Symfony\SiteAccess $previewSiteAccess
107+
*
108+
* @return \Symfony\Component\HttpFoundation\Request
109+
*/
110+
protected function getForwardRequest( Location $location, Content $content, SiteAccess $previewSiteAccess )
111+
{
112+
return $this->request->duplicate(
113+
null, null,
114+
array(
115+
'_controller' => 'ez_content:viewLocation',
116+
'location' => $location,
117+
'viewType' => ViewManagerInterface::VIEW_TYPE_FULL,
118+
'layout' => true,
119+
'params' => array(
120+
'content' => $content,
121+
'location' => $location,
122+
'isPreview' => true
123+
),
124+
'siteaccess' => $previewSiteAccess,
125+
'semanticPathinfo' => $this->request->attributes->get( 'semanticPathinfo' ),
126+
)
127+
);
128+
}
107129
}

eZ/Publish/Core/MVC/Symfony/Controller/Tests/Controller/Content/PreviewControllerTest.php

Lines changed: 50 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,8 @@
99

1010
namespace eZ\Publish\Core\MVC\Symfony\Controller\Tests\Controller\Content;
1111

12+
use eZ\Publish\API\Repository\Values\Content\Content;
13+
use eZ\Publish\API\Repository\Values\Content\Location;
1214
use eZ\Publish\Core\Base\Exceptions\UnauthorizedException;
1315
use eZ\Publish\Core\MVC\Symfony\Controller\Content\PreviewController;
1416
use eZ\Publish\Core\MVC\Symfony\SiteAccess;
@@ -24,27 +26,22 @@ class PreviewControllerTest extends PHPUnit_Framework_TestCase
2426
/**
2527
* @var \PHPUnit_Framework_MockObject_MockObject
2628
*/
27-
private $repository;
29+
protected $contentService;
2830

2931
/**
3032
* @var \PHPUnit_Framework_MockObject_MockObject
3133
*/
32-
private $contentService;
34+
protected $httpKernel;
3335

3436
/**
3537
* @var \PHPUnit_Framework_MockObject_MockObject
3638
*/
37-
private $httpKernel;
39+
protected $previewHelper;
3840

3941
/**
4042
* @var \PHPUnit_Framework_MockObject_MockObject
4143
*/
42-
private $previewHelper;
43-
44-
/**
45-
* @var \PHPUnit_Framework_MockObject_MockObject
46-
*/
47-
private $securityContext;
44+
protected $securityContext;
4845

4946
protected function setUp()
5047
{
@@ -60,16 +57,26 @@ protected function setUp()
6057
}
6158

6259
/**
63-
* @expectedException \Symfony\Component\Security\Core\Exception\AccessDeniedException
60+
* @return PreviewController
6461
*/
65-
public function testPreviewUnauthorized()
62+
protected function getPreviewController()
6663
{
6764
$controller = new PreviewController(
6865
$this->contentService,
6966
$this->httpKernel,
7067
$this->previewHelper,
7168
$this->securityContext
7269
);
70+
71+
return $controller;
72+
}
73+
74+
/**
75+
* @expectedException \Symfony\Component\Security\Core\Exception\AccessDeniedException
76+
*/
77+
public function testPreviewUnauthorized()
78+
{
79+
$controller = $this->getPreviewController();
7380
$contentId = 123;
7481
$lang = 'eng-GB';
7582
$versionNo = 3;
@@ -86,12 +93,7 @@ public function testPreviewUnauthorized()
8693
*/
8794
public function testPreviewCanUserFail()
8895
{
89-
$controller = new PreviewController(
90-
$this->contentService,
91-
$this->httpKernel,
92-
$this->previewHelper,
93-
$this->securityContext
94-
);
96+
$controller = $this->getPreviewController();
9597
$contentId = 123;
9698
$lang = 'eng-GB';
9799
$versionNo = 3;
@@ -164,21 +166,7 @@ public function testPreview()
164166
->method( 'restoreConfigScope' );
165167

166168
// Request expectations
167-
$duplicatedRequest = new Request();
168-
$duplicatedRequest->attributes->add(
169-
array(
170-
'_controller' => 'ez_content:viewLocation',
171-
'location' => $location,
172-
'viewType' => ViewManagerInterface::VIEW_TYPE_FULL,
173-
'layout' => true,
174-
'params' => array(
175-
'content' => $content,
176-
'location' => $location,
177-
'isPreview' => true,
178-
'siteaccess' => $previewSiteAccess
179-
)
180-
)
181-
);
169+
$duplicatedRequest = $this->getDuplicatedRequest( $location, $content, $previewSiteAccess );
182170
$request
183171
->expects( $this->once() )
184172
->method( 'duplicate' )
@@ -192,16 +180,40 @@ public function testPreview()
192180
->with( $duplicatedRequest, HttpKernelInterface::SUB_REQUEST )
193181
->will( $this->returnValue( $expectedResponse ) );
194182

195-
$controller = new PreviewController(
196-
$this->contentService,
197-
$this->httpKernel,
198-
$this->previewHelper,
199-
$this->securityContext
200-
);
183+
$controller = $this->getPreviewController();
201184
$controller->setRequest( $request );
202185
$this->assertSame(
203186
$expectedResponse,
204187
$controller->previewContentAction( $contentId, $versionNo, $lang, $previewSiteAccessName )
205188
);
206189
}
190+
191+
/**
192+
* @param $location
193+
* @param $content
194+
* @param $previewSiteAccess
195+
*
196+
* @return Request
197+
*/
198+
protected function getDuplicatedRequest( Location $location, Content $content, SiteAccess $previewSiteAccess )
199+
{
200+
$duplicatedRequest = new Request();
201+
$duplicatedRequest->attributes->add(
202+
array(
203+
'_controller' => 'ez_content:viewLocation',
204+
'location' => $location,
205+
'viewType' => ViewManagerInterface::VIEW_TYPE_FULL,
206+
'layout' => true,
207+
'semanticPathinfo' => '/foo/bar',
208+
'params' => array(
209+
'content' => $content,
210+
'location' => $location,
211+
'isPreview' => true,
212+
'siteaccess' => $previewSiteAccess
213+
)
214+
)
215+
);
216+
217+
return $duplicatedRequest;
218+
}
207219
}

0 commit comments

Comments
 (0)