Skip to content

Commit 250ca09

Browse files
chore(deps-dev): Bump org.openapitools:openapi-generator-maven-plugin from 7.17.0 to 7.21.0 (#1927)
* chore(deps-dev): Bump org.openapitools:openapi-generator-maven-plugin Bumps org.openapitools:openapi-generator-maven-plugin from 7.17.0 to 7.21.0. --- updated-dependencies: - dependency-name: org.openapitools:openapi-generator-maven-plugin dependency-version: 7.21.0 dependency-type: direct:development update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] <support@github.com> * Handle breaking change in openapi-generator The generator reverted a previous breaking change where `@Path` annotations were only generated at the method level. It now generates them at the interface level again, which causes conflicts when endpoints sharing the same path use different tags. Signed-off-by: nscuro <nscuro@protonmail.com> * Increase assertion timeouts in notification relay test Contention in CI test runs can cause things to be slower at times. Signed-off-by: nscuro <nscuro@protonmail.com> --------- Signed-off-by: dependabot[bot] <support@github.com> Signed-off-by: nscuro <nscuro@protonmail.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: nscuro <nscuro@protonmail.com>
1 parent eb08953 commit 250ca09

15 files changed

Lines changed: 112 additions & 114 deletions

api/pom.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -69,7 +69,7 @@
6969
<plugin>
7070
<groupId>org.openapitools</groupId>
7171
<artifactId>openapi-generator-maven-plugin</artifactId>
72-
<version>7.17.0</version>
72+
<version>7.21.0</version>
7373
<executions>
7474
<execution>
7575
<id>generate-api-v2</id>

api/src/main/openapi/openapi.yaml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -133,8 +133,8 @@ paths:
133133
$ref: "./paths/metrics_vulnerabilities.yaml"
134134
/projects/{uuid}/advisories:
135135
$ref: "./paths/projects__uuid__advisories.yaml"
136-
/projects/{projectUuid}/advisories/{advisoryId}/findings:
137-
$ref: "./paths/projects__projectUuid__advisories__advisoryId__findings.yaml"
136+
/projects/{uuid}/advisories/{advisoryId}/findings:
137+
$ref: "./paths/projects__uuid__advisories__advisoryId__findings.yaml"
138138
/projects/{uuid}/clone:
139139
$ref: "./paths/projects__uuid__clone.yaml"
140140
/projects/{uuid}/components:

api/src/main/openapi/paths/projects__uuid__advisories.yaml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ get:
2222
2323
Requires the `VIEW_VULNERABILITY` permission.
2424
tags:
25-
- Advisories
25+
- Projects
2626
parameters:
2727
- name: uuid
2828
in: path

api/src/main/openapi/paths/projects__projectUuid__advisories__advisoryId__findings.yaml renamed to api/src/main/openapi/paths/projects__uuid__advisories__advisoryId__findings.yaml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,9 +19,9 @@ get:
1919
summary: List findings by project and advisory
2020
description: Requires permission <strong>VIEW_VULNERABILITY</strong>
2121
tags:
22-
- Advisories
22+
- Projects
2323
parameters:
24-
- name: projectUuid
24+
- name: uuid
2525
in: path
2626
description: The UUID of the project
2727
required: true

apiserver/src/main/java/org/dependencytrack/resources/v2/AdvisoriesResource.java

Lines changed: 2 additions & 83 deletions
Original file line numberDiff line numberDiff line change
@@ -21,15 +21,12 @@
2121
import alpine.server.auth.PermissionRequired;
2222
import io.csaf.retrieval.RetrievedDocument;
2323
import jakarta.ws.rs.NotFoundException;
24-
import jakarta.ws.rs.Path;
2524
import jakarta.ws.rs.core.Response;
25+
import jakarta.ws.rs.ext.Provider;
2626
import org.dependencytrack.api.v2.AdvisoriesApi;
2727
import org.dependencytrack.api.v2.model.GetAdvisoryResponse;
2828
import org.dependencytrack.api.v2.model.ListAdvisoriesResponse;
2929
import org.dependencytrack.api.v2.model.ListAdvisoriesResponseItem;
30-
import org.dependencytrack.api.v2.model.ListProjectAdvisoriesResponse;
31-
import org.dependencytrack.api.v2.model.ListProjectAdvisoriesResponseItem;
32-
import org.dependencytrack.api.v2.model.ListProjectAdvisoryFindingsResponseItem;
3330
import org.dependencytrack.auth.Permissions;
3431
import org.dependencytrack.common.pagination.Page;
3532
import org.dependencytrack.csaf.CsafModelConverter;
@@ -39,9 +36,6 @@
3936
import org.dependencytrack.persistence.jdbi.AdvisoryDao;
4037
import org.dependencytrack.persistence.jdbi.AdvisoryDao.AdvisoryDetailRow;
4138
import org.dependencytrack.persistence.jdbi.AdvisoryDao.ListAdvisoriesRow;
42-
import org.dependencytrack.persistence.jdbi.AdvisoryDao.ListProjectAdvisoriesRow;
43-
import org.dependencytrack.persistence.jdbi.ProjectDao;
44-
import org.dependencytrack.persistence.jdbi.query.ListAdvisoriesForProjectQuery;
4539
import org.dependencytrack.persistence.jdbi.query.ListAdvisoriesQuery;
4640
import org.dependencytrack.resources.AbstractApiResource;
4741
import org.owasp.security.logging.SecurityMarkers;
@@ -54,7 +48,6 @@
5448
import java.io.UncheckedIOException;
5549
import java.time.Instant;
5650
import java.util.HashSet;
57-
import java.util.List;
5851
import java.util.UUID;
5952

6053
import static org.dependencytrack.persistence.jdbi.JdbiFactory.inJdbiTransaction;
@@ -67,7 +60,7 @@
6760
* @author Christian Banse
6861
* @since 5.7.0
6962
*/
70-
@Path("/")
63+
@Provider
7164
public class AdvisoriesResource extends AbstractApiResource implements AdvisoriesApi {
7265

7366
private static final Logger LOGGER = LoggerFactory.getLogger(AdvisoriesResource.class);
@@ -252,78 +245,4 @@ public Response getAdvisoryById(UUID id) {
252245
return Response.ok(response).build();
253246
}
254247

255-
@Override
256-
@PermissionRequired(Permissions.Constants.VIEW_VULNERABILITY)
257-
public Response listAdvisoriesForProject(UUID projectUuid, String pageToken, Integer limit) {
258-
final Page<ListProjectAdvisoriesRow> projectAdvisories =
259-
inJdbiTransaction(getAlpineRequest(), handle -> {
260-
requireProjectAccess(handle, projectUuid);
261-
262-
final long projectId = handle.attach(ProjectDao.class).getProjectId(projectUuid);
263-
264-
return handle.attach(AdvisoryDao.class).listForProject(
265-
new ListAdvisoriesForProjectQuery(projectId)
266-
.withPageToken(pageToken)
267-
.withLimit(limit));
268-
});
269-
270-
final var responseItems = projectAdvisories.items().stream()
271-
.<ListProjectAdvisoriesResponseItem>map(
272-
advisory -> ListProjectAdvisoriesResponseItem.builder()
273-
.id(advisory.id())
274-
.publisher(advisory.publisher())
275-
.name(advisory.name())
276-
.version(advisory.version())
277-
.url(advisory.url())
278-
.title(advisory.title())
279-
.format(advisory.format())
280-
.seenAt(advisory.seenAt() != null
281-
? advisory.seenAt().toEpochMilli()
282-
: null)
283-
.lastFetched(advisory.lastFetched() != null
284-
? advisory.lastFetched().toEpochMilli()
285-
: null)
286-
.findingsCount(advisory.findingsCount())
287-
.build())
288-
.toList();
289-
290-
final var response = ListProjectAdvisoriesResponse.builder()
291-
.items(responseItems)
292-
.nextPageToken(projectAdvisories.nextPageToken())
293-
.total(convertTotalCount(projectAdvisories.totalCount()))
294-
.build();
295-
296-
return Response.ok(response).build();
297-
}
298-
299-
// TODO: What is the purpose of this endpoint? Do we really need it?
300-
// Can we include this in a more general /findings endpoint and add a filter option
301-
// for advisories, e.g. `/findings?project_uuid=foo&advisory_id=bar`?
302-
@Override
303-
@PermissionRequired(Permissions.Constants.VIEW_VULNERABILITY)
304-
public Response getFindingsByProjectAdvisory(UUID projectUuid, UUID advisoryId) {
305-
return inJdbiTransaction(getAlpineRequest(), handle -> {
306-
requireProjectAccess(handle, projectUuid);
307-
308-
final long projectId = handle.attach(ProjectDao.class).getProjectId(projectUuid);
309-
310-
List<AdvisoryDao.ProjectAdvisoryFindingRow> advisoryRows = handle.attach(AdvisoryDao.class)
311-
.getFindingsByProjectAdvisory(projectId, advisoryId);
312-
final long totalCount = advisoryRows.size();
313-
314-
final List<ListProjectAdvisoryFindingsResponseItem> responseItems = advisoryRows.stream()
315-
.<ListProjectAdvisoryFindingsResponseItem>map(
316-
row -> ListProjectAdvisoryFindingsResponseItem.builder()
317-
.name(row.name())
318-
.confidence((int) row.confidence())
319-
.desc(row.desc())
320-
.group(row.group())
321-
.version(row.version())
322-
.componentUuid(UUID.fromString(row.componentUuid()))
323-
.build())
324-
.toList();
325-
326-
return Response.ok(responseItems).header(TOTAL_COUNT_HEADER, totalCount).build();
327-
});
328-
}
329248
}

apiserver/src/main/java/org/dependencytrack/resources/v2/ComponentsResource.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22,10 +22,10 @@
2222
import jakarta.ws.rs.ClientErrorException;
2323
import jakarta.ws.rs.NotAuthorizedException;
2424
import jakarta.ws.rs.NotFoundException;
25-
import jakarta.ws.rs.Path;
2625
import jakarta.ws.rs.core.Context;
2726
import jakarta.ws.rs.core.Response;
2827
import jakarta.ws.rs.core.UriInfo;
28+
import jakarta.ws.rs.ext.Provider;
2929
import org.apache.commons.lang3.StringUtils;
3030
import org.dependencytrack.api.v2.ComponentsApi;
3131
import org.dependencytrack.api.v2.model.CreateComponentRequest;
@@ -48,7 +48,7 @@
4848
import static org.dependencytrack.resources.v2.mapping.ModelMapper.mapOrganizationalContacts;
4949
import static org.dependencytrack.util.PersistenceUtil.isUniqueConstraintViolation;
5050

51-
@Path("/")
51+
@Provider
5252
public class ComponentsResource extends AbstractApiResource implements ComponentsApi {
5353

5454
private static final Logger LOGGER = LoggerFactory.getLogger(ComponentsResource.class);

apiserver/src/main/java/org/dependencytrack/resources/v2/CsafResource.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22,8 +22,8 @@
2222
import jakarta.inject.Inject;
2323
import jakarta.ws.rs.BadRequestException;
2424
import jakarta.ws.rs.NotFoundException;
25-
import jakarta.ws.rs.Path;
2625
import jakarta.ws.rs.core.Response;
26+
import jakarta.ws.rs.ext.Provider;
2727
import org.dependencytrack.api.v2.CsafApi;
2828
import org.dependencytrack.api.v2.model.CreateCsafAggregatorRequest;
2929
import org.dependencytrack.api.v2.model.CreateCsafProviderRequest;
@@ -59,7 +59,7 @@
5959
*
6060
* @since 5.7.0
6161
*/
62-
@Path("/")
62+
@Provider
6363
public class CsafResource extends AbstractApiResource implements CsafApi {
6464

6565
private static final Logger LOGGER = LoggerFactory.getLogger(CsafResource.class);

apiserver/src/main/java/org/dependencytrack/resources/v2/ExtensionsResource.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -26,8 +26,8 @@
2626
import jakarta.json.Json;
2727
import jakarta.ws.rs.BadRequestException;
2828
import jakarta.ws.rs.NotFoundException;
29-
import jakarta.ws.rs.Path;
3029
import jakarta.ws.rs.core.Response;
30+
import jakarta.ws.rs.ext.Provider;
3131
import org.dependencytrack.api.v2.ExtensionsApi;
3232
import org.dependencytrack.api.v2.model.GetExtensionConfigResponse;
3333
import org.dependencytrack.api.v2.model.ListExtensionPointsResponse;
@@ -69,7 +69,7 @@
6969
/**
7070
* @since 5.7.0
7171
*/
72-
@Path("/")
72+
@Provider
7373
public class ExtensionsResource extends AbstractApiResource implements ExtensionsApi {
7474

7575
private static final Logger LOGGER = LoggerFactory.getLogger(ExtensionsResource.class);

apiserver/src/main/java/org/dependencytrack/resources/v2/MetricsResource.java

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

2121
import alpine.server.auth.PermissionRequired;
22-
import jakarta.ws.rs.Path;
2322
import jakarta.ws.rs.core.Response;
23+
import jakarta.ws.rs.ext.Provider;
2424
import org.dependencytrack.api.v2.MetricsApi;
2525
import org.dependencytrack.api.v2.model.ListVulnerabilityMetricsResponse;
2626
import org.dependencytrack.api.v2.model.ListVulnerabilityMetricsResponseItem;
@@ -34,7 +34,7 @@
3434
import static org.dependencytrack.persistence.jdbi.JdbiFactory.inJdbiTransaction;
3535
import static org.dependencytrack.persistence.jdbi.JdbiFactory.withJdbiHandle;
3636

37-
@Path("/")
37+
@Provider
3838
public class MetricsResource extends AbstractApiResource implements MetricsApi {
3939

4040
@Override

apiserver/src/main/java/org/dependencytrack/resources/v2/ProjectsResource.java

Lines changed: 81 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,34 +20,41 @@
2020

2121
import alpine.server.auth.PermissionRequired;
2222
import jakarta.ws.rs.NotFoundException;
23-
import jakarta.ws.rs.Path;
2423
import jakarta.ws.rs.core.Context;
2524
import jakarta.ws.rs.core.Response;
2625
import jakarta.ws.rs.core.UriInfo;
26+
import jakarta.ws.rs.ext.Provider;
2727
import org.dependencytrack.api.v2.ProjectsApi;
2828
import org.dependencytrack.api.v2.model.CloneProjectInclude;
2929
import org.dependencytrack.api.v2.model.CloneProjectRequest;
3030
import org.dependencytrack.api.v2.model.CloneProjectResponse;
3131
import org.dependencytrack.api.v2.model.ListComponentsResponse;
3232
import org.dependencytrack.api.v2.model.ListComponentsResponseItem;
33+
import org.dependencytrack.api.v2.model.ListProjectAdvisoriesResponse;
34+
import org.dependencytrack.api.v2.model.ListProjectAdvisoriesResponseItem;
35+
import org.dependencytrack.api.v2.model.ListProjectAdvisoryFindingsResponseItem;
3336
import org.dependencytrack.auth.Permissions;
3437
import org.dependencytrack.common.pagination.Page;
3538
import org.dependencytrack.model.Component;
39+
import org.dependencytrack.persistence.jdbi.AdvisoryDao;
40+
import org.dependencytrack.persistence.jdbi.AdvisoryDao.ListProjectAdvisoriesRow;
3641
import org.dependencytrack.persistence.jdbi.ComponentDao;
3742
import org.dependencytrack.persistence.jdbi.ProjectDao;
3843
import org.dependencytrack.persistence.jdbi.command.CloneProjectCommand;
44+
import org.dependencytrack.persistence.jdbi.query.ListAdvisoriesForProjectQuery;
3945
import org.dependencytrack.resources.AbstractApiResource;
4046
import org.owasp.security.logging.SecurityMarkers;
4147
import org.slf4j.Logger;
4248
import org.slf4j.LoggerFactory;
4349

50+
import java.util.List;
4451
import java.util.UUID;
4552

4653
import static org.dependencytrack.persistence.jdbi.JdbiFactory.inJdbiTransaction;
4754
import static org.dependencytrack.resources.v2.mapping.ModelMapper.mapHashes;
4855
import static org.dependencytrack.resources.v2.mapping.ModelMapper.mapLicense;
4956

50-
@Path("/")
57+
@Provider
5158
public class ProjectsResource extends AbstractApiResource implements ProjectsApi {
5259

5360
private static final Logger LOGGER = LoggerFactory.getLogger(ProjectsResource.class);
@@ -136,4 +143,76 @@ public Response cloneProject(final UUID projectUuid, final CloneProjectRequest r
136143
.build();
137144
}
138145

146+
@Override
147+
@PermissionRequired(Permissions.Constants.VIEW_VULNERABILITY)
148+
public Response listAdvisoriesForProject(UUID uuid, String pageToken, Integer limit) {
149+
final Page<ListProjectAdvisoriesRow> projectAdvisories =
150+
inJdbiTransaction(getAlpineRequest(), handle -> {
151+
requireProjectAccess(handle, uuid);
152+
153+
final long projectId = handle.attach(ProjectDao.class).getProjectId(uuid);
154+
155+
return handle.attach(AdvisoryDao.class).listForProject(
156+
new ListAdvisoriesForProjectQuery(projectId)
157+
.withPageToken(pageToken)
158+
.withLimit(limit));
159+
});
160+
161+
final var responseItems = projectAdvisories.items().stream()
162+
.<ListProjectAdvisoriesResponseItem>map(
163+
advisory -> ListProjectAdvisoriesResponseItem.builder()
164+
.id(advisory.id())
165+
.publisher(advisory.publisher())
166+
.name(advisory.name())
167+
.version(advisory.version())
168+
.url(advisory.url())
169+
.title(advisory.title())
170+
.format(advisory.format())
171+
.seenAt(advisory.seenAt() != null
172+
? advisory.seenAt().toEpochMilli()
173+
: null)
174+
.lastFetched(advisory.lastFetched() != null
175+
? advisory.lastFetched().toEpochMilli()
176+
: null)
177+
.findingsCount(advisory.findingsCount())
178+
.build())
179+
.toList();
180+
181+
final var response = ListProjectAdvisoriesResponse.builder()
182+
.items(responseItems)
183+
.nextPageToken(projectAdvisories.nextPageToken())
184+
.total(convertTotalCount(projectAdvisories.totalCount()))
185+
.build();
186+
187+
return Response.ok(response).build();
188+
}
189+
190+
@Override
191+
@PermissionRequired(Permissions.Constants.VIEW_VULNERABILITY)
192+
public Response getFindingsByProjectAdvisory(UUID uuid, UUID advisoryId) {
193+
return inJdbiTransaction(getAlpineRequest(), handle -> {
194+
requireProjectAccess(handle, uuid);
195+
196+
final long projectId = handle.attach(ProjectDao.class).getProjectId(uuid);
197+
198+
List<AdvisoryDao.ProjectAdvisoryFindingRow> advisoryRows = handle.attach(AdvisoryDao.class)
199+
.getFindingsByProjectAdvisory(projectId, advisoryId);
200+
final long totalCount = advisoryRows.size();
201+
202+
final List<ListProjectAdvisoryFindingsResponseItem> responseItems = advisoryRows.stream()
203+
.<ListProjectAdvisoryFindingsResponseItem>map(
204+
row -> ListProjectAdvisoryFindingsResponseItem.builder()
205+
.name(row.name())
206+
.confidence((int) row.confidence())
207+
.desc(row.desc())
208+
.group(row.group())
209+
.version(row.version())
210+
.componentUuid(UUID.fromString(row.componentUuid()))
211+
.build())
212+
.toList();
213+
214+
return Response.ok(responseItems).header(TOTAL_COUNT_HEADER, totalCount).build();
215+
});
216+
}
217+
139218
}

0 commit comments

Comments
 (0)