aboutsummaryrefslogtreecommitdiffstats
path: root/src/core/utils/GpgUtils.cpp
diff options
context:
space:
mode:
authorsaturneric <[email protected]>2025-01-21 22:44:36 +0000
committersaturneric <[email protected]>2025-01-21 22:44:36 +0000
commit3931b64fddffbb12b3276acbdd14a834432b5104 (patch)
tree6069614bbd592fbf1f319d5e702d6e34a7ab0d4a /src/core/utils/GpgUtils.cpp
parentMerge branch 'develop' into dev/2.1.6/main (diff)
downloadGpgFrontend-3931b64fddffbb12b3276acbdd14a834432b5104.tar.gz
GpgFrontend-3931b64fddffbb12b3276acbdd14a834432b5104.zip
feat: enhance key db functions
1. allow using relative key db path 2. allow editing default key db 3. use a key db in own directory at portable mode
Diffstat (limited to 'src/core/utils/GpgUtils.cpp')
-rw-r--r--src/core/utils/GpgUtils.cpp101
1 files changed, 101 insertions, 0 deletions
diff --git a/src/core/utils/GpgUtils.cpp b/src/core/utils/GpgUtils.cpp
index dfedd098..38eef081 100644
--- a/src/core/utils/GpgUtils.cpp
+++ b/src/core/utils/GpgUtils.cpp
@@ -28,8 +28,11 @@
#include "GpgUtils.h"
+#include "core/function/GlobalSettingStation.h"
#include "core/model/KeyDatabaseInfo.h"
+#include "core/model/SettingsObject.h"
#include "core/module/ModuleManager.h"
+#include "core/struct/settings_object/KeyDatabaseListSO.h"
namespace GpgFrontend {
@@ -218,4 +221,102 @@ auto GPGFRONTEND_CORE_EXPORT GetGpgKeyDatabaseName(int channel) -> QString {
if (channel >= info.size()) return {};
return info[channel].name;
}
+
+auto GetKeyDatabasesBySettings() -> QContainer<KeyDatabaseItemSO> {
+ auto key_db_list_so = SettingsObject("key_database_list");
+ auto key_db_list = KeyDatabaseListSO(key_db_list_so);
+ auto& key_dbs = key_db_list.key_databases;
+
+ if (key_dbs.empty()) {
+ KeyDatabaseItemSO key_db;
+
+ auto default_home_path = Module::RetrieveRTValueTypedOrDefault<>(
+ "core", "gpgme.ctx.default_database_path", QString{});
+
+ key_db.channel = 0;
+ key_db.name = "DEFAULT";
+ key_db.path = default_home_path;
+
+ key_dbs.append(key_db);
+ }
+
+ // Sort by channel
+ std::sort(key_dbs.begin(), key_dbs.end(),
+ [](const auto& a, const auto& b) { return a.channel < b.channel; });
+
+ // Resolve duplicate channels by incrementing
+ for (auto it = key_dbs.begin(); it != key_dbs.end(); ++it) {
+ auto next_it = std::next(it);
+ while (next_it != key_dbs.end() && next_it->channel == it->channel) {
+ next_it->channel = it->channel + 1;
+ ++next_it;
+ }
+ }
+
+ key_db_list_so.Store(key_db_list.ToJson());
+
+ return key_db_list.key_databases;
+}
+
+auto VerifyKeyDatabasePath(const QFileInfo& key_database_fs_path) -> bool {
+ return key_database_fs_path.isAbsolute() && key_database_fs_path.exists() &&
+ key_database_fs_path.isDir();
+}
+
+auto SearchKeyDatabasePath(const QList<QString>& candidate_paths) -> QString {
+ for (const auto& path : candidate_paths) {
+ if (VerifyKeyDatabasePath(QFileInfo(path))) {
+ // return a unify path
+ return QFileInfo(path).absoluteFilePath();
+ }
+ }
+ return {};
+}
+
+auto GetCanonicalKeyDatabasePath(const QDir& app_path,
+ const QString& path) -> QString {
+ auto target_path = path;
+ if (!QDir::isAbsolutePath(target_path)) {
+ target_path = app_path.absoluteFilePath(target_path);
+ LOG_D() << "convert relative path: " << path
+ << "to absolute path: " << target_path;
+ }
+
+ auto info = QFileInfo(target_path);
+ if (VerifyKeyDatabasePath(info)) {
+ auto key_database_fs_path = info.canonicalFilePath();
+ LOG_D() << "load gpg key database:" << key_database_fs_path;
+
+ return key_database_fs_path;
+ }
+
+ LOG_W() << "gpg key database path is invalid: " << path;
+ return {};
+}
+
+auto GetKeyDatabaseInfoBySettings() -> QList<KeyDatabaseInfo> {
+ auto key_dbs = GetKeyDatabasesBySettings();
+
+ QContainer<KeyDatabaseInfo> key_db_infos;
+
+ const auto app_path = QDir(GlobalSettingStation::GetInstance().GetAppDir());
+
+ // try to use user defined key database
+ for (const auto& key_database : key_dbs) {
+ auto key_database_fs_path =
+ GetCanonicalKeyDatabasePath(app_path, key_database.path);
+
+ if (key_database_fs_path.isEmpty()) continue;
+
+ KeyDatabaseInfo key_db_info;
+ key_db_info.name = key_database.name;
+ key_db_info.path = key_database_fs_path;
+ key_db_info.origin_path = key_database.path;
+ key_db_infos.append(key_db_info);
+
+ LOG_D() << "plan to load gpg key database:" << key_database_fs_path;
+ }
+
+ return key_db_infos;
+}
} // namespace GpgFrontend