Skip to content

Commit

Permalink
Merge branch '7.4'
Browse files Browse the repository at this point in the history
  • Loading branch information
pawbuj committed Feb 11, 2019
2 parents 2365bec + 9f69466 commit 2682fe4
Show file tree
Hide file tree
Showing 5 changed files with 113 additions and 33 deletions.
4 changes: 4 additions & 0 deletions data/mysql/cleandata.sql
Expand Up @@ -1351,19 +1351,23 @@ INSERT INTO `ezpolicy` (`function_name`, `id`, `module_name`, `original_id`, `ro
INSERT INTO `ezpolicy` (`function_name`, `id`, `module_name`, `original_id`, `role_id`) VALUES ('login',331,'user',0,1);
INSERT INTO `ezpolicy` (`function_name`, `id`, `module_name`, `original_id`, `role_id`) VALUES ('*',332,'*',0,2);
INSERT INTO `ezpolicy` (`function_name`, `id`, `module_name`, `original_id`, `role_id`) VALUES ('read',333,'content',0,4);
INSERT INTO `ezpolicy` (`function_name`, `id`, `module_name`, `original_id`, `role_id`) VALUES ('view_embed',334,'content',0,1);
INSERT INTO `ezpolicy` (`function_name`, `id`, `module_name`, `original_id`, `role_id`) VALUES ('*',340,'url',0,3);

INSERT INTO `ezpolicy_limitation` (`id`, `identifier`, `policy_id`) VALUES (251,'Section',328);
INSERT INTO `ezpolicy_limitation` (`id`, `identifier`, `policy_id`) VALUES (252,'Section',329);
INSERT INTO `ezpolicy_limitation` (`id`, `identifier`, `policy_id`) VALUES (253,'SiteAccess',331);
INSERT INTO `ezpolicy_limitation` (`id`, `identifier`, `policy_id`) VALUES (254,'Class',333);
INSERT INTO `ezpolicy_limitation` (`id`, `identifier`, `policy_id`) VALUES (255,'Owner',333);
INSERT INTO `ezpolicy_limitation` (`id`, `identifier`, `policy_id`) VALUES (256,'Class',334);

INSERT INTO `ezpolicy_limitation_value` (`id`, `limitation_id`, `value`) VALUES (477,251,'1');
INSERT INTO `ezpolicy_limitation_value` (`id`, `limitation_id`, `value`) VALUES (478,252,'1');
INSERT INTO `ezpolicy_limitation_value` (`id`, `limitation_id`, `value`) VALUES (479,253,'1766001124');
INSERT INTO `ezpolicy_limitation_value` (`id`, `limitation_id`, `value`) VALUES (480,254,'4');
INSERT INTO `ezpolicy_limitation_value` (`id`, `limitation_id`, `value`) VALUES (481,255,'1');
INSERT INTO `ezpolicy_limitation_value` (`id`, `limitation_id`, `value`) VALUES (482,256,'5');
INSERT INTO `ezpolicy_limitation_value` (`id`, `limitation_id`, `value`) VALUES (483,256,'12');

INSERT INTO `ezrole` (`id`, `is_new`, `name`, `value`, `version`) VALUES (1,0,'Anonymous','',0);
INSERT INTO `ezrole` (`id`, `is_new`, `name`, `value`, `version`) VALUES (2,0,'Administrator','0',0);
Expand Down
Expand Up @@ -63,9 +63,7 @@ services:
ezpublish.fieldType.ezimageasset.parameterProvider:
class: \eZ\Publish\Core\MVC\Symfony\FieldType\ImageAsset\ParameterProvider
arguments:
- "@ezpublish.api.service.content"
- "@ezpublish.api.service.inner_field_type"
- "@eZ\\Publish\\Core\\FieldType\\ImageAsset\\AssetMapper"
- "@ezpublish.siteaccessaware.repository"
tags:
- {name: ezpublish.fieldType.parameterProvider, alias: ezimageasset}

Expand Down
Expand Up @@ -448,7 +448,7 @@
{% if not ez_is_field_empty(content, field) and parameters.available %}
{{ fos_httpcache_tag('relation-' ~ field.value.destinationContentId) }}
<div {{ block('field_attributes') }}>
{{ render(controller('ez_content:viewAction', {
{{ render(controller('ez_content:embedAction', {
contentId: field.value.destinationContentId,
viewType: 'asset_image',
noLayout: true,
Expand Down
Expand Up @@ -8,23 +8,31 @@

namespace eZ\Publish\Core\MVC\Symfony\FieldType\ImageAsset;

use eZ\Publish\API\Repository\ContentService;
use eZ\Publish\API\Repository\Exceptions\NotFoundException;
use eZ\Publish\API\Repository\Exceptions\UnauthorizedException;
use eZ\Publish\API\Repository\Repository;
use eZ\Publish\API\Repository\Values\Content\Field;
use eZ\Publish\Core\MVC\Symfony\FieldType\View\ParameterProviderInterface;
use eZ\Publish\API\Repository\Values\Content\ContentInfo;

class ParameterProvider implements ParameterProviderInterface
{
/** @var \eZ\Publish\API\Repository\ContentService */
private $contentService;
/**
* @var \eZ\Publish\API\Repository\Repository
*/
private $repository;

/**
* @var \eZ\Publish\API\Repository\PermissionResolver
*/
private $permissionsResolver;

/**
* @param \eZ\Publish\API\Repository\ContentService
* @param \eZ\Publish\API\Repository\Repository $repository
*/
public function __construct(ContentService $contentService)
public function __construct(Repository $repository)
{
$this->contentService = $contentService;
$this->repository = $repository;
$this->permissionsResolver = $repository->getPermissionResolver();
}

/**
Expand All @@ -33,17 +41,54 @@ public function __construct(ContentService $contentService)
public function getViewParameters(Field $field): array
{
try {
$contentInfo = $this->contentService->loadContentInfo(
$contentInfo = $this->loadContentInfo(
$field->value->destinationContentId
);

if (!$this->userHasPermissions($contentInfo)) {
return [
'available' => false,
];
}

return [
'available' => !$contentInfo->isTrashed(),
];
} catch (NotFoundException | UnauthorizedException $exception) {
} catch (NotFoundException $exception) {
return [
'available' => false,
];
}
}

/**
* @param int $id
* @return \eZ\Publish\API\Repository\Values\Content\ContentInfo
* @throws \eZ\Publish\API\Repository\Exceptions\NotFoundException
*/
private function loadContentInfo(int $id): ContentInfo
{
return $this->repository->sudo(
function (Repository $repository) use ($id) {
return $repository->getContentService()->loadContentInfo($id);
}
);
}

/**
* @param \eZ\Publish\API\Repository\Values\Content\ContentInfo $contentInfo
* @return bool
*/
private function userHasPermissions(ContentInfo $contentInfo): bool
{
if ($this->permissionsResolver->canUser('content', 'read', $contentInfo)) {
return true;
}

if ($this->permissionsResolver->canUser('content', 'view_embed', $contentInfo)) {
return true;
}

return false;
}
}
Expand Up @@ -8,29 +8,36 @@

namespace eZ\Publish\Core\MVC\Symfony\FieldType\Tests\ImageAsset;

use eZ\Publish\API\Repository\ContentService;
use eZ\Publish\API\Repository\PermissionResolver;
use eZ\Publish\API\Repository\Values\Content\ContentInfo;
use eZ\Publish\API\Repository\Values\Content\Field;
use eZ\Publish\API\Repository\Exceptions\NotFoundException;
use eZ\Publish\API\Repository\Exceptions\UnauthorizedException;
use eZ\Publish\Core\FieldType\ImageAsset\Value as ImageAssetValue;
use eZ\Publish\Core\MVC\Symfony\FieldType\ImageAsset\ParameterProvider;
use eZ\Publish\Core\Repository\SiteAccessAware\Repository;
use PHPUnit\Framework\TestCase;

class ParameterProviderTest extends TestCase
{
/** @var \eZ\Publish\API\Repository\ContentService|\PHPUnit\Framework\MockObject\MockObject */
private $contentServiceMock;
/** @var \eZ\Publish\Core\Repository\SiteAccessAware\Repository|\PHPUnit\Framework\MockObject\MockObject */
private $repository;

/** @var \eZ\Publish\API\Repository\PermissionResolver|\PHPUnit\Framework\MockObject\MockObject */
private $permissionsResolver;

/** @var \eZ\Publish\Core\MVC\Symfony\FieldType\ImageAsset\ParameterProvider */
private $parameterProvider;

protected function setUp(): void
{
$this->contentServiceMock = $this->createMock(ContentService::class);
$this->parameterProvider = new ParameterProvider(
$this->contentServiceMock
);
$this->repository = $this->createMock(Repository::class);
$this->permissionsResolver = $this->createMock(PermissionResolver::class);

$this->repository
->method('getPermissionResolver')
->willReturn($this->permissionsResolver);

$this->parameterProvider = new ParameterProvider($this->repository);
}

public function dataProviderForTestGetViewParameters(): array
Expand All @@ -48,13 +55,21 @@ public function testGetViewParameters($status, array $expected): void
{
$destinationContentId = 1;

$this->contentServiceMock
->method('loadContentInfo')
->with($destinationContentId)
$closure = function (Repository $repository) use ($destinationContentId) {
return $repository->getContentService()->loadContentInfo($destinationContentId);
};

$this->repository
->method('sudo')
->with($closure)
->willReturn(new ContentInfo([
'status' => $status,
]));

$this->permissionsResolver
->method('canUser')
->willReturn(true);

$actual = $this->parameterProvider->getViewParameters(new Field([
'value' => new ImageAssetValue($destinationContentId),
]));
Expand All @@ -66,10 +81,14 @@ public function testGetViewParametersHandleNotFoundException(): void
{
$destinationContentId = 1;

$this->contentServiceMock
$closure = function (Repository $repository) use ($destinationContentId) {
return $repository->getContentService()->loadContentInfo($destinationContentId);
};

$this->repository
->expects($this->once())
->method('loadContentInfo')
->with($destinationContentId)
->method('sudo')
->with($closure)
->willThrowException($this->createMock(NotFoundException::class));

$actual = $this->parameterProvider->getViewParameters(new Field([
Expand All @@ -81,15 +100,29 @@ public function testGetViewParametersHandleNotFoundException(): void
], $actual);
}

public function testGetViewParametersHandleUnauthorizedException(): void
public function testGetViewParametersHandleUnauthorizedAccess(): void
{
$destinationContentId = 1;

$this->contentServiceMock
->expects($this->once())
->method('loadContentInfo')
->with($destinationContentId)
->willThrowException($this->createMock(UnauthorizedException::class));
$contentInfo = $this->createMock(ContentInfo::class);
$this->repository
->method('sudo')
->willReturn($contentInfo)
;

$this->permissionsResolver
->expects($this->at(0))
->method('canUser')
->with('content', 'read', $contentInfo)
->willReturn(false)
;

$this->permissionsResolver
->expects($this->at(1))
->method('canUser')
->with('content', 'view_embed', $contentInfo)
->willReturn(false)
;

$actual = $this->parameterProvider->getViewParameters(new Field([
'value' => new ImageAssetValue($destinationContentId),
Expand Down

0 comments on commit 2682fe4

Please sign in to comment.