Restrict export filters and aggregators for limited users

Added restrictions on export filters and aggregators based on user permissions. Introduced `ExportConfigProcessor` to handle allowed configurations and updated form components to respect these restrictions. Enhanced validation to enforce access control for unauthorized filter editing.
This commit is contained in:
2025-04-24 14:21:51 +02:00
parent a6e523ee0a
commit 8c5a7ac3e1
5 changed files with 51 additions and 6 deletions

View File

@@ -32,6 +32,7 @@ class AggregatorType extends AbstractType
->add(self::ENABLED_FIELD, CheckboxType::class, [
'value' => true,
'required' => false,
'disabled' => $options['disable_enable_field'],
]);
$aggregatorFormBuilder = $builder->create('form', FormType::class, [
@@ -55,6 +56,7 @@ class AggregatorType extends AbstractType
{
$resolver->setRequired('aggregator_alias')
->setRequired('export_manager')
->setDefault('disable_enable_field', false)
->setDefault('compound', true)
->setDefault('error_bubbling', false);
}

View File

@@ -35,7 +35,7 @@ class ExportType extends AbstractType
public function __construct(
private readonly ExportManager $exportManager,
private readonly SortExportElement $sortExportElement,
protected ParameterBagInterface $parameterBag,
ParameterBagInterface $parameterBag,
) {
$this->personFieldsConfig = $parameterBag->get('chill_person.person_fields');
}
@@ -43,6 +43,8 @@ class ExportType extends AbstractType
public function buildForm(FormBuilderInterface $builder, array $options)
{
$export = $this->exportManager->getExport($options['export_alias']);
/** @var bool $canEditFull */
$canEditFull = $options['can_edit_full'];
$exportOptions = [
'compound' => true,
@@ -59,8 +61,18 @@ class ExportType extends AbstractType
if ($export instanceof \Chill\MainBundle\Export\ExportInterface) {
// add filters
$filters = $this->exportManager->getFiltersApplyingOn($export, $options['picked_centers']);
$filterAliases = $options['allowed_filters'];
$filters = [];
if (is_iterable($filterAliases)) {
foreach ($filterAliases as $alias => $filter) {
$filters[$alias] = $filter;
}
} else {
$filters = $this->exportManager->getFiltersApplyingOn($export, $options['picked_centers']);
}
$this->sortExportElement->sortFilters($filters);
$filterBuilder = $builder->create(self::FILTER_KEY, FormType::class, ['compound' => true]);
foreach ($filters as $alias => $filter) {
@@ -70,15 +82,26 @@ class ExportType extends AbstractType
'constraints' => [
new ExportElementConstraint(['element' => $filter]),
],
'disable_enable_field' => !$canEditFull,
]);
}
$builder->add($filterBuilder);
// add aggregators
$aggregators = $this->exportManager
->getAggregatorsApplyingOn($export, $options['picked_centers']);
$aggregatorsAliases = $options['allowed_aggregators'];
$aggregators = [];
if (is_iterable($aggregatorsAliases)) {
foreach ($aggregatorsAliases as $alias => $aggregator) {
$aggregators[$alias] = $aggregator;
}
} else {
$aggregators = $this->exportManager
->getAggregatorsApplyingOn($export, $options['picked_centers']);
}
$this->sortExportElement->sortAggregators($aggregators);
$aggregatorBuilder = $builder->create(
self::AGGREGATOR_KEY,
FormType::class,
@@ -96,11 +119,11 @@ class ExportType extends AbstractType
}
}
$aggregatorBuilder->add($alias, AggregatorType::class, [
'aggregator_alias' => $alias,
'export_manager' => $this->exportManager,
'label' => $aggregator->getTitle(),
'disable_enable_field' => !$canEditFull,
'constraints' => [
new ExportElementConstraint(['element' => $aggregator]),
],
@@ -125,8 +148,13 @@ class ExportType extends AbstractType
public function configureOptions(OptionsResolver $resolver)
{
$resolver->setRequired(['export_alias', 'picked_centers'])
$resolver->setRequired(['export_alias', 'picked_centers', 'can_edit_full'])
->setAllowedTypes('export_alias', ['string'])
->setAllowedValues('can_edit_full', [true, false])
->setDefault('allowed_filters', null)
->setAllowedTypes('allowed_filters', ['iterable', 'null'])
->setDefault('allowed_aggregators', null)
->setAllowedTypes('allowed_aggregators', ['iterable', 'null'])
->setDefault('compound', true)
->setDefault('constraints', [
// new \Chill\MainBundle\Validator\Constraints\Export\ExportElementConstraint()

View File

@@ -34,6 +34,7 @@ class FilterType extends AbstractType
->add(self::ENABLED_FIELD, CheckboxType::class, [
'value' => true,
'required' => false,
'disabled' => $options['disable_enable_field'],
]);
$filterFormBuilder = $builder->create('form', FormType::class, [
@@ -58,6 +59,7 @@ class FilterType extends AbstractType
$resolver
->setRequired('filter')
->setAllowedTypes('filter', [FilterInterface::class])
->setDefault('disable_enable_field', false)
->setDefault('compound', true)
->setDefault('error_bubbling', false);
}