Bladeren bron

Pass paho zero_length_clientid test case

Feng Lee 7 jaren geleden
bovenliggende
commit
5f42f88401
2 gewijzigde bestanden met toevoegingen van 41 en 11 verwijderingen
  1. 20 11
      src/emqx_protocol.erl
  2. 21 0
      src/emqx_reason_codes.erl

+ 20 - 11
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),

+ 21 - 0
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.
+