Skip to content

Commit 1dfe888

Browse files
uhafnerKevin-CB
authored andcommitted
SECURITY-3611
1 parent d4bc657 commit 1dfe888

File tree

2 files changed

+18
-0
lines changed

2 files changed

+18
-0
lines changed

‎plugin/src/main/java/io/jenkins/plugins/coverage/metrics/steps/CoverageBuildAction.java‎

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@
4040
importio.jenkins.plugins.util.JenkinsFacade;
4141
importio.jenkins.plugins.util.JobAction;
4242
importio.jenkins.plugins.util.QualityGateResult;
43+
importio.jenkins.plugins.util.ValidationUtilities;
4344

4445
importstatichudson.model.Run.*;
4546

@@ -59,6 +60,7 @@ public final class CoverageBuildAction extends BuildAction<Node> implements Stap
5960
privatestaticfinalStringNO_REFERENCE_BUILD = "-";
6061
privatestaticfinalList<Difference> NO_VALUES = List.of();
6162
privatestaticfinalintMAX_METRICS_COUNT_IN_SUMMARY = 5;
63+
privatestaticfinalValidationUtilitiesVALIDATION_UTILITIES = newValidationUtilities();
6264

6365
privatefinalStringid;
6466
privatefinalStringname;
@@ -210,6 +212,8 @@ public CoverageBuildAction(final Run<?, ?> owner, final String id, final String
210212
finalbooleancanSerialize){
211213
super(owner, result, false);
212214

215+
VALIDATION_UTILITIES.ensureValidId(id);
216+
213217
this.id = id;
214218
this.name = name;
215219
this.icon = icon;
@@ -241,6 +245,8 @@ private <T> ArrayList<T> copy(final List<? extends T> list){
241245
protectedObjectreadResolve(){
242246
super.readResolve();
243247

248+
VALIDATION_UTILITIES.ensureValidId(id);
249+
244250
if (difference == null){
245251
difference = newTreeMap<>();
246252
}

‎plugin/src/test/java/io/jenkins/plugins/coverage/metrics/steps/CoverageBuildActionTest.java‎

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
importorg.apache.commons.lang3.math.Fraction;
55
importorg.junit.jupiter.api.Test;
66
importorg.junitpioneer.jupiter.DefaultLocale;
7+
importorg.junitpioneer.jupiter.Issue;
78

89
importedu.hm.hafner.coverage.Coverage.CoverageBuilder;
910
importedu.hm.hafner.coverage.Difference;
@@ -21,6 +22,7 @@
2122

2223
importio.jenkins.plugins.coverage.metrics.model.Baseline;
2324
importio.jenkins.plugins.util.QualityGateResult;
25+
importio.jenkins.plugins.util.QualityGateStatus;
2426

2527
importstaticorg.assertj.core.api.Assertions.*;
2628
importstaticorg.mockito.Mockito.*;
@@ -32,6 +34,16 @@
3234
*/
3335
@DefaultLocale("en")
3436
classCoverageBuildActionTest{
37+
@Test
38+
@Issue("SECURITY-3611")
39+
voidshouldValidateInAction(){
40+
StringevilId = "javascript:alert(1)";
41+
assertThatIllegalArgumentException().isThrownBy(() ->
42+
newCoverageBuildAction(mock(FreeStyleBuild.class), evilId, "name", "icon",
43+
newModuleNode("root"), newQualityGateResult(QualityGateStatus.ERROR), newFilteredLog()))
44+
.withMessageContaining("An ID must match the regexp pattern");
45+
}
46+
3547
@Test
3648
voidshouldNotLoadResultIfCoverageValuesArePersistedInAction(){
3749
varmodule = newModuleNode("module");

0 commit comments

Comments
(0)