Skip to content

Commit 6b66423

Browse files
committed
fix: count unique transitive, direct and total independently
Signed-off-by: Ruben Romero Montes <[email protected]>
1 parent f9a51f0 commit 6b66423

File tree

2 files changed

+74
-4
lines changed

2 files changed

+74
-4
lines changed

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

+22-4
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@
2626
import java.util.List;
2727
import java.util.Map;
2828
import java.util.Optional;
29+
import java.util.Set;
2930
import java.util.concurrent.atomic.AtomicInteger;
3031
import java.util.stream.Collectors;
3132

@@ -53,6 +54,7 @@
5354
import com.redhat.exhort.model.CvssScoreComparable.DependencyScoreComparator;
5455
import com.redhat.exhort.model.CvssScoreComparable.TransitiveScoreComparator;
5556
import com.redhat.exhort.model.DependencyTree;
57+
import com.redhat.exhort.model.DirectDependency;
5658
import com.redhat.exhort.model.ProviderResponse;
5759
import com.redhat.exhort.model.trustedcontent.IndexedRecommendation;
5860
import com.redhat.exhort.model.trustedcontent.TrustedContentResponse;
@@ -425,9 +427,21 @@ private SourceSummary buildSummary(
425427
var counter = new VulnerabilityCounter();
426428
var directRefs =
427429
tree.dependencies().keySet().stream().map(PackageRef::ref).collect(Collectors.toSet());
430+
var transitiveRefs =
431+
tree.dependencies().values().stream()
432+
.map(DirectDependency::transitive)
433+
.flatMap(Set::stream)
434+
.map(PackageRef::ref)
435+
.toList();
428436
issuesData
429437
.entrySet()
430-
.forEach(e -> incrementCounter(e.getValue(), counter, directRefs.contains(e.getKey())));
438+
.forEach(
439+
e ->
440+
incrementCounter(
441+
e.getValue(),
442+
counter,
443+
directRefs.contains(e.getKey()),
444+
transitiveRefs.contains(e.getKey())));
431445
Long recommendationsCount =
432446
sourceReport.stream().filter(s -> s.getRecommendation() != null).count();
433447
counter.recommendations.set(recommendationsCount.intValue());
@@ -436,7 +450,7 @@ private SourceSummary buildSummary(
436450
}
437451

438452
private void incrementCounter(
439-
List<Issue> issues, VulnerabilityCounter counter, boolean isDirect) {
453+
List<Issue> issues, VulnerabilityCounter counter, boolean isDirect, boolean isTransitive) {
440454
if (!issues.isEmpty()) {
441455
counter.dependencies.incrementAndGet();
442456
}
@@ -453,6 +467,9 @@ private void incrementCounter(
453467
if (isDirect) {
454468
counter.direct.addAndGet(vulnerabilities);
455469
}
470+
if (isTransitive) {
471+
counter.transitive.addAndGet(vulnerabilities);
472+
}
456473
if (i.getRemediation() != null
457474
&& i.getRemediation().getTrustedContent() != null
458475
&& i.getRemediation().getTrustedContent().getRef() != null) {
@@ -475,6 +492,7 @@ private int countVulnerabilities(Issue i) {
475492

476493
private static final record VulnerabilityCounter(
477494
AtomicInteger total,
495+
AtomicInteger transitive,
478496
AtomicInteger critical,
479497
AtomicInteger high,
480498
AtomicInteger medium,
@@ -496,6 +514,7 @@ private static final record VulnerabilityCounter(
496514
new AtomicInteger(),
497515
new AtomicInteger(),
498516
new AtomicInteger(),
517+
new AtomicInteger(),
499518
new AtomicInteger());
500519
}
501520

@@ -507,10 +526,9 @@ SourceSummary getSummary() {
507526
.medium(medium.get())
508527
.low(low.get())
509528
.direct(direct.get())
510-
.transitive(total.get() - direct.get())
529+
.transitive(transitive.get())
511530
.dependencies(dependencies.get())
512531
.remediations(remediations.get())
513-
// Will be calculated later when TC recommendations will be added.
514532
.recommendations(recommendations.get())
515533
.unscanned(unscanned.get());
516534
}

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

+52
Original file line numberDiff line numberDiff line change
@@ -133,6 +133,19 @@ private static Stream<Arguments> getSummaryValues() {
133133
.transitive(1)
134134
.medium(2)
135135
.dependencies(2)
136+
.unscanned(0)),
137+
Arguments.of(
138+
Map.of(
139+
"pkg:npm/aa@1", List.of(buildIssue(1, 5f)),
140+
"pkg:npm/aaa@1", List.of(buildIssue(2, 5f))),
141+
null,
142+
buildTreeWithSameTransitiveDirect(),
143+
new SourceSummary()
144+
.total(2)
145+
.direct(2)
146+
.transitive(1)
147+
.medium(2)
148+
.dependencies(2)
136149
.unscanned(0)));
137150
}
138151

@@ -622,6 +635,45 @@ private static DependencyTree buildTreeWithDuplicates() {
622635
return DependencyTree.builder().dependencies(direct).build();
623636
}
624637

638+
private static DependencyTree buildTreeWithSameTransitiveDirect() {
639+
Map<PackageRef, DirectDependency> direct =
640+
Map.of(
641+
PackageRef.builder()
642+
.name("aa")
643+
.version("1")
644+
.pkgManager(Constants.NPM_PURL_TYPE)
645+
.build(),
646+
DirectDependency.builder()
647+
.ref(
648+
PackageRef.builder()
649+
.name("aa")
650+
.version("1")
651+
.pkgManager(Constants.NPM_PURL_TYPE)
652+
.build())
653+
.transitive(
654+
Set.of(
655+
PackageRef.builder()
656+
.name("aaa")
657+
.version("1")
658+
.pkgManager(Constants.NPM_PURL_TYPE)
659+
.build()))
660+
.build(),
661+
PackageRef.builder()
662+
.name("aaa")
663+
.version("1")
664+
.pkgManager(Constants.NPM_PURL_TYPE)
665+
.build(),
666+
DirectDependency.builder()
667+
.ref(
668+
PackageRef.builder()
669+
.name("aaa")
670+
.version("1")
671+
.pkgManager(Constants.NPM_PURL_TYPE)
672+
.build())
673+
.build());
674+
return DependencyTree.builder().dependencies(direct).build();
675+
}
676+
625677
private static Issue buildIssue(int id, Float score) {
626678
return new Issue()
627679
.id(String.format("ISSUE-00%d", id))

0 commit comments

Comments
 (0)