Skip to content

Commit b28144a

Browse files
Merge pull request #9970 from magento-cia/AC-15165-updated
Ac 15165 updated
2 parents c484579 + 6f28bce commit b28144a

File tree

7 files changed

+273
-19
lines changed

7 files changed

+273
-19
lines changed

app/code/Magento/Csp/Model/Deploy/Package/Processor/PostProcessor/Integrity.php

Lines changed: 39 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
<?php
22
/**
3-
* Copyright © Magento, Inc. All rights reserved.
4-
* See COPYING.txt for license details.
3+
* Copyright 2025 Adobe
4+
* All Rights Reserved.
55
*/
66
declare(strict_types=1);
77

@@ -12,8 +12,11 @@
1212
use Magento\Csp\Model\SubresourceIntegrityFactory;
1313
use Magento\Framework\App\Filesystem\DirectoryList;
1414
use Magento\Csp\Model\SubresourceIntegrityCollector;
15+
use Magento\Csp\Model\SubresourceIntegrityRepositoryPool;
1516
use Magento\Deploy\Package\Processor\ProcessorInterface;
1617
use Magento\Csp\Model\SubresourceIntegrity\HashGenerator;
18+
use Magento\Framework\App\ObjectManager;
19+
use Psr\Log\LoggerInterface;
1720

1821
/**
1922
* Post-processor that generates integrity hashes after static content package deployed.
@@ -40,22 +43,39 @@ class Integrity implements ProcessorInterface
4043
*/
4144
private SubresourceIntegrityCollector $integrityCollector;
4245

46+
/**
47+
* @var SubresourceIntegrityRepositoryPool
48+
*/
49+
private SubresourceIntegrityRepositoryPool $repositoryPool;
50+
51+
/**
52+
* @var LoggerInterface
53+
*/
54+
private LoggerInterface $logger;
55+
4356
/**
4457
* @param Filesystem $filesystem
4558
* @param HashGenerator $hashGenerator
4659
* @param SubresourceIntegrityFactory $integrityFactory
4760
* @param SubresourceIntegrityCollector $integrityCollector
61+
* @param LoggerInterface|null $logger
62+
* @param SubresourceIntegrityRepositoryPool|null $repositoryPool
4863
*/
4964
public function __construct(
5065
Filesystem $filesystem,
5166
HashGenerator $hashGenerator,
5267
SubresourceIntegrityFactory $integrityFactory,
53-
SubresourceIntegrityCollector $integrityCollector
68+
SubresourceIntegrityCollector $integrityCollector,
69+
?LoggerInterface $logger = null,
70+
?SubresourceIntegrityRepositoryPool $repositoryPool = null
5471
) {
5572
$this->filesystem = $filesystem;
5673
$this->hashGenerator = $hashGenerator;
5774
$this->integrityFactory = $integrityFactory;
5875
$this->integrityCollector = $integrityCollector;
76+
$this->logger = $logger ?? ObjectManager::getInstance()->get(LoggerInterface::class);
77+
$this->repositoryPool = $repositoryPool ??
78+
ObjectManager::getInstance()->get(SubresourceIntegrityRepositoryPool::class);
5979
}
6080

6181
/**
@@ -68,7 +88,7 @@ public function process(Package $package, array $options): bool
6888
);
6989

7090
foreach ($package->getFiles() as $file) {
71-
if ($file->getExtension() == "js") {
91+
if (strtolower($file->getExtension()) === "js") {
7292
$integrity = $this->integrityFactory->create(
7393
[
7494
"data" => [
@@ -84,6 +104,21 @@ public function process(Package $package, array $options): bool
84104
}
85105
}
86106

107+
// Save collected data directly to repository before process exits
108+
$collectedData = $this->integrityCollector->release();
109+
if (!empty($collectedData)) {
110+
$area = explode('/', $package->getPath())[0];
111+
try {
112+
$this->repositoryPool->get($area)->saveBunch($collectedData);
113+
} catch (\Exception $e) {
114+
//phpcs:ignore
115+
$this->logger->error('Integrity PostProcessor: Failed saving to ' . $area . ' repository: ' . $e->getMessage());
116+
}
117+
118+
// Clear collector for next package (if any)
119+
$this->integrityCollector->clear();
120+
}
121+
87122
return true;
88123
}
89124
}

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

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
<?php
22
/**
3-
* Copyright © Magento, Inc. All rights reserved.
4-
* See COPYING.txt for license details.
3+
* Copyright 2025 Adobe
4+
* All Rights Reserved.
55
*/
66
declare(strict_types=1);
77

@@ -46,4 +46,14 @@ public function release(): array
4646
{
4747
return $this->data;
4848
}
49+
50+
/**
51+
* Clear all collected data.
52+
*
53+
* @return void
54+
*/
55+
public function clear(): void
56+
{
57+
$this->data = [];
58+
}
4959
}

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

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,7 @@ public function __construct(
5555
SubresourceIntegrityFactory $integrityFactory,
5656
SubresourceIntegrityCollector $integrityCollector,
5757
Filesystem $filesystem,
58-
File $fileIo,
58+
File $fileIo
5959
) {
6060
$this->hashGenerator = $hashGenerator;
6161
$this->integrityFactory = $integrityFactory;
@@ -83,15 +83,18 @@ public function afterDeploy(Bundle $subject, ?string $result, string $area, stri
8383
$files = $pubStaticDir->search(
8484
$area ."/" . $theme . "/" . $locale . "/" . Bundle::BUNDLE_JS_DIR . "/*.js"
8585
);
86+
8687
foreach ($files as $file) {
88+
$bundlePath = $area . '/' . $theme . '/' . $locale .
89+
"/" . Bundle::BUNDLE_JS_DIR . '/' . $this->fileIo->getPathInfo($file)['basename'];
90+
8791
$integrity = $this->integrityFactory->create(
8892
[
8993
"data" => [
9094
'hash' => $this->hashGenerator->generate(
9195
$pubStaticDir->readFile($file)
9296
),
93-
'path' => $area . '/' . $theme . '/' . $locale .
94-
"/" . Bundle::BUNDLE_JS_DIR . '/' . $this->fileIo->getPathInfo($file)['basename']
97+
'path' => $bundlePath
9598
]
9699
]
97100
);

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

Lines changed: 16 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
<?php
22
/**
3-
* Copyright © Magento, Inc. All rights reserved.
4-
* See COPYING.txt for license details.
3+
* Copyright 2025 Adobe
4+
* All Rights Reserved.
55
*/
66
declare(strict_types=1);
77

@@ -12,6 +12,7 @@
1212
use Magento\Deploy\Console\DeployStaticOptions;
1313
use Magento\Deploy\Service\DeployStaticContent;
1414
use Magento\Csp\Model\SubresourceIntegrityRepositoryPool;
15+
use Magento\Csp\Model\SubresourceIntegrityCollector;
1516

1617
/**
1718
* Plugin that removes existing integrity hashes for all assets.
@@ -23,13 +24,21 @@ class RemoveAllAssetIntegrityHashes
2324
*/
2425
private SubresourceIntegrityRepositoryPool $integrityRepositoryPool;
2526

27+
/**
28+
* @var SubresourceIntegrityCollector
29+
*/
30+
private SubresourceIntegrityCollector $integrityCollector;
31+
2632
/**
2733
* @param SubresourceIntegrityRepositoryPool $integrityRepositoryPool
34+
* @param SubresourceIntegrityCollector $integrityCollector
2835
*/
2936
public function __construct(
30-
SubresourceIntegrityRepositoryPool $integrityRepositoryPool
37+
SubresourceIntegrityRepositoryPool $integrityRepositoryPool,
38+
SubresourceIntegrityCollector $integrityCollector
3139
) {
3240
$this->integrityRepositoryPool = $integrityRepositoryPool;
41+
$this->integrityCollector = $integrityCollector;
3342
}
3443

3544
/**
@@ -47,10 +56,14 @@ public function beforeDeploy(
4756
array $options
4857
): void {
4958
if (PHP_SAPI == 'cli' && !$this->isRefreshContentVersionOnly($options)) {
59+
// Clear stored integrity hashes from all areas
5060
foreach ([Package::BASE_AREA, Area::AREA_FRONTEND, Area::AREA_ADMINHTML] as $area) {
5161
$this->integrityRepositoryPool->get($area)
5262
->deleteAll();
5363
}
64+
65+
// Clear any leftover in-memory integrity hashes from previous runs
66+
$this->integrityCollector->clear();
5467
}
5568
}
5669

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

Lines changed: 21 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
<?php
22
/**
3-
* Copyright © Magento, Inc. All rights reserved.
4-
* See COPYING.txt for license details.
3+
* Copyright 2025 Adobe
4+
* All Rights Reserved.
55
*/
66
declare(strict_types=1);
77

@@ -10,6 +10,8 @@
1010
use Magento\Deploy\Service\DeployStaticContent;
1111
use Magento\Csp\Model\SubresourceIntegrityCollector;
1212
use Magento\Csp\Model\SubresourceIntegrityRepositoryPool;
13+
use Psr\Log\LoggerInterface;
14+
use Magento\Framework\App\ObjectManager;
1315

1416
/**
1517
* Plugin that stores generated integrity hashes for all assets.
@@ -26,16 +28,25 @@ class StoreAssetIntegrityHashes
2628
*/
2729
private SubresourceIntegrityRepositoryPool $integrityRepositoryPool;
2830

31+
/**
32+
* @var LoggerInterface
33+
*/
34+
private LoggerInterface $logger;
35+
2936
/**
3037
* @param SubresourceIntegrityCollector $integrityCollector
3138
* @param SubresourceIntegrityRepositoryPool $integrityRepositoryPool
39+
* @param LoggerInterface|null $logger
3240
*/
3341
public function __construct(
3442
SubresourceIntegrityCollector $integrityCollector,
35-
SubresourceIntegrityRepositoryPool $integrityRepositoryPool
43+
SubresourceIntegrityRepositoryPool $integrityRepositoryPool,
44+
?LoggerInterface $logger = null
3645
) {
3746
$this->integrityCollector = $integrityCollector;
3847
$this->integrityRepositoryPool = $integrityRepositoryPool;
48+
$this->logger = $logger ??
49+
ObjectManager::getInstance()->get(LoggerInterface::class);
3950
}
4051

4152
/**
@@ -55,16 +66,19 @@ public function afterDeploy(
5566
array $options
5667
): void {
5768
$bunches = [];
69+
$integrityHashes = $this->integrityCollector->release();
5870

59-
foreach ($this->integrityCollector->release() as $integrity) {
71+
foreach ($integrityHashes as $integrity) {
6072
$area = explode("/", $integrity->getPath())[0];
61-
6273
$bunches[$area][] = $integrity;
6374
}
6475

6576
foreach ($bunches as $area => $bunch) {
66-
$this->integrityRepositoryPool->get($area)
67-
->saveBunch($bunch);
77+
try {
78+
$this->integrityRepositoryPool->get($area)->saveBunch($bunch);
79+
} catch (\Exception $e) {
80+
$this->logger->error('SRI Store: Failed saving ' . $area . ': ' . $e->getMessage());
81+
}
6882
}
6983
}
7084
}

0 commit comments

Comments
 (0)