From 3bc0ee7180201763c45382d7d5bd427d2347fcd0 Mon Sep 17 00:00:00 2001 From: fvanroie Date: Thu, 30 Jan 2020 23:09:49 +0100 Subject: [PATCH] Add Web Config page --- src/hasp_http.cpp | 167 ++++++++++++++++++++++++++++++++++------------ src/hasp_http.h | 1 + 2 files changed, 127 insertions(+), 41 deletions(-) diff --git a/src/hasp_http.cpp b/src/hasp_http.cpp index 5fc9918b..2feaea28 100644 --- a/src/hasp_http.cpp +++ b/src/hasp_http.cpp @@ -16,18 +16,13 @@ #include #include -#define F_HTTP_ENABLE F("enable") -#define F_HTTP_PORT F("port") -#define F_HTTP_USER F("user") -#define F_HTTP_PASS F("pass") - bool httpEnable = true; bool webServerStarted = false; uint16_t httpPort = 80; FS * filesystem = &SPIFFS; File fsUploadFile; -String httpUser = "admin"; -String httpPassword = ""; +char httpUser[32] = ""; +char httpPassword[64] = ""; #if defined(ARDUINO_ARCH_ESP8266) #include @@ -104,6 +99,10 @@ String esp32ResetReason(uint8_t cpuid) #endif // ESP32 +static const char MAIN_MENU_BUTTON[] PROGMEM = + "

"; +static const char MIT_LICENSE[] PROGMEM = "
MIT License

"; + static const char HTTP_DOCTYPE[] PROGMEM = ""; @@ -152,7 +151,7 @@ void webHandleHaspConfig(); bool httpIsAuthenticated(const String & page) { if(httpPassword[0] != '\0') { // Request HTTP auth if httpPassword is set - if(!webServer.authenticate(httpUser.c_str(), httpPassword.c_str())) { + if(!webServer.authenticate(httpUser, httpPassword)) { webServer.requestAuthentication(); return false; } @@ -220,7 +219,8 @@ void webHandleRoot() httpMessage += String(F("")); httpMessage += F("

"); - httpMessage += F("

"); + httpMessage += + PSTR("

"); httpMessage += F("

"); @@ -266,26 +266,32 @@ void webHandleAbout() String httpMessage((char *)0); httpMessage.reserve(1500); - httpMessage += F("

HASP OpenHardware edition

Copyright© 2020 Francis Van Roie " - "
MIT License

"); + httpMessage += F("

HASP OpenHardware edition

Copyright© 2020 Francis Van Roie "); + httpMessage += FPSTR(MIT_LICENSE); httpMessage += F("

Based on the previous work of the following open source developers.


"); - httpMessage += - F("

HASwitchPlate

Copyright© 2019 Allen Derusha allen@derusha.org
MIT License

"); + httpMessage += F("

HASwitchPlate

Copyright© 2019 Allen Derusha allen@derusha.org"); + httpMessage += FPSTR(MIT_LICENSE); httpMessage += F("

LittlevGL

Copyright© 2016 Gábor Kiss-Vámosi
Copyright© 2019 " - "LittlevGL
MIT License

"); - httpMessage += F("

zi Font Engine

Copyright© 2020 Francis Van Roie
MIT License

"); + "LittlevGL"); + httpMessage += FPSTR(MIT_LICENSE); + httpMessage += F("

zi Font Engine

Copyright© 2020 Francis Van Roie"); + httpMessage += FPSTR(MIT_LICENSE); httpMessage += F("

TFT_eSPI Library

Copyright© 2017 Bodmer (https://github.com/Bodmer) All " "rights reserved.
FreeBSD License

"); httpMessage += F("

includes parts from the Adafruit_GFX library
Copyright© 2012 Adafruit Industries. " "All rights reserved
BSD License

"); - httpMessage += F("

ArduinoJson

Copyright© 2014-2019 Benoit BLANCHON
MIT License

"); - httpMessage += F("

PubSubClient

Copyright© 2008-2015 Nicholas O'Leary
MIT License

"); - httpMessage += F("

Syslog

Copyright© 2016 Martin Sloup
MIT License

"); - httpMessage += F("

QR Code generator

Copyright© Project Nayuki
MIT License

"); + httpMessage += F("

ArduinoJson

Copyright© 2014-2019 Benoit BLANCHON"); + httpMessage += FPSTR(MIT_LICENSE); + httpMessage += F("

PubSubClient

Copyright© 2008-2015 Nicholas O'Leary"); + httpMessage += FPSTR(MIT_LICENSE); + httpMessage += F("

Syslog

Copyright© 2016 Martin Sloup"); + httpMessage += FPSTR(MIT_LICENSE); + httpMessage += F("

QR Code generator

Copyright© Project Nayuki"); + httpMessage += FPSTR(MIT_LICENSE); - httpMessage += F("

"); + httpMessage += FPSTR(MAIN_MENU_BUTTON); webSendPage(nodename, httpMessage.length(), false); webServer.sendContent(httpMessage); // len @@ -370,7 +376,8 @@ void webHandleInfo() httpMessage += String(ESP.getResetInfo()); #endif - httpMessage += F("

"); + httpMessage += FPSTR(MAIN_MENU_BUTTON); + ; webSendPage(nodename, httpMessage.length(), false); webServer.sendContent(httpMessage); // len @@ -625,20 +632,24 @@ void webHandleConfig() if(!httpIsAuthenticated(F("/config"))) return; if(webServer.method() == HTTP_POST) { - if(webServer.hasArg(F("save"))) { + if(webServer.hasArg(PSTR("save"))) { DynamicJsonDocument settings(256); for(int i = 0; i < webServer.args(); i++) settings[webServer.argName(i)] = webServer.arg(i); - if(webServer.arg(F("save")) == String(F("hasp"))) { + if(webServer.arg(PSTR("save")) == String(PSTR("hasp"))) { haspSetConfig(settings.as()); - } else if(webServer.arg(F("save")) == String(F("mqtt"))) { + } else if(webServer.arg(PSTR("save")) == String(PSTR("mqtt"))) { mqttSetConfig(settings.as()); - } else if(webServer.arg(F("save")) == String(F("http"))) { + } else if(webServer.arg(PSTR("save")) == String(PSTR("http"))) { + httpSetConfig(settings.as()); - } else if(webServer.arg(F("save")) == String(F("wifi"))) { + // Password might have changed + if(!httpIsAuthenticated(F("/config"))) return; + + } else if(webServer.arg(PSTR("save")) == String(PSTR("wifi"))) { wifiSetConfig(settings.as()); } } @@ -675,9 +686,10 @@ void webHandleConfig() F("

"); httpMessage += F("

"); + "All Settings"); - httpMessage += F("
"); + httpMessage += FPSTR(MAIN_MENU_BUTTON); + ; webSendPage(nodename, httpMessage.length(), false); webServer.sendContent(httpMessage); // len @@ -719,8 +731,9 @@ void webHandleMqttConfig() "name='pass' type='password' maxlength=31 placeholder='mqttPassword' value='"); if(settings[FPSTR(F_CONFIG_PASS)].as() != "") httpMessage += F("********"); - httpMessage += F("'>"); - httpMessage += F("
"); + httpMessage += F("'>

"); + httpMessage += + PSTR("

"); webSendPage(nodename, httpMessage.length(), false); webServer.sendContent(httpMessage); // len @@ -755,7 +768,43 @@ void webHandleWifiConfig() if(WiFi.getMode() == WIFI_STA) { httpMessage += - F("

"); + PSTR("

"); + } + + webSendPage(nodename, httpMessage.length(), false); + webServer.sendContent(httpMessage); // len + webServer.sendContent_P(HTTP_END); // 20 +} +#endif + +//////////////////////////////////////////////////////////////////////////////////////////////////// +#if LV_USE_HASP_HTTP > 0 +void webHandleHttpConfig() +{ // http://plate01/config/http + if(!httpIsAuthenticated(F("/config/http"))) return; + + DynamicJsonDocument settings(256); + httpGetConfig(settings.to()); + + char buffer[64]; + String nodename = haspGetNodename(); + String httpMessage((char *)0); + httpMessage.reserve(1024); + + httpMessage += String(F("
")); + httpMessage += String(F("Web Username (optional)
Web Password (optional)

"); + + if(WiFi.getMode() == WIFI_STA) { + httpMessage += + PSTR("

"); } webSendPage(nodename, httpMessage.length(), false); @@ -849,9 +898,10 @@ void webHandleHaspConfig() "name='startpage' type='number' min='0' max='3' value='")) + settings[FPSTR(F_CONFIG_STARTPAGE)].as() + "'>

"; - httpMessage += F(""); + httpMessage += F("

"); - httpMessage += F("
"); + httpMessage += + PSTR("

"); webSendPage(nodename, httpMessage.length(), false); webServer.sendContent(httpMessage); // len @@ -925,7 +975,7 @@ void httpHandleResetConfig() String nodename = haspGetNodename(); char buffer[64]; String httpMessage((char *)0); - httpMessage.reserve(128); + httpMessage.reserve(768); if(resetConfirmed) { // User has confirmed, so reset everything httpMessage += F("

"); @@ -944,8 +994,10 @@ void httpHandleResetConfig() "re-configure the device before accessing it again. ALL FILES WILL BE LOST!" "


" "

" - "


" - "
"); + "


"); + + httpMessage += + PSTR("

"); } webSendPage(nodename, httpMessage.length(), resetConfirmed); @@ -953,8 +1005,9 @@ void httpHandleResetConfig() webServer.sendContent_P(HTTP_END); // 20 if(resetConfirmed) { - delay(1000); + delay(250); // configClearSaved(); + haspReset(); } } @@ -994,6 +1047,7 @@ void httpSetup(const JsonObject & settings) webServer.on(F("/info"), webHandleInfo); webServer.on(F("/config"), webHandleConfig); webServer.on(F("/config/hasp"), webHandleHaspConfig); + webServer.on(F("/config/http"), webHandleHttpConfig); #if LV_USE_HASP_MQTT > 0 webServer.on(F("/config/mqtt"), webHandleMqttConfig); #endif @@ -1034,13 +1088,44 @@ void httpLoop(bool wifiIsConnected) //////////////////////////////////////////////////////////////////////////////////////////////////// bool httpGetConfig(const JsonObject & settings) { - settings[FPSTR(F_HTTP_ENABLE)] = httpEnable; - settings[FPSTR(F_HTTP_PORT)] = httpPort; - settings[FPSTR(F_HTTP_USER)] = httpUser; - settings[FPSTR(F_HTTP_PASS)] = httpPassword; + settings[FPSTR(F_CONFIG_ENABLE)] = httpEnable; + settings[FPSTR(F_CONFIG_PORT)] = httpPort; + settings[FPSTR(F_CONFIG_USER)] = httpUser; + settings[FPSTR(F_CONFIG_PASS)] = httpPassword; size_t size = serializeJson(settings, Serial); Serial.println(); return true; +} + +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +bool httpSetConfig(const JsonObject & settings) +{ + bool changed = false; + + if(!settings[FPSTR(F_CONFIG_USER)].isNull()) { + changed |= strcmp(httpUser, settings[FPSTR(F_CONFIG_USER)]) != 0; + strncpy(httpUser, settings[FPSTR(F_CONFIG_USER)], sizeof(httpUser)); + } + + if(!settings[FPSTR(F_CONFIG_PASS)].isNull()) { + changed |= strcmp(httpPassword, settings[FPSTR(F_CONFIG_PASS)]) != 0; + strncpy(httpPassword, settings[FPSTR(F_CONFIG_PASS)], sizeof(httpPassword)); + } + + if(!settings[FPSTR(F_CONFIG_PORT)].isNull()) { + if(httpPort != settings[FPSTR(F_CONFIG_PORT)].as()) { + debugPrintln(F("httpPort set")); + } + changed |= httpPort != settings[FPSTR(F_CONFIG_PORT)].as(); + + httpPort = settings[FPSTR(F_CONFIG_PORT)].as(); + } + + size_t size = serializeJson(settings, Serial); + Serial.println(); + + return changed; } \ No newline at end of file diff --git a/src/hasp_http.h b/src/hasp_http.h index d68e08b5..d0744928 100644 --- a/src/hasp_http.h +++ b/src/hasp_http.h @@ -8,5 +8,6 @@ void httpLoop(bool wifiIsConnected); void httpReconnect(); bool httpGetConfig(const JsonObject & settings); +bool httpSetConfig(const JsonObject & settings); #endif \ No newline at end of file