Skip to content

Commit e96a3e5

Browse files
author
Ruslan Baidan
committed
Fixed the import error of the codes duplication.
1 parent c2cb485 commit e96a3e5

File tree

5 files changed

+255
-192
lines changed

5 files changed

+255
-192
lines changed

src/Model/Table/AssetTable.php

+12
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,18 @@ public function findByAnrAndUuid(Anr $anr, string $uuid): ?Asset
3737
->getOneOrNullResult();
3838
}
3939

40+
public function findByAnrAndCode(Anr $anr, string $code): ?Asset
41+
{
42+
return $this->getRepository()->createQueryBuilder('a')
43+
->where('a.anr = :anr')
44+
->andWhere('a.code = :code')
45+
->setParameter('anr', $anr)
46+
->setParameter('code', $code)
47+
->setMaxResults(1)
48+
->getQuery()
49+
->getOneOrNullResult();
50+
}
51+
4052
public function saveEntity(Asset $asset, bool $flushAll = true): void
4153
{
4254
$em = $this->getDb()->getEntityManager();

src/Model/Table/ThreatTable.php

+5-5
Original file line numberDiff line numberDiff line change
@@ -54,14 +54,14 @@ public function findByAnr(Anr $anr)
5454
->getResult();
5555
}
5656

57-
public function findUuidsByAnr(Anr $anr): array
57+
public function findUuidsAndCodesByAnr(Anr $anr): array
5858
{
59-
$result = $this->getDb()->getEntityManager()
60-
->createQuery('SELECT t.uuid FROM ' . Threat::class . ' t WHERE t.anr = :anr')
59+
return $this->getRepository()->createQueryBuilder('t')
60+
->select('t.uuid, t.code')
61+
->where('t.anr = :anr')
6162
->setParameter('anr', $anr)
63+
->getQuery()
6264
->getScalarResult();
63-
64-
return array_column($result, 'uuid');
6565
}
6666

6767
/**

src/Model/Table/VulnerabilityTable.php

+5-5
Original file line numberDiff line numberDiff line change
@@ -51,14 +51,14 @@ public function findByAnrAndUuid(AnrSuperClass $anr, string $uuid): Vulnerabilit
5151
return $vulnerability;
5252
}
5353

54-
public function findUuidsByAnr(Anr $anr): array
54+
public function findUuidsAndCodesByAnr(Anr $anr): array
5555
{
56-
$result = $this->getDb()->getEntityManager()
57-
->createQuery('SELECT v.uuid FROM ' . Vulnerability::class . ' v WHERE v.anr = :anr')
56+
return $this->getRepository()->createQueryBuilder('v')
57+
->select('v.uuid, v.code')
58+
->where('v.anr = :anr')
5859
->setParameter('anr', $anr)
60+
->getQuery()
5961
->getScalarResult();
60-
61-
return array_column($result, 'uuid');
6262
}
6363

6464
/**

src/Service/AssetImportService.php

+110-52
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,9 @@
44

55
use Doctrine\ORM\EntityNotFoundException;
66
use Monarc\Core\Exception\Exception;
7+
use Monarc\Core\Model\Entity\AnrSuperClass;
8+
use Monarc\Core\Model\Entity\UserSuperClass;
9+
use Monarc\Core\Service\ConnectedUserService;
710
use Monarc\FrontOffice\Model\Entity\Amv;
811
use Monarc\FrontOffice\Model\Entity\Anr;
912
use Monarc\FrontOffice\Model\Entity\Asset;
@@ -64,6 +67,8 @@ class AssetImportService
6467
/** @var SoaCategoryTable */
6568
private $soaCategoryTable;
6669

70+
private UserSuperClass $connectedUser;
71+
6772
public function __construct(
6873
AssetTable $assetTable,
6974
ThemeTable $themeTable,
@@ -75,7 +80,8 @@ public function __construct(
7580
InstanceTable $instanceTable,
7681
InstanceRiskTable $instanceRiskTable,
7782
ReferentialTable $referentialTable,
78-
SoaCategoryTable $soaCategoryTable
83+
SoaCategoryTable $soaCategoryTable,
84+
ConnectedUserService $connectedUserService
7985
) {
8086
$this->assetTable = $assetTable;
8187
$this->themeTable = $themeTable;
@@ -88,6 +94,7 @@ public function __construct(
8894
$this->instanceRiskTable = $instanceRiskTable;
8995
$this->referentialTable = $referentialTable;
9096
$this->soaCategoryTable = $soaCategoryTable;
97+
$this->connectedUser = $connectedUserService->getConnectedUser();
9198
}
9299

93100
public function importFromArray($monarcVersion, array $data, Anr $anr): ?Asset
@@ -98,12 +105,16 @@ public function importFromArray($monarcVersion, array $data, Anr $anr): ?Asset
98105

99106
if (version_compare($monarcVersion, '2.8.2') < 0) {
100107
throw new Exception('Import of files exported from MONARC v2.8.1 or lower are not supported.'
101-
. ' Please contact us for more details.'
102-
);
108+
. ' Please contact us for more details.');
103109
}
104110

105111
$asset = $this->assetTable->findByAnrAndUuid($anr, $data['asset']['uuid']);
106112
if ($asset === null) {
113+
$asset = $this->assetTable->findByAnrAndCode($anr, $data['asset']['code']);
114+
115+
/* The code should be unique. */
116+
$assetCode = $asset === null ? $data['asset']['code'] : $asset->getCode() . '-' . time();
117+
107118
$asset = (new Asset())
108119
->setUuid($data['asset']['uuid'])
109120
->setAnr($anr)
@@ -112,7 +123,7 @@ public function importFromArray($monarcVersion, array $data, Anr $anr): ?Asset
112123
->setStatus($data['asset']['status'] ?? 1)
113124
->setMode($data['asset']['mode'] ?? 0)
114125
->setType($data['asset']['type'])
115-
->setCode($data['asset']['code']);
126+
->setCode($assetCode);
116127

117128
$this->assetTable->saveEntity($asset);
118129
}
@@ -122,6 +133,8 @@ public function importFromArray($monarcVersion, array $data, Anr $anr): ?Asset
122133
}
123134

124135
$languageIndex = $anr->getLanguage();
136+
$labelKey = 'label' . $languageIndex;
137+
125138
$localThemes = [];
126139
$themes = $this->themeTable->findByAnr($anr);
127140
foreach ($themes as $theme) {
@@ -131,70 +144,102 @@ public function importFromArray($monarcVersion, array $data, Anr $anr): ?Asset
131144
/*
132145
* Threats
133146
*/
134-
foreach ($data['threats'] as $threatUuid => $valueThreat) {
135-
try {
147+
$threatsUuidsAndCodes = $this->threatTable->findUuidsAndCodesByAnr($anr);
148+
$threatsUuids = array_column($threatsUuidsAndCodes, 'uuid');
149+
$threatsCodes = array_column($threatsUuidsAndCodes, 'code');
150+
foreach ($data['threats'] as $threatUuid => $threatData) {
151+
if (isset($this->cachedData['threats'][$threatData['uuid']])) {
152+
continue;
153+
}
154+
155+
if (\in_array((string)$threatData['uuid'], $threatsUuids, true)) {
136156
$threat = $this->threatTable->findByAnrAndUuid($anr, $threatUuid);
137157
$this->cachedData['threats'][$threat->getUuid()] = $threat;
138-
} catch (EntityNotFoundException $exception) {
158+
159+
/* Validate Theme. */
160+
$currentTheme = $threat->getTheme();
161+
if (!empty($threatData['theme'])
162+
&& ($currentTheme === null
163+
|| $currentTheme->getLabel($languageIndex) !== $data['themes'][$threatData['theme']][$labelKey]
164+
)
165+
) {
166+
if (isset($localThemes[$data['themes'][$threatData['theme']][$labelKey]])) {
167+
$theme = $localThemes[$data['themes'][$threatData['theme']][$labelKey]];
168+
} else {
169+
$theme = $this->getCreatedTheme($anr, $data['themes'][$threatData['theme']]);
170+
}
171+
172+
$threat->setTheme($theme);
173+
$this->threatTable->saveEntity($threat, false);
174+
}
175+
} else {
139176
$theme = null;
140-
if (isset($localThemes[$data['themes'][$valueThreat['theme']]['label' . $languageIndex]])) { //theme exists
141-
$theme = $localThemes[$data['themes'][$valueThreat['theme']]['label' . $languageIndex]];
142-
} elseif (isset($data['themes'][$valueThreat['theme']])) {
143-
$theme = new Theme();
144-
$theme->setLanguage($languageIndex);
145-
$theme->exchangeArray($data['themes'][$valueThreat['theme']]);
146-
$theme->setAnr($anr);
147-
$this->themeTable->saveEntity($theme, false);
177+
if (isset($localThemes[$data['themes'][$threatData['theme']][$labelKey]])) {
178+
$theme = $localThemes[$data['themes'][$threatData['theme']][$labelKey]];
179+
} elseif (isset($data['themes'][$threatData['theme']])) {
180+
$theme = $this->getCreatedTheme($anr, $data['themes'][$threatData['theme']]);
148181
}
149-
$threat = new Threat();
150-
$threat->setLanguage($languageIndex);
151-
// TODO: Can be replaced with setters use, example in InstanceImportService.
152-
$threat->exchangeArray($valueThreat);
153-
$threat->setAnr($anr);
154-
$threat->setTheme($theme);
155-
$this->threatTable->saveEntity($threat, false);
156-
157-
$this->cachedData['threats'][$threat->getUuid()] = $threat;
158182

159-
continue;
160-
}
183+
if (\in_array($threatData['code'], $threatsCodes, true)) {
184+
$threatData['code'] .= '-' . time();
185+
}
161186

162-
if (!empty($valueThreat['theme'])
163-
&& (
164-
$threat->getTheme() === null
165-
|| $threat->getTheme()->getLabel($languageIndex) !== $data['themes'][$valueThreat['theme']]['label' . $languageIndex]
166-
)
167-
) {
168-
if (isset($localThemes[$data['themes'][$valueThreat['theme']]['label' . $languageIndex]])) {
169-
$theme = $localThemes[$data['themes'][$valueThreat['theme']]['label' . $languageIndex]];
170-
} else {
171-
$theme = new Theme();
172-
$theme->setLanguage($languageIndex);
173-
$theme->exchangeArray($data['themes'][$valueThreat['theme']]);
174-
$theme->setAnr($anr);
175-
$this->themeTable->saveEntity($theme, false);
187+
$threat = (new Threat())
188+
->setUuid($threatData['uuid'])
189+
->setAnr($anr)
190+
->setCode($threatData['code'])
191+
->setLabels($threatData)
192+
->setDescriptions($threatData)
193+
->setMode((int)$threatData['mode'])
194+
->setStatus((int)$threatData['status'])
195+
->setTrend((int)$threatData['trend'])
196+
->setQualification((int)$threatData['qualification'])
197+
->setComment($threatData['comment'] ?? '')
198+
->setCreator($this->connectedUser->getEmail());
199+
if (isset($threatData['c'])) {
200+
$threat->setConfidentiality((int)$threatData['c']);
201+
}
202+
if (isset($threatData['i'])) {
203+
$threat->setIntegrity((int)$threatData['i']);
204+
}
205+
if (isset($threatData['a'])) {
206+
$threat->setAvailability((int)$threatData['a']);
176207
}
177208
$threat->setTheme($theme);
209+
178210
$this->threatTable->saveEntity($threat, false);
211+
212+
$this->cachedData['threats'][$threat->getUuid()] = $threat;
179213
}
180214
}
181215

182216
/*
183217
* Vulnerabilities
184218
*/
185-
$vulnerabilitiesUuids = $this->vulnerabilityTable->findUuidsByAnr($anr);
219+
$vulnerabilitiesUuidsAndCodes = $this->vulnerabilityTable->findUuidsAndCodesByAnr($anr);
220+
$vulnerabilitiesUuids = array_column($vulnerabilitiesUuidsAndCodes, 'uuid');
221+
$vulnerabilitiesCodes = array_column($vulnerabilitiesUuidsAndCodes, 'code');
186222
foreach ($data['vuls'] as $valueVul) {
187223
if (!isset($this->cachedData['vulnerabilities'][(string)$valueVul['uuid']])
188224
&& !\in_array((string)$valueVul['uuid'], $vulnerabilitiesUuids, true)
189225
) {
190-
$vulnerability = new Vulnerability();
191-
$vulnerability->setLanguage($languageIndex);
192-
$vulnerability->exchangeArray($valueVul);
193-
$vulnerability->setAnr($anr);
226+
if (\in_array($valueVul['code'], $vulnerabilitiesCodes, true)) {
227+
$valueVul['code'] .= '-' . time();
228+
}
229+
230+
$vulnerability = (new Vulnerability())
231+
->setUuid($valueVul['uuid'])
232+
->setAnr($anr)
233+
->setLabels($valueVul)
234+
->setDescriptions($valueVul)
235+
->setCode($valueVul['code'])
236+
->setMode($valueVul['mode'])
237+
->setStatus($valueVul['status'])
238+
->setCreator($this->connectedUser->getEmail());
239+
194240
$this->vulnerabilityTable->saveEntity($vulnerability, false);
195-
$vulnerabilitiesUuids[] = $vulnerability->getUuid();
196241

197-
$this->cachedData['vulnerabilities'][$vulnerability->getUuid()] = $vulnerability;
242+
$this->cachedData['vulnerabilities'][$valueVul['uuid']] = $vulnerability;
198243
}
199244
}
200245
$this->vulnerabilityTable->getDb()->flush();
@@ -258,7 +303,6 @@ public function importFromArray($monarcVersion, array $data, Anr $anr): ?Asset
258303
}
259304

260305
if (!empty($valueAmv['measures'])) {
261-
$labelName = 'label' . $languageIndex;
262306
foreach ($valueAmv['measures'] as $measureUuid) {
263307
$measure = $this->cachedData['measures'][$measureUuid]
264308
?? $this->measureTable->findByAnrAndUuid($anr, $measureUuid);
@@ -274,12 +318,14 @@ public function importFromArray($monarcVersion, array $data, Anr $anr): ?Asset
274318

275319
// For backward compatibility issue.
276320
if ($referential === null
277-
&& isset($data['measures'][$measureUuid]['referential'][$labelName])
321+
&& isset($data['measures'][$measureUuid]['referential'][$labelKey])
278322
) {
279323
$referential = (new Referential())
280324
->setAnr($anr)
281325
->setUuid($data['measures'][$measureUuid]['referential']['uuid'])
282-
->{'setLabel' . $languageIndex}($data['measures'][$measureUuid]['referential'][$labelName]);
326+
->{'setLabel' . $languageIndex}(
327+
$data['measures'][$measureUuid]['referential'][$labelKey]
328+
);
283329
$this->referentialTable->saveEntity($referential);
284330
}
285331

@@ -290,7 +336,7 @@ public function importFromArray($monarcVersion, array $data, Anr $anr): ?Asset
290336

291337
$category = $this->soaCategoryTable->getEntityByFields([
292338
'anr' => $anr->getId(),
293-
$labelName => $data['measures'][$measureUuid]['category'][$labelName],
339+
$labelKey => $data['measures'][$measureUuid]['category'][$labelKey],
294340
'referential' => [
295341
'anr' => $anr->getId(),
296342
'uuid' => $referential->getUuid(),
@@ -300,7 +346,7 @@ public function importFromArray($monarcVersion, array $data, Anr $anr): ?Asset
300346
$category = (new SoaCategory())
301347
->setAnr($anr)
302348
->setReferential($referential)
303-
->{'setLabel' . $languageIndex}($data['measures'][$measureUuid]['category'][$labelName]);
349+
->{'setLabel' . $languageIndex}($data['measures'][$measureUuid]['category'][$labelKey]);
304350
/** @var SoaCategoryTable $soaCategoryTable */
305351
$this->soaCategoryTable->saveEntity($category, false);
306352
} else {
@@ -369,4 +415,16 @@ public function getCachedDataByKey(string $key): array
369415
{
370416
return $this->cachedData[$key] ?? [];
371417
}
418+
419+
private function getCreatedTheme(Anr $anr, array $data): Theme
420+
{
421+
$theme = (new Theme())
422+
->setAnr($anr)
423+
->setLabels($data)
424+
->setCreator($this->connectedUser->getEmail());
425+
426+
$this->themeTable->saveEntity($theme, false);
427+
428+
return $theme;
429+
}
372430
}

0 commit comments

Comments
 (0)