diff options
Diffstat (limited to 'src/core/utils')
-rw-r--r-- | src/core/utils/AsyncUtils.cpp | 28 | ||||
-rw-r--r-- | src/core/utils/AsyncUtils.h | 12 | ||||
-rw-r--r-- | src/core/utils/CommonUtils.cpp | 5 | ||||
-rw-r--r-- | src/core/utils/CommonUtils.h | 10 | ||||
-rw-r--r-- | src/core/utils/GpgUtils.cpp | 53 | ||||
-rw-r--r-- | src/core/utils/GpgUtils.h | 25 |
6 files changed, 109 insertions, 24 deletions
diff --git a/src/core/utils/AsyncUtils.cpp b/src/core/utils/AsyncUtils.cpp index a4bc66fa..a3ab9eb8 100644 --- a/src/core/utils/AsyncUtils.cpp +++ b/src/core/utils/AsyncUtils.cpp @@ -28,24 +28,20 @@ #include "AsyncUtils.h" +#include "core/model/DataObject.h" #include "core/module/ModuleManager.h" #include "core/thread/Task.h" #include "core/thread/TaskRunnerGetter.h" -#include "core/utils/CommonUtils.h" -#include "model/DataObject.h" +#include "core/utils/GpgUtils.h" namespace GpgFrontend { -auto RunGpgOperaAsync(const GpgOperaRunnable& runnable, +auto RunGpgOperaAsync(int channel, const GpgOperaRunnable& runnable, const GpgOperationCallback& callback, - const QString& operation, const QString& minial_version) + const QString& operation, const QString& minimal_version) -> Thread::Task::TaskHandler { - const auto gnupg_version = Module::RetrieveRTValueTypedOrDefault<>( - "core", "gpgme.ctx.gnupg_version", minial_version); - - if (GFCompareSoftwareVersion(gnupg_version, minial_version) < 0) { - LOG_W() << "operation" << operation - << " not support for gnupg version: " << gnupg_version; + if (!CheckGpgVersion(channel, minimal_version)) { + LOG_W() << "operation: " << operation << "is not supported."; callback(GPG_ERR_NOT_SUPPORTED, TransferParams()); return Thread::Task::TaskHandler(nullptr); } @@ -75,15 +71,11 @@ auto RunGpgOperaAsync(const GpgOperaRunnable& runnable, return handler; } -auto RunGpgOperaSync(const GpgOperaRunnable& runnable, const QString& operation, - const QString& minial_version) +auto RunGpgOperaSync(int channel, const GpgOperaRunnable& runnable, + const QString& operation, const QString& minimal_version) -> std::tuple<GpgError, DataObjectPtr> { - const auto gnupg_version = Module::RetrieveRTValueTypedOrDefault<>( - "core", "gpgme.ctx.gnupg_version", minial_version); - - if (GFCompareSoftwareVersion(gnupg_version, minial_version) < 0) { - LOG_W() << "operation" << operation - << " not support for gnupg version: " << gnupg_version; + if (!CheckGpgVersion(channel, minimal_version)) { + LOG_W() << "operation: " << operation << "is not supported."; return {GPG_ERR_NOT_SUPPORTED, TransferParams()}; } diff --git a/src/core/utils/AsyncUtils.h b/src/core/utils/AsyncUtils.h index eb55cf89..5be3b230 100644 --- a/src/core/utils/AsyncUtils.h +++ b/src/core/utils/AsyncUtils.h @@ -41,24 +41,24 @@ namespace GpgFrontend { * @param runnable * @param callback * @param operation - * @param minial_version + * @param minimal_version */ auto GPGFRONTEND_CORE_EXPORT -RunGpgOperaAsync(const GpgOperaRunnable& runnable, +RunGpgOperaAsync(int channel, const GpgOperaRunnable& runnable, const GpgOperationCallback& callback, const QString& operation, - const QString& minial_version) -> Thread::Task::TaskHandler; + const QString& minimal_version) -> Thread::Task::TaskHandler; /** * @brief * * @param runnable * @param operation - * @param minial_version + * @param minimal_version * @return std::tuple<GpgError, DataObjectPtr> */ auto GPGFRONTEND_CORE_EXPORT RunGpgOperaSync( - const GpgOperaRunnable& runnable, const QString& operation, - const QString& minial_version) -> std::tuple<GpgError, DataObjectPtr>; + int channel, const GpgOperaRunnable& runnable, const QString& operation, + const QString& minimal_version) -> std::tuple<GpgError, DataObjectPtr>; /** * @brief diff --git a/src/core/utils/CommonUtils.cpp b/src/core/utils/CommonUtils.cpp index ce36c71e..eec5deef 100644 --- a/src/core/utils/CommonUtils.cpp +++ b/src/core/utils/CommonUtils.cpp @@ -74,6 +74,11 @@ auto GFCompareSoftwareVersion(const QString& a, const QString& b) -> int { return 0; } +auto GFSoftwareVersionGreaterThan(const QString& a, const QString& b) -> bool { + if (a.isEmpty()) return false; + return GFCompareSoftwareVersion(a, b) > 0; +} + auto GFStrDup(const QString& s) -> char* { if (s.isEmpty()) return nullptr; diff --git a/src/core/utils/CommonUtils.h b/src/core/utils/CommonUtils.h index d62f4867..b7d18891 100644 --- a/src/core/utils/CommonUtils.h +++ b/src/core/utils/CommonUtils.h @@ -90,4 +90,14 @@ auto GPGFRONTEND_CORE_EXPORT ParseHexEncodedVersionTuple(const QString &s) */ auto GPGFRONTEND_CORE_EXPORT IsEmailAddress(const QString &) -> bool; +/** + * @brief if a > b + * + * @param a + * @param b + * @return auto + */ +auto GPGFRONTEND_CORE_EXPORT +GFSoftwareVersionGreaterThan(const QString &a, const QString &b) -> bool; + } // namespace GpgFrontend
\ No newline at end of file diff --git a/src/core/utils/GpgUtils.cpp b/src/core/utils/GpgUtils.cpp index b8824673..d8f147bb 100644 --- a/src/core/utils/GpgUtils.cpp +++ b/src/core/utils/GpgUtils.cpp @@ -30,12 +30,15 @@ #include "core/function/GlobalSettingStation.h" #include "core/function/gpg/GpgAbstractKeyGetter.h" +#include "core/function/gpg/GpgComponentInfoGetter.h" #include "core/model/GpgKey.h" #include "core/model/GpgKeyGroup.h" #include "core/model/KeyDatabaseInfo.h" #include "core/model/SettingsObject.h" #include "core/module/ModuleManager.h" #include "core/struct/settings_object/KeyDatabaseListSO.h" +#include "core/utils/CommonUtils.h" + namespace GpgFrontend { inline auto Trim(QString& s) -> QString { return s.trimmed(); } @@ -424,4 +427,54 @@ auto GPGFRONTEND_CORE_EXPORT IsKeyGroupID(const KeyId& id) -> bool { return id.startsWith("#&"); } +auto GPGFRONTEND_CORE_EXPORT +GpgAgentVersionGreaterThan(int channel, const QString& v) -> bool { + return GFSoftwareVersionGreaterThan( + GpgComponentInfoGetter::GetInstance(channel).GetGpgAgentVersion(), v); +} + +auto GPGFRONTEND_CORE_EXPORT CheckGpgVersion(int channel, + const QString& v) -> bool { + const auto ver = + GpgComponentInfoGetter::GetInstance(channel).GetGpgAgentVersion(); + + if (ver.isEmpty() || !GFSoftwareVersionGreaterThan(ver, v)) { + LOG_W() << "operation not support for gpg-agent version: " << ver + << "minimal version: " << v; + return false; + } + + const auto gnupg_version = Module::RetrieveRTValueTypedOrDefault<>( + "core", "gpgme.ctx.gnupg_version", QString{}); + + if (gnupg_version.isEmpty() || + GFCompareSoftwareVersion(gnupg_version, v) < 0) { + LOG_W() << "operation not support for gnupg version: " << gnupg_version + << "minimal version: " << v; + return false; + } + + return true; +} + +auto GPGFRONTEND_CORE_EXPORT DecidePinentry() -> QString { +#ifdef __linux__ + QStringList preferred_list = {"pinentry-gnome3", + "pinentry-qt" + "pinentry-gtk2"}; +#elif defined(__APPLE__) && defined(__MACH__) + QStringList preferred_list = {"pinentry-mac", "pinentry-qt"}; +#else + QStringList preferred_list = {"pinentry-qt"}; +#endif + + for (const QString& name : preferred_list) { + QString path = QStandardPaths::findExecutable(name); + if (!path.isEmpty()) { + return path; + } + } + + return {}; +} } // namespace GpgFrontend diff --git a/src/core/utils/GpgUtils.h b/src/core/utils/GpgUtils.h index 13612b4f..f005bbfc 100644 --- a/src/core/utils/GpgUtils.h +++ b/src/core/utils/GpgUtils.h @@ -202,4 +202,29 @@ auto GPGFRONTEND_CORE_EXPORT GetGpgKeyByGpgAbstractKey(GpgAbstractKey*) * @return false */ auto GPGFRONTEND_CORE_EXPORT IsKeyGroupID(const KeyId& id) -> bool; + +/** + * @brief + * + * @return bool + */ +auto GPGFRONTEND_CORE_EXPORT GpgAgentVersionGreaterThan(int channel, + const QString&) -> bool; + +/** + * @brief + * + * @param channel + * @return true + * @return false + */ +auto GPGFRONTEND_CORE_EXPORT CheckGpgVersion(int channel, + const QString&) -> bool; + +/** + * @brief + * + * @return QString + */ +auto GPGFRONTEND_CORE_EXPORT DecidePinentry() -> QString; } // namespace GpgFrontend
\ No newline at end of file |