From 04cae4ef6051dea283297bb46771d812a3c0b774 Mon Sep 17 00:00:00 2001 From: Shawn <506895667@qq.com> Date: Wed, 8 Feb 2023 18:44:46 +0800 Subject: [PATCH 1/3] fix: republish MQTT msgs with properties crash --- .../emqx_rule_engine/src/emqx_rule_events.erl | 18 ++++++- .../test/emqx_rule_events_SUITE.erl | 52 ++++++++++++++----- .../test/emqx_rule_monitor_SUITE.erl | 1 + 3 files changed, 57 insertions(+), 14 deletions(-) diff --git a/apps/emqx_rule_engine/src/emqx_rule_events.erl b/apps/emqx_rule_engine/src/emqx_rule_events.erl index f64e389d0..5406845d8 100644 --- a/apps/emqx_rule_engine/src/emqx_rule_events.erl +++ b/apps/emqx_rule_engine/src/emqx_rule_events.erl @@ -853,9 +853,25 @@ printable_maps(Headers) -> value => Value } || {Key, Value} <- V0] }; + (K, V, AccIn) when is_map(V) -> + AccIn#{K => printable_maps(V)}; + (K, V, AccIn) when is_list(V) -> + AccIn#{K => printable_list(V)}; (_K, V, AccIn) when is_tuple(V) -> - %% internal header + %% internal header, remove it AccIn; (K, V, AccIn) -> AccIn#{K => V} end, #{}, Headers). + +printable_list(L) -> + lists:filtermap(fun printable_element/1, L). + +printable_element(E) when is_map(E) -> + {true, printable_maps(E)}; +printable_element(E) when is_tuple(E) -> + false; +printable_element(E) when is_list(E) -> + {true, printable_list(E)}; +printable_element(E) -> + {true, E}. diff --git a/apps/emqx_rule_engine/test/emqx_rule_events_SUITE.erl b/apps/emqx_rule_engine/test/emqx_rule_events_SUITE.erl index 14376c91d..ec9fccab2 100644 --- a/apps/emqx_rule_engine/test/emqx_rule_events_SUITE.erl +++ b/apps/emqx_rule_engine/test/emqx_rule_events_SUITE.erl @@ -36,18 +36,44 @@ t_mod_hook_fun(_) -> ]]. t_printable_maps(_) -> - Headers = #{peerhost => {127,0,0,1}, - peername => {{127,0,0,1}, 9980}, - sockname => {{127,0,0,1}, 1883}, - redispatch_to => {<<"group">>, <<"sub/topic/+">>}, - shared_dispatch_ack => {self(), ref} - }, + TestMap = #{ + peerhost => {127,0,0,1}, + peername => {{127,0,0,1}, 9980}, + sockname => {{127,0,0,1}, 1883}, + redispatch_to => {<<"group">>, <<"sub/topic/+">>}, + shared_dispatch_ack => {self(), ref}, + string => <<"abc">>, + atom => abc, + integer => 1, + float => 1.0, + simple_list => [1, 1.0, a, "abc", <<"abc">>, {a,b}] + }, + Headers = TestMap#{ + map => TestMap, + map_list => [ + TestMap#{ + map => TestMap + } + ] + }, Converted = emqx_rule_events:printable_maps(Headers), - ?assertMatch( - #{peerhost := <<"127.0.0.1">>, - peername := <<"127.0.0.1:9980">>, - sockname := <<"127.0.0.1:1883">> - }, Converted), - ?assertNot(maps:is_key(redispatch_to, Converted)), - ?assertNot(maps:is_key(shared_dispatch_ack, Converted)), + Verify = fun(Result) -> + ?assertMatch( + #{peerhost := <<"127.0.0.1">>, + peername := <<"127.0.0.1:9980">>, + sockname := <<"127.0.0.1:1883">>, + string := <<"abc">>, + atom := abc, + integer := 1, + float := 1.0, + simple_list := [1, 1.0, a, "abc", <<"abc">>] %% {a,b} is removed + }, Result), + ?assertNot(maps:is_key(redispatch_to, Result)), + ?assertNot(maps:is_key(shared_dispatch_ack, Result)), + %% make sure the result is jsonable + _ = emqx_json:encode(Result) + end, + Verify(maps:get(map, Converted)), + Verify(maps:get(map, lists:nth(1, maps:get(map_list, Converted)))), + Verify(Converted), ok. diff --git a/apps/emqx_rule_engine/test/emqx_rule_monitor_SUITE.erl b/apps/emqx_rule_engine/test/emqx_rule_monitor_SUITE.erl index 1c478fb63..646f2644f 100644 --- a/apps/emqx_rule_engine/test/emqx_rule_monitor_SUITE.erl +++ b/apps/emqx_rule_engine/test/emqx_rule_monitor_SUITE.erl @@ -90,6 +90,7 @@ end_per_testcase(_, Config) -> common_init_per_testcase() -> AlarmOpts = [{actions, [log, publish]}, {size_limit, 1000}, {validity_period, 86400}], + _ = emqx_alarm:mnesia(boot), {ok, _} = emqx_alarm:start_link(AlarmOpts), {ok, _} = emqx_rule_monitor:start_link(). From 8c478fd7f32bea9033cf44bf06f46a4f4796c1c0 Mon Sep 17 00:00:00 2001 From: Shawn <506895667@qq.com> Date: Wed, 8 Feb 2023 18:46:49 +0800 Subject: [PATCH 2/3] chore: update emqx_rule_engine.appup.src --- apps/emqx_rule_engine/src/emqx_rule_engine.appup.src | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/apps/emqx_rule_engine/src/emqx_rule_engine.appup.src b/apps/emqx_rule_engine/src/emqx_rule_engine.appup.src index e6951e980..cdf8fb959 100644 --- a/apps/emqx_rule_engine/src/emqx_rule_engine.appup.src +++ b/apps/emqx_rule_engine/src/emqx_rule_engine.appup.src @@ -3,11 +3,13 @@ {VSN, [{<<"4\\.4\\.1[3-4]">>, [{load_module,emqx_rule_registry,brutal_purge,soft_purge,[]}, + {load_module,emqx_rule_events,brutal_purge,soft_purge,[]}, {load_module,emqx_rule_monitor,brutal_purge,soft_purge,[]}, {load_module,emqx_rule_engine,brutal_purge,soft_purge,[]} ]}, {"4.4.12", [{load_module,emqx_rule_registry,brutal_purge,soft_purge,[]}, + {load_module,emqx_rule_events,brutal_purge,soft_purge,[]}, {load_module,emqx_rule_monitor,brutal_purge,soft_purge,[]}, {load_module,emqx_rule_engine,brutal_purge,soft_purge,[]}, {load_module,emqx_rule_engine_jwt_worker,brutal_purge,soft_purge,[]}, @@ -15,6 +17,7 @@ {load_module,emqx_rule_engine_jwt,brutal_purge,soft_purge,[]}]}, {"4.4.11", [{load_module,emqx_rule_engine_jwt_worker,brutal_purge,soft_purge,[]}, + {load_module,emqx_rule_events,brutal_purge,soft_purge,[]}, {load_module,emqx_rule_monitor,brutal_purge,soft_purge,[]}, {update,emqx_rule_engine_jwt_sup,supervisor}, {load_module,emqx_rule_engine_jwt,brutal_purge,soft_purge,[]}, @@ -231,11 +234,13 @@ {<<".*">>,[]}], [{<<"4\\.4\\.1[3-4]">>, [{load_module,emqx_rule_registry,brutal_purge,soft_purge,[]}, + {load_module,emqx_rule_events,brutal_purge,soft_purge,[]}, {load_module,emqx_rule_monitor,brutal_purge,soft_purge,[]}, {load_module,emqx_rule_engine,brutal_purge,soft_purge,[]} ]}, {"4.4.12", [{load_module,emqx_rule_registry,brutal_purge,soft_purge,[]}, + {load_module,emqx_rule_events,brutal_purge,soft_purge,[]}, {load_module,emqx_rule_monitor,brutal_purge,soft_purge,[]}, {load_module,emqx_rule_engine,brutal_purge,soft_purge,[]}, {load_module,emqx_rule_engine_jwt_worker,brutal_purge,soft_purge,[]}, @@ -243,6 +248,7 @@ {load_module,emqx_rule_engine_jwt,brutal_purge,soft_purge,[]}]}, {"4.4.11", [{load_module,emqx_rule_engine_jwt_worker,brutal_purge,soft_purge,[]}, + {load_module,emqx_rule_events,brutal_purge,soft_purge,[]}, {load_module,emqx_rule_monitor,brutal_purge,soft_purge,[]}, {update,emqx_rule_engine_jwt_sup,supervisor}, {load_module,emqx_rule_engine_jwt,brutal_purge,soft_purge,[]}, From 56156aa097508b4124853f488193b49e05ee6e4a Mon Sep 17 00:00:00 2001 From: Shawn <506895667@qq.com> Date: Thu, 9 Feb 2023 13:53:07 +0800 Subject: [PATCH 3/3] fix: update change logs --- changes/v4.4.15-en.md | 2 ++ changes/v4.4.15-zh.md | 2 ++ 2 files changed, 4 insertions(+) diff --git a/changes/v4.4.15-en.md b/changes/v4.4.15-en.md index a225eb3bb..e7aa73f50 100644 --- a/changes/v4.4.15-en.md +++ b/changes/v4.4.15-en.md @@ -16,6 +16,8 @@ ## Bug fixes +- Fixed an error when forward MQTT messages with User-Property using the `republish` action [#9942](https://github.com/emqx/emqx/pull/9942). + - fix some issues in descriptions of the actions, resources amd emqx-modules [#9931](https://github.com/emqx/emqx/pull/9931). - fix there's no error logs when query the JWKS server failed [#9931](https://github.com/emqx/emqx/pull/9931). diff --git a/changes/v4.4.15-zh.md b/changes/v4.4.15-zh.md index 2d5fe953a..5ef25c74f 100644 --- a/changes/v4.4.15-zh.md +++ b/changes/v4.4.15-zh.md @@ -16,6 +16,8 @@ ## 修复 +- 修复使用 `消息重发布` 动作转发带 User-Property 的 MQTT 消息时出错的问题 [#9942](https://github.com/emqx/emqx/pull/9942)。 + - 修复资源、动作以及模块里的一些描述错误 [#9931](https://github.com/emqx/emqx/pull/9931)。 - 修复请求 JWKS 服务失败的时候,没有日志打印的问题 [#9931](https://github.com/emqx/emqx/pull/9931)。