Skip to content

Commit

Permalink
fix!: gathered_filter to process regex correctly (#583)
Browse files Browse the repository at this point in the history
Removed backslash(\) escape char from shlex to avoid escaping
and properly processing regex expressions.

BREAKING CHANGE: `gathered_filter` in 'gathered' state now accepts valid regex
expressions, the previous syntax with extra escape characters is not valid anymore.
  • Loading branch information
alperenkose authored Oct 1, 2024
1 parent 2375a93 commit ae4103a
Show file tree
Hide file tree
Showing 2 changed files with 38 additions and 1 deletion.
25 changes: 25 additions & 0 deletions docs/source/gatheredfilter.rst
Original file line number Diff line number Diff line change
Expand Up @@ -125,6 +125,31 @@ These all do the same thing, listed from fastest to slowest.
gathered_filter: 'name matches-regex .*?'
Example - Matching a Regex
--------------------------
It is possible to write regex in the following formats;
* Standard regex in single quotation marks(`'`)
* Escaped backslash in double quotation marks(`"`)
* Using folded block scalar followed by a dash (`>-`) without any quotation marks
See examples below which correspond to the same regex:
.. code-block:: yaml
gathered_filter: 'name matches-regex \sPAN\s'
.. code-block:: yaml
gathered_filter: "name matches-regex \\sPAN\\s"
.. code-block:: yaml
gathered_filter: >-
name matches-regex \sPAN\s
Example - Matching a Suffix
---------------------------
Expand Down
14 changes: 13 additions & 1 deletion plugins/module_utils/panos.py
Original file line number Diff line number Diff line change
Expand Up @@ -1200,6 +1200,18 @@ def _get_default_value(self, obj, key):

return default_value

def _shlex_split(self, logic):
"""Split string using shlex.split without escape char
Escape char '\' is removed from shlex class to correctly process regex.
"""
lex = shlex.shlex(logic, posix=True)
lex.whitespace_split = True
lex.commenters = ""
lex.escape = ""

return list(lex)

def matches_gathered_filter(self, item, logic):
"""Returns True if the item and its contents matches the logic given.
Expand All @@ -1223,7 +1235,7 @@ def matches_gathered_filter(self, item, logic):
evaler = []

pdepth = 0
logic_tokens = shlex.split(logic)
logic_tokens = self._shlex_split(logic)
token_iter = iter(logic_tokens)
while True:
end_parens = 0
Expand Down

0 comments on commit ae4103a

Please sign in to comment.