From 7a5f85f82d8e2a6a29892599b937bee1c4714ff2 Mon Sep 17 00:00:00 2001 From: iranl Date: Mon, 18 Nov 2024 23:13:14 +0100 Subject: [PATCH] Fix crash on valid JSON --- src/Config.h | 2 +- src/NukiOpenerWrapper.cpp | 50 +++++++++++++++++++++++++++++--- src/NukiWrapper.cpp | 60 ++++++++++++++++++++++++++++++++++----- 3 files changed, 100 insertions(+), 12 deletions(-) diff --git a/src/Config.h b/src/Config.h index 7beec7d..2f066f1 100644 --- a/src/Config.h +++ b/src/Config.h @@ -4,7 +4,7 @@ #define NUKI_HUB_VERSION "9.02" #define NUKI_HUB_BUILD "unknownbuildnr" -#define NUKI_HUB_DATE "2024-11-15" +#define NUKI_HUB_DATE "2024-11-18" #define GITHUB_LATEST_RELEASE_URL (char*)"https://github.com/technyon/nuki_hub/releases/latest" #define GITHUB_OTA_MANIFEST_URL (char*)"https://raw.githubusercontent.com/technyon/nuki_hub/binary/ota/manifest.json" diff --git a/src/NukiOpenerWrapper.cpp b/src/NukiOpenerWrapper.cpp index 1275e4f..022d7ed 100644 --- a/src/NukiOpenerWrapper.cpp +++ b/src/NukiOpenerWrapper.cpp @@ -1521,9 +1521,30 @@ void NukiOpenerWrapper::onConfigUpdateReceived(const char *value) for(int i=0; i < 14; i++) { - if(json[basicKeys[i]]) + if(json[basicKeys[i]].is()) { - const char *jsonchar = json[basicKeys[i]].as(); + JsonVariantConst jsonKey = json[basicKeys[i]]; + char *jsonchar; + + if (jsonKey.is()) + { + itoa(jsonKey, jsonchar, 10); + } + else if (jsonKey.is()) + { + if (jsonKey) + { + itoa(1, jsonchar, 10); + } + else + { + itoa(0, jsonchar, 10); + } + } + else if (jsonKey.is()) + { + jsonchar = (char*)jsonKey.as(); + } if(strlen(jsonchar) == 0) { @@ -1848,9 +1869,30 @@ void NukiOpenerWrapper::onConfigUpdateReceived(const char *value) for(int j=0; j < 21; j++) { - if(json[advancedKeys[j]]) + if(json[advancedKeys[j]].is()) { - const char *jsonchar = json[advancedKeys[j]].as(); + JsonVariantConst jsonKey = json[advancedKeys[i]]; + char *jsonchar; + + if (jsonKey.is()) + { + itoa(jsonKey, jsonchar, 10); + } + else if (jsonKey.is()) + { + if (jsonKey) + { + itoa(1, jsonchar, 10); + } + else + { + itoa(0, jsonchar, 10); + } + } + else if (jsonKey.is()) + { + jsonchar = (char*)jsonKey.as(); + } if(strlen(jsonchar) == 0) { diff --git a/src/NukiWrapper.cpp b/src/NukiWrapper.cpp index ef16a6f..fd13ab6 100644 --- a/src/NukiWrapper.cpp +++ b/src/NukiWrapper.cpp @@ -116,7 +116,7 @@ void NukiWrapper::readSettings() _disableNonJSON = _preferences->getBool(preference_disable_non_json, false); _checkKeypadCodes = _preferences->getBool(preference_keypad_check_code_enabled, false); _pairedAsApp = _preferences->getBool(preference_register_as_app, false); - + _preferences->getBytes(preference_conf_lock_basic_acl, &_basicLockConfigaclPrefs, sizeof(_basicLockConfigaclPrefs)); _preferences->getBytes(preference_conf_lock_advanced_acl, &_advancedLockConfigaclPrefs, sizeof(_advancedLockConfigaclPrefs)); @@ -907,7 +907,7 @@ void NukiWrapper::updateAuth(bool retrieved) Log->println(F("No valid Nuki Lock PIN set")); return; } - + if(!_preferences->getBool(preference_auth_info_enabled)) { return; @@ -1421,6 +1421,10 @@ void NukiWrapper::onConfigUpdateReceived(const char *value) return; } + Log->println(value); + serializeJson(json, _resbuf, sizeof(_resbuf)); + Log->println(_resbuf); + Nuki::CmdResult cmdResult; const char *basicKeys[16] = {"name", "latitude", "longitude", "autoUnlatch", "pairingEnabled", "buttonEnabled", "ledEnabled", "ledBrightness", "timeZoneOffset", "dstMode", "fobAction1", "fobAction2", "fobAction3", "singleLock", "advertisingMode", "timeZone"}; const char *advancedKeys[23] = {"unlockedPositionOffsetDegrees", "lockedPositionOffsetDegrees", "singleLockedPositionOffsetDegrees", "unlockedToLockedTransitionOffsetDegrees", "lockNgoTimeout", "singleButtonPressAction", "doubleButtonPressAction", "detachedCylinder", "batteryType", "automaticBatteryTypeDetection", "unlatchDuration", "autoLockTimeOut", "autoUnLockDisabled", "nightModeEnabled", "nightModeStartTime", "nightModeEndTime", "nightModeAutoLockEnabled", "nightModeAutoUnlockDisabled", "nightModeImmediateLockOnStart", "autoLockEnabled", "immediateAutoLockEnabled", "autoUpdateEnabled", "rebootNuki"}; @@ -1429,9 +1433,30 @@ void NukiWrapper::onConfigUpdateReceived(const char *value) for(int i=0; i < 16; i++) { - if(json[basicKeys[i]]) + if(json[basicKeys[i]].is()) { - const char *jsonchar = json[basicKeys[i]].as(); + JsonVariantConst jsonKey = json[basicKeys[i]]; + char *jsonchar; + + if (jsonKey.is()) + { + itoa(jsonKey, jsonchar, 10); + } + else if (jsonKey.is()) + { + if (jsonKey) + { + itoa(1, jsonchar, 10); + } + else + { + itoa(0, jsonchar, 10); + } + } + else if (jsonKey.is()) + { + jsonchar = (char*)jsonKey.as(); + } if(strlen(jsonchar) == 0) { @@ -1796,9 +1821,30 @@ void NukiWrapper::onConfigUpdateReceived(const char *value) for(int j=0; j < 23; j++) { - if(json[advancedKeys[j]]) + if(json[advancedKeys[j]].is()) { - const char *jsonchar = json[advancedKeys[j]].as(); + JsonVariantConst jsonKey = json[advancedKeys[i]]; + char *jsonchar; + + if (jsonKey.is()) + { + itoa(jsonKey, jsonchar, 10); + } + else if (jsonKey.is()) + { + if (jsonKey) + { + itoa(1, jsonchar, 10); + } + else + { + itoa(0, jsonchar, 10); + } + } + else if (jsonKey.is()) + { + jsonchar = (char*)jsonKey.as(); + } if(strlen(jsonchar) == 0) { @@ -2663,7 +2709,7 @@ void NukiWrapper::onKeypadJsonCommandReceived(const char *value) { idExists = std::find(_keypadCodeIds.begin(), _keypadCodeIds.end(), codeId) != _keypadCodeIds.end(); } - + if(strcmp(action, "check") == 0) { if(!_preferences->getBool(preference_keypad_check_code_enabled, false)) {