|
25 | 25 | import java.io.ByteArrayInputStream; |
26 | 26 | import java.io.IOException; |
27 | 27 | import java.io.InputStream; |
28 | | -import java.lang.reflect.InvocationTargetException; |
29 | 28 | import java.util.AbstractMap; |
| 29 | +import java.util.ArrayList; |
30 | 30 | import java.util.Collections; |
31 | 31 | import java.util.HashMap; |
32 | 32 | import java.util.List; |
|
37 | 37 | import org.apache.camel.Exchange; |
38 | 38 | import org.apache.camel.ExchangeProperty; |
39 | 39 | import org.apache.camel.LoggingLevel; |
| 40 | +import org.apache.camel.builder.AggregationStrategies; |
40 | 41 | import org.apache.camel.builder.endpoint.EndpointRouteBuilder; |
41 | 42 | import org.apache.camel.component.micrometer.MicrometerConstants; |
42 | 43 | import org.apache.camel.component.micrometer.routepolicy.MicrometerRoutePolicyFactory; |
|
66 | 67 | import jakarta.mail.internet.ContentType; |
67 | 68 | import jakarta.mail.internet.ParseException; |
68 | 69 | import jakarta.ws.rs.ClientErrorException; |
69 | | -import jakarta.ws.rs.NotFoundException; |
70 | 70 | import jakarta.ws.rs.core.MediaType; |
71 | 71 | import jakarta.ws.rs.core.Response; |
72 | 72 | import jakarta.ws.rs.core.Response.Status; |
@@ -272,9 +272,14 @@ public void configure() { |
272 | 272 |
|
273 | 273 | from(direct("findVulnerabilities")) |
274 | 274 | .routeId("findVulnerabilities") |
275 | | - .process(this::setProviderConfiguration) |
276 | | - .toD("direct:trustifyScan") |
277 | | - .process(this::wrapSingleProviderResult) |
| 275 | + .process(this::setProviders) |
| 276 | + .setProperty("originalBody", body()) |
| 277 | + .split(exchangeProperty(Constants.PROVIDERS_PROPERTY), AggregationStrategies.beanAllowNull(ProviderAggregationStrategy.class, "aggregate")) |
| 278 | + .parallelProcessing() |
| 279 | + .process(this::setProviderConfiguration) |
| 280 | + .setBody(exchangeProperty("originalBody")) |
| 281 | + .toD("direct:trustifyScan") |
| 282 | + .end() |
278 | 283 | .transform().method(ProviderAggregationStrategy.class, "toReport"); |
279 | 284 |
|
280 | 285 | from(direct("validateToken")) |
@@ -357,23 +362,24 @@ private SbomParser getSbomParser(Exchange exchange) { |
357 | 362 | return parser; |
358 | 363 | } |
359 | 364 |
|
360 | | - private void handleInvocationTargetException(Exchange exchange) { |
361 | | - Exception ex = exchange.getException(InvocationTargetException.class); |
362 | | - if (ex == null) { |
363 | | - return; |
| 365 | + private void setProviders(Exchange exchange) { |
| 366 | + List<String> providersQuery = exchange.getProperty(Constants.PROVIDERS_PARAM, List.class); |
| 367 | + List<String> providers = new ArrayList<>(); |
| 368 | + if (providersQuery != null && !providersQuery.isEmpty()) { |
| 369 | + for (String provider : providersQuery) { |
| 370 | + var providerName = provider.trim(); |
| 371 | + providers.add(providerName); |
| 372 | + if (!vulnerabilityProvider.isProviderEnabled(providerName)) { |
| 373 | + throw new ClientErrorException( |
| 374 | + "Provider " + providerName + " is not enabled", Response.Status.BAD_REQUEST); |
| 375 | + } |
| 376 | + } |
| 377 | + } |
| 378 | + if (providers.isEmpty()) { |
| 379 | + providers = vulnerabilityProvider.getEnabled(); |
364 | 380 | } |
365 | | - Throwable cause = ex.getCause(); |
366 | | - if (cause instanceof NotFoundException notFound) { |
367 | | - monitoringProcessor.processClientException(exchange); |
368 | | - exchange.getIn().setHeader(Exchange.HTTP_RESPONSE_CODE, Status.NOT_FOUND.getStatusCode()); |
369 | | - exchange.getIn().setHeader(Exchange.CONTENT_TYPE, MediaType.TEXT_PLAIN); |
370 | | - exchange.getIn().setBody(notFound.getMessage()); |
371 | | - exchange |
372 | | - .getIn() |
373 | | - .setHeader( |
374 | | - Constants.EXHORT_REQUEST_ID_HEADER, |
375 | | - exchange.getProperty(Constants.EXHORT_REQUEST_ID_HEADER)); |
376 | | - exchange.setProperty(Exchange.EXCEPTION_HANDLED, true); |
| 381 | + if (providers != null && !providers.isEmpty()) { |
| 382 | + exchange.setProperty(Constants.PROVIDERS_PROPERTY, providers); |
377 | 383 | } |
378 | 384 | } |
379 | 385 |
|
@@ -428,23 +434,9 @@ public Map<String, AnalysisReport> transformBatchAnalysisReportList( |
428 | 434 | } |
429 | 435 |
|
430 | 436 | private void setProviderConfiguration(Exchange exchange) { |
431 | | - @SuppressWarnings("unchecked") |
432 | | - List<String> providers = exchange.getProperty(Constants.PROVIDERS_PARAM, List.class); |
433 | | - |
434 | | - String provider = (providers != null && !providers.isEmpty()) ? providers.get(0) : "trustify"; |
435 | | - |
| 437 | + var provider = exchange.getIn().getBody(String.class); |
436 | 438 | var config = vulnerabilityProvider.getProviderConfig(provider); |
437 | 439 | exchange.setProperty(Constants.PROVIDER_NAME_PROPERTY, provider); |
438 | 440 | exchange.setProperty(Constants.PROVIDER_CONFIG_PROPERTY, config); |
439 | 441 | } |
440 | | - |
441 | | - private void wrapSingleProviderResult(Exchange exchange) { |
442 | | - var providerReport = |
443 | | - exchange.getIn().getBody(io.github.guacsec.trustifyda.api.v5.ProviderReport.class); |
444 | | - if (providerReport != null) { |
445 | | - Map<String, io.github.guacsec.trustifyda.api.v5.ProviderReport> result = new HashMap<>(); |
446 | | - result.put(providerReport.getStatus().getName(), providerReport); |
447 | | - exchange.getIn().setBody(result); |
448 | | - } |
449 | | - } |
450 | 442 | } |
0 commit comments