From 6f03593bc282ed6260f3d504ff4d483878fafad0 Mon Sep 17 00:00:00 2001 From: Daniel Silverstone Date: Thu, 21 May 2020 17:43:30 +0100 Subject: feat: Add error if implicit simple pattern has regex metacharacters Signed-off-by: Daniel Silverstone --- src/bindings.rs | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/src/bindings.rs b/src/bindings.rs index d7246c6..cfce627 100644 --- a/src/bindings.rs +++ b/src/bindings.rs @@ -362,7 +362,8 @@ fn from_hashmap(parsed: &ParsedBinding) -> Result { let pattern = if parsed.regex.unwrap_or(false) { pattern.to_string() } else { - regex_from_simple_pattern(pattern)? + // if we get here parsed.regex is either None or Some(false) + regex_from_simple_pattern(pattern, parsed.regex.is_some())? }; Ok(Binding::new( @@ -496,7 +497,7 @@ mod test_bindings { } } -fn regex_from_simple_pattern(pattern: &str) -> Result { +fn regex_from_simple_pattern(pattern: &str, explicit_plain: bool) -> Result { let pat = Regex::new(r"\{[^\s\{\}]+\}").unwrap(); let mut r = String::new(); let mut end = 0; @@ -505,6 +506,11 @@ fn regex_from_simple_pattern(pattern: &str) -> Result { if before.find('{').is_some() || before.find('}').is_some() { return Err(SubplotError::StrayBraceInSimplePattern(pattern.to_string())); } + if !explicit_plain && before.chars().any(|c| r"$^*.()+\?|[]".contains(c)) { + return Err(SubplotError::SimplePatternHasMetaCharacters( + pattern.to_owned(), + )); + } r.push_str(&escape(before)); let name = &pattern[m.start() + 1..m.end() - 1]; r.push_str(&format!(r"(?P<{}>\S+)", name)); @@ -514,6 +520,11 @@ fn regex_from_simple_pattern(pattern: &str) -> Result { if after.find('{').is_some() || after.find('}').is_some() { return Err(SubplotError::StrayBraceInSimplePattern(pattern.to_string())); } + if !explicit_plain && after.chars().any(|c| r"$^*.()+\?|[]".contains(c)) { + return Err(SubplotError::SimplePatternHasMetaCharacters( + pattern.to_owned(), + )); + } r.push_str(&escape(after)); Ok(r) } -- cgit v1.2.1