diff --git a/code/espurna/alexa.cpp b/code/espurna/alexa.cpp index bbbb6928..83c2dab8 100644 --- a/code/espurna/alexa.cpp +++ b/code/espurna/alexa.cpp @@ -105,11 +105,11 @@ void _alexaSettingsMigrate(int version) { // ----------------------------------------------------------------------------- void _alexaWebSocketOnVisible(JsonObject& root) { - wsPayloadModule(root, "alexa"); + wsPayloadModule(root, PSTR("alexa")); } bool _alexaWebSocketOnKeyCheck(const char * key, JsonVariant&) { - return (strncmp(key, "alexa", 5) == 0); + return (strncmp_P(key, PSTR("alexa"), 5) == 0); } void _alexaWebSocketOnConnected(JsonObject& root) { diff --git a/code/espurna/api_common.cpp b/code/espurna/api_common.cpp index dbdb8965..9f586f82 100644 --- a/code/espurna/api_common.cpp +++ b/code/espurna/api_common.cpp @@ -21,11 +21,11 @@ Copyright (C) 2020 by Maxim Prokhorov namespace { bool _apiWebSocketOnKeyCheck(const char * key, JsonVariant&) { - return (strncmp(key, "api", 3) == 0); + return (strncmp_P(key, PSTR("api"), 3) == 0); } void _apiWebSocketOnVisible(JsonObject& root) { - wsPayloadModule(root, "api"); + wsPayloadModule(root, PSTR("api")); } void _apiWebSocketOnConnected(JsonObject& root) { diff --git a/code/espurna/button.cpp b/code/espurna/button.cpp index a30fbfe8..66ab52b0 100644 --- a/code/espurna/button.cpp +++ b/code/espurna/button.cpp @@ -934,7 +934,7 @@ void _buttonRelayAction(size_t id, ButtonAction action) { namespace { void _buttonWebSocketOnVisible(JsonObject& root) { - wsPayloadModule(root, "btn"); + wsPayloadModule(root, PSTR("btn")); } void _buttonWebSocketOnConnected(JsonObject& root) { @@ -944,7 +944,7 @@ void _buttonWebSocketOnConnected(JsonObject& root) { } bool _buttonWebSocketOnKeyCheck(const char * key, JsonVariant&) { - return (strncmp(key, "btn", 3) == 0); + return (strncmp_P(key, PSTR("btn"), 3) == 0); } } // namespace diff --git a/code/espurna/curtain_kingart.cpp b/code/espurna/curtain_kingart.cpp index 7b29838a..06edb2a6 100644 --- a/code/espurna/curtain_kingart.cpp +++ b/code/espurna/curtain_kingart.cpp @@ -395,7 +395,7 @@ void _curtainWebSocketOnConnected(JsonObject& root) { //------------------------------------------------------------------------------ bool _curtainWebSocketOnKeyCheck(const char * key, JsonVariant& value) { - if (strncmp(key, "curtain", strlen("curtain")) == 0) return true; + if (strncmp_P(key, PSTR("curtain"), __builtin_strlen("curtain")) == 0) return true; return false; } @@ -432,7 +432,7 @@ void _curtainWebSocketOnAction(uint32_t client_id, const char * action, JsonObje } void _curtainWebSocketOnVisible(JsonObject& root) { - wsPayloadModule(root, "curtain"); + wsPayloadModule(root, PSTR("curtain")); } #endif //WEB_SUPPORT diff --git a/code/espurna/debug.cpp b/code/espurna/debug.cpp index 534ef6c4..5a7d6373 100644 --- a/code/espurna/debug.cpp +++ b/code/espurna/debug.cpp @@ -544,7 +544,7 @@ void send(const char* message, size_t len, Timestamp timestamp) { namespace web { void onVisible(JsonObject& root) { - wsPayloadModule(root, "dbg"); + wsPayloadModule(root, PSTR("dbg")); } } // namespace web diff --git a/code/espurna/garland.cpp b/code/espurna/garland.cpp index dce1d901..59b79490 100644 --- a/code/espurna/garland.cpp +++ b/code/espurna/garland.cpp @@ -209,7 +209,7 @@ void setDefault() { #if WEB_SUPPORT //------------------------------------------------------------------------------ void _garlandWebSocketOnVisible(JsonObject& root) { - wsPayloadModule(root, "garland"); + wsPayloadModule(root, PSTR("garland")); } void _garlandWebSocketOnConnected(JsonObject& root) { diff --git a/code/espurna/homeassistant.cpp b/code/espurna/homeassistant.cpp index 51b64d98..370b80c6 100644 --- a/code/espurna/homeassistant.cpp +++ b/code/espurna/homeassistant.cpp @@ -975,7 +975,7 @@ namespace web { #if WEB_SUPPORT void onVisible(JsonObject& root) { - wsPayloadModule(root, "ha"); + wsPayloadModule(root, PSTR("ha")); } void onConnected(JsonObject& root) { diff --git a/code/espurna/influxdb.cpp b/code/espurna/influxdb.cpp index a987cc2c..7e11dc2c 100644 --- a/code/espurna/influxdb.cpp +++ b/code/espurna/influxdb.cpp @@ -133,11 +133,11 @@ void _idbInitClient() { // ----------------------------------------------------------------------------- bool _idbWebSocketOnKeyCheck(const char * key, JsonVariant& value) { - return (strncmp(key, "idb", 3) == 0); + return (strncmp_P(key, PSTR("idb"), 3) == 0); } void _idbWebSocketOnVisible(JsonObject& root) { - wsPayloadModule(root, "idb"); + wsPayloadModule(root, PSTR("idb")); } void _idbWebSocketOnConnected(JsonObject& root) { diff --git a/code/espurna/led.cpp b/code/espurna/led.cpp index 00c11718..39093225 100644 --- a/code/espurna/led.cpp +++ b/code/espurna/led.cpp @@ -1004,7 +1004,7 @@ bool onKeyCheck(const char* key, JsonVariant&) { } void onVisible(JsonObject& root) { - wsPayloadModule(root, "led"); + wsPayloadModule(root, PSTR("led")); } void onConnected(JsonObject& root) { diff --git a/code/espurna/light.cpp b/code/espurna/light.cpp index ea7d94e8..34fb6429 100644 --- a/code/espurna/light.cpp +++ b/code/espurna/light.cpp @@ -2338,7 +2338,7 @@ void _lightWebSocketStatus(JsonObject& root) { } void _lightWebSocketOnVisible(JsonObject& root) { - wsPayloadModule(root, "light"); + wsPayloadModule(root, PSTR("light")); } void _lightWebSocketOnConnected(JsonObject& root) { diff --git a/code/espurna/lightfox.cpp b/code/espurna/lightfox.cpp index 4a15c4c4..12ab6d33 100644 --- a/code/espurna/lightfox.cpp +++ b/code/espurna/lightfox.cpp @@ -138,7 +138,7 @@ size_t _lightfox_buttons { 0 }; #if WEB_SUPPORT void _lightfoxWebSocketOnVisible(JsonObject& root) { - wsPayloadModule(root, "lightfox"); + wsPayloadModule(root, PSTR("lightfox")); } void _lightfoxWebSocketOnAction(uint32_t client_id, const char * action, JsonObject& data) { diff --git a/code/espurna/mqtt.cpp b/code/espurna/mqtt.cpp index 8d2c4244..b21f34ff 100644 --- a/code/espurna/mqtt.cpp +++ b/code/espurna/mqtt.cpp @@ -910,9 +910,9 @@ bool _mqttWebSocketOnKeyCheck(const char * key, JsonVariant&) { } void _mqttWebSocketOnVisible(JsonObject& root) { - wsPayloadModule(root, "mqtt"); + wsPayloadModule(root, PSTR("mqtt")); #if SECURE_CLIENT != SECURE_CLIENT_NONE - wsPayloadModule(root, "mqttssl"); + wsPayloadModule(root, PSTR("mqttssl")); #endif } diff --git a/code/espurna/nofuss.cpp b/code/espurna/nofuss.cpp index 2735bc85..b4989c8d 100644 --- a/code/espurna/nofuss.cpp +++ b/code/espurna/nofuss.cpp @@ -29,11 +29,11 @@ bool _nofussEnabled = false; #if WEB_SUPPORT bool _nofussWebSocketOnKeyCheck(const char * key, JsonVariant& value) { - return (strncmp(key, "nofuss", 6) == 0); + return (strncmp_P(key, PSTR("nofuss"), 6) == 0); } void _nofussWebSocketOnVisible(JsonObject& root) { - wsPayloadModule(root, "nofuss"); + wsPayloadModule(root, PSTR("nofuss")); } void _nofussWebSocketOnConnected(JsonObject& root) { diff --git a/code/espurna/ntp.cpp b/code/espurna/ntp.cpp index 419f9ae6..31abde30 100644 --- a/code/espurna/ntp.cpp +++ b/code/espurna/ntp.cpp @@ -380,11 +380,11 @@ time_t now() { namespace web { bool onKeyCheck(const char * key, JsonVariant&) { - return (strncmp(key, "ntp", 3) == 0); + return (strncmp_P(key, PSTR("ntp"), 3) == 0); } void onVisible(JsonObject& root) { - wsPayloadModule(root, "ntp"); + wsPayloadModule(root, PSTR("ntp")); } void onData(JsonObject& root) { diff --git a/code/espurna/ota_web.cpp b/code/espurna/ota_web.cpp index d5b54555..435e7ca0 100644 --- a/code/espurna/ota_web.cpp +++ b/code/espurna/ota_web.cpp @@ -20,29 +20,30 @@ namespace web { namespace { void onVisible(JsonObject& root) { - wsPayloadModule(root, "ota"); + wsPayloadModule(root, PSTR("ota")); } void sendResponse(AsyncWebServerRequest *request, int code, const String& payload = "") { - auto *response = request->beginResponseStream("text/plain", 256); - response->addHeader("Connection", "close"); - response->addHeader("X-XSS-Protection", "1; mode=block"); - response->addHeader("X-Content-Type-Options", "nosniff"); - response->addHeader("X-Frame-Options", "deny"); + auto *response = request->beginResponseStream(F("text/plain"), 256); + + response->addHeader(F("Connection"), F("close")); + response->addHeader(F("X-XSS-Protection"), F("1; mode=block")); + response->addHeader(F("X-Content-Type-Options"), F("nosniff")); + response->addHeader(F("X-Frame-Options"), F("deny")); response->setCode(code); if (payload.length()) { - response->printf("%s", payload.c_str()); + response->print(payload); } else { if (!Update.hasError()) { - response->print("OK"); + response->print(F("OK")); } else { - #if defined(ARDUINO_ESP8266_RELEASE_2_3_0) - Update.printError(reinterpret_cast(response)); - #else - Update.printError(*response); - #endif +#if defined(ARDUINO_ESP8266_RELEASE_2_3_0) + Update.printError(reinterpret_cast(response)); +#else + Update.printError(*response); +#endif } } diff --git a/code/espurna/relay.cpp b/code/espurna/relay.cpp index ad071b3e..9d17f4bd 100644 --- a/code/espurna/relay.cpp +++ b/code/espurna/relay.cpp @@ -2201,14 +2201,14 @@ void _relayWebSocketOnVisible(JsonObject& root) { } if (relays > 1) { - wsPayloadModule(root, "multirelay"); + wsPayloadModule(root, PSTR("multirelay")); root[FPSTR(espurna::relay::settings::keys::Sync)] = ::settings::internal::serialize(espurna::relay::settings::syncMode()); root[FPSTR(espurna::relay::settings::keys::Interlock)] = espurna::relay::settings::interlockDelay().count(); } - wsPayloadModule(root, "relay"); + wsPayloadModule(root, PSTR("relay")); } void _relayWebSocketOnConnected(JsonObject& root) { diff --git a/code/espurna/rfbridge.cpp b/code/espurna/rfbridge.cpp index ce8848cd..4eb48e88 100644 --- a/code/espurna/rfbridge.cpp +++ b/code/espurna/rfbridge.cpp @@ -392,9 +392,9 @@ String _rfbRetrieve(size_t id, bool status) { #if WEB_SUPPORT void _rfbWebSocketOnVisible(JsonObject& root) { - wsPayloadModule(root, "rfb"); + wsPayloadModule(root, PSTR("rfb")); #if RFB_PROVIDER == RFB_PROVIDER_RCSWITCH - wsPayloadModule(root, "rfbdirect"); + wsPayloadModule(root, PSTR("rfbdirect")); #endif } diff --git a/code/espurna/rfm69.cpp b/code/espurna/rfm69.cpp index 732ab59f..a100678a 100644 --- a/code/espurna/rfm69.cpp +++ b/code/espurna/rfm69.cpp @@ -216,7 +216,7 @@ void _rfm69Clear() { #if WEB_SUPPORT void _rfm69WebSocketOnVisible(JsonObject& root) { - wsPayloadModule(root, "rfm69"); + wsPayloadModule(root, PSTR("rfm69")); } void _rfm69WebSocketOnConnected(JsonObject& root) { diff --git a/code/espurna/rpnrules.cpp b/code/espurna/rpnrules.cpp index 763e87f1..86e0d89a 100644 --- a/code/espurna/rpnrules.cpp +++ b/code/espurna/rpnrules.cpp @@ -354,12 +354,12 @@ void setup() { #if WEB_SUPPORT namespace web { -void onVisible(JsonObject& root) { - wsPayloadModule(root, "rpn"); +bool onKeyCheck(const char * key, JsonVariant& value) { + return strncmp_P(key, PSTR("rpn"), 3) == 0; } -bool onKeyCheck(const char * key, JsonVariant& value) { - return (strncmp(key, "rpn", 3) == 0); +void onVisible(JsonObject& root) { + wsPayloadModule(root, PSTR("rpn")); } void onConnected(JsonObject& root) { diff --git a/code/espurna/scheduler.cpp b/code/espurna/scheduler.cpp index b6dea249..4f462918 100644 --- a/code/espurna/scheduler.cpp +++ b/code/espurna/scheduler.cpp @@ -511,12 +511,12 @@ namespace web { #if WEB_SUPPORT bool onKey(const char* key, JsonVariant&) { - return (strncmp(key, "sch", 3) == 0); + return strncmp_P(key, PSTR("sch"), 3) == 0; } void onVisible(JsonObject& root) { if (schedulable()) { - wsPayloadModule(root, "sch"); + wsPayloadModule(root, PSTR("sch")); } } diff --git a/code/espurna/sensor.cpp b/code/espurna/sensor.cpp index ef0fa0c9..2918dc7b 100644 --- a/code/espurna/sensor.cpp +++ b/code/espurna/sensor.cpp @@ -2198,38 +2198,38 @@ void _sensorWebSocketOnAction(uint32_t client_id, const char* action, JsonObject } void _sensorWebSocketOnVisible(JsonObject& root) { - wsPayloadModule(root, "sns"); + wsPayloadModule(root, PSTR("sns")); for (auto sensor : _sensors) { if (_sensorIsEmon(sensor)) { - wsPayloadModule(root, "emon"); + wsPayloadModule(root, PSTR("emon")); } switch (sensor->id()) { #if HLW8012_SUPPORT case SENSOR_HLW8012_ID: - wsPayloadModule(root, "hlw"); + wsPayloadModule(root, PSTR("hlw")); break; #endif #if CSE7766_SUPPORT case SENSOR_CSE7766_ID: - wsPayloadModule(root, "cse"); + wsPayloadModule(root, PSTR("cse")); break; #endif #if PZEM004T_SUPPORT || PZEM004TV30_SUPPORT case SENSOR_PZEM004T_ID: case SENSOR_PZEM004TV30_ID: - wsPayloadModule(root, "pzem"); + wsPayloadModule(root, PSTR("pzem")); break; #endif #if PULSEMETER_SUPPORT case SENSOR_PULSEMETER_ID: - wsPayloadModule(root, "pm"); + wsPayloadModule(root, PSTR("pm")); break; #endif #if MICS2710_SUPPORT || MICS5525_SUPPORT case SENSOR_MICS2710_ID: case SENSOR_MICS5525_ID: - wsPayloadModule(root, "mics"); + wsPayloadModule(root, PSTR("mics")); break; #endif } diff --git a/code/espurna/telnet.cpp b/code/espurna/telnet.cpp index ef32de55..d6e1a624 100644 --- a/code/espurna/telnet.cpp +++ b/code/espurna/telnet.cpp @@ -97,12 +97,12 @@ bool _telnetClientsAuth[TELNET_MAX_CLIENTS]; #if WEB_SUPPORT -void _telnetWebSocketOnVisible(JsonObject& root) { - wsPayloadModule(root, "telnet"); +bool _telnetWebSocketOnKeyCheck(const char * key, JsonVariant&) { + return strncmp_P(key, PSTR("telnet"), 6) == 0; } -bool _telnetWebSocketOnKeyCheck(const char * key, JsonVariant&) { - return (strncmp(key, "telnet", 6) == 0); +void _telnetWebSocketOnVisible(JsonObject& root) { + wsPayloadModule(root, PSTR("telnet")); } void _telnetWebSocketOnConnected(JsonObject& root) { diff --git a/code/espurna/terminal.cpp b/code/espurna/terminal.cpp index cdc76f28..662fd57d 100644 --- a/code/espurna/terminal.cpp +++ b/code/espurna/terminal.cpp @@ -661,21 +661,17 @@ void _terminalMqttSetup() { #if WEB_SUPPORT -void _terminalWebSocketOnVisible(JsonObject& root) { - wsPayloadModule(root, "cmd"); -} - void _terminalWebSocketOnAction(uint32_t, const char* action, JsonObject& data) { - if (strcmp(action, "cmd") != 0) { + if (strncmp_P(action, PSTR("cmd"), 3) != 0) { return; } - alignas(4) static constexpr char key[] PROGMEM = "line"; - if (!data.containsKey(FPSTR(key)) || !data[FPSTR(key)].is()) { + alignas(4) static constexpr char Key[] PROGMEM = "line"; + if (!data.containsKey(FPSTR(Key)) || !data[FPSTR(Key)].is()) { return; } - const auto command = data[FPSTR(key)].as(); + const auto command = data[FPSTR(Key)].as(); if (command.length()) { _io.inject(command.c_str(), command.length()); if (command[command.length() - 1] != '\n') { @@ -684,6 +680,10 @@ void _terminalWebSocketOnAction(uint32_t, const char* action, JsonObject& data) } } +void _terminalWebSocketOnVisible(JsonObject& root) { + wsPayloadModule(root, PSTR("cmd")); +} + #endif } // namespace diff --git a/code/espurna/thermostat.cpp b/code/espurna/thermostat.cpp index 0dec48bf..4ca3c6ff 100644 --- a/code/espurna/thermostat.cpp +++ b/code/espurna/thermostat.cpp @@ -779,7 +779,7 @@ void displayLoop() { #if WEB_SUPPORT //------------------------------------------------------------------------------ void _thermostatWebSocketOnVisible(JsonObject& root) { - wsPayloadModule(root, "thermostat"); + wsPayloadModule(root, PSTR("thermostat")); } void _thermostatWebSocketOnConnected(JsonObject& root) { diff --git a/code/espurna/ws.h b/code/espurna/ws.h index d4017769..caeb63f1 100644 --- a/code/espurna/ws.h +++ b/code/espurna/ws.h @@ -110,8 +110,7 @@ bool wsConnected(uint32_t client_id); // Append module's name that webui can make it's widgets visible // (for the payload in `on_send` callback(s)) - -void wsPayloadModule(JsonObject& root, const char* const name); +void wsPayloadModule(JsonObject& root, const char* name); // Access to our module-specific lifetime callbacks. // Expected usage is through the on() methods