Skip to content

Commit 0a2f272

Browse files
[backend] Add collector state (#3329)
Signed-off-by: Marine LM <[email protected]> Co-authored-by: Romuald Lemesle <[email protected]>
1 parent 89d2021 commit 0a2f272

File tree

29 files changed

+314
-122
lines changed

29 files changed

+314
-122
lines changed

openbas-api/src/main/java/io/openbas/collectors/expectations_expiration_manager/ExpectationsExpirationManagerCollector.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

33
import io.openbas.collectors.expectations_expiration_manager.config.ExpectationsExpirationManagerConfig;
44
import io.openbas.collectors.expectations_expiration_manager.service.ExpectationsExpirationManagerService;
5-
import io.openbas.integrations.CollectorService;
5+
import io.openbas.rest.collector.service.CollectorService;
66
import jakarta.annotation.PostConstruct;
77
import java.time.Duration;
88
import lombok.RequiredArgsConstructor;

openbas-api/src/main/java/io/openbas/collectors/expectations_expiration_manager/ExpectationsExpirationManagerJob.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

33
import io.openbas.collectors.expectations_expiration_manager.config.ExpectationsExpirationManagerConfig;
44
import io.openbas.collectors.expectations_expiration_manager.service.ExpectationsExpirationManagerService;
5-
import io.openbas.integrations.CollectorService;
5+
import io.openbas.rest.collector.service.CollectorService;
66
import lombok.extern.slf4j.Slf4j;
77
import org.springframework.beans.factory.annotation.Autowired;
88
import org.springframework.stereotype.Service;

openbas-api/src/main/java/io/openbas/collectors/expectations_vulnerability_manager/ExpectationsVulnerabilityManagerCollector.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
package io.openbas.collectors.expectations_vulnerability_manager;
22

3-
import io.openbas.integrations.CollectorService;
3+
import io.openbas.rest.collector.service.CollectorService;
44
import jakarta.annotation.PostConstruct;
55
import lombok.RequiredArgsConstructor;
66
import lombok.extern.slf4j.Slf4j;
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
package io.openbas.migration;
2+
3+
import java.sql.Statement;
4+
import org.flywaydb.core.api.migration.BaseJavaMigration;
5+
import org.flywaydb.core.api.migration.Context;
6+
import org.springframework.stereotype.Component;
7+
8+
@Component
9+
public class V4_14__Add_collector_state extends BaseJavaMigration {
10+
11+
@Override
12+
public void migrate(Context context) throws Exception {
13+
Statement select = context.getConnection().createStatement();
14+
select.execute(
15+
"""
16+
ALTER TABLE collectors
17+
ADD COLUMN collector_state JSONB DEFAULT '{}' ;
18+
""");
19+
20+
select.execute("ALTER TABLE cves RENAME COLUMN cve_cvss TO cve_cvss_v31;");
21+
}
22+
}

openbas-api/src/main/java/io/openbas/rest/collector/CollectorApi.java

Lines changed: 14 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -2,54 +2,33 @@
22

33
import static io.openbas.database.model.User.ROLE_ADMIN;
44

5-
import com.fasterxml.jackson.databind.ObjectMapper;
6-
import io.openbas.config.OpenBASConfig;
75
import io.openbas.database.model.Collector;
86
import io.openbas.database.repository.CollectorRepository;
97
import io.openbas.database.repository.SecurityPlatformRepository;
108
import io.openbas.rest.collector.form.CollectorCreateInput;
119
import io.openbas.rest.collector.form.CollectorUpdateInput;
12-
import io.openbas.rest.exception.ElementNotFoundException;
10+
import io.openbas.rest.collector.service.CollectorService;
1311
import io.openbas.rest.helper.RestBehavior;
1412
import io.openbas.service.FileService;
15-
import jakarta.annotation.Resource;
1613
import jakarta.transaction.Transactional;
1714
import jakarta.validation.Valid;
1815
import java.time.Instant;
1916
import java.util.Optional;
20-
import org.springframework.beans.factory.annotation.Autowired;
17+
import lombok.RequiredArgsConstructor;
2118
import org.springframework.http.MediaType;
2219
import org.springframework.security.access.annotation.Secured;
2320
import org.springframework.web.bind.annotation.*;
2421
import org.springframework.web.multipart.MultipartFile;
2522

2623
@RestController
24+
@RequiredArgsConstructor
2725
public class CollectorApi extends RestBehavior {
2826

29-
@Resource private OpenBASConfig openBASConfig;
27+
private final CollectorService collectorService;
28+
private final CollectorRepository collectorRepository;
29+
private final SecurityPlatformRepository securityPlatformRepository;
3030

31-
private CollectorRepository collectorRepository;
32-
33-
private FileService fileService;
34-
35-
private SecurityPlatformRepository securityPlatformRepository;
36-
37-
@Resource protected ObjectMapper mapper;
38-
39-
@Autowired
40-
public void setFileService(FileService fileService) {
41-
this.fileService = fileService;
42-
}
43-
44-
@Autowired
45-
public void setCollectorRepository(CollectorRepository collectorRepository) {
46-
this.collectorRepository = collectorRepository;
47-
}
48-
49-
@Autowired
50-
public void setSecurityPlatformRepository(SecurityPlatformRepository securityPlatformRepository) {
51-
this.securityPlatformRepository = securityPlatformRepository;
52-
}
31+
private final FileService fileService;
5332

5433
@GetMapping("/api/collectors")
5534
public Iterable<Collector> collectors() {
@@ -76,13 +55,18 @@ private Collector updateCollector(
7655
return collectorRepository.save(collector);
7756
}
7857

58+
@GetMapping("/api/collectors/{collectorId}")
59+
@Secured(ROLE_ADMIN)
60+
public Collector getCollector(@PathVariable String collectorId) {
61+
return collectorService.collector(collectorId);
62+
}
63+
7964
@Secured(ROLE_ADMIN)
8065
@PutMapping("/api/collectors/{collectorId}")
8166
@Transactional(rollbackOn = Exception.class)
8267
public Collector updateCollector(
8368
@PathVariable String collectorId, @Valid @RequestBody CollectorUpdateInput input) {
84-
Collector collector =
85-
collectorRepository.findById(collectorId).orElseThrow(ElementNotFoundException::new);
69+
Collector collector = collectorService.collector(collectorId);
8670
return updateCollector(
8771
collector,
8872
collector.getType(),

openbas-framework/src/main/java/io/openbas/integrations/CollectorService.java renamed to openbas-api/src/main/java/io/openbas/rest/collector/service/CollectorService.java

Lines changed: 24 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -1,37 +1,50 @@
1-
package io.openbas.integrations;
1+
package io.openbas.rest.collector.service;
22

33
import static io.openbas.service.FileService.COLLECTORS_IMAGES_BASE_PATH;
44

55
import com.fasterxml.jackson.databind.ObjectMapper;
6+
import com.fasterxml.jackson.databind.node.ObjectNode;
67
import io.openbas.database.model.Collector;
78
import io.openbas.database.repository.CollectorRepository;
9+
import io.openbas.rest.exception.ElementNotFoundException;
810
import io.openbas.service.FileService;
911
import jakarta.annotation.Resource;
1012
import jakarta.transaction.Transactional;
11-
import jakarta.validation.constraints.NotBlank;
1213
import java.io.InputStream;
13-
import org.springframework.beans.factory.annotation.Autowired;
14+
import java.util.Optional;
15+
import lombok.RequiredArgsConstructor;
16+
import lombok.extern.slf4j.Slf4j;
1417
import org.springframework.stereotype.Service;
1518

19+
@Slf4j
1620
@Service
21+
@RequiredArgsConstructor
1722
public class CollectorService {
1823

1924
@Resource protected ObjectMapper mapper;
2025

21-
private FileService fileService;
26+
private final CollectorRepository collectorRepository;
27+
private final FileService fileService;
2228

23-
private CollectorRepository collectorRepository;
29+
// -- CRUD --
2430

25-
@Resource
26-
public void setFileService(FileService fileService) {
27-
this.fileService = fileService;
31+
public Collector collector(String id) {
32+
return collectorRepository
33+
.findById(id)
34+
.orElseThrow(() -> new ElementNotFoundException("Collector not found with id: " + id));
2835
}
2936

30-
@Autowired
31-
public void setCollectorRepository(CollectorRepository collectorRepository) {
32-
this.collectorRepository = collectorRepository;
37+
public Collector updateCollectorState(Collector collectorToUpdate, ObjectNode newState) {
38+
ObjectNode state =
39+
Optional.ofNullable(collectorToUpdate.getState()).orElse(mapper.createObjectNode());
40+
newState
41+
.fieldNames()
42+
.forEachRemaining(fieldName -> state.set(fieldName, newState.get(fieldName)));
43+
return collectorRepository.save(collectorToUpdate);
3344
}
3445

46+
// -- ACTION --
47+
3548
@Transactional
3649
public void register(String id, String type, String name, InputStream iconData) throws Exception {
3750
if (iconData != null) {
@@ -61,12 +74,4 @@ public void register(String id, String type, String name, InputStream iconData)
6174
collectorRepository.save(newCollector);
6275
}
6376
}
64-
65-
// -- CRUD --
66-
67-
public Collector collector(@NotBlank final String collectorId) {
68-
return collectorRepository
69-
.findById(collectorId)
70-
.orElseThrow(() -> new RuntimeException("Collector not found"));
71-
}
7277
}

openbas-api/src/main/java/io/openbas/rest/cve/CveApi.java

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4,10 +4,7 @@
44
import static io.openbas.database.model.User.ROLE_USER;
55

66
import io.openbas.aop.LogExecutionTime;
7-
import io.openbas.rest.cve.form.CveCreateInput;
8-
import io.openbas.rest.cve.form.CveOutput;
9-
import io.openbas.rest.cve.form.CveSimple;
10-
import io.openbas.rest.cve.form.CveUpdateInput;
7+
import io.openbas.rest.cve.form.*;
118
import io.openbas.rest.cve.service.CveService;
129
import io.openbas.rest.helper.RestBehavior;
1310
import io.openbas.utils.mapper.CveMapper;
@@ -16,6 +13,7 @@
1613
import io.swagger.v3.oas.annotations.tags.Tag;
1714
import jakarta.transaction.Transactional;
1815
import jakarta.validation.Valid;
16+
import jakarta.validation.constraints.NotNull;
1917
import lombok.RequiredArgsConstructor;
2018
import org.springframework.data.domain.Page;
2119
import org.springframework.security.access.annotation.Secured;
@@ -61,6 +59,14 @@ public CveSimple createCve(@Valid @RequestBody CveCreateInput input) {
6159
return cveMapper.toCveSimple(cveService.createCve(input));
6260
}
6361

62+
@Secured(ROLE_ADMIN)
63+
@Operation(summary = "Bulk insert CVEs")
64+
@LogExecutionTime
65+
@PostMapping(CVE_API + "/bulk")
66+
public void bulkInsertCVEsForCollector(@Valid @RequestBody @NotNull CVEBulkInsertInput input) {
67+
this.cveService.bulkUpsertCVEs(input);
68+
}
69+
6470
@Secured(ROLE_ADMIN)
6571
@Operation(summary = "Update an existing CVE")
6672
@PutMapping(CVE_API + "/{cveId}")
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
package io.openbas.rest.cve.form;
2+
3+
import com.fasterxml.jackson.annotation.JsonProperty;
4+
import io.openbas.config.AppConfig;
5+
import jakarta.validation.constraints.NotNull;
6+
import java.time.Instant;
7+
import java.util.List;
8+
import lombok.Data;
9+
10+
@Data
11+
public class CVEBulkInsertInput {
12+
13+
@JsonProperty("cves")
14+
@NotNull(message = AppConfig.MANDATORY_MESSAGE)
15+
private List<CveCreateInput> cves;
16+
17+
@JsonProperty("last_modified_date_fetched")
18+
private Instant lastModifiedDateFetched;
19+
20+
@JsonProperty("last_index")
21+
private Integer lastIndex;
22+
23+
@JsonProperty("initial_dataset_completed")
24+
private Boolean initialDatasetCompleted;
25+
26+
@JsonProperty("source_identifier")
27+
@NotNull(message = AppConfig.MANDATORY_MESSAGE)
28+
private String sourceIdentifier;
29+
}

openbas-api/src/main/java/io/openbas/rest/cve/form/CveCreateInput.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ public class CveCreateInput extends CveInput {
2323
@NotNull
2424
@DecimalMin("0.0")
2525
@DecimalMax("10.0")
26-
@JsonProperty("cve_cvss")
26+
@JsonProperty("cve_cvss_v31")
2727
@Schema(description = "CVSS score", example = "7.5", minimum = "0.0", maximum = "10.0")
28-
private BigDecimal cvss;
28+
private BigDecimal cvssV31;
2929
}

openbas-api/src/main/java/io/openbas/rest/cve/form/CveSimple.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -27,9 +27,9 @@ public class CveSimple {
2727
private String externalId;
2828

2929
@NotNull
30-
@JsonProperty("cve_cvss")
30+
@JsonProperty("cve_cvss_v31")
3131
@Schema(description = "CVSS score", example = "7.8")
32-
private BigDecimal cvss;
32+
private BigDecimal cvssV31;
3333

3434
@JsonProperty("cve_published")
3535
@Schema(description = "CVE published date")

0 commit comments

Comments
 (0)