Skip to content

Commit 2341bf8

Browse files
authored
fix: filter extra even without request (#14)
1 parent ac6a7b6 commit 2341bf8

File tree

4 files changed

+93
-26
lines changed

4 files changed

+93
-26
lines changed

.github/workflows/ci-macos.yml

+1-1
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ on:
66
jobs:
77
rspec:
88
name: Unit tests
9-
runs-on: macos-latest
9+
runs-on: macos-13
1010
strategy:
1111
matrix:
1212
include:

Gemfile.lock

+4-2
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,8 @@ GEM
88
remote: https://rubygems.org/
99
specs:
1010
ast (2.4.2)
11-
concurrent-ruby (1.1.10)
11+
bigdecimal (3.1.9)
12+
concurrent-ruby (1.3.5)
1213
diff-lcs (1.5.0)
1314
docile (1.4.0)
1415
parallel (1.23.0)
@@ -44,7 +45,8 @@ GEM
4445
rubocop-ast (1.29.0)
4546
parser (>= 3.2.1.0)
4647
ruby-progressbar (1.13.0)
47-
sentry-ruby (5.4.1)
48+
sentry-ruby (5.22.2)
49+
bigdecimal
4850
concurrent-ruby (~> 1.0, >= 1.0.2)
4951
simplecov (0.18.5)
5052
docile (~> 1.1)

lib/sentry/sanitizer/cleaner.rb

+31-23
Original file line numberDiff line numberDiff line change
@@ -20,34 +20,42 @@ def initialize(config)
2020
end
2121

2222
def call(event)
23-
if event.is_a?(Sentry::Event)
24-
sanitize(event, :object) if event.request
25-
elsif event.is_a?(Hash)
26-
sanitize(event, :stringified_hash) if event["request"]
27-
sanitize(event, :symbolized_hash) if event[:request]
23+
case event
24+
when Sentry::Event
25+
sanitize(event, :event)
26+
when Hash
27+
sanitize(event, :hash)
2828
end
2929
end
3030

31-
def sanitize(event, type)
31+
def sanitize(event, type) # rubocop:disable Metrics/CyclomaticComplexity, Metrics/PerceivedComplexity
3232
case type
33-
when :object
34-
event.request.data = sanitize_data(event.request.data)
35-
event.request.headers = sanitize_headers(event.request.headers)
36-
event.request.cookies = sanitize_cookies(event.request.cookies)
37-
event.request.query_string = sanitize_query_string(event.request.query_string)
33+
when :event
34+
if event.request
35+
event.request.data = sanitize_data(event.request.data)
36+
event.request.headers = sanitize_headers(event.request.headers)
37+
event.request.cookies = sanitize_cookies(event.request.cookies)
38+
event.request.query_string = sanitize_query_string(event.request.query_string)
39+
end
3840
event.extra = sanitize_data(event.extra)
39-
when :stringified_hash
40-
event["request"]["data"] = sanitize_data(event["request"]["data"])
41-
event["request"]["headers"] = sanitize_headers(event["request"]["headers"])
42-
event["request"]["cookies"] = sanitize_cookies(event["request"]["cookies"])
43-
event["request"]["query_string"] = sanitize_query_string(event["request"]["query_string"])
44-
event["extra"] = sanitize_data(event["extra"])
45-
when :symbolized_hash
46-
event[:request][:data] = sanitize_data(event[:request][:data])
47-
event[:request][:headers] = sanitize_headers(event[:request][:headers])
48-
event[:request][:cookies] = sanitize_cookies(event[:request][:cookies])
49-
event[:request][:query_string] = sanitize_query_string(event[:request][:query_string])
50-
event[:extra] = sanitize_data(event[:extra])
41+
when :hash
42+
if event["request"]
43+
event["request"]["data"] = sanitize_data(event["request"]["data"])
44+
event["request"]["headers"] = sanitize_headers(event["request"]["headers"])
45+
event["request"]["cookies"] = sanitize_cookies(event["request"]["cookies"])
46+
event["request"]["query_string"] = sanitize_query_string(event["request"]["query_string"])
47+
elsif event[:request]
48+
event[:request][:data] = sanitize_data(event[:request][:data])
49+
event[:request][:headers] = sanitize_headers(event[:request][:headers])
50+
event[:request][:cookies] = sanitize_cookies(event[:request][:cookies])
51+
event[:request][:query_string] = sanitize_query_string(event[:request][:query_string])
52+
end
53+
54+
if event["extra"]
55+
event["extra"] = sanitize_data(event["extra"])
56+
elsif event[:extra]
57+
event[:extra] = sanitize_data(event[:extra])
58+
end
5159
end
5260
end
5361

spec/sentry/sanitizer/cleaner_spec.rb

+57
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,23 @@
1515
Sentry.configuration
1616
end
1717

18+
context "without a request" do
19+
before do
20+
Sentry.init do |config|
21+
config.sanitize.fields = [:password]
22+
end
23+
end
24+
25+
it "clears extra fields" do
26+
subject.call(event)
27+
28+
expect(event.extra).to match a_hash_including(
29+
password: Sentry::Sanitizer::Cleaner::DEFAULT_MASK,
30+
not_password: "NOT SECRET"
31+
)
32+
end
33+
end
34+
1835
context "GET request" do
1936
before do
2037
Sentry.init do |config|
@@ -233,6 +250,46 @@
233250
not_password: "NOT SECRET"
234251
)
235252
end
253+
254+
context "with Sentry::ErrorEvent" do
255+
let(:event) do
256+
Sentry::ErrorEvent.new(configuration: configuration).tap do |e|
257+
e.extra = ({ password: "SECRET", not_password: "NOT SECRET" })
258+
end
259+
end
260+
261+
it "filters everything according to configuration" do
262+
subject.call(event)
263+
264+
expect(event.request.data).to match a_hash_including(
265+
"password" => Sentry::Sanitizer::Cleaner::DEFAULT_MASK,
266+
"secret_token" => Sentry::Sanitizer::Cleaner::DEFAULT_MASK,
267+
"oops" => "OOPS",
268+
"hmm" => [
269+
a_hash_including(
270+
"password" => Sentry::Sanitizer::Cleaner::DEFAULT_MASK,
271+
"array" => "too"
272+
)
273+
]
274+
)
275+
expect(event.request.headers).to match a_hash_including(
276+
"H-1" => Sentry::Sanitizer::Cleaner::DEFAULT_MASK,
277+
"H-2" => Sentry::Sanitizer::Cleaner::DEFAULT_MASK,
278+
"H-3" => "secret3",
279+
"Authorization" => "token",
280+
"X-Xsrf-Token" => "xsrf=token"
281+
)
282+
expect(event.request.cookies).to match a_hash_including(
283+
"cookie1" => Sentry::Sanitizer::Cleaner::DEFAULT_MASK,
284+
"cookie2" => Sentry::Sanitizer::Cleaner::DEFAULT_MASK,
285+
"cookie3" => Sentry::Sanitizer::Cleaner::DEFAULT_MASK
286+
)
287+
expect(event.extra).to match a_hash_including(
288+
password: Sentry::Sanitizer::Cleaner::DEFAULT_MASK,
289+
not_password: "NOT SECRET"
290+
)
291+
end
292+
end
236293
end
237294

238295
context "cleaning all headers" do

0 commit comments

Comments
 (0)