Skip to content

Commit 0a7867c

Browse files
Converted some remediators to new API (#460)
Co-authored-by: pixeebot[bot] <104101892+pixeebot[bot]@users.noreply.github.com> Co-authored-by: pixeebot[bot] <pixeebot[bot]@users.noreply.github.com>
1 parent a64d95c commit 0a7867c

File tree

38 files changed

+917
-940
lines changed

38 files changed

+917
-940
lines changed

core-codemods/src/main/java/io/codemodder/codemods/DefectDojoSqlInjectionCodemod.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -27,15 +27,15 @@ public final class DefectDojoSqlInjectionCodemod extends JavaParserChanger
2727
implements FixOnlyCodeChanger {
2828

2929
private final RuleFindings findings;
30-
private final Remediator<Finding> remediatorStrategy;
30+
private final Remediator<Finding> remediationStrategy;
3131

3232
@Inject
3333
public DefectDojoSqlInjectionCodemod(
3434
@DefectDojoScan(ruleId = "java.lang.security.audit.sqli.jdbc-sqli.jdbc-sqli")
3535
RuleFindings findings) {
3636
super(CodemodReporterStrategy.fromClasspath(SQLParameterizerCodemod.class));
3737
this.findings = Objects.requireNonNull(findings);
38-
this.remediatorStrategy = new SQLInjectionRemediator<>();
38+
this.remediationStrategy = new SQLInjectionRemediator<>();
3939
}
4040

4141
@Override
@@ -55,7 +55,7 @@ public DetectorRule detectorRule() {
5555
public CodemodFileScanningResult visit(
5656
final CodemodInvocationContext context, final CompilationUnit cu) {
5757
List<Finding> findingsForThisPath = findings.getForPath(context.path());
58-
return remediatorStrategy.remediateAll(
58+
return remediationStrategy.remediateAll(
5959
cu,
6060
context.path().toString(),
6161
detectorRule(),

core-codemods/src/main/java/io/codemodder/codemods/SonarObjectDeserializationCodemod.java

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -7,11 +7,14 @@
77
import io.codemodder.providers.sonar.RuleIssue;
88
import io.codemodder.providers.sonar.SonarRemediatingJavaParserChanger;
99
import io.codemodder.remediation.GenericRemediationMetadata;
10+
import io.codemodder.remediation.Remediator;
1011
import io.codemodder.remediation.javadeserialization.JavaDeserializationRemediator;
1112
import io.codemodder.sonar.model.Issue;
1213
import io.codemodder.sonar.model.SonarFinding;
14+
import io.codemodder.sonar.model.TextRange;
1315
import java.util.List;
1416
import java.util.Objects;
17+
import java.util.Optional;
1518
import javax.inject.Inject;
1619

1720
/** Fixes Object Deserialization issues found by sonar rule javasecurity:S5135. */
@@ -22,15 +25,15 @@
2225
importance = Importance.HIGH)
2326
public final class SonarObjectDeserializationCodemod extends SonarRemediatingJavaParserChanger {
2427

25-
private final JavaDeserializationRemediator remediator;
28+
private final Remediator<Issue> remediator;
2629
private final RuleIssue issues;
2730

2831
@Inject
2932
public SonarObjectDeserializationCodemod(
3033
@ProvidedSonarScan(ruleId = "javasecurity:S5135") final RuleIssue issues) {
3134
super(GenericRemediationMetadata.DESERIALIZATION.reporter(), issues);
3235
this.issues = Objects.requireNonNull(issues);
33-
this.remediator = JavaDeserializationRemediator.DEFAULT;
36+
this.remediator = new JavaDeserializationRemediator<>();
3437
}
3538

3639
@Override
@@ -52,7 +55,7 @@ public CodemodFileScanningResult visit(
5255
issuesForFile,
5356
SonarFinding::getKey,
5457
i -> i.getTextRange() != null ? i.getTextRange().getStartLine() : i.getLine(),
55-
i -> i.getTextRange() != null ? i.getTextRange().getEndLine() : null,
56-
i -> i.getTextRange() != null ? i.getTextRange().getStartOffset() : null);
58+
i -> Optional.ofNullable(i.getTextRange()).map(TextRange::getEndLine),
59+
i -> Optional.ofNullable(i.getTextRange()).map(tr -> tr.getStartOffset() + 1));
5760
}
5861
}

core-codemods/src/main/java/io/codemodder/codemods/SonarSQLInjectionCodemod.java

Lines changed: 25 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,18 @@
11
package io.codemodder.codemods;
22

33
import com.github.javaparser.ast.CompilationUnit;
4+
import com.github.javaparser.ast.expr.Expression;
45
import io.codemodder.*;
6+
import io.codemodder.ast.ASTs;
57
import io.codemodder.codetf.DetectorRule;
68
import io.codemodder.providers.sonar.ProvidedSonarScan;
79
import io.codemodder.providers.sonar.RuleHotspot;
810
import io.codemodder.providers.sonar.SonarRemediatingJavaParserChanger;
11+
import io.codemodder.remediation.FixCandidateSearcher;
912
import io.codemodder.remediation.GenericRemediationMetadata;
1013
import io.codemodder.remediation.Remediator;
11-
import io.codemodder.remediation.sqlinjection.SQLInjectionRemediator;
14+
import io.codemodder.remediation.SearcherStrategyRemediator;
15+
import io.codemodder.remediation.sqlinjection.SQLInjectionFixComposer;
1216
import io.codemodder.sonar.model.Hotspot;
1317
import io.codemodder.sonar.model.SonarFinding;
1418
import io.codemodder.sonar.model.TextRange;
@@ -32,7 +36,26 @@ public SonarSQLInjectionCodemod(
3236
@ProvidedSonarScan(ruleId = "java:S2077") final RuleHotspot hotspots) {
3337
super(GenericRemediationMetadata.SQL_INJECTION.reporter(), hotspots);
3438
this.hotspots = Objects.requireNonNull(hotspots);
35-
this.remediationStrategy = new SQLInjectionRemediator<>();
39+
this.remediationStrategy =
40+
new SearcherStrategyRemediator.Builder<Hotspot>()
41+
.withSearcherStrategyPair(
42+
new FixCandidateSearcher.Builder<Hotspot>()
43+
.withMatcher(
44+
n ->
45+
Optional.empty()
46+
// is the argument of the call
47+
.or(
48+
() ->
49+
Optional.of(n)
50+
.map(
51+
m ->
52+
m instanceof Expression ? (Expression) m : null)
53+
.flatMap(ASTs::isArgumentOfMethodCall)
54+
.filter(SQLInjectionFixComposer::match))
55+
.isPresent())
56+
.build(),
57+
new SQLInjectionFixComposer())
58+
.build();
3659
}
3760

3861
@Override

core-codemods/src/main/java/io/codemodder/codemods/SonarSSRFCodemod.java

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -7,11 +7,14 @@
77
import io.codemodder.providers.sonar.RuleIssue;
88
import io.codemodder.providers.sonar.SonarRemediatingJavaParserChanger;
99
import io.codemodder.remediation.GenericRemediationMetadata;
10+
import io.codemodder.remediation.Remediator;
1011
import io.codemodder.remediation.ssrf.SSRFRemediator;
1112
import io.codemodder.sonar.model.Issue;
1213
import io.codemodder.sonar.model.SonarFinding;
14+
import io.codemodder.sonar.model.TextRange;
1315
import java.util.List;
1416
import java.util.Objects;
17+
import java.util.Optional;
1518
import javax.inject.Inject;
1619

1720
/** Fixes SSRF issues found by sonar rule javasecurity:S5144. */
@@ -22,15 +25,15 @@
2225
importance = Importance.HIGH)
2326
public final class SonarSSRFCodemod extends SonarRemediatingJavaParserChanger {
2427

25-
private final SSRFRemediator remediator;
28+
private final Remediator<Issue> remediator;
2629
private final RuleIssue issues;
2730

2831
@Inject
2932
public SonarSSRFCodemod(
3033
@ProvidedSonarScan(ruleId = "javasecurity:S5144") final RuleIssue issues) {
3134
super(GenericRemediationMetadata.SSRF.reporter(), issues);
3235
this.issues = Objects.requireNonNull(issues);
33-
this.remediator = SSRFRemediator.DEFAULT;
36+
this.remediator = new SSRFRemediator<>();
3437
}
3538

3639
@Override
@@ -52,7 +55,7 @@ public CodemodFileScanningResult visit(
5255
issuesForFile,
5356
SonarFinding::getKey,
5457
i -> i.getTextRange() != null ? i.getTextRange().getStartLine() : i.getLine(),
55-
i -> i.getTextRange() != null ? i.getTextRange().getEndLine() : null,
56-
i -> i.getTextRange() != null ? i.getTextRange().getStartOffset() : null);
58+
i -> Optional.ofNullable(i.getTextRange()).map(TextRange::getEndLine),
59+
i -> Optional.ofNullable(i.getTextRange()).map(tr -> tr.getStartOffset() + 1));
5760
}
5861
}

core-codemods/src/main/java/io/codemodder/codemods/SonarUnsafeReflectionRemediationCodemod.java

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -7,9 +7,12 @@
77
import io.codemodder.providers.sonar.RuleIssue;
88
import io.codemodder.providers.sonar.SonarRemediatingJavaParserChanger;
99
import io.codemodder.remediation.GenericRemediationMetadata;
10+
import io.codemodder.remediation.Remediator;
1011
import io.codemodder.remediation.reflectioninjection.ReflectionInjectionRemediator;
1112
import io.codemodder.sonar.model.Issue;
13+
import io.codemodder.sonar.model.TextRange;
1214
import java.util.Objects;
15+
import java.util.Optional;
1316
import javax.inject.Inject;
1417

1518
/** Sonar remediation codemod for S2658: Classes should not be loaded dynamically. */
@@ -21,14 +24,14 @@
2124
public final class SonarUnsafeReflectionRemediationCodemod
2225
extends SonarRemediatingJavaParserChanger {
2326

24-
private final ReflectionInjectionRemediator remediator;
27+
private final Remediator<Issue> remediator;
2528
private final RuleIssue issues;
2629

2730
@Inject
2831
public SonarUnsafeReflectionRemediationCodemod(
2932
@ProvidedSonarScan(ruleId = "java:S2658") final RuleIssue issues) {
3033
super(GenericRemediationMetadata.REFLECTION_INJECTION.reporter(), issues);
31-
this.remediator = ReflectionInjectionRemediator.DEFAULT;
34+
this.remediator = new ReflectionInjectionRemediator<>();
3235
this.issues = Objects.requireNonNull(issues);
3336
}
3437

@@ -50,7 +53,7 @@ public CodemodFileScanningResult visit(
5053
issues.getResultsByPath(context.path()),
5154
Issue::getKey,
5255
i -> i.getTextRange() != null ? i.getTextRange().getStartLine() : i.getLine(),
53-
i -> i.getTextRange() != null ? i.getTextRange().getEndLine() : null,
54-
i -> i.getTextRange().getStartOffset());
56+
i -> Optional.ofNullable(i.getTextRange()).map(TextRange::getEndLine),
57+
i -> Optional.empty());
5558
}
5659
}

core-codemods/src/main/java/io/codemodder/codemods/codeql/CodeQLDeserializationOfUserControlledDataCodemod.java

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,14 @@
11
package io.codemodder.codemods.codeql;
22

3+
import com.contrastsecurity.sarif.Result;
34
import com.github.javaparser.ast.CompilationUnit;
45
import io.codemodder.*;
56
import io.codemodder.codetf.DetectorRule;
67
import io.codemodder.providers.sarif.codeql.ProvidedCodeQLScan;
78
import io.codemodder.remediation.GenericRemediationMetadata;
9+
import io.codemodder.remediation.Remediator;
810
import io.codemodder.remediation.javadeserialization.JavaDeserializationRemediator;
11+
import java.util.Optional;
912
import javax.inject.Inject;
1013

1114
/** A codemod for automatically fixing untrusted deserialization from CodeQL. */
@@ -17,13 +20,13 @@
1720
public final class CodeQLDeserializationOfUserControlledDataCodemod
1821
extends CodeQLRemediationCodemod {
1922

20-
private final JavaDeserializationRemediator remediator;
23+
private final Remediator<Result> remediator;
2124

2225
@Inject
2326
public CodeQLDeserializationOfUserControlledDataCodemod(
2427
@ProvidedCodeQLScan(ruleId = "java/unsafe-deserialization") final RuleSarif sarif) {
2528
super(GenericRemediationMetadata.DESERIALIZATION.reporter(), sarif);
26-
this.remediator = JavaDeserializationRemediator.DEFAULT;
29+
this.remediator = new JavaDeserializationRemediator<>();
2730
}
2831

2932
@Override
@@ -44,7 +47,9 @@ public CodemodFileScanningResult visit(
4447
ruleSarif.getResultsByLocationPath(context.path()),
4548
SarifFindingKeyUtil::buildFindingId,
4649
r -> r.getLocations().get(0).getPhysicalLocation().getRegion().getStartLine(),
47-
r -> r.getLocations().get(0).getPhysicalLocation().getRegion().getEndLine(),
48-
r -> r.getLocations().get(0).getPhysicalLocation().getRegion().getStartColumn());
50+
r -> Optional.of(r.getLocations().get(0).getPhysicalLocation().getRegion().getEndLine()),
51+
r ->
52+
Optional.of(
53+
r.getLocations().get(0).getPhysicalLocation().getRegion().getStartColumn()));
4954
}
5055
}

core-codemods/src/main/java/io/codemodder/codemods/codeql/CodeQLHttpResponseSplittingCodemod.java

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,14 @@
11
package io.codemodder.codemods.codeql;
22

3+
import com.contrastsecurity.sarif.Result;
34
import com.github.javaparser.ast.CompilationUnit;
45
import io.codemodder.*;
56
import io.codemodder.codetf.DetectorRule;
67
import io.codemodder.providers.sarif.codeql.ProvidedCodeQLScan;
78
import io.codemodder.remediation.GenericRemediationMetadata;
9+
import io.codemodder.remediation.Remediator;
810
import io.codemodder.remediation.headerinjection.HeaderInjectionRemediator;
11+
import java.util.Optional;
912
import javax.inject.Inject;
1013

1114
/** A codemod for automatically fixing HTTP response splitting from CodeQL. */
@@ -16,13 +19,13 @@
1619
executionPriority = CodemodExecutionPriority.HIGH)
1720
public final class CodeQLHttpResponseSplittingCodemod extends CodeQLRemediationCodemod {
1821

19-
private final HeaderInjectionRemediator remediator;
22+
private final Remediator<Result> remediator;
2023

2124
@Inject
2225
public CodeQLHttpResponseSplittingCodemod(
2326
@ProvidedCodeQLScan(ruleId = "java/http-response-splitting") final RuleSarif sarif) {
2427
super(GenericRemediationMetadata.HEADER_INJECTION.reporter(), sarif);
25-
this.remediator = HeaderInjectionRemediator.DEFAULT;
28+
this.remediator = new HeaderInjectionRemediator<>();
2629
}
2730

2831
@Override
@@ -43,7 +46,9 @@ public CodemodFileScanningResult visit(
4346
ruleSarif.getResultsByLocationPath(context.path()),
4447
SarifFindingKeyUtil::buildFindingId,
4548
r -> r.getLocations().get(0).getPhysicalLocation().getRegion().getStartLine(),
46-
r -> r.getLocations().get(0).getPhysicalLocation().getRegion().getEndLine(),
47-
r -> r.getLocations().get(0).getPhysicalLocation().getRegion().getStartColumn());
49+
r -> Optional.of(r.getLocations().get(0).getPhysicalLocation().getRegion().getEndLine()),
50+
r ->
51+
Optional.of(
52+
r.getLocations().get(0).getPhysicalLocation().getRegion().getStartColumn()));
4853
}
4954
}

core-codemods/src/main/java/io/codemodder/codemods/codeql/CodeQLSQLInjectionCodemod.java

Lines changed: 25 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,12 +2,16 @@
22

33
import com.contrastsecurity.sarif.Result;
44
import com.github.javaparser.ast.CompilationUnit;
5+
import com.github.javaparser.ast.expr.Expression;
56
import io.codemodder.*;
7+
import io.codemodder.ast.ASTs;
68
import io.codemodder.codetf.DetectorRule;
79
import io.codemodder.providers.sarif.codeql.ProvidedCodeQLScan;
10+
import io.codemodder.remediation.FixCandidateSearcher;
811
import io.codemodder.remediation.GenericRemediationMetadata;
912
import io.codemodder.remediation.Remediator;
10-
import io.codemodder.remediation.sqlinjection.SQLInjectionRemediator;
13+
import io.codemodder.remediation.SearcherStrategyRemediator;
14+
import io.codemodder.remediation.sqlinjection.SQLInjectionFixComposer;
1115
import java.util.Optional;
1216
import javax.inject.Inject;
1317

@@ -25,7 +29,26 @@ public final class CodeQLSQLInjectionCodemod extends CodeQLRemediationCodemod {
2529
public CodeQLSQLInjectionCodemod(
2630
@ProvidedCodeQLScan(ruleId = "java/sql-injection") final RuleSarif sarif) {
2731
super(GenericRemediationMetadata.SQL_INJECTION.reporter(), sarif);
28-
this.remediator = new SQLInjectionRemediator<>();
32+
this.remediator =
33+
new SearcherStrategyRemediator.Builder<Result>()
34+
.withSearcherStrategyPair(
35+
new FixCandidateSearcher.Builder<Result>()
36+
.withMatcher(
37+
n ->
38+
Optional.empty()
39+
// is the argument of the call
40+
.or(
41+
() ->
42+
Optional.of(n)
43+
.map(
44+
m ->
45+
m instanceof Expression ? (Expression) m : null)
46+
.flatMap(ASTs::isArgumentOfMethodCall)
47+
.filter(SQLInjectionFixComposer::match))
48+
.isPresent())
49+
.build(),
50+
new SQLInjectionFixComposer())
51+
.build();
2952
}
3053

3154
@Override

core-codemods/src/main/java/io/codemodder/codemods/codeql/CodeQLSSRFCodemod.java

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,14 @@
11
package io.codemodder.codemods.codeql;
22

3+
import com.contrastsecurity.sarif.Result;
34
import com.github.javaparser.ast.CompilationUnit;
45
import io.codemodder.*;
56
import io.codemodder.codetf.DetectorRule;
67
import io.codemodder.providers.sarif.codeql.ProvidedCodeQLScan;
78
import io.codemodder.remediation.GenericRemediationMetadata;
9+
import io.codemodder.remediation.Remediator;
810
import io.codemodder.remediation.ssrf.SSRFRemediator;
11+
import java.util.Optional;
912
import javax.inject.Inject;
1013

1114
/** A codemod for automatically fixing SQL injection from CodeQL. */
@@ -16,12 +19,12 @@
1619
executionPriority = CodemodExecutionPriority.HIGH)
1720
public final class CodeQLSSRFCodemod extends CodeQLRemediationCodemod {
1821

19-
private final SSRFRemediator remediator;
22+
private final Remediator<Result> remediator;
2023

2124
@Inject
2225
public CodeQLSSRFCodemod(@ProvidedCodeQLScan(ruleId = "java/ssrf") final RuleSarif sarif) {
2326
super(GenericRemediationMetadata.SSRF.reporter(), sarif);
24-
this.remediator = SSRFRemediator.DEFAULT;
27+
this.remediator = new SSRFRemediator<>();
2528
}
2629

2730
@Override
@@ -42,7 +45,9 @@ public CodemodFileScanningResult visit(
4245
ruleSarif.getResultsByLocationPath(context.path()),
4346
SarifFindingKeyUtil::buildFindingId,
4447
r -> r.getLocations().get(0).getPhysicalLocation().getRegion().getStartLine(),
45-
r -> r.getLocations().get(0).getPhysicalLocation().getRegion().getEndLine(),
46-
r -> r.getLocations().get(0).getPhysicalLocation().getRegion().getStartColumn());
48+
r -> Optional.of(r.getLocations().get(0).getPhysicalLocation().getRegion().getEndLine()),
49+
r ->
50+
Optional.of(
51+
r.getLocations().get(0).getPhysicalLocation().getRegion().getStartColumn()));
4752
}
4853
}

0 commit comments

Comments
 (0)