From bcd2a4618dee1cc5273aef34087ea771e8a18982 Mon Sep 17 00:00:00 2001 From: Nic Limper Date: Fri, 29 Dec 2023 23:19:16 +0100 Subject: [PATCH] bugfix deleting unknown tag / WIP locking - bugfix: unable to delete unknown tag by right clicking - work in progress: lock tag inventory, by rejecting new tags --- ESP32_AP-Flasher/data/www/index.html.gz | Bin 4843 -> 4995 bytes ESP32_AP-Flasher/data/www/main.js.gz | Bin 11260 -> 11294 bytes ESP32_AP-Flasher/include/tag_db.h | 1 + ESP32_AP-Flasher/src/newproto.cpp | 6 ++++ ESP32_AP-Flasher/src/tag_db.cpp | 12 +++++++- ESP32_AP-Flasher/src/web.cpp | 3 ++ ESP32_AP-Flasher/wwwroot/index.html | 8 +++++ ESP32_AP-Flasher/wwwroot/main.js | 37 ++++++++++++++---------- 8 files changed, 50 insertions(+), 17 deletions(-) diff --git a/ESP32_AP-Flasher/data/www/index.html.gz b/ESP32_AP-Flasher/data/www/index.html.gz index e76fb1fa7efc1019ebbffe0249630388b1f02f26..b825a477e60dbaf04e465b6c6e14dda22f7c57d5 100644 GIT binary patch literal 4995 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 Ne*q4OZ;Y5q004lTj0pe$ literal 4843 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 if (taginfo == nullptr) { + if (config.lock) return; prepareCancelPending(br->src); Serial.printf("blockrequest: couldn't find taginfo %02X%02X%02X%02X%02X%02X%02X%02X\n", br->src[7], br->src[6], br->src[5], br->src[4], br->src[3], br->src[2], br->src[1], br->src[0]); return; @@ -458,6 +462,7 @@ void processDataReq(struct espAvailDataReq* eadr, bool local, IPAddress remoteIP tagRecord* taginfo = tagRecord::findByMAC(eadr->src); if (taginfo == nullptr) { + if (config.lock) return; taginfo = new tagRecord; memcpy(taginfo->mac, eadr->src, sizeof(taginfo->mac)); taginfo->pending = false; @@ -657,6 +662,7 @@ void updateTaginfoitem(struct TagInfo* taginfoitem, IPAddress remoteIP) { tagRecord* taginfo = tagRecord::findByMAC(taginfoitem->mac); if (taginfo == nullptr) { + if (config.lock) return; taginfo = new tagRecord; memcpy(taginfo->mac, taginfoitem->mac, sizeof(taginfo->mac)); taginfo->pending = false; diff --git a/ESP32_AP-Flasher/src/tag_db.cpp b/ESP32_AP-Flasher/src/tag_db.cpp index 553c2b47..b9ed81bb 100644 --- a/ESP32_AP-Flasher/src/tag_db.cpp +++ b/ESP32_AP-Flasher/src/tag_db.cpp @@ -130,9 +130,17 @@ void saveDB(const String& filename) { Storage.begin(); xSemaphoreTake(fsMutex, portMAX_DELAY); + + fs::File existingFile = contentFS->open(filename, "r"); + if (existingFile) { + existingFile.close(); + String backupFilename = filename + ".bak"; + contentFS->rename(filename.c_str(), backupFilename.c_str()); + } + fs::File file = contentFS->open(filename, "w"); if (!file) { - Serial.println("saveDB: Failed to open file"); + Serial.println("saveDB: Failed to open file for writing"); xSemaphoreGive(fsMutex); return; } @@ -307,6 +315,7 @@ void initAPconfig() { config.maxsleep = APconfig["maxsleep"] | 10; config.stopsleep = APconfig["stopsleep"] | 1; config.preview = APconfig["preview"] | 1; + config.lock = APconfig["lock"] | 0; config.sleepTime1 = APconfig["sleeptime1"] | 0; config.sleepTime2 = APconfig["sleeptime2"] | 0; // default wifi power 8.5 dbM @@ -333,6 +342,7 @@ void saveAPconfig() { APconfig["maxsleep"] = config.maxsleep; APconfig["stopsleep"] = config.stopsleep; APconfig["preview"] = config.preview; + APconfig["lock"] = config.lock; APconfig["wifipower"] = config.wifiPower; APconfig["timezone"] = config.timeZone; APconfig["sleeptime1"] = config.sleepTime1; diff --git a/ESP32_AP-Flasher/src/web.cpp b/ESP32_AP-Flasher/src/web.cpp index cf0d3d2b..fd0fef67 100644 --- a/ESP32_AP-Flasher/src/web.cpp +++ b/ESP32_AP-Flasher/src/web.cpp @@ -471,6 +471,9 @@ void init_web() { if (request->hasParam("preview", true)) { config.preview = static_cast(request->getParam("preview", true)->value().toInt()); } + if (request->hasParam("lock", true)) { + config.lock = static_cast(request->getParam("lock", true)->value().toInt()); + } if (request->hasParam("sleeptime1", true)) { config.sleepTime1 = static_cast(request->getParam("sleeptime1", true)->value().toInt()); config.sleepTime2 = static_cast(request->getParam("sleeptime2", true)->value().toInt()); diff --git a/ESP32_AP-Flasher/wwwroot/index.html b/ESP32_AP-Flasher/wwwroot/index.html index 88ea06d1..e06ff694 100644 --- a/ESP32_AP-Flasher/wwwroot/index.html +++ b/ESP32_AP-Flasher/wwwroot/index.html @@ -327,6 +327,14 @@

+

+ + +