From eb6c3f685c9c5501c8ebf0b06a9a71da2a9fe7ad Mon Sep 17 00:00:00 2001 From: Adrien Grand Date: Tue, 13 Mar 2018 14:34:04 +0100 Subject: [PATCH 1/2] Validate regular expressions in dynamic templates. Today you would only get these errors at index time. Relates #24749 --- .../index/mapper/DynamicTemplate.java | 19 ++++++++++++++++++- .../index/mapper/DynamicTemplateTests.java | 13 +++++++++++++ 2 files changed, 31 insertions(+), 1 deletion(-) diff --git a/server/src/main/java/org/elasticsearch/index/mapper/DynamicTemplate.java b/server/src/main/java/org/elasticsearch/index/mapper/DynamicTemplate.java index 8da1915b8ca56..71a2cdb32f9df 100644 --- a/server/src/main/java/org/elasticsearch/index/mapper/DynamicTemplate.java +++ b/server/src/main/java/org/elasticsearch/index/mapper/DynamicTemplate.java @@ -216,7 +216,24 @@ public static DynamicTemplate parse(String name, Map conf, } } } - return new DynamicTemplate(name, pathMatch, pathUnmatch, match, unmatch, xcontentFieldType, MatchType.fromString(matchPattern), mapping); + + final MatchType matchType = MatchType.fromString(matchPattern); + + if (indexVersionCreated.onOrAfter(Version.V_6_3_0)) { + // Validate that the pattern + for (String regex : new String[] { pathMatch, match, pathUnmatch, unmatch }) { + if (regex == null) { + continue; + } + try { + matchType.matches(regex, ""); + } catch (IllegalArgumentException e) { + throw new IllegalArgumentException("Pattern [" + regex + "] of type [" + matchType + "] is invalid. Cannot create dynamic template [" + name + "].", e); + } + } + } + + return new DynamicTemplate(name, pathMatch, pathUnmatch, match, unmatch, xcontentFieldType, matchType, mapping); } private final String name; diff --git a/server/src/test/java/org/elasticsearch/index/mapper/DynamicTemplateTests.java b/server/src/test/java/org/elasticsearch/index/mapper/DynamicTemplateTests.java index 7ed6efe516ab0..a534321f326a8 100644 --- a/server/src/test/java/org/elasticsearch/index/mapper/DynamicTemplateTests.java +++ b/server/src/test/java/org/elasticsearch/index/mapper/DynamicTemplateTests.java @@ -61,6 +61,19 @@ public void testParseUnknownMatchType() { e.getMessage()); } + public void testParseInvalidRegex() { + for (String param : new String[] { "path_match", "match", "path_unmatch", "unmatch" }) {System.out.println(param); + Map templateDef = new HashMap<>(); + templateDef.put("match", "foo"); + templateDef.put(param, "*a"); + templateDef.put("match_pattern", "regex"); + templateDef.put("mapping", Collections.singletonMap("store", true)); + IllegalArgumentException e = expectThrows(IllegalArgumentException.class, + () -> DynamicTemplate.parse("my_template", templateDef, Version.V_6_3_0)); + assertEquals("Pattern [*a] of type [regex] is invalid. Cannot create dynamic template [my_template].", e.getMessage()); + } + } + public void testMatchAllTemplate() { Map templateDef = new HashMap<>(); templateDef.put("match_mapping_type", "*"); From 837887b4f022fa2fccdd2fc0bd4769e8748a5d75 Mon Sep 17 00:00:00 2001 From: Adrien Grand Date: Wed, 14 Mar 2018 23:10:30 +0100 Subject: [PATCH 2/2] Update DynamicTemplateTests.java --- .../org/elasticsearch/index/mapper/DynamicTemplateTests.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/server/src/test/java/org/elasticsearch/index/mapper/DynamicTemplateTests.java b/server/src/test/java/org/elasticsearch/index/mapper/DynamicTemplateTests.java index a534321f326a8..7f61e86aead62 100644 --- a/server/src/test/java/org/elasticsearch/index/mapper/DynamicTemplateTests.java +++ b/server/src/test/java/org/elasticsearch/index/mapper/DynamicTemplateTests.java @@ -62,7 +62,7 @@ public void testParseUnknownMatchType() { } public void testParseInvalidRegex() { - for (String param : new String[] { "path_match", "match", "path_unmatch", "unmatch" }) {System.out.println(param); + for (String param : new String[] { "path_match", "match", "path_unmatch", "unmatch" }) { Map templateDef = new HashMap<>(); templateDef.put("match", "foo"); templateDef.put(param, "*a");