mirror of
https://github.com/steredbits/pelagia.git
synced 2026-10-18 11:01:27 +02:00
68 lines
2.0 KiB
C++
68 lines
2.0 KiB
C++
// SPDX-License-Identifier: GPL-3.0-or-later
|
|
// Copyright (C) 2026 steredbits and Pelagia contributors
|
|
#include "ui/session_store.h"
|
|
|
|
#include <cjson/cJSON.h>
|
|
|
|
#include "util/log.h"
|
|
|
|
namespace ui {
|
|
|
|
SessionStore::SessionStore(util::FileStore* store, std::string config_dir)
|
|
: store_(store), dir_(std::move(config_dir)) {}
|
|
|
|
std::string SessionStore::path() const { return dir_ + "/session.json"; }
|
|
|
|
std::string SessionStore::to_json(const SavedSession& session) {
|
|
cJSON* root = cJSON_CreateObject();
|
|
cJSON_AddStringToObject(root, "server", session.server.c_str());
|
|
cJSON_AddStringToObject(root, "token", session.token.c_str());
|
|
char* text = cJSON_PrintUnformatted(root);
|
|
std::string out = text ? text : "";
|
|
cJSON_free(text);
|
|
cJSON_Delete(root);
|
|
return out;
|
|
}
|
|
|
|
bool SessionStore::from_json(const std::string& json, SavedSession* out) {
|
|
cJSON* root = cJSON_Parse(json.c_str());
|
|
if (!root) {
|
|
return false;
|
|
}
|
|
const cJSON* server = cJSON_GetObjectItemCaseSensitive(root, "server");
|
|
const cJSON* token = cJSON_GetObjectItemCaseSensitive(root, "token");
|
|
const bool ok = cJSON_IsString(server) && cJSON_IsString(token) &&
|
|
server->valuestring[0] != '\0' && token->valuestring[0] != '\0';
|
|
if (ok) {
|
|
out->server = server->valuestring;
|
|
out->token = token->valuestring;
|
|
}
|
|
cJSON_Delete(root);
|
|
return ok;
|
|
}
|
|
|
|
bool SessionStore::load(SavedSession* out) const {
|
|
std::string json;
|
|
if (!store_->read(path(), &json)) {
|
|
return false;
|
|
}
|
|
if (!from_json(json, out)) {
|
|
LOG_WARN("Unreadable saved session (%s): ignored", path().c_str());
|
|
return false;
|
|
}
|
|
util::log_add_secret(out->token);
|
|
return true;
|
|
}
|
|
|
|
bool SessionStore::save(const SavedSession& session) const {
|
|
if (!store_->make_dirs(dir_) || !store_->write(path(), to_json(session), true)) {
|
|
LOG_WARN("Cannot save the session (%s)", path().c_str());
|
|
return false;
|
|
}
|
|
return true;
|
|
}
|
|
|
|
bool SessionStore::clear() const { return store_->remove(path()); }
|
|
|
|
} // namespace ui
|