/* Part of the API MODULE Copyright (C) 2016-2019 by Xose PĂ©rez Copyright (C) 2020 by Maxim Prokhorov */ #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