From e41dc9f58d27fb2a36fb19107ac52ef5181b81e0 Mon Sep 17 00:00:00 2001 From: cmuchinsky Date: Tue, 21 Mar 2023 09:11:11 -0400 Subject: [PATCH] Issue-1899: Fix to allow both snakeyaml 1.33 and 2.0 to work properly --- .../v3/parser/util/DeserializationUtils.java | 25 ++++++++++++++----- 1 file changed, 19 insertions(+), 6 deletions(-) diff --git a/modules/swagger-parser-v3/src/main/java/io/swagger/v3/parser/util/DeserializationUtils.java b/modules/swagger-parser-v3/src/main/java/io/swagger/v3/parser/util/DeserializationUtils.java index 7799d93fa0..3d17012f1b 100644 --- a/modules/swagger-parser-v3/src/main/java/io/swagger/v3/parser/util/DeserializationUtils.java +++ b/modules/swagger-parser-v3/src/main/java/io/swagger/v3/parser/util/DeserializationUtils.java @@ -199,16 +199,17 @@ public static JsonNode readYamlTree(String contents) { } public static JsonNode readYamlTree(String contents, ParseOptions parseOptions, SwaggerParseResult deserializationUtilsResult) { + LoaderOptions loaderOptions = new LoaderOptions(); if (parseOptions != null && parseOptions.isLegacyYamlDeserialization()) { - org.yaml.snakeyaml.Yaml yaml = new org.yaml.snakeyaml.Yaml(new SafeConstructor()); + org.yaml.snakeyaml.Yaml yaml = new org.yaml.snakeyaml.Yaml(new SafeConstructor(loaderOptions)); return Json.mapper().convertValue(yaml.load(contents), JsonNode.class); } try { org.yaml.snakeyaml.Yaml yaml = null; if (options.isValidateYamlInput()) { - yaml = buildSnakeYaml(new CustomSnakeYamlConstructor()); + yaml = buildSnakeYaml(new CustomSnakeYamlConstructor(loaderOptions)); } else { - yaml = buildSnakeYaml(new SafeConstructor()); + yaml = buildSnakeYaml(new SafeConstructor(loaderOptions)); } Object o = yaml.load(contents); if (options.isValidateYamlInput()) { @@ -244,7 +245,8 @@ public static T readYamlValue(String contents, Class expectedType) { return readYamlValue(contents, expectedType, false); } public static T readYamlValue(String contents, Class expectedType, boolean openapi31) { - org.yaml.snakeyaml.Yaml yaml = new org.yaml.snakeyaml.Yaml(new SafeConstructor()); + LoaderOptions loaderOptions = new LoaderOptions(); + org.yaml.snakeyaml.Yaml yaml = new org.yaml.snakeyaml.Yaml(new SafeConstructor(loaderOptions)); ObjectMapper jsonMapper = openapi31 ? Json31.mapper() : Json.mapper(); return jsonMapper.convertValue(yaml.load(contents), expectedType); } @@ -255,8 +257,14 @@ public static org.yaml.snakeyaml.Yaml buildSnakeYaml(BaseConstructor constructor } catch (NoSuchMethodException e) { return new org.yaml.snakeyaml.Yaml(constructor); } + LoaderOptions loaderOptions; + try { + Method method = BaseConstructor.class.getMethod("getLoadingConfig"); + loaderOptions = (LoaderOptions) method.invoke(constructor); + } catch (ReflectiveOperationException e) { + loaderOptions = new LoaderOptions(); + } try { - LoaderOptions loaderOptions = new LoaderOptions(); Method method = LoaderOptions.class.getMethod("setMaxAliasesForCollections", int.class); method.invoke(loaderOptions, options.getMaxYamlAliasesForCollections()); method = LoaderOptions.class.getMethod("setAllowRecursiveKeys", boolean.class); @@ -265,7 +273,8 @@ public static org.yaml.snakeyaml.Yaml buildSnakeYaml(BaseConstructor constructor method.invoke(loaderOptions, false); method = LoaderOptions.class.getMethod("setCodePointLimit", int.class); method.invoke(loaderOptions, options.getMaxYamlCodePoints()); - org.yaml.snakeyaml.Yaml yaml = new org.yaml.snakeyaml.Yaml(constructor, new Representer(), new DumperOptions(), loaderOptions, new CustomResolver()); + DumperOptions dumperOptions = new DumperOptions(); + org.yaml.snakeyaml.Yaml yaml = new org.yaml.snakeyaml.Yaml(constructor, new Representer(dumperOptions), dumperOptions, loaderOptions, new CustomResolver()); return yaml; } catch (ReflectiveOperationException e) { // @@ -396,6 +405,10 @@ public SnakeException(String message, Throwable cause) { static class CustomSnakeYamlConstructor extends SafeConstructor { + private CustomSnakeYamlConstructor(LoaderOptions loaderOptions) { + super(loaderOptions); + } + private boolean checkNode(MappingNode node, Integer depth) { if (node.getValue() == null) return true; if (depth > options.getMaxYamlDepth()) return false;