Skip to content

Commit dfddfe3

Browse files
committed
Handle nonexistent vhost on various mgmt endpoints
Before this change some Management API endpoints handling POST requests crashed and returned HTTP 500 error code when called for a non-existing vhost. The reason was that parsing of the virtual host name could return a `not_found` atom which could potentially reach later steps of the data flow, which expect a vhost name binary only. Instead of returning `not_found`, now the code fails early with HTTP 400 error code and a descriptive error reason. See more details in the github issue Fixes #10901
1 parent dd5686a commit dfddfe3

File tree

5 files changed

+25
-25
lines changed

5 files changed

+25
-25
lines changed

deps/rabbitmq_management/src/rabbit_mgmt_util.erl

Lines changed: 21 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010
%% TODO sort all this out; maybe there's scope for rabbit_mgmt_request?
1111

1212
-export([is_authorized/2, is_authorized_admin/2, is_authorized_admin/4,
13-
is_authorized_admin/3, vhost/1, vhost_from_headers/1]).
13+
is_authorized_admin/3, vhost/1, vhost_or_bad_request/2, vhost_from_headers/1]).
1414
-export([is_authorized_vhost/2, is_authorized_user/3,
1515
is_authorized_user/4, is_authorized_user/5,
1616
is_authorized_monitor/2, is_authorized_policies/2,
@@ -210,6 +210,14 @@ vhost_from_headers(ReqData) ->
210210
vhost(ReqData) ->
211211
rabbit_web_dispatch_access_control:vhost(ReqData).
212212

213+
vhost_or_bad_request(ReqData, Context) ->
214+
case rabbit_web_dispatch_access_control:vhost(ReqData) of
215+
not_found ->
216+
bad_request(rabbit_data_coercion:to_binary("vhost_not_found"),
217+
ReqData, Context);
218+
VHost -> VHost
219+
end.
220+
213221
user(ReqData) ->
214222
case id(user, ReqData) of
215223
none -> not_found;
@@ -823,23 +831,18 @@ direct_request(MethodName, Transformers, Extra, ErrorMsg, ReqData,
823831
end, ReqData, Context).
824832

825833
with_vhost_and_props(Fun, ReqData, Context) ->
826-
case vhost(ReqData) of
827-
not_found ->
828-
not_found(rabbit_data_coercion:to_binary("vhost_not_found"),
829-
ReqData, Context);
830-
VHost ->
831-
{ok, Body, ReqData1} = read_complete_body(ReqData),
832-
case decode(Body) of
833-
{ok, Props} ->
834-
try
835-
Fun(VHost, Props, ReqData1)
836-
catch {error, Error} ->
837-
bad_request(Error, ReqData1, Context)
838-
end;
839-
{error, Reason} ->
840-
bad_request(rabbit_mgmt_format:escape_html_tags(Reason),
841-
ReqData1, Context)
842-
end
834+
VHost = vhost_or_bad_request(ReqData, Context),
835+
{ok, Body, ReqData1} = read_complete_body(ReqData),
836+
case decode(Body) of
837+
{ok, Props} ->
838+
try
839+
Fun(VHost, Props, ReqData1)
840+
catch {error, Error} ->
841+
bad_request(Error, ReqData1, Context)
842+
end;
843+
{error, Reason} ->
844+
bad_request(rabbit_mgmt_format:escape_html_tags(Reason),
845+
ReqData1, Context)
843846
end.
844847

845848
props_to_method(MethodName, Props, Transformers, Extra) when Props =:= null orelse

deps/rabbitmq_management/src/rabbit_mgmt_wm_definitions.erl

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -37,12 +37,9 @@ allowed_methods(ReqData, Context) ->
3737
{[<<"HEAD">>, <<"GET">>, <<"POST">>, <<"OPTIONS">>], ReqData, Context}.
3838

3939
to_json(ReqData, Context) ->
40-
case rabbit_mgmt_util:vhost(ReqData) of
40+
case rabbit_mgmt_util:vhost_or_bad_request(ReqData, Context) of
4141
none ->
4242
all_definitions(ReqData, Context);
43-
not_found ->
44-
rabbit_mgmt_util:bad_request(rabbit_data_coercion:to_binary("vhost_not_found"),
45-
ReqData, Context);
4643
VHost ->
4744
vhost_definitions(ReqData, VHost, Context)
4845
end.

deps/rabbitmq_management/src/rabbit_mgmt_wm_exchange_publish.erl

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@ accept_content(ReqData, Context) ->
4242
rabbit_mgmt_util:post_respond(do_it(ReqData, Context)).
4343

4444
do_it(ReqData0, Context) ->
45-
VHost = rabbit_mgmt_util:vhost(ReqData0),
45+
VHost = rabbit_mgmt_util:vhost_or_bad_request(ReqData0, Context),
4646
X = rabbit_mgmt_util:id(exchange, ReqData0),
4747
rabbit_mgmt_util:with_decode(
4848
[routing_key, properties, payload, payload_encoding], ReqData0, Context,

deps/rabbitmq_management/src/rabbit_mgmt_wm_queue_actions.erl

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@ accept_content(ReqData, Context) ->
3939
rabbit_mgmt_util:post_respond(do_it(ReqData, Context)).
4040

4141
do_it(ReqData0, Context) ->
42-
VHost = rabbit_mgmt_util:vhost(ReqData0),
42+
VHost = rabbit_mgmt_util:vhost_or_bad_request(ReqData0, Context),
4343
QName = rabbit_mgmt_util:id(queue, ReqData0),
4444
rabbit_mgmt_util:with_decode(
4545
[action], ReqData0, Context,

deps/rabbitmq_management/src/rabbit_mgmt_wm_queue_get.erl

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@ accept_content(ReqData, Context) ->
4242
rabbit_mgmt_util:post_respond(do_it(ReqData, Context)).
4343

4444
do_it(ReqData0, Context) ->
45-
VHost = rabbit_mgmt_util:vhost(ReqData0),
45+
VHost = rabbit_mgmt_util:vhost_or_bad_request(ReqData0, Context),
4646
Q = rabbit_mgmt_util:id(queue, ReqData0),
4747
rabbit_mgmt_util:with_decode(
4848
[ackmode, count, encoding], ReqData0, Context,

0 commit comments

Comments
 (0)