From a21706f3281f560a9c52e7d41cafda2f12acf2ff Mon Sep 17 00:00:00 2001 From: Jean Jacques Avril Date: Sun, 20 Mar 2022 15:44:49 +0100 Subject: [PATCH] bugfixing --- Notes.md | 7 ++- data/settings | Bin 77 -> 79 bytes data/settings.bak | Bin 0 -> 79 bytes src/Config.cpp | 86 ++++++++++++++-------------- src/Config.h | 29 +++++++--- src/WebConsole.cpp | 137 +++++++++++++++++++++++++++++++++++++++++++-- src/WebConsole.h | 8 ++- src/main.cpp | 33 +++++------ 8 files changed, 223 insertions(+), 77 deletions(-) create mode 100644 data/settings.bak diff --git a/Notes.md b/Notes.md index d902548..a2e11e9 100644 --- a/Notes.md +++ b/Notes.md @@ -30,8 +30,9 @@ + Settings pos + WifiSSID - terminator 0x00 - Pos.: 0-31 (00 - 1F) + WifiPassword - terminator 0x00 - Pos.: 32-63 (20 - 3F) - + Device IP - 40-43 + + Device IP - 40-43 uint32 + Subnet 44 - 47 + Gateway 48 - 4B -+ Flags: - + Mode 0 - station; 1 - client 4C \ No newline at end of file + + Mode 0 - station; 1 - client 4C uint8 + + AuthError Timeout (secs) 4D + + OpenLock hold (secs) 4E diff --git a/data/settings b/data/settings index deafdd0669a9b2d2e32b34ed5951193f189f07a9..5a79756696b601f967dbef6cfdd74b6f43f5ee95 100644 GIT binary patch delta 20 XcmebEpWwiMV1)=H5dR0!3|y=LQSt`> delta 18 VcmebGo#4RB#TdW{#Q#Aw0{|uO1B?Iw diff --git a/data/settings.bak b/data/settings.bak new file mode 100644 index 0000000000000000000000000000000000000000..a64427be648d55c7c9864769938d8e0074c9028b GIT binary patch literal 79 ocmZ?C&oA=HPtIn*0n$@5QZsW6jf`=~A6OB<2*m$EGy@ka0IRzUTL1t6 literal 0 HcmV?d00001 diff --git a/src/Config.cpp b/src/Config.cpp index 9deae1a..e8655d5 100644 --- a/src/Config.cpp +++ b/src/Config.cpp @@ -1,5 +1,5 @@ #include "Config.h" -#define CONFIG_SIZE 0x4C + Config::Config() { if (!LittleFS.begin()) @@ -16,19 +16,14 @@ Config::~Config() bool Config::loadBin() { File config_file = LittleFS.open("/settings", "r"); - if(buffer==nullptr) - buffer = (uint8_t*) malloc(CONFIG_SIZE); + //if (buffer == nullptr) // Allocate only once + // buffer = (uint8_t *)malloc(CONFIG_SIZE); if (config_file.available()) { config_file.read(buffer, CONFIG_SIZE); - SSID = (char*) buffer; - buffer[0x1F] = 0x00; - buffer[0x3F] = 0x00; - PASS = (char*)(buffer + 0x20); - ip = (uint32_t *)(buffer + 0x40); - subnet = (uint32_t *)(buffer + 0x44); - gw = (uint32_t *)(buffer + 0x48); - mode = (uint8_t *)(buffer + 0x4C); + buffer[OFFSET_SSID + 0x1F] = 0x00; // ensure ssid and password are terminated with a null character + buffer[OFFSET_PASS + 0x1F] = 0x00; + } config_file.close(); return true; @@ -37,70 +32,73 @@ bool Config::loadBin() bool Config::saveBin() { File config_file = LittleFS.open("/settings", "w"); - config_file.write(buffer,CONFIG_SIZE); + config_file.write(buffer, CONFIG_SIZE); delay(100); config_file.close(); return true; } -bool Config::setSSID(const char *ssid){ +bool Config::setSSID(const char *ssid) +{ size_t offset = 0; bool copy = true; - for(int i=0; i<31;i++){ - if(ssid[i]==0x00) + for (int i = 0; i < 31; i++) + { + if (ssid[i] == 0x00) copy = false; - buffer[offset+i] = copy?ssid[i]:0x00; + buffer[offset + i] = copy ? ssid[i] : 0x00; } - buffer[offset+31] = '\n'; + buffer[offset + 31] = '\n'; return true; } -bool Config::setPASS(const char *pass){ +bool Config::setPASS(const char *pass) +{ size_t offset = 0x20; bool copy = true; - for(int i=0; i<31;i++){ - if(pass[i]==0x00) + for (int i = 0; i < 31; i++) + { + if (pass[i] == 0x00) copy = false; - buffer[offset+i] = copy?pass[i]:0x00; + buffer[offset + i] = copy ? pass[i] : 0x00; } - buffer[offset+31] = '\n'; + buffer[offset + 31] = '\n'; return true; } -void Config::print(){ +void Config::print() +{ Serial.print("BufferHEX "); - for(int i=0; i"); - Serial.print(buffer[i],HEX); - Serial.print("|"); + for (int i = 0; i < CONFIG_SIZE; i++) + { + Serial.print(i, HEX); + Serial.print(">"); + Serial.print(buffer[i], HEX); + Serial.print("|"); } Serial.print("SSID: "); Serial.println(SSID); Serial.print("PASS: "); - Serial.println(PASS); + Serial.println(PASS); Serial.print("IP"); - Serial.print((uint8_t) *ip, DEC); + Serial.print(*((uint8_t *)&ip), DEC); Serial.print("."); - Serial.print((uint8_t)*((uint8_t*)ip+1), DEC); + Serial.print(* (((uint8_t *)&ip + 1)), DEC); Serial.print("."); - Serial.print((uint8_t) *((uint8_t*)ip+2), DEC); + Serial.print(* ((uint8_t *)&ip + 2), DEC); Serial.print("."); - Serial.println((uint8_t) *((uint8_t*)ip+3), DEC); + Serial.println( * ((uint8_t *)&ip + 3), DEC); Serial.print("GW"); - Serial.print((uint8_t) *((uint8_t*)gw), DEC); + Serial.print( * ((uint8_t *)&gw), DEC); Serial.print("."); - Serial.print((uint8_t) *((uint8_t*)gw+1), DEC); + Serial.print( * ((uint8_t *)&gw + 1), DEC); Serial.print("."); - Serial.print((uint8_t) *((uint8_t*)gw+2), DEC); + Serial.print( * ((uint8_t *)&gw + 2), DEC); Serial.print("."); - Serial.println((uint8_t) *((uint8_t*)gw+3), DEC); + Serial.println( * ((uint8_t *)&gw + 3), DEC); Serial.print("SUBNET"); - Serial.print((uint8_t)*((uint8_t*)subnet), DEC); + Serial.print( * ((uint8_t *)&subnet), DEC); Serial.print("."); - Serial.print((uint8_t)*((uint8_t*)subnet+1), DEC); + Serial.print( * ((uint8_t *)&subnet + 1), DEC); Serial.print("."); - Serial.print((uint8_t)*((uint8_t*)subnet+2), DEC); + Serial.print( * ((uint8_t *)&subnet + 2), DEC); Serial.print("."); - Serial.println((uint8_t)*((uint8_t*)subnet+3), DEC); - - - + Serial.println( * ((uint8_t *)&subnet + 3), DEC); } \ No newline at end of file diff --git a/src/Config.h b/src/Config.h index 073f44c..f93a3da 100644 --- a/src/Config.h +++ b/src/Config.h @@ -1,20 +1,35 @@ #pragma once #include "LittleFS.h" #include "ArduinoJson.h" +#define CONFIG_SIZE 0x4E +#define OFFSET_SSID 0x00 +#define OFFSET_PASS 0x20 +#define OFFSET_IP 0x40 +#define OFFSET_SUBNET 0x44 +#define OFFSET_GW 0x48 +#define OFFSET_MODE 0x4C +#define OFFSET_FAIL_TIMEOUT 0x4D +#define OFFSET_HOLD_TIME 0x4E class Config { private: - uint8_t *buffer = nullptr; + uint8_t *buffer = (uint8_t *)malloc(CONFIG_SIZE); public: Config(); ~Config(); - const char *SSID; - const char *PASS; - uint8_t *mode; - uint32_t *ip; - uint32_t *subnet; - uint32_t *gw; + const char *SSID = (char *)(buffer + OFFSET_SSID); + const char *PASS = (char *)(buffer + OFFSET_PASS); + uint32_t *ip_ptr = (uint32_t*)(buffer+OFFSET_IP); + uint32_t &ip = *ip_ptr; + uint32_t *subnet_ptr = (uint32_t*)(buffer+OFFSET_SUBNET); + uint32_t &subnet = *subnet_ptr; + uint32_t *gw_ptr = (uint32_t*)(buffer+OFFSET_GW); + uint32_t &gw = *gw_ptr; + uint8_t &mode = *(buffer + OFFSET_MODE); + uint8_t &fail_timeout = *(buffer+OFFSET_FAIL_TIMEOUT); + uint8_t &hold_time = *(buffer+OFFSET_HOLD_TIME); + bool loadConfig(); bool loadBin(); bool saveBin(); diff --git a/src/WebConsole.cpp b/src/WebConsole.cpp index 0fd7e2e..0fd0998 100644 --- a/src/WebConsole.cpp +++ b/src/WebConsole.cpp @@ -10,10 +10,36 @@ WebConsole::~WebConsole() _server->close(); delete (_server); } -bool WebConsole::init(userdb::UserDb *userdb) +bool WebConsole::init(Config *config, userdb::UserDb *userdb) { - _server = new ESP8266WebServer(80); this->userdb = userdb; + this->_config = config; + this->userdb = userdb; + + // this->_dnsServer = new DNSServer; + // WiFi.mode(WIFI_AP); + // + // uint8_t *ipp = (uint8_t *)_config->ip_ptr; + // uint8_t *gwp = (uint8_t *)_config->gw_ptr; + // uint8_t *snp = (uint8_t *)_config->subnet_ptr; + //// IPAddress ip(*(ipp), *(ipp + 1), *(ipp + 2), *(ipp + 3)); + //// IPAddress gw(*(gwp), *(gwp + 1), *(gwp + 2), *(gwp + 3)); + //// IPAddress subnet(*(snp), *(snp + 1), *(snp + 2), *(snp + 3)); + // + // Serial.print("\t1. Network config ->"); + // Serial.println(WiFi.softAPConfig(ipp, gwp, snp) ? "Ready" : "Failed!"); + // Serial.print("\t2. DNS config ->"); + // //Serial.println(_dnsServer->start(53, "*", ip) ? "Ready" : "Failed!"); + // + // Serial.print("\t3 AP setup " + String(_config->SSID) + " -> "); + // if (strlen(_config->PASS) > 0) + // Serial.println(WiFi.softAP(_config->SSID, _config->PASS) ? "Ready" : "Failed!"); + // else + // Serial.println(WiFi.softAP(_config->SSID) ? "Ready" : "Failed!"); + // WiFi.hostname("Doorlock"); + // Serial.println(WiFi.softAPIP()); + // + this->_server = new ESP8266WebServer(80); const char *headerkeys[] = {"Authentification"}; size_t headerkeyssize = sizeof(headerkeys) / sizeof(char *); _server->collectHeaders(headerkeys, headerkeyssize); @@ -39,9 +65,11 @@ void WebConsole::attachRfid(Rfid *rfid) } void WebConsole::serve() { + //_dnsServer->processNextRequest(); if (catch_rfid) { - if (millis() - catch_rfid_millis > 2000){ + if (millis() - catch_rfid_millis > 2000) + { catch_rfid = 0; } else if (catch_rfid > 1 && rfid != nullptr && rfid->available()) @@ -54,11 +82,12 @@ void WebConsole::serve() } uint8_t WebConsole::isInterceptingRfid() { - if(catch_rfid==3){ - catch_rfid=2; + if (catch_rfid == 3) + { + catch_rfid = 2; return 3; } - + return catch_rfid; } bool WebConsole::_isAuth() @@ -108,6 +137,102 @@ void WebConsole::_auth() else _server->send(404, "text/plain", "unknown action"); } +void WebConsole::_settings() +{ + _sendCORS(); + String action = _server->arg("action"); + if (action.equals("update")) + { + uint8_t error = 0b00000000; + uint8_t sucess = 0b00000000; + if (_server->hasArg("SSID")) + { + _config->setSSID(_server->arg("SSID").c_str()); + int length = strlen(_config->SSID); + if (length == 0 || length > 31) + error |= 0b00000001; + else + sucess |= 0b00000001; + } + if (_server->hasArg("PASS")) + { + _config->setSSID(_server->arg("PASS").c_str()); + int length = strlen(_config->SSID); + if (length == 0 || length > 31) + error |= 0b00000010; + else + sucess |= 0b00000010; + } + + if (_server->hasArg("IP")) + { + IPAddress temp; + if (temp.fromString(_server->arg("IP"))) + { + _config->ip = temp.v4(); + sucess |= 0b00000100; + } + else + error |= 0b00000100; + } + if (_server->hasArg("SUBNET")) + { + IPAddress temp; + if (temp.fromString(_server->arg("SUBNET"))) + { + _config->subnet = temp.v4(); + sucess |= 0b00001000; + } + else + error |= 0b00001000; + } + if (_server->hasArg("GW")) + { + IPAddress temp; + if (temp.fromString(_server->arg("GW"))) + { + _config->gw = temp.v4(); + sucess |= 0b00010000; + } + else + error |= 0b00010000; + } + if (_server->hasArg("MODE")) + { + _config->mode = _server->arg("MODE").toInt(); + if (_config->mode >= 0 && _config->mode <= 1) + sucess |= 0b00100000; + else + error |= 0b00100000; + } + if (_server->hasArg("FAIL_TIMEOUT")) + { + _config->fail_timeout = _server->arg("FAIL_TIMEOUT").toInt(); + if (_config->fail_timeout >= 0 && _config->fail_timeout <= 250) + sucess |= 0b01000000; + else + error |= 0b01000000; + } + if (_server->hasArg("HOLD_TIME")) + { + _config->hold_time = _server->arg("HOLD_TIME").toInt(); + if (_config->hold_time > 0 && _config->hold_time <= 250) + sucess |= 0b10000000; + else + error |= 0b10000000; + } + if (error == 0 && sucess > 0) + { // Save + _config->saveBin(); + _server->send(200, "text/json", "{\"status\":\"ok\", \"sucess\":\"" + String(sucess) + "\"}"); + } + else if (error > 0) + { // Rollback + _config->loadBin(); + _server->send(200, "text/json", "{\"status\":\"failed\", \"sucess\":\"" + String(sucess) + "\", \"error\":\"" + String(error) + "\"}"); + } + } +} void WebConsole::_sendCORS() { _server->sendHeader("Access-Control-Allow-Origin", "*"); diff --git a/src/WebConsole.h b/src/WebConsole.h index 89f5ab1..7b3039b 100644 --- a/src/WebConsole.h +++ b/src/WebConsole.h @@ -1,4 +1,6 @@ #pragma once +#include +#include #include #include #include @@ -7,6 +9,7 @@ #include "ArduinoJson.h" #include "UserDb.h" #include "Rfid.h" +#include "Config.h" #include "AdminAuth.h" #include "Interface.h" namespace webconsole @@ -19,13 +22,14 @@ namespace webconsole WebConsole(); ~WebConsole(); - bool init(userdb::UserDb *userdb); + bool init(Config *config, userdb::UserDb *userdb); void attachRfid(Rfid *rfid); void serve(); uint8_t isInterceptingRfid(); private: void _sendCORS(); + void _settings(); void _auth(); bool _isAuth(); void _handleUnknown(); @@ -47,6 +51,8 @@ namespace webconsole _server->send(200, "text/plain", "printed to serial"); f.close(); } + Config *_config; + DNSServer *_dnsServer; ESP8266WebServer *_server; userdb::UserDb *userdb = nullptr; unsigned long catch_rfid_millis = 0; diff --git a/src/main.cpp b/src/main.cpp index 8bdacce..904476a 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -10,6 +10,7 @@ #include "Config.h" #include #include + // File config Config config; userdb::UserDb userdatabase("userdb.csv"); @@ -21,54 +22,54 @@ Rfid rfid; #define PIN_WIRE_SCL D4 Keyboard keyboard(200); - Interface iface; -// Wifi control -IPAddress local_IP(192, 168, 4, 22); -IPAddress gateway(0, 0, 0, 0); -IPAddress subnet(255, 255, 255, 0); -IPAddress dns(192, 168, 178, 1); -DNSServer dnsServer; +//DNSServer dnsServer; void setup() { - //config.loadConfig(); config.loadBin(); Serial.begin(115200); Serial.println("Starting System"); - Serial.print("\t1. Network config ->"); + IPAddress ip(192, 168, 80, 1); + IPAddress gw(192, 168, 80, 1); + IPAddress subnet(192, 168, 80, 255); WiFi.mode(WIFI_AP); - Serial.println(WiFi.softAPConfig(*config.ip, *config.gw, *config.subnet) ? "Ready" : "Failed!"); - Serial.print("\t2 AP setup " + String(config.SSID) + " -> "); + Serial.print("\t1. Network config ->"); + Serial.println(WiFi.softAPConfig(ip, gw, subnet) ? "Ready" : "Failed!"); + Serial.print("\t2. DNS config ->"); + //Serial.println(dnsServer.start(53, "*", ip) ? "Ready" : "Failed!"); + Serial.print("\t3 AP setup " + String(config.SSID) + " -> "); if (strlen(config.PASS) > 0) Serial.println(WiFi.softAP(config.SSID, config.PASS) ? "Ready" : "Failed!"); else Serial.println(WiFi.softAP(config.SSID) ? "Ready" : "Failed!"); WiFi.hostname("Doorlock"); - dnsServer.start(53, "*", local_IP); // DNS spoofing (Only HTTP) - delay(150); + delay(50); + Serial.println(WiFi.softAPIP()); #ifdef DEBUG userdatabase.print_to_serial(); #endif - web.init(&userdatabase); + web.init(&config, &userdatabase); keyboard.begin(&Wire); rfid.begin(); web.attachRfid(&rfid); iface.begin(&keyboard); + config.print(); } void loop() { - dnsServer.processNextRequest(); + //dnsServer.processNextRequest(); rfid.scan(); web.serve(); keyboard.scanAsync(); userdb::User login_user; - if (web.isInterceptingRfid() ==3) + if (web.isInterceptingRfid() == 3) iface.showMessage("WebUI connected", "Awaiting RFID", 2000); else if (web.isInterceptingRfid() == 1) iface.showMessage("WebUI connected", "RFID Found", 1000); else if (iface.pinAvailable() && iface.getState() != Interface::GREET) { + unsigned long delta = millis(); login_user = userdatabase.user_by_pin(iface.getPin()); Serial.println("Query duration: " + String(millis() - delta));