Something went wrong. Try again.
A fork of https://github.com/crosspoint-reader/crosspoint-reader
Something went wrong. Try again.
1.8 kB · 60 lines
C
at master
12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061#pragma once#include <string>#include <vector>
struct OpdsServer { std::string name; std::string url; std::string username; std::string password; // Plaintext in memory; obfuscated with hardware key on disk};
class OpdsServerStore;namespace JsonSettingsIO {bool saveOpds(const OpdsServerStore& store, const char* path);bool loadOpds(OpdsServerStore& store, const char* json, bool* needsResave);} // namespace JsonSettingsIO
/** * Singleton class for storing OPDS server configurations on the SD card. * Passwords are XOR-obfuscated with the device's unique hardware MAC address * and base64-encoded before writing to JSON. */class OpdsServerStore { private: static OpdsServerStore instance; std::vector<OpdsServer> servers;
static constexpr size_t MAX_SERVERS = 8;
OpdsServerStore() = default;
friend bool JsonSettingsIO::saveOpds(const OpdsServerStore&, const char*); friend bool JsonSettingsIO::loadOpds(OpdsServerStore&, const char*, bool*);
public: OpdsServerStore(const OpdsServerStore&) = delete; OpdsServerStore& operator=(const OpdsServerStore&) = delete;
static OpdsServerStore& getInstance() { return instance; }
bool saveToFile() const; bool loadFromFile();
bool addServer(const OpdsServer& server); bool updateServer(size_t index, const OpdsServer& server); bool removeServer(size_t index);
const std::vector<OpdsServer>& getServers() const { return servers; } const OpdsServer* getServer(size_t index) const; size_t getCount() const { return servers.size(); } bool hasServers() const { return !servers.empty(); }
/** * Migrate from legacy single-server settings in CrossPointSettings. * Called once during first load if no opds.json exists. */ bool migrateFromSettings();};
#define OPDS_STORE OpdsServerStore::getInstance()