84 lines
3.0 KiB
C++
84 lines
3.0 KiB
C++
#pragma once
|
|
#include <cstdint>
|
|
#include <string>
|
|
|
|
// Document matching method for KOReader sync
|
|
enum class DocumentMatchMethod : uint8_t {
|
|
FILENAME = 0, // Match by filename (simpler, works across different file sources)
|
|
BINARY = 1, // Match by partial MD5 of file content (more accurate, but files must be identical)
|
|
};
|
|
|
|
class KOReaderCredentialStore;
|
|
namespace JsonSettingsIO {
|
|
bool saveKOReader(const KOReaderCredentialStore& store, const char* path);
|
|
bool loadKOReader(KOReaderCredentialStore& store, const char* json, bool* needsResave);
|
|
} // namespace JsonSettingsIO
|
|
|
|
/**
|
|
* Singleton class for storing KOReader sync credentials on the SD card.
|
|
* Passwords are XOR-obfuscated with the device's unique hardware MAC address
|
|
* and base64-encoded before writing to JSON (not cryptographically secure,
|
|
* but prevents casual reading and ties credentials to the specific device).
|
|
*/
|
|
class KOReaderCredentialStore {
|
|
private:
|
|
static KOReaderCredentialStore instance;
|
|
std::string username;
|
|
std::string password;
|
|
std::string serverUrl; // Custom sync server URL (empty = default)
|
|
DocumentMatchMethod matchMethod = DocumentMatchMethod::FILENAME; // Default to filename for compatibility
|
|
bool sendMetadata = false;
|
|
|
|
// Private constructor for singleton
|
|
KOReaderCredentialStore() = default;
|
|
|
|
bool loadFromBinaryFile();
|
|
|
|
friend bool JsonSettingsIO::saveKOReader(const KOReaderCredentialStore&, const char*);
|
|
friend bool JsonSettingsIO::loadKOReader(KOReaderCredentialStore&, const char*, bool*);
|
|
|
|
public:
|
|
// Delete copy constructor and assignment
|
|
KOReaderCredentialStore(const KOReaderCredentialStore&) = delete;
|
|
KOReaderCredentialStore& operator=(const KOReaderCredentialStore&) = delete;
|
|
|
|
// Get singleton instance
|
|
static KOReaderCredentialStore& getInstance() { return instance; }
|
|
|
|
// Save/load from SD card
|
|
bool saveToFile() const;
|
|
bool loadFromFile();
|
|
|
|
// Credential management
|
|
void setCredentials(const std::string& user, const std::string& pass);
|
|
const std::string& getUsername() const { return username; }
|
|
const std::string& getPassword() const { return password; }
|
|
|
|
// Get MD5 hash of password for API authentication
|
|
std::string getMd5Password() const;
|
|
|
|
// Check if credentials are set
|
|
bool hasCredentials() const;
|
|
|
|
// Clear credentials
|
|
void clearCredentials();
|
|
|
|
// Server URL management
|
|
void setServerUrl(const std::string& url);
|
|
const std::string& getServerUrl() const { return serverUrl; }
|
|
|
|
// Get base URL for API calls (with http:// normalization if no protocol, falls back to default)
|
|
std::string getBaseUrl() const;
|
|
|
|
// Document matching method
|
|
void setMatchMethod(DocumentMatchMethod method);
|
|
DocumentMatchMethod getMatchMethod() const { return matchMethod; }
|
|
|
|
// Send document metadata (filename, title, authors) with progress uploads
|
|
void setSendMetadata(bool value);
|
|
bool getSendMetadata() const { return sendMetadata; }
|
|
};
|
|
|
|
// Helper macro to access credential store
|
|
#define KOREADER_STORE KOReaderCredentialStore::getInstance()
|