fix: digest auth changed to basic

Digest auth not working on ios #99
This commit is contained in:
Yurii
2024-12-02 06:26:03 +03:00
parent 1bb9b61017
commit 43fd095714
8 changed files with 106 additions and 86 deletions

View File

@@ -108,8 +108,8 @@ protected:
// dashboard page // dashboard page
auto dashboardPage = (new StaticPage("/dashboard.html", &LittleFS, F("/pages/dashboard.html"), PORTAL_CACHE)) auto dashboardPage = (new StaticPage("/dashboard.html", &LittleFS, F("/pages/dashboard.html"), PORTAL_CACHE))
->setBeforeSendCallback([this]() { ->setBeforeSendCallback([this]() {
if (this->isAuthRequired() && !this->webServer->authenticate(settings.portal.login, settings.portal.password)) { if (this->isAuthRequired() && !this->isValidCredentials()) {
this->webServer->requestAuthentication(DIGEST_AUTH); this->webServer->requestAuthentication(BASIC_AUTH);
return false; return false;
} }
@@ -119,11 +119,9 @@ protected:
// restart // restart
this->webServer->on(F("/restart.html"), HTTP_GET, [this]() { this->webServer->on(F("/restart.html"), HTTP_GET, [this]() {
if (this->isAuthRequired()) { if (this->isAuthRequired() && !this->isValidCredentials()) {
if (!this->webServer->authenticate(settings.portal.login, settings.portal.password)) { this->webServer->requestAuthentication(BASIC_AUTH);
this->webServer->send(401); return;
return;
}
} }
vars.actions.restart = true; vars.actions.restart = true;
@@ -134,8 +132,8 @@ protected:
// network settings page // network settings page
auto networkPage = (new StaticPage("/network.html", &LittleFS, F("/pages/network.html"), PORTAL_CACHE)) auto networkPage = (new StaticPage("/network.html", &LittleFS, F("/pages/network.html"), PORTAL_CACHE))
->setBeforeSendCallback([this]() { ->setBeforeSendCallback([this]() {
if (this->isAuthRequired() && !this->webServer->authenticate(settings.portal.login, settings.portal.password)) { if (this->isAuthRequired() && !this->isValidCredentials()) {
this->webServer->requestAuthentication(DIGEST_AUTH); this->webServer->requestAuthentication(BASIC_AUTH);
return false; return false;
} }
@@ -146,8 +144,8 @@ protected:
// settings page // settings page
auto settingsPage = (new StaticPage("/settings.html", &LittleFS, F("/pages/settings.html"), PORTAL_CACHE)) auto settingsPage = (new StaticPage("/settings.html", &LittleFS, F("/pages/settings.html"), PORTAL_CACHE))
->setBeforeSendCallback([this]() { ->setBeforeSendCallback([this]() {
if (this->isAuthRequired() && !this->webServer->authenticate(settings.portal.login, settings.portal.password)) { if (this->isAuthRequired() && !this->isValidCredentials()) {
this->webServer->requestAuthentication(DIGEST_AUTH); this->webServer->requestAuthentication(BASIC_AUTH);
return false; return false;
} }
@@ -158,8 +156,8 @@ protected:
// sensors page // sensors page
auto sensorsPage = (new StaticPage("/sensors.html", &LittleFS, F("/pages/sensors.html"), PORTAL_CACHE)) auto sensorsPage = (new StaticPage("/sensors.html", &LittleFS, F("/pages/sensors.html"), PORTAL_CACHE))
->setBeforeSendCallback([this]() { ->setBeforeSendCallback([this]() {
if (this->isAuthRequired() && !this->webServer->authenticate(settings.portal.login, settings.portal.password)) { if (this->isAuthRequired() && !this->isValidCredentials()) {
this->webServer->requestAuthentication(DIGEST_AUTH); this->webServer->requestAuthentication(BASIC_AUTH);
return false; return false;
} }
@@ -170,8 +168,8 @@ protected:
// upgrade page // upgrade page
auto upgradePage = (new StaticPage("/upgrade.html", &LittleFS, F("/pages/upgrade.html"), PORTAL_CACHE)) auto upgradePage = (new StaticPage("/upgrade.html", &LittleFS, F("/pages/upgrade.html"), PORTAL_CACHE))
->setBeforeSendCallback([this]() { ->setBeforeSendCallback([this]() {
if (this->isAuthRequired() && !this->webServer->authenticate(settings.portal.login, settings.portal.password)) { if (this->isAuthRequired() && !this->isValidCredentials()) {
this->webServer->requestAuthentication(DIGEST_AUTH); this->webServer->requestAuthentication(BASIC_AUTH);
return false; return false;
} }
@@ -181,7 +179,7 @@ protected:
// OTA // OTA
auto upgradeHandler = (new UpgradeHandler("/api/upgrade"))->setCanUploadCallback([this](const String& uri) { auto upgradeHandler = (new UpgradeHandler("/api/upgrade"))->setCanUploadCallback([this](const String& uri) {
if (this->isAuthRequired() && !this->webServer->authenticate(settings.portal.login, settings.portal.password)) { if (this->isAuthRequired() && !this->isValidCredentials()) {
this->webServer->sendHeader(F("Connection"), F("close")); this->webServer->sendHeader(F("Connection"), F("close"));
this->webServer->send(401); this->webServer->send(401);
return false; return false;
@@ -222,10 +220,8 @@ protected:
// backup // backup
this->webServer->on(F("/api/backup/save"), HTTP_GET, [this]() { this->webServer->on(F("/api/backup/save"), HTTP_GET, [this]() {
if (this->isAuthRequired()) { if (this->isAuthRequired() && !this->isValidCredentials()) {
if (!this->webServer->authenticate(settings.portal.login, settings.portal.password)) { return this->webServer->send(401);
return this->webServer->send(401);
}
} }
JsonDocument doc; JsonDocument doc;
@@ -248,10 +244,8 @@ protected:
}); });
this->webServer->on(F("/api/backup/restore"), HTTP_POST, [this]() { this->webServer->on(F("/api/backup/restore"), HTTP_POST, [this]() {
if (this->isAuthRequired()) { if (this->isAuthRequired() && !this->isValidCredentials()) {
if (!this->webServer->authenticate(settings.portal.login, settings.portal.password)) { return this->webServer->send(401);
return this->webServer->send(401);
}
} }
if (vars.states.restarting) { if (vars.states.restarting) {
@@ -329,10 +323,8 @@ protected:
// network // network
this->webServer->on(F("/api/network/settings"), HTTP_GET, [this]() { this->webServer->on(F("/api/network/settings"), HTTP_GET, [this]() {
if (this->isAuthRequired()) { if (this->isAuthRequired() && !this->isValidCredentials()) {
if (!this->webServer->authenticate(settings.portal.login, settings.portal.password)) { return this->webServer->send(401);
return this->webServer->send(401);
}
} }
JsonDocument doc; JsonDocument doc;
@@ -343,10 +335,8 @@ protected:
}); });
this->webServer->on(F("/api/network/settings"), HTTP_POST, [this]() { this->webServer->on(F("/api/network/settings"), HTTP_POST, [this]() {
if (this->isAuthRequired()) { if (this->isAuthRequired() && !this->isValidCredentials()) {
if (!this->webServer->authenticate(settings.portal.login, settings.portal.password)) { return this->webServer->send(401);
return this->webServer->send(401);
}
} }
if (vars.states.restarting) { if (vars.states.restarting) {
@@ -402,11 +392,8 @@ protected:
}); });
this->webServer->on(F("/api/network/scan"), HTTP_GET, [this]() { this->webServer->on(F("/api/network/scan"), HTTP_GET, [this]() {
if (this->isAuthRequired()) { if (this->isAuthRequired() && !this->isValidCredentials()) {
if (!this->webServer->authenticate(settings.portal.login, settings.portal.password)) { return this->webServer->send(401);
this->webServer->send(401);
return;
}
} }
auto apCount = WiFi.scanComplete(); auto apCount = WiFi.scanComplete();
@@ -448,10 +435,8 @@ protected:
// settings // settings
this->webServer->on(F("/api/settings"), HTTP_GET, [this]() { this->webServer->on(F("/api/settings"), HTTP_GET, [this]() {
if (this->isAuthRequired()) { if (this->isAuthRequired() && !this->isValidCredentials()) {
if (!this->webServer->authenticate(settings.portal.login, settings.portal.password)) { return this->webServer->send(401);
return this->webServer->send(401);
}
} }
JsonDocument doc; JsonDocument doc;
@@ -462,10 +447,8 @@ protected:
}); });
this->webServer->on(F("/api/settings"), HTTP_POST, [this]() { this->webServer->on(F("/api/settings"), HTTP_POST, [this]() {
if (this->isAuthRequired()) { if (this->isAuthRequired() && !this->isValidCredentials()) {
if (!this->webServer->authenticate(settings.portal.login, settings.portal.password)) { return this->webServer->send(401);
return this->webServer->send(401);
}
} }
if (vars.states.restarting) { if (vars.states.restarting) {
@@ -513,10 +496,8 @@ protected:
// sensors list // sensors list
this->webServer->on(F("/api/sensors"), HTTP_GET, [this]() { this->webServer->on(F("/api/sensors"), HTTP_GET, [this]() {
if (this->isAuthRequired()) { if (this->isAuthRequired() && !this->isValidCredentials()) {
if (!this->webServer->authenticate(settings.portal.login, settings.portal.password)) { return this->webServer->send(401);
return this->webServer->send(401);
}
} }
bool detailed = false; bool detailed = false;
@@ -543,10 +524,8 @@ protected:
// sensor settings // sensor settings
this->webServer->on(F("/api/sensor"), HTTP_GET, [this]() { this->webServer->on(F("/api/sensor"), HTTP_GET, [this]() {
if (this->isAuthRequired()) { if (this->isAuthRequired() && !this->isValidCredentials()) {
if (!this->webServer->authenticate(settings.portal.login, settings.portal.password)) { return this->webServer->send(401);
return this->webServer->send(401);
}
} }
if (!this->webServer->hasArg(F("id"))) { if (!this->webServer->hasArg(F("id"))) {
@@ -571,10 +550,8 @@ protected:
}); });
this->webServer->on(F("/api/sensor"), HTTP_POST, [this]() { this->webServer->on(F("/api/sensor"), HTTP_POST, [this]() {
if (this->isAuthRequired()) { if (this->isAuthRequired() && !this->isValidCredentials()) {
if (!this->webServer->authenticate(settings.portal.login, settings.portal.password)) { return this->webServer->send(401);
return this->webServer->send(401);
}
} }
if (vars.states.restarting) { if (vars.states.restarting) {
@@ -654,10 +631,8 @@ protected:
}); });
this->webServer->on(F("/api/vars"), HTTP_POST, [this]() { this->webServer->on(F("/api/vars"), HTTP_POST, [this]() {
if (this->isAuthRequired()) { if (this->isAuthRequired() && !this->isValidCredentials()) {
if (!this->webServer->authenticate(settings.portal.login, settings.portal.password)) { return this->webServer->send(401);
return this->webServer->send(401);
}
} }
const String& plain = this->webServer->arg(0); const String& plain = this->webServer->arg(0);
@@ -956,6 +931,10 @@ protected:
return !network->isApEnabled() && settings.portal.auth && strlen(settings.portal.password); return !network->isApEnabled() && settings.portal.auth && strlen(settings.portal.password);
} }
bool isValidCredentials() {
return this->webServer->authenticate(settings.portal.login, settings.portal.password);
}
void onCaptivePortal() { void onCaptivePortal() {
const String& uri = this->webServer->uri(); const String& uri = this->webServer->uri();

View File

@@ -380,13 +380,18 @@
console.log(newSettings); console.log(newSettings);
} }
let parameters = { cache: 'no-cache' }; let parameters = {
method: "GET",
cache: "no-cache",
credentials: "include"
};
if (modified) { if (modified) {
parameters.method = "POST"; parameters.method = "POST";
parameters.body = JSON.stringify(newSettings); parameters.body = JSON.stringify(newSettings);
} }
const response = await fetch('/api/settings', parameters); const response = await fetch("/api/settings", parameters);
if (!response.ok) { if (!response.ok) {
throw new Error('Response not valid'); throw new Error('Response not valid');
} }
@@ -424,7 +429,11 @@
// vars // vars
try { try {
const response = await fetch('/api/vars', { cache: 'no-cache' }); const response = await fetch("/api/vars", {
cache: "no-cache",
credentials: "include"
});
if (!response.ok) { if (!response.ok) {
throw new Error('Response not valid'); throw new Error('Response not valid');
} }
@@ -540,7 +549,11 @@
// sensors // sensors
try { try {
const response = await fetch("/api/sensors?detailed=1", { cache: "no-cache" }); const response = await fetch("/api/sensors?detailed=1", {
cache: "no-cache",
credentials: "include"
});
if (!response.ok) { if (!response.ok) {
throw new Error("Response not valid"); throw new Error("Response not valid");
} }

View File

@@ -170,7 +170,11 @@
setTimeout(async function onLoadPage() { setTimeout(async function onLoadPage() {
try { try {
const response = await fetch('/api/info', { cache: 'no-cache' }); const response = await fetch("/api/info", {
cache: "no-cache",
credentials: "include"
});
if (!response.ok) { if (!response.ok) {
throw new Error('Response not valid'); throw new Error('Response not valid');
} }

View File

@@ -199,7 +199,11 @@
}; };
try { try {
const response = await fetch('/api/network/settings', { cache: 'no-cache' }); const response = await fetch("/api/network/settings", {
cache: "no-cache",
credentials: "include"
});
if (!response.ok) { if (!response.ok) {
throw new Error('Response not valid'); throw new Error('Response not valid');
} }

View File

@@ -194,7 +194,11 @@
const templateNode = container.querySelector("#template"); const templateNode = container.querySelector("#template");
try { try {
const response = await fetch("/api/sensors", { cache: "no-cache" }); const response = await fetch("/api/sensors", {
cache: "no-cache",
credentials: "include"
});
if (!response.ok) { if (!response.ok) {
throw new Error("Response not valid"); throw new Error("Response not valid");
} }
@@ -287,7 +291,11 @@
} }
try { try {
const response = await fetch(sensorForm.action, { cache: "no-cache" }); const response = await fetch(sensorForm.action, {
cache: "no-cache",
credentials: "include"
});
if (response.status != 200) { if (response.status != 200) {
return; return;
} }

View File

@@ -808,7 +808,11 @@
}; };
try { try {
const response = await fetch('/api/settings', { cache: 'no-cache' }); const response = await fetch("/api/settings", {
cache: "no-cache",
credentials: "include"
});
if (!response.ok) { if (!response.ok) {
throw new Error('Response not valid'); throw new Error('Response not valid');
} }

View File

@@ -32,7 +32,7 @@ class Lang {
} }
if (!this.localeIsSupported(this.defaultLocale)) { if (!this.localeIsSupported(this.defaultLocale)) {
const selected = this.switcher.selectedIndex ?? 0; const selected = this.switcher.selectedIndex ? this.switcher.selectedIndex : 0;
this.defaultLocale = this.switcher.options[selected].value; this.defaultLocale = this.switcher.options[selected].value;
} }

View File

@@ -60,10 +60,11 @@ const setupForm = (formSelector, onResultCallback = null, noCastItems = []) => {
} }
let response = await fetch(url, { let response = await fetch(url, {
method: 'POST', method: "POST",
cache: 'no-cache', cache: "no-cache",
credentials: "include",
headers: { headers: {
'Content-Type': 'application/json' "Content-Type": "application/json"
}, },
body: form2json(fd, noCastItems) body: form2json(fd, noCastItems)
}); });
@@ -218,7 +219,10 @@ const setupNetworkScanForm = (formSelector, tableSelector) => {
attempts--; attempts--;
try { try {
let response = await fetch(url, { cache: 'no-cache' }); let response = await fetch(url, {
cache: "no-cache",
credentials: "include"
});
if (response.status == 200) { if (response.status == 200) {
await onSuccess(response); await onSuccess(response);
@@ -309,10 +313,11 @@ const setupRestoreBackupForm = (formSelector) => {
if (data.settings != undefined) { if (data.settings != undefined) {
let response = await fetch(url, { let response = await fetch(url, {
method: 'POST', method: "POST",
cache: 'no-cache', cache: "no-cache",
credentials: "include",
headers: { headers: {
'Content-Type': 'application/json' "Content-Type": "application/json"
}, },
body: JSON.stringify({"settings": data.settings}) body: JSON.stringify({"settings": data.settings})
}); });
@@ -331,10 +336,11 @@ const setupRestoreBackupForm = (formSelector) => {
payload["sensors"][sensorId] = data.sensors[sensorId]; payload["sensors"][sensorId] = data.sensors[sensorId];
const response = await fetch(url, { const response = await fetch(url, {
method: 'POST', method: "POST",
cache: 'no-cache', cache: "no-cache",
credentials: "include",
headers: { headers: {
'Content-Type': 'application/json' "Content-Type": "application/json"
}, },
body: JSON.stringify(payload) body: JSON.stringify(payload)
}); });
@@ -348,10 +354,11 @@ const setupRestoreBackupForm = (formSelector) => {
if (data.network != undefined) { if (data.network != undefined) {
let response = await fetch(url, { let response = await fetch(url, {
method: 'POST', method: "POST",
cache: 'no-cache', cache: "no-cache",
credentials: "include",
headers: { headers: {
'Content-Type': 'application/json' "Content-Type": "application/json"
}, },
body: JSON.stringify({"network": data.network}) body: JSON.stringify({"network": data.network})
}); });
@@ -496,8 +503,9 @@ const setupUpgradeForm = (formSelector) => {
try { try {
let fd = new FormData(form); let fd = new FormData(form);
let response = await fetch(url, { let response = await fetch(url, {
method: 'POST', method: "POST",
cache: 'no-cache', cache: "no-cache",
credentials: "include",
body: fd body: fd
}); });