diff --git a/CHANGES-4.3.md b/CHANGES-4.3.md index 1f0bbaae2..391d7770a 100644 --- a/CHANGES-4.3.md +++ b/CHANGES-4.3.md @@ -17,6 +17,10 @@ File format: * Made possible for EMQX to boot from a Linux directory which has white spaces in its path. * Add support for JWT authorization [#7596] Now MQTT clients may be authorized with respect to a specific claim containing publish/subscribe topic whitelists. + +### Bug fixes +* List subscription topic (/api/v4/subscriptions), the result do not match with multiple conditions. + ## v4.3.14 diff --git a/apps/emqx_management/src/emqx_management.app.src b/apps/emqx_management/src/emqx_management.app.src index 64f44637a..e203c7a56 100644 --- a/apps/emqx_management/src/emqx_management.app.src +++ b/apps/emqx_management/src/emqx_management.app.src @@ -1,6 +1,6 @@ {application, emqx_management, [{description, "EMQ X Management API and CLI"}, - {vsn, "4.3.12"}, % strict semver, bump manually! + {vsn, "4.3.13"}, % strict semver, bump manually! {modules, []}, {registered, [emqx_management_sup]}, {applications, [kernel,stdlib,minirest]}, diff --git a/apps/emqx_management/src/emqx_management.appup.src b/apps/emqx_management/src/emqx_management.appup.src index 7fa9b6d6f..9265913e6 100644 --- a/apps/emqx_management/src/emqx_management.appup.src +++ b/apps/emqx_management/src/emqx_management.appup.src @@ -1,13 +1,13 @@ %% -*- mode: erlang -*- {VSN, - [ {<<"4\\.3\\.([0-9]|1[0-1])">>, + [ {<<"4\\.3\\.([0-9]|1[0-2])">>, [ {apply,{minirest,stop_http,['http:management']}}, {apply,{minirest,stop_http,['https:management']}}, {restart_application, emqx_management} ]}, {<<".*">>, []} ], - [ {<<"4\\.3\\.([0-9]|1[0-1])">>, + [ {<<"4\\.3\\.([0-9]|1[0-2])">>, [ {apply,{minirest,stop_http,['http:management']}}, {apply,{minirest,stop_http,['https:management']}}, {restart_application, emqx_management} diff --git a/apps/emqx_management/src/emqx_mgmt_api_subscriptions.erl b/apps/emqx_management/src/emqx_mgmt_api_subscriptions.erl index 9e47333ed..aa3aeb3af 100644 --- a/apps/emqx_management/src/emqx_mgmt_api_subscriptions.erl +++ b/apps/emqx_management/src/emqx_mgmt_api_subscriptions.erl @@ -67,7 +67,8 @@ list(Bindings, Params) when map_size(Bindings) == 0 -> Topic0 -> Topic = emqx_mgmt_util:urldecode(Topic0), Data = emqx_mgmt:list_subscriptions_via_topic(Topic, ?format_fun), - minirest:return({ok, add_meta(Params, Data)}) + FilterData = filter_subscriptions(Data, Params), + minirest:return({ok, add_meta(Params, FilterData)}) end; list(#{node := Node} = Bindings, Params) -> @@ -85,7 +86,8 @@ list(#{node := Node} = Bindings, Params) -> Topic0 -> Topic = emqx_mgmt_util:urldecode(Topic0), Data = emqx_mgmt:list_subscriptions_via_topic(Node, Topic, ?format_fun), - minirest:return({ok, add_meta(Params, Data)}) + FilterData = filter_subscriptions(Data, Params), + minirest:return({ok, add_meta(Params, FilterData)}) end. add_meta(Params, List) -> @@ -169,3 +171,30 @@ update_ms(share, X, {{Pid, Topic}, Opts}) -> {{Pid, Topic}, Opts#{share => X}}; update_ms(qos, X, {{Pid, Topic}, Opts}) -> {{Pid, Topic}, Opts#{qos => X}}. + +filter_subscriptions(Data0, Params) -> + Data1 = filter_by_key(qos, qos(Params), Data0), + Data2 = filter_by_key(clientid, proplists:get_value(<<"clientid">>, Params), Data1), + case proplists:get_value(<<"share">>, Params) of + undefined -> Data2; + Share -> + Prefix = filename:join([<<"$share">>, Share]), + Size = byte_size(Prefix), + lists:filter(fun(#{topic := Topic}) -> + case Topic of + <> -> true; + _ -> false + end + end, + Data2) + end. + +qos(Params) -> + case proplists:get_value(<<"qos">>, Params) of + undefined -> undefined; + Qos when is_integer(Qos) -> Qos; + Qos when is_binary(Qos) -> binary_to_integer(Qos) + end. + +filter_by_key(_Key, undefined, List) -> List; +filter_by_key(Key, Value, List) -> lists:filter(fun(E) -> Value =:= maps:get(Key, E) end, List).