aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorsaturneric <[email protected]>2025-04-19 00:08:03 +0000
committersaturneric <[email protected]>2025-04-19 00:08:03 +0000
commita6b23476a2c38f2a2809cc4f80b3798a1e5c99a7 (patch)
tree65c024239a4d2864804bac16133347374947927f
parentfix: operations of subkey (diff)
downloadGpgFrontend-a6b23476a2c38f2a2809cc4f80b3798a1e5c99a7.tar.gz
GpgFrontend-a6b23476a2c38f2a2809cc4f80b3798a1e5c99a7.zip
fix: gpg context will take response of gpg-agent
-rw-r--r--src/core/function/gpg/GpgAdvancedOperator.cpp18
-rw-r--r--src/core/function/gpg/GpgAdvancedOperator.h5
-rw-r--r--src/core/function/gpg/GpgAssuanHelper.cpp5
-rw-r--r--src/core/function/gpg/GpgAssuanHelper.h4
-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.cpp29
-rw-r--r--src/core/function/gpg/GpgContext.h39
-rw-r--r--src/core/function/gpg/GpgSmartCardManager.h4
-rw-r--r--src/core/utils/GpgUtils.cpp6
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