fix: support nested function calls in cache_key_wrapper (#38569)

This commit is contained in:
Ville Brofeldt
2026-03-12 04:08:58 -07:00
committed by GitHub
parent 27197faba9
commit a9def2fc15
2 changed files with 28 additions and 7 deletions

View File

@@ -122,13 +122,13 @@ class ExtraCache:
# be added to the cache key.
regex = re.compile(
r"(\{\{|\{%)[^{}]*?("
r"current_user_id\([^()]*\)|"
r"current_username\([^()]*\)|"
r"current_user_email\([^()]*\)|"
r"current_user_rls_rules\([^()]*\)|"
r"current_user_roles\([^()]*\)|"
r"cache_key_wrapper\([^()]*\)|"
r"url_param\([^()]*\)"
r"current_user_id\([^)]*\)|"
r"current_username\([^)]*\)|"
r"current_user_email\([^)]*\)|"
r"current_user_rls_rules\([^)]*\)|"
r"current_user_roles\([^)]*\)|"
r"cache_key_wrapper\([^)]*\)|"
r"url_param\([^)]*\)"
r")"
r"[^{}]*?(\}\}|\%\})"
)

View File

@@ -1693,3 +1693,24 @@ def test_undefined_template_variable_not_function(mocker: MockerFixture) -> None
template = "SELECT {{ undefined_variable.some_method() }}"
with pytest.raises(UndefinedError):
processor.process_template(template)
@pytest.mark.parametrize(
("sql", "expected"),
[
("SELECT {{ cache_key_wrapper(abc) }}", True),
("SELECT {{ cache_key_wrapper(myfunc()) }}", True),
("SELECT {{ url_param('foo') }}", True),
("SELECT {{ url_param(get_param('foo')) }}", True),
("SELECT {{ current_user_id() }}", True),
("SELECT {{ current_username() }}", True),
("SELECT {{ current_user_email() }}", True),
("SELECT {{ current_user_roles() }}", True),
("SELECT {{ current_user_rls_rules() }}", True),
("SELECT 'cache_key_wrapper(abc)' AS false_positive", False),
("SELECT 1", False),
("SELECT '{{ 1 + 1 }}'", False),
],
)
def test_extra_cache_regex(sql: str, expected: bool) -> None:
assert bool(ExtraCache.regex.search(sql)) is expected