diff options
author | saturneric <[email protected]> | 2025-04-19 00:08:03 +0000 |
---|---|---|
committer | saturneric <[email protected]> | 2025-04-19 00:08:03 +0000 |
commit | a6b23476a2c38f2a2809cc4f80b3798a1e5c99a7 (patch) | |
tree | 65c024239a4d2864804bac16133347374947927f /src | |
parent | fix: operations of subkey (diff) | |
download | GpgFrontend-a6b23476a2c38f2a2809cc4f80b3798a1e5c99a7.tar.gz GpgFrontend-a6b23476a2c38f2a2809cc4f80b3798a1e5c99a7.zip |
fix: gpg context will take response of gpg-agent
Diffstat (limited to 'src')
-rw-r--r-- | src/core/function/gpg/GpgAdvancedOperator.cpp | 18 | ||||
-rw-r--r-- | src/core/function/gpg/GpgAdvancedOperator.h | 5 | ||||
-rw-r--r-- | src/core/function/gpg/GpgAssuanHelper.cpp | 5 | ||||
-rw-r--r-- | src/core/function/gpg/GpgAssuanHelper.h | 4 | ||||
-rw-r--r-- | src/core/function/gpg/GpgComponentManager.cpp (renamed from src/core/function/gpg/GpgComponentInfoGetter.cpp) | 32 | ||||
-rw-r--r-- | src/core/function/gpg/GpgComponentManager.h (renamed from src/core/function/gpg/GpgComponentInfoGetter.h) | 20 | ||||
-rw-r--r-- | src/core/function/gpg/GpgContext.cpp | 29 | ||||
-rw-r--r-- | src/core/function/gpg/GpgContext.h | 39 | ||||
-rw-r--r-- | src/core/function/gpg/GpgSmartCardManager.h | 4 | ||||
-rw-r--r-- | src/core/utils/GpgUtils.cpp | 6 |
10 files changed, 126 insertions, 36 deletions
diff --git a/src/core/function/gpg/GpgAdvancedOperator.cpp b/src/core/function/gpg/GpgAdvancedOperator.cpp index c9af8b59..d6323901 100644 --- a/src/core/function/gpg/GpgAdvancedOperator.cpp +++ b/src/core/function/gpg/GpgAdvancedOperator.cpp @@ -36,33 +36,27 @@ namespace GpgFrontend { auto GpgAdvancedOperator::ClearGpgPasswordCache() -> bool { - auto [ret, out] = exec_.GpgConfExecuteSync({{"--reload", "gpg-agent"}}); - return ret == 0; + return info_.ReloadGpgAgent(); } auto GpgAdvancedOperator::ReloadAllGpgComponents() -> bool { - auto [ret, out] = exec_.GpgConfExecuteSync({{"--reload", "all"}}); - return ret == 0; + return info_.ReloadGpgAgent(); } auto GpgAdvancedOperator::KillAllGpgComponents() -> bool { - auto [ret, out] = exec_.GpgConfExecuteSync({{"--kill", "all"}}); - return ret == 0; + return ctx_.RestartGpgAgent(); } auto GpgAdvancedOperator::ResetConfigures() -> bool { - auto [ret, out] = exec_.GpgConfExecuteSync({{"--apply-defaults"}}); - return ret == 0; + return info_.ReloadGpgAgent(); } auto GpgAdvancedOperator::LaunchAllGpgComponents() -> bool { - auto [ret, out] = exec_.GpgConfExecuteSync({{"--launch", "all"}}); - return ret == 0; + return ctx_.RestartGpgAgent(); } auto GpgAdvancedOperator::RestartGpgComponents() -> bool { - if (!KillAllGpgComponents()) return false; - return LaunchAllGpgComponents(); + return ctx_.RestartGpgAgent(); } GpgAdvancedOperator::GpgAdvancedOperator(int channel) diff --git a/src/core/function/gpg/GpgAdvancedOperator.h b/src/core/function/gpg/GpgAdvancedOperator.h index 1099c3b3..e6934f42 100644 --- a/src/core/function/gpg/GpgAdvancedOperator.h +++ b/src/core/function/gpg/GpgAdvancedOperator.h @@ -34,6 +34,7 @@ #include "core/function/basic/GpgFunctionObject.h" #include "core/function/gpg/GpgCommandExecutor.h" +#include "core/function/gpg/GpgComponentManager.h" #include "core/model/DataObject.h" namespace GpgFrontend { @@ -97,6 +98,10 @@ class GPGFRONTEND_CORE_EXPORT GpgAdvancedOperator private: GpgCommandExecutor& exec_ = GpgCommandExecutor::GetInstance(SingletonFunctionObject::GetChannel()); + GpgContext& ctx_ = + GpgContext::GetInstance(SingletonFunctionObject::GetChannel()); + GpgComponentManager& info_ = + GpgComponentManager::GetInstance(SingletonFunctionObject::GetChannel()); }; } // namespace GpgFrontend diff --git a/src/core/function/gpg/GpgAssuanHelper.cpp b/src/core/function/gpg/GpgAssuanHelper.cpp index 128ecaa9..a83c5655 100644 --- a/src/core/function/gpg/GpgAssuanHelper.cpp +++ b/src/core/function/gpg/GpgAssuanHelper.cpp @@ -75,7 +75,8 @@ auto GpgAssuanHelper::ConnectToSocket(GpgComponentType type) -> GpgError { auto err = assuan_socket_connect(a_ctx, info.absoluteFilePath().toUtf8(), ASSUAN_INVALID_PID, 0); if (err != GPG_ERR_NO_ERROR) { - LOG_W() << "failed to connect to socket:" << CheckGpgError(err); + LOG_W() << "failed to connect to socket:" << info.absoluteFilePath() + << "err:" << CheckGpgError(err); return err; } @@ -165,7 +166,7 @@ auto GpgAssuanHelper::SendStatusCommand(GpgComponentType type, auto GpgAssuanHelper::SendDataCommand(GpgComponentType type, const QString& command) - -> std::tuple<bool, QStringList> { + -> std::tuple<GpgError, QStringList> { QStringList lines; GpgAssuanHelper::DataCallback d_cb = [&](const QSharedPointer<GpgAssuanHelper::AssuanCallbackContext>& ctx) diff --git a/src/core/function/gpg/GpgAssuanHelper.h b/src/core/function/gpg/GpgAssuanHelper.h index 7f3854b6..adf6d0ff 100644 --- a/src/core/function/gpg/GpgAssuanHelper.h +++ b/src/core/function/gpg/GpgAssuanHelper.h @@ -115,8 +115,8 @@ class GPGFRONTEND_CORE_EXPORT GpgAssuanHelper * @param command * @return auto */ - auto SendDataCommand(GpgComponentType type, - const QString& command) -> std::tuple<bool, QStringList>; + auto SendDataCommand(GpgComponentType type, const QString& command) + -> std::tuple<GpgError, QStringList>; private: GpgContext& ctx_ = diff --git a/src/core/function/gpg/GpgComponentInfoGetter.cpp b/src/core/function/gpg/GpgComponentManager.cpp index 317f334f..1b302631 100644 --- a/src/core/function/gpg/GpgComponentInfoGetter.cpp +++ b/src/core/function/gpg/GpgComponentManager.cpp @@ -26,14 +26,14 @@ * */ -#include "GpgComponentInfoGetter.h" +#include "GpgComponentManager.h" namespace GpgFrontend { -GpgComponentInfoGetter::GpgComponentInfoGetter(int channel) - : GpgFrontend::SingletonFunctionObject<GpgComponentInfoGetter>(channel) {} +GpgComponentManager::GpgComponentManager(int channel) + : GpgFrontend::SingletonFunctionObject<GpgComponentManager>(channel) {} -auto GpgComponentInfoGetter::GetGpgAgentVersion() -> QString { +auto GpgComponentManager::GetGpgAgentVersion() -> QString { if (!gpg_agent_version_.isEmpty()) return gpg_agent_version_; auto [r, s] = @@ -47,7 +47,7 @@ auto GpgComponentInfoGetter::GetGpgAgentVersion() -> QString { return gpg_agent_version_; } -auto GpgComponentInfoGetter::GetScdaemonVersion() -> QString { +auto GpgComponentManager::GetScdaemonVersion() -> QString { if (!scdaemon_version_.isEmpty()) return scdaemon_version_; auto [r, s] = assuan_.SendDataCommand(GpgComponentType::kGPG_AGENT, @@ -61,4 +61,26 @@ auto GpgComponentInfoGetter::GetScdaemonVersion() -> QString { return scdaemon_version_; } +auto GpgComponentManager::ReloadGpgAgent() -> bool { + auto [r, s] = + assuan_.SendStatusCommand(GpgComponentType::kGPG_AGENT, "RELOADAGENT"); + if (r != GPG_ERR_NO_ERROR) { + LOG_D() << "invalid response of RELOADAGENT: " << s; + return false; + } + + return true; +} + +auto GpgComponentManager::GpgKillAgent() -> bool { + auto [r, s] = + assuan_.SendStatusCommand(GpgComponentType::kGPG_AGENT, "KILLAGENT"); + if (r != GPG_ERR_NO_ERROR) { + LOG_D() << "invalid response of KILLAGENT: " << s; + return false; + } + + return true; +} + } // namespace GpgFrontend
\ No newline at end of file diff --git a/src/core/function/gpg/GpgComponentInfoGetter.h b/src/core/function/gpg/GpgComponentManager.h index 3f8b560b..cfd6a99f 100644 --- a/src/core/function/gpg/GpgComponentInfoGetter.h +++ b/src/core/function/gpg/GpgComponentManager.h @@ -33,15 +33,15 @@ namespace GpgFrontend { -class GPGFRONTEND_CORE_EXPORT GpgComponentInfoGetter - : public SingletonFunctionObject<GpgComponentInfoGetter> { +class GPGFRONTEND_CORE_EXPORT GpgComponentManager + : public SingletonFunctionObject<GpgComponentManager> { public: /** * @brief Construct a new Gpg Assuan Helper object * * @param channel */ - explicit GpgComponentInfoGetter(int channel); + explicit GpgComponentManager(int channel); /** * @brief @@ -59,6 +59,20 @@ class GPGFRONTEND_CORE_EXPORT GpgComponentInfoGetter */ auto GetScdaemonVersion() -> QString; + /** + * @brief + * + */ + auto ReloadGpgAgent() -> bool; + + /** + * @brief + * + * @return true + * @return false + */ + auto GpgKillAgent() -> bool; + private: GpgContext& ctx_ = GpgContext::GetInstance(SingletonFunctionObject::GetChannel()); diff --git a/src/core/function/gpg/GpgContext.cpp b/src/core/function/gpg/GpgContext.cpp index 7c7cde3d..49d39650 100644 --- a/src/core/function/gpg/GpgContext.cpp +++ b/src/core/function/gpg/GpgContext.cpp @@ -137,10 +137,10 @@ class GpgContext::Impl { gpgconf_path_(Module::RetrieveRTValueTypedOrDefault<>( "core", "gpgme.ctx.gpgconf_path", QString{})), database_path_(args.db_path), - agent_(parent->GetChannel(), - Module::RetrieveRTValueTypedOrDefault<>( - "core", "gnupg.components.gpg-agent.path", QString{}), - args.db_path) { + gpg_agent_path_(Module::RetrieveRTValueTypedOrDefault<>( + "core", "gnupg.components.gpg-agent.path", QString{})), + agent_(QSharedPointer<GpgAgentProcess>::create( + parent->GetChannel(), gpg_agent_path_, database_path_)) { init(args); } @@ -273,6 +273,18 @@ class GpgContext::Impl { [[nodiscard]] auto KeyDBName() const -> QString { return db_name_; } + auto RestartGpgAgent() -> bool { + if (agent_ != nullptr) { + agent_ = QSharedPointer<GpgAgentProcess>::create( + parent_->GetChannel(), gpg_agent_path_, database_path_); + } + + // ensure all gpg-agent are killed. + kill_gpg_agent(); + + return launch_gpg_agent(); + } + private: GpgContext *parent_; GpgContextInitArgs args_{}; ///< @@ -286,8 +298,9 @@ class GpgContext::Impl { QString db_name_; QString gpgconf_path_; QString database_path_; + QString gpg_agent_path_; QMap<QString, QString> component_dirs_; - GpgAgentProcess agent_; + QSharedPointer<GpgAgentProcess> agent_; void init(const GpgContextInitArgs &args) { assert(!gpgconf_path_.isEmpty()); @@ -551,8 +564,8 @@ class GpgContext::Impl { } auto launch_gpg_agent() -> bool { - agent_.Start(); - return true; + if (agent_ == nullptr) return false; + return agent_->Start(); } }; @@ -583,4 +596,6 @@ auto GpgContext::ComponentDirectory(GpgComponentType type) const -> QString { } auto GpgContext::KeyDBName() const -> QString { return p_->KeyDBName(); } + +auto GpgContext::RestartGpgAgent() -> bool { return p_->RestartGpgAgent(); } } // namespace GpgFrontend
\ No newline at end of file diff --git a/src/core/function/gpg/GpgContext.h b/src/core/function/gpg/GpgContext.h index 350c153e..57df610c 100644 --- a/src/core/function/gpg/GpgContext.h +++ b/src/core/function/gpg/GpgContext.h @@ -65,18 +65,57 @@ class GPGFRONTEND_CORE_EXPORT GpgContext ~GpgContext(); + /** + * @brief + * + * @return true + * @return false + */ [[nodiscard]] auto Good() const -> bool; + /** + * @brief + * + * @return gpgme_ctx_t + */ auto BinaryContext() -> gpgme_ctx_t; + /** + * @brief + * + * @return gpgme_ctx_t + */ auto DefaultContext() -> gpgme_ctx_t; + /** + * @brief + * + * @return QString + */ [[nodiscard]] auto KeyDBName() const -> QString; + /** + * @brief + * + * @return QString + */ [[nodiscard]] auto HomeDirectory() const -> QString; + /** + * @brief + * + * @return QString + */ [[nodiscard]] auto ComponentDirectory(GpgComponentType) const -> QString; + /** + * @brief + * + * @return true + * @return false + */ + auto RestartGpgAgent() -> bool; + private: class Impl; SecureUniquePtr<Impl> p_; diff --git a/src/core/function/gpg/GpgSmartCardManager.h b/src/core/function/gpg/GpgSmartCardManager.h index 02b07fa2..95fcd7c7 100644 --- a/src/core/function/gpg/GpgSmartCardManager.h +++ b/src/core/function/gpg/GpgSmartCardManager.h @@ -30,7 +30,7 @@ #include "core/function/basic/GpgFunctionObject.h" #include "core/function/gpg/GpgAssuanHelper.h" -#include "core/function/gpg/GpgComponentInfoGetter.h" +#include "core/function/gpg/GpgComponentManager.h" #include "core/function/gpg/GpgContext.h" #include "core/model/GpgOpenPGPCard.h" @@ -123,7 +123,7 @@ class GPGFRONTEND_CORE_EXPORT GpgSmartCardManager GpgContext::GetInstance(SingletonFunctionObject::GetChannel()); ///< GpgAssuanHelper& assuan_ = GpgAssuanHelper::GetInstance(SingletonFunctionObject::GetChannel()); ///< - GpgComponentInfoGetter& info_ = GpgComponentInfoGetter::GetInstance( + GpgComponentManager& info_ = GpgComponentManager::GetInstance( SingletonFunctionObject::GetChannel()); ///< QString cached_scd_serialno_status_hash_; diff --git a/src/core/utils/GpgUtils.cpp b/src/core/utils/GpgUtils.cpp index c8f58889..c51b7e37 100644 --- a/src/core/utils/GpgUtils.cpp +++ b/src/core/utils/GpgUtils.cpp @@ -30,7 +30,7 @@ #include "core/function/GlobalSettingStation.h" #include "core/function/gpg/GpgAbstractKeyGetter.h" -#include "core/function/gpg/GpgComponentInfoGetter.h" +#include "core/function/gpg/GpgComponentManager.h" #include "core/model/GpgKey.h" #include "core/model/GpgKeyGroup.h" #include "core/model/KeyDatabaseInfo.h" @@ -430,13 +430,13 @@ auto GPGFRONTEND_CORE_EXPORT IsKeyGroupID(const KeyId& id) -> bool { auto GPGFRONTEND_CORE_EXPORT GpgAgentVersionGreaterThan(int channel, const QString& v) -> bool { return GFSoftwareVersionGreaterThan( - GpgComponentInfoGetter::GetInstance(channel).GetGpgAgentVersion(), v); + GpgComponentManager::GetInstance(channel).GetGpgAgentVersion(), v); } auto GPGFRONTEND_CORE_EXPORT CheckGpgVersion(int channel, const QString& v) -> bool { const auto ver = - GpgComponentInfoGetter::GetInstance(channel).GetGpgAgentVersion(); + GpgComponentManager::GetInstance(channel).GetGpgAgentVersion(); if (ver.isEmpty() || !GFSoftwareVersionGreaterThan(ver, v)) { LOG_W() << "operation not support for gpg-agent version: " << ver |