|
@@ -21,17 +21,12 @@
|
|
|
-include_lib("emqx/include/logger.hrl").
|
|
-include_lib("emqx/include/logger.hrl").
|
|
|
|
|
|
|
|
%% ACL callbacks
|
|
%% ACL callbacks
|
|
|
--export([ register_metrics/0
|
|
|
|
|
- , check_acl/5
|
|
|
|
|
|
|
+-export([ check_acl/5
|
|
|
, description/0
|
|
, description/0
|
|
|
]).
|
|
]).
|
|
|
--spec(register_metrics() -> ok).
|
|
|
|
|
-register_metrics() ->
|
|
|
|
|
- lists:foreach(fun emqx_metrics:ensure/1, ?ACL_METRICS).
|
|
|
|
|
|
|
|
|
|
check_acl(#{username := <<$$, _/binary>>}, _PubSub, _Topic, _AclResult, _State) ->
|
|
check_acl(#{username := <<$$, _/binary>>}, _PubSub, _Topic, _AclResult, _State) ->
|
|
|
ok;
|
|
ok;
|
|
|
-
|
|
|
|
|
check_acl(ClientInfo, PubSub, Topic, _AclResult, Env = #{aclquery := AclQuery}) ->
|
|
check_acl(ClientInfo, PubSub, Topic, _AclResult, Env = #{aclquery := AclQuery}) ->
|
|
|
#aclquery{collection = Coll, selector = SelectorList} = AclQuery,
|
|
#aclquery{collection = Coll, selector = SelectorList} = AclQuery,
|
|
|
Pool = maps:get(pool, Env, ?APP),
|
|
Pool = maps:get(pool, Env, ?APP),
|
|
@@ -43,20 +38,16 @@ check_acl(ClientInfo, PubSub, Topic, _AclResult, Env = #{aclquery := AclQuery})
|
|
|
[] -> ok;
|
|
[] -> ok;
|
|
|
Rows ->
|
|
Rows ->
|
|
|
try match(ClientInfo, Topic, topics(PubSub, Rows)) of
|
|
try match(ClientInfo, Topic, topics(PubSub, Rows)) of
|
|
|
- matched -> emqx_metrics:inc(?ACL_METRICS(allow)),
|
|
|
|
|
- {stop, allow};
|
|
|
|
|
- nomatch -> emqx_metrics:inc(?ACL_METRICS(deny)),
|
|
|
|
|
- {stop, deny}
|
|
|
|
|
|
|
+ matched -> {stop, allow};
|
|
|
|
|
+ nomatch -> {stop, deny}
|
|
|
catch
|
|
catch
|
|
|
_Err:Reason->
|
|
_Err:Reason->
|
|
|
?LOG(error, "[MongoDB] Check mongo ~p ACL failed, got ACL config: ~p, error: :~p",
|
|
?LOG(error, "[MongoDB] Check mongo ~p ACL failed, got ACL config: ~p, error: :~p",
|
|
|
[PubSub, Rows, Reason]),
|
|
[PubSub, Rows, Reason]),
|
|
|
- emqx_metrics:inc(?ACL_METRICS(ignore)),
|
|
|
|
|
ignore
|
|
ignore
|
|
|
end
|
|
end
|
|
|
end.
|
|
end.
|
|
|
|
|
|
|
|
-
|
|
|
|
|
match(_ClientInfo, _Topic, []) ->
|
|
match(_ClientInfo, _Topic, []) ->
|
|
|
nomatch;
|
|
nomatch;
|
|
|
match(ClientInfo, Topic, [TopicFilter|More]) ->
|
|
match(ClientInfo, Topic, [TopicFilter|More]) ->
|