allow to protect configuration page withh user/pass

This commit is contained in:
technyon
2022-04-04 21:50:37 +02:00
parent 08f7c6025f
commit 90e0a2daa2
3 changed files with 97 additions and 13 deletions

View File

@@ -7,23 +7,47 @@ WebCfgServer::WebCfgServer(NukiWrapper* nuki, Network* network, Preferences* pre
_nuki(nuki),
_network(network),
_preferences(preferences)
{}
{
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());
// Serial.print("##### user: "); Serial.println(_credUser);
// Serial.print("##### pass: "); Serial.println(_credPassword);
}
}
void WebCfgServer::initialize()
{
server.on("/", [&]() {
// if (!server.authenticate(www_username, www_password)) {
// return server.requestAuthentication();
// }
if (_hasCredentials && !server.authenticate(_credUser, _credPassword)) {
return server.requestAuthentication();
}
String response = "";
serveHtml(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("/method=get", [&]() {
// if (!server.authenticate(www_username, www_password)) {
// return server.requestAuthentication();
// }
if (_hasCredentials && !server.authenticate(_credUser, _credPassword)) {
return server.requestAuthentication();
}
processArgs();
server.send(200, "text/plain", "Configuration saved ... restarting.");
});
@@ -34,6 +58,7 @@ void WebCfgServer::initialize()
void WebCfgServer::processArgs()
{
bool configChanged = false;
bool clearMqttCredentials = false;
bool clearCredentials = false;
int count = server.args();
@@ -60,7 +85,7 @@ void WebCfgServer::processArgs()
{
if(value == "#")
{
clearCredentials = true;
clearMqttCredentials = true;
}
else
{
@@ -91,12 +116,36 @@ void WebCfgServer::processArgs()
_preferences->putInt(preference_query_interval_battery, value.toInt());
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;
}
}
if(clearMqttCredentials)
{
_preferences->putString(preference_mqtt_user, "");
_preferences->putString(preference_mqtt_password, "");
configChanged = true;
}
if(clearCredentials)
{
_preferences->putString(preference_mqtt_user, "");
_preferences->putString(preference_mqtt_password, "");
_preferences->putString(preference_cred_user, "");
_preferences->putString(preference_cred_password, "");
configChanged = true;
}
@@ -118,7 +167,7 @@ void WebCfgServer::update()
vTaskDelay(200 / portTICK_PERIOD_MS);
}
void WebCfgServer::serveHtml(String& response)
void WebCfgServer::buildHtml(String& response)
{
response.concat("<HTML>\n");
response.concat("<HEAD>\n");
@@ -156,6 +205,34 @@ void WebCfgServer::serveHtml(String& response)
response.concat("</HTML>\n");
}
void WebCfgServer::buildCredHtml(String &response)
{
response.concat("<HTML>\n");
response.concat("<HEAD>\n");
response.concat("<TITLE>NUKI Hub</TITLE>\n");
response.concat("</HEAD>\n");
response.concat("<BODY>\n");
response.concat("<FORM ACTION=method=get >");
response.concat("<h3>Credentials</h3>");
response.concat("<table>");
printInputField(response, "CREDUSER", "User (# to clear)", _preferences->getString(preference_cred_user).c_str(), 20);
printInputField(response, "CREDPASS", "Password", "*", 30);
response.concat("</table>");
response.concat("<br><INPUT TYPE=SUBMIT NAME=\"submit\" VALUE=\"Save\">");
response.concat("</FORM>");
response.concat("<BR>");
//
response.concat("</BODY>\n");
response.concat("</HTML>\n");
}
void WebCfgServer::printInputField(String& response,
const char *token,
const char *description,