Skip to content

Commit 652ee9b

Browse files
mslocrianmatthsmi
andauthored
SnakeYaml loader options to allow configuration of CodePointLimit for YAML input files (#2407)
Co-authored-by: Stegen Smith <[email protected]>
1 parent 5674818 commit 652ee9b

3 files changed

Lines changed: 56 additions & 0 deletions

File tree

plugin/src/main/java/io/jenkins/plugins/casc/ConfigurationContext.java

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,13 +17,16 @@ public class ConfigurationContext implements ConfiguratorRegistry {
1717

1818
public static final String CASC_YAML_MAX_ALIASES_ENV = "CASC_YAML_MAX_ALIASES";
1919
public static final String CASC_YAML_MAX_ALIASES_PROPERTY = "casc.yaml.max.aliases";
20+
public static final String CASC_YAML_CODE_POINT_LIMIT_ENV = "CASC_YAML_CODE_POINT_LIMIT";
21+
public static final String CASC_YAML_CODE_POINT_LIMIT_PROPERTY = "casc.yaml.code_point_limit";
2022
public static final String CASC_MERGE_STRATEGY_ENV = "CASC_MERGE_STRATEGY";
2123
public static final String CASC_MERGE_STRATEGY_PROPERTY = "casc.merge.strategy";
2224
private Deprecation deprecation = Deprecation.reject;
2325
private Restriction restriction = Restriction.reject;
2426
private Unknown unknown = Unknown.reject;
2527
private String mergeStrategy;
2628
private final transient int yamlMaxAliasesForCollections;
29+
private final transient int yamlCodePointLimit;
2730

2831
/**
2932
* the model-introspection model to be applied by configuration-as-code.
@@ -45,6 +48,8 @@ public ConfigurationContext(ConfiguratorRegistry registry) {
4548
this.registry = registry;
4649
String prop = getPropertyOrEnv(CASC_YAML_MAX_ALIASES_ENV, CASC_YAML_MAX_ALIASES_PROPERTY);
4750
yamlMaxAliasesForCollections = NumberUtils.toInt(prop, 50);
51+
prop = getPropertyOrEnv(CASC_YAML_CODE_POINT_LIMIT_ENV, CASC_YAML_CODE_POINT_LIMIT_PROPERTY);
52+
yamlCodePointLimit = NumberUtils.toInt(prop, 3) * 1024 * 1024;
4853
secretSourceResolver = new SecretSourceResolver(this);
4954
mergeStrategy = getPropertyOrEnv(CASC_MERGE_STRATEGY_ENV, CASC_MERGE_STRATEGY_PROPERTY);
5055
}
@@ -111,6 +116,10 @@ public int getYamlMaxAliasesForCollections() {
111116
return yamlMaxAliasesForCollections;
112117
}
113118

119+
public int getYamlCodePointLimit() {
120+
return yamlCodePointLimit;
121+
}
122+
114123
// --- delegate methods for ConfigurationContext
115124

116125
@Override

plugin/src/main/java/io/jenkins/plugins/casc/yaml/YamlUtils.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,7 @@ public static Node merge(List<YamlSource> sources, ConfigurationContext context)
5656

5757
public static Node read(YamlSource source, Reader reader, ConfigurationContext context) throws IOException {
5858
LoaderOptions loaderOptions = new LoaderOptions();
59+
loaderOptions.setCodePointLimit(context.getYamlCodePointLimit());
5960
loaderOptions.setMaxAliasesForCollections(context.getYamlMaxAliasesForCollections());
6061
Composer composer = new Composer(
6162
new ParserImpl(new StreamReaderWithSource(source, reader), loaderOptions),
@@ -112,6 +113,7 @@ public static Mapping loadFrom(List<YamlSource> sources, ConfigurationContext co
112113
private static Mapping loadFrom(Node node, ConfigurationContext context) {
113114
final LoaderOptions loaderOptions = new LoaderOptions();
114115
loaderOptions.setMaxAliasesForCollections(context.getYamlMaxAliasesForCollections());
116+
loaderOptions.setCodePointLimit(context.getYamlCodePointLimit());
115117
final ModelConstructor constructor = new ModelConstructor(loaderOptions);
116118
constructor.setComposer(
117119
new Composer(
Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
package io.jenkins.plugins.casc;
2+
3+
import static org.junit.Assert.assertEquals;
4+
5+
import io.jenkins.plugins.casc.misc.EnvVarsRule;
6+
import org.junit.Rule;
7+
import org.junit.Test;
8+
import org.junit.contrib.java.lang.system.RestoreSystemProperties;
9+
import org.junit.rules.RuleChain;
10+
import org.jvnet.hudson.test.JenkinsRule;
11+
12+
public class YamlCodePointLimitTest {
13+
14+
private JenkinsRule j;
15+
16+
private EnvVarsRule env;
17+
18+
@Rule
19+
public RuleChain rc = RuleChain.outerRule(env = new EnvVarsRule())
20+
.around(new RestoreSystemProperties())
21+
.around(j = new JenkinsRule());
22+
23+
@Test
24+
public void testCodePointLimitSetFifty() throws ConfiguratorException {
25+
System.setProperty(ConfigurationContext.CASC_YAML_CODE_POINT_LIMIT_PROPERTY, "50");
26+
ConfiguratorRegistry registry = ConfiguratorRegistry.get();
27+
ConfigurationContext context = new ConfigurationContext(registry);
28+
assertEquals(50 * 1024 * 1024, context.getYamlCodePointLimit());
29+
}
30+
31+
@Test
32+
public void invalidCodePointLimitSetToDefault() throws ConfiguratorException {
33+
System.setProperty(ConfigurationContext.CASC_YAML_CODE_POINT_LIMIT_PROPERTY, "HELLO");
34+
ConfiguratorRegistry registry = ConfiguratorRegistry.get();
35+
ConfigurationContext context = new ConfigurationContext(registry);
36+
assertEquals(3 * 1024 * 1024, context.getYamlCodePointLimit());
37+
}
38+
39+
@Test
40+
public void defaultCodePointLimit() throws ConfiguratorException {
41+
ConfiguratorRegistry registry = ConfiguratorRegistry.get();
42+
ConfigurationContext context = new ConfigurationContext(registry);
43+
assertEquals(3 * 1024 * 1024, context.getYamlCodePointLimit());
44+
}
45+
}

0 commit comments

Comments
 (0)