Skip to content

Commit 06a9aa5

Browse files
AC-10686: [PCI] SRI enabled on payment pages
1 parent 944b54b commit 06a9aa5

File tree

3 files changed

+108
-55
lines changed

3 files changed

+108
-55
lines changed
Lines changed: 89 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,89 @@
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\Deploy\Package\Processor\PostProcessor;
9+
10+
use Magento\Framework\Filesystem;
11+
use Magento\Deploy\Package\Package;
12+
use Magento\Csp\Model\SubresourceIntegrityFactory;
13+
use Magento\Framework\App\Filesystem\DirectoryList;
14+
use Magento\Csp\Model\SubresourceIntegrityCollector;
15+
use Magento\Deploy\Package\Processor\ProcessorInterface;
16+
use Magento\Csp\Model\SubresourceIntegrity\HashGenerator;
17+
18+
/**
19+
* Post-processor that generates integrity hashes after static content package deployed.
20+
*/
21+
class Integrity implements ProcessorInterface
22+
{
23+
/**
24+
* @var Filesystem
25+
*/
26+
private Filesystem $filesystem;
27+
28+
/**
29+
* @var HashGenerator
30+
*/
31+
private HashGenerator $hashGenerator;
32+
33+
/**
34+
* @var SubresourceIntegrityFactory
35+
*/
36+
private SubresourceIntegrityFactory $integrityFactory;
37+
38+
/**
39+
* @var SubresourceIntegrityCollector
40+
*/
41+
private SubresourceIntegrityCollector $integrityCollector;
42+
43+
/**
44+
* @param Filesystem $filesystem
45+
* @param HashGenerator $hashGenerator
46+
* @param SubresourceIntegrityFactory $integrityFactory
47+
* @param SubresourceIntegrityCollector $integrityCollector
48+
*/
49+
public function __construct(
50+
Filesystem $filesystem,
51+
HashGenerator $hashGenerator,
52+
SubresourceIntegrityFactory $integrityFactory,
53+
SubresourceIntegrityCollector $integrityCollector
54+
) {
55+
$this->filesystem = $filesystem;
56+
$this->hashGenerator = $hashGenerator;
57+
$this->integrityFactory = $integrityFactory;
58+
$this->integrityCollector = $integrityCollector;
59+
}
60+
61+
/**
62+
* @inheritdoc
63+
*/
64+
public function process(Package $package, array $options): bool
65+
{
66+
$staticDir = $this->filesystem->getDirectoryRead(
67+
DirectoryList::STATIC_VIEW
68+
);
69+
70+
foreach ($package->getFiles() as $file) {
71+
if ($file->getExtension() == "js") {
72+
$integrity = $this->integrityFactory->create(
73+
[
74+
"data" => [
75+
'hash' => $this->hashGenerator->generate(
76+
$staticDir->readFile($file->getDeployedFilePath())
77+
),
78+
'path' => $file->getDeployedFilePath()
79+
]
80+
]
81+
);
82+
83+
$this->integrityCollector->collect($integrity);
84+
}
85+
}
86+
87+
return true;
88+
}
89+
}

app/code/Magento/Csp/Plugin/GenerateAssetIntegrity.php

Lines changed: 12 additions & 52 deletions
Original file line numberDiff line numberDiff line change
@@ -9,9 +9,6 @@
99

1010
use Magento\Framework\View\Asset\File;
1111
use Magento\RequireJs\Model\FileManager;
12-
use Magento\Framework\App\View\Asset\Publisher;
13-
use Magento\Framework\View\Asset\LocalInterface;
14-
use Magento\Framework\View\Asset\AssetInterface;
1512
use Magento\Csp\Model\SubresourceIntegrityFactory;
1613
use Magento\Csp\Model\SubresourceIntegrityCollector;
1714
use Magento\Csp\Model\SubresourceIntegrity\HashGenerator;
@@ -58,31 +55,6 @@ public function __construct(
5855
$this->integrityCollector = $integrityCollector;
5956
}
6057

61-
/**
62-
* Generates integrity after publishing of static assets is complete.
63-
*
64-
* @param Publisher $subject
65-
* @param bool $result
66-
* @param AssetInterface $asset
67-
*
68-
* @return bool
69-
*
70-
* @SuppressWarnings(PHPMD.UnusedFormalParameter)
71-
*/
72-
public function afterPublish(
73-
Publisher $subject,
74-
bool $result,
75-
AssetInterface $asset
76-
): bool {
77-
if (PHP_SAPI == 'cli' && $asset instanceof LocalInterface) {
78-
if (in_array($asset->getContentType(), self::CONTENT_TYPES)) {
79-
$this->generateIntegrity($asset);
80-
}
81-
}
82-
83-
return $result;
84-
}
85-
8658
/**
8759
* Generates integrity for RequireJs config.
8860
*
@@ -99,33 +71,21 @@ public function afterCreateRequireJsConfigAsset(
9971
): File {
10072
if (PHP_SAPI == 'cli') {
10173
if (in_array($result->getContentType(), self::CONTENT_TYPES)) {
102-
$this->generateIntegrity($result);
74+
$integrity = $this->integrityFactory->create(
75+
[
76+
"data" => [
77+
'hash' => $this->hashGenerator->generate(
78+
$result->getContent()
79+
),
80+
'path' => $result->getPath()
81+
]
82+
]
83+
);
84+
85+
$this->integrityCollector->collect($integrity);
10386
}
10487
}
10588

10689
return $result;
10790
}
108-
109-
/**
110-
* Generates and stores integrity for a given asset.
111-
*
112-
* @param LocalInterface $asset
113-
*
114-
* @return void
115-
*/
116-
private function generateIntegrity(LocalInterface $asset): void
117-
{
118-
$integrity = $this->integrityFactory->create(
119-
[
120-
"data" => [
121-
'hash' => $this->hashGenerator->generate(
122-
$asset->getContent()
123-
),
124-
'path' => $asset->getPath()
125-
]
126-
]
127-
);
128-
129-
$this->integrityCollector->collect($integrity);
130-
}
13191
}

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

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -111,15 +111,19 @@
111111
<argument name="cache" xsi:type="object">Magento\Csp\Model\BlockCache</argument>
112112
</arguments>
113113
</type>
114+
<type name="Magento\Deploy\Package\Package">
115+
<arguments>
116+
<argument name="postProcessors" xsi:type="array">
117+
<item name="integrity" xsi:type="object">Magento\Csp\Model\Deploy\Package\Processor\PostProcessor\Integrity</item>
118+
</argument>
119+
</arguments>
120+
</type>
114121
<type name="Magento\Framework\View\Asset\GroupedCollection">
115122
<plugin name="addDefaultPropertiesToGroup" type="Magento\Csp\Plugin\AddDefaultPropertiesToGroupPlugin" />
116123
</type>
117124
<type name="Magento\Deploy\Service\DeployStaticContent">
118125
<plugin name="removeAllAssetIntegrityHashes" type="Magento\Csp\Plugin\RemoveAllAssetIntegrityHashes" />
119126
</type>
120-
<type name="Magento\Framework\App\View\Asset\Publisher">
121-
<plugin name="addResourceIntegrityAfterAssetPublish" type="Magento\Csp\Plugin\GenerateAssetIntegrity"/>
122-
</type>
123127
<type name="Magento\RequireJs\Model\FileManager">
124128
<plugin name="addResourceIntegrityAfterAssetCreate" type="Magento\Csp\Plugin\GenerateAssetIntegrity"/>
125129
</type>

0 commit comments

Comments
 (0)