From 9f10cfc7d96e5f9eba9f6a14fe99459ff4eea33b Mon Sep 17 00:00:00 2001 From: Hung Nguyen Date: Fri, 27 Feb 2026 15:11:32 +0700 Subject: [PATCH] GRIF-683: Fixing escape invalid ascii characters in LCM bricks parameters --- lib/gooddata/helpers/global_helpers_params.rb | 23 +++++++++++++++++-- 1 file changed, 21 insertions(+), 2 deletions(-) diff --git a/lib/gooddata/helpers/global_helpers_params.rb b/lib/gooddata/helpers/global_helpers_params.rb index 6b977e351..c3b2bf957 100644 --- a/lib/gooddata/helpers/global_helpers_params.rb +++ b/lib/gooddata/helpers/global_helpers_params.rb @@ -79,7 +79,11 @@ def decode_params(params, options = {}) end begin - parsed_data_params = data_params.is_a?(Hash) ? data_params : JSON.parse(data_params) + parsed_data_params = if data_params.is_a?(Hash) + data_params + else + JSON.parse(sanitize_invalid_ascii_chars(data_params)) + end rescue JSON::ParserError => exception reason = exception.message reference_values.each { |secret_value| reason.gsub!("\"#{secret_value}\"", '"***"') } @@ -87,7 +91,11 @@ def decode_params(params, options = {}) end begin - parsed_hidden_data_params = hidden_data_params.is_a?(Hash) ? hidden_data_params : JSON.parse(hidden_data_params) + parsed_hidden_data_params = if hidden_data_params.is_a?(Hash) + hidden_data_params + else + JSON.parse(sanitize_invalid_ascii_chars(hidden_data_params)) + end rescue JSON::ParserError => exception raise exception.class, "Error reading json from '#{hidden_key}'" end @@ -240,6 +248,17 @@ def stringify_values(value) private + # JSON does not allow unescaped ASCII control characters (0x00-0x1F) in strings. + # If such characters appear in the JSON payload coming from the platform, then we replace + # each raw control character with its escaped unicode form (\u0000 - \u001F). + def sanitize_invalid_ascii_chars(json_string) + return json_string unless json_string.is_a?(String) + + json_string.gsub(/[\x00-\x1F]/) do |ch| + "\\u%04x" % ch.ord + end + end + def resolve_reference_params(data_params, params) reference_values = [] regexps = Regexp.union(/\\\\/, /\\\$/, /\$\{([^\n\{\}]+)\}/)