Skip to content

Commit 1e6b045

Browse files
acogoluegnesmergify[bot]
authored andcommitted
Close stream connection if vhost not authorized after secret update
(cherry picked from commit ba8745a) # Conflicts: # deps/rabbitmq_stream/src/rabbit_stream_reader.erl
1 parent cbc6899 commit 1e6b045

File tree

2 files changed

+60
-2
lines changed

2 files changed

+60
-2
lines changed

deps/rabbitmq_stream/src/rabbit_stream_reader.erl

Lines changed: 31 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1505,7 +1505,6 @@ handle_frame_pre_auth(Transport,
15051505
send(Transport, S, F),
15061506
Connection#stream_connection{connection_step = failure}
15071507
end,
1508-
15091508
{Connection1, State};
15101509
handle_frame_pre_auth(_Transport, Connection, State, heartbeat) ->
15111510
rabbit_log:debug("Received heartbeat frame pre auth"),
@@ -1618,6 +1617,7 @@ handle_frame_post_auth(Transport,
16181617
Challenge}};
16191618
{ok, NewUser = #user{username = NewUsername}} ->
16201619
case NewUsername of
1620+
<<<<<<< HEAD
16211621
Username ->
16221622
rabbit_core_metrics:auth_attempt_succeeded(Host,
16231623
Username,
@@ -1633,6 +1633,10 @@ handle_frame_post_auth(Transport,
16331633
connection_step = authenticated},
16341634
{sasl_authenticate, ?RESPONSE_CODE_OK,
16351635
<<>>}};
1636+
=======
1637+
Username ->
1638+
complete_secret_update(NewUser, C1, S1);
1639+
>>>>>>> ba8745ab4 (Close stream connection if vhost not authorized after secret update)
16361640
_ ->
16371641
rabbit_core_metrics:auth_attempt_failed(Host,
16381642
Username,
@@ -2784,6 +2788,32 @@ handle_frame_post_auth(Transport,
27842788
increase_protocol_counter(?UNKNOWN_FRAME),
27852789
{Connection#stream_connection{connection_step = close_sent}, State}.
27862790

2791+
complete_secret_update(NewUser = #user{username = Username},
2792+
#stream_connection{host = Host,
2793+
socket = S,
2794+
virtual_host = VH} = C1, S1) ->
2795+
notify_auth_result(Username, user_authentication_success, [], C1, S1),
2796+
rabbit_core_metrics:auth_attempt_succeeded(Host, Username, stream),
2797+
?LOG_DEBUG("Successfully checked updated secret for username '~ts'",
2798+
[Username]),
2799+
try
2800+
?LOG_DEBUG("Checking vhost access after secret update"),
2801+
rabbit_access_control:check_vhost_access(NewUser, VH, {socket, S}, #{}),
2802+
?LOG_DEBUG("Checked vhost access"),
2803+
2804+
{C1#stream_connection{user = NewUser,
2805+
authentication_state = done,
2806+
connection_step = authenticated},
2807+
{sasl_authenticate, ?RESPONSE_CODE_OK,
2808+
<<>>}}
2809+
catch exit:#amqp_error{explanation = Explanation} ->
2810+
?LOG_WARNING("Access to vhost failed after secret update: ~ts",
2811+
[Explanation]),
2812+
silent_close_delay(),
2813+
{C1#stream_connection{connection_step = failure},
2814+
{sasl_authenticate, ?RESPONSE_VHOST_ACCESS_FAILURE, <<>>}}
2815+
end.
2816+
27872817
process_client_command_versions(C, []) ->
27882818
C;
27892819
process_client_command_versions(C, [H | T]) ->

deps/rabbitmq_stream/test/rabbit_stream_SUITE.erl

Lines changed: 29 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,7 @@ groups() ->
4949
cannot_update_username_after_authenticated,
5050
cannot_use_another_authmechanism_when_updating_secret,
5151
update_secret_should_close_connection_if_wrong_secret,
52+
update_secret_should_close_connection_if_unauthorized_vhost,
5253
unauthenticated_client_rejected_tcp_connected,
5354
timeout_tcp_connected,
5455
unauthenticated_client_rejected_peer_properties_exchanged,
@@ -166,6 +167,12 @@ init_per_testcase(cannot_update_username_after_authenticated = TestCase, Config)
166167
ok = rabbit_ct_broker_helpers:add_user(Config, <<"other">>),
167168
rabbit_ct_helpers:testcase_started(Config, TestCase);
168169

170+
init_per_testcase(update_secret_should_close_connection_if_unauthorized_vhost = TestCase,
171+
Config) ->
172+
ok = rabbit_ct_broker_helpers:add_user(Config, <<"other">>),
173+
ok = rabbit_ct_broker_helpers:set_full_permissions(Config, <<"other">>, <<"/">>),
174+
rabbit_ct_helpers:testcase_started(Config, TestCase);
175+
169176
init_per_testcase(close_connection_on_consumer_update_timeout = TestCase, Config) ->
170177
ok = rabbit_ct_broker_helpers:rpc(Config,
171178
0,
@@ -201,6 +208,11 @@ end_per_testcase(cannot_update_username_after_authenticated = TestCase, Config)
201208
ok = rabbit_ct_broker_helpers:delete_user(Config, <<"other">>),
202209
rabbit_ct_helpers:testcase_finished(Config, TestCase);
203210

211+
end_per_testcase(update_secret_should_close_connection_if_unauthorized_vhost = TestCase,
212+
Config) ->
213+
ok = rabbit_ct_broker_helpers:delete_user(Config, <<"other">>),
214+
rabbit_ct_helpers:testcase_finished(Config, TestCase);
215+
204216
end_per_testcase(close_connection_on_consumer_update_timeout = TestCase, Config) ->
205217
ok = rabbit_ct_broker_helpers:rpc(Config,
206218
0,
@@ -286,7 +298,7 @@ test_update_secret(Config) ->
286298
{S, C0} = connect_and_authenticate(Transport, Config),
287299
rabbit_ct_broker_helpers:change_password(Config, <<"guest">>, <<"password">>),
288300
C1 = expect_successful_authentication(
289-
try_authenticate(Transport, S, C0, <<"PLAIN">>, <<"guest">>, <<"password">>)),
301+
try_authenticate(Transport, S, C0, <<"PLAIN">>, <<"guest">>, <<"password">>)),
290302
_C2 = test_close(Transport, S, C1),
291303
closed = wait_for_socket_close(Transport, S, 10),
292304
ok.
@@ -317,6 +329,22 @@ update_secret_should_close_connection_if_wrong_secret(Config) ->
317329
closed = wait_for_socket_close(Transport, S, 10),
318330
ok.
319331

332+
update_secret_should_close_connection_if_unauthorized_vhost(Config) ->
333+
T = gen_tcp,
334+
Port = get_port(T, Config),
335+
Opts = get_opts(T),
336+
{ok, S} = T:connect("localhost", Port, Opts),
337+
C0 = rabbit_stream_core:init(0),
338+
C1 = test_peer_properties(T, S, C0),
339+
Username = <<"other">>,
340+
C2 = test_authenticate(T, S, C1, Username),
341+
ok = rabbit_ct_broker_helpers:clear_permissions(Config, Username, <<"/">>),
342+
_C3 = expect_unsuccessful_authentication(
343+
try_authenticate(gen_tcp, S, C2, <<"PLAIN">>, Username, Username),
344+
?RESPONSE_VHOST_ACCESS_FAILURE),
345+
closed = wait_for_socket_close(T, S, 10),
346+
ok.
347+
320348
test_stream_tls(Config) ->
321349
Stream = atom_to_binary(?FUNCTION_NAME, utf8),
322350
test_server(ssl, Stream, Config),

0 commit comments

Comments
 (0)