feat(message_validation): impose restrictions on validation name

This commit is contained in:
Thales Macedo Garitezi 2024-03-18 15:52:30 -03:00
parent 74c03377f2
commit e8a8416e44
4 changed files with 47 additions and 3 deletions

View File

@ -18,6 +18,8 @@
api_schema/1
]).
-export([validate_name/1]).
%%------------------------------------------------------------------------------
%% Type declarations
%%------------------------------------------------------------------------------
@ -48,7 +50,15 @@ fields(validation) ->
{tags, emqx_schema:tags_schema()},
{description, emqx_schema:description_schema()},
{enable, mk(boolean(), #{desc => ?DESC("config_enable"), default => true})},
{name, mk(binary(), #{required => true, desc => ?DESC("name")})},
{name,
mk(
binary(),
#{
required => true,
validator => fun validate_name/1,
desc => ?DESC("name")
}
)},
{topics,
mk(
hoconsc:union([binary(), hoconsc:array(binary())]),
@ -186,6 +196,16 @@ ensure_array(undefined, _) -> undefined;
ensure_array(L, _) when is_list(L) -> L;
ensure_array(B, _) -> [B].
validate_name(Name) ->
%% see `MAP_KEY_RE' in hocon_tconf
RE = <<"^[A-Za-z0-9]+[A-Za-z0-9-_]*$">>,
case re:run(Name, RE, [{capture, none}]) of
match ->
ok;
nomatch ->
{error, <<"must conform to regex: ", RE/binary>>}
end.
validate_sql(SQL) ->
case emqx_message_validation:parse_sql_check(SQL) of
{ok, _Parsed} ->

View File

@ -177,6 +177,30 @@ schema_test_() ->
)}
].
invalid_names_test_() ->
[
{InvalidName,
?_assertThrow(
{_Schema, [
#{
reason := <<"must conform to regex:", _/binary>>,
kind := validation_error,
path := "message_validation.validations.1.name"
}
]},
parse_and_check([validation(InvalidName, [sql_check()])])
)}
|| InvalidName <- [
<<"">>,
<<"_name">>,
<<"name$">>,
<<"name!">>,
<<"some name">>,
<<"nãme"/utf8>>,
<<"test_哈哈"/utf8>>
]
].
check_test_() ->
[
{"denied by payload 1",

View File

@ -129,7 +129,7 @@
emqx_exproto_pb
]}.
{eunit_opts, [verbose]}.
{eunit_opts, [verbose, {print_depth, 100}]}.
{project_plugins, [
{erlfmt, "1.3.0"},

View File

@ -55,7 +55,7 @@ emqx_message_validation_schema {
"""Topic filter(s)"""
name.desc:
"""The name for this validation. Must be unique among all validations."""
"""The name for this validation. Must be unique among all validations. It must be a combination of alphanumeric characters and underscores, and cannot start with neither number nor an underscore."""
name.desc:
"""Name"""