adafruit / Adafruit_CircuitPython_MiniMQTT

MQTT Client Library for CircuitPython
Other
73 stars 50 forks source link

adafruit_minimqtt connect is not consistent when checking username #129

Closed flavio-fernandes closed 1 year ago

flavio-fernandes commented 1 year ago

I got in trouble with CONNECT in the following way:

import adafruit_minimqtt.adafruit_minimqtt as MQTT
...
client = MQTT.MQTT(
    broker="192.168.10.238",
    port=1883,
    username="",
    password="",
)

^^ Note that username and password are not None. They are an empty string "".

Attempting to MQTT connect to 192.168.10.238
460.552: DEBUG - Attempting to establish MQTT connection...
460.556: INFO - Establishing an INSECURE connection to 192.168.10.238:1883
460.582: DEBUG - Sending CONNECT to broker...
460.583: DEBUG - Fixed Header: bytearray(b'\x10\x13\x00')
Variable Header: bytearray(b'\x04MQTT\x04\x02\x00<')
460.737: DEBUG - Receiving CONNACK packet from broker
FATAL! Unable to MQTT connect to 192.168.10.238: No data received from broker for 10 seconds.

on the mqtt server side, I observe the following:

1668979633: New connection from 192.168.10.245:62670 on port 1883.
1668979633: New client connected from 192.168.10.245:62670 as cpy22457 (p2, c1, k60).
1668979633: Client cpy22457 disconnected due to protocol error.

It turns out, the existing logic in the code that checks if username is provided is not consistent when determining if such needs to be sent or not:

https://github.com/adafruit/Adafruit_CircuitPython_MiniMQTT/blob/b707805400fca9b2d49373c72bbf510edda6c209/adafruit_minimqtt/adafruit_minimqtt.py#L485

and then, a few lines below:

https://github.com/adafruit/Adafruit_CircuitPython_MiniMQTT/blob/b707805400fca9b2d49373c72bbf510edda6c209/adafruit_minimqtt/adafruit_minimqtt.py#L535

in my case, this discrepancy caused the username/password ""/"" to be sent without MQTT header (var_header[6]) properly accounting for it in lines https://github.com/adafruit/Adafruit_CircuitPython_MiniMQTT/blob/b707805400fca9b2d49373c72bbf510edda6c209/adafruit_minimqtt/adafruit_minimqtt.py#L485-L492 .

ouch! ;)