Skip to content

Commit e34abb0

Browse files
authored
Merge pull request from GHSA-g6jc-xrc3-4wwq
IBX-3821: Added new Role and MemberOf limitations
2 parents ba3c700 + ad9fc62 commit e34abb0

8 files changed

Lines changed: 194 additions & 7 deletions

File tree

src/bundle/Resources/config/services.yaml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@ imports:
3636
- { resource: services/user.yaml }
3737
- { resource: services/commands.yaml }
3838
- { resource: services/icons.yaml }
39+
- { resource: services/role_form_mappers.yaml }
3940

4041
services:
4142
_defaults:

src/bundle/Resources/config/services/role_form_mappers.yaml

Lines changed: 19 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -219,8 +219,26 @@ services:
219219
$roleService: '@ibexa.api.service.role'
220220
$userService: '@ibexa.api.service.user'
221221
calls:
222-
- [setLogger, ['@?logger']]
223222
- [ setFormTemplate, [ '%ibexa.content_forms.limitation.multiple_selection.template%' ] ]
224223
tags:
225224
- { name: ibexa.admin_ui.limitation.mapper.form, limitationType: UserPermissions }
226225
- { name: ibexa.admin_ui.limitation.mapper.value, limitationType: UserPermissions }
226+
227+
Ibexa\AdminUi\Limitation\Mapper\MemberOfLimitationMapper:
228+
parent: Ibexa\AdminUi\Limitation\Mapper\MultipleSelectionBasedMapper
229+
arguments:
230+
$userService: '@ibexa.api.service.user'
231+
$repository: '@ibexa.api.repository'
232+
$contentService: '@ibexa.api.service.content'
233+
$translator: '@translator'
234+
tags:
235+
- { name: ibexa.admin_ui.limitation.mapper.form, limitationType: MemberOf }
236+
- { name: ibexa.admin_ui.limitation.mapper.value, limitationType: MemberOf }
237+
238+
Ibexa\AdminUi\Limitation\Mapper\RoleLimitationMapper:
239+
parent: Ibexa\AdminUi\Limitation\Mapper\MultipleSelectionBasedMapper
240+
arguments:
241+
$roleService: '@ibexa.api.service.role'
242+
tags:
243+
- { name: ibexa.admin_ui.limitation.mapper.form, limitationType: Role }
244+
- { name: ibexa.admin_ui.limitation.mapper.value, limitationType: Role }

src/bundle/Resources/translations/ezplatform_content_forms_policies.en.xliff

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,11 @@
2626
<target>Language</target>
2727
<note>key: policy.limitation.identifier.language</note>
2828
</trans-unit>
29+
<trans-unit id="b40e3e09e55ef852a5d9e1592e9c895715b1313c" resname="policy.limitation.identifier.memberof">
30+
<source>MemberOf</source>
31+
<target>MemberOf</target>
32+
<note>key: policy.limitation.identifier.memberof</note>
33+
</trans-unit>
2934
<trans-unit id="ab9163a435d32610a7a1af8df07ab38eebc4c7c6" resname="policy.limitation.identifier.newsection">
3035
<source>New Section</source>
3136
<target>New Section</target>
@@ -71,6 +76,11 @@
7176
<target>PersonalizationAccess</target>
7277
<note>key: policy.limitation.identifier.personalizationaccess</note>
7378
</trans-unit>
79+
<trans-unit id="9f2e53e094725bbc243ad777547724ab923a31d1" resname="policy.limitation.identifier.role">
80+
<source>Role</source>
81+
<target>Role</target>
82+
<note>key: policy.limitation.identifier.role</note>
83+
</trans-unit>
7484
<trans-unit id="af73694f5c5e5868af7948fb04f0d6bfe7ee6ad4" resname="policy.limitation.identifier.producttype">
7585
<source>ProductType</source>
7686
<target>ProductType</target>

src/bundle/Resources/translations/ezplatform_content_forms_role.en.xliff

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,11 @@
1111
<target state="new">Self</target>
1212
<note>key: policy.limitation.group.self</note>
1313
</trans-unit>
14+
<trans-unit id="e797dbd775ecc5788f41ceeb960b70a9d7a116ca" resname="policy.limitation.member_of.self_user_group">
15+
<source>Self</source>
16+
<target state="new">Self</target>
17+
<note>key: policy.limitation.member_of.self_user_group</note>
18+
</trans-unit>
1419
<trans-unit id="cc7c597ffa43ef724b881b127a4124fd35c8c6f6" resname="policy.limitation.owner.self">
1520
<source>Self</source>
1621
<target state="new">Self</target>

src/bundle/Resources/views/themes/admin/limitation/limitation_values.html.twig

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -141,3 +141,15 @@
141141
{% endfor %}
142142
{% endapply %}
143143
{% endblock %}
144+
145+
{% block ez_limitation_memberof_value %}
146+
{% apply spaceless %}
147+
{{ values|join(', ') }}
148+
{% endapply %}
149+
{% endblock %}
150+
151+
{% block ez_limitation_role_value %}
152+
{% apply spaceless %}
153+
{{ values|join(', ') }}
154+
{% endapply %}
155+
{% endblock %}
Lines changed: 100 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,100 @@
1+
<?php
2+
3+
/**
4+
* @copyright Copyright (C) Ibexa AS. All rights reserved.
5+
* @license For full copyright and license information view LICENSE file distributed with this source code.
6+
*/
7+
declare(strict_types=1);
8+
9+
namespace Ibexa\AdminUi\Limitation\Mapper;
10+
11+
use Ibexa\AdminUi\Limitation\LimitationValueMapperInterface;
12+
use Ibexa\Contracts\Core\Repository\ContentService;
13+
use Ibexa\Contracts\Core\Repository\Repository;
14+
use Ibexa\Contracts\Core\Repository\UserService;
15+
use Ibexa\Contracts\Core\Repository\Values\Content\Query\Criterion\ContentTypeIdentifier;
16+
use Ibexa\Contracts\Core\Repository\Values\Content\Query\SortClause\ContentName;
17+
use Ibexa\Contracts\Core\Repository\Values\Filter\Filter;
18+
use Ibexa\Contracts\Core\Repository\Values\User\Limitation;
19+
use Ibexa\Core\Limitation\MemberOfLimitationType;
20+
use Symfony\Contracts\Translation\TranslatorInterface;
21+
22+
final class MemberOfLimitationMapper extends MultipleSelectionBasedMapper implements LimitationValueMapperInterface
23+
{
24+
private UserService $userService;
25+
26+
private Repository $repository;
27+
28+
private ContentService $contentService;
29+
30+
private TranslatorInterface $translator;
31+
32+
public function __construct(
33+
UserService $userService,
34+
Repository $repository,
35+
ContentService $contentService,
36+
TranslatorInterface $translator
37+
) {
38+
$this->userService = $userService;
39+
$this->repository = $repository;
40+
$this->contentService = $contentService;
41+
$this->translator = $translator;
42+
}
43+
44+
protected function getSelectionChoices(): array
45+
{
46+
$userGroups = $this->loadUserGroups();
47+
$choices = [];
48+
$choices[MemberOfLimitationType::SELF_USER_GROUP] = $this->getSelfUserGroupLabel();
49+
50+
foreach ($userGroups as $userGroup) {
51+
$choices[$userGroup->id] = $userGroup->getName();
52+
}
53+
54+
return $choices;
55+
}
56+
57+
public function mapLimitationValue(Limitation $limitation): array
58+
{
59+
$values = [];
60+
foreach ($limitation->limitationValues as $groupId) {
61+
if ((int)$groupId === MemberOfLimitationType::SELF_USER_GROUP) {
62+
$values[] = $this->getSelfUserGroupLabel();
63+
continue;
64+
}
65+
$values[] = $this->userService->loadUserGroup((int)$groupId)->getName();
66+
}
67+
68+
return $values;
69+
}
70+
71+
/**
72+
* @return \Ibexa\Contracts\Core\Repository\Values\User\UserGroup[]
73+
*/
74+
private function loadUserGroups(): array
75+
{
76+
return $this->repository->sudo(function () {
77+
$filter = new Filter();
78+
$filter->withCriterion(new ContentTypeIdentifier('user_group'));
79+
$filter->withSortClause(new ContentName());
80+
$results = $this->contentService->find($filter);
81+
82+
$groups = [];
83+
foreach ($results as $result) {
84+
$groups[] = $this->userService->loadUserGroup($result->id);
85+
}
86+
87+
return $groups;
88+
});
89+
}
90+
91+
private function getSelfUserGroupLabel(): string
92+
{
93+
return $this->translator->trans(
94+
/** @Desc("Self") */
95+
'policy.limitation.member_of.self_user_group',
96+
[],
97+
'ezplatform_content_forms_role'
98+
);
99+
}
100+
}
Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
<?php
2+
3+
/**
4+
* @copyright Copyright (C) Ibexa AS. All rights reserved.
5+
* @license For full copyright and license information view LICENSE file distributed with this source code.
6+
*/
7+
declare(strict_types=1);
8+
9+
namespace Ibexa\AdminUi\Limitation\Mapper;
10+
11+
use Ibexa\AdminUi\Limitation\LimitationValueMapperInterface;
12+
use Ibexa\Contracts\Core\Repository\RoleService;
13+
use Ibexa\Contracts\Core\Repository\Values\User\Limitation;
14+
15+
final class RoleLimitationMapper extends MultipleSelectionBasedMapper implements LimitationValueMapperInterface
16+
{
17+
private RoleService $roleService;
18+
19+
public function __construct(
20+
RoleService $roleService
21+
) {
22+
$this->roleService = $roleService;
23+
}
24+
25+
protected function getSelectionChoices(): array
26+
{
27+
$choices = [];
28+
foreach ($this->roleService->loadRoles() as $role) {
29+
$choices[$role->id] = $role->identifier;
30+
}
31+
32+
return $choices;
33+
}
34+
35+
public function mapLimitationValue(Limitation $limitation): array
36+
{
37+
$values = [];
38+
39+
foreach ($limitation->limitationValues as $roleId) {
40+
$values[] = $this->roleService->loadRole((int)$roleId)->identifier;
41+
}
42+
43+
return $values;
44+
}
45+
}

src/lib/Limitation/Mapper/UserPermissionsLimitationMapper.php

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,8 @@
44
* @copyright Copyright (C) Ibexa AS. All rights reserved.
55
* @license For full copyright and license information view LICENSE file distributed with this source code.
66
*/
7+
declare(strict_types=1);
8+
79
namespace Ibexa\AdminUi\Limitation\Mapper;
810

911
use Ibexa\AdminUi\Limitation\LimitationFormMapperInterface;
@@ -15,17 +17,13 @@
1517
use Ibexa\Contracts\Core\Repository\UserService;
1618
use Ibexa\Contracts\Core\Repository\Values\User\Limitation;
1719
use Ibexa\User\Form\ChoiceList\Loader\UserGroupsChoiceLoader;
18-
use Psr\Log\LoggerAwareTrait;
19-
use Psr\Log\NullLogger;
2020
use Symfony\Component\Form\ChoiceList\Loader\CallbackChoiceLoader;
2121
use Symfony\Component\Form\Extension\Core\Type\ChoiceType;
2222
use Symfony\Component\Form\Extension\Core\Type\FormType;
2323
use Symfony\Component\Form\FormInterface;
2424

2525
final class UserPermissionsLimitationMapper implements LimitationValueMapperInterface, LimitationFormMapperInterface
2626
{
27-
use LoggerAwareTrait;
28-
2927
private RoleService $roleService;
3028

3129
private UserService $userService;
@@ -42,7 +40,6 @@ public function __construct(
4240
RoleService $roleService,
4341
UserService $userService
4442
) {
45-
$this->logger = new NullLogger();
4643
$this->roleService = $roleService;
4744
$this->userService = $userService;
4845
$this->repository = $repository;
@@ -100,7 +97,6 @@ function () {
10097
'multiple' => true,
10198
'required' => false,
10299
]);
103-
104100
$form->add($sub);
105101
}
106102

0 commit comments

Comments
 (0)