Skip to content

Commit 7f74c15

Browse files
Merge MC-37799 into 2.4-bugfixes-100620
2 parents 8b1d118 + 047629a commit 7f74c15

File tree

4 files changed

+94
-7
lines changed

4 files changed

+94
-7
lines changed

app/code/Magento/Csp/Model/BlockCache.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -111,7 +111,7 @@ public function save($data, $identifier, $tags = [], $lifeTime = null)
111111
];
112112
}
113113
}
114-
$data = $this->serializer->serialize(['policies' => $policiesData, 'html' => $data]);
114+
$data = $this->serializer->serialize(['policies' => $policiesData, 'html' => (string)$data]);
115115
}
116116

117117
return $this->cache->save($data, $identifier, $tags, $lifeTime);
Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
<?php
2+
/**
3+
* Copyright © Magento, Inc. All rights reserved.
4+
* See COPYING.txt for license details.
5+
*/
6+
declare(strict_types=1);
7+
8+
namespace Magento\Csp\Model\Collector;
9+
10+
use Magento\Csp\Api\Data\PolicyInterface;
11+
12+
/**
13+
* Merges policies using different mergers.
14+
*/
15+
class CompositeMerger implements MergerInterface
16+
{
17+
/**
18+
* @var MergerInterface[]
19+
*/
20+
private $mergers;
21+
22+
/**
23+
* @param MergerInterface[] $mergers
24+
*/
25+
public function __construct(array $mergers)
26+
{
27+
$this->mergers = $mergers;
28+
}
29+
30+
/**
31+
* @inheritDoc
32+
*/
33+
public function merge(PolicyInterface $policy1, PolicyInterface $policy2): PolicyInterface
34+
{
35+
foreach ($this->mergers as $merger) {
36+
if ($merger->canMerge($policy1, $policy2)) {
37+
return $merger->merge($policy1, $policy2);
38+
}
39+
}
40+
41+
throw new \RuntimeException('Cannot merge 2 policies of ' .get_class($policy1));
42+
}
43+
44+
/**
45+
* @inheritDoc
46+
*/
47+
public function canMerge(PolicyInterface $policy1, PolicyInterface $policy2): bool
48+
{
49+
foreach ($this->mergers as $merger) {
50+
if ($merger->canMerge($policy1, $policy2)) {
51+
return true;
52+
}
53+
}
54+
55+
return false;
56+
}
57+
}

app/code/Magento/Csp/Model/Collector/DynamicCollector.php

Lines changed: 23 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,19 @@ class DynamicCollector implements PolicyCollectorInterface
2020
*/
2121
private $added = [];
2222

23+
/**
24+
* @var MergerInterface
25+
*/
26+
private $merger;
27+
28+
/**
29+
* @param MergerInterface $merger
30+
*/
31+
public function __construct(MergerInterface $merger)
32+
{
33+
$this->merger = $merger;
34+
}
35+
2336
/**
2437
* Add a policy for current page.
2538
*
@@ -28,14 +41,22 @@ class DynamicCollector implements PolicyCollectorInterface
2841
*/
2942
public function add(PolicyInterface $policy): void
3043
{
31-
$this->added[] = $policy;
44+
if (array_key_exists($policy->getId(), $this->added)) {
45+
if ($this->merger->canMerge($this->added[$policy->getId()], $policy)) {
46+
$this->added[$policy->getId()] = $this->merger->merge($this->added[$policy->getId()], $policy);
47+
} else {
48+
throw new \RuntimeException('Cannot merge a policy of ' .get_class($policy));
49+
}
50+
} else {
51+
$this->added[$policy->getId()] = $policy;
52+
}
3253
}
3354

3455
/**
3556
* @inheritDoc
3657
*/
3758
public function collect(array $defaultPolicies = []): array
3859
{
39-
return array_merge($defaultPolicies, $this->added);
60+
return array_merge($defaultPolicies, array_values($this->added));
4061
}
4162
}

app/code/Magento/Csp/etc/di.xml

Lines changed: 13 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,17 @@
1515
</arguments>
1616
</type>
1717
<preference for="Magento\Csp\Api\PolicyCollectorInterface" type="Magento\Csp\Model\CompositePolicyCollector" />
18+
<preference for="Magento\Csp\Model\Collector\MergerInterface" type="Magento\Csp\Model\Collector\CompositeMerger" />
19+
<type name="Magento\Csp\Model\Collector\CompositeMerger">
20+
<arguments>
21+
<argument name="mergers" xsi:type="array">
22+
<item name="fetch" xsi:type="object">Magento\Csp\Model\Collector\FetchPolicyMerger</item>
23+
<item name="flag" xsi:type="object">Magento\Csp\Model\Collector\FlagPolicyMerger</item>
24+
<item name="plugins" xsi:type="object">Magento\Csp\Model\Collector\PluginTypesPolicyMerger</item>
25+
<item name="sandbox" xsi:type="object">Magento\Csp\Model\Collector\SandboxPolicyMerger</item>
26+
</argument>
27+
</arguments>
28+
</type>
1829
<type name="Magento\Csp\Model\CompositePolicyCollector">
1930
<arguments>
2031
<argument name="collectors" xsi:type="array">
@@ -24,10 +35,7 @@
2435
<item name="dynamic" xsi:type="object" sortOrder="3">Magento\Csp\Model\Collector\DynamicCollector\Proxy</item>
2536
</argument>
2637
<argument name="mergers" xsi:type="array">
27-
<item name="fetch" xsi:type="object">Magento\Csp\Model\Collector\FetchPolicyMerger</item>
28-
<item name="flag" xsi:type="object">Magento\Csp\Model\Collector\FlagPolicyMerger</item>
29-
<item name="plugins" xsi:type="object">Magento\Csp\Model\Collector\PluginTypesPolicyMerger</item>
30-
<item name="sandbox" xsi:type="object">Magento\Csp\Model\Collector\SandboxPolicyMerger</item>
38+
<item name="composite" xsi:type="object">Magento\Csp\Model\Collector\MergerInterface</item>
3139
</argument>
3240
</arguments>
3341
</type>
@@ -93,6 +101,7 @@
93101
<type name="Magento\Csp\Model\BlockCache">
94102
<arguments>
95103
<argument name="cache" xsi:type="object">configured_block_cache</argument>
104+
<argument name="serializer" xsi:type="object">Magento\Framework\Serialize\Serializer\Serialize</argument>
96105
</arguments>
97106
</type>
98107
<type name="Magento\Framework\View\Element\Context">

0 commit comments

Comments
 (0)