Skip to content

Commit 1de7648

Browse files
authored
fix: unable to configure multiple trustify endpoints (#580)
* fix: unable to configure multiple trustify endpoints Signed-off-by: Ruben Romero Montes <rromerom@redhat.com> * fix: allow comma-separated values for query providers Signed-off-by: Ruben Romero Montes <rromerom@redhat.com> --------- Signed-off-by: Ruben Romero Montes <rromerom@redhat.com>
1 parent 3003b47 commit 1de7648

File tree

4 files changed

+43
-39
lines changed

4 files changed

+43
-39
lines changed

src/main/java/io/github/guacsec/trustifyda/integration/backend/ExhortIntegration.java

Lines changed: 28 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -25,8 +25,8 @@
2525
import java.io.ByteArrayInputStream;
2626
import java.io.IOException;
2727
import java.io.InputStream;
28-
import java.lang.reflect.InvocationTargetException;
2928
import java.util.AbstractMap;
29+
import java.util.ArrayList;
3030
import java.util.Collections;
3131
import java.util.HashMap;
3232
import java.util.List;
@@ -37,6 +37,7 @@
3737
import org.apache.camel.Exchange;
3838
import org.apache.camel.ExchangeProperty;
3939
import org.apache.camel.LoggingLevel;
40+
import org.apache.camel.builder.AggregationStrategies;
4041
import org.apache.camel.builder.endpoint.EndpointRouteBuilder;
4142
import org.apache.camel.component.micrometer.MicrometerConstants;
4243
import org.apache.camel.component.micrometer.routepolicy.MicrometerRoutePolicyFactory;
@@ -66,7 +67,6 @@
6667
import jakarta.mail.internet.ContentType;
6768
import jakarta.mail.internet.ParseException;
6869
import jakarta.ws.rs.ClientErrorException;
69-
import jakarta.ws.rs.NotFoundException;
7070
import jakarta.ws.rs.core.MediaType;
7171
import jakarta.ws.rs.core.Response;
7272
import jakarta.ws.rs.core.Response.Status;
@@ -272,9 +272,14 @@ public void configure() {
272272

273273
from(direct("findVulnerabilities"))
274274
.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()
278283
.transform().method(ProviderAggregationStrategy.class, "toReport");
279284

280285
from(direct("validateToken"))
@@ -357,23 +362,24 @@ private SbomParser getSbomParser(Exchange exchange) {
357362
return parser;
358363
}
359364

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();
364380
}
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);
377383
}
378384
}
379385

@@ -428,23 +434,9 @@ public Map<String, AnalysisReport> transformBatchAnalysisReportList(
428434
}
429435

430436
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);
436438
var config = vulnerabilityProvider.getProviderConfig(provider);
437439
exchange.setProperty(Constants.PROVIDER_NAME_PROPERTY, provider);
438440
exchange.setProperty(Constants.PROVIDER_CONFIG_PROPERTY, config);
439441
}
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-
}
450442
}

src/main/java/io/github/guacsec/trustifyda/integration/providers/ProviderAggregationStrategy.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,7 @@ public AnalysisReport toReport(
4848

4949
var scanned = new Scanned().direct(tree.directCount()).transitive(tree.transitiveCount());
5050
scanned.total(scanned.getDirect() + scanned.getTransitive());
51+
5152
return new AnalysisReport().providers(reports).scanned(scanned);
5253
}
5354
}

src/main/java/io/github/guacsec/trustifyda/integration/providers/VulnerabilityProvider.java

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,8 +17,11 @@
1717

1818
package io.github.guacsec.trustifyda.integration.providers;
1919

20+
import java.io.UnsupportedEncodingException;
2021
import java.net.URISyntaxException;
22+
import java.net.URLDecoder;
2123
import java.util.ArrayList;
24+
import java.util.Arrays;
2225
import java.util.Collections;
2326
import java.util.HashMap;
2427
import java.util.List;
@@ -183,8 +186,16 @@ private List<String> getProviders(Map<String, Object> props) {
183186
if (o == null) {
184187
return null;
185188
}
186-
if (o instanceof String string) {
187-
return List.of(string);
189+
if (o instanceof String providersQuery) {
190+
try {
191+
providersQuery = URLDecoder.decode(providersQuery, "UTF-8");
192+
} catch (UnsupportedEncodingException e) {
193+
throw new ClientErrorException("Unsupported providers: " + providersQuery, 422);
194+
}
195+
if (providersQuery.contains(",")) {
196+
return Arrays.asList(providersQuery.split(","));
197+
}
198+
return List.of(providersQuery);
188199
}
189200
if (o instanceof List<?> list) {
190201
return (List<String>) list;

src/main/resources/application.properties

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ project.build=${timestamp}
88

99

1010
# Trustify Provider Configuration
11-
# provider.trustify.host=${TRUSTIFY_HOST:https://trust.rhcloud.com/api/v2/}
11+
# provider.trustify.host=${TRUSTIFY_HOST:https://trust.rhcloud.com/}
1212
# provider.trustify.auth.server-url=${TRUSTIFY_AUTH_SERVER_URL}
1313
# provider.trustify.auth.client-id=${TRUSTIFY_CLIENT_ID}
1414
# provider.trustify.auth.client-secret=${TRUSTIFY_CLIENT_SECRET}

0 commit comments

Comments
 (0)