diff options
Diffstat (limited to 'src/ui/settings/GlobalSettingStation.cpp')
-rw-r--r-- | src/ui/settings/GlobalSettingStation.cpp | 128 |
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; |