fix(acl): do not leave placeholders unreplaced (4.2)

Port of https://github.com/emqx/emqx/pull/8280
This commit is contained in:
Thales Macedo Garitezi 2022-06-22 14:21:38 -03:00
parent e72014ed00
commit 1ed9539a7f
1 changed files with 11 additions and 8 deletions

View File

@ -133,9 +133,13 @@ match_who(_ClientInfo, _Who) ->
match_topics(_ClientInfo, _Topic, []) -> match_topics(_ClientInfo, _Topic, []) ->
false; false;
match_topics(ClientInfo, Topic, [{pattern, PatternFilter}|Filters]) -> match_topics(ClientInfo, Topic, [{pattern, PatternFilter}|Filters]) ->
TopicFilter = feed_var(ClientInfo, PatternFilter), case feed_var(ClientInfo, PatternFilter) of
match_topic(emqx_topic:words(Topic), TopicFilter) nomatch ->
orelse match_topics(ClientInfo, Topic, Filters); false;
TopicFilter ->
match_topic(emqx_topic:words(Topic), TopicFilter)
orelse match_topics(ClientInfo, Topic, Filters)
end;
match_topics(ClientInfo, Topic, [TopicFilter|Filters]) -> match_topics(ClientInfo, Topic, [TopicFilter|Filters]) ->
match_topic(emqx_topic:words(Topic), TopicFilter) match_topic(emqx_topic:words(Topic), TopicFilter)
orelse match_topics(ClientInfo, Topic, Filters). orelse match_topics(ClientInfo, Topic, Filters).
@ -149,14 +153,13 @@ feed_var(ClientInfo, Pattern) ->
feed_var(ClientInfo, Pattern, []). feed_var(ClientInfo, Pattern, []).
feed_var(_ClientInfo, [], Acc) -> feed_var(_ClientInfo, [], Acc) ->
lists:reverse(Acc); lists:reverse(Acc);
feed_var(ClientInfo = #{clientid := undefined}, [<<"%c">>|Words], Acc) -> feed_var(#{clientid := undefined}, [<<"%c">>|_Words], _Acc) ->
feed_var(ClientInfo, Words, [<<"%c">>|Acc]); nomatch;
feed_var(ClientInfo = #{clientid := ClientId}, [<<"%c">>|Words], Acc) -> feed_var(ClientInfo = #{clientid := ClientId}, [<<"%c">>|Words], Acc) ->
feed_var(ClientInfo, Words, [ClientId |Acc]); feed_var(ClientInfo, Words, [ClientId |Acc]);
feed_var(ClientInfo = #{username := undefined}, [<<"%u">>|Words], Acc) -> feed_var(#{username := undefined}, [<<"%u">>|_Words], _Acc) ->
feed_var(ClientInfo, Words, [<<"%u">>|Acc]); nomatch;
feed_var(ClientInfo = #{username := Username}, [<<"%u">>|Words], Acc) -> feed_var(ClientInfo = #{username := Username}, [<<"%u">>|Words], Acc) ->
feed_var(ClientInfo, Words, [Username|Acc]); feed_var(ClientInfo, Words, [Username|Acc]);
feed_var(ClientInfo, [W|Words], Acc) -> feed_var(ClientInfo, [W|Words], Acc) ->
feed_var(ClientInfo, Words, [W|Acc]). feed_var(ClientInfo, Words, [W|Acc]).