From 54f2f012d28cc38e01b3ee3915e229eb946e79b5 Mon Sep 17 00:00:00 2001 From: Martin Lowe <martin.lowe@eclipse-foundation.org> Date: Fri, 24 Jan 2025 14:47:49 -0500 Subject: [PATCH] update: upgrade to Quarkus 3.15 LTS and latest commons lib --- pom.xml | 23 ++- .../eclipsefoundation/cve/model/CveData.java | 97 +-------- .../cve/model/CveProjectData.java | 187 ++---------------- .../cve/model/GithubAdvisoriesData.java | 60 +----- .../InternalAdvisoriesPrecacheProvider.java | 37 ++-- .../cve/resources/CveResource.java | 18 +- .../cve/service/CveService.java | 6 +- .../cve/service/impl/DefaultCveService.java | 12 +- .../cve/test/api/MockGithubCveAPI.java | 156 ++++++++------- .../cve/test/api/MockGitlabCveAPI.java | 60 +++--- 10 files changed, 200 insertions(+), 456 deletions(-) diff --git a/pom.xml b/pom.xml index d72e387..ade4298 100644 --- a/pom.xml +++ b/pom.xml @@ -5,18 +5,18 @@ <artifactId>eclipsefdn-cve-api</artifactId> <version>1.0.0-SNAPSHOT</version> <properties> - <compiler-plugin.version>3.8.1</compiler-plugin.version> + <compiler-plugin.version>3.13.0</compiler-plugin.version> <maven.compiler.source>17</maven.compiler.source> <maven.compiler.target>17</maven.compiler.target> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding> <quarkus.platform.artifact-id>quarkus-bom</quarkus.platform.artifact-id> <quarkus.platform.group-id>io.quarkus.platform</quarkus.platform.group-id> - <quarkus.platform.version>3.8.6</quarkus.platform.version> - <surefire-plugin.version>3.1.2</surefire-plugin.version> + <quarkus.platform.version>3.15.3</quarkus.platform.version> + <surefire-plugin.version>3.3.1</surefire-plugin.version> <maven.compiler.parameters>true</maven.compiler.parameters> - <eclipse-api-version>1.1.7</eclipse-api-version> - <auto-value.version>1.10.4</auto-value.version> + <eclipse-api-version>1.2.0</eclipse-api-version> + <recordbuilder.version>42</recordbuilder.version> <org.mapstruct.version>1.5.5.Final</org.mapstruct.version> <sonar.sources>src/main</sonar.sources> <sonar.tests>src/test</sonar.tests> @@ -81,6 +81,13 @@ <artifactId>quarkus-rest-client-reactive-jackson</artifactId> </dependency> + <!-- Annotation preprocessors - reduce all of the boiler plate --> + <dependency> + <groupId>io.soabase.record-builder</groupId> + <artifactId>record-builder-processor</artifactId> + <version>${recordbuilder.version}</version> + <scope>provided</scope> + </dependency> <!-- Testing dependencies only --> <dependency> <groupId>org.apache.camel.quarkus</groupId> @@ -132,9 +139,9 @@ <configuration> <annotationProcessorPaths> <path> - <groupId>com.google.auto.value</groupId> - <artifactId>auto-value</artifactId> - <version>${auto-value.version}</version> + <groupId>io.soabase.record-builder</groupId> + <artifactId>record-builder-processor</artifactId> + <version>${recordbuilder.version}</version> </path> <path> <groupId>org.mapstruct</groupId> diff --git a/src/main/java/org/eclipsefoundation/cve/model/CveData.java b/src/main/java/org/eclipsefoundation/cve/model/CveData.java index 821b269..5d05bbd 100644 --- a/src/main/java/org/eclipsefoundation/cve/model/CveData.java +++ b/src/main/java/org/eclipsefoundation/cve/model/CveData.java @@ -14,103 +14,26 @@ package org.eclipsefoundation.cve.model; import java.net.URI; import java.time.LocalDate; -import jakarta.annotation.Nullable; - import org.apache.commons.lang3.StringUtils; import com.fasterxml.jackson.annotation.JsonAlias; import com.fasterxml.jackson.annotation.JsonProperty; -import com.fasterxml.jackson.databind.annotation.JsonDeserialize; -import com.fasterxml.jackson.databind.annotation.JsonPOJOBuilder; -import com.google.auto.value.AutoValue; -import com.google.auto.value.extension.memoized.Memoized; + +import io.soabase.recordbuilder.core.RecordBuilder; /** * JSON model class for CVE data. */ -@AutoValue -@JsonDeserialize(builder = $AutoValue_CveData.Builder.class) -public abstract class CveData { - - public abstract String getId(); - - @Nullable - public abstract LocalDate getDatePublished(); - - public abstract String getProject(); - - public abstract String getRequestLink(); - - public abstract String getCvePullRequest(); - - @Memoized - public String getLiveLink() { - return StringUtils.isBlank(getId()) ? "--" : "https://cve.mitre.org/cgi-bin/cvename.cgi?name=".concat(getId()); - } - - public abstract String getStatus(); - - @Nullable - public abstract Summary getSummary(); - - @Nullable - public abstract Double getCvss(); - - public abstract Builder toBuilder(); - - public static Builder builder() { - return new AutoValue_CveData.Builder(); - } +@RecordBuilder +public record CveData(String id, LocalDate datePublished, String project, @JsonProperty("request_link") String requestLink, + @JsonAlias("cve_pr") @JsonProperty("cve_pull_request") String cvePullRequest, String status, Summary summary, Double cvss) { - @AutoValue.Builder - @JsonPOJOBuilder(withPrefix = "set") - public abstract static class Builder { - public abstract Builder setId(String id); - - public abstract Builder setDatePublished(@Nullable LocalDate date); - - public abstract Builder setProject(String project); - - @JsonProperty("request_link") - public abstract Builder setRequestLink(String requestLink); - - @JsonProperty("cve_pr") - @JsonAlias("cve_pull_request") - public abstract Builder setCvePullRequest(String cvePullRequest); - - public abstract Builder setStatus(String status); - - public abstract Builder setSummary(@Nullable Summary summary); - - public abstract Builder setCvss(@Nullable Double cvss); - - public abstract CveData build(); + @JsonProperty("live_link") + public String liveLink() { + return StringUtils.isBlank(id()) ? "--" : "https://cve.mitre.org/cgi-bin/cvename.cgi?name=".concat(id()); } - @AutoValue - @JsonDeserialize(builder = AutoValue_CveData_Summary.Builder.class) - public abstract static class Summary { - - @Nullable - public abstract String getContent(); - - @Nullable - public abstract URI getSource(); - - public abstract Builder toBuilder(); - - public static Builder builder() { - return new AutoValue_CveData_Summary.Builder(); - } - - @AutoValue.Builder - @JsonPOJOBuilder(withPrefix = "set") - public abstract static class Builder { - public abstract Builder setContent(@Nullable String content); - - public abstract Builder setSource(@Nullable URI source); - - public abstract Summary build(); - } + @RecordBuilder + public static record Summary(String content, URI source) { } } diff --git a/src/main/java/org/eclipsefoundation/cve/model/CveProjectData.java b/src/main/java/org/eclipsefoundation/cve/model/CveProjectData.java index d79e4ae..eeacf65 100644 --- a/src/main/java/org/eclipsefoundation/cve/model/CveProjectData.java +++ b/src/main/java/org/eclipsefoundation/cve/model/CveProjectData.java @@ -14,195 +14,44 @@ package org.eclipsefoundation.cve.model; import java.util.List; import java.util.Optional; -import jakarta.annotation.Nullable; - import com.fasterxml.jackson.annotation.JsonProperty; -import com.fasterxml.jackson.databind.annotation.JsonDeserialize; -import com.fasterxml.jackson.databind.annotation.JsonPOJOBuilder; -import com.google.auto.value.AutoValue; + +import io.soabase.recordbuilder.core.RecordBuilder; /** * Return from GH repo CVEProject/CveList5. Used to augment internal CVE data. */ -@AutoValue -@JsonDeserialize(builder = AutoValue_CveProjectData.Builder.class) -public abstract class CveProjectData { - - public abstract Containers getContainers(); +@RecordBuilder +public record CveProjectData(Containers containers, @JsonProperty("cveMetadata") Metadata cveMetadata) { - @JsonProperty("cveMetadata") - public abstract Metadata getCveMetadata(); - - public static Builder builder() { - return new AutoValue_CveProjectData.Builder(); + @RecordBuilder + public static record Containers(Cna cna) { } - @AutoValue.Builder - @JsonPOJOBuilder(withPrefix = "set") - public abstract static class Builder { - - public abstract Builder setContainers(Containers containers); - - @JsonProperty("cveMetadata") - public abstract Builder setCveMetadata(Metadata metadata); + @RecordBuilder + public static record Cna(Optional<List<Description>> descriptions, Optional<List<Metric>> metrics) { - public abstract CveProjectData build(); } - @AutoValue - @JsonDeserialize(builder = AutoValue_CveProjectData_Containers.Builder.class) - public abstract static class Containers { + @RecordBuilder + public static record Description(String lang, String value) { - public abstract Cna getCna(); - - public static Builder builder() { - return new AutoValue_CveProjectData_Containers.Builder(); - } - - @AutoValue.Builder - @JsonPOJOBuilder(withPrefix = "set") - public abstract static class Builder { - - public abstract Builder setCna(Cna cna); - - public abstract Containers build(); - } } - @AutoValue - @JsonDeserialize(builder = AutoValue_CveProjectData_Cna.Builder.class) - public abstract static class Cna { - - public abstract Optional<List<Description>> getDescriptions(); - - public abstract Optional<List<Metric>> getMetrics(); + @RecordBuilder + public static record Metric(@JsonProperty("cvssV3_1") Optional<CvssData> cvssV31, @JsonProperty("cvssV3_0") Optional<CvssData> cvssV30, + @JsonProperty("cvssV2_0") Optional<CvssData> cvssV2) { - public static Builder builder() { - return new AutoValue_CveProjectData_Cna.Builder(); - } - - @AutoValue.Builder - @JsonPOJOBuilder(withPrefix = "set") - public abstract static class Builder { - - public abstract Builder setDescriptions(Optional<List<Description>> desc); - - public abstract Builder setMetrics(Optional<List<Metric>> metrics); - - public abstract Cna build(); - } } - @AutoValue - @JsonDeserialize(builder = AutoValue_CveProjectData_Description.Builder.class) - public abstract static class Description { - - public abstract String getLang(); - - @Nullable - public abstract String getValue(); + @RecordBuilder + public static record CvssData(String version, @JsonProperty("baseScore") Double baseScore, + @JsonProperty("vectorString") String vectorString) { - public static Builder builder() { - return new AutoValue_CveProjectData_Description.Builder().setLang("en").setValue(null); - } - - @AutoValue.Builder - @JsonPOJOBuilder(withPrefix = "set") - public abstract static class Builder { - - public abstract Builder setLang(String lang); - - public abstract Builder setValue(@Nullable String value); - - public abstract Description build(); - } } - @AutoValue - @JsonDeserialize(builder = AutoValue_CveProjectData_Metric.Builder.class) - public abstract static class Metric { - - public abstract Optional<CvssData> getCvssV31(); - - public abstract Optional<CvssData> getCvssV30(); - - public abstract Optional<CvssData> getCvssV2(); - - public static Builder builder() { - return new AutoValue_CveProjectData_Metric.Builder(); - } - - @AutoValue.Builder - @JsonPOJOBuilder(withPrefix = "set") - public abstract static class Builder { - - @JsonProperty("cvssV3_1") - public abstract Builder setCvssV31(Optional<CvssData> cvss); - - @JsonProperty("cvssV3_0") - public abstract Builder setCvssV30(Optional<CvssData> cvss); - - @JsonProperty("cvssV2_0") - public abstract Builder setCvssV2(Optional<CvssData> cvss); - - public abstract Metric build(); - } - } - - - @AutoValue - @JsonDeserialize(builder = AutoValue_CveProjectData_CvssData.Builder.class) - public abstract static class CvssData { - @Nullable - public abstract String getVersion(); - - @Nullable - @JsonProperty("baseScore") - public abstract Double getBaseScore(); - - @Nullable - @JsonProperty("vectorString") - public abstract String getVectorString(); - - public static Builder builder() { - return new AutoValue_CveProjectData_CvssData.Builder(); - } - - @AutoValue.Builder - @JsonPOJOBuilder(withPrefix = "set") - public abstract static class Builder { - - public abstract Builder setVersion(@Nullable String version); - - @JsonProperty("baseScore") - public abstract Builder setBaseScore(@Nullable Double score); - - @JsonProperty("vectorString") - public abstract Builder setVectorString(@Nullable String vectorString); - - public abstract CvssData build(); - } - } - - @AutoValue - @JsonDeserialize(builder = AutoValue_CveProjectData_Metadata.Builder.class) - public abstract static class Metadata { - - @JsonProperty("cveId") - public abstract String getCveId(); - - public static Builder builder() { - return new AutoValue_CveProjectData_Metadata.Builder(); - } - - @AutoValue.Builder - @JsonPOJOBuilder(withPrefix = "set") - public abstract static class Builder { - - @JsonProperty("cveId") - public abstract Builder setCveId(String id); + @RecordBuilder + public static record Metadata(@JsonProperty("cveId") String cveId) { - public abstract Metadata build(); - } } } diff --git a/src/main/java/org/eclipsefoundation/cve/model/GithubAdvisoriesData.java b/src/main/java/org/eclipsefoundation/cve/model/GithubAdvisoriesData.java index 38417dd..8583780 100644 --- a/src/main/java/org/eclipsefoundation/cve/model/GithubAdvisoriesData.java +++ b/src/main/java/org/eclipsefoundation/cve/model/GithubAdvisoriesData.java @@ -12,66 +12,16 @@ */ package org.eclipsefoundation.cve.model; -import jakarta.annotation.Nullable; - -import com.fasterxml.jackson.databind.annotation.JsonDeserialize; -import com.fasterxml.jackson.databind.annotation.JsonPOJOBuilder; -import com.google.auto.value.AutoValue; +import io.soabase.recordbuilder.core.RecordBuilder; /** * Return from GH advisories endpoint. Used to augment internal CVE data. */ -@AutoValue -@JsonDeserialize(builder = AutoValue_GithubAdvisoriesData.Builder.class) -public abstract class GithubAdvisoriesData { - - public abstract String getCveId(); - - @Nullable - public abstract String getSummary(); - - public abstract Cvss getCvss(); - - public static Builder builder() { - return new AutoValue_GithubAdvisoriesData.Builder(); - } - - @AutoValue.Builder - @JsonPOJOBuilder(withPrefix = "set") - public abstract static class Builder { - - public abstract Builder setCveId(String id); - - public abstract Builder setSummary(@Nullable String summary); - - public abstract Builder setCvss(Cvss cvss); - - public abstract GithubAdvisoriesData build(); - } - - @AutoValue - @JsonDeserialize(builder = AutoValue_GithubAdvisoriesData_Cvss.Builder.class) - public abstract static class Cvss { - - @Nullable - public abstract String getVectorString(); - - @Nullable - public abstract Double getScore(); - - public static Builder builder() { - return new AutoValue_GithubAdvisoriesData_Cvss.Builder(); - } - - @AutoValue.Builder - @JsonPOJOBuilder(withPrefix = "set") - public abstract static class Builder { - - public abstract Builder setVectorString(@Nullable String vector); +@RecordBuilder +public record GithubAdvisoriesData(String cveId, String summary, Cvss cvss) { - public abstract Builder setScore(@Nullable Double score); + @RecordBuilder + public static record Cvss(String vectorString, Double score) { - public abstract Cvss build(); - } } } diff --git a/src/main/java/org/eclipsefoundation/cve/precaches/InternalAdvisoriesPrecacheProvider.java b/src/main/java/org/eclipsefoundation/cve/precaches/InternalAdvisoriesPrecacheProvider.java index d6c8a02..cde3a58 100644 --- a/src/main/java/org/eclipsefoundation/cve/precaches/InternalAdvisoriesPrecacheProvider.java +++ b/src/main/java/org/eclipsefoundation/cve/precaches/InternalAdvisoriesPrecacheProvider.java @@ -33,10 +33,13 @@ import org.eclipsefoundation.cve.helpers.CveIdMatcherHelper; import org.eclipsefoundation.cve.helpers.SummarySourceURIBuilder; import org.eclipsefoundation.cve.model.CveData; import org.eclipsefoundation.cve.model.CveData.Summary; +import org.eclipsefoundation.cve.model.CveDataBuilder; +import org.eclipsefoundation.cve.model.CveDataSummaryBuilder; import org.eclipsefoundation.cve.model.CveProjectData; import org.eclipsefoundation.cve.model.CveProjectData.CvssData; import org.eclipsefoundation.cve.model.CveProjectData.Description; import org.eclipsefoundation.cve.model.CveProjectData.Metric; +import org.eclipsefoundation.cve.model.CveProjectDataDescriptionBuilder; import org.eclipsefoundation.cve.model.GithubAdvisoriesData; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -165,15 +168,15 @@ public class InternalAdvisoriesPrecacheProvider implements LoadingCacheProvider< */ private CveData augmentCveData(CveData orig) { try { - if (StringUtils.isNotBlank(orig.getId())) { + if (StringUtils.isNotBlank(orig.id())) { // Fetch data from each source for augmenting - Optional<CveProjectData> projectData = fetchCveProjectDetails(orig.getId()); - Optional<GithubAdvisoriesData> ghAdvisory = fetchGhAdvisoriesDetails(orig.getId()); + Optional<CveProjectData> projectData = fetchCveProjectDetails(orig.id()); + Optional<GithubAdvisoriesData> ghAdvisory = fetchGhAdvisoriesDetails(orig.id()); - return orig - .toBuilder() - .setSummary(getCveSummary(projectData, ghAdvisory, orig.getId())) - .setCvss(getImpactScore(projectData, ghAdvisory)) + return CveDataBuilder + .builder(orig) + .summary(getCveSummary(projectData, ghAdvisory, orig.id())) + .cvss(getImpactScore(projectData, ghAdvisory)) .build(); } } catch (Exception e) { @@ -199,16 +202,16 @@ public class InternalAdvisoriesPrecacheProvider implements LoadingCacheProvider< // Use CveProject data as primary summary source if (!projectData.isEmpty()) { // Pull descriptions from CveProject data. - Optional<List<Description>> descriptions = projectData.get().getContainers().getCna().getDescriptions(); + Optional<List<Description>> descriptions = projectData.get().containers().cna().descriptions(); if (descriptions.isPresent()) { summary = descriptions .get() .stream() - .filter(dd -> dd.getLang().equalsIgnoreCase("en")) + .filter(dd -> dd.lang().equalsIgnoreCase("en")) .findFirst() - .orElse(Description.builder().build()) - .getValue(); + .orElse(CveProjectDataDescriptionBuilder.builder().build()) + .value(); } source = SummarySourceURIBuilder.buildCveProjectURI(cveId); @@ -216,12 +219,12 @@ public class InternalAdvisoriesPrecacheProvider implements LoadingCacheProvider< // Use advisories data as fallback if present if (StringUtils.isBlank(summary) && !ghAdvisory.isEmpty()) { - summary = ghAdvisory.get().getSummary(); + summary = ghAdvisory.get().summary(); source = SummarySourceURIBuilder.buildGhAdvisoriesURI(cveId); } // Return null if there is still no valid summary - return StringUtils.isNotBlank(summary) && source.isPresent() ? Summary.builder().setContent(summary).setSource(source.get()).build() + return StringUtils.isNotBlank(summary) && source.isPresent() ? CveDataSummaryBuilder.builder().content(summary).source(source.get()).build() : null; } @@ -239,18 +242,18 @@ public class InternalAdvisoriesPrecacheProvider implements LoadingCacheProvider< if (!projectData.isEmpty()) { // Pull metrics from CveProject data. - Optional<List<Metric>> metrics = projectData.get().getContainers().getCna().getMetrics(); + Optional<List<Metric>> metrics = projectData.get().containers().cna().metrics(); if (metrics.isPresent()) { // Get latest metric and pull the score Metric mostRecent = metrics.get().get(0); - CvssData cvss = mostRecent.getCvssV31().orElse(mostRecent.getCvssV30().orElse(mostRecent.getCvssV2().orElse(null))); + CvssData cvss = mostRecent.cvssV31().orElse(mostRecent.cvssV30().orElse(mostRecent.cvssV2().orElse(null))); if (cvss != null) { - impactScore = cvss.getBaseScore(); + impactScore = cvss.baseScore(); } } } // Use GH advisories as fallback if the impact score is still null - return impactScore == null && !ghAdvisory.isEmpty() ? ghAdvisory.get().getCvss().getScore() : impactScore; + return impactScore == null && !ghAdvisory.isEmpty() ? ghAdvisory.get().cvss().score() : impactScore; } } diff --git a/src/main/java/org/eclipsefoundation/cve/resources/CveResource.java b/src/main/java/org/eclipsefoundation/cve/resources/CveResource.java index 2e5006e..0ca16aa 100644 --- a/src/main/java/org/eclipsefoundation/cve/resources/CveResource.java +++ b/src/main/java/org/eclipsefoundation/cve/resources/CveResource.java @@ -102,14 +102,14 @@ public class CveResource { // convert the CVE data to XML entries feed.setEntries(out.stream().map(cve -> { SyndEntry e = new SyndEntryImpl(); - e.setTitle(cve.getId()); - e.setLink(cve.getLiveLink()); - e.setUri(cve.getLiveLink()); - e.setPublishedDate(Date.valueOf(cve.getDatePublished())); + e.setTitle(cve.id()); + e.setLink(cve.liveLink()); + e.setUri(cve.liveLink()); + e.setPublishedDate(Date.valueOf(cve.datePublished())); // only set description if we have a summary - if (cve.getSummary() != null) { + if (cve.summary() != null) { SyndContent desc = new SyndContentImpl(); - desc.setValue(cve.getSummary().getContent()); + desc.setValue(cve.summary().content()); e.setDescription(desc); } return e; @@ -122,8 +122,8 @@ public class CveResource { } }); // check that we properly got data before attempting return - Optional<String> data = cachedFeed.getData(); - if (cachedFeed.getErrorType().isPresent() || data.isEmpty()) { + Optional<String> data = cachedFeed.data(); + if (cachedFeed.errorType().isPresent() || data.isEmpty()) { throw new WebApplicationException("Could not generate RSS for CVE entries"); } return Response.ok(data.get()).build(); @@ -136,7 +136,7 @@ public class CveResource { Optional<CveData> cve = cveSource.getCve(id); // Returns 404 if status isn't "public" - if (cve.isEmpty() || !cve.get().getStatus().equalsIgnoreCase("public")) { + if (cve.isEmpty() || !cve.get().status().equalsIgnoreCase("public")) { throw new NotFoundException(String.format("Unable to find public CVE with id: %s", id)); } diff --git a/src/main/java/org/eclipsefoundation/cve/service/CveService.java b/src/main/java/org/eclipsefoundation/cve/service/CveService.java index ac0a33f..1aece37 100644 --- a/src/main/java/org/eclipsefoundation/cve/service/CveService.java +++ b/src/main/java/org/eclipsefoundation/cve/service/CveService.java @@ -57,7 +57,7 @@ public interface CveService { */ default List<CveData> getForProject(String projectName, boolean includeInternal) { return getCves(includeInternal) - .filter(cve -> cve.getProject().equalsIgnoreCase(projectName)) + .filter(cve -> cve.project().equalsIgnoreCase(projectName)) .toList(); } @@ -68,7 +68,7 @@ public interface CveService { * @return CveData object or null. */ default Optional<CveData> getCve(String id) { - return getCves(false).filter(cve -> cve.getId().equalsIgnoreCase(id)).findFirst(); + return getCves(false).filter(cve -> cve.id().equalsIgnoreCase(id)).findFirst(); } /** @@ -79,6 +79,6 @@ public interface CveService { * @return stream of CVEs filtered on the status. */ default Stream<CveData> getCves(boolean includeInternal) { - return getAllCves().stream().filter(cve -> cve.getStatus().equalsIgnoreCase("public") || includeInternal); + return getAllCves().stream().filter(cve -> cve.status().equalsIgnoreCase("public") || includeInternal); } } diff --git a/src/main/java/org/eclipsefoundation/cve/service/impl/DefaultCveService.java b/src/main/java/org/eclipsefoundation/cve/service/impl/DefaultCveService.java index 6aa4e96..238c2b0 100644 --- a/src/main/java/org/eclipsefoundation/cve/service/impl/DefaultCveService.java +++ b/src/main/java/org/eclipsefoundation/cve/service/impl/DefaultCveService.java @@ -14,7 +14,7 @@ package org.eclipsefoundation.cve.service.impl; import java.util.List; -import org.eclipsefoundation.caching.model.ParameterizedCacheKey; +import org.eclipsefoundation.caching.model.ParameterizedCacheKeyBuilder; import org.eclipsefoundation.caching.service.LoadingCacheManager; import org.eclipsefoundation.cve.model.CveData; import org.eclipsefoundation.cve.service.CveService; @@ -26,8 +26,8 @@ import jakarta.inject.Inject; import jakarta.ws.rs.core.MultivaluedHashMap; /** - * Default implementation of the CVE Service. Uses loading caches to reduce - * delays from slower fetching and processing of raw data from public APIs. + * Default implementation of the CVE Service. Uses loading caches to reduce delays from slower fetching and processing of raw data from + * public APIs. * * @author Martin Lowe, Zachary Sabourin * @@ -42,9 +42,7 @@ public class DefaultCveService implements CveService { @Override public List<CveData> getAllCves() { LOGGER.debug("Fetching internal advisories data"); - return cacheManager.getList(ParameterizedCacheKey.builder() - .setId("all") - .setClazz(CveData.class) - .setParams(new MultivaluedHashMap<>()).build()); + return cacheManager + .getList(ParameterizedCacheKeyBuilder.builder().id("all").clazz(CveData.class).params(new MultivaluedHashMap<>()).build()); } } diff --git a/src/test/java/org/eclipsefoundation/cve/test/api/MockGithubCveAPI.java b/src/test/java/org/eclipsefoundation/cve/test/api/MockGithubCveAPI.java index 3716c21..6331456 100644 --- a/src/test/java/org/eclipsefoundation/cve/test/api/MockGithubCveAPI.java +++ b/src/test/java/org/eclipsefoundation/cve/test/api/MockGithubCveAPI.java @@ -21,14 +21,16 @@ import org.eclipsefoundation.cve.api.GithubCveAPI; import org.eclipsefoundation.cve.api.models.CveProjectRequestParams; import org.eclipsefoundation.cve.api.models.GithubAdvisoriesRequestParams; import org.eclipsefoundation.cve.model.CveProjectData; -import org.eclipsefoundation.cve.model.CveProjectData.Cna; -import org.eclipsefoundation.cve.model.CveProjectData.Containers; -import org.eclipsefoundation.cve.model.CveProjectData.CvssData; -import org.eclipsefoundation.cve.model.CveProjectData.Description; -import org.eclipsefoundation.cve.model.CveProjectData.Metadata; -import org.eclipsefoundation.cve.model.CveProjectData.Metric; +import org.eclipsefoundation.cve.model.CveProjectDataBuilder; +import org.eclipsefoundation.cve.model.CveProjectDataCnaBuilder; +import org.eclipsefoundation.cve.model.CveProjectDataContainersBuilder; +import org.eclipsefoundation.cve.model.CveProjectDataCvssDataBuilder; +import org.eclipsefoundation.cve.model.CveProjectDataDescriptionBuilder; +import org.eclipsefoundation.cve.model.CveProjectDataMetadataBuilder; +import org.eclipsefoundation.cve.model.CveProjectDataMetricBuilder; import org.eclipsefoundation.cve.model.GithubAdvisoriesData; -import org.eclipsefoundation.cve.model.GithubAdvisoriesData.Cvss; +import org.eclipsefoundation.cve.model.GithubAdvisoriesDataBuilder; +import org.eclipsefoundation.cve.model.GithubAdvisoriesDataCvssBuilder; import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.ObjectMapper; @@ -42,73 +44,85 @@ import jakarta.inject.Inject; @ApplicationScoped public class MockGithubCveAPI implements GithubCveAPI { - private List<GithubAdvisoriesData> ghAdvisories; - private List<CveProjectData> cveProjectDatas; + private List<GithubAdvisoriesData> ghAdvisories; + private List<CveProjectData> cveProjectDatas; - @Inject - ObjectMapper om; + @Inject + ObjectMapper om; - public MockGithubCveAPI() { - this.ghAdvisories = new ArrayList<>(Arrays.asList( - GithubAdvisoriesData.builder() - .setCveId("CVE-2020-27225") - .setSummary("Here is a description of this CVE") - .setCvss(Cvss.builder() - .setVectorString("Vector") - .setScore(4.2).build()) - .build(), - GithubAdvisoriesData.builder() - .setCveId("CVE-2022-0103") - .setSummary("Here is description of this CVE") - .setCvss(Cvss.builder() - .setVectorString("Vector") - .setScore(9.0).build()) - .build())); + public MockGithubCveAPI() { + this.ghAdvisories = new ArrayList<>(Arrays + .asList(GithubAdvisoriesDataBuilder + .builder() + .cveId("CVE-2020-27225") + .summary("Here is a description of this CVE") + .cvss(GithubAdvisoriesDataCvssBuilder.builder().vectorString("Vector").score(4.2).build()) + .build(), + GithubAdvisoriesDataBuilder + .builder() + .cveId("CVE-2022-0103") + .summary("Here is description of this CVE") + .cvss(GithubAdvisoriesDataCvssBuilder.builder().vectorString("Vector").score(9.0).build()) + .build())); - // one entry with no desc, one with no score. Used to test advisories fallback - this.cveProjectDatas = new ArrayList<>(Arrays.asList( - CveProjectData.builder() - .setCveMetadata(Metadata.builder().setCveId("CVE-2020-27225").build()) - .setContainers(Containers.builder() - .setCna(Cna.builder() - .setDescriptions(Optional.of(Arrays.asList(Description.builder() - .setValue("Here is a description of this CVE") - .build()))) - .setMetrics(Optional.empty()) - .build()) - .build()) - .build(), - CveProjectData.builder() - .setCveMetadata(Metadata.builder().setCveId("CVE-2022-0103").build()) - .setContainers(Containers.builder() - .setCna(Cna.builder() - .setDescriptions(Optional.empty()) - .setMetrics(Optional.of(Arrays.asList(Metric.builder() - .setCvssV31(Optional.of(CvssData.builder() - .setBaseScore(9.0) - .setVectorString("Vector") - .build())) - .build()))) - .build()) - .build()) - .build())); - } + // one entry with no desc, one with no score. Used to test advisories fallback + this.cveProjectDatas = new ArrayList<>(Arrays + .asList(CveProjectDataBuilder + .builder() + .cveMetadata(CveProjectDataMetadataBuilder.builder().cveId("CVE-2020-27225").build()) + .containers(CveProjectDataContainersBuilder + .builder() + .cna(CveProjectDataCnaBuilder + .builder() + .descriptions(Optional + .of(Arrays + .asList(CveProjectDataDescriptionBuilder + .builder() + .value("Here is a description of this CVE") + .build()))) + .metrics(Optional.empty()) + .build()) + .build()) + .build(), + CveProjectDataBuilder + .builder() + .cveMetadata(CveProjectDataMetadataBuilder.builder().cveId("CVE-2022-0103").build()) + .containers(CveProjectDataContainersBuilder + .builder() + .cna(CveProjectDataCnaBuilder + .builder() + .descriptions(Optional.empty()) + .metrics(Optional + .of(Arrays + .asList(CveProjectDataMetricBuilder + .builder() + .cvssV31(Optional + .of(CveProjectDataCvssDataBuilder + .builder() + .baseScore(9.0) + .vectorString("Vector") + .build())) + .build()))) + .build()) + .build()) + .build())); + } - @Override - public List<GithubAdvisoriesData> getGhAdvisoriesDetails(GithubAdvisoriesRequestParams params) { - return ghAdvisories.stream().filter(cve -> cve.getCveId().equalsIgnoreCase(params.cveId)) - .toList(); - } + @Override + public List<GithubAdvisoriesData> getGhAdvisoriesDetails(GithubAdvisoriesRequestParams params) { + return ghAdvisories.stream().filter(cve -> cve.cveId().equalsIgnoreCase(params.cveId)).toList(); + } - @Override - public String getCveProjectDetails(CveProjectRequestParams params) { - try { - return om.writeValueAsString( - cveProjectDatas.stream() - .filter(cve -> cve.getCveMetadata().getCveId().equalsIgnoreCase(params.cveId)) - .findFirst()); - } catch (JsonProcessingException e) { - throw new RuntimeException("Could not fetch test GH CVE data", e); - } - } + @Override + public String getCveProjectDetails(CveProjectRequestParams params) { + try { + return om + .writeValueAsString(cveProjectDatas + .stream() + .filter(cve -> cve.cveMetadata().cveId().equalsIgnoreCase(params.cveId)) + .findFirst()); + } catch (JsonProcessingException e) { + throw new RuntimeException("Could not fetch test GH CVE data", e); + } + } } diff --git a/src/test/java/org/eclipsefoundation/cve/test/api/MockGitlabCveAPI.java b/src/test/java/org/eclipsefoundation/cve/test/api/MockGitlabCveAPI.java index d5ffd88..65a9f5b 100644 --- a/src/test/java/org/eclipsefoundation/cve/test/api/MockGitlabCveAPI.java +++ b/src/test/java/org/eclipsefoundation/cve/test/api/MockGitlabCveAPI.java @@ -17,6 +17,7 @@ import org.eclipse.microprofile.rest.client.inject.RestClient; import org.eclipsefoundation.cve.api.GitlabCveAPI; import org.eclipsefoundation.cve.api.models.GitlabRequestParams; import org.eclipsefoundation.cve.model.CveData; +import org.eclipsefoundation.cve.model.CveDataBuilder; import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.ObjectMapper; @@ -37,43 +38,42 @@ public class MockGitlabCveAPI implements GitlabCveAPI { public MockGitlabCveAPI() { this.internal = new CveData[] { - CveData + CveDataBuilder .builder() - .setId("CVE-2020-27225") - .setDatePublished(LocalDate.now()) - .setProject("eclipse.platform") - .setRequestLink("https://bugs.eclipse.org/bugs/show_bug.cgi?id=569855") - .setCvePullRequest("https://github.com/CVEProject/cvelist/pull/1012") - .setStatus("PUBLIC") + .id("CVE-2020-27225") + .datePublished(LocalDate.now()) + .project("eclipse.platform") + .requestLink("https://bugs.eclipse.org/bugs/show_bug.cgi?id=569855") + .cvePullRequest("https://github.com/CVEProject/cvelist/pull/1012") + .status("PUBLIC") .build(), - CveData + CveDataBuilder .builder() - .setId("CVE-2022-0103") - .setDatePublished(LocalDate.now()) - .setProject("technology.dash") - .setRequestLink("https://bugs.eclipse.org/bugs/show_bug.cgi?id=1") - .setCvePullRequest("") - .setStatus("PUBLIC") + .id("CVE-2022-0103") + .datePublished(LocalDate.now()) + .project("technology.dash") + .requestLink("https://bugs.eclipse.org/bugs/show_bug.cgi?id=1") + .cvePullRequest("") + .status("PUBLIC") .build(), - CveData + CveDataBuilder .builder() - .setId("CVE-2022-0104") - .setDatePublished(LocalDate.now()) - .setProject("technology.dash") - .setRequestLink("https://bugs.eclipse.org/bugs/show_bug.cgi?id=2") - .setCvePullRequest("") - .setStatus("RESERVED") + .id("CVE-2022-0104") + .datePublished(LocalDate.now()) + .project("technology.dash") + .requestLink("https://bugs.eclipse.org/bugs/show_bug.cgi?id=2") + .cvePullRequest("") + .status("RESERVED") .build(), - CveData + CveDataBuilder .builder() - .setId("CVE-2022-0105") - .setDatePublished(LocalDate.now()) - .setProject("technology.test") - .setRequestLink("https://bugs.eclipse.org/bugs/show_bug.cgi?id=3") - .setCvePullRequest("") - .setStatus("PUBLIC") - .build() - }; + .id("CVE-2022-0105") + .datePublished(LocalDate.now()) + .project("technology.test") + .requestLink("https://bugs.eclipse.org/bugs/show_bug.cgi?id=3") + .cvePullRequest("") + .status("PUBLIC") + .build() }; } @Override -- GitLab