|
21 | 21 | import alpine.server.auth.PermissionRequired; |
22 | 22 | import io.csaf.retrieval.RetrievedDocument; |
23 | 23 | import jakarta.ws.rs.NotFoundException; |
24 | | -import jakarta.ws.rs.Path; |
25 | 24 | import jakarta.ws.rs.core.Response; |
| 25 | +import jakarta.ws.rs.ext.Provider; |
26 | 26 | import org.dependencytrack.api.v2.AdvisoriesApi; |
27 | 27 | import org.dependencytrack.api.v2.model.GetAdvisoryResponse; |
28 | 28 | import org.dependencytrack.api.v2.model.ListAdvisoriesResponse; |
29 | 29 | 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; |
33 | 30 | import org.dependencytrack.auth.Permissions; |
34 | 31 | import org.dependencytrack.common.pagination.Page; |
35 | 32 | import org.dependencytrack.csaf.CsafModelConverter; |
|
39 | 36 | import org.dependencytrack.persistence.jdbi.AdvisoryDao; |
40 | 37 | import org.dependencytrack.persistence.jdbi.AdvisoryDao.AdvisoryDetailRow; |
41 | 38 | 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; |
45 | 39 | import org.dependencytrack.persistence.jdbi.query.ListAdvisoriesQuery; |
46 | 40 | import org.dependencytrack.resources.AbstractApiResource; |
47 | 41 | import org.owasp.security.logging.SecurityMarkers; |
|
54 | 48 | import java.io.UncheckedIOException; |
55 | 49 | import java.time.Instant; |
56 | 50 | import java.util.HashSet; |
57 | | -import java.util.List; |
58 | 51 | import java.util.UUID; |
59 | 52 |
|
60 | 53 | import static org.dependencytrack.persistence.jdbi.JdbiFactory.inJdbiTransaction; |
|
67 | 60 | * @author Christian Banse |
68 | 61 | * @since 5.7.0 |
69 | 62 | */ |
70 | | -@Path("/") |
| 63 | +@Provider |
71 | 64 | public class AdvisoriesResource extends AbstractApiResource implements AdvisoriesApi { |
72 | 65 |
|
73 | 66 | private static final Logger LOGGER = LoggerFactory.getLogger(AdvisoriesResource.class); |
@@ -252,78 +245,4 @@ public Response getAdvisoryById(UUID id) { |
252 | 245 | return Response.ok(response).build(); |
253 | 246 | } |
254 | 247 |
|
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 | | - } |
329 | 248 | } |
0 commit comments