Fix: prevent unauthorized access to OnBattery websockets

it turns out that authentication was never implemented on
OpenDTU-OnBattery-specific websocket connections. found while
applying https://github.com/tbnobody/OpenDTU/pull/2320
This commit is contained in:
Bernhard Kirchen 2024-09-30 22:26:31 +02:00
parent 185ac36282
commit 1812e6eb6a
7 changed files with 69 additions and 0 deletions

View File

@ -10,6 +10,7 @@ class WebApiWsHuaweiLiveClass {
public:
WebApiWsHuaweiLiveClass();
void init(AsyncWebServer& server, Scheduler& scheduler);
void reload();
private:
void generateCommonJsonResponse(JsonVariant& root);
@ -18,6 +19,7 @@ private:
AsyncWebServer* _server;
AsyncWebSocket _ws;
AuthenticationMiddleware _simpleDigestAuth;
std::mutex _mutex;

View File

@ -10,6 +10,7 @@ class WebApiWsBatteryLiveClass {
public:
WebApiWsBatteryLiveClass();
void init(AsyncWebServer& server, Scheduler& scheduler);
void reload();
private:
void generateCommonJsonResponse(JsonVariant& root);
@ -18,6 +19,7 @@ private:
AsyncWebServer* _server;
AsyncWebSocket _ws;
AuthenticationMiddleware _simpleDigestAuth;
uint32_t _lastUpdateCheck = 0;
static constexpr uint16_t _responseSize = 1024 + 512;

View File

@ -12,6 +12,7 @@ class WebApiWsVedirectLiveClass {
public:
WebApiWsVedirectLiveClass();
void init(AsyncWebServer& server, Scheduler& scheduler);
void reload();
private:
void generateCommonJsonResponse(JsonVariant& root, bool fullUpdate);
@ -22,6 +23,7 @@ private:
AsyncWebServer* _server;
AsyncWebSocket _ws;
AuthenticationMiddleware _simpleDigestAuth;
uint32_t _lastFullPublish = 0;
uint32_t _lastPublish = 0;

View File

@ -51,6 +51,9 @@ void WebApiClass::reload()
{
_webApiWsConsole.reload();
_webApiWsLive.reload();
_webApiWsBatteryLive.reload();
_webApiWsVedirectLive.reload();
_webApiWsHuaweiLive.reload();
}
bool WebApiClass::checkCredentials(AsyncWebServerRequest* request)

View File

@ -42,6 +42,26 @@ void WebApiWsHuaweiLiveClass::init(AsyncWebServer& server, Scheduler& scheduler)
_sendDataTask.setIterations(TASK_FOREVER);
_sendDataTask.setInterval(1 * TASK_SECOND);
_sendDataTask.enable();
_simpleDigestAuth.setUsername(AUTH_USERNAME);
_simpleDigestAuth.setRealm("AC charger websocket");
reload();
}
void WebApiWsHuaweiLiveClass::reload()
{
_ws.removeMiddleware(&_simpleDigestAuth);
auto const& config = Configuration.get();
if (config.Security.AllowReadonly) { return; }
_ws.enable(false);
_simpleDigestAuth.setPassword(config.Security.Password);
_ws.addMiddleware(&_simpleDigestAuth);
_ws.closeAll();
_ws.enable(true);
}
void WebApiWsHuaweiLiveClass::wsCleanupTaskCb()

View File

@ -42,6 +42,26 @@ void WebApiWsBatteryLiveClass::init(AsyncWebServer& server, Scheduler& scheduler
_sendDataTask.setIterations(TASK_FOREVER);
_sendDataTask.setInterval(1 * TASK_SECOND);
_sendDataTask.enable();
_simpleDigestAuth.setUsername(AUTH_USERNAME);
_simpleDigestAuth.setRealm("battery websocket");
reload();
}
void WebApiWsBatteryLiveClass::reload()
{
_ws.removeMiddleware(&_simpleDigestAuth);
auto const& config = Configuration.get();
if (config.Security.AllowReadonly) { return; }
_ws.enable(false);
_simpleDigestAuth.setPassword(config.Security.Password);
_ws.addMiddleware(&_simpleDigestAuth);
_ws.closeAll();
_ws.enable(true);
}
void WebApiWsBatteryLiveClass::wsCleanupTaskCb()

View File

@ -44,6 +44,26 @@ void WebApiWsVedirectLiveClass::init(AsyncWebServer& server, Scheduler& schedule
_sendDataTask.setIterations(TASK_FOREVER);
_sendDataTask.setInterval(500 * TASK_MILLISECOND);
_sendDataTask.enable();
_simpleDigestAuth.setUsername(AUTH_USERNAME);
_simpleDigestAuth.setRealm("vedirect websocket");
reload();
}
void WebApiWsVedirectLiveClass::reload()
{
_ws.removeMiddleware(&_simpleDigestAuth);
auto const& config = Configuration.get();
if (config.Security.AllowReadonly) { return; }
_ws.enable(false);
_simpleDigestAuth.setPassword(config.Security.Password);
_ws.addMiddleware(&_simpleDigestAuth);
_ws.closeAll();
_ws.enable(true);
}
void WebApiWsVedirectLiveClass::wsCleanupTaskCb()