From e89541c89515926e488fdb0b08d7a8c7b909c64d Mon Sep 17 00:00:00 2001 From: Karl Chaffey Date: Wed, 22 Mar 2017 02:23:42 +1300 Subject: [PATCH] Resolved unhandled exception when posting any command with a % character to the web console. Encoded web commands to allow for special chars (especialy % when setting hostname). Enabled support for custom wifihost names with dynamic paramaters. Changed default wifi hostname to include last 6 of mac address to match mqtt default. Moved Wifi hostname to user_config.Simplified and removed formatting code. --- sonoff/settings.ino | 3 +-- sonoff/sonoff.ino | 37 +++---------------------------------- sonoff/user_config.h | 2 ++ sonoff/webserver.ino | 12 +++++------- 4 files changed, 11 insertions(+), 43 deletions(-) diff --git a/sonoff/settings.ino b/sonoff/settings.ino index ff2e148bda97..36fde0bd7478 100644 --- a/sonoff/settings.ino +++ b/sonoff/settings.ino @@ -702,13 +702,12 @@ void CFG_Delta() sysCfg.blinkcount = APP_BLINKCOUNT; } if (sysCfg.version < 0x03011000) { // 3.1.16 - Add parameter - getClient(sysCfg.friendlyname[0], sysCfg.mqtt_client, sizeof(sysCfg.friendlyname[0])); + snprintf_P(sysCfg.friendlyname[0], sizeof(sysCfg.friendlyname[0]), sysCfg.mqtt_client, ESP.getChipId()); } if (sysCfg.version < 0x03020400) { // 3.2.4 - Add parameter CFG_DefaultSet_3_2_4(); } if (sysCfg.version < 0x03020500) { // 3.2.5 - Add parameter - getClient(sysCfg.friendlyname[0], sysCfg.mqtt_client, sizeof(sysCfg.friendlyname[0])); strlcpy(sysCfg.friendlyname[1], FRIENDLY_NAME"2", sizeof(sysCfg.friendlyname[1])); strlcpy(sysCfg.friendlyname[2], FRIENDLY_NAME"3", sizeof(sysCfg.friendlyname[2])); strlcpy(sysCfg.friendlyname[3], FRIENDLY_NAME"4", sizeof(sysCfg.friendlyname[3])); diff --git a/sonoff/sonoff.ino b/sonoff/sonoff.ino index 279f41f4d1c1..ecbbc1aa474f 100644 --- a/sonoff/sonoff.ino +++ b/sonoff/sonoff.ino @@ -293,31 +293,6 @@ uint8_t pwm_idxoffset = 0; // Allowed PWM command offset (change for boolean mDNSbegun = false; /********************************************************************************************/ - -void getClient(char* output, const char* input, byte size) -{ - char *token; - uint8_t digits = 0; - - if (strstr(input, "%")) { - strlcpy(output, input, size); - token = strtok(output, "%"); - if (strstr(input, "%") == input) { - output[0] = '\0'; - } else { - token = strtok(NULL, ""); - } - if (token != NULL) { - digits = atoi(token); - if (digits) { - snprintf_P(output, size, PSTR("%s%c0%dX"), output, '%', digits); - snprintf_P(output, size, output, ESP.getChipId()); - } - } - } - if (!digits) strlcpy(output, input, size); -} - void setLatchingRelay(uint8_t power, uint8_t state) { power &= 1; @@ -1077,7 +1052,6 @@ void mqttDataCb(char* topic, byte* data, unsigned int data_len) else if (!grpflg && !strcmp(type,"HOSTNAME")) { if ((data_len > 0) && (data_len < sizeof(sysCfg.hostname))) { strlcpy(sysCfg.hostname, (payload == 1) ? WIFI_HOSTNAME : dataBuf, sizeof(sysCfg.hostname)); - if (strstr(sysCfg.hostname,"%")) strlcpy(sysCfg.hostname, WIFI_HOSTNAME, sizeof(sysCfg.hostname)); restartflag = 2; } snprintf_P(svalue, sizeof(svalue), PSTR("{\"Hostname\":\"%s\"}"), sysCfg.hostname); @@ -2158,16 +2132,11 @@ void setup() Serial.println(); } - if (strstr(sysCfg.hostname, "%")) { - strlcpy(sysCfg.hostname, WIFI_HOSTNAME, sizeof(sysCfg.hostname)); - snprintf_P(Hostname, sizeof(Hostname)-1, sysCfg.hostname, sysCfg.mqtt_topic, ESP.getChipId() & 0x1FFF); - } else { - snprintf_P(Hostname, sizeof(Hostname)-1, sysCfg.hostname); - } + snprintf_P(Hostname, sizeof(Hostname)-1, sysCfg.hostname, sysCfg.mqtt_topic, ESP.getChipId()); + snprintf_P(MQTTClient, sizeof(MQTTClient), sysCfg.mqtt_client, ESP.getChipId()); + WIFI_Connect(); - getClient(MQTTClient, sysCfg.mqtt_client, sizeof(MQTTClient)); - if (sysCfg.module == MOTOR) sysCfg.poweronstate = 1; // Needs always on else in limbo! if (ESP.getResetReason() == "Power on") { if (sysCfg.poweronstate == 0) { // All off diff --git a/sonoff/user_config.h b/sonoff/user_config.h index 79dbf6f80bd6..6f1f6f8a5ff0 100644 --- a/sonoff/user_config.h +++ b/sonoff/user_config.h @@ -29,6 +29,8 @@ #define WIFI_CONFIG_TOOL WIFI_WPSCONFIG // [WifiConfig] Default tool if wifi fails to connect // (WIFI_RESTART, WIFI_SMARTCONFIG, WIFI_MANAGER, WIFI_WPSCONFIG, WIFI_RETRY) +#define WIFI_HOSTNAME "%s-%06X" // Expands to - + // -- Syslog -------------------------------------- #define SYS_LOG_HOST "domus1" // [LogHost] (Linux) syslog host #define SYS_LOG_PORT 514 // [LogPort] default syslog UDP port diff --git a/sonoff/webserver.ino b/sonoff/webserver.ino index 988f71447cd0..a0abb6d6a78f 100644 --- a/sonoff/webserver.ino +++ b/sonoff/webserver.ino @@ -103,7 +103,7 @@ const char HTTP_SCRIPT_CONSOL[] PROGMEM = "t=document.getElementById('t1');" "if(p==1){" "c=document.getElementById('c1');" - "o='&c1='+c.value;" + "o='&c1='+encodeURI(c.value);" "c.value='';" "t.scrollTop=sn;" "}" @@ -685,9 +685,7 @@ void handleMqtt() String page = FPSTR(HTTP_HEAD); page.replace("{v}", "Configure MQTT"); page += FPSTR(HTTP_FORM_MQTT); - char str[sizeof(sysCfg.mqtt_client)]; - getClient(str, MQTT_CLIENT_ID, sizeof(sysCfg.mqtt_client)); - page.replace("{m0}", str); + page.replace("{m0}", MQTTClient); page.replace("{m1}", sysCfg.mqtt_host); page.replace("{m2}", String(sysCfg.mqtt_port)); page.replace("{m3}", sysCfg.mqtt_client); @@ -1152,7 +1150,7 @@ void handleCmnd() if (valid) { byte curridx = logidx; if (strlen(webServer->arg("cmnd").c_str())) { - snprintf_P(svalue, sizeof(svalue), webServer->arg("cmnd").c_str()); + snprintf_P(svalue, sizeof(svalue), PSTR("%s"), webServer->arg("cmnd").c_str()); byte syslog_now = syslog_level; syslog_level = 0; // Disable UDP syslog to not trigger hardware WDT do_cmnd(svalue); @@ -1174,7 +1172,7 @@ void handleCmnd() } } counter++; - if (counter > MAX_LOG_LINES -1) counter = 0; + if (counter > MAX_LOG_LINES -1) counter = 0; } while (counter != logidx); } else { message = F("Enable weblog 2 if response expected\n"); @@ -1211,7 +1209,7 @@ void handleAjax() byte cflg = 1, counter = 99; if (strlen(webServer->arg("c1").c_str())) { - snprintf_P(svalue, sizeof(svalue), webServer->arg("c1").c_str()); + snprintf_P(svalue, sizeof(svalue), PSTR("%s"), webServer->arg("c1").c_str()); snprintf_P(log, sizeof(log), PSTR("CMND: %s"), svalue); addLog(LOG_LEVEL_INFO, log); byte syslog_now = syslog_level;