Skip to content

Commit 3572e3c

Browse files
authored
Merge pull request #218 from ruromero/oss-auth-error
fix: issue with invalid oss-index credentials
2 parents 3278baa + 47c52e0 commit 3572e3c

File tree

7 files changed

+68
-31
lines changed

7 files changed

+68
-31
lines changed

src/main/java/com/redhat/exhort/integration/providers/ProviderResponseHandler.java

Lines changed: 11 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,7 @@
4848
import com.redhat.exhort.model.CvssScoreComparable.DependencyScoreComparator;
4949
import com.redhat.exhort.model.CvssScoreComparable.TransitiveScoreComparator;
5050
import com.redhat.exhort.model.DependencyTree;
51+
import com.redhat.exhort.model.ProviderResponse;
5152
import com.redhat.exhort.monitoring.MonitoringProcessor;
5253

5354
import io.quarkus.runtime.annotations.RegisterForReflection;
@@ -66,7 +67,7 @@ public abstract class ProviderResponseHandler {
6667

6768
protected abstract String getProviderName();
6869

69-
public abstract Map<String, List<Issue>> responseToIssues(
70+
public abstract ProviderResponse responseToIssues(
7071
byte[] response, String privateProviders, DependencyTree tree) throws IOException;
7172

7273
protected ProviderStatus defaultOkStatus(String provider) {
@@ -111,9 +112,9 @@ public void processResponseError(Exchange exchange) {
111112
.code(Response.Status.INTERNAL_SERVER_ERROR.getStatusCode());
112113
LOGGER.warn("Unable to process request to: {}", getProviderName(), cause);
113114
}
114-
ProviderReport report = new ProviderReport().status(status).sources(Collections.emptyMap());
115+
ProviderResponse response = new ProviderResponse(null, status);
115116
monitoringProcessor.processProviderError(exchange, exception, getProviderName());
116-
exchange.getMessage().setBody(report);
117+
exchange.getMessage().setBody(response);
117118
}
118119

119120
public void processTokenFallBack(Exchange exchange) {
@@ -153,9 +154,9 @@ private static String prettifyHttpError(HttpOperationFailedException httpExcepti
153154
};
154155
}
155156

156-
public Map<String, List<Issue>> emptyResponse(
157+
public ProviderResponse emptyResponse(
157158
@ExchangeProperty(Constants.DEPENDENCY_TREE_PROPERTY) DependencyTree tree) {
158-
return Collections.emptyMap();
159+
return new ProviderResponse(Collections.emptyMap(), null);
159160
}
160161

161162
private Map<String, Map<String, List<Issue>>> splitIssuesBySource(
@@ -188,11 +189,14 @@ private Map<String, Map<String, List<Issue>>> splitIssuesBySource(
188189
}
189190

190191
public ProviderReport buildReport(
191-
@Body Map<String, List<Issue>> issuesData,
192+
@Body ProviderResponse response,
192193
@ExchangeProperty(Constants.DEPENDENCY_TREE_PROPERTY) DependencyTree tree,
193194
@ExchangeProperty(Constants.PROVIDER_PRIVATE_DATA_PROPERTY) String privateProviders)
194195
throws IOException {
195-
var sourcesIssues = splitIssuesBySource(issuesData);
196+
if (response.status() != null) {
197+
return new ProviderReport().status(response.status()).sources(Collections.emptyMap());
198+
}
199+
var sourcesIssues = splitIssuesBySource(response.issues());
196200
Map<String, Source> reports = new HashMap<>();
197201
sourcesIssues
198202
.keySet()

src/main/java/com/redhat/exhort/integration/providers/ossindex/OssIndexIntegration.java

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,6 @@
2525
import org.apache.camel.Exchange;
2626
import org.apache.camel.builder.AggregationStrategies;
2727
import org.apache.camel.builder.endpoint.EndpointRouteBuilder;
28-
import org.apache.camel.http.base.HttpOperationFailedException;
2928
import org.eclipse.microprofile.config.inject.ConfigProperty;
3029

3130
import com.redhat.exhort.integration.Constants;
@@ -69,7 +68,6 @@ public void configure() {
6968

7069
from(direct("ossSplitReq"))
7170
.routeId("ossSplitReq")
72-
.doTry()
7371
.split(body(), AggregationStrategies.beanAllowNull(OssIndexResponseHandler.class, "aggregateSplit"))
7472
.parallelProcessing()
7573
.transform().method(OssIndexRequestBuilder.class, "buildRequest")
@@ -81,10 +79,8 @@ public void configure() {
8179
.end()
8280
.to(vertxHttp("{{api.ossindex.host}}"))
8381
.transform(method(OssIndexResponseHandler.class, "responseToIssues"))
84-
.end()
85-
.endDoTry()
86-
.doCatch(HttpOperationFailedException.class)
87-
.process(responseHandler::processResponseError);
82+
.onFallback()
83+
.process(responseHandler::processResponseError);
8884

8985
from(direct("ossValidateCredentials"))
9086
.routeId("ossValidateCredentials")

src/main/java/com/redhat/exhort/integration/providers/ossindex/OssIndexResponseHandler.java

Lines changed: 12 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@
4040
import com.redhat.exhort.integration.providers.ProviderResponseHandler;
4141
import com.redhat.exhort.model.CvssParser;
4242
import com.redhat.exhort.model.DependencyTree;
43+
import com.redhat.exhort.model.ProviderResponse;
4344

4445
import io.quarkus.runtime.annotations.RegisterForReflection;
4546

@@ -54,34 +55,37 @@ public class OssIndexResponseHandler extends ProviderResponseHandler {
5455

5556
@Inject ObjectMapper mapper = ObjectMapperProducer.newInstance();
5657

57-
public Map<String, List<Issue>> aggregateSplit(
58-
Map<String, List<Issue>> oldExchange, Map<String, List<Issue>> newExchange)
58+
public ProviderResponse aggregateSplit(ProviderResponse oldExchange, ProviderResponse newExchange)
5959
throws IOException {
6060
if (oldExchange == null) {
6161
return newExchange;
6262
}
63+
if (oldExchange.status() != null && !Boolean.TRUE.equals(oldExchange.status().getOk())) {
64+
return oldExchange;
65+
}
6366
oldExchange
67+
.issues()
6468
.entrySet()
6569
.forEach(
6670
e -> {
67-
var issues = newExchange.get(e.getKey());
71+
var issues = newExchange.issues().get(e.getKey());
6872
if (issues != null) {
6973
e.getValue().addAll(issues);
7074
}
7175
});
72-
newExchange.keySet().stream()
73-
.filter(k -> !oldExchange.keySet().contains(k))
76+
newExchange.issues().keySet().stream()
77+
.filter(k -> !oldExchange.issues().keySet().contains(k))
7478
.forEach(
7579
k -> {
76-
oldExchange.put(k, newExchange.get(k));
80+
oldExchange.issues().put(k, newExchange.issues().get(k));
7781
});
7882
return oldExchange;
7983
}
8084

81-
public Map<String, List<Issue>> responseToIssues(
85+
public ProviderResponse responseToIssues(
8286
@Body byte[] response, String privateProviders, DependencyTree tree) throws IOException {
8387
var json = (ArrayNode) mapper.readTree(response);
84-
return getIssues(json);
88+
return new ProviderResponse(getIssues(json), null);
8589
}
8690

8791
private Map<String, List<Issue>> getIssues(ArrayNode response) {

src/main/java/com/redhat/exhort/integration/providers/snyk/SnykIntegration.java

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -64,13 +64,14 @@ public void configure() {
6464
.process(this::processDepGraphRequest)
6565
.to(direct("snykRequest"))
6666
.onFallback()
67-
.process(responseHandler::processResponseError);
67+
.process(responseHandler::processResponseError)
68+
.end()
69+
.transform().method(SnykResponseHandler.class, "buildReport");
6870

6971
from(direct("snykRequest"))
7072
.routeId("snykRequest")
7173
.to(vertxHttp("{{api.snyk.host}}"))
72-
.transform().method(SnykResponseHandler.class, "responseToIssues")
73-
.transform().method(SnykResponseHandler.class, "buildReport");
74+
.transform().method(SnykResponseHandler.class, "responseToIssues");
7475

7576
from(direct("snykValidateToken"))
7677
.routeId("snykValidateToken")

src/main/java/com/redhat/exhort/integration/providers/snyk/SnykResponseHandler.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@
4141
import com.redhat.exhort.integration.providers.ProviderResponseHandler;
4242
import com.redhat.exhort.model.CvssParser;
4343
import com.redhat.exhort.model.DependencyTree;
44+
import com.redhat.exhort.model.ProviderResponse;
4445

4546
import io.quarkus.runtime.annotations.RegisterForReflection;
4647

@@ -56,15 +57,15 @@ public class SnykResponseHandler extends ProviderResponseHandler {
5657
"Sign up for a Snyk account to learn aboutn the vulnerabilities found";
5758
@Inject ObjectMapper mapper = ObjectMapperProducer.newInstance();
5859

59-
public Map<String, List<Issue>> responseToIssues(
60+
public ProviderResponse responseToIssues(
6061
@Body byte[] providerResponse,
6162
@ExchangeProperty(Constants.PROVIDER_PRIVATE_DATA_PROPERTY) String privateProviders,
6263
@ExchangeProperty(Constants.DEPENDENCY_TREE_PROPERTY) DependencyTree tree)
6364
throws IOException {
6465
var filterUnique = privateProviders != null && privateProviders.contains(SNYK_PROVIDER);
6566

6667
var snykResponse = mapper.readTree((byte[]) providerResponse);
67-
return getIssues(snykResponse, filterUnique, tree);
68+
return new ProviderResponse(getIssues(snykResponse, filterUnique, tree), null);
6869
}
6970

7071
private Map<String, List<Issue>> getIssues(
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
/*
2+
* Copyright 2023 Red Hat, Inc. and/or its affiliates
3+
* and other contributors as indicated by the @author tags.
4+
*
5+
* Licensed under the Apache License, Version 2.0 (the "License");
6+
* you may not use this file except in compliance with the License.
7+
* You may obtain a copy of the License at
8+
*
9+
* http://www.apache.org/licenses/LICENSE-2.0
10+
*
11+
* Unless required by applicable law or agreed to in writing, software
12+
* distributed under the License is distributed on an "AS IS" BASIS,
13+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14+
*
15+
* See the License for the specific language governing permissions and
16+
* limitations under the License.
17+
*/
18+
19+
package com.redhat.exhort.model;
20+
21+
import java.util.List;
22+
import java.util.Map;
23+
24+
import com.redhat.exhort.api.v4.Issue;
25+
import com.redhat.exhort.api.v4.ProviderStatus;
26+
27+
public record ProviderResponse(Map<String, List<Issue>> issues, ProviderStatus status) {}

src/test/java/com/redhat/exhort/integration/providers/ProviderResponseHandlerTest.java

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,7 @@
4444
import com.redhat.exhort.integration.Constants;
4545
import com.redhat.exhort.model.DependencyTree;
4646
import com.redhat.exhort.model.DirectDependency;
47+
import com.redhat.exhort.model.ProviderResponse;
4748

4849
import jakarta.ws.rs.core.Response;
4950

@@ -59,7 +60,8 @@ public void testSummary(
5960
throws IOException {
6061

6162
ProviderResponseHandler handler = new TestResponseHandler();
62-
ProviderReport response = handler.buildReport(issuesData, tree, null);
63+
ProviderReport response =
64+
handler.buildReport(new ProviderResponse(issuesData, null), tree, null);
6365
assertOkStatus(response);
6466
SourceSummary summary = getValidSource(response).getSummary();
6567

@@ -108,7 +110,7 @@ public void testFilterDepsWithoutIssues() throws IOException {
108110
Map<String, List<Issue>> issues = Map.of("pkg:npm/aa@1", List.of(buildIssue(1, 5f)));
109111
ProviderResponseHandler handler = new TestResponseHandler();
110112
DependencyTree tree = buildTree();
111-
ProviderReport response = handler.buildReport(issues, tree, null);
113+
ProviderReport response = handler.buildReport(new ProviderResponse(issues, null), tree, null);
112114
assertOkStatus(response);
113115
assertEquals(1, response.getSources().size());
114116
Source report = response.getSources().get(TEST_SOURCE);
@@ -127,7 +129,8 @@ public void testFilterTransitiveWithoutIssues() throws IOException {
127129
"pkg:npm/aba@1", List.of(buildIssue(3, 8f)));
128130
ProviderResponseHandler handler = new TestResponseHandler();
129131

130-
ProviderReport response = handler.buildReport(issues, buildTree(), null);
132+
ProviderReport response =
133+
handler.buildReport(new ProviderResponse(issues, null), buildTree(), null);
131134

132135
assertOkStatus(response);
133136

@@ -178,7 +181,8 @@ public void testSorted() throws IOException {
178181
"pkg:npm/abc@1", List.of(buildIssue(7, 6f)));
179182
ProviderResponseHandler handler = new TestResponseHandler();
180183

181-
ProviderReport response = handler.buildReport(issues, buildTree(), null);
184+
ProviderReport response =
185+
handler.buildReport(new ProviderResponse(issues, null), buildTree(), null);
182186

183187
assertOkStatus(response);
184188
DependencyReport reportHighest = getValidSource(response).getDependencies().get(0);
@@ -347,7 +351,7 @@ protected String getProviderName() {
347351
}
348352

349353
@Override
350-
public Map<String, List<Issue>> responseToIssues(
354+
public ProviderResponse responseToIssues(
351355
byte[] response, String privateProviders, DependencyTree tree) throws IOException {
352356
throw new IllegalArgumentException("not implemented");
353357
}

0 commit comments

Comments
 (0)