From 80f5818850a8533d9780af4000302e52add45881 Mon Sep 17 00:00:00 2001 From: jorgeav <54142549+jorgeav@users.noreply.github.com> Date: Tue, 7 Nov 2023 07:42:25 +1100 Subject: [PATCH] Jinja2 template helper filter b64decode (#3242) # What this PR does Add an additional jinja2 template helper filter to decode base64-encoded strings. An example of an incoming integration payload that would benefit from this filter is GCP's pubsub message: https://cloud.google.com/pubsub/docs/reference/rest/v1/PubsubMessage ## Which issue(s) this PR fixes ## Checklist - [x] Unit, integration, and e2e (if applicable) tests updated - [x] Documentation added (or `pr:no public docs` PR label added if not required) - [ ] `CHANGELOG.md` updated (or `pr:no changelog` PR label added if not required) --------- Co-authored-by: Jorge Vargas Co-authored-by: Joey Orlando Co-authored-by: Joey Orlando --- CHANGELOG.md | 4 ++++ docs/sources/jinja2-templating/_index.md | 1 + engine/common/jinja_templater/filters.py | 8 ++++++++ engine/common/jinja_templater/jinja_template_env.py | 2 ++ engine/common/tests/test_base64decode.py | 7 +++++++ .../src/components/CheatSheet/CheatSheet.config.ts | 1 + 6 files changed, 23 insertions(+) create mode 100644 engine/common/tests/test_base64decode.py diff --git a/CHANGELOG.md b/CHANGELOG.md index ab587266..525600c6 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,10 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## Unreleased +### Added + +- Add `b64decode` Jinja2 template helper filter by @jorgeav ([#3242](https://github.com/grafana/oncall/pull/3242)) + ## v1.3.53 (2023-11-03) ### Fixed diff --git a/docs/sources/jinja2-templating/_index.md b/docs/sources/jinja2-templating/_index.md index 6fb52e3d..887689f7 100644 --- a/docs/sources/jinja2-templating/_index.md +++ b/docs/sources/jinja2-templating/_index.md @@ -206,5 +206,6 @@ Built-in functions: - `datetimeformat` - converts time from datetime to the given format (`%H:%M / %d-%m-%Y` by default) - `regex_replace` - performs a regex find and replace - `regex_match` - performs a regex match, returns `True` or `False`. Usage example: `{{ payload.ruleName | regex_match(".*") }}` +- `b64decode` - performs a base64 string decode. Usage example: `{{ payload.data | b64decode }}` {{< section >}} diff --git a/engine/common/jinja_templater/filters.py b/engine/common/jinja_templater/filters.py index 88b4797d..59618eb5 100644 --- a/engine/common/jinja_templater/filters.py +++ b/engine/common/jinja_templater/filters.py @@ -1,3 +1,4 @@ +import base64 import json import re @@ -51,3 +52,10 @@ def json_dumps(value): return json.dumps(value) except (ValueError, AttributeError, TypeError): return None + + +def b64decode(value): + try: + return base64.b64decode(value).decode("utf-8") + except (ValueError, AttributeError, TypeError): + return None diff --git a/engine/common/jinja_templater/jinja_template_env.py b/engine/common/jinja_templater/jinja_template_env.py index f4d2d65a..21c227c7 100644 --- a/engine/common/jinja_templater/jinja_template_env.py +++ b/engine/common/jinja_templater/jinja_template_env.py @@ -4,6 +4,7 @@ from jinja2.exceptions import SecurityError from jinja2.sandbox import SandboxedEnvironment from .filters import ( + b64decode, datetimeformat, iso8601_to_time, json_dumps, @@ -29,3 +30,4 @@ jinja_template_env.filters["regex_replace"] = regex_replace jinja_template_env.filters["regex_match"] = regex_match jinja_template_env.filters["regex_search"] = regex_search jinja_template_env.filters["json_dumps"] = json_dumps +jinja_template_env.filters["b64decode"] = b64decode diff --git a/engine/common/tests/test_base64decode.py b/engine/common/tests/test_base64decode.py new file mode 100644 index 00000000..59fbf666 --- /dev/null +++ b/engine/common/tests/test_base64decode.py @@ -0,0 +1,7 @@ +from common.jinja_templater.filters import b64decode + + +def test_base64_decode(): + original = "dGVzdCBzdHJpbmch" + expected = "test string!" + assert b64decode(original) == expected diff --git a/grafana-plugin/src/components/CheatSheet/CheatSheet.config.ts b/grafana-plugin/src/components/CheatSheet/CheatSheet.config.ts index 3f0e600d..506522ae 100644 --- a/grafana-plugin/src/components/CheatSheet/CheatSheet.config.ts +++ b/grafana-plugin/src/components/CheatSheet/CheatSheet.config.ts @@ -83,6 +83,7 @@ export const genericTemplateCheatSheet: CheatSheetInterface = { { listItemName: 'time(), datetimeformat, iso8601_to_time' }, { listItemName: 'to_pretty_json' }, { listItemName: 'regex_replace, regex_match' }, + { listItemName: 'b64decode' }, ], }, {