Something went wrong. Try again.
A fork of https://github.com/crosspoint-reader/crosspoint-reader
Something went wrong. Try again.
3.0 kB · 110 lines
C++
at master
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111#include "OpdsServerStore.h"
#include <HalStorage.h>#include <JsonSettingsIO.h>#include <Logging.h>
#include <cstring>
#include "CrossPointSettings.h"
OpdsServerStore OpdsServerStore::instance;
namespace {constexpr char OPDS_FILE_JSON[] = "/.crosspoint/opds.json";} // namespace
bool OpdsServerStore::saveToFile() const { Storage.mkdir("/.crosspoint"); return JsonSettingsIO::saveOpds(*this, OPDS_FILE_JSON);}
bool OpdsServerStore::loadFromFile() { if (Storage.exists(OPDS_FILE_JSON)) { String json = Storage.readFile(OPDS_FILE_JSON); if (!json.isEmpty()) { // resave flag is set when passwords were stored in plaintext and need re-obfuscation bool resave = false; bool result = JsonSettingsIO::loadOpds(*this, json.c_str(), &resave); if (result && resave) { LOG_DBG("OPS", "Resaving JSON with obfuscated passwords"); saveToFile(); } return result; } }
// No opds.json found — attempt one-time migration from the legacy single-server // fields in CrossPointSettings (opdsServerUrl/opdsUsername/opdsPassword). if (migrateFromSettings()) { LOG_DBG("OPS", "Migrated legacy OPDS settings"); return true; }
return false;}
bool OpdsServerStore::migrateFromSettings() { if (strlen(SETTINGS.opdsServerUrl) == 0) { return false; }
OpdsServer server; server.name = "OPDS Server"; server.url = SETTINGS.opdsServerUrl; server.username = SETTINGS.opdsUsername; server.password = SETTINGS.opdsPassword; servers.push_back(std::move(server));
if (saveToFile()) { // Clear legacy fields so migration won't run again on next boot SETTINGS.opdsServerUrl[0] = '\0'; SETTINGS.opdsUsername[0] = '\0'; SETTINGS.opdsPassword[0] = '\0'; SETTINGS.saveToFile(); LOG_DBG("OPS", "Migrated single-server OPDS config to opds.json"); return true; }
// Save failed — roll back in-memory state so we don't have a partial migration servers.clear(); return false;}
bool OpdsServerStore::addServer(const OpdsServer& server) { if (servers.size() >= MAX_SERVERS) { LOG_DBG("OPS", "Cannot add more servers, limit of %zu reached", MAX_SERVERS); return false; }
servers.push_back(server); LOG_DBG("OPS", "Added server: %s", server.name.c_str()); return saveToFile();}
bool OpdsServerStore::updateServer(size_t index, const OpdsServer& server) { if (index >= servers.size()) { return false; }
servers[index] = server; LOG_DBG("OPS", "Updated server: %s", server.name.c_str()); return saveToFile();}
bool OpdsServerStore::removeServer(size_t index) { if (index >= servers.size()) { return false; }
LOG_DBG("OPS", "Removed server: %s", servers[index].name.c_str()); servers.erase(servers.begin() + static_cast<ptrdiff_t>(index)); return saveToFile();}
const OpdsServer* OpdsServerStore::getServer(size_t index) const { if (index >= servers.size()) { return nullptr; } return &servers[index];}