diff --git a/sd_files/portals/media/gorilla.jpg b/sd_files/portals/media/gorilla.jpg new file mode 100644 index 0000000000..4e018713ad Binary files /dev/null and b/sd_files/portals/media/gorilla.jpg differ diff --git a/sd_files/portals/media/rickroll.gif b/sd_files/portals/media/rickroll.gif new file mode 100644 index 0000000000..4df6611e52 Binary files /dev/null and b/sd_files/portals/media/rickroll.gif differ diff --git a/src/modules/wifi/evil_portal.cpp b/src/modules/wifi/evil_portal.cpp index 46a84b7d9a..47df6c723f 100644 --- a/src/modules/wifi/evil_portal.cpp +++ b/src/modules/wifi/evil_portal.cpp @@ -67,7 +67,8 @@ bool EvilPortal::setup() { } options = { - {"Custom Html", [this]() { loadCustomHtml(); }} + {"Custom Html", [this]() { loadCustomHtml(); }}, + {"Meme Portal", [this]() { loadMemeHtml(); }} }; addOptionToMainMenu(); @@ -200,6 +201,19 @@ void EvilPortal::setupRoutes() { request->send(response); }); + webServer.on("/media/*", HTTP_GET, [](AsyncWebServerRequest *request) { + String path = "/portals/media" + request->url().substring(6); + if (SD.exists(path)) { + String contentType = "image/jpeg"; + if (path.endsWith(".gif")) contentType = "image/gif"; + else if (path.endsWith(".png")) contentType = "image/png"; + else if (path.endsWith(".mp4")) contentType = "video/mp4"; + request->send(SD, path, contentType); + } else { + request->send(404, "text/plain", "Not found"); + } + }); + webServer.on("/", [this](AsyncWebServerRequest *request) { portalController(request); }); webServer.on("/post", [this](AsyncWebServerRequest *request) { credsController(request); }); @@ -488,6 +502,43 @@ void EvilPortal::loadCustomHtml() { } } +void EvilPortal::loadMemeHtml() { + FS *fs; + if (!getFsStorage(fs)) { loadDefaultHtml(); return; } + + if (!fs->exists("/portals/media")) { loadDefaultHtml(); return; } + + apName = ""; + apName_from_keyboard(); + if (returnToMenu) return; + + File dir = fs->open("/portals/media"); + std::vector files; + while (true) { + File f = dir.openNextFile(); + if (!f) break; + if (!f.isDirectory()) files.push_back(String(f.name())); + } + dir.close(); + + if (files.empty()) { displayTextLine("No files in /portals/media"); loadDefaultHtml(); return; } + + std::vector