From b71051a227ff35dac62c53b7cfd4bcf45d186ac2 Mon Sep 17 00:00:00 2001 From: Jm Casler Date: Fri, 17 Dec 2021 14:02:29 -0500 Subject: [PATCH] Attempt to address the ssl screen crashing on AndreK's device. --- src/graphics/Screen.cpp | 8 ++++- src/mesh/http/WebServer.cpp | 70 ++++++++++++------------------------- 2 files changed, 29 insertions(+), 49 deletions(-) diff --git a/src/graphics/Screen.cpp b/src/graphics/Screen.cpp index 71cdad008..ecf9953be 100644 --- a/src/graphics/Screen.cpp +++ b/src/graphics/Screen.cpp @@ -40,6 +40,7 @@ along with this program. If not, see . #ifndef NO_ESP32 #include "mesh/http/WiFiAPClient.h" +#include "esp_task_wdt.h" #endif using namespace meshtastic; /** @todo remove */ @@ -155,6 +156,11 @@ static void drawSSLScreen(OLEDDisplay *display, OLEDDisplayUiState *state, int16 display->setFont(FONT_SMALL); display->drawString(64 + x, y, "Creating SSL certificate"); +#ifndef NO_ESP32 + yield(); + esp_task_wdt_reset(); +#endif + display->setFont(FONT_SMALL); if ((millis() / 1000) % 2) { display->drawString(64 + x, FONT_HEIGHT_SMALL + y + 2, "Please wait . . ."); @@ -934,7 +940,7 @@ void Screen::drawDebugInfoWiFiTrampoline(OLEDDisplay *display, OLEDDisplayUiStat * it is expected that this will be used during the boot phase */ void Screen::setSSLFrames() { - DEBUG_MSG("showing SSL frames\n"); + // DEBUG_MSG("showing SSL frames\n"); static FrameCallback sslFrames[] = {drawSSLScreen}; ui.setFrames(sslFrames, 1); ui.update(); diff --git a/src/mesh/http/WebServer.cpp b/src/mesh/http/WebServer.cpp index 9d370846b..dea62765c 100644 --- a/src/mesh/http/WebServer.cpp +++ b/src/mesh/http/WebServer.cpp @@ -79,13 +79,13 @@ static void taskCreateCert(void *parameter) { prefs.begin("MeshtasticHTTPS", false); - // Delete the saved certs (used in debugging) #if 0 - DEBUG_MSG("Deleting any saved SSL keys ...\n"); - // prefs.clear(); - prefs.remove("PK"); - prefs.remove("cert"); + // Delete the saved certs (used in debugging) + DEBUG_MSG("Deleting any saved SSL keys ...\n"); + // prefs.clear(); + prefs.remove("PK"); + prefs.remove("cert"); #endif @@ -156,6 +156,7 @@ static void taskCreateCert(void *parameter) void createSSLCert() { + bool runLoop = false; if (isWifiAvailable() && !isCertReady) { // Create a new process just to handle creating the cert. @@ -163,21 +164,28 @@ void createSSLCert() // jm@casler.org (Oct 2020) xTaskCreate(taskCreateCert, /* Task function. */ "createCert", /* String with name of task. */ - 16384, /* Stack size in bytes. */ + //16384, /* Stack size in bytes. */ + 8192, /* Stack size in bytes. */ NULL, /* Parameter passed as input of the task */ 16, /* Priority of the task. */ NULL); /* Task handle. */ DEBUG_MSG("Waiting for SSL Cert to be generated.\n"); - int seconds = 0; while (!isCertReady) { - DEBUG_MSG("."); - delay(1000); - yield(); - esp_task_wdt_reset(); - seconds++; - if ((seconds == 3) && screen) { - screen->setSSLFrames(); + if ((millis() / 500) % 2) { + if (runLoop) { + DEBUG_MSG("."); + + yield(); + esp_task_wdt_reset(); + + if ((millis() / 1000 >= 3) && screen) { + screen->setSSLFrames(); + } + } + runLoop = false; + } else { + runLoop = true; } } DEBUG_MSG("SSL Cert Ready!\n"); @@ -201,40 +209,6 @@ void initWebServer() { DEBUG_MSG("Initializing Web Server ...\n"); -#if 0 -// this seems to be a copypaste dup of taskCreateCert - prefs.begin("MeshtasticHTTPS", false); - - size_t pkLen = prefs.getBytesLength("PK"); - size_t certLen = prefs.getBytesLength("cert"); - - DEBUG_MSG("Checking if we have a previously saved SSL Certificate.\n"); - - if (pkLen && certLen) { - - uint8_t *pkBuffer = new uint8_t[pkLen]; - prefs.getBytes("PK", pkBuffer, pkLen); - - uint8_t *certBuffer = new uint8_t[certLen]; - prefs.getBytes("cert", certBuffer, certLen); - - cert = new SSLCert(certBuffer, certLen, pkBuffer, pkLen); - - DEBUG_MSG("Retrieved Private Key: %d Bytes\n", cert->getPKLength()); - // DEBUG_MSG("Retrieved Private Key: " + String(cert->getPKLength()) + " Bytes"); - // for (int i = 0; i < cert->getPKLength(); i++) - // Serial.print(cert->getPKData()[i], HEX); - // Serial.println(); - - DEBUG_MSG("Retrieved Certificate: %d Bytes\n", cert->getCertLength()); - // for (int i = 0; i < cert->getCertLength(); i++) - // Serial.print(cert->getCertData()[i], HEX); - // Serial.println(); - } else { - DEBUG_MSG("Web Server started without SSL keys! How did this happen?\n"); - } -#endif - // We can now use the new certificate to setup our server as usual. secureServer = new HTTPSServer(cert); insecureServer = new HTTPServer();