From 2d775fd3bc35b8d8ef5b6663eff5ea2289f8d5ef Mon Sep 17 00:00:00 2001 From: Alan Woodward Date: Mon, 10 Jan 2022 11:33:59 +0000 Subject: [PATCH 1/2] Move ambiguous object path detection into DotExpandingXContentParser --- .../xcontent/DotExpandingXContentParser.java | 27 ++++++++++++++++++- .../index/mapper/DocumentParser.java | 2 -- 2 files changed, 26 insertions(+), 3 deletions(-) diff --git a/libs/x-content/src/main/java/org/elasticsearch/xcontent/DotExpandingXContentParser.java b/libs/x-content/src/main/java/org/elasticsearch/xcontent/DotExpandingXContentParser.java index 704edfd019c9a..670240f594488 100644 --- a/libs/x-content/src/main/java/org/elasticsearch/xcontent/DotExpandingXContentParser.java +++ b/libs/x-content/src/main/java/org/elasticsearch/xcontent/DotExpandingXContentParser.java @@ -48,7 +48,7 @@ public Token nextToken() throws IOException { private void expandDots() throws IOException { String field = delegate().currentName(); - String[] subpaths = field.split("\\."); + String[] subpaths = splitAndValidatePath(field); if (subpaths.length == 0) { throw new IllegalArgumentException("field name cannot contain only dots: [" + field + "]"); } @@ -71,6 +71,31 @@ protected XContentParser delegate() { } } + private static String[] splitAndValidatePath(String fullFieldPath) { + if (fullFieldPath.isEmpty()) { + throw new IllegalArgumentException("field name cannot be an empty string"); + } + if (fullFieldPath.contains(".") == false) { + return new String[]{fullFieldPath}; + } + String[] parts = fullFieldPath.split("\\."); + if (parts.length == 0) { + throw new IllegalArgumentException("field name cannot contain only dots"); + } + for (String part : parts) { + // check if the field name contains only whitespace + if (part.isEmpty()) { + throw new IllegalArgumentException("object field cannot contain only whitespace: ['" + fullFieldPath + "']"); + } + if (part.isBlank()) { + throw new IllegalArgumentException( + "object field starting or ending with a [.] makes object resolution ambiguous: [" + fullFieldPath + "]" + ); + } + } + return parts; + } + /** * Wraps an XContentParser such that it re-interprets dots in field names as an object structure * @param in the parser to wrap diff --git a/server/src/main/java/org/elasticsearch/index/mapper/DocumentParser.java b/server/src/main/java/org/elasticsearch/index/mapper/DocumentParser.java index 59baf29a5c531..d5beeba0d82fa 100644 --- a/server/src/main/java/org/elasticsearch/index/mapper/DocumentParser.java +++ b/server/src/main/java/org/elasticsearch/index/mapper/DocumentParser.java @@ -461,7 +461,6 @@ private static void innerParseObject(DocumentParserContext context, ObjectMapper while (token != XContentParser.Token.END_OBJECT) { if (token == XContentParser.Token.FIELD_NAME) { currentFieldName = context.parser().currentName(); - splitAndValidatePath(currentFieldName); } else if (token == XContentParser.Token.START_OBJECT) { parseObject(context, mapper, currentFieldName); } else if (token == XContentParser.Token.START_ARRAY) { @@ -649,7 +648,6 @@ private static void parseNonDynamicArray( ) throws IOException { XContentParser parser = context.parser(); XContentParser.Token token; - splitAndValidatePath(lastFieldName); while ((token = parser.nextToken()) != XContentParser.Token.END_ARRAY) { if (token == XContentParser.Token.START_OBJECT) { parseObject(context, mapper, lastFieldName); From 82ef34c61bbc8ce258d6ddc958365ef7712def4d Mon Sep 17 00:00:00 2001 From: Alan Woodward Date: Mon, 10 Jan 2022 11:41:22 +0000 Subject: [PATCH 2/2] precommit --- .../org/elasticsearch/xcontent/DotExpandingXContentParser.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libs/x-content/src/main/java/org/elasticsearch/xcontent/DotExpandingXContentParser.java b/libs/x-content/src/main/java/org/elasticsearch/xcontent/DotExpandingXContentParser.java index 670240f594488..d0318b49b62bc 100644 --- a/libs/x-content/src/main/java/org/elasticsearch/xcontent/DotExpandingXContentParser.java +++ b/libs/x-content/src/main/java/org/elasticsearch/xcontent/DotExpandingXContentParser.java @@ -76,7 +76,7 @@ private static String[] splitAndValidatePath(String fullFieldPath) { throw new IllegalArgumentException("field name cannot be an empty string"); } if (fullFieldPath.contains(".") == false) { - return new String[]{fullFieldPath}; + return new String[] { fullFieldPath }; } String[] parts = fullFieldPath.split("\\."); if (parts.length == 0) {