Skip to content

Commit 8305958

Browse files
committed
Added the import and export functionality for the rtisk sources.
1 parent 04de290 commit 8305958

5 files changed

Lines changed: 125 additions & 0 deletions

File tree

config/module.config.php

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1623,6 +1623,7 @@
16231623
/* Import services. */
16241624
Import\Service\ObjectImportService::class => AutowireFactory::class,
16251625
Import\Service\InstanceImportService::class => AutowireFactory::class,
1626+
Import\Processor\RiskSourceImportProcessor::class => AutowireFactory::class,
16261627

16271628
// Helpers
16281629
Import\Helper\ImportCacheHelper::class => AutowireFactory::class,

src/Export/Service/AnrExportService.php

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@ public function __construct(
3434
private Table\AssetTable $assetTable,
3535
private Table\ThreatTable $threatTable,
3636
private Table\VulnerabilityTable $vulnerabilityTable,
37+
private Table\RiskSourceTable $riskSourceTable,
3738
private Table\AmvTable $amvTable,
3839
private Table\RolfTagTable $rolfTagTable,
3940
private Table\RolfRiskTable $rolfRiskTable,
@@ -155,6 +156,7 @@ private function prepareKnowledgeBaseData(
155156
'assets' => [],
156157
'threats' => [],
157158
'vulnerabilities' => [],
159+
'riskSources' => [],
158160
'referentials' => $this->prepareReferentialsData($anr),
159161
'informationRisks' => [],
160162
'rolfTags' => [],
@@ -167,6 +169,7 @@ private function prepareKnowledgeBaseData(
167169
'assets' => $this->prepareAssetsData($anr),
168170
'threats' => $this->prepareThreatsData($anr, $withEval),
169171
'vulnerabilities' => $this->prepareVulnerabilitiesData($anr),
172+
'riskSources' => $this->prepareRiskSourcesData($anr),
170173
'referentials' => $this->prepareReferentialsData($anr),
171174
'informationRisks' => $this->prepareInformationRisksData($anr, $withEval, $withControls),
172175
'rolfTags' => $this->prepareRolfTagsData($anr),
@@ -211,6 +214,22 @@ private function prepareVulnerabilitiesData(Entity\Anr $anr): array
211214
return $result;
212215
}
213216

217+
private function prepareRiskSourcesData(Entity\Anr $anr): array
218+
{
219+
$result = [];
220+
/** @var Entity\RiskSource $riskSource */
221+
foreach ($this->riskSourceTable->findByAnr($anr) as $riskSource) {
222+
$result[] = [
223+
'id' => $riskSource->getId(),
224+
'label' => $riskSource->getLabel(),
225+
'isDefault' => $riskSource->isDefault(),
226+
'isActive' => $riskSource->isActive(),
227+
];
228+
}
229+
230+
return $result;
231+
}
232+
214233
private function prepareInformationRisksData(Entity\Anr $anr, bool $withEval, bool $withControls): array
215234
{
216235
$result = [];

src/Import/Processor/InstanceRiskImportProcessor.php

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ public function __construct(
2626
private AnrInstanceRiskService $anrInstanceRiskService,
2727
private InformationRiskImportProcessor $informationRiskImportProcessor,
2828
private RecommendationImportProcessor $recommendationImportProcessor,
29+
private RiskSourceImportProcessor $riskSourceImportProcessor,
2930
private ThreatImportProcessor $threatImportProcessor,
3031
private VulnerabilityImportProcessor $vulnerabilityImportProcessor,
3132
private ImportCacheHelper $importCacheHelper,
@@ -70,6 +71,12 @@ private function processInstanceRiskData(Entity\Instance $instance, array $insta
7071
$instanceRisk = $this->anrInstanceRiskService
7172
->createInstanceRisk($instance, $amv, null, $threat, $vulnerability);
7273

74+
if (!empty($instanceRiskData['riskSource'])) {
75+
$instanceRisk->setRiskSource(
76+
$this->riskSourceImportProcessor->processRiskSourceData($anr, $instanceRiskData['riskSource'])
77+
);
78+
}
79+
7380
foreach ($instanceRiskData['recommendations'] as $recommendationData) {
7481
$recommendationSet = $this->recommendationImportProcessor
7582
->processRecommendationSetData($anr, $recommendationData['recommendationSet']);
Lines changed: 96 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,96 @@
1+
<?php declare(strict_types=1);
2+
/**
3+
* @link https://github.com/monarc-project for the canonical source repository
4+
* @copyright Copyright (c) 2016-2026 Luxembourg House of Cybersecurity LHC.lu - Licensed under GNU Affero GPL v3
5+
* @license MONARC is licensed under GNU Affero General Public License version 3
6+
*/
7+
8+
namespace Monarc\FrontOffice\Import\Processor;
9+
10+
use Monarc\Core\Service\ConnectedUserService;
11+
use Monarc\FrontOffice\Entity;
12+
use Monarc\FrontOffice\Import\Helper\ImportCacheHelper;
13+
use Monarc\FrontOffice\Table\RiskSourceTable;
14+
15+
class RiskSourceImportProcessor
16+
{
17+
private Entity\User $connectedUser;
18+
19+
public function __construct(
20+
private RiskSourceTable $riskSourceTable,
21+
private ImportCacheHelper $importCacheHelper,
22+
ConnectedUserService $connectedUserService
23+
) {
24+
/** @var Entity\User $connectedUser */
25+
$connectedUser = $connectedUserService->getConnectedUser();
26+
$this->connectedUser = $connectedUser;
27+
}
28+
29+
public function processRiskSourcesData(Entity\Anr $anr, array $riskSourcesData): void
30+
{
31+
foreach ($riskSourcesData as $riskSourceData) {
32+
$this->processRiskSourceData($anr, $riskSourceData);
33+
}
34+
}
35+
36+
public function processRiskSourceData(Entity\Anr $anr, ?array $riskSourceData): ?Entity\RiskSource
37+
{
38+
$label = trim((string)($riskSourceData['label'] ?? ''));
39+
if ($label === '') {
40+
return null;
41+
}
42+
43+
$normalizedLabel = mb_strtolower($label);
44+
$riskSource = $this->getRiskSourceFromCache($anr, $normalizedLabel);
45+
if ($riskSource === null) {
46+
$riskSource = (new Entity\RiskSource())
47+
->setAnr($anr)
48+
->setLabel($label)
49+
->setIsDefault((bool)($riskSourceData['isDefault'] ?? false))
50+
->setIsActive((bool)($riskSourceData['isActive'] ?? true))
51+
->setCreator($this->connectedUser->getEmail());
52+
53+
$this->riskSourceTable->save($riskSource, false);
54+
$this->importCacheHelper->addItemToArrayCache('risk_sources_by_label', $riskSource, $normalizedLabel);
55+
56+
return $riskSource;
57+
}
58+
59+
$isUpdated = false;
60+
if (array_key_exists('isDefault', $riskSourceData)
61+
&& $riskSource->isDefault() !== (bool)$riskSourceData['isDefault']
62+
) {
63+
$riskSource->setIsDefault((bool)$riskSourceData['isDefault']);
64+
$isUpdated = true;
65+
}
66+
if (array_key_exists('isActive', $riskSourceData)
67+
&& $riskSource->isActive() !== (bool)$riskSourceData['isActive']
68+
) {
69+
$riskSource->setIsActive((bool)$riskSourceData['isActive']);
70+
$isUpdated = true;
71+
}
72+
73+
if ($isUpdated) {
74+
$this->riskSourceTable->save($riskSource, false);
75+
}
76+
77+
return $riskSource;
78+
}
79+
80+
private function getRiskSourceFromCache(Entity\Anr $anr, string $normalizedLabel): ?Entity\RiskSource
81+
{
82+
if (!$this->importCacheHelper->isCacheKeySet('is_risk_sources_cache_loaded')) {
83+
$this->importCacheHelper->setArrayCacheValue('is_risk_sources_cache_loaded', true);
84+
/** @var Entity\RiskSource $riskSource */
85+
foreach ($this->riskSourceTable->findByAnr($anr) as $riskSource) {
86+
$this->importCacheHelper->addItemToArrayCache(
87+
'risk_sources_by_label',
88+
$riskSource,
89+
mb_strtolower($riskSource->getLabel())
90+
);
91+
}
92+
}
93+
94+
return $this->importCacheHelper->getItemFromArrayCache('risk_sources_by_label', $normalizedLabel);
95+
}
96+
}

src/Import/Service/InstanceImportService.php

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@ public function __construct(
3232
private Processor\AssetImportProcessor $assetImportProcessor,
3333
private Processor\ThreatImportProcessor $threatImportProcessor,
3434
private Processor\VulnerabilityImportProcessor $vulnerabilityImportProcessor,
35+
private Processor\RiskSourceImportProcessor $riskSourceImportProcessor,
3536
private Processor\ReferentialImportProcessor $referentialImportProcessor,
3637
private Processor\InformationRiskImportProcessor $informationRiskImportProcessor,
3738
private Processor\RolfTagImportProcessor $rolfTagImportProcessor,
@@ -216,6 +217,7 @@ private function processKnowledgeBaseData(Entity\Anr $anr, array $knowledgeBaseD
216217
$this->assetImportProcessor->processAssetsData($anr, $knowledgeBaseData['assets']);
217218
$this->threatImportProcessor->processThreatsData($anr, $knowledgeBaseData['threats']);
218219
$this->vulnerabilityImportProcessor->processVulnerabilitiesData($anr, $knowledgeBaseData['vulnerabilities']);
220+
$this->riskSourceImportProcessor->processRiskSourcesData($anr, $knowledgeBaseData['riskSources'] ?? []);
219221
$this->referentialImportProcessor->processReferentialsData($anr, $knowledgeBaseData['referentials']);
220222
$this->informationRiskImportProcessor->processInformationRisksData(
221223
$anr,

0 commit comments

Comments
 (0)