fix issues#101 - access_control for PUBLISH packet should be optimized
This commit is contained in:
parent
04f44cb2a1
commit
aab6dcf8d1
|
@ -146,7 +146,7 @@ handle(Packet = ?CONNECT_PACKET(Var), State = #proto_state{peername = Peername =
|
|||
|
||||
handle(Packet = ?PUBLISH_PACKET(?QOS_0, Topic, _PacketId, _Payload),
|
||||
State = #proto_state{clientid = ClientId, session = Session}) ->
|
||||
case emqttd_access_control:check_acl(client(State), publish, Topic) of
|
||||
case check_acl(publish, Topic, State) of
|
||||
allow ->
|
||||
emqttd_session:publish(Session, ClientId, {?QOS_0, emqtt_message:from_packet(Packet)});
|
||||
deny ->
|
||||
|
@ -156,7 +156,7 @@ handle(Packet = ?PUBLISH_PACKET(?QOS_0, Topic, _PacketId, _Payload),
|
|||
|
||||
handle(Packet = ?PUBLISH_PACKET(?QOS_1, Topic, PacketId, _Payload),
|
||||
State = #proto_state{clientid = ClientId, session = Session}) ->
|
||||
case emqttd_access_control:check_acl(client(State), publish, Topic) of
|
||||
case check_acl(publish, Topic, State) of
|
||||
allow ->
|
||||
emqttd_session:publish(Session, ClientId, {?QOS_1, emqtt_message:from_packet(Packet)}),
|
||||
send(?PUBACK_PACKET(?PUBACK, PacketId), State);
|
||||
|
@ -167,7 +167,7 @@ handle(Packet = ?PUBLISH_PACKET(?QOS_1, Topic, PacketId, _Payload),
|
|||
|
||||
handle(Packet = ?PUBLISH_PACKET(?QOS_2, Topic, PacketId, _Payload),
|
||||
State = #proto_state{clientid = ClientId, session = Session}) ->
|
||||
case emqttd_access_control:check_acl(client(State), publish, Topic) of
|
||||
case check_acl(publish, Topic, State) of
|
||||
allow ->
|
||||
NewSession = emqttd_session:publish(Session, ClientId, {?QOS_2, emqtt_message:from_packet(Packet)}),
|
||||
send(?PUBACK_PACKET(?PUBREC, PacketId), State#proto_state{session = NewSession});
|
||||
|
@ -191,7 +191,7 @@ handle(?PUBACK_PACKET(Type, PacketId), State = #proto_state{session = Session})
|
|||
{ok, NewState};
|
||||
|
||||
handle(?SUBSCRIBE_PACKET(PacketId, TopicTable), State = #proto_state{clientid = ClientId, session = Session}) ->
|
||||
AllowDenies = [emqttd_access_control:check_acl(client(State), subscribe, Topic) || {Topic, _Qos} <- TopicTable],
|
||||
AllowDenies = [check_acl(subscribe, Topic, State) || {Topic, _Qos} <- TopicTable],
|
||||
case lists:member(deny, AllowDenies) of
|
||||
true ->
|
||||
%%TODO: return 128 QoS when deny...
|
||||
|
@ -343,6 +343,20 @@ validate_qos(_) -> false.
|
|||
try_unregister(undefined, _) -> ok;
|
||||
try_unregister(ClientId, _) -> emqttd_cm:unregister(ClientId).
|
||||
|
||||
%% publish ACL is cached in process dictionary.
|
||||
check_acl(publish, Topic, State) ->
|
||||
case get({acl, publish, Topic}) of
|
||||
undefined ->
|
||||
AllowDeny = emqttd_access_control:check_acl(client(State), publish, Topic),
|
||||
put({acl, publish, Topic}, AllowDeny),
|
||||
AllowDeny;
|
||||
AllowDeny ->
|
||||
AllowDeny
|
||||
end;
|
||||
|
||||
check_acl(subscribe, Topic, State) ->
|
||||
emqttd_access_control:check_acl(client(State), subscribe, Topic).
|
||||
|
||||
sent_stats(?PACKET(Type)) ->
|
||||
emqttd_metrics:inc('packets/sent'),
|
||||
inc(Type).
|
||||
|
|
Loading…
Reference in New Issue