Skip to content

Commit 47b2d1d

Browse files
committed
tests
1 parent 46d2dc2 commit 47b2d1d

File tree

2 files changed

+71
-1
lines changed

2 files changed

+71
-1
lines changed

lib/zendesk_api/middleware/request/api_token_impersonate.rb

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,10 +13,17 @@ def call(env)
1313
current_u_p_encoded = env[:request_headers][:authorization].split(/\s+/)[1]
1414
current_u_p = Base64.urlsafe_decode64(current_u_p_encoded)
1515
unless current_u_p.include?("/token:")
16-
raise ZendeskAPI::Error, "You must use an API token to impersonate a user."
16+
warn "WARNING: ApiTokenImpersonate passed in invalid format. It should be in the format username/token:APITOKEN"
17+
return @app.call(env)
1718
end
1819

1920
parts = current_u_p.split(":")
21+
22+
unless parts.length == 2 && parts[0].include?("/token")
23+
warn "WARNING: ApiTokenImpersonate passed in invalid format. It should be in the format username/token:APITOKEN"
24+
return @app.call(env)
25+
end
26+
2027
next_u_p = "#{Thread.current[:local_username]}/token:#{parts[1]}"
2128
env[:request_headers][:authorization] = "Basic #{Base64.urlsafe_encode64(next_u_p)}"
2229
end
Lines changed: 63 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,63 @@
1+
require 'core/spec_helper'
2+
3+
RSpec.describe ZendeskAPI::Middleware::Request::ApiTokenImpersonate do
4+
let(:app) { ->(env) { env } }
5+
let(:middleware) { described_class.new(app) }
6+
let(:username) { 'impersonated_user' }
7+
let(:token) { 'abc123' }
8+
let(:original_username) { 'original_user/token' }
9+
let(:encoded_auth) { Base64.urlsafe_encode64("#{original_username}:#{token}") }
10+
let(:env) do
11+
{
12+
request_headers: {
13+
authorization: "Basic #{encoded_auth}"
14+
}
15+
}
16+
end
17+
18+
after { Thread.current[:local_username] = nil }
19+
20+
context 'when local_username is set and authorization is a valid API token' do
21+
it 'impersonates the user by modifying the Authorization header' do
22+
Thread.current[:local_username] = username
23+
result = middleware.call(env)
24+
new_auth = result[:request_headers][:authorization]
25+
decoded = Base64.urlsafe_decode64(new_auth.split.last)
26+
expect(decoded).to eq("#{username}/token:#{token}")
27+
end
28+
end
29+
30+
context 'when local_username is not set' do
31+
it 'does not modify the Authorization header' do
32+
result = middleware.call(env)
33+
expect(result[:request_headers][:authorization]).to eq(env[:request_headers][:authorization])
34+
end
35+
end
36+
37+
context 'when authorization header is not Basic' do
38+
it 'does not modify the Authorization header' do
39+
Thread.current[:local_username] = username
40+
env[:request_headers][:authorization] = 'Bearer something'
41+
result = middleware.call(env)
42+
expect(result[:request_headers][:authorization]).to eq('Bearer something')
43+
end
44+
end
45+
46+
context 'when authorization does not contain /token:' do
47+
it 'raises an error' do
48+
Thread.current[:local_username] = username
49+
env[:request_headers][:authorization] = "Basic #{Base64.urlsafe_encode64('user:abc123')}"
50+
result = middleware.call(env)
51+
expect(result[:request_headers][:authorization]).to eq("Basic #{Base64.urlsafe_encode64('user:abc123')}")
52+
end
53+
end
54+
55+
context 'when authorization is not in valid format' do
56+
it 'raises an error' do
57+
Thread.current[:local_username] = username
58+
env[:request_headers][:authorization] = "Basic #{Base64.urlsafe_encode64('user/token:abc123:extra')}"
59+
result = middleware.call(env)
60+
expect(result[:request_headers][:authorization]).to eq("Basic #{Base64.urlsafe_encode64('user/token:abc123:extra')}")
61+
end
62+
end
63+
end

0 commit comments

Comments
 (0)