Merge pull request #5798 from Rory-Z/feat/update-acl-conf
feat(authz): acl.conf is compatible with the 4.x syntax
This commit is contained in:
commit
d2278b02d9
|
@ -3,9 +3,9 @@
|
||||||
%%
|
%%
|
||||||
%% -type(ipaddrs() :: {ipaddrs, string()}).
|
%% -type(ipaddrs() :: {ipaddrs, string()}).
|
||||||
%%
|
%%
|
||||||
%% -type(username() :: {username, regex()}).
|
%% -type(username() :: {user | username, string()} | {user | username, {re, regex()}}).
|
||||||
%%
|
%%
|
||||||
%% -type(clientid() :: {clientid, regex()}).
|
%% -type(clientid() :: {client | clientid, string()} | {client | clientid, {re, regex()}}).
|
||||||
%%
|
%%
|
||||||
%% -type(who() :: ipaddr() | ipaddrs() |username() | clientid() |
|
%% -type(who() :: ipaddr() | ipaddrs() |username() | clientid() |
|
||||||
%% {'and', [ipaddr() | ipaddrs()| username() | clientid()]} |
|
%% {'and', [ipaddr() | ipaddrs()| username() | clientid()]} |
|
||||||
|
@ -20,7 +20,7 @@
|
||||||
%%
|
%%
|
||||||
%% -type(permission() :: allow | deny).
|
%% -type(permission() :: allow | deny).
|
||||||
%%
|
%%
|
||||||
%% -type(rule() :: {permission(), who(), access(), topics()}).
|
%% -type(rule() :: {permission(), who(), access(), topics()} | {permission(), all}).
|
||||||
%%--------------------------------------------------------------------
|
%%--------------------------------------------------------------------
|
||||||
|
|
||||||
{allow, {username, "^dashboard?"}, subscribe, ["$SYS/#"]}.
|
{allow, {username, "^dashboard?"}, subscribe, ["$SYS/#"]}.
|
||||||
|
|
|
@ -32,16 +32,21 @@
|
||||||
|
|
||||||
-export_type([rule/0]).
|
-export_type([rule/0]).
|
||||||
|
|
||||||
|
compile({Permission, all}) when ?ALLOW_DENY(Permission) -> {Permission, all, all, [compile_topic(<<"#">>)]};
|
||||||
compile({Permission, Who, Action, TopicFilters}) when ?ALLOW_DENY(Permission), ?PUBSUB(Action), is_list(TopicFilters) ->
|
compile({Permission, Who, Action, TopicFilters}) when ?ALLOW_DENY(Permission), ?PUBSUB(Action), is_list(TopicFilters) ->
|
||||||
{atom(Permission), compile_who(Who), atom(Action), [compile_topic(Topic) || Topic <- TopicFilters]}.
|
{atom(Permission), compile_who(Who), atom(Action), [compile_topic(Topic) || Topic <- TopicFilters]}.
|
||||||
|
|
||||||
compile_who(all) -> all;
|
compile_who(all) -> all;
|
||||||
compile_who({username, Username}) ->
|
compile_who({user, Username}) -> compile_who({username, Username});
|
||||||
|
compile_who({username, {re, Username}}) ->
|
||||||
{ok, MP} = re:compile(bin(Username)),
|
{ok, MP} = re:compile(bin(Username)),
|
||||||
{username, MP};
|
{username, MP};
|
||||||
compile_who({clientid, Clientid}) ->
|
compile_who({username, Username}) -> {username, {eq, bin(Username)}};
|
||||||
|
compile_who({client, Clientid}) -> compile_who({clientid, Clientid});
|
||||||
|
compile_who({clientid, {re, Clientid}}) ->
|
||||||
{ok, MP} = re:compile(bin(Clientid)),
|
{ok, MP} = re:compile(bin(Clientid)),
|
||||||
{clientid, MP};
|
{clientid, MP};
|
||||||
|
compile_who({clientid, Clientid}) -> {clientid, {eq, bin(Clientid)}};
|
||||||
compile_who({ipaddr, CIDR}) ->
|
compile_who({ipaddr, CIDR}) ->
|
||||||
{ipaddr, esockd_cidr:parse(CIDR, true)};
|
{ipaddr, esockd_cidr:parse(CIDR, true)};
|
||||||
compile_who({ipaddrs, CIDRs}) ->
|
compile_who({ipaddrs, CIDRs}) ->
|
||||||
|
@ -102,14 +107,16 @@ match_action(_, all) -> true;
|
||||||
match_action(_, _) -> false.
|
match_action(_, _) -> false.
|
||||||
|
|
||||||
match_who(_, all) -> true;
|
match_who(_, all) -> true;
|
||||||
match_who(#{username := undefined}, {username, _MP}) ->
|
match_who(#{username := undefined}, {username, _}) ->
|
||||||
false;
|
false;
|
||||||
match_who(#{username := Username}, {username, MP}) ->
|
match_who(#{username := Username}, {username, {eq, Username}}) -> true;
|
||||||
|
match_who(#{username := Username}, {username, {re_pattern, _, _, _, _} = MP}) ->
|
||||||
case re:run(Username, MP) of
|
case re:run(Username, MP) of
|
||||||
{match, _} -> true;
|
{match, _} -> true;
|
||||||
_ -> false
|
_ -> false
|
||||||
end;
|
end;
|
||||||
match_who(#{clientid := Clientid}, {clientid, MP}) ->
|
match_who(#{clientid := Clientid}, {clientid, {eq, Clientid}}) -> true;
|
||||||
|
match_who(#{clientid := Clientid}, {clientid, {re_pattern, _, _, _, _} = MP}) ->
|
||||||
case re:run(Clientid, MP) of
|
case re:run(Clientid, MP) of
|
||||||
{match, _} -> true;
|
{match, _} -> true;
|
||||||
_ -> false
|
_ -> false
|
||||||
|
|
|
@ -22,11 +22,11 @@
|
||||||
-include_lib("eunit/include/eunit.hrl").
|
-include_lib("eunit/include/eunit.hrl").
|
||||||
-include_lib("common_test/include/ct.hrl").
|
-include_lib("common_test/include/ct.hrl").
|
||||||
|
|
||||||
-define(SOURCE1, {deny, all, all, ["#"]}).
|
-define(SOURCE1, {deny, all}).
|
||||||
-define(SOURCE2, {allow, {ipaddr, "127.0.0.1"}, all, [{eq, "#"}, {eq, "+"}]}).
|
-define(SOURCE2, {allow, {ipaddr, "127.0.0.1"}, all, [{eq, "#"}, {eq, "+"}]}).
|
||||||
-define(SOURCE3, {allow, {ipaddrs, ["127.0.0.1", "192.168.1.0/24"]}, subscribe, ["%c"]}).
|
-define(SOURCE3, {allow, {ipaddrs, ["127.0.0.1", "192.168.1.0/24"]}, subscribe, ["%c"]}).
|
||||||
-define(SOURCE4, {allow, {'and', [{clientid, "^test?"}, {username, "^test?"}]}, publish, ["topic/test"]}).
|
-define(SOURCE4, {allow, {'and', [{client, "test"}, {user, "test"}]}, publish, ["topic/test"]}).
|
||||||
-define(SOURCE5, {allow, {'or', [{username, "^test"}, {clientid, "test?"}]}, publish, ["%u", "%c"]}).
|
-define(SOURCE5, {allow, {'or', [{username, {re, "^test"}}, {clientid, {re, "test?"}}]}, publish, ["%u", "%c"]}).
|
||||||
|
|
||||||
all() ->
|
all() ->
|
||||||
emqx_ct:all(?MODULE).
|
emqx_ct:all(?MODULE).
|
||||||
|
@ -52,7 +52,7 @@ t_compile(_) ->
|
||||||
}, emqx_authz_rule:compile(?SOURCE3)),
|
}, emqx_authz_rule:compile(?SOURCE3)),
|
||||||
|
|
||||||
?assertMatch({allow,
|
?assertMatch({allow,
|
||||||
{'and', [{clientid, {re_pattern, _, _, _, _}}, {username, {re_pattern, _, _, _, _}}]},
|
{'and', [{clientid, {eq, <<"test">>}}, {username, {eq, <<"test">>}}]},
|
||||||
publish,
|
publish,
|
||||||
[[<<"topic">>, <<"test">>]]
|
[[<<"topic">>, <<"test">>]]
|
||||||
}, emqx_authz_rule:compile(?SOURCE4)),
|
}, emqx_authz_rule:compile(?SOURCE4)),
|
||||||
|
|
Loading…
Reference in New Issue