#include "WebCfgServer.h"
#include "PreferencesKeys.h"
#include "Version.h"
#include "hardware/WifiEthServer.h"
WebCfgServer::WebCfgServer(NukiWrapper* nuki, NukiOpenerWrapper* nukiOpener, Network* network, EthServer* ethServer, Preferences* preferences, bool allowRestartToPortal)
: _server(ethServer),
_nuki(nuki),
_nukiOpener(nukiOpener),
_network(network),
_preferences(preferences),
_allowRestartToPortal(allowRestartToPortal)
{
_confirmCode = generateConfirmCode();
String str = _preferences->getString(preference_cred_user);
if(str.length() > 0)
{
_hasCredentials = true;
const char *user = str.c_str();
memcpy(&_credUser, user, str.length());
str = _preferences->getString(preference_cred_password);
const char *pass = str.c_str();
memcpy(&_credPassword, pass, str.length());
}
}
void WebCfgServer::initialize()
{
_server.on("/", [&]() {
if (_hasCredentials && !_server.authenticate(_credUser, _credPassword)) {
return _server.requestAuthentication();
}
String response = "";
buildHtml(response);
_server.send(200, "text/html", response);
});
_server.on("/cred", [&]() {
if (_hasCredentials && !_server.authenticate(_credUser, _credPassword)) {
return _server.requestAuthentication();
}
String response = "";
buildCredHtml(response);
_server.send(200, "text/html", response);
});
_server.on("/mqttconfig", [&]() {
if (_hasCredentials && !_server.authenticate(_credUser, _credPassword)) {
return _server.requestAuthentication();
}
String response = "";
buildMqttConfigHtml(response);
_server.send(200, "text/html", response);
});
_server.on("/wifi", [&]() {
if (_hasCredentials && !_server.authenticate(_credUser, _credPassword)) {
return _server.requestAuthentication();
}
String response = "";
buildConfigureWifiHtml(response);
_server.send(200, "text/html", response);
});
_server.on("/unpairlock", [&]() {
if (_hasCredentials && !_server.authenticate(_credUser, _credPassword)) {
return _server.requestAuthentication();
}
processUnpair(false);
});
_server.on("/unpairopener", [&]() {
if (_hasCredentials && !_server.authenticate(_credUser, _credPassword)) {
return _server.requestAuthentication();
}
processUnpair(true);
});
_server.on("/wifimanager", [&]() {
if (_hasCredentials && !_server.authenticate(_credUser, _credPassword)) {
return _server.requestAuthentication();
}
if(_allowRestartToPortal)
{
String response = "";
buildConfirmHtml(response, "Restarting. Connect to ESP access point to reconfigure WiFi.", 0);
_server.send(200, "text/html", response);
waitAndProcess(true, 2000);
_network->restartAndConfigureWifi();
}
});
_server.on("/method=get", [&]() {
if (_hasCredentials && !_server.authenticate(_credUser, _credPassword)) {
return _server.requestAuthentication();
}
String message = "";
bool restartEsp = processArgs(message);
if(restartEsp)
{
String response = "";
buildConfirmHtml(response, message);
_server.send(200, "text/html", response);
Serial.println(F("Restarting"));
waitAndProcess(true, 1000);
ESP.restart();
}
else
{
String response = "";
buildConfirmHtml(response, message, 3);
_server.send(200, "text/html", response);
waitAndProcess(false, 1000);
}
});
_server.begin();
}
bool WebCfgServer::processArgs(String& message)
{
bool configChanged = false;
bool clearMqttCredentials = false;
bool clearCredentials = false;
int count = _server.args();
for(int index = 0; index < count; index++)
{
String key = _server.argName(index);
String value = _server.arg(index);
if(key == "MQTTSERVER")
{
_preferences->putString(preference_mqtt_broker, value);
configChanged = true;
}
else if(key == "MQTTPORT")
{
_preferences->putInt(preference_mqtt_broker_port, value.toInt());
configChanged = true;
}
else if(key == "MQTTUSER")
{
if(value == "#")
{
clearMqttCredentials = true;
}
else
{
_preferences->putString(preference_mqtt_user, value);
configChanged = true;
}
}
else if(key == "MQTTPASS")
{
if(value != "*")
{
_preferences->putString(preference_mqtt_password, value);
configChanged = true;
}
}
else if(key == "MQTTPATH")
{
_preferences->putString(preference_mqtt_lock_path, value);
configChanged = true;
}
else if(key == "MQTTOPPATH")
{
_preferences->putString(preference_mqtt_opener_path, value);
configChanged = true;
}
else if(key == "HOSTNAME")
{
_preferences->putString(preference_hostname, value);
configChanged = true;
}
else if(key == "NETTIMEOUT")
{
_preferences->putInt(preference_network_timeout, value.toInt());
configChanged = true;
}
else if(key == "LSTINT")
{
_preferences->putInt(preference_query_interval_lockstate, value.toInt());
configChanged = true;
}
else if(key == "BATINT")
{
_preferences->putInt(preference_query_interval_battery, value.toInt());
configChanged = true;
}
else if(key == "PRDTMO")
{
_preferences->putInt(preference_presence_detection_timeout, value.toInt());
configChanged = true;
}
else if(key == "PUBAUTH")
{
_preferences->putBool(preference_publish_authdata, (value == "1"));
configChanged = true;
}
else if(key == "LOCKENA")
{
_preferences->putBool(preference_lock_enabled, (value == "1"));
configChanged = true;
}
else if(key == "OPENA")
{
_preferences->putBool(preference_opener_enabled, (value == "1"));
configChanged = true;
}
else if(key == "CREDUSER")
{
if(value == "#")
{
clearCredentials = true;
}
else
{
_preferences->putString(preference_cred_user, value);
configChanged = true;
}
}
else if(key == "CREDPASS")
{
_preferences->putString(preference_cred_password, value);
configChanged = true;
}
else if(key == "NUKIPIN" && _nuki != nullptr)
{
if(value == "#")
{
message = "NUKI Lock PIN cleared";
_nuki->setPin(0xffff);
}
else
{
message = "NUKI Lock PIN saved";
_nuki->setPin(value.toInt());
}
}
else if(key == "NUKIOPPIN" && _nukiOpener != nullptr)
{
if(value == "#")
{
message = "NUKI Opener PIN cleared";
_nukiOpener->setPin(0xffff);
}
else
{
message = "NUKI Opener PIN saved";
_nukiOpener->setPin(value.toInt());
}
}
}
if(clearMqttCredentials)
{
_preferences->putString(preference_mqtt_user, "");
_preferences->putString(preference_mqtt_password, "");
configChanged = true;
}
if(clearCredentials)
{
_preferences->putString(preference_cred_user, "");
_preferences->putString(preference_cred_password, "");
configChanged = true;
}
if(configChanged)
{
message = "Configuration saved ... restarting.";
_enabled = false;
_preferences->end();
}
return configChanged;
}
void WebCfgServer::update()
{
if(!_enabled) return;
_server.handleClient();
}
void WebCfgServer::buildHtml(String& response)
{
buildHtmlHeader(response);
response.concat("