diff --git a/wled00/cfg.cpp b/wled00/cfg.cpp index cafba6a0ab..4234d9b016 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 71db6c0675..48cdfbf6b2 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 0d22e23dee..3bfcc1001d 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 c2504cf92d..c2e4ced7aa 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