From 5f42f8840193640dae371a8af63f66431d63ef2d Mon Sep 17 00:00:00 2001 From: Feng Lee Date: Sat, 25 Aug 2018 11:51:36 +0800 Subject: [PATCH] Pass paho zero_length_clientid test case --- src/emqx_protocol.erl | 31 ++++++++++++++++++++----------- src/emqx_reason_codes.erl | 21 +++++++++++++++++++++ 2 files changed, 41 insertions(+), 11 deletions(-) diff --git a/src/emqx_protocol.erl b/src/emqx_protocol.erl index 96925279f..650da4d1c 100644 --- a/src/emqx_protocol.erl +++ b/src/emqx_protocol.erl @@ -73,6 +73,7 @@ init(#{peername := Peername, peercert := Peercert, sendfun := SendFun}, Options) peercert = Peercert, proto_ver = ?MQTT_PROTO_V4, proto_name = <<"MQTT">>, + client_id = <<>>, client_pid = self(), username = init_username(Peercert, Options), is_super = false, @@ -201,6 +202,8 @@ process(?CONNECT_PACKET( username = Username, password = Password} = Connect), PState) -> + io:format("~p~n", [Connect]), + PState1 = set_username(Username, PState#pstate{client_id = ClientId, proto_ver = ProtoVer, @@ -334,8 +337,12 @@ process(?PACKET(?DISCONNECT), PState) -> connack({?RC_SUCCESS, SP, PState}) -> deliver({connack, ?RC_SUCCESS, sp(SP)}, PState); -connack({ReasonCode, PState}) -> - deliver({connack, ReasonCode, 0}, PState), +connack({ReasonCode, PState = #pstate{proto_ver = ProtoVer}}) -> + _ = deliver({connack, if ProtoVer =:= ?MQTT_PROTO_V5 -> + ReasonCode; + true -> + emqx_reason_codes:compat(connack, ReasonCode) + end}, PState), {error, emqx_reason_codes:name(ReasonCode), PState}. %%------------------------------------------------------------------------------ @@ -415,7 +422,7 @@ send(Packet = ?PACKET(Type), PState = #pstate{proto_ver = Ver, %% Assign a clientid maybe_assign_client_id(PState = #pstate{client_id = <<>>, ackprops = AckProps}) -> - ClientId = iolist_to_binary(["emqx_", emqx_guid:gen()]), + ClientId = emqx_guid:to_base62(emqx_guid:gen()), AckProps1 = set_property('Assigned-Client-Identifier', ClientId, AckProps), PState#pstate{client_id = ClientId, ackprops = AckProps1}; maybe_assign_client_id(PState) -> @@ -464,18 +471,20 @@ check_proto_ver(#mqtt_packet_connect{proto_ver = Ver, false -> {error, ?RC_PROTOCOL_ERROR} end. -%% Issue#599: Null clientId and clean_start = false -check_client_id(#mqtt_packet_connect{client_id = ClientId, - clean_start = false}, _PState) - when ClientId == undefined; ClientId == <<>> -> - {error, ?RC_CLIENT_IDENTIFIER_NOT_VALID}; - %% MQTT3.1 does not allow null clientId check_client_id(#mqtt_packet_connect{proto_ver = ?MQTT_PROTO_V3, - client_id = ClientId}, _PState) - when ClientId == undefined; ClientId == <<>> -> + client_id = <<>>}, _PState) -> {error, ?RC_CLIENT_IDENTIFIER_NOT_VALID}; +%% Issue#599: Null clientId and clean_start = false +check_client_id(#mqtt_packet_connect{client_id = <<>>, + clean_start = false}, _PState) -> + {error, ?RC_CLIENT_IDENTIFIER_NOT_VALID}; + +check_client_id(#mqtt_packet_connect{client_id = <<>>, + clean_start = true}, _PState) -> + ok; + check_client_id(#mqtt_packet_connect{client_id = ClientId}, #pstate{zone = Zone}) -> Len = byte_size(ClientId), MaxLen = emqx_zone:get_env(Zone, max_clientid_len), diff --git a/src/emqx_reason_codes.erl b/src/emqx_reason_codes.erl index 335be3bd4..b777b2627 100644 --- a/src/emqx_reason_codes.erl +++ b/src/emqx_reason_codes.erl @@ -15,7 +15,10 @@ %% @doc MQTT5 reason codes -module(emqx_reason_codes). +-include("emqx_mqtt.hrl"). + -export([name/1, text/1]). +-export([compat/2]). name(16#00) -> success; name(16#01) -> granted_qos1; @@ -107,3 +110,21 @@ text(16#A1) -> <<"Subscription Identifiers not supported">>; text(16#A2) -> <<"Wildcard Subscriptions not supported">>; text(Code) -> iolist_to_binary(["Unkown Reason Code:", integer_to_list(Code)]). +compat(connack, 16#80) -> ?CONNACK_PROTO_VER; +compat(connack, 16#81) -> ?CONNACK_PROTO_VER; +compat(connack, 16#82) -> ?CONNACK_PROTO_VER; +compat(connack, 16#83) -> ?CONNACK_PROTO_VER; +compat(connack, 16#84) -> ?CONNACK_PROTO_VER; +compat(connack, 16#85) -> ?CONNACK_INVALID_ID; +compat(connack, 16#86) -> ?CONNACK_CREDENTIALS; +compat(connack, 16#87) -> ?CONNACK_AUTH; +compat(connack, 16#88) -> ?CONNACK_SERVER; +compat(connack, 16#89) -> ?CONNACK_SERVER; +compat(connack, 16#8A) -> ?CONNACK_AUTH; +compat(connack, 16#8B) -> ?CONNACK_SERVER; +compat(connack, 16#8C) -> ?CONNACK_AUTH; +compat(connack, 16#97) -> ?CONNACK_SERVER; +compat(connack, 16#9C) -> ?CONNACK_SERVER; +compat(connack, 16#9D) -> ?CONNACK_SERVER; +compat(connack, 16#9F) -> ?CONNACK_SERVER. +