esp32-fingerprint-safe/app/Settings.cpp

119 lines
3.1 KiB
C++

#include <SmingCore.h>
#include <ArduinoJson.h>
#include "utils.h"
#include "Settings.h"
CSettings::CSettings()
{
strcpy(m_aUsername, "admin");
strcpy(m_aPassword, "admin");
strcpy(m_aSSID, "");
strcpy(m_aPSK, "");
m_DHCP = true;
strcpy(m_aHostname, "safeweb");
m_Address = IPAddress(0, 0, 0, 0);
m_Netmask = IPAddress(0, 0, 0, 0);
m_Gateway = IPAddress(0, 0, 0, 0);
memset(m_aLockCode, 0, sizeof(m_aLockCode));
}
bool CSettings::Exists()
{
return fileExist(APP_SETTINGS_FILE);
}
bool CSettings::Load()
{
if(!Exists())
{
Save();
return true;
}
uint32_t size = fileGetSize(APP_SETTINGS_FILE);
char *pData = new char[size + 1];
fileGetContent(APP_SETTINGS_FILE, pData, size + 1);
DynamicJsonDocument doc(1024);
if(deserializeJson(doc, pData))
{
delete[] pData;
return false;
}
strncpy(m_aUsername, doc["username"], sizeof(m_aUsername));
strncpy(m_aPassword, doc["password"], sizeof(m_aPassword));
JsonObject network = doc["network"];
strncpy(m_aSSID, network["ssid"], sizeof(m_aSSID));
strncpy(m_aPSK, network["passphrase"], sizeof(m_aPSK));
m_DHCP = network["dhcp"];
strncpy(m_aHostname, network["hostname"], sizeof(m_aHostname));
m_Address = network["address"].as<const char *>();
m_Netmask = network["netmask"].as<const char *>();
m_Gateway = network["gateway"].as<const char *>();
JsonArray lockCode = doc["lock_code"];
uint8_t tmp = min(lockCode.size(), sizeof(m_aLockCode));
for(uint8_t i = 0; i < tmp; i++)
m_aLockCode[i] = lockCode[i];
JsonArray fingerprints = doc["fingerprints"];
uint16_t sz = fingerprints.size();
m_FingerPrints.allocate(sz);
for(uint16_t i = 0; i < sz; i++)
{
JsonObject obj = fingerprints[i];
CFingerPrint finger;
finger.m_FingerNum = obj["num"];
strncpy(finger.m_aLabel, obj["label"], sizeof(finger.m_aLabel));
hex2bytes(obj["digest"].as<const char *>(), finger.m_aDigest, sizeof(finger.m_aDigest));
m_FingerPrints[finger.m_FingerNum] = finger;
}
delete[] pData;
return true;
}
void CSettings::Save()
{
DynamicJsonDocument doc(1024);
doc["username"] = m_aUsername;
doc["password"] = m_aPassword;
JsonObject network = doc.createNestedObject("network");
network["ssid"] = m_aSSID;
network["passphrase"] = m_aPSK;
network["dhcp"] = m_DHCP;
network["hostname"] = m_aHostname;
network["address"] = m_Address.toString();
network["netmask"] = m_Netmask.toString();
network["gateway"] = m_Gateway.toString();
JsonArray lockCode = doc.createNestedArray("lock_code");
for(uint8_t i = 0; i < sizeof(m_aLockCode); i++)
lockCode.add(m_aLockCode[i]);
JsonArray fingerprints = doc.createNestedArray("fingerprints");
uint16_t tmp = m_FingerPrints.count();
for(uint16_t i = 0; i < tmp; i++)
{
JsonObject obj = fingerprints.createNestedObject();
const CFingerPrint &finger = m_FingerPrints.valueAt(i);
obj["num"] = finger.m_FingerNum;
obj["label"] = String(finger.m_aLabel);
char aHexDigest[SHA256_SIZE*2+1];
bytes2hex(finger.m_aDigest, sizeof(finger.m_aDigest), aHexDigest, sizeof(aHexDigest));
obj["digest"] = String(aHexDigest);
}
String docString;
serializeJsonPretty(doc, docString);
fileSetContent(APP_SETTINGS_FILE, docString);
}