with ESPAsyncWebServer 3.3.0, the setAuthentication() method became
deprecated and a replacement method was provided which acts as a shim
and uses the new middleware-based approach to setup authentication. in
order to eventually apply a changed "read-only access allowed" setting,
the setAuthentication() method was called periodically. the shim
implementation each time allocates a new AuthenticationMiddleware and
adds it to the chain of middlewares, eventually exhausting the memory.
we now use the new middleware-based approach ourselves and only add the
respective AuthenticatonMiddleware instance once to the respective
websocket server instance.
a regression where enabling unauthenticated read-only access is not
applied until reboot is also fixed. all the AuthenticationMiddleware
instances were never removed from the chain of middlewares when calling
setAuthentication("", "").
48 lines
1.2 KiB
C++
48 lines
1.2 KiB
C++
// SPDX-License-Identifier: GPL-2.0-or-later
|
|
/*
|
|
* Copyright (C) 2022-2024 Thomas Basler and others
|
|
*/
|
|
#include "WebApi_ws_console.h"
|
|
#include "Configuration.h"
|
|
#include "MessageOutput.h"
|
|
#include "WebApi.h"
|
|
#include "defaults.h"
|
|
|
|
WebApiWsConsoleClass::WebApiWsConsoleClass()
|
|
: _ws("/console")
|
|
, _wsCleanupTask(1 * TASK_SECOND, TASK_FOREVER, std::bind(&WebApiWsConsoleClass::wsCleanupTaskCb, this))
|
|
{
|
|
}
|
|
|
|
void WebApiWsConsoleClass::init(AsyncWebServer& server, Scheduler& scheduler)
|
|
{
|
|
server.addHandler(&_ws);
|
|
MessageOutput.register_ws_output(&_ws);
|
|
|
|
scheduler.addTask(_wsCleanupTask);
|
|
_wsCleanupTask.enable();
|
|
|
|
_simpleDigestAuth.setUsername(AUTH_USERNAME);
|
|
_simpleDigestAuth.setRealm("console websocket");
|
|
|
|
reload();
|
|
}
|
|
|
|
void WebApiWsConsoleClass::reload()
|
|
{
|
|
_ws.removeMiddleware(&_simpleDigestAuth);
|
|
|
|
auto const& config = Configuration.get();
|
|
|
|
if (config.Security.AllowReadonly) { return; }
|
|
|
|
_simpleDigestAuth.setPassword(config.Security.Password);
|
|
_ws.addMiddleware(&_simpleDigestAuth);
|
|
}
|
|
|
|
void WebApiWsConsoleClass::wsCleanupTaskCb()
|
|
{
|
|
// see: https://github.com/me-no-dev/ESPAsyncWebServer#limiting-the-number-of-web-socket-clients
|
|
_ws.cleanupClients();
|
|
}
|