From 10bca7f6b553919f58630288e6d9fe678c5858b5 Mon Sep 17 00:00:00 2001 From: zhongwencool Date: Wed, 20 Apr 2022 16:53:50 +0800 Subject: [PATCH] fix: topic filter with qos/clientid/share --- .../src/emqx_mgmt_api_subscriptions.erl | 33 +++++++++++++++++-- 1 file changed, 31 insertions(+), 2 deletions(-) diff --git a/apps/emqx_management/src/emqx_mgmt_api_subscriptions.erl b/apps/emqx_management/src/emqx_mgmt_api_subscriptions.erl index 6b35d7a0a..484309dc2 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).