Skip to content

Commit f1f6d4e

Browse files
nikoncodeChristoph Büscher
authored andcommitted
Support only string format in date, root object & date range (#28117)
Limit date `format` attribute to String values only. Closes #23650
1 parent e1e8cf3 commit f1f6d4e

File tree

4 files changed

+66
-1
lines changed

4 files changed

+66
-1
lines changed

server/src/main/java/org/elasticsearch/index/mapper/TypeParsers.java

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -264,7 +264,10 @@ private static IndexOptions nodeIndexOptionValue(final Object propNode) {
264264
}
265265

266266
public static FormatDateTimeFormatter parseDateTimeFormatter(Object node) {
267-
return Joda.forPattern(node.toString());
267+
if (node instanceof String) {
268+
return Joda.forPattern((String) node);
269+
}
270+
throw new IllegalArgumentException("Invalid format: [" + node.toString() + "]: expected string value");
268271
}
269272

270273
public static void parseTermVector(String fieldName, String termVector, FieldMapper.Builder builder) throws MapperParsingException {

server/src/test/java/org/elasticsearch/index/mapper/DateFieldMapperTests.java

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -414,4 +414,22 @@ public void testMergeText() throws Exception {
414414
() -> mapper.merge(update.mapping()));
415415
assertEquals("mapper [date] of different type, current_type [date], merged_type [text]", e.getMessage());
416416
}
417+
418+
public void testIllegalFormatField() throws Exception {
419+
String mapping = Strings.toString(XContentFactory.jsonBuilder()
420+
.startObject()
421+
.startObject("type")
422+
.startObject("properties")
423+
.startObject("field")
424+
.field("type", "date")
425+
.array("format", "test_format")
426+
.endObject()
427+
.endObject()
428+
.endObject()
429+
.endObject());
430+
431+
IllegalArgumentException e = expectThrows(IllegalArgumentException.class,
432+
() -> parser.parse("type", new CompressedXContent(mapping)));
433+
assertEquals("Invalid format: [[test_format]]: expected string value", e.getMessage());
434+
}
417435
}

server/src/test/java/org/elasticsearch/index/mapper/RangeFieldMapperTests.java

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -443,4 +443,22 @@ public void testSerializeDefaults() throws Exception {
443443
}
444444
}
445445

446+
public void testIllegalFormatField() throws Exception {
447+
String mapping = Strings.toString(XContentFactory.jsonBuilder()
448+
.startObject()
449+
.startObject("type")
450+
.startObject("properties")
451+
.startObject("field")
452+
.field("type", "date_range")
453+
.array("format", "test_format")
454+
.endObject()
455+
.endObject()
456+
.endObject()
457+
.endObject());
458+
459+
IllegalArgumentException e = expectThrows(IllegalArgumentException.class,
460+
() -> parser.parse("type", new CompressedXContent(mapping)));
461+
assertEquals("Invalid format: [[test_format]]: expected string value", e.getMessage());
462+
}
463+
446464
}

server/src/test/java/org/elasticsearch/index/mapper/RootObjectMapperTests.java

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -159,4 +159,30 @@ public void testDynamicTemplates() throws Exception {
159159
mapper = mapperService.merge("type", new CompressedXContent(mapping3), MergeReason.MAPPING_UPDATE);
160160
assertEquals(mapping3, mapper.mappingSource().toString());
161161
}
162+
163+
public void testIllegalFormatField() throws Exception {
164+
String dynamicMapping = Strings.toString(XContentFactory.jsonBuilder()
165+
.startObject()
166+
.startObject("type")
167+
.startArray("dynamic_date_formats")
168+
.startArray().value("test_format").endArray()
169+
.endArray()
170+
.endObject()
171+
.endObject());
172+
String mapping = Strings.toString(XContentFactory.jsonBuilder()
173+
.startObject()
174+
.startObject("type")
175+
.startArray("date_formats")
176+
.startArray().value("test_format").endArray()
177+
.endArray()
178+
.endObject()
179+
.endObject());
180+
181+
DocumentMapperParser parser = createIndex("test").mapperService().documentMapperParser();
182+
for (String m : Arrays.asList(mapping, dynamicMapping)) {
183+
IllegalArgumentException e = expectThrows(IllegalArgumentException.class,
184+
() -> parser.parse("type", new CompressedXContent(m)));
185+
assertEquals("Invalid format: [[test_format]]: expected string value", e.getMessage());
186+
}
187+
}
162188
}

0 commit comments

Comments
 (0)