|
|
|
@ -8,6 +8,23 @@ WebServerManager::WebServerManager() { |
|
|
|
server = new AsyncWebServer(80); |
|
|
|
server = new AsyncWebServer(80); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
void WebServerManager::logRequest(AsyncWebServerRequest* request, const String& routeTag) { |
|
|
|
|
|
|
|
String method = "OTHER"; |
|
|
|
|
|
|
|
if (request->method() == HTTP_GET) method = "GET"; |
|
|
|
|
|
|
|
else if (request->method() == HTTP_POST) method = "POST"; |
|
|
|
|
|
|
|
else if (request->method() == HTTP_PUT) method = "PUT"; |
|
|
|
|
|
|
|
else if (request->method() == HTTP_DELETE) method = "DELETE"; |
|
|
|
|
|
|
|
else if (request->method() == HTTP_OPTIONS) method = "OPTIONS"; |
|
|
|
|
|
|
|
else if (request->method() == HTTP_PATCH) method = "PATCH"; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
String remoteIp = "unknown"; |
|
|
|
|
|
|
|
if (request->client()) { |
|
|
|
|
|
|
|
remoteIp = request->client()->remoteIP().toString(); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
logMessage(LOG_INFO, "HTTP " + method + " " + request->url() + " depuis " + remoteIp + " (" + routeTag + ")"); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
String WebServerManager::getSessionIdFromRequest(AsyncWebServerRequest* request) { |
|
|
|
String WebServerManager::getSessionIdFromRequest(AsyncWebServerRequest* request) { |
|
|
|
if (request->hasHeader("Cookie")) { |
|
|
|
if (request->hasHeader("Cookie")) { |
|
|
|
String cookie = request->header("Cookie"); |
|
|
|
String cookie = request->header("Cookie"); |
|
|
|
@ -54,16 +71,25 @@ void WebServerManager::sendJsonSuccess(AsyncWebServerRequest* request, const Str |
|
|
|
void WebServerManager::setupRoutes() { |
|
|
|
void WebServerManager::setupRoutes() { |
|
|
|
// Route de login
|
|
|
|
// Route de login
|
|
|
|
server->on("/login", HTTP_POST, [this](AsyncWebServerRequest* request) { |
|
|
|
server->on("/login", HTTP_POST, [this](AsyncWebServerRequest* request) { |
|
|
|
|
|
|
|
logRequest(request, "login"); |
|
|
|
this->handleLogin(request); |
|
|
|
this->handleLogin(request); |
|
|
|
}); |
|
|
|
}); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// Endpoint de diagnostic réseau (sans authentification)
|
|
|
|
|
|
|
|
server->on("/api/health", HTTP_GET, [this](AsyncWebServerRequest* request) { |
|
|
|
|
|
|
|
logRequest(request, "health"); |
|
|
|
|
|
|
|
this->handleHealth(request); |
|
|
|
|
|
|
|
}); |
|
|
|
|
|
|
|
|
|
|
|
// Route de logout
|
|
|
|
// Route de logout
|
|
|
|
server->on("/logout", HTTP_GET, [this](AsyncWebServerRequest* request) { |
|
|
|
server->on("/logout", HTTP_GET, [this](AsyncWebServerRequest* request) { |
|
|
|
|
|
|
|
logRequest(request, "logout"); |
|
|
|
this->handleLogout(request); |
|
|
|
this->handleLogout(request); |
|
|
|
}); |
|
|
|
}); |
|
|
|
|
|
|
|
|
|
|
|
// API - Configuration
|
|
|
|
// API - Configuration
|
|
|
|
server->on("/api/config", HTTP_GET, [this](AsyncWebServerRequest* request) { |
|
|
|
server->on("/api/config", HTTP_GET, [this](AsyncWebServerRequest* request) { |
|
|
|
|
|
|
|
logRequest(request, "get_config"); |
|
|
|
if (!isAuthenticated(request)) { |
|
|
|
if (!isAuthenticated(request)) { |
|
|
|
sendJsonError(request, 401, "Non authentifié"); |
|
|
|
sendJsonError(request, 401, "Non authentifié"); |
|
|
|
return; |
|
|
|
return; |
|
|
|
@ -72,6 +98,7 @@ void WebServerManager::setupRoutes() { |
|
|
|
}); |
|
|
|
}); |
|
|
|
|
|
|
|
|
|
|
|
server->on("/api/config", HTTP_POST, [this](AsyncWebServerRequest* request) { |
|
|
|
server->on("/api/config", HTTP_POST, [this](AsyncWebServerRequest* request) { |
|
|
|
|
|
|
|
logRequest(request, "set_config"); |
|
|
|
if (!isAuthenticated(request)) { |
|
|
|
if (!isAuthenticated(request)) { |
|
|
|
sendJsonError(request, 401, "Non authentifié"); |
|
|
|
sendJsonError(request, 401, "Non authentifié"); |
|
|
|
return; |
|
|
|
return; |
|
|
|
@ -81,6 +108,7 @@ void WebServerManager::setupRoutes() { |
|
|
|
|
|
|
|
|
|
|
|
// API - Changement de mot de passe
|
|
|
|
// API - Changement de mot de passe
|
|
|
|
server->on("/api/password", HTTP_POST, [this](AsyncWebServerRequest* request) { |
|
|
|
server->on("/api/password", HTTP_POST, [this](AsyncWebServerRequest* request) { |
|
|
|
|
|
|
|
logRequest(request, "change_password"); |
|
|
|
if (!isAuthenticated(request)) { |
|
|
|
if (!isAuthenticated(request)) { |
|
|
|
sendJsonError(request, 401, "Non authentifié"); |
|
|
|
sendJsonError(request, 401, "Non authentifié"); |
|
|
|
return; |
|
|
|
return; |
|
|
|
@ -90,6 +118,7 @@ void WebServerManager::setupRoutes() { |
|
|
|
|
|
|
|
|
|
|
|
// API - Statistiques
|
|
|
|
// API - Statistiques
|
|
|
|
server->on("/api/stats", HTTP_GET, [this](AsyncWebServerRequest* request) { |
|
|
|
server->on("/api/stats", HTTP_GET, [this](AsyncWebServerRequest* request) { |
|
|
|
|
|
|
|
logRequest(request, "get_stats"); |
|
|
|
if (!isAuthenticated(request)) { |
|
|
|
if (!isAuthenticated(request)) { |
|
|
|
sendJsonError(request, 401, "Non authentifié"); |
|
|
|
sendJsonError(request, 401, "Non authentifié"); |
|
|
|
return; |
|
|
|
return; |
|
|
|
@ -100,6 +129,7 @@ void WebServerManager::setupRoutes() { |
|
|
|
// OTA Update
|
|
|
|
// OTA Update
|
|
|
|
server->on("/api/update", HTTP_POST, |
|
|
|
server->on("/api/update", HTTP_POST, |
|
|
|
[this](AsyncWebServerRequest* request) { |
|
|
|
[this](AsyncWebServerRequest* request) { |
|
|
|
|
|
|
|
logRequest(request, "ota_update"); |
|
|
|
if (!isAuthenticated(request)) { |
|
|
|
if (!isAuthenticated(request)) { |
|
|
|
sendJsonError(request, 401, "Non authentifié"); |
|
|
|
sendJsonError(request, 401, "Non authentifié"); |
|
|
|
return; |
|
|
|
return; |
|
|
|
@ -120,7 +150,8 @@ void WebServerManager::setupRoutes() { |
|
|
|
); |
|
|
|
); |
|
|
|
|
|
|
|
|
|
|
|
// 404
|
|
|
|
// 404
|
|
|
|
server->onNotFound([](AsyncWebServerRequest* request) { |
|
|
|
server->onNotFound([this](AsyncWebServerRequest* request) { |
|
|
|
|
|
|
|
logRequest(request, "not_found"); |
|
|
|
request->send(404, "text/plain", "Page non trouvée"); |
|
|
|
request->send(404, "text/plain", "Page non trouvée"); |
|
|
|
}); |
|
|
|
}); |
|
|
|
|
|
|
|
|
|
|
|
@ -128,6 +159,19 @@ void WebServerManager::setupRoutes() { |
|
|
|
server->serveStatic("/", LittleFS, "/").setDefaultFile("login.html"); |
|
|
|
server->serveStatic("/", LittleFS, "/").setDefaultFile("login.html"); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
void WebServerManager::handleHealth(AsyncWebServerRequest* request) { |
|
|
|
|
|
|
|
JsonDocument doc; |
|
|
|
|
|
|
|
doc["ok"] = true; |
|
|
|
|
|
|
|
doc["ip_sta"] = WiFi.localIP().toString(); |
|
|
|
|
|
|
|
doc["ip_ap"] = WiFi.softAPIP().toString(); |
|
|
|
|
|
|
|
doc["wifi_status"] = WiFi.status(); |
|
|
|
|
|
|
|
doc["ssid"] = WiFi.SSID(); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
String response; |
|
|
|
|
|
|
|
serializeJson(doc, response); |
|
|
|
|
|
|
|
request->send(200, "application/json", response); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
void WebServerManager::handleLogin(AsyncWebServerRequest* request) { |
|
|
|
void WebServerManager::handleLogin(AsyncWebServerRequest* request) { |
|
|
|
if (!request->hasParam("username", true) || !request->hasParam("password", true)) { |
|
|
|
if (!request->hasParam("username", true) || !request->hasParam("password", true)) { |
|
|
|
sendJsonError(request, 400, "Paramètres manquants"); |
|
|
|
sendJsonError(request, 400, "Paramètres manquants"); |
|
|
|
|