From ab0c2bf7688665878de4bfcff16d6032e1fee5ab Mon Sep 17 00:00:00 2001 From: iranl Date: Sat, 11 May 2024 23:09:38 +0200 Subject: [PATCH 1/2] Enlarge stack and check for valid config on JSON command --- src/NukiOpenerWrapper.cpp | 15 +++++++++++++++ src/NukiWrapper.cpp | 38 ++++++++++++++++++++++++++------------ src/main.cpp | 6 +++--- 3 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/NukiOpenerWrapper.cpp b/src/NukiOpenerWrapper.cpp index 5da1dba..2fdbbf6 100644 --- a/src/NukiOpenerWrapper.cpp +++ b/src/NukiOpenerWrapper.cpp @@ -767,9 +767,18 @@ Nuki::BatteryType NukiOpenerWrapper::batteryTypeToEnum(const char* str) void NukiOpenerWrapper::onConfigUpdateReceived(const char *value) { + JsonDocument jsonResult; char _resbuf[2048]; + if(!_configRead || !_nukiConfigValid) + { + jsonResult["general"] = "configNotReady"; + serializeJson(jsonResult, _resbuf, sizeof(_resbuf)); + _network->publishConfigCommandResult(_resbuf); + return; + } + if(_nukiOpener.getSecurityPincode() == 0) { jsonResult["general"] = "noPinSet"; @@ -1744,6 +1753,12 @@ void NukiOpenerWrapper::onKeypadJsonCommandReceived(const char *value) void NukiOpenerWrapper::onTimeControlCommandReceived(const char *value) { + if(!_configRead || !_nukiConfigValid) + { + _network->publishTimeControlCommandResult("configNotReady"); + return; + } + if(_nukiOpener.getSecurityPincode() == 0) { _network->publishTimeControlCommandResult("noPinSet"); diff --git a/src/NukiWrapper.cpp b/src/NukiWrapper.cpp index 8f1a383..bf126ca 100644 --- a/src/NukiWrapper.cpp +++ b/src/NukiWrapper.cpp @@ -489,7 +489,7 @@ void NukiWrapper::updateKeypad() { std::list entries; _nukiLock.getKeypadEntries(&entries); - + Log->print(F("Lock keypad codes: ")); Log->println(entries.size()); @@ -533,7 +533,7 @@ void NukiWrapper::updateTimeControl(bool retrieved) { std::list timeControlEntries; _nukiLock.getTimeControlEntries(&timeControlEntries); - + Log->print(F("Lock time control entries: ")); Log->println(timeControlEntries.size()); @@ -548,7 +548,7 @@ void NukiWrapper::updateTimeControl(bool retrieved) _timeControlIds.push_back(entry.entryId); } } - + postponeBleWatchdog(); } @@ -574,13 +574,13 @@ NukiLock::LockAction NukiWrapper::lockActionToEnum(const char *str) LockActionResult NukiWrapper::onLockActionReceivedCallback(const char *value) { NukiLock::LockAction action; - + if(value) { if(strlen(value) > 0) { action = nukiInst->lockActionToEnum(value); - + if((int)action == 0xff) { return LockActionResult::UnknownAction; @@ -589,7 +589,7 @@ LockActionResult NukiWrapper::onLockActionReceivedCallback(const char *value) else return LockActionResult::UnknownAction; } else return LockActionResult::UnknownAction; - + nukiLockPreferences = new Preferences(); nukiLockPreferences->begin("nukihub", true); uint32_t aclPrefs[17]; @@ -707,6 +707,14 @@ void NukiWrapper::onConfigUpdateReceived(const char *value) JsonDocument jsonResult; char _resbuf[2048]; + if(!_configRead || !_nukiConfigValid) + { + jsonResult["general"] = "configNotReady"; + serializeJson(jsonResult, _resbuf, sizeof(_resbuf)); + _network->publishConfigCommandResult(_resbuf); + return; + } + if(_nukiLock.getSecurityPincode() == 0) { jsonResult["general"] = "noPinSet"; @@ -744,7 +752,7 @@ void NukiWrapper::onConfigUpdateReceived(const char *value) if(json[basicKeys[i]]) { const char *jsonchar = json[basicKeys[i]].as(); - + if(strlen(jsonchar) == 0) { jsonResult[basicKeys[i]] = "noValueSet"; @@ -947,7 +955,7 @@ void NukiWrapper::onConfigUpdateReceived(const char *value) if(json[advancedKeys[i]]) { const char *jsonchar = json[advancedKeys[i]].as(); - + if(strlen(jsonchar) == 0) { jsonResult[advancedKeys[i]] = "noValueSet"; @@ -1651,13 +1659,13 @@ void NukiWrapper::onKeypadJsonCommandReceived(const char *value) _network->publishKeypadJsonCommandResult("noCodeIdSet"); return; } - + if(!idExists) { _network->publishKeypadJsonCommandResult("noExistingCodeIdSet"); return; } - + NukiLock::UpdatedKeypadEntry entry; memset(&entry, 0, sizeof(entry)); entry.codeId = codeId; @@ -1731,6 +1739,12 @@ void NukiWrapper::onKeypadJsonCommandReceived(const char *value) void NukiWrapper::onTimeControlCommandReceived(const char *value) { + if(!_configRead || !_nukiConfigValid) + { + _network->publishTimeControlCommandResult("configNotReady"); + return; + } + if(_nukiLock.getSecurityPincode() == 0) { _network->publishTimeControlCommandResult("noPinSet"); @@ -1772,7 +1786,7 @@ void NukiWrapper::onTimeControlCommandReceived(const char *value) return; } } - + if(action) { bool idExists = false; @@ -1861,7 +1875,7 @@ void NukiWrapper::onTimeControlCommandReceived(const char *value) _network->publishTimeControlCommandResult("noExistingEntryIdSet"); return; } - + NukiLock::TimeControlEntry entry; memset(&entry, 0, sizeof(entry)); entry.entryId = entryId; diff --git a/src/main.cpp b/src/main.cpp index 05329b4..e3f158f 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -112,9 +112,9 @@ void setupTasks() { // configMAX_PRIORITIES is 25 - xTaskCreatePinnedToCore(networkTask, "ntw", 10240, NULL, 3, &networkTaskHandle, 1); - xTaskCreatePinnedToCore(nukiTask, "nuki", 5120, NULL, 2, &nukiTaskHandle, 1); - xTaskCreatePinnedToCore(presenceDetectionTask, "prdet", 896, NULL, 5, &presenceDetectionTaskHandle, 1); + xTaskCreatePinnedToCore(networkTask, "ntw", 12288, NULL, 3, &networkTaskHandle, 1); + xTaskCreatePinnedToCore(nukiTask, "nuki", 8192, NULL, 2, &nukiTaskHandle, 1); + xTaskCreatePinnedToCore(presenceDetectionTask, "prdet", 1024, NULL, 5, &presenceDetectionTaskHandle, 1); } void initEthServer(const NetworkDeviceType device) From c3024c188d157570ca92f88d3fc1b876187593c4 Mon Sep 17 00:00:00 2001 From: iranl Date: Tue, 14 May 2024 21:26:13 +0200 Subject: [PATCH 2/2] isPinSet --- src/NukiOpenerWrapper.cpp | 8 ++++---- src/NukiWrapper.cpp | 8 ++++---- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/src/NukiOpenerWrapper.cpp b/src/NukiOpenerWrapper.cpp index 2fdbbf6..daee4b4 100644 --- a/src/NukiOpenerWrapper.cpp +++ b/src/NukiOpenerWrapper.cpp @@ -469,7 +469,7 @@ void NukiOpenerWrapper::updateConfig() void NukiOpenerWrapper::updateAuthData() { - if(_nukiOpener.getSecurityPincode() == 0) return; + if(!isPinSet()) return; Nuki::CmdResult result = _nukiOpener.retrieveLogEntries(0, 0, 0, true); if(result != Nuki::CmdResult::Success) @@ -779,7 +779,7 @@ void NukiOpenerWrapper::onConfigUpdateReceived(const char *value) return; } - if(_nukiOpener.getSecurityPincode() == 0) + if(!isPinSet()) { jsonResult["general"] = "noPinSet"; serializeJson(jsonResult, _resbuf, sizeof(_resbuf)); @@ -1411,7 +1411,7 @@ void NukiOpenerWrapper::onKeypadCommandReceived(const char *command, const uint void NukiOpenerWrapper::onKeypadJsonCommandReceived(const char *value) { - if(_nukiOpener.getSecurityPincode() == 0) + if(!isPinSet()) { _network->publishKeypadJsonCommandResult("noPinSet"); return; @@ -1759,7 +1759,7 @@ void NukiOpenerWrapper::onTimeControlCommandReceived(const char *value) return; } - if(_nukiOpener.getSecurityPincode() == 0) + if(!isPinSet()) { _network->publishTimeControlCommandResult("noPinSet"); return; diff --git a/src/NukiWrapper.cpp b/src/NukiWrapper.cpp index bf126ca..1b28b3e 100644 --- a/src/NukiWrapper.cpp +++ b/src/NukiWrapper.cpp @@ -450,7 +450,7 @@ void NukiWrapper::updateConfig() void NukiWrapper::updateAuthData() { - if(_nukiLock.getSecurityPincode() == 0) return; + if(!isPinSet()) return; Nuki::CmdResult result = _nukiLock.retrieveLogEntries(0, 0, 0, true); if(result != Nuki::CmdResult::Success) @@ -715,7 +715,7 @@ void NukiWrapper::onConfigUpdateReceived(const char *value) return; } - if(_nukiLock.getSecurityPincode() == 0) + if(!isPinSet()) { jsonResult["general"] = "noPinSet"; serializeJson(jsonResult, _resbuf, sizeof(_resbuf)); @@ -1397,7 +1397,7 @@ void NukiWrapper::onKeypadCommandReceived(const char *command, const uint &id, c void NukiWrapper::onKeypadJsonCommandReceived(const char *value) { - if(_nukiLock.getSecurityPincode() == 0) + if(!isPinSet()) { _network->publishKeypadJsonCommandResult("noPinSet"); return; @@ -1745,7 +1745,7 @@ void NukiWrapper::onTimeControlCommandReceived(const char *value) return; } - if(_nukiLock.getSecurityPincode() == 0) + if(!isPinSet()) { _network->publishTimeControlCommandResult("noPinSet"); return;