فهرست منبع

Validate regular expressions in dynamic templates. (#29013)

Today you would only get these errors at index time.

Relates #24749
Adrien Grand 7 سال پیش
والد
کامیت
404e776a45

+ 18 - 1
server/src/main/java/org/elasticsearch/index/mapper/DynamicTemplate.java

@@ -216,7 +216,24 @@ public class DynamicTemplate implements ToXContentObject {
                 }
             }
         }
-        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;

+ 13 - 0
server/src/test/java/org/elasticsearch/index/mapper/DynamicTemplateTests.java

@@ -62,6 +62,19 @@ public class DynamicTemplateTests extends ESTestCase {
                 e.getMessage());
     }
 
+    public void testParseInvalidRegex() {
+        for (String param : new String[] { "path_match", "match", "path_unmatch", "unmatch" }) {
+            Map<String, Object> 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<String, Object> templateDef = new HashMap<>();
         templateDef.put("match_mapping_type", "*");