From e38645aa282064073fe48bcc39e3bbd77d860d29 Mon Sep 17 00:00:00 2001 From: JimMoen Date: Wed, 24 May 2023 17:13:18 +0800 Subject: [PATCH 1/2] fix: lookup topic without force percent decode * the minirest handler would do it --- apps/emqx_management/src/emqx_mgmt_api_topics.erl | 4 ++-- changes/ce/fix-10801.en.md | 1 + 2 files changed, 3 insertions(+), 2 deletions(-) create mode 100644 changes/ce/fix-10801.en.md diff --git a/apps/emqx_management/src/emqx_mgmt_api_topics.erl b/apps/emqx_management/src/emqx_mgmt_api_topics.erl index 6b0e1f622..d451261ff 100644 --- a/apps/emqx_management/src/emqx_mgmt_api_topics.erl +++ b/apps/emqx_management/src/emqx_mgmt_api_topics.erl @@ -139,9 +139,9 @@ lookup(#{topic := Topic}) -> %%%============================================================================================== %% internal generate_topic(Params = #{<<"topic">> := Topic}) -> - Params#{<<"topic">> => uri_string:percent_decode(Topic)}; + Params#{<<"topic">> => Topic}; generate_topic(Params = #{topic := Topic}) -> - Params#{topic => uri_string:percent_decode(Topic)}; + Params#{topic => Topic}; generate_topic(Params) -> Params. diff --git a/changes/ce/fix-10801.en.md b/changes/ce/fix-10801.en.md new file mode 100644 index 000000000..4c36bd528 --- /dev/null +++ b/changes/ce/fix-10801.en.md @@ -0,0 +1 @@ +Avoid duplicated percent decode the topic name in API `/topics/{topic}` and `/topics`. From 1ac140312d48a3b1248abcf595b339e26475075e Mon Sep 17 00:00:00 2001 From: JimMoen Date: Wed, 24 May 2023 17:39:25 +0800 Subject: [PATCH 2/2] test: lookup topic with percent encoded topic name --- .../test/emqx_mgmt_api_topics_SUITE.erl | 33 ++++++++++++++++++- 1 file changed, 32 insertions(+), 1 deletion(-) diff --git a/apps/emqx_management/test/emqx_mgmt_api_topics_SUITE.erl b/apps/emqx_management/test/emqx_mgmt_api_topics_SUITE.erl index 659ae0d44..e617c6dcb 100644 --- a/apps/emqx_management/test/emqx_mgmt_api_topics_SUITE.erl +++ b/apps/emqx_management/test/emqx_mgmt_api_topics_SUITE.erl @@ -92,4 +92,35 @@ t_nodes_api(Config) -> #{<<"topic">> := Topic, <<"node">> := Node2} ] = emqx_utils_json:decode(RouteResponse, [return_maps]), - ?assertEqual(lists:usort([Node, atom_to_binary(Slave)]), lists:usort([Node1, Node2])). + ?assertEqual(lists:usort([Node, atom_to_binary(Slave)]), lists:usort([Node1, Node2])), + + ok = emqtt:stop(Client). + +t_percent_topics(_Config) -> + Node = atom_to_binary(node(), utf8), + Topic = <<"test_%%1">>, + {ok, Client} = emqtt:start_link(#{ + username => <<"routes_username">>, clientid => <<"routes_cid">> + }), + {ok, _} = emqtt:connect(Client), + {ok, _, _} = emqtt:subscribe(Client, Topic), + + %% exact match with percent encoded topic + Path = emqx_mgmt_api_test_util:api_path(["topics"]), + QS = uri_string:compose_query([ + {"topic", Topic}, + {"node", atom_to_list(node())} + ]), + Headers = emqx_mgmt_api_test_util:auth_header_(), + {ok, MatchResponse} = emqx_mgmt_api_test_util:request_api(get, Path, QS, Headers), + MatchData = emqx_utils_json:decode(MatchResponse, [return_maps]), + ?assertMatch( + #{<<"count">> := 1, <<"page">> := 1, <<"limit">> := 100}, + maps:get(<<"meta">>, MatchData) + ), + ?assertMatch( + [#{<<"topic">> := Topic, <<"node">> := Node}], + maps:get(<<"data">>, MatchData) + ), + + ok = emqtt:stop(Client).