From 892becb5bf7c15ea9c7adc1c3fa68d9d3eae3233 Mon Sep 17 00:00:00 2001 From: JimMoen Date: Wed, 19 Oct 2022 16:37:54 +0800 Subject: [PATCH] fix(rule_engine): rule_id and resource_id in path urlencoded --- .../src/emqx_rule_engine_api.erl | 34 +++++++++++++------ 1 file changed, 24 insertions(+), 10 deletions(-) diff --git a/apps/emqx_rule_engine/src/emqx_rule_engine_api.erl b/apps/emqx_rule_engine/src/emqx_rule_engine_api.erl index ea0a13824..e53d80f02 100644 --- a/apps/emqx_rule_engine/src/emqx_rule_engine_api.erl +++ b/apps/emqx_rule_engine/src/emqx_rule_engine_api.erl @@ -250,7 +250,8 @@ do_create_rule2(ParsedParams) -> return({error, 400, ?ERR_BADARGS(Reason)}) end. -update_rule(#{id := Id}, Params) -> +update_rule(#{id := Id0}, Params) -> + Id = urldecode(Id0), case parse_rule_params(Params, #{id => Id}) of {ok, ParsedParams} -> case emqx_rule_engine:update_rule(ParsedParams) of @@ -275,16 +276,21 @@ list_rules(_Bindings, Params) -> return_all(emqx_rule_registry:get_rules_ordered_by_ts()) end. -show_rule(#{id := Id}, _Params) -> +show_rule(#{id := Id0}, _Params) -> + Id = urldecode(Id0), reply_with(fun emqx_rule_registry:get_rule/1, Id). -delete_rule(#{id := Id}, _Params) -> +delete_rule(#{id := Id0}, _Params) -> + Id = urldecode(Id0), ok = emqx_rule_engine:delete_rule(Id), return(ok). -reset_metrics_local(Id) -> emqx_rule_metrics:reset_metrics(Id). +reset_metrics_local(Id0) -> + Id = urldecode(Id0), + emqx_rule_metrics:reset_metrics(Id). -reset_metrics(#{id := Id}, _Params) -> +reset_metrics(#{id := Id0}, _Params) -> + Id = urldecode(Id0), _ = ?CLUSTER_CALL(reset_metrics_local, [Id]), return(ok). @@ -350,7 +356,8 @@ list_resources(#{}, _Params) -> list_resources_by_type(#{type := Type}, _Params) -> return_all(emqx_rule_registry:get_resources_by_type(Type)). -show_resource(#{id := Id}, _Params) -> +show_resource(#{id := Id0}, _Params) -> + Id = urldecode(Id0), case emqx_rule_registry:find_resource(Id) of {ok, R} -> StatusFun = @@ -366,7 +373,8 @@ show_resource(#{id := Id}, _Params) -> return({error, 404, <<"Not Found">>}) end. -get_resource_status(#{id := Id}, _Params) -> +get_resource_status(#{id := Id0}, _Params) -> + Id = urldecode(Id0), case emqx_rule_engine:get_resource_status(Id) of {ok, Status} -> return({ok, Status}); @@ -374,7 +382,8 @@ get_resource_status(#{id := Id}, _Params) -> return({error, 400, ?ERR_NO_RESOURCE(Id)}) end. -start_resource(#{id := Id}, _Params) -> +start_resource(#{id := Id0}, _Params) -> + Id = urldecode(Id0), case emqx_rule_engine:start_resource(Id) of ok -> return(ok); @@ -385,7 +394,8 @@ start_resource(#{id := Id}, _Params) -> return({error, 400, ?ERR_BADARGS(Reason)}) end. -update_resource(#{id := Id}, NewParams) -> +update_resource(#{id := Id0}, NewParams) -> + Id = urldecode(Id0), P1 = case proplists:get_value(<<"description">>, NewParams) of undefined -> #{}; Value -> #{<<"description">> => Value} @@ -409,7 +419,8 @@ update_resource(#{id := Id}, NewParams) -> return({error, 400, ?ERR_BADARGS(Reason)}) end. -delete_resource(#{id := Id}, _Params) -> +delete_resource(#{id := Id0}, _Params) -> + Id = urldecode(Id0), case emqx_rule_engine:delete_resource(Id) of ok -> return(ok); {error, not_found} -> return(ok); @@ -660,3 +671,6 @@ run_fuzzy_match(E = #rule{for = Topics}, [{for, like, Pattern}|Fuzzy]) -> lists:any(fun(For) -> binary:match(For, Pattern) /= nomatch end, Topics) andalso run_fuzzy_match(E, Fuzzy); run_fuzzy_match(_E, [{_Key, like, _SubStr}| _Fuzzy]) -> false. + +urldecode(S) -> + emqx_http_lib:uri_decode(S).