Skip to content

Commit 1f40619

Browse files
committed
[backend] feat(stix): fix pr feedbacks (#3511)
1 parent 5a84133 commit 1f40619

5 files changed

Lines changed: 51 additions & 15 deletions

File tree

openaev-api/src/main/java/io/openaev/migration/V4_73__Add_artifacts_column_to_security_coverage.java renamed to openaev-api/src/main/java/io/openaev/migration/V4_74__Add_artifacts_column_to_security_coverage.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
import org.springframework.stereotype.Component;
77

88
@Component
9-
public class V4_73__Add_artifacts_column_to_security_coverage extends BaseJavaMigration {
9+
public class V4_74__Add_artifacts_column_to_security_coverage extends BaseJavaMigration {
1010
@Override
1111
public void migrate(Context context) throws Exception {
1212
try (Statement stmt = context.getConnection().createStatement()) {

openaev-api/src/main/java/io/openaev/opencti/service/OpenCTIService.java

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -279,7 +279,12 @@ public Document downloadAndSaveFile(String uri, String name, String mimeType) {
279279
return documentService.upsert(
280280
name, octiFile.getInputStream(), octiFile.getSize(), mimeType, documentCreateInput);
281281
} catch (Exception e) {
282-
throw new RuntimeException(e);
282+
String errorMessage =
283+
String.format(
284+
"Error while upserting document from OpenCTI file (uri=%s, name=%s, mimeType=%s)",
285+
uri, name, mimeType);
286+
log.error(errorMessage, e);
287+
throw new RuntimeException(errorMessage, e);
283288
}
284289
}
285290
return null;

openaev-api/src/main/java/io/openaev/service/stix/SecurityCoverageService.java

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -644,9 +644,8 @@ private BaseType<?> getArtifactCoverage(List<String> externalRefs, Exercise simu
644644
.filter(
645645
inject ->
646646
inject.getPayload().isPresent()
647-
&& inject.getPayload().get() instanceof FileDrop
648-
&& documentIds.contains(
649-
((FileDrop) inject.getPayload().get()).getFileDropFile().getId()))
647+
&& inject.getPayload().get() instanceof FileDrop fileDrop
648+
&& documentIds.contains(fileDrop.getFileDropFile().getId()))
650649
.toList(),
651650
inject ->
652651
Optional.ofNullable(inject)

openaev-api/src/main/java/io/openaev/utils/SecurityCoverageUtils.java

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -107,10 +107,11 @@ public Set<StixRefToExternalRef> extractObjectReferences(List<ObjectBase> object
107107
&& obj.hasExtension(ExtendedProperties.OPENCTI_EXTENSION_DEFINITION)) {
108108
Dictionary extensionObj =
109109
(Dictionary) obj.getExtension(ExtendedProperties.OPENCTI_EXTENSION_DEFINITION);
110-
if (extensionObj.has(StixConstants.FILES)) {
110+
Object filesValue = extensionObj.get(StixConstants.FILES);
111+
if (extensionObj.has(StixConstants.FILES)
112+
&& filesValue instanceof io.openaev.stix.types.List<?> filesList) {
111113
List<String> documentIds =
112-
getAllDocumentIdsFromFiles(
113-
(io.openaev.stix.types.List<Dictionary>) extensionObj.get(StixConstants.FILES));
114+
getAllDocumentIdsFromFiles((io.openaev.stix.types.List<Dictionary>) filesList);
114115
manageAndAddStixRefToExternalRefs(stixToRef, obj, documentIds);
115116
}
116117
continue;

openaev-api/src/test/java/io/openaev/api/stix_process/StixApiTest.java

Lines changed: 38 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,10 @@
1212
import static org.assertj.core.api.Assertions.assertThatNoException;
1313
import static org.junit.jupiter.api.Assertions.assertTrue;
1414
import static org.junit.jupiter.api.TestInstance.Lifecycle.PER_CLASS;
15+
import static org.mockito.ArgumentMatchers.any;
16+
import static org.mockito.Mockito.verify;
17+
import static org.mockserver.model.HttpRequest.request;
18+
import static org.mockserver.model.HttpResponse.response;
1519
import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post;
1620
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;
1721

@@ -50,26 +54,20 @@
5054
import org.mockserver.configuration.Configuration;
5155
import org.mockserver.integration.ClientAndServer;
5256
import org.mockserver.socket.PortFactory;
53-
import org.mockserver.client.MockServerClient;
54-
import org.mockserver.configuration.Configuration;
55-
import org.mockserver.integration.ClientAndServer;
56-
import org.mockserver.socket.PortFactory;
5757
import org.springframework.beans.factory.annotation.Autowired;
5858
import org.springframework.http.MediaType;
5959
import org.springframework.test.context.DynamicPropertyRegistry;
6060
import org.springframework.test.context.DynamicPropertySource;
6161
import org.springframework.test.context.TestPropertySource;
6262
import org.springframework.test.context.bean.override.mockito.MockitoSpyBean;
63-
import org.springframework.test.context.TestPropertySource;
64-
import org.springframework.test.context.DynamicPropertyRegistry;
65-
import org.springframework.test.context.DynamicPropertySource;
6663
import org.springframework.test.web.servlet.MockMvc;
6764
import org.springframework.transaction.annotation.Transactional;
6865

6966
@TestInstance(PER_CLASS)
7067
@Transactional
7168
@WithMockUser(withCapabilities = {Capability.MANAGE_STIX_BUNDLE})
7269
@DisplayName("STIX API Integration Tests")
70+
@TestPropertySource(properties = {"openaev.xtm.opencti.enable=true"})
7371
class StixApiTest extends IntegrationTest {
7472

7573
public static final String T_1531 = "T1531";
@@ -232,6 +230,38 @@ void setUp() throws Exception {
232230
vulnerabilityComposer.forVulnerability(
233231
VulnerabilityFixture.createVulnerabilityInput("CVE-2025-56786")))
234232
.persist();
233+
234+
injectorContractComposer
235+
.forInjectorContract(injectorContractFixture.getWellKnownSingleManualContract())
236+
.persist();
237+
238+
// need to mock unregistered connector to be use in process
239+
mockServer
240+
.when(request().withMethod("POST").withPath(""))
241+
.respond(
242+
response()
243+
.withStatusCode(200)
244+
.withHeader("Content-Type", "application/json")
245+
.withBody(
246+
"""
247+
{
248+
"data": {}
249+
}
250+
"""));
251+
openCTIConnectorService.registerOrPingAllConnectors();
252+
253+
mockServer
254+
.when(request().withMethod("POST").withPath("graphql"))
255+
.respond(
256+
response()
257+
.withStatusCode(200)
258+
.withHeader("Content-Type", "application/json")
259+
.withBody(
260+
"""
261+
{
262+
"data": {}
263+
}
264+
"""));
235265
}
236266

237267
@Nested
@@ -254,6 +284,7 @@ class ImportStixBundles {
254284
.getResponse()
255285
.getContentAsString();
256286

287+
verify(securityCoverageService).pushSecurityCoverageBundleWithExternalURI(any());
257288
assertThat(response).isNotBlank();
258289
String scenarioId = JsonPath.read(response, "$.scenarioId");
259290
Scenario createdScenario = scenarioRepository.findById(scenarioId).orElseThrow();

0 commit comments

Comments
 (0)