From 6c72194346c755884711607baf5149f9216e74f1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bla=C5=BE=20Kristan?= Date: Sat, 2 Sep 2023 01:05:45 +0200 Subject: [PATCH] Add compile time MQTT override (#3354) - for max server name length - for max topic length Fix for #3353 --- wled00/cfg.cpp | 6 +++--- wled00/set.cpp | 6 +++--- wled00/wled.h | 12 +++++++++--- wled00/xml.cpp | 4 ++++ 4 files changed, 19 insertions(+), 9 deletions(-) diff --git a/wled00/cfg.cpp b/wled00/cfg.cpp index cafba6a0..4234d9b0 100644 --- a/wled00/cfg.cpp +++ b/wled00/cfg.cpp @@ -442,14 +442,14 @@ bool deserializeConfig(JsonObject doc, bool fromFS) { #ifdef WLED_ENABLE_MQTT JsonObject if_mqtt = interfaces["mqtt"]; CJSON(mqttEnabled, if_mqtt["en"]); - getStringFromJson(mqttServer, if_mqtt[F("broker")], 33); + getStringFromJson(mqttServer, if_mqtt[F("broker")], MQTT_MAX_SERVER_LEN+1); CJSON(mqttPort, if_mqtt["port"]); // 1883 getStringFromJson(mqttUser, if_mqtt[F("user")], 41); getStringFromJson(mqttPass, if_mqtt["psk"], 65); //normally not present due to security getStringFromJson(mqttClientID, if_mqtt[F("cid")], 41); - getStringFromJson(mqttDeviceTopic, if_mqtt[F("topics")][F("device")], 33); // "wled/test" - getStringFromJson(mqttGroupTopic, if_mqtt[F("topics")][F("group")], 33); // "" + getStringFromJson(mqttDeviceTopic, if_mqtt[F("topics")][F("device")], MQTT_MAX_TOPIC_LEN+1); // "wled/test" + getStringFromJson(mqttGroupTopic, if_mqtt[F("topics")][F("group")], MQTT_MAX_TOPIC_LEN+1); // "" CJSON(retainMqttMsg, if_mqtt[F("rtn")]); #endif diff --git a/wled00/set.cpp b/wled00/set.cpp index 71db6c06..48cdfbf6 100644 --- a/wled00/set.cpp +++ b/wled00/set.cpp @@ -347,14 +347,14 @@ void handleSettingsSet(AsyncWebServerRequest *request, byte subPage) #ifdef WLED_ENABLE_MQTT mqttEnabled = request->hasArg(F("MQ")); - strlcpy(mqttServer, request->arg(F("MS")).c_str(), 33); + strlcpy(mqttServer, request->arg(F("MS")).c_str(), MQTT_MAX_SERVER_LEN+1); t = request->arg(F("MQPORT")).toInt(); if (t > 0) mqttPort = t; strlcpy(mqttUser, request->arg(F("MQUSER")).c_str(), 41); if (!isAsterisksOnly(request->arg(F("MQPASS")).c_str(), 41)) strlcpy(mqttPass, request->arg(F("MQPASS")).c_str(), 65); strlcpy(mqttClientID, request->arg(F("MQCID")).c_str(), 41); - strlcpy(mqttDeviceTopic, request->arg(F("MD")).c_str(), 33); - strlcpy(mqttGroupTopic, request->arg(F("MG")).c_str(), 33); + strlcpy(mqttDeviceTopic, request->arg(F("MD")).c_str(), MQTT_MAX_TOPIC_LEN+1); + strlcpy(mqttGroupTopic, request->arg(F("MG")).c_str(), MQTT_MAX_TOPIC_LEN)+1; buttonPublishMqtt = request->hasArg(F("BM")); retainMqttMsg = request->hasArg(F("RT")); #endif diff --git a/wled00/wled.h b/wled00/wled.h index 0d22e23d..3bfcc100 100644 --- a/wled00/wled.h +++ b/wled00/wled.h @@ -429,12 +429,18 @@ WLED_GLOBAL uint16_t pollReplyCount _INIT(0); // count numbe // mqtt WLED_GLOBAL unsigned long lastMqttReconnectAttempt _INIT(0); // used for other periodic tasks too #ifndef WLED_DISABLE_MQTT + #ifndef MQTT_MAX_TOPIC_LEN + #define MQTT_MAX_TOPIC_LEN 32 + #endif + #ifndef MQTT_MAX_SERVER_LEN + #define MQTT_MAX_SERVER_LEN 32 + #endif WLED_GLOBAL AsyncMqttClient *mqtt _INIT(NULL); WLED_GLOBAL bool mqttEnabled _INIT(false); WLED_GLOBAL char mqttStatusTopic[40] _INIT(""); // this must be global because of async handlers -WLED_GLOBAL char mqttDeviceTopic[33] _INIT(""); // main MQTT topic (individual per device, default is wled/mac) -WLED_GLOBAL char mqttGroupTopic[33] _INIT("wled/all"); // second MQTT topic (for example to group devices) -WLED_GLOBAL char mqttServer[33] _INIT(""); // both domains and IPs should work (no SSL) +WLED_GLOBAL char mqttDeviceTopic[MQTT_MAX_TOPIC_LEN+1] _INIT(""); // main MQTT topic (individual per device, default is wled/mac) +WLED_GLOBAL char mqttGroupTopic[MQTT_MAX_TOPIC_LEN+1] _INIT("wled/all"); // second MQTT topic (for example to group devices) +WLED_GLOBAL char mqttServer[MQTT_MAX_SERVER_LEN+1] _INIT(""); // both domains and IPs should work (no SSL) WLED_GLOBAL char mqttUser[41] _INIT(""); // optional: username for MQTT auth WLED_GLOBAL char mqttPass[65] _INIT(""); // optional: password for MQTT auth WLED_GLOBAL char mqttClientID[41] _INIT(""); // override the client ID diff --git a/wled00/xml.cpp b/wled00/xml.cpp index c2504cf9..c2e4ced7 100644 --- a/wled00/xml.cpp +++ b/wled00/xml.cpp @@ -478,6 +478,7 @@ void getSettingsJS(byte subPage, char* dest) if (subPage == SUBPAGE_SYNC) { + char nS[32]; sappend('v',SET_F("UP"),udpPort); sappend('v',SET_F("U2"),udpPort2); sappend('v',SET_F("GS"),syncGroups); @@ -534,6 +535,9 @@ void getSettingsJS(byte subPage, char* dest) sappends('s',SET_F("MG"),mqttGroupTopic); sappend('c',SET_F("BM"),buttonPublishMqtt); sappend('c',SET_F("RT"),retainMqttMsg); + oappend(SET_F("d.Sf.MD.maxlength=")); oappend(itoa(MQTT_MAX_TOPIC_LEN,nS,10)); oappend(SET_F(";")); + oappend(SET_F("d.Sf.MG.maxlength=")); oappend(itoa(MQTT_MAX_TOPIC_LEN,nS,10)); oappend(SET_F(";")); + oappend(SET_F("d.Sf.MS.maxlength=")); oappend(itoa(MQTT_MAX_SERVER_LEN,nS,10)); oappend(SET_F(";")); #else oappend(SET_F("toggle('MQTT');")); // hide MQTT settings #endif