From 670749493bf63be0f813fcd3011d2aaa9705ac11 Mon Sep 17 00:00:00 2001 From: JianBo He Date: Mon, 21 Mar 2022 16:22:47 +0800 Subject: [PATCH] fix(coap): reject duplicated connection request --- .../src/coap/emqx_coap_channel.erl | 26 ++++++++++++++++--- 1 file changed, 23 insertions(+), 3 deletions(-) diff --git a/apps/emqx_gateway/src/coap/emqx_coap_channel.erl b/apps/emqx_gateway/src/coap/emqx_coap_channel.erl index 7fa948a47..d15b8605a 100644 --- a/apps/emqx_gateway/src/coap/emqx_coap_channel.erl +++ b/apps/emqx_gateway/src/coap/emqx_coap_channel.erl @@ -595,7 +595,8 @@ process_out(Outs, Result, Channel, _) -> process_nothing(_, _, Channel) -> {ok, Channel}. -process_connection({open, Req}, Result, Channel, Iter) -> +process_connection({open, Req}, Result, + Channel = #channel{conn_state = idle}, Iter) -> Queries = emqx_coap_message:get_option(uri_query, Req), case emqx_misc:pipeline( [ fun enrich_conninfo/2 @@ -610,12 +611,31 @@ process_connection({open, Req}, Result, Channel, Iter) -> process_connect(ensure_connected(NChannel), Req, Result, Iter); {error, ReasonCode, NChannel} -> ErrMsg = io_lib:format("Login Failed: ~ts", [ReasonCode]), - Payload = erlang:list_to_binary(lists:flatten(ErrMsg)), + Payload = iolist_to_binary(ErrMsg), iter(Iter, reply({error, bad_request}, Payload, Req, Result), NChannel) end; - +process_connection({open, Req}, Result, + Channel = #channel{ + conn_state = ConnState, + clientinfo = #{clientid := ClientId}}, Iter) + when ConnState == connected -> + Queries = emqx_coap_message:get_option(uri_query, Req), + ErrMsg0 = + case Queries of + #{<<"clientid">> := ClientId} -> + "client has connected"; + #{<<"clientid">> := ReqClientId} -> + ["channel has registered by: ", ReqClientId]; + _ -> + "invalid queries" + end, + ErrMsg = io_lib:format("Bad Request: ~ts", [ErrMsg0]), + Payload = iolist_to_binary(ErrMsg), + iter(Iter, + reply({error, bad_request}, Payload, Req, Result), + Channel); process_connection({close, Msg}, _, Channel, _) -> Reply = emqx_coap_message:piggyback({ok, deleted}, Msg), {shutdown, close, Reply, Channel}.