Skip to content

Commit c09d715

Browse files
committed
ensure filter params can still be checked when cast to regex
1 parent aa1e03b commit c09d715

File tree

3 files changed

+56
-2
lines changed

3 files changed

+56
-2
lines changed

lib/rails_semantic_logger/active_record/log_subscriber.rb

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,8 @@ def sql(event)
5555
# When multiple values are received for a single bound field, it is converted into an array
5656
def add_bind_value(binds, key, value)
5757
key = key.downcase.to_sym unless key.nil?
58-
if Rails.configuration.filter_parameters.include? key
58+
59+
if rails_filter_params_include?(key)
5960
value = "[FILTERED]"
6061
elsif binds.key?(key)
6162
value = (Array(binds[key]) << value)
@@ -64,6 +65,14 @@ def add_bind_value(binds, key, value)
6465
binds[key] = value
6566
end
6667

68+
def rails_filter_params_include?(key)
69+
filter_parameters = Rails.configuration.filter_parameters
70+
71+
return filter_parameters.first.match? key if filter_parameters.first.is_a? Regexp
72+
73+
filter_parameters.include? key
74+
end
75+
6776
def logger
6877
self.class.logger
6978
end

test/active_record_test.rb

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -115,6 +115,34 @@ class ActiveRecordTest < Minitest::Test
115115
end
116116
end
117117

118+
it "filtered bind value when filter_parameters set as regex" do
119+
filter_params_regex_setting true, %i[name] do
120+
expected_sql =
121+
if Rails.version.to_f >= 5.2
122+
"SELECT #{extra_space}\"samples\".* FROM \"samples\" WHERE \"samples\".\"name\" = ? ORDER BY \"samples\".\"id\" ASC LIMIT ?"
123+
else
124+
"SELECT \"samples\".* FROM \"samples\" WHERE \"samples\".\"name\" = ? ORDER BY \"samples\".\"id\" ASC LIMIT ?"
125+
end
126+
127+
messages = semantic_logger_events do
128+
Sample.where(name: "Jack").first
129+
end
130+
assert_equal 1, messages.count, messages
131+
132+
assert_semantic_logger_event(
133+
messages[0],
134+
level: :debug,
135+
name: "ActiveRecord",
136+
message: "Sample Load",
137+
payload_includes: {
138+
sql: expected_sql,
139+
binds: {name: "[FILTERED]", limit: 1}
140+
}
141+
)
142+
assert_instance_of Integer, messages[0].payload[:allocations] if Rails.version.to_i >= 6
143+
end
144+
end
145+
118146
it "multiple bind values" do
119147
skip "Not applicable to older rails" if Rails.version.to_f <= 5.1
120148

test/test_helper.rb

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,8 +25,25 @@
2525
ActionMailer::Base.delivery_method = :test
2626

2727
def filter_params_setting(value, user_defined_params, &block)
28+
original_value = Rails.configuration.filter_parameters
29+
Rails.configuration.filter_parameters = user_defined_params
30+
block.call
31+
ensure
32+
Rails.configuration.filter_parameters = original_value
33+
end
34+
35+
def filter_params_regex_setting(value, user_defined_params, &block)
36+
original_value = Rails.configuration.filter_parameters
37+
2838
Rails.configuration.filter_parameters += user_defined_params
39+
40+
filter_params_regex = Rails.configuration.filter_parameters.map do |key|
41+
"(?i:#{key})"
42+
end.join("|")
43+
44+
Rails.configuration.filter_parameters = [/(?-mix:#{filter_params_regex})/]
45+
2946
block.call
3047
ensure
31-
Rails.configuration.filter_parameters -= user_defined_params
48+
Rails.configuration.filter_parameters = original_value
3249
end

0 commit comments

Comments
 (0)