Skip to content

Commit 913183f

Browse files
committed
Filter event reporter payloads during encoding
1 parent f5d9c02 commit 913183f

File tree

4 files changed

+50
-10
lines changed

4 files changed

+50
-10
lines changed

activesupport/lib/active_support.rb

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -113,6 +113,8 @@ def self.eager_load!
113113
@event_reporter = ActiveSupport::EventReporter.new
114114
singleton_class.attr_accessor :event_reporter # :nodoc:
115115

116+
cattr_accessor :filter_parameters, default: [] # :nodoc:
117+
116118
def self.cache_format_version
117119
Cache.format_version
118120
end

activesupport/lib/active_support/event_reporter/encoders.rb

Lines changed: 16 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
# typed: true
22
# frozen_string_literal: true
33

4+
require "active_support/parameter_filter"
5+
46
module ActiveSupport
57
class EventReporter
68
# = Event Encoders
@@ -27,6 +29,18 @@ class Base
2729
def self.encode(event)
2830
raise NotImplementedError, "Subclasses must implement #encode"
2931
end
32+
33+
private
34+
35+
def self.transform_event(event)
36+
parameter_filter = ActiveSupport::ParameterFilter.new(ActiveSupport.filter_parameters, mask: ActiveSupport::ParameterFilter::FILTERED)
37+
event[:payload] = parameter_filter.filter(event[:payload].to_h)
38+
event[:tags] = event[:tags].transform_values do |value|
39+
value.respond_to?(:to_h) ? value.to_h : value
40+
end
41+
42+
event
43+
end
3044
end
3145

3246
# JSON encoder for serializing events to JSON format.
@@ -64,22 +78,14 @@ def self.encode(event)
6478

6579
class JSON < Base
6680
def self.encode(event)
67-
event[:payload] = event[:payload].to_h
68-
event[:tags] = event[:tags].transform_values do |value|
69-
value.respond_to?(:to_h) ? value.to_h : value
70-
end
71-
::JSON.dump(event)
81+
::JSON.dump(transform_event(event))
7282
end
7383
end
7484

7585
class MessagePack < Base
7686
def self.encode(event)
7787
require "msgpack"
78-
event[:payload] = event[:payload].to_h
79-
event[:tags] = event[:tags].transform_values do |value|
80-
value.respond_to?(:to_h) ? value.to_h : value
81-
end
82-
::MessagePack.pack(event)
88+
::MessagePack.pack(transform_event(event))
8389
rescue LoadError
8490
raise LoadError, "msgpack gem is required for MessagePack encoding. Add 'gem \"msgpack\"' to your Gemfile."
8591
end

activesupport/lib/active_support/railtie.rb

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -74,6 +74,12 @@ class Railtie < Rails::Railtie # :nodoc:
7474
app.executor.to_run { ActiveSupport.event_reporter.clear_context }
7575
end
7676

77+
initializer "active_support.set_filter_parameters" do |app|
78+
app.after_initialize do
79+
ActiveSupport.filter_parameters += Rails.application.config.filter_parameters
80+
end
81+
end
82+
7783
initializer "active_support.deprecation_behavior" do |app|
7884
if app.config.active_support.report_deprecations == false
7985
app.deprecators.silenced = true

activesupport/test/event_reporter_test.rb

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -628,6 +628,19 @@ def to_h
628628
assert_equal 200, parsed["tags"]["HttpRequestTag"]["http_status"]
629629
end
630630

631+
test "JSON encoder filters parameters" do
632+
previous_filter_parameters = ActiveSupport.filter_parameters
633+
ActiveSupport.filter_parameters = [:zomg]
634+
635+
@event[:payload][:zomg] = "secret"
636+
json_string = EventReporter::Encoders::JSON.encode(@event)
637+
parsed = ::JSON.parse(json_string)
638+
639+
assert_equal({ "id" => 123, "message" => "hello", "zomg" => "[FILTERED]" }, parsed["payload"])
640+
ensure
641+
ActiveSupport.filter_parameters = previous_filter_parameters
642+
end
643+
631644
test "MessagePack encoder encodes event to MessagePack" do
632645
begin
633646
require "msgpack"
@@ -656,5 +669,18 @@ def to_h
656669
assert_equal "GET", parsed["tags"]["HttpRequestTag"]["http_method"]
657670
assert_equal 200, parsed["tags"]["HttpRequestTag"]["http_status"]
658671
end
672+
673+
test "MessagePack encoder filters parameters" do
674+
previous_filter_parameters = ActiveSupport.filter_parameters
675+
ActiveSupport.filter_parameters = [:zomg]
676+
677+
@event[:payload][:zomg] = "secret"
678+
msgpack_data = EventReporter::Encoders::MessagePack.encode(@event)
679+
parsed = ::MessagePack.unpack(msgpack_data)
680+
681+
assert_equal({ "id" => 123, "message" => "hello", "zomg" => "[FILTERED]" }, parsed["payload"])
682+
ensure
683+
ActiveSupport.filter_parameters = previous_filter_parameters
684+
end
659685
end
660686
end

0 commit comments

Comments
 (0)