Fork of the espurna firmware for `mhsw` switches
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

96 lines
2.2 KiB

/*
Part of the API MODULE
Copyright (C) 2016-2019 by Xose Pérez <xose dot perez at gmail dot com>
Copyright (C) 2020 by Maxim Prokhorov <prokhorov dot max at outlook dot com>
*/
#include "espurna.h"
#include "api.h"
#include "ws.h"
#include "web.h"
// -----------------------------------------------------------------------------
#if WEB_SUPPORT
namespace {
bool _apiWebSocketOnKeyCheck(const char * key, JsonVariant& value) {
return (strncmp(key, "api", 3) == 0);
}
void _apiWebSocketOnConnected(JsonObject& root) {
root["apiEnabled"] = apiEnabled();
root["apiKey"] = apiKey();
root["apiRestFul"] = apiRestFul();
root["apiRealTime"] = getSetting("apiRealTime", 1 == API_REAL_TIME_VALUES);
}
}
// -----------------------------------------------------------------------------
// Public API
// -----------------------------------------------------------------------------
bool apiEnabled() {
return getSetting("apiEnabled", 1 == API_ENABLED);
}
bool apiRestFul() {
return getSetting("apiRestFul", 1 == API_RESTFUL);
}
String apiKey() {
return getSetting("apiKey", API_KEY);
}
bool apiAuthenticateHeader(AsyncWebServerRequest* request, const String& key) {
if (apiEnabled() && key.length()) {
auto* header = request->getHeader(F("Api-Key"));
if (header && (key == header->value())) {
return true;
}
}
return false;
}
bool apiAuthenticateParam(AsyncWebServerRequest* request, const String& key) {
auto* param = request->getParam("apikey", (request->method() == HTTP_PUT));
if (param && (key == param->value())) {
return true;
}
return false;
}
bool apiAuthenticate(AsyncWebServerRequest* request) {
const auto key = apiKey();
if (!key.length()) {
return false;
}
if (apiAuthenticateHeader(request, key)) {
return true;
}
if (apiAuthenticateParam(request, key)) {
return true;
}
return false;
}
void apiCommonSetup() {
wsRegister()
.onVisible([](JsonObject& root) { root["apiVisible"] = 1; })
.onConnected(_apiWebSocketOnConnected)
.onKeyCheck(_apiWebSocketOnKeyCheck);
}
#endif // WEB_SUPPORT == 1