diff --git a/Makefile b/Makefile index a42695e65..bd36085c1 100644 --- a/Makefile +++ b/Makefile @@ -1,6 +1,6 @@ PROJECT = emqttd PROJECT_DESCRIPTION = Erlang MQTT Broker -PROJECT_VERSION = 2.3.5 +PROJECT_VERSION = 2.3.6 DEPS = goldrush gproc lager esockd ekka mochiweb pbkdf2 lager_syslog bcrypt clique jsx diff --git a/src/emqttd.app.src b/src/emqttd.app.src index fbbc9fd6a..c0aa24661 100644 --- a/src/emqttd.app.src +++ b/src/emqttd.app.src @@ -1,6 +1,6 @@ {application,emqttd, [{description,"Erlang MQTT Broker"}, - {vsn,"2.3.5"}, + {vsn,"2.3.6"}, {modules,[]}, {registered,[emqttd_sup]}, {applications,[kernel,stdlib,gproc,lager,esockd,mochiweb, diff --git a/src/emqttd_protocol.erl b/src/emqttd_protocol.erl index e81f86eb0..3531b165f 100644 --- a/src/emqttd_protocol.erl +++ b/src/emqttd_protocol.erl @@ -406,7 +406,7 @@ shutdown(Error, State = #proto_state{will_msg = WillMsg}) -> %% Auth failure not publish the will message case Error =:= auth_failure of true -> ok; - false -> send_willmsg(Client, WillMsg) + false -> send_willmsg(State, WillMsg) end, emqttd_hooks:run('client.disconnected', [Error], Client), %% let it down @@ -429,10 +429,14 @@ maybe_set_clientid(State = #proto_state{client_id = NullId}) maybe_set_clientid(State) -> State. -send_willmsg(_Client, undefined) -> +send_willmsg(_State, undefined) -> ignore; -send_willmsg(#mqtt_client{client_id = ClientId, username = Username}, WillMsg) -> - emqttd:publish(WillMsg#mqtt_message{from = {ClientId, Username}}). +send_willmsg(State = #proto_state{client_id = ClientId, username = Username, is_superuser = IsSuper}, + WillMsg = #mqtt_message{topic = Topic}) -> + case IsSuper orelse allow == check_acl(publish, Topic, client(State)) of + true -> emqttd:publish(WillMsg#mqtt_message{from = {ClientId, Username}}); + false -> ?LOG(error, "Cannot publish LWT message to ~s for ACL Deny", [Topic], State) + end. start_keepalive(0, _State) -> ignore;