You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@superset.apache.org by ru...@apache.org on 2026/06/03 04:23:55 UTC
(superset) branch master updated: fix(jinja): apply consistent escaping to url_param values from request args (#40633)
This is an automated email from the ASF dual-hosted git repository.
rusackas pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/superset.git
The following commit(s) were added to refs/heads/master by this push:
new 12bef03f4af fix(jinja): apply consistent escaping to url_param values from request args (#40633)
12bef03f4af is described below
commit 12bef03f4aff4308c8a35d97d600616e8102e08a
Author: Evan Rusackas <ev...@preset.io>
AuthorDate: Tue Jun 2 21:23:48 2026 -0700
fix(jinja): apply consistent escaping to url_param values from request args (#40633)
Co-authored-by: Claude Code <no...@anthropic.com>
---
superset/jinja_context.py | 12 +++++++-----
tests/unit_tests/jinja_context_test.py | 19 +++++++++++++++++++
2 files changed, 26 insertions(+), 5 deletions(-)
diff --git a/superset/jinja_context.py b/superset/jinja_context.py
index 2a2e838708f..1c8b3d1f859 100644
--- a/superset/jinja_context.py
+++ b/superset/jinja_context.py
@@ -288,11 +288,13 @@ class ExtraCache:
from superset.views.utils import get_form_data
if has_request_context() and request.args.get(param):
- return request.args.get(param, default)
-
- form_data, _ = get_form_data()
- url_params = form_data.get("url_params") or {}
- result = url_params.get(param, default)
+ result = request.args.get(param, default)
+ else:
+ form_data, _ = get_form_data()
+ url_params = form_data.get("url_params") or {}
+ result = url_params.get(param, default)
+ # Escape the value regardless of its source (request args or form
+ # data); both are interpolated into the rendered SQL.
if result and escape_result and self.dialect:
# use the dialect specific quoting logic to escape string
result = String().literal_processor(dialect=self.dialect)(value=result)[
diff --git a/tests/unit_tests/jinja_context_test.py b/tests/unit_tests/jinja_context_test.py
index cfdbc2090d0..7c9353dd1ad 100644
--- a/tests/unit_tests/jinja_context_test.py
+++ b/tests/unit_tests/jinja_context_test.py
@@ -438,6 +438,25 @@ def test_url_param_unescaped_default_form_data() -> None:
assert cache.url_param("bar", "O'Malley", escape_result=False) == "O'Malley"
+def test_url_param_escaped_request_args() -> None:
+ """
+ Values read from the request query string are escaped the same way as
+ values from ``form_data`` (both are interpolated into the rendered SQL).
+ """
+ with current_app.test_request_context(query_string={"foo": "O'Brien"}):
+ cache = ExtraCache(dialect=dialect())
+ assert cache.url_param("foo") == "O''Brien"
+
+
+def test_url_param_unescaped_request_args() -> None:
+ """
+ ``escape_result=False`` still opts out of escaping for request-args values.
+ """
+ with current_app.test_request_context(query_string={"foo": "O'Brien"}):
+ cache = ExtraCache(dialect=dialect())
+ assert cache.url_param("foo", escape_result=False) == "O'Brien"
+
+
def test_safe_proxy_primitive() -> None:
"""
Test the ``safe_proxy`` helper with a function returning a ``str``.