Skip to content

Commit cec95a5

Browse files
authored
Merge pull request #568 from levenleven/redact-token
Redact Authorization header in response stored in the error
2 parents 0a9401f + a6ebdf3 commit cec95a5

File tree

3 files changed

+97
-3
lines changed

3 files changed

+97
-3
lines changed

CHANGELOG.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
### 2.7.1 (Next)
22

3+
* [#568](https://github.com/slack-ruby/slack-ruby-client/pull/568): Redact Authorization header in response stored in the error - [@levenleven](https://github.com/levenleven).
4+
35
* Your contribution here.
46

57
### 2.7.0 (2025/07/20)

lib/slack/web/faraday/response/raise_error.rb

Lines changed: 20 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ module Faraday
55
module Response
66
class RaiseError < ::Faraday::Middleware
77
def on_complete(env)
8-
raise Slack::Web::Api::Errors::TooManyRequestsError, env.response if env.status == 429
8+
raise Slack::Web::Api::Errors::TooManyRequestsError, redact_response(env.response) if env.status == 429
99

1010
return unless env.success?
1111

@@ -16,7 +16,25 @@ def on_complete(env)
1616
error_message = body['error'] || body['errors'].map { |message| message['error'] }.join(',')
1717
error_class = Slack::Web::Api::Errors::ERROR_CLASSES[error_message]
1818
error_class ||= Slack::Web::Api::Errors::SlackError
19-
raise error_class.new(error_message, env.response)
19+
raise error_class.new(error_message, redact_response(env.response))
20+
end
21+
22+
private
23+
24+
def redact_response(response)
25+
return response unless response&.env
26+
27+
redacted_env = response.env.dup
28+
29+
# redact Authorization header if it exists
30+
if redacted_env[:request_headers]&.key?('Authorization')
31+
redacted_env[:request_headers] = redacted_env[:request_headers].dup
32+
redacted_env[:request_headers]['Authorization'] = '[REDACTED]'
33+
end
34+
35+
redacted_response = ::Faraday::Response.new(redacted_env)
36+
redacted_response.env[:response] = redacted_response
37+
redacted_response
2038
end
2139
end
2240
end

spec/slack/web/faraday/response/raise_error_spec.rb

Lines changed: 75 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,13 +13,40 @@
1313
describe '#on_complete' do
1414
context 'with status of 429' do
1515
let(:status) { 429 }
16-
let(:response) { OpenStruct.new(headers: { 'retry-after' => 10 }) }
16+
let(:env) do
17+
env = ::Faraday::Env.from({
18+
request_headers: {
19+
'Authorization' => 'Bearer very-secret-token-12345'
20+
},
21+
response_headers: {
22+
'retry-after' => 10
23+
},
24+
status: status
25+
})
26+
27+
env[:response] = ::Faraday::Response.new(env)
28+
env
29+
end
1730

1831
it 'raises a TooManyRequestsError' do
1932
expect { raise_error_obj.on_complete(env) }.to(
2033
raise_error(Slack::Web::Api::Errors::TooManyRequestsError)
2134
)
2235
end
36+
37+
it 'redacts Authorization token' do
38+
error = nil
39+
begin
40+
raise_error_obj.on_complete(env)
41+
rescue Slack::Web::Api::Errors::TooManyRequestsError => e
42+
error = e
43+
end
44+
45+
expect(error).not_to be_nil
46+
expect(error.response.env[:request_headers]['Authorization']).to eq('[REDACTED]')
47+
expect(error.inspect).not_to include('very-secret-token-12345')
48+
expect(error.inspect).to include('[REDACTED]')
49+
end
2350
end
2451

2552
context 'with an ok payload in the body' do
@@ -82,5 +109,52 @@
82109
)
83110
end
84111
end
112+
113+
context 'with SLACK_API_TOKEN in the request headers' do
114+
let(:body) do
115+
{
116+
'ok' => false,
117+
'error' => 'test_error'
118+
}
119+
end
120+
let(:env) do
121+
env = ::Faraday::Env.from({
122+
response_body: body,
123+
request_headers: {
124+
'Authorization' => 'Bearer very-secret-token-12345',
125+
'User-Agent' => 'Test Client'
126+
},
127+
status: status
128+
})
129+
130+
env[:response] = ::Faraday::Response.new(env)
131+
env
132+
end
133+
134+
it 'redacts the Authorization header in the raised error' do
135+
error = nil
136+
begin
137+
raise_error_obj.on_complete(env)
138+
rescue Slack::Web::Api::Errors::SlackError => e
139+
error = e
140+
end
141+
142+
expect(error).not_to be_nil
143+
expect(error.response.env[:request_headers]['Authorization']).to eq('[REDACTED]')
144+
expect(error.inspect).not_to include('very-secret-token-12345')
145+
expect(error.inspect).to include('[REDACTED]')
146+
end
147+
148+
it 'preserves other headers' do
149+
error = nil
150+
begin
151+
raise_error_obj.on_complete(env)
152+
rescue Slack::Web::Api::Errors::SlackError => e
153+
error = e
154+
end
155+
156+
expect(error.response.env[:request_headers]['User-Agent']).to eq('Test Client')
157+
end
158+
end
85159
end
86160
end

0 commit comments

Comments
 (0)