Skip to content

Commit 0b39042

Browse files
authored
Merge pull request #1443 from DependencyTrack/migrate-epss-mirroring-
2 parents 107e7d7 + 3ac8eed commit 0b39042

File tree

19 files changed

+400
-355
lines changed

19 files changed

+400
-355
lines changed

apiserver/src/main/java/org/dependencytrack/dev/DevServicesInitializer.java

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -19,14 +19,14 @@
1919
package org.dependencytrack.dev;
2020

2121
import alpine.common.logging.Logger;
22+
import jakarta.servlet.ServletContextEvent;
23+
import jakarta.servlet.ServletContextListener;
2224
import org.apache.kafka.clients.admin.AdminClient;
2325
import org.apache.kafka.clients.admin.NewTopic;
2426
import org.dependencytrack.event.kafka.KafkaTopics;
2527
import org.eclipse.microprofile.config.Config;
2628
import org.eclipse.microprofile.config.ConfigProvider;
2729

28-
import jakarta.servlet.ServletContextEvent;
29-
import jakarta.servlet.ServletContextListener;
3030
import java.lang.reflect.Constructor;
3131
import java.lang.reflect.Method;
3232
import java.util.ArrayList;
@@ -166,7 +166,6 @@ public void contextInitialized(final ServletContextEvent event) {
166166
}
167167

168168
final var topicsToCreate = new ArrayList<>(List.of(
169-
new NewTopic(KafkaTopics.NEW_EPSS.name(), 1, (short) 1).configs(Map.of(CLEANUP_POLICY_CONFIG, CLEANUP_POLICY_COMPACT)),
170169
new NewTopic(KafkaTopics.NEW_VULNERABILITY.name(), 1, (short) 1).configs(Map.of(CLEANUP_POLICY_CONFIG, CLEANUP_POLICY_COMPACT)),
171170
new NewTopic(KafkaTopics.NOTIFICATION_ANALYZER.name(), 1, (short) 1),
172171
new NewTopic(KafkaTopics.NOTIFICATION_BOM.name(), 1, (short) 1),

apiserver/src/main/java/org/dependencytrack/event/kafka/KafkaEventConverter.java

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,6 @@
2323
import com.google.protobuf.Message;
2424
import org.dependencytrack.event.ComponentRepositoryMetaAnalysisEvent;
2525
import org.dependencytrack.event.ComponentVulnerabilityAnalysisEvent;
26-
import org.dependencytrack.event.EpssMirrorEvent;
2726
import org.dependencytrack.event.OsvMirrorEvent;
2827
import org.dependencytrack.event.kafka.KafkaTopics.Topic;
2928
import org.dependencytrack.model.Vulnerability;
@@ -69,7 +68,6 @@ private KafkaEventConverter() {
6968
case ComponentRepositoryMetaAnalysisEvent e -> convert(e);
7069
case ComponentVulnerabilityAnalysisEvent e -> convert(e);
7170
case OsvMirrorEvent e -> convert(e);
72-
case EpssMirrorEvent e -> convert(e);
7371
default -> throw new IllegalArgumentException("Unable to convert event " + event);
7472
};
7573
}
@@ -150,10 +148,6 @@ static KafkaEvent<String, String> convert(final OsvMirrorEvent event) {
150148
return new KafkaEvent<>(KafkaTopics.VULNERABILITY_MIRROR_COMMAND, key, value);
151149
}
152150

153-
static KafkaEvent<String, String> convert(final EpssMirrorEvent ignored) {
154-
return new KafkaEvent<>(KafkaTopics.VULNERABILITY_MIRROR_COMMAND, "EPSS", null);
155-
}
156-
157151
private static Topic<String, Notification> extractDestinationTopic(final Notification notification) {
158152
return switch (notification.getGroup()) {
159153
case GROUP_ANALYZER -> KafkaTopics.NOTIFICATION_ANALYZER;

apiserver/src/main/java/org/dependencytrack/event/kafka/KafkaTopics.java

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,6 @@
2424
import org.cyclonedx.proto.v1_6.Bom;
2525
import org.dependencytrack.common.ConfigKey;
2626
import org.dependencytrack.event.kafka.serialization.KafkaProtobufSerde;
27-
import org.dependencytrack.proto.mirror.v1.EpssItem;
2827
import org.dependencytrack.proto.notification.v1.Notification;
2928
import org.dependencytrack.proto.repometaanalysis.v1.AnalysisCommand;
3029
import org.dependencytrack.proto.repometaanalysis.v1.AnalysisResult;
@@ -57,7 +56,6 @@ public final class KafkaTopics {
5756
public static final Topic<String, ScanResult> VULN_ANALYSIS_RESULT_PROCESSED;
5857

5958
public static final Topic<String, Notification> NOTIFICATION_PROJECT_VULN_ANALYSIS_COMPLETE;
60-
public static final Topic<String, EpssItem> NEW_EPSS;
6159
private static final Serde<Notification> NOTIFICATION_SERDE = new KafkaProtobufSerde<>(Notification.parser());
6260

6361
static {
@@ -82,7 +80,6 @@ public final class KafkaTopics {
8280
VULN_ANALYSIS_RESULT = new Topic<>("dtrack.vuln-analysis.result", new KafkaProtobufSerde<>(ScanKey.parser()), new KafkaProtobufSerde<>(ScanResult.parser()));
8381
VULN_ANALYSIS_RESULT_PROCESSED = new Topic<>("dtrack.vuln-analysis.result.processed", Serdes.String(), new KafkaProtobufSerde<>(ScanResult.parser()));
8482
NOTIFICATION_PROJECT_VULN_ANALYSIS_COMPLETE = new Topic<>("dtrack.notification.project-vuln-analysis-complete", Serdes.String(), NOTIFICATION_SERDE);
85-
NEW_EPSS = new Topic<>("dtrack.epss", Serdes.String(), new KafkaProtobufSerde<>(EpssItem.parser()));
8683
NOTIFICATION_USER = new Topic<>("dtrack.notification.user", Serdes.String(), NOTIFICATION_SERDE);
8784
}
8885

apiserver/src/main/java/org/dependencytrack/event/kafka/processor/EpssMirrorProcessor.java

Lines changed: 0 additions & 51 deletions
This file was deleted.

apiserver/src/main/java/org/dependencytrack/event/kafka/processor/ProcessorInitializer.java

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -19,11 +19,10 @@
1919
package org.dependencytrack.event.kafka.processor;
2020

2121
import alpine.common.logging.Logger;
22-
import org.dependencytrack.event.kafka.KafkaTopics;
23-
import org.dependencytrack.event.kafka.processor.api.ProcessorManager;
24-
2522
import jakarta.servlet.ServletContextEvent;
2623
import jakarta.servlet.ServletContextListener;
24+
import org.dependencytrack.event.kafka.KafkaTopics;
25+
import org.dependencytrack.event.kafka.processor.api.ProcessorManager;
2726

2827
public class ProcessorInitializer implements ServletContextListener {
2928

@@ -39,8 +38,6 @@ public void contextInitialized(final ServletContextEvent event) {
3938
KafkaTopics.NEW_VULNERABILITY, new VulnerabilityMirrorProcessor());
4039
PROCESSOR_MANAGER.registerProcessor(RepositoryMetaResultProcessor.PROCESSOR_NAME,
4140
KafkaTopics.REPO_META_ANALYSIS_RESULT, new RepositoryMetaResultProcessor());
42-
PROCESSOR_MANAGER.registerBatchProcessor(EpssMirrorProcessor.PROCESSOR_NAME,
43-
KafkaTopics.NEW_EPSS, new EpssMirrorProcessor());
4441
PROCESSOR_MANAGER.registerProcessor(VulnerabilityScanResultProcessor.PROCESSOR_NAME,
4542
KafkaTopics.VULN_ANALYSIS_RESULT, new VulnerabilityScanResultProcessor());
4643
PROCESSOR_MANAGER.registerBatchProcessor(ProcessedVulnerabilityScanResultProcessor.PROCESSOR_NAME,

apiserver/src/main/java/org/dependencytrack/model/Epss.java

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,8 @@
3030
import java.io.Serializable;
3131
import java.math.BigDecimal;
3232

33+
import static java.util.Objects.requireNonNull;
34+
3335
@PersistenceCapable
3436
@JsonInclude(JsonInclude.Include.NON_NULL)
3537
public class Epss implements Serializable {
@@ -52,6 +54,15 @@ public class Epss implements Serializable {
5254
@Column(name = "PERCENTILE", scale = 5)
5355
private BigDecimal percentile;
5456

57+
public Epss() {
58+
}
59+
60+
public Epss(final String cve, final BigDecimal score, final BigDecimal percentile) {
61+
this.cve = requireNonNull(cve, "cve must not be null");
62+
this.score = requireNonNull(score, "score must not be null");
63+
this.percentile = requireNonNull(percentile, "percentile must not be null");
64+
}
65+
5566
public long getId() {
5667
return id;
5768
}

apiserver/src/main/java/org/dependencytrack/parser/dependencytrack/EpssModelConverter.java

Lines changed: 0 additions & 35 deletions
This file was deleted.

apiserver/src/main/java/org/dependencytrack/persistence/EpssQueryManager.java

Lines changed: 0 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -27,8 +27,6 @@
2727
import java.util.function.Function;
2828
import java.util.stream.Collectors;
2929

30-
import static org.dependencytrack.util.PersistenceUtil.applyIfChanged;
31-
3230
final class EpssQueryManager extends QueryManager implements IQueryManager {
3331

3432
/**
@@ -40,44 +38,6 @@ final class EpssQueryManager extends QueryManager implements IQueryManager {
4038
super(pm);
4139
}
4240

43-
/**
44-
* Synchronizes a Epss record. Method first checkes to see if the record already
45-
* exists and if so, updates it. If the record does not already exist,
46-
* this method will create a new Epss record.
47-
* @param epss the Epss record to synchronize
48-
* @return a Epss object
49-
*/
50-
public Epss synchronizeEpss(Epss epss) {
51-
Epss result = updateEpss(epss);
52-
if (result == null) {
53-
final Epss epssNew = pm.makePersistent(epss);
54-
return epssNew;
55-
}
56-
return result;
57-
}
58-
59-
/**
60-
* Synchronizes a batch of Epss records.
61-
* @param epssList the batch of Epss records to synchronize
62-
*/
63-
public void synchronizeAllEpss(List<Epss> epssList) {
64-
runInTransaction(() -> {
65-
for (final Epss epss : epssList) {
66-
synchronizeEpss(epss);
67-
}
68-
});
69-
}
70-
71-
private Epss updateEpss(Epss epss) {
72-
var epssExisting = getEpssByCveId(epss.getCve());
73-
if (epssExisting != null) {
74-
applyIfChanged(epssExisting, epss, Epss::getScore, epssExisting::setScore);
75-
applyIfChanged(epssExisting, epss, Epss::getPercentile, epssExisting::setPercentile);
76-
return epssExisting;
77-
}
78-
return null;
79-
}
80-
8141
/**
8242
* Returns a Epss record by its CVE id.
8343
* @param cveId the CVE id of the record

apiserver/src/main/java/org/dependencytrack/persistence/QueryManager.java

Lines changed: 0 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1613,14 +1613,6 @@ public VulnerabilityPolicyBundle getVulnerabilityPolicyBundle() {
16131613
return singleResult(query.execute());
16141614
}
16151615

1616-
public Epss synchronizeEpss(Epss epss) {
1617-
return getEpssQueryManager().synchronizeEpss(epss);
1618-
}
1619-
1620-
public void synchronizeAllEpss(List<Epss> epssList) {
1621-
getEpssQueryManager().synchronizeAllEpss(epssList);
1622-
}
1623-
16241616
public Epss getEpssByCveId(String cveId) {
16251617
return getEpssQueryManager().getEpssByCveId(cveId);
16261618
}
Lines changed: 63 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,63 @@
1+
/*
2+
* This file is part of Dependency-Track.
3+
*
4+
* Licensed under the Apache License, Version 2.0 (the "License");
5+
* you may not use this file except in compliance with the License.
6+
* You may obtain a copy of the License at
7+
*
8+
* http://www.apache.org/licenses/LICENSE-2.0
9+
*
10+
* Unless required by applicable law or agreed to in writing, software
11+
* distributed under the License is distributed on an "AS IS" BASIS,
12+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13+
* See the License for the specific language governing permissions and
14+
* limitations under the License.
15+
*
16+
* SPDX-License-Identifier: Apache-2.0
17+
* Copyright (c) OWASP Foundation. All Rights Reserved.
18+
*/
19+
package org.dependencytrack.persistence.jdbi;
20+
21+
import org.dependencytrack.model.Epss;
22+
import org.jdbi.v3.core.statement.Update;
23+
import org.jdbi.v3.sqlobject.SqlObject;
24+
25+
import java.math.BigDecimal;
26+
import java.util.ArrayList;
27+
import java.util.Collection;
28+
29+
/**
30+
* @since 5.7.0
31+
*/
32+
public interface EpssDao extends SqlObject {
33+
34+
default int createOrUpdateAll(final Collection<Epss> epssRecords) {
35+
final Update update = getHandle().createUpdate("""
36+
INSERT INTO "EPSS" ("CVE", "SCORE", "PERCENTILE")
37+
SELECT * FROM UNNEST(:cves, :scores, :percentiles)
38+
ON CONFLICT ("CVE") DO UPDATE
39+
SET "SCORE" = EXCLUDED."SCORE"
40+
, "PERCENTILE" = EXCLUDED."PERCENTILE"
41+
WHERE "EPSS"."SCORE" IS DISTINCT FROM EXCLUDED."SCORE"
42+
OR "EPSS"."PERCENTILE" IS DISTINCT FROM EXCLUDED."PERCENTILE"
43+
""");
44+
45+
final var cves = new ArrayList<String>(epssRecords.size());
46+
final var scores = new ArrayList<BigDecimal>(epssRecords.size());
47+
final var percentiles = new ArrayList<BigDecimal>(epssRecords.size());
48+
49+
for (final Epss epssRecord : epssRecords) {
50+
cves.add(epssRecord.getCve());
51+
scores.add(epssRecord.getScore());
52+
percentiles.add(epssRecord.getPercentile());
53+
}
54+
55+
return update
56+
.registerArrayType(BigDecimal.class, "numeric")
57+
.bindArray("cves", String.class, cves)
58+
.bindArray("scores", BigDecimal.class, scores)
59+
.bindArray("percentiles", BigDecimal.class, percentiles)
60+
.execute();
61+
}
62+
63+
}

0 commit comments

Comments
 (0)