Skip to content

Commit 736d61a

Browse files
GRIF-683: Fixing invalid ascii characters in LCM bricks parameters
1 parent 2605faf commit 736d61a

File tree

3 files changed

+48
-107
lines changed

3 files changed

+48
-107
lines changed

VERSION

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
3.7.102
1+
3.7.103

lib/gooddata/helpers/global_helpers_params.rb

Lines changed: 28 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -71,15 +71,19 @@ def decode_params(params, options = {})
7171
end
7272

7373
reference_values = []
74+
sanitize_values = {}
7475
# Replace reference parameters by the actual values. Use backslash to escape a reference parameter, e.g: \${not_a_param},
7576
# the ${not_a_param} will not be replaced
7677
if options[:resolve_reference_params]
77-
data_params, reference_values = resolve_reference_params(data_params, params)
78+
data_params, reference_values, sanitize_values = resolve_reference_params(data_params, params)
7879
hidden_data_params, = resolve_reference_params(hidden_data_params, params)
7980
end
8081

8182
begin
8283
parsed_data_params = data_params.is_a?(Hash) ? data_params : JSON.parse(data_params)
84+
# Invalid ascii characters in data_params make json parse fails. So after escape the invalid ascii
85+
# characters to json parse success then We need recover them to origin value
86+
recover_sanitize_value(parsed_data_params, sanitize_values) if sanitize_values.any?
8387
rescue JSON::ParserError => exception
8488
reason = exception.message
8589
reference_values.each { |secret_value| reason.gsub!("\"#{secret_value}\"", '"***"') }
@@ -240,8 +244,23 @@ def stringify_values(value)
240244

241245
private
242246

247+
def invalid_ascii_value(data)
248+
data.include?("\n")
249+
end
250+
251+
def recover_sanitize_value(parsed_data_params, sanitize_values)
252+
parsed_data_params.map do |k, v|
253+
if v.is_a?(Hash)
254+
recover_sanitize_value(v, sanitize_values)
255+
else
256+
parsed_data_params[k] = sanitize_values[v] if sanitize_values.include?(v)
257+
end
258+
end
259+
end
260+
243261
def resolve_reference_params(data_params, params)
244262
reference_values = []
263+
sanitize_values = {}
245264
regexps = Regexp.union(/\\\\/, /\\\$/, /\$\{([^\n\{\}]+)\}/)
246265
resolve_reference = lambda do |v|
247266
if v.is_a? Hash
@@ -266,7 +285,13 @@ def resolve_reference_params(data_params, params)
266285
val = params["#{$1}"]
267286
if val
268287
reference_values << val
269-
val
288+
if invalid_ascii_value(val)
289+
escape_value = val.gsub("\n", "\\n")
290+
sanitize_values[escape_value] = val
291+
escape_value
292+
else
293+
val
294+
end
270295
else
271296
GoodData.logger.warn "Reference '#{$1}' is not found!"
272297
match
@@ -284,7 +309,7 @@ def resolve_reference_params(data_params, params)
284309
resolve_reference.call(data_params)
285310
end
286311

287-
[data_params, reference_values]
312+
[data_params, reference_values, sanitize_values]
288313
end
289314
end
290315
end

spec/unit/helpers/global_helpers_spec.rb

Lines changed: 19 additions & 103 deletions
Original file line numberDiff line numberDiff line change
@@ -162,22 +162,41 @@
162162
'x' => 'y',
163163
'ads_password' => 'ads_123',
164164
'my_password' => 'login_123',
165+
'private_key' => '-----TEST-----
166+
abc
167+
123
168+
-----END TEST-----',
165169
'alias.user' => 'qa+test@gooddata.com',
166170
'alias.segment' => 'UserTestSegmentK8s',
167171
'gd_encoded_params' => '{"login_username": "${alias.user}",
168172
"login_password": "abc_${my_password}_123" ,
169173
"SEGMENTS_FILTER": ["${alias.segment}"],
174+
"connection": {
175+
"username": "${alias.user}",
176+
"db_private_key": "${private_key}"
177+
},
170178
"technical_user": ["${alias.user}"]}'
171179
}
172180
expected_result = {
173181
'x' => 'y',
174182
'ads_password' => 'ads_123',
175183
'my_password' => 'login_123',
184+
'private_key' => '-----TEST-----
185+
abc
186+
123
187+
-----END TEST-----',
176188
'alias.user' => 'qa+test@gooddata.com',
177189
'alias.segment' => 'UserTestSegmentK8s',
178190
'login_username' => 'qa+test@gooddata.com',
179191
'login_password' => 'abc_login_123_123',
180192
'SEGMENTS_FILTER' => ["UserTestSegmentK8s"],
193+
'connection' => {
194+
'username' => 'qa+test@gooddata.com',
195+
'db_private_key' => '-----TEST-----
196+
abc
197+
123
198+
-----END TEST-----'
199+
},
181200
'technical_user' => ["qa+test@gooddata.com"]
182201
}
183202
result = GoodData::Helpers.decode_params(params, :resolve_reference_params => true)
@@ -211,108 +230,5 @@
211230
expect(result).to eq(expected_result)
212231
end
213232

214-
it 'should encode escape reference parameters in gd_encoded_params' do
215-
params = {
216-
'x' => 'y',
217-
'ads_password' => 'ads_123',
218-
'my_password' => 'login_123',
219-
'gd_encoded_params' => '{"login_username": "login_user", "data01": "\\${abc}"}'
220-
}
221-
expected_result = {
222-
'x' => 'y',
223-
'ads_password' => 'ads_123',
224-
'my_password' => 'login_123',
225-
'login_username' => 'login_user',
226-
'data01' => '${abc}'
227-
}
228-
result = GoodData::Helpers.decode_params(params, :resolve_reference_params => true)
229-
expect(result).to eq(expected_result)
230-
end
231-
232-
it 'should encode reference parameters in nested block in gd_encoded_params' do
233-
params = {
234-
'x' => 'y',
235-
'ads_password' => 'ads_123',
236-
'my_password' => 'login_123',
237-
'gd_encoded_params' => '{"login_username": "login_user", "ads_client": {"username": "ads_user", "password": "${ads_password}"}}'
238-
}
239-
expected_result = {
240-
'x' => 'y',
241-
'ads_password' => 'ads_123',
242-
'my_password' => 'login_123',
243-
'login_username' => 'login_user',
244-
'ads_client' => {
245-
'username' => 'ads_user',
246-
'password' => 'ads_123'
247-
}
248-
}
249-
result = GoodData::Helpers.decode_params(params, :resolve_reference_params => true)
250-
expect(result).to eq(expected_result)
251-
end
252-
253-
it 'should convert all values into String' do
254-
params = {
255-
x: true,
256-
y: ['hello', false],
257-
z: {
258-
z1: false,
259-
z2: [true],
260-
z3: [[[false]]]
261-
}
262-
}
263-
expected_result = {
264-
x: 'true',
265-
y: %w(hello false),
266-
z: {
267-
z1: 'false',
268-
z2: ['true'],
269-
z3: [[['false']]]
270-
}
271-
}
272-
result = GoodData::Helpers.stringify_values(params)
273-
expect(result).to eq(expected_result)
274-
end
275-
end
276-
277-
describe '.interpolate_error_message' do
278-
let(:error_message) { { 'error' => { 'message' => 'foo %s', 'parameters' => ['bar'] } } }
279-
280-
before do
281-
@message = GoodData::Helpers.interpolate_error_message(error_message)
282-
end
283-
284-
it 'interpolates parameters' do
285-
expect(@message).to eq('foo bar')
286-
end
287-
288-
context 'when error parameter is empty' do
289-
let(:error_message) { {} }
290-
it 'returns nil' do
291-
expect(@message).to be_nil
292-
end
293-
end
294-
295-
context 'when error key is empty' do
296-
let(:error_message) { { 'error' => {} } }
297-
it 'returns nil' do
298-
expect(@message).to be_nil
299-
end
300-
end
301-
end
302-
303-
describe '.decode_params' do
304-
it 'interpolates reference parameters in additional_hidden_params' do
305-
params = {
306-
'gd_encoded_hidden_params' => '{ "additional_hidden_params": { "secret": "${my_password}" } }',
307-
'my_password' => "123"
308-
}
309-
expected_result = {
310-
'gd_encoded_hidden_params' => nil,
311-
'additional_hidden_params' => { 'secret' => '123' },
312-
'my_password' => '123'
313-
}
314-
result = GoodData::Helpers.decode_params(params, :resolve_reference_params => true)
315-
expect(result).to eq(expected_result)
316-
end
317233
end
318234
end

0 commit comments

Comments
 (0)