fix: don't allow `rules` to be set from `/rule_engine`

This commit is contained in:
Stefan Strigler 2023-04-05 16:28:54 +02:00
parent 5cd8865a93
commit 9cfe9cc709
4 changed files with 47 additions and 27 deletions

View File

@ -56,7 +56,7 @@ roots() ->
].
fields("rule_engine") ->
emqx_rule_engine_schema:fields("rule_engine");
emqx_rule_engine_schema:fields("rule_engine_api");
fields("rule_creation") ->
emqx_rule_engine_schema:fields("rules");
fields("rule_info") ->

View File

@ -447,6 +447,9 @@ param_path_id() ->
'/rule_engine'(get, _Params) ->
{200, format_rule_engine_resp(emqx_conf:get([rule_engine]))};
'/rule_engine'(put, #{body := Params}) ->
?CHECK_PARAMS(
Params,
rule_engine,
case emqx_conf:update([rule_engine], Params, #{override_to => cluster}) of
{ok, #{config := Config}} ->
{200, format_rule_engine_resp(Config)};
@ -456,7 +459,8 @@ param_path_id() ->
reason => Reason
}),
{400, #{code => 'BAD_REQUEST', message => ?ERR_BADARGS(Reason)}}
end.
end
).
%%------------------------------------------------------------------------------
%% Internal functions
@ -507,22 +511,29 @@ format_rule_info_resp(#{
format_rule_engine_resp(#{rules := Rules} = Config) ->
Config#{rules => maps:map(fun format_rule_resp/2, Rules)}.
format_rule_resp(_Id, #{
format_rule_resp(
_Id,
#{
name := Name,
metadata := MetaData = #{created_at := CreatedAt},
actions := Action,
sql := SQL,
enable := Enable,
description := Descr
}) ->
#{
} = Rule
) ->
Format = #{
name => Name,
actions => format_action(Action),
sql => SQL,
enable => Enable,
metadata => MetaData#{created_at => format_datetime(CreatedAt, millisecond)},
description => Descr
}.
},
case Rule of
#{metadata := MetaData = #{created_at := CreatedAt}} ->
Format#{metadata => MetaData#{created_at => format_datetime(CreatedAt, millisecond)}};
_ ->
Format
end.
format_datetime(Timestamp, Unit) ->
list_to_binary(calendar:system_time_to_rfc3339(Timestamp, [{unit, Unit}])).

View File

@ -40,13 +40,17 @@ tags() ->
roots() -> ["rule_engine"].
fields("rule_engine") ->
fields("rule_engine_api") ++
[
{ignore_sys_message,
?HOCON(boolean(), #{default => true, desc => ?DESC("rule_engine_ignore_sys_message")})},
{rules,
?HOCON(hoconsc:map("id", ?R_REF("rules")), #{
desc => ?DESC("rule_engine_rules"), default => #{}
})},
})}
];
fields("rule_engine_api") ->
[
{ignore_sys_message,
?HOCON(boolean(), #{default => true, desc => ?DESC("rule_engine_ignore_sys_message")})},
{jq_function_default_timeout,
?HOCON(
emqx_schema:duration_ms(),

View File

@ -285,12 +285,17 @@ test_rule_params(Sql, Payload) ->
t_rule_engine(_) ->
{200, _} = emqx_rule_engine_api:'/rule_engine'(get, foo),
{200, #{
jq_function_default_timeout := 12000,
jq_implementation_module := jq_port
%,
jq_function_default_timeout := 12000
% hidden! jq_implementation_module := jq_port
}} = emqx_rule_engine_api:'/rule_engine'(put, #{
body => #{
<<"jq_function_default_timeout">> => <<"12s">>,
<<"jq_implementation_module">> => <<"jq_port">>
}
}),
SomeRule = #{<<"sql">> => <<"SELECT * FROM \"t/#\"">>},
{400, _} = emqx_rule_engine_api:'/rule_engine'(put, #{
body => #{<<"rules">> => #{<<"some_rule">> => SomeRule}}
}),
{400, _} = emqx_rule_engine_api:'/rule_engine'(put, #{body => #{<<"something">> => <<"weird">>}}).