From aa5d274464c5e93d71cce58771916fe49a8c9791 Mon Sep 17 00:00:00 2001 From: JianBo He Date: Fri, 24 Sep 2021 22:32:17 +0800 Subject: [PATCH] feat: acl.conf support ipaddrs --- src/emqx_access_rule.erl | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/src/emqx_access_rule.erl b/src/emqx_access_rule.erl index f0c6bcea9..b0e1aeb0b 100644 --- a/src/emqx_access_rule.erl +++ b/src/emqx_access_rule.erl @@ -28,7 +28,8 @@ -type(who() :: all | binary() | {client, binary()} | {user, binary()} | - {ipaddr, esockd_cidr:cidr_string()}). + {ipaddr, esockd_cidr:cidr_string()} | + {ipaddrs, list(esockd_cidr:cidr_string())}). -type(access() :: subscribe | publish | pubsub). @@ -52,6 +53,8 @@ compile(who, all) -> all; compile(who, {ipaddr, CIDR}) -> {ipaddr, esockd_cidr:parse(CIDR, true)}; +compile(who, {ipaddrs, CIDRs}) -> + {ipaddrs, lists:map(fun(CIDR) -> esockd_cidr:parse(CIDR, true) end, CIDRs)}; compile(who, {client, all}) -> {client, all}; compile(who, {client, ClientId}) -> @@ -108,8 +111,14 @@ match_who(#{username := Username}, {user, Username}) -> true; match_who(#{peerhost := undefined}, {ipaddr, _Tup}) -> false; +match_who(#{peerhost := undefined}, {ipaddrs, _}) -> + false; match_who(#{peerhost := IP}, {ipaddr, CIDR}) -> esockd_cidr:match(IP, CIDR); +match_who(#{peerhost := IP}, {ipaddrs, CIDRs}) -> + lists:any(fun(CIDR) -> + esockd_cidr:match(IP, CIDR) + end, CIDRs); match_who(ClientInfo, {'and', Conds}) when is_list(Conds) -> lists:foldl(fun(Who, Allow) -> match_who(ClientInfo, Who) andalso Allow