From b3230fcd4c64f74aea8aff3edd26f17cb5e31cd9 Mon Sep 17 00:00:00 2001 From: fvanroie Date: Fri, 13 Jan 2023 21:26:43 +0100 Subject: [PATCH] Fix json command infinite loop --- src/hasp/hasp_dispatch.cpp | 27 +++++++++++++++++++-------- 1 file changed, 19 insertions(+), 8 deletions(-) diff --git a/src/hasp/hasp_dispatch.cpp b/src/hasp/hasp_dispatch.cpp index 7b8952bd..ebc883e4 100644 --- a/src/hasp/hasp_dispatch.cpp +++ b/src/hasp/hasp_dispatch.cpp @@ -348,9 +348,9 @@ static void dispatch_simple_text_command(const char* cmnd, uint8_t source) dispatch_command("json", cmnd, false, source); break; // comment - // case ' ': - // dispatch_simple_text_command(cmnd, source); - // break; + // case ' ': + // dispatch_simple_text_command(cmnd, source); + // break; default: { size_t pos1 = std::string(cmnd).find("="); @@ -395,7 +395,7 @@ static void dispatch_simple_text_command(const char* cmnd, uint8_t source) // Strip command/config prefix from the topic and process the payload void dispatch_topic_payload(const char* topic, const char* payload, bool update, uint8_t source) { - if(!strcmp_P(topic, PSTR(MQTT_TOPIC_COMMAND))) { + if(!strcmp_P(topic, PSTR(MQTT_TOPIC_COMMAND)) || topic[0] == '\0') { dispatch_simple_text_command((char*)payload, source); return; } @@ -596,9 +596,8 @@ void dispatch_screenshot(const char*, const char* filename, uint8_t source) bool dispatch_json_variant(JsonVariant& json, uint8_t& savedPage, uint8_t source) { if(json.is()) { // handle json as an array of commands - JsonArray arr = json.as(); LOG_WARNING(TAG_MSGR, "TEXT = ARRAY"); - for(JsonVariant command : arr) { + for(JsonVariant command : json.as()) { dispatch_json_variant(command, savedPage, source); } @@ -635,7 +634,7 @@ void dispatch_text_line(const char* payload, uint8_t source) // json.shrinkToFit(); if(jsonError) { - // dispatch_json_error(TAG_MSGR, jsonError); + // dispatch_json_error(TAG_MSGR, jsonError); } else { JsonVariant json = doc.as(); @@ -655,7 +654,19 @@ void dispatch_text_line(const char* payload, uint8_t source) void dispatch_parse_json(const char*, const char* payload, uint8_t source) { // Parse an incoming JSON array into individual commands - dispatch_simple_text_command(payload, source); + StaticJsonDocument<2048> doc; + DeserializationError jsonError = deserializeJson(doc, payload); + + if(jsonError) { + dispatch_json_error(TAG_MSGR, jsonError); + return; + } + + JsonVariant json = doc.as(); + uint8_t savedPage = haspPages.get(); + if(!dispatch_json_variant(json, savedPage, TAG_EVENT)) { + LOG_WARNING(TAG_MSGR, F(D_DISPATCH_COMMAND_NOT_FOUND), ""); + } } #ifdef ARDUINO