Use SafeConstructor in Snakeyaml YAML constructors

This commit is contained in:
aboyko
2022-10-18 16:37:42 -04:00
parent cc001d62c3
commit 2d841f78fc
13 changed files with 38 additions and 18 deletions

View File

@@ -19,7 +19,9 @@ import org.springframework.ide.vscode.commons.util.text.IDocument;
import org.yaml.snakeyaml.DumperOptions;
import org.yaml.snakeyaml.LoaderOptions;
import org.yaml.snakeyaml.Yaml;
import org.yaml.snakeyaml.constructor.SafeConstructor;
import org.yaml.snakeyaml.nodes.Node;
import org.yaml.snakeyaml.representer.Representer;
import com.google.common.collect.ImmutableList;
@@ -36,7 +38,7 @@ public class YamlParser implements YamlASTProvider {
reader.setInput(atTokenTransformHack(doc.get()));
LoaderOptions loaderOpts = new LoaderOptions();
loaderOpts.setMaxAliasesForCollections(1000);
Iterable<Node> nodes = new Yaml(loaderOpts).composeAll(reader);
Iterable<Node> nodes = new Yaml(new SafeConstructor(loaderOpts), new Representer(), new DumperOptions(), loaderOpts).composeAll(reader);
return new YamlFileAST(doc, ImmutableList.copyOf(nodes));
}

View File

@@ -31,7 +31,6 @@ import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingClas
import org.springframework.boot.autoconfigure.context.ConfigurationPropertiesAutoConfiguration;
import org.springframework.boot.autoconfigure.context.PropertyPlaceholderAutoConfiguration;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.ide.vscode.boot.common.PropertyCompletionFactory;
@@ -49,8 +48,8 @@ import org.springframework.ide.vscode.boot.java.livehover.v2.SpringProcessConnec
import org.springframework.ide.vscode.boot.java.livehover.v2.SpringProcessConnectorService;
import org.springframework.ide.vscode.boot.java.livehover.v2.SpringProcessLiveDataProvider;
import org.springframework.ide.vscode.boot.java.rewrite.RewriteCompilationUnitCache;
import org.springframework.ide.vscode.boot.java.rewrite.RewriteRefactorings;
import org.springframework.ide.vscode.boot.java.rewrite.RewriteRecipeRepository;
import org.springframework.ide.vscode.boot.java.rewrite.RewriteRefactorings;
import org.springframework.ide.vscode.boot.java.utils.CompilationUnitCache;
import org.springframework.ide.vscode.boot.java.utils.SymbolCache;
import org.springframework.ide.vscode.boot.java.utils.SymbolCacheOnDisc;
@@ -92,6 +91,7 @@ import org.springframework.ide.vscode.commons.yaml.structure.YamlStructureProvid
import org.springframework.ide.vscode.languageserver.starter.LanguageServerAutoConf;
import org.springframework.ide.vscode.languageserver.starter.LanguageServerRunnerAutoConf;
import org.yaml.snakeyaml.Yaml;
import org.yaml.snakeyaml.constructor.SafeConstructor;
import com.google.common.collect.ImmutableList;
import com.google.gson.Gson;
@@ -269,7 +269,7 @@ public class BootLanguageServerBootApp {
@Bean Yaml yaml() {
//TODO: Yaml is not re-entrant. So its a bit fishy to create a 're-usable' bean for this!
return new Yaml();
return new Yaml(new SafeConstructor());
}
@Bean YamlASTProvider yamlAstProvider() {

View File

@@ -33,6 +33,7 @@ import org.springframework.ide.vscode.commons.util.FuzzyMap;
import org.springframework.ide.vscode.commons.util.text.LanguageId;
import org.springframework.ide.vscode.commons.yaml.ast.NodeUtil;
import org.yaml.snakeyaml.Yaml;
import org.yaml.snakeyaml.constructor.SafeConstructor;
import org.yaml.snakeyaml.nodes.MappingNode;
import org.yaml.snakeyaml.nodes.Node;
import org.yaml.snakeyaml.nodes.NodeTuple;
@@ -139,7 +140,7 @@ public class AdHocSpringPropertyIndexProvider implements ProjectBasedPropertyInd
private Properties parseYaml(File yamlFile) {
if (yamlFile.isFile()) {
Yaml yaml = new Yaml();
Yaml yaml = new Yaml(new SafeConstructor());
try (Reader reader = new InputStreamReader(new FileInputStream(yamlFile), "UTF8")) {
Properties props = new Properties();
for (Node node : yaml.composeAll(reader)) {