Skip to content

Commit a2b0865

Browse files
committed
added some appscan base
1 parent 7f4c695 commit a2b0865

File tree

10 files changed

+126
-6
lines changed

10 files changed

+126
-6
lines changed

framework/codemodder-base/src/main/java/io/codemodder/DefaultSarifParser.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package io.codemodder;
22

3+
import com.contrastsecurity.sarif.ReportingDescriptor;
34
import com.contrastsecurity.sarif.Result;
45
import com.contrastsecurity.sarif.Run;
56
import com.contrastsecurity.sarif.SarifSchema210;
@@ -8,7 +9,6 @@
89
import java.nio.file.Files;
910
import java.nio.file.Path;
1011
import java.util.*;
11-
import java.util.stream.Collectors;
1212
import java.util.stream.Stream;
1313
import org.slf4j.Logger;
1414
import org.slf4j.LoggerFactory;
@@ -52,7 +52,7 @@ private String extractRuleId(final Result result, final Run run) {
5252
.skip(toolIndex)
5353
.findFirst()
5454
.flatMap(tool -> tool.getRules().stream().skip(ruleIndex).findFirst())
55-
.map(rd -> rd.getId());
55+
.map(ReportingDescriptor::getId);
5656
if (maybeRule.isPresent()) {
5757
return maybeRule.get();
5858
} else {
@@ -70,7 +70,7 @@ private Stream<Map.Entry<String, RuleSarif>> fromSarif(
7070
final List<RuleSarifFactory> factories =
7171
ServiceLoader.load(RuleSarifFactory.class).stream()
7272
.map(ServiceLoader.Provider::get)
73-
.collect(Collectors.toUnmodifiableList());
73+
.toList();
7474
final var runResults = run.getResults();
7575
final var allResults =
7676
runResults != null
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
plugins {
2+
id("io.codemodder.java-library")
3+
id("io.codemodder.maven-publish")
4+
}
5+
6+
description = "Plugin to enable the use of appscan in codemods"
7+
8+
dependencies {
9+
compileOnly(libs.jetbrains.annotations)
10+
implementation(project(":framework:codemodder-base"))
11+
testImplementation(testlibs.bundles.junit.jupiter)
12+
testImplementation(testlibs.bundles.hamcrest)
13+
testImplementation(testlibs.assertj)
14+
testImplementation(testlibs.jgit)
15+
testImplementation(testlibs.mockito)
16+
testRuntimeOnly(testlibs.junit.jupiter.engine)
17+
}
Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
package io.codemodder.providers.sarif.appscan;
2+
3+
import com.google.inject.AbstractModule;
4+
import io.codemodder.CodeChanger;
5+
import io.codemodder.RuleSarif;
6+
import java.lang.reflect.Constructor;
7+
import java.util.List;
8+
import java.util.Map;
9+
import java.util.Objects;
10+
import java.util.Optional;
11+
import java.util.stream.Collectors;
12+
import java.util.stream.Stream;
13+
14+
/** Responsible for distributing the SARIFS to AppSCan based codemods based on rules. */
15+
public final class AppScanModule extends AbstractModule {
16+
17+
private final List<Class<? extends CodeChanger>> codemodTypes;
18+
private final List<RuleSarif> allAppScanRuleSarifs;
19+
20+
AppScanModule(
21+
final List<Class<? extends CodeChanger>> codemodTypes, final List<RuleSarif> sarifs) {
22+
this.codemodTypes = Objects.requireNonNull(codemodTypes);
23+
this.allAppScanRuleSarifs = sarifs;
24+
}
25+
26+
@Override
27+
protected void configure() {
28+
final Map<String, RuleSarif> map =
29+
allAppScanRuleSarifs.stream()
30+
.collect(Collectors.toUnmodifiableMap(RuleSarif::getRule, rs -> rs));
31+
32+
for (final Class<? extends CodeChanger> codemodType : codemodTypes) {
33+
final Constructor<?>[] constructors = codemodType.getDeclaredConstructors();
34+
35+
final Optional<ProvidedAppScanScan> annotation =
36+
Stream.of(constructors)
37+
.filter(constructor -> constructor.getAnnotation(javax.inject.Inject.class) != null)
38+
.flatMap(constructor -> Stream.of(constructor.getParameters()))
39+
.map(parameter -> parameter.getAnnotation(ProvidedAppScanScan.class))
40+
.filter(Objects::nonNull)
41+
.findFirst();
42+
43+
annotation.ifPresent(
44+
providedAppScanScan ->
45+
bind(RuleSarif.class)
46+
.annotatedWith(providedAppScanScan)
47+
.toInstance(map.getOrDefault(providedAppScanScan.ruleId(), RuleSarif.EMPTY)));
48+
}
49+
}
50+
}
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
package io.codemodder.providers.sarif.appscan;
2+
3+
import com.google.inject.AbstractModule;
4+
import io.codemodder.CodeChanger;
5+
import io.codemodder.CodemodProvider;
6+
import io.codemodder.RuleSarif;
7+
import java.nio.file.Path;
8+
import java.util.List;
9+
import java.util.Set;
10+
11+
/** Provides codemods that act on AppSCan results. */
12+
public final class AppScanProvider implements CodemodProvider {
13+
14+
@Override
15+
public Set<AbstractModule> getModules(
16+
final Path repository,
17+
final List<Path> includedFiles,
18+
final List<String> includePaths,
19+
final List<String> excludePaths,
20+
final List<Class<? extends CodeChanger>> codemodTypes,
21+
final List<RuleSarif> sarifs,
22+
final Path sonarIssuesJsonFile) {
23+
return Set.of(new AppScanModule(codemodTypes, sarifs));
24+
}
25+
26+
@Override
27+
public List<String> wantsSarifToolNames() {
28+
return List.of("HCL AppScan Static Analyzer");
29+
}
30+
}
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
package io.codemodder.providers.sarif.appscan;
2+
3+
import java.lang.annotation.*;
4+
import javax.inject.Qualifier;
5+
6+
/**
7+
* This tells the framework to inject the results of a AppScan scan into the following parameter.
8+
* This can only inject {@link io.codemodder.RuleSarif} types.
9+
*/
10+
@Documented
11+
@Qualifier
12+
@Retention(RetentionPolicy.RUNTIME)
13+
@Target(ElementType.PARAMETER)
14+
public @interface ProvidedAppScanScan {
15+
16+
/** The AppScan rule "id" field from the sarif. */
17+
String ruleId();
18+
}
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
io.codemodder.providers.sarif.appscan.AppScanProvider
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
io.codemodder.providers.sarif.appscan.AppScanRuleSarifFactory

plugins/codemodder-plugin-appscan/src/test/resources/webgoat_2023_8_binary.sarif

Lines changed: 1 addition & 0 deletions
Large diffs are not rendered by default.

plugins/codemodder-plugin-codeql/src/main/java/io/codemodder/providers/sarif/codeql/CodeQLRuleSarif.java

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -78,8 +78,9 @@ public List<Result> getResultsByPath(Path path) {
7878
.getArtifactLocation()
7979
.getUri();
8080
try {
81-
if (Files.exists(repositoryRoot.resolve(Path.of(uri)))) {
82-
return Files.isSameFile(path, repositoryRoot.resolve(Path.of(uri)));
81+
Path uriPath = Path.of(uri);
82+
if (Files.exists(repositoryRoot.resolve(uriPath))) {
83+
return Files.isSameFile(path, repositoryRoot.resolve(uriPath));
8384
} else {
8485
return false;
8586
}
@@ -88,7 +89,7 @@ public List<Result> getResultsByPath(Path path) {
8889
return false;
8990
}
9091
})
91-
.collect(Collectors.toUnmodifiableList());
92+
.toList();
9293
resultsCache.put(path, results);
9394
return results;
9495
}

settings.gradle.kts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,3 +49,4 @@ include("plugins:codemodder-plugin-maven")
4949
include("plugins:codemodder-plugin-pmd")
5050
include("plugins:codemodder-plugin-sonar")
5151
include("plugins:codemodder-plugin-semgrep")
52+
include("plugins:codemodder-plugin-appscan")

0 commit comments

Comments
 (0)