From 059fc6e3c7dd5bda9a518bbc802153cabc13d58b Mon Sep 17 00:00:00 2001 From: EMQ-YangM Date: Fri, 25 Mar 2022 18:05:25 +0800 Subject: [PATCH] feat(emqx_rule_events): add field 'is_cache' --- apps/emqx_rule_engine/src/emqx_rule_events.erl | 11 +++++++---- .../emqx_rule_engine/test/emqx_rule_engine_SUITE.erl | 2 ++ src/emqx_access_control.erl | 12 +++++++----- 3 files changed, 16 insertions(+), 9 deletions(-) diff --git a/apps/emqx_rule_engine/src/emqx_rule_events.erl b/apps/emqx_rule_engine/src/emqx_rule_events.erl index 1a03d01fc..1cef282c8 100644 --- a/apps/emqx_rule_engine/src/emqx_rule_events.erl +++ b/apps/emqx_rule_engine/src/emqx_rule_events.erl @@ -39,7 +39,7 @@ , on_message_delivered/3 , on_message_acked/3 , on_delivery_dropped/4 - , on_client_check_acl_complete/5 + , on_client_check_acl_complete/6 ]). -export([ event_info/0 @@ -114,12 +114,13 @@ on_client_connack(ConnInfo, Reason, _, Env) -> may_publish_and_apply('client.connack', fun() -> eventmsg_connack(ConnInfo, Reason) end, Env). -on_client_check_acl_complete(ClientInfo, PubSub, Topic, Result, Env) -> +on_client_check_acl_complete(ClientInfo, PubSub, Topic, Result, IsCache, Env) -> may_publish_and_apply('client.check_acl_complete', fun() -> eventmsg_check_acl_complete(ClientInfo, PubSub, Topic, - Result) end, Env). + Result, + IsCache) end, Env). on_session_subscribed(ClientInfo, Topic, SubOpts, Env) -> may_publish_and_apply('session.subscribed', @@ -266,13 +267,14 @@ eventmsg_check_acl_complete(_ClientInfo = #{ clientid := ClientId, username := Username, peerhost := PeerHost - }, PubSub, Topic, Result) -> + }, PubSub, Topic, Result, IsCache) -> with_basic_columns('client.check_acl_complete', #{clientid => ClientId, username => Username, peerhost => ntoa(PeerHost), topic => Topic, action => PubSub, + is_cache => IsCache, result => Result }). @@ -737,6 +739,7 @@ columns_with_exam('client.check_acl_complete') -> , {<<"peerhost">>, <<"192.168.0.10">>} , {<<"topic">>, <<"t/a">>} , {<<"action">>, <<"publish">>} + , {<<"is_cache">>, <<"false">>} , {<<"result">>, <<"allow">>} , {<<"timestamp">>, erlang:system_time(millisecond)} , {<<"node">>, node()} diff --git a/apps/emqx_rule_engine/test/emqx_rule_engine_SUITE.erl b/apps/emqx_rule_engine/test/emqx_rule_engine_SUITE.erl index bc4f968aa..2a0498d2f 100644 --- a/apps/emqx_rule_engine/test/emqx_rule_engine_SUITE.erl +++ b/apps/emqx_rule_engine/test/emqx_rule_engine_SUITE.erl @@ -2809,11 +2809,13 @@ verify_event_fields('client.check_acl_complete', Fields) -> action := Action, result := Result, topic := Topic, + is_cache := IsCache, username := Username } = Fields, ?assertEqual(<<"t1">>, Topic), ?assert(lists:member(Action, [subscribe, publish])), ?assert(lists:member(Result, [allow, deny])), + ?assert(lists:member(IsCache, [true, false])), ?assert(lists:member(ClientId, [<<"c_event">>, <<"c_event2">>])), ?assert(lists:member(Username, [<<"u_event">>, <<"u_event2">>])). diff --git a/src/emqx_access_control.erl b/src/emqx_access_control.erl index 4598bea38..11eb5efb2 100644 --- a/src/emqx_access_control.erl +++ b/src/emqx_access_control.erl @@ -50,7 +50,6 @@ check_acl(ClientInfo, PubSub, Topic) -> false -> do_check_acl(ClientInfo, PubSub, Topic) end, inc_acl_metrics(Result), - emqx:run_hook('client.check_acl_complete', [ClientInfo, PubSub, Topic, Result]), Result. check_acl_cache(ClientInfo, PubSub, Topic) -> @@ -61,15 +60,18 @@ check_acl_cache(ClientInfo, PubSub, Topic) -> AclResult; AclResult -> inc_acl_metrics(cache_hit), + emqx:run_hook('client.check_acl_complete', [ClientInfo, PubSub, Topic, AclResult, true]), AclResult end. do_check_acl(ClientInfo = #{zone := Zone}, PubSub, Topic) -> Default = emqx_zone:get_env(Zone, acl_nomatch, deny), - case run_hooks('client.check_acl', [ClientInfo, PubSub, Topic], Default) of - allow -> allow; - _Other -> deny - end. + Result = case run_hooks('client.check_acl', [ClientInfo, PubSub, Topic], Default) of + allow -> allow; + _Other -> deny + end, + emqx:run_hook('client.check_acl_complete', [ClientInfo, PubSub, Topic, Result, false]), + Result. default_auth_result(Zone) -> case emqx_zone:get_env(Zone, allow_anonymous, false) of