aboutsummaryrefslogtreecommitdiffstats
path: root/src/ui/settings/GlobalSettingStation.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/ui/settings/GlobalSettingStation.cpp')
-rw-r--r--src/ui/settings/GlobalSettingStation.cpp128
1 files changed, 127 insertions, 1 deletions
diff --git a/src/ui/settings/GlobalSettingStation.cpp b/src/ui/settings/GlobalSettingStation.cpp
index 4e9bac73..e1e5f6f4 100644
--- a/src/ui/settings/GlobalSettingStation.cpp
+++ b/src/ui/settings/GlobalSettingStation.cpp
@@ -41,7 +41,7 @@ GpgFrontend::UI::GlobalSettingStation::GetInstance() {
return *_instance;
}
-void GpgFrontend::UI::GlobalSettingStation::Sync() noexcept {
+void GpgFrontend::UI::GlobalSettingStation::SyncSettings() noexcept {
using namespace libconfig;
try {
ui_cfg.writeFile(ui_config_path.string().c_str());
@@ -74,6 +74,19 @@ GpgFrontend::UI::GlobalSettingStation::GlobalSettingStation() noexcept {
if (!is_directory(ui_config_dir_path)) create_directory(ui_config_dir_path);
+ if (!is_directory(app_secure_path)) create_directory(app_secure_path);
+
+ if (!exists(app_secure_key_path)) {
+ init_app_secure_key();
+ }
+
+ const auto key =
+ GpgFrontend::read_all_data_in_file(app_secure_key_path.string());
+ hash_key_ = QCryptographicHash::hash(QByteArray::fromStdString(key),
+ QCryptographicHash::Sha256);
+
+ if (!exists(app_data_objs_path)) create_directory(app_data_objs_path);
+
if (!exists(ui_config_path)) {
try {
this->ui_cfg.writeFile(ui_config_path.string().c_str());
@@ -136,5 +149,118 @@ GpgFrontend::UI::GlobalSettingStation::GetRootCerts() {
return root_certs_;
}
+std::string GpgFrontend::UI::GlobalSettingStation::generate_passphrase(
+ int len) {
+ std::uniform_int_distribution<int> dist(999, 99999);
+ static const char alphanum[] =
+ "0123456789"
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
+ "abcdefghijklmnopqrstuvwxyz";
+ std::string tmp_str;
+ tmp_str.reserve(len);
+
+ for (int i = 0; i < len; ++i) {
+ tmp_str += alphanum[dist(mt) % (sizeof(alphanum) - 1)];
+ }
+
+ return tmp_str;
+}
+
+void GpgFrontend::UI::GlobalSettingStation::init_app_secure_key() {
+ GpgFrontend::write_buffer_to_file(app_secure_key_path.string(),
+ generate_passphrase(256));
+ boost::filesystem::permissions(
+ app_secure_key_path,
+ boost::filesystem::owner_read | boost::filesystem::owner_write);
+}
+
+std::string GpgFrontend::UI::GlobalSettingStation::SaveDataObj(
+ const std::string& _key, const nlohmann::json& value) {
+ std::string _hash_obj_key = {};
+ if (_key.empty()) {
+ _hash_obj_key =
+ QCryptographicHash::hash(
+ hash_key_ + QByteArray::fromStdString(
+ generate_passphrase(32) +
+ to_iso_extended_string(
+ boost::posix_time::second_clock::local_time())),
+ QCryptographicHash::Sha256)
+ .toHex()
+ .toStdString();
+ } else {
+ _hash_obj_key =
+ QCryptographicHash::hash(hash_key_ + QByteArray::fromStdString(_key),
+ QCryptographicHash::Sha256)
+ .toHex()
+ .toStdString();
+ }
+
+ const auto obj_path = app_data_objs_path / _hash_obj_key;
+
+ QAESEncryption encryption(QAESEncryption::AES_256, QAESEncryption::ECB,
+ QAESEncryption::Padding::ISO);
+ auto encoded =
+ encryption.encode(QByteArray::fromStdString(to_string(value)), hash_key_);
+
+ GpgFrontend::write_buffer_to_file(obj_path.string(), encoded.toStdString());
+
+ return _key.empty() ? _hash_obj_key : std::string();
+}
+
+std::optional<nlohmann::json>
+GpgFrontend::UI::GlobalSettingStation::GetDataObject(const std::string& _key) {
+ try {
+ auto _hash_obj_key =
+ QCryptographicHash::hash(hash_key_ + QByteArray::fromStdString(_key),
+ QCryptographicHash::Sha256)
+ .toHex()
+ .toStdString();
+
+ const auto obj_path = app_data_objs_path / _hash_obj_key;
+
+ if (!boost::filesystem::exists(obj_path)) {
+ return {};
+ }
+
+ auto buffer = GpgFrontend::read_all_data_in_file(obj_path.string());
+ auto encoded = QByteArray::fromStdString(buffer);
+
+ QAESEncryption encryption(QAESEncryption::AES_256, QAESEncryption::ECB,
+ QAESEncryption::Padding::ISO);
+
+ auto decoded =
+ encryption.removePadding(encryption.decode(encoded, hash_key_));
+
+ return nlohmann::json::parse(decoded.toStdString());
+ } catch (...) {
+ return {};
+ }
+}
+std::optional<nlohmann::json>
+GpgFrontend::UI::GlobalSettingStation::GetDataObjectByRef(
+ const std::string& _ref) {
+ if (_ref.size() != 64) return {};
+
+ try {
+ auto _hash_obj_key = _ref;
+ const auto obj_path = app_data_objs_path / _hash_obj_key;
+
+ if (!boost::filesystem::exists(obj_path)) return {};
+
+ auto buffer = GpgFrontend::read_all_data_in_file(obj_path.string());
+ auto encoded = QByteArray::fromStdString(buffer);
+
+ QAESEncryption encryption(QAESEncryption::AES_256, QAESEncryption::ECB,
+ QAESEncryption::Padding::ISO);
+
+ auto decoded =
+ encryption.removePadding(encryption.decode(encoded, hash_key_));
+
+ return nlohmann::json::parse(decoded.toStdString());
+ } catch (...) {
+ return {};
+ }
+}
+
GpgFrontend::UI::GlobalSettingStation::~GlobalSettingStation() noexcept =
default;