summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorIliia Khaprov <i.khaprov@gmail.com>2021-07-21 11:19:22 +0200
committerGitHub <noreply@github.com>2021-07-21 11:19:22 +0200
commit53d67fda1fd44cb844bfe6d3b80f6a1865f66054 (patch)
treece13ee712cb33abd9692511ec730d519079d26c1
parentf38c023aa8afdae2ae6cdf1e6ae24f009a8f0337 (diff)
parent39693cfb07fc77c017bfdded729354c6e6830365 (diff)
downloadrabbitmq-server-git-53d67fda1fd44cb844bfe6d3b80f6a1865f66054.tar.gz
Merge pull request #3205 from rabbitmq/send-www-authenticate-when-basic-auth-present
Send www-authenticate header when basic auth present but it's wrong
-rw-r--r--deps/rabbitmq_management/src/rabbit_mgmt_util.erl7
-rw-r--r--deps/rabbitmq_management/test/rabbit_mgmt_http_SUITE.erl12
2 files changed, 14 insertions, 5 deletions
diff --git a/deps/rabbitmq_management/src/rabbit_mgmt_util.erl b/deps/rabbitmq_management/src/rabbit_mgmt_util.erl
index ce24035719..97f7a01b7b 100644
--- a/deps/rabbitmq_management/src/rabbit_mgmt_util.erl
+++ b/deps/rabbitmq_management/src/rabbit_mgmt_util.erl
@@ -290,7 +290,7 @@ is_authorized(ReqData, Context, Username, Password, ErrorMsg, Fun) ->
rabbit_core_metrics:auth_attempt_failed(RemoteAddress, Username, http),
rabbit_log:warning("HTTP access denied: ~s",
[rabbit_misc:format(Msg, Args)]),
- not_authorised(<<"Login failed">>, ReqData, Context)
+ not_authenticated(<<"Login failed">>, ReqData, Context)
end.
vhost_from_headers(ReqData) ->
@@ -736,7 +736,12 @@ a2b(B) -> B.
bad_request(Reason, ReqData, Context) ->
halt_response(400, bad_request, Reason, ReqData, Context).
+not_authenticated(Reason, ReqData, Context) ->
+ ReqData1 = cowboy_req:set_resp_header(<<"www-authenticate">>, ?AUTH_REALM, ReqData),
+ halt_response(401, not_authorized, Reason, ReqData1, Context).
+
not_authorised(Reason, ReqData, Context) ->
+ %% TODO: consider changing to 403 in 4.0
halt_response(401, not_authorised, Reason, ReqData, Context).
not_found(Reason, ReqData, Context) ->
diff --git a/deps/rabbitmq_management/test/rabbit_mgmt_http_SUITE.erl b/deps/rabbitmq_management/test/rabbit_mgmt_http_SUITE.erl
index 988bebaa88..6624ffba12 100644
--- a/deps/rabbitmq_management/test/rabbit_mgmt_http_SUITE.erl
+++ b/deps/rabbitmq_management/test/rabbit_mgmt_http_SUITE.erl
@@ -415,9 +415,13 @@ assert_percentage(Breakdown0, ExtraMargin) ->
auth_test(Config) ->
http_put(Config, "/users/user", [{password, <<"user">>},
{tags, <<"">>}], {group, '2xx'}),
- test_auth(Config, ?NOT_AUTHORISED, []),
+ EmptyAuthResponseHeaders = test_auth(Config, ?NOT_AUTHORISED, []),
+ ?assertEqual(true, lists:keymember("www-authenticate", 1, EmptyAuthResponseHeaders)),
+ %% NOTE: this one won't have www-authenticate in the response,
+ %% because user/password are ok, tags are not
test_auth(Config, ?NOT_AUTHORISED, [auth_header("user", "user")]),
- test_auth(Config, ?NOT_AUTHORISED, [auth_header("guest", "gust")]),
+ WrongAuthResponseHeaders = test_auth(Config, ?NOT_AUTHORISED, [auth_header("guest", "gust")]),
+ ?assertEqual(true, lists:keymember("www-authenticate", 1, WrongAuthResponseHeaders)),
test_auth(Config, ?OK, [auth_header("guest", "guest")]),
http_delete(Config, "/users/user", {group, '2xx'}),
passed.
@@ -935,8 +939,8 @@ multiple_invalid_connections_test(Config) ->
passed.
test_auth(Config, Code, Headers) ->
- {ok, {{_, Code, _}, _, _}} = req(Config, get, "/overview", Headers),
- passed.
+ {ok, {{_, Code, _}, RespHeaders, _}} = req(Config, get, "/overview", Headers),
+ RespHeaders.
exchanges_test(Config) ->
%% Can list exchanges