diff --git a/.github/workflows/run_test_case.yaml b/.github/workflows/run_test_case.yaml index 7de8efd8c..df0f622ea 100644 --- a/.github/workflows/run_test_case.yaml +++ b/.github/workflows/run_test_case.yaml @@ -15,6 +15,7 @@ jobs: - uses: actions/checkout@v1 - name: Run tests run: | + make xref make eunit make ct make cover diff --git a/rebar.config b/rebar.config index 4716a29da..50d430c44 100644 --- a/rebar.config +++ b/rebar.config @@ -5,7 +5,7 @@ {jiffy, {git, "https://github.com/emqx/jiffy", {tag, "1.0.4"}}}, {cowboy, {git, "https://github.com/emqx/cowboy", {tag, "2.7.1"}}}, {esockd, {git, "https://github.com/emqx/esockd", {tag, "5.6.1"}}}, - {ekka, {git, "https://github.com/emqx/ekka", {tag, "0.7.2"}}}, + {ekka, {git, "https://github.com/emqx/ekka", {tag, "0.7.3"}}}, {gen_rpc, {git, "https://github.com/emqx/gen_rpc", {tag, "2.4.1"}}}, {cuttlefish, {git, "https://github.com/emqx/cuttlefish", {tag, "v3.0.0"}}} ]}. diff --git a/src/emqx_channel.erl b/src/emqx_channel.erl index 59f8a0cba..be8a1f572 100644 --- a/src/emqx_channel.erl +++ b/src/emqx_channel.erl @@ -250,8 +250,10 @@ handle_in(Packet = ?AUTH_PACKET(?RC_CONTINUE_AUTHENTICATION, _Properties), Chann case ConnState of connecting -> process_connect(NProperties, ensure_connected(NChannel)); + connected -> + handle_out(auth, {?RC_SUCCESS, NProperties}, NChannel); _ -> - handle_out(auth, {?RC_SUCCESS, NProperties}, NChannel) + handle_out(disconnect, ?RC_PROTOCOL_ERROR, Channel) end; {continue, NProperties, NChannel} -> handle_out(auth, {?RC_CONTINUE_AUTHENTICATION, NProperties}, NChannel); @@ -259,7 +261,7 @@ handle_in(Packet = ?AUTH_PACKET(?RC_CONTINUE_AUTHENTICATION, _Properties), Chann handle_out(connack, NReasonCode, NChannel) end; -handle_in(Packet = ?AUTH_PACKET(?RC_RE_AUTHENTICATE, _Properties), Channel) -> +handle_in(Packet = ?AUTH_PACKET(?RC_RE_AUTHENTICATE, _Properties), Channel = #channel{conn_state = connected}) -> case enhanced_auth(Packet, Channel) of {ok, NProperties, NChannel} -> handle_out(auth, {?RC_SUCCESS, NProperties}, NChannel); @@ -269,6 +271,9 @@ handle_in(Packet = ?AUTH_PACKET(?RC_RE_AUTHENTICATE, _Properties), Channel) -> handle_out(disconnect, NReasonCode, NChannel) end; +handle_in(?PACKET(_), Channel = #channel{conn_state = ConnState}) when ConnState =/= connected -> + handle_out(disconnect, ?RC_PROTOCOL_ERROR, Channel); + handle_in(Packet = ?PUBLISH_PACKET(_QoS), Channel) -> case emqx_packet:check(Packet) of ok -> process_publish(Packet, Channel); diff --git a/src/emqx_ctl.erl b/src/emqx_ctl.erl index 4b6c375d1..cb36340ab 100644 --- a/src/emqx_ctl.erl +++ b/src/emqx_ctl.erl @@ -125,9 +125,15 @@ get_commands() -> [{Cmd, M, F} || {{_Seq, Cmd}, {M, F}, _Opts} <- ets:tab2list(?CMD_TAB)]. help() -> - print("Usage: ~s~n", [?MODULE]), - [begin print("~110..-s~n", [""]), Mod:Cmd(usage) end - || {_, {Mod, Cmd}, _} <- ets:tab2list(?CMD_TAB)]. + case ets:tab2list(?CMD_TAB) of + [] -> + print("No commands available, make sure you have plugin emqx_management started.~n"); + Cmds -> + print("Usage: ~s~n", [?MODULE]), + lists:foreach(fun({_, {Mod, Cmd}, _}) -> + print("~110..-s~n", [""]), Mod:Cmd(usage) + end, Cmds) + end. -spec(print(io:format()) -> ok). print(Msg) -> diff --git a/test/emqx_channel_SUITE.erl b/test/emqx_channel_SUITE.erl index 0bddae09d..086ff557e 100644 --- a/test/emqx_channel_SUITE.erl +++ b/test/emqx_channel_SUITE.erl @@ -112,6 +112,12 @@ t_handle_in_unexpected_connect_packet(_) -> {ok, [{outgoing, Packet}, {close, protocol_error}], Channel} = emqx_channel:handle_in(?CONNECT_PACKET(connpkt()), Channel). +t_handle_in_unexpected_packet(_) -> + Channel = emqx_channel:set_field(conn_state, idle, channel()), + Packet = ?DISCONNECT_PACKET(?RC_PROTOCOL_ERROR), + {ok, [{outgoing, Packet}, {close, protocol_error}], Channel} = + emqx_channel:handle_in(?PUBLISH_PACKET(?QOS_0), Channel). + t_handle_in_connect_auth_failed(_) -> ConnPkt = #mqtt_packet_connect{ proto_name = <<"MQTT">>,