From 95997d27106daf91336847f50efaaa32279b7fc7 Mon Sep 17 00:00:00 2001 From: saturneric Date: Mon, 16 Oct 2023 17:54:05 +0800 Subject: fix: check and update copyright at files --- src/core/function/gpg/GpgKeyOpera.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'src/core/function/gpg/GpgKeyOpera.cpp') diff --git a/src/core/function/gpg/GpgKeyOpera.cpp b/src/core/function/gpg/GpgKeyOpera.cpp index d5919cff..cc87fd4b 100644 --- a/src/core/function/gpg/GpgKeyOpera.cpp +++ b/src/core/function/gpg/GpgKeyOpera.cpp @@ -1,5 +1,5 @@ /** - * Copyright (C) 2021 Saturneric + * Copyright (C) 2021 Saturneric * * This file is part of GpgFrontend. * @@ -20,7 +20,7 @@ * the gpg4usb project, which is under GPL-3.0-or-later. * * All the source code of GpgFrontend was modified and released by - * Saturneric starting on May 12, 2021. + * Saturneric starting on May 12, 2021. * * SPDX-License-Identifier: GPL-3.0-or-later * -- cgit v1.2.3 From 025c268f91ee1deab17891f00dc8c90c4770224f Mon Sep 17 00:00:00 2001 From: saturneric Date: Thu, 19 Oct 2023 18:51:20 +0800 Subject: fix: improve the stability of thread system --- src/core/function/gpg/GpgKeyOpera.cpp | 79 ++++++++++++++++++----------------- 1 file changed, 40 insertions(+), 39 deletions(-) (limited to 'src/core/function/gpg/GpgKeyOpera.cpp') diff --git a/src/core/function/gpg/GpgKeyOpera.cpp b/src/core/function/gpg/GpgKeyOpera.cpp index cc87fd4b..bdce3831 100644 --- a/src/core/function/gpg/GpgKeyOpera.cpp +++ b/src/core/function/gpg/GpgKeyOpera.cpp @@ -105,45 +105,46 @@ GpgFrontend::GpgError GpgFrontend::GpgKeyOpera::SetExpire( void GpgFrontend::GpgKeyOpera::GenerateRevokeCert( const GpgKey& key, const std::string& output_file_path) { // get all components - GpgCommandExecutor::GetInstance().Execute( - ctx_.GetInfo().AppPath, - {"--command-fd", "0", "--status-fd", "1", "--no-tty", "-o", - output_file_path, "--gen-revoke", key.GetFingerprint().c_str()}, - [=](int exit_code, const std::string& p_out, const std::string& p_err) { - if (exit_code != 0) { - SPDLOG_ERROR( - "gnupg gen revoke execute error, process stderr: {}, process " - "stdout: {}", - p_err, p_out); - } else { - SPDLOG_DEBUG( - "gnupg gen revoke exit_code: {}, process stdout size: {}", - exit_code, p_out.size()); - } - }, - [](QProcess* proc) -> void { - // Code From Gpg4Win - while (proc->canReadLine()) { - const QString line = QString::fromUtf8(proc->readLine()).trimmed(); - SPDLOG_DEBUG("line: {}", line.toStdString()); - if (line == QLatin1String("[GNUPG:] GET_BOOL gen_revoke.okay")) { - proc->write("y\n"); - } else if (line == QLatin1String("[GNUPG:] GET_LINE " - "ask_revocation_reason.code")) { - proc->write("0\n"); - } else if (line == QLatin1String("[GNUPG:] GET_LINE " - "ask_revocation_reason.text")) { - proc->write("\n"); - } else if (line == QLatin1String( - "[GNUPG:] GET_BOOL openfile.overwrite.okay")) { - // We asked before - proc->write("y\n"); - } else if (line == QLatin1String("[GNUPG:] GET_BOOL " - "ask_revocation_reason.okay")) { - proc->write("y\n"); - } - } - }); + GpgCommandExecutor::GetInstance().ExecuteSync( + {ctx_.GetInfo().AppPath, + {"--command-fd", "0", "--status-fd", "1", "--no-tty", "-o", + output_file_path, "--gen-revoke", key.GetFingerprint().c_str()}, + [=](int exit_code, const std::string& p_out, const std::string& p_err) { + if (exit_code != 0) { + SPDLOG_ERROR( + "gnupg gen revoke execute error, process stderr: {}, process " + "stdout: {}", + p_err, p_out); + } else { + SPDLOG_DEBUG( + "gnupg gen revoke exit_code: {}, process stdout size: {}", + exit_code, p_out.size()); + } + }, + [](QProcess* proc) -> void { + // Code From Gpg4Win + while (proc->canReadLine()) { + const QString line = QString::fromUtf8(proc->readLine()).trimmed(); + SPDLOG_DEBUG("line: {}", line.toStdString()); + if (line == QLatin1String("[GNUPG:] GET_BOOL gen_revoke.okay")) { + proc->write("y\n"); + } else if (line == QLatin1String("[GNUPG:] GET_LINE " + "ask_revocation_reason.code")) { + proc->write("0\n"); + } else if (line == QLatin1String("[GNUPG:] GET_LINE " + "ask_revocation_reason.text")) { + proc->write("\n"); + } else if (line == + QLatin1String( + "[GNUPG:] GET_BOOL openfile.overwrite.okay")) { + // We asked before + proc->write("y\n"); + } else if (line == QLatin1String("[GNUPG:] GET_BOOL " + "ask_revocation_reason.okay")) { + proc->write("y\n"); + } + } + }}); } /** -- cgit v1.2.3 From b7ceed0b87752077fe19fefe9b0df8ec27ce0531 Mon Sep 17 00:00:00 2001 From: saturneric Date: Wed, 25 Oct 2023 22:28:25 +0800 Subject: feat: moving gnupg info gathering logic to a new module --- src/core/function/gpg/GpgKeyOpera.cpp | 58 ++++++++++++++++++++++------------- 1 file changed, 36 insertions(+), 22 deletions(-) (limited to 'src/core/function/gpg/GpgKeyOpera.cpp') diff --git a/src/core/function/gpg/GpgKeyOpera.cpp b/src/core/function/gpg/GpgKeyOpera.cpp index bdce3831..1d31bb1d 100644 --- a/src/core/function/gpg/GpgKeyOpera.cpp +++ b/src/core/function/gpg/GpgKeyOpera.cpp @@ -28,28 +28,28 @@ #include "GpgKeyOpera.h" +#include #include #include #include #include -#include -#include -#include #include "GpgCommandExecutor.h" #include "GpgKeyGetter.h" #include "core/GpgConstants.h" #include "core/GpgGenKeyInfo.h" +#include "core/module/ModuleManager.h" -GpgFrontend::GpgKeyOpera::GpgKeyOpera(int channel) +namespace GpgFrontend { + +GpgKeyOpera::GpgKeyOpera(int channel) : SingletonFunctionObject(channel) {} /** * Delete keys * @param uidList key ids */ -void GpgFrontend::GpgKeyOpera::DeleteKeys( - GpgFrontend::KeyIdArgsListPtr key_ids) { +void GpgKeyOpera::DeleteKeys(GpgFrontend::KeyIdArgsListPtr key_ids) { GpgError err; for (const auto& tmp : *key_ids) { auto key = GpgKeyGetter::GetInstance().GetKey(tmp); @@ -72,7 +72,7 @@ void GpgFrontend::GpgKeyOpera::DeleteKeys( * @param expires date and time * @return if successful */ -GpgFrontend::GpgError GpgFrontend::GpgKeyOpera::SetExpire( +GpgError GpgKeyOpera::SetExpire( const GpgKey& key, const SubkeyId& subkey_fpr, std::unique_ptr& expires) { unsigned long expires_time = 0; @@ -102,11 +102,13 @@ GpgFrontend::GpgError GpgFrontend::GpgKeyOpera::SetExpire( * @param outputFileName out file name(path) * @return the process doing this job */ -void GpgFrontend::GpgKeyOpera::GenerateRevokeCert( - const GpgKey& key, const std::string& output_file_path) { +void GpgKeyOpera::GenerateRevokeCert(const GpgKey& key, + const std::string& output_file_path) { + const auto app_path = Module::RetrieveRTValueTypedOrDefault<>( + "core", "gpgme.ctx.app_path", std::string{}); // get all components GpgCommandExecutor::GetInstance().ExecuteSync( - {ctx_.GetInfo().AppPath, + {app_path, {"--command-fd", "0", "--status-fd", "1", "--no-tty", "-o", output_file_path, "--gen-revoke", key.GetFingerprint().c_str()}, [=](int exit_code, const std::string& p_out, const std::string& p_err) { @@ -152,8 +154,8 @@ void GpgFrontend::GpgKeyOpera::GenerateRevokeCert( * @param params key generation args * @return error information */ -GpgFrontend::GpgError GpgFrontend::GpgKeyOpera::GenerateKey( - const std::unique_ptr& params, GpgGenKeyResult& result) { +GpgError GpgKeyOpera::GenerateKey(const std::unique_ptr& params, + GpgGenKeyResult& result) { auto userid_utf8 = params->GetUserid(); const char* userid = userid_utf8.c_str(); auto algo_utf8 = params->GetAlgo() + params->GetKeySizeStr(); @@ -171,9 +173,11 @@ GpgFrontend::GpgError GpgFrontend::GpgKeyOpera::GenerateKey( GpgError err; - SPDLOG_DEBUG("ctx version, {}", ctx_.GetInfo(false).GnupgVersion); + const auto gnupg_version = Module::RetrieveRTValueTypedOrDefault<>( + "core", "gpgme.ctx.gnupg_version", std::string{"2.0.0"}); + SPDLOG_DEBUG("got gnupg version from rt: {}", gnupg_version); - if (ctx_.GetInfo(false).GnupgVersion >= "2.1.0") { + if (software_version_compare(gnupg_version, "2.1.0") >= 0) { unsigned int flags = 0; if (!params->IsSubKey()) flags |= GPGME_CREATE_CERT; @@ -231,7 +235,7 @@ GpgFrontend::GpgError GpgFrontend::GpgKeyOpera::GenerateKey( * @param params opera args * @return error info */ -GpgFrontend::GpgError GpgFrontend::GpgKeyOpera::GenerateSubkey( +GpgError GpgKeyOpera::GenerateSubkey( const GpgKey& key, const std::unique_ptr& params) { if (!params->IsSubKey()) return GPG_ERR_CANCELED; @@ -263,27 +267,37 @@ GpgFrontend::GpgError GpgFrontend::GpgKeyOpera::GenerateSubkey( return check_gpg_error(err); } -GpgFrontend::GpgError GpgFrontend::GpgKeyOpera::ModifyPassword( - const GpgFrontend::GpgKey& key) { - if (ctx_.GetInfo(false).GnupgVersion < "2.0.15") { +GpgError GpgKeyOpera::ModifyPassword(const GpgKey& key) { + const auto gnupg_version = Module::RetrieveRTValueTypedOrDefault<>( + "core", "gpgme.ctx.gnupg_version", std::string{"2.0.0"}); + SPDLOG_DEBUG("got gnupg version from rt: {}", gnupg_version); + + if (software_version_compare(gnupg_version, "2.0.15") < 0) { SPDLOG_ERROR("operator not support"); return GPG_ERR_NOT_SUPPORTED; } auto err = gpgme_op_passwd(ctx_, gpgme_key_t(key), 0); return check_gpg_error(err); } -GpgFrontend::GpgError GpgFrontend::GpgKeyOpera::ModifyTOFUPolicy( - const GpgFrontend::GpgKey& key, gpgme_tofu_policy_t tofu_policy) { - if (ctx_.GetInfo(false).GnupgVersion < "2.1.10") { + +GpgError GpgKeyOpera::ModifyTOFUPolicy(const GpgKey& key, + gpgme_tofu_policy_t tofu_policy) { + const auto gnupg_version = Module::RetrieveRTValueTypedOrDefault<>( + "core", "gpgme.ctx.gnupg_version", std::string{"2.0.0"}); + SPDLOG_DEBUG("got gnupg version from rt: {}", gnupg_version); + + if (software_version_compare(gnupg_version, "2.1.10") < 0) { SPDLOG_ERROR("operator not support"); return GPG_ERR_NOT_SUPPORTED; } + auto err = gpgme_op_tofu_policy(ctx_, gpgme_key_t(key), tofu_policy); return check_gpg_error(err); } -void GpgFrontend::GpgKeyOpera::DeleteKey(const GpgFrontend::KeyId& key_id) { +void GpgKeyOpera::DeleteKey(const GpgFrontend::KeyId& key_id) { auto keys = std::make_unique(); keys->push_back(key_id); DeleteKeys(std::move(keys)); } +} // namespace GpgFrontend -- cgit v1.2.3 From 41c12e92031284e357bab04fe6e08b45c6dd3ba8 Mon Sep 17 00:00:00 2001 From: saturneric Date: Fri, 27 Oct 2023 21:21:03 +0800 Subject: feat: improve thread system and gathering gnupg options info to rt --- src/core/function/gpg/GpgKeyOpera.cpp | 1 + 1 file changed, 1 insertion(+) (limited to 'src/core/function/gpg/GpgKeyOpera.cpp') diff --git a/src/core/function/gpg/GpgKeyOpera.cpp b/src/core/function/gpg/GpgKeyOpera.cpp index 1d31bb1d..eb7dfe9f 100644 --- a/src/core/function/gpg/GpgKeyOpera.cpp +++ b/src/core/function/gpg/GpgKeyOpera.cpp @@ -123,6 +123,7 @@ void GpgKeyOpera::GenerateRevokeCert(const GpgKey& key, exit_code, p_out.size()); } }, + nullptr, [](QProcess* proc) -> void { // Code From Gpg4Win while (proc->canReadLine()) { -- cgit v1.2.3 From fd46d4667611c0db9cea3f06205727399b6fb5fd Mon Sep 17 00:00:00 2001 From: saturneric Date: Sun, 29 Oct 2023 02:46:15 +0800 Subject: refactor: start to tidy up code using clang-tidy --- src/core/function/gpg/GpgKeyOpera.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'src/core/function/gpg/GpgKeyOpera.cpp') diff --git a/src/core/function/gpg/GpgKeyOpera.cpp b/src/core/function/gpg/GpgKeyOpera.cpp index eb7dfe9f..9487eede 100644 --- a/src/core/function/gpg/GpgKeyOpera.cpp +++ b/src/core/function/gpg/GpgKeyOpera.cpp @@ -107,7 +107,7 @@ void GpgKeyOpera::GenerateRevokeCert(const GpgKey& key, const auto app_path = Module::RetrieveRTValueTypedOrDefault<>( "core", "gpgme.ctx.app_path", std::string{}); // get all components - GpgCommandExecutor::GetInstance().ExecuteSync( + GpgCommandExecutor::ExecuteSync( {app_path, {"--command-fd", "0", "--status-fd", "1", "--no-tty", "-o", output_file_path, "--gen-revoke", key.GetFingerprint().c_str()}, -- cgit v1.2.3 From 5d7b1d5493df8723259eca0613a9ce0af6077289 Mon Sep 17 00:00:00 2001 From: saturneric Date: Mon, 30 Oct 2023 14:52:29 +0800 Subject: style: improve code style of core --- src/core/function/gpg/GpgKeyOpera.cpp | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) (limited to 'src/core/function/gpg/GpgKeyOpera.cpp') diff --git a/src/core/function/gpg/GpgKeyOpera.cpp b/src/core/function/gpg/GpgKeyOpera.cpp index 9487eede..4a8874c1 100644 --- a/src/core/function/gpg/GpgKeyOpera.cpp +++ b/src/core/function/gpg/GpgKeyOpera.cpp @@ -54,7 +54,7 @@ void GpgKeyOpera::DeleteKeys(GpgFrontend::KeyIdArgsListPtr key_ids) { for (const auto& tmp : *key_ids) { auto key = GpgKeyGetter::GetInstance().GetKey(tmp); if (key.IsGood()) { - err = check_gpg_error( + err = CheckGpgError( gpgme_op_delete_ext(ctx_, gpgme_key_t(key), GPGME_DELETE_ALLOW_SECRET | GPGME_DELETE_FORCE)); assert(gpg_err_code(err) == GPG_ERR_NO_ERROR); @@ -178,7 +178,7 @@ GpgError GpgKeyOpera::GenerateKey(const std::unique_ptr& params, "core", "gpgme.ctx.gnupg_version", std::string{"2.0.0"}); SPDLOG_DEBUG("got gnupg version from rt: {}", gnupg_version); - if (software_version_compare(gnupg_version, "2.1.0") >= 0) { + if (CompareSoftwareVersion(gnupg_version, "2.1.0") >= 0) { unsigned int flags = 0; if (!params->IsSubKey()) flags |= GPGME_CREATE_CERT; @@ -222,12 +222,12 @@ GpgError GpgKeyOpera::GenerateKey(const std::unique_ptr& params, err = gpgme_op_genkey(ctx_, ss.str().c_str(), nullptr, nullptr); } - if (check_gpg_error_2_err_code(err) == GPG_ERR_NO_ERROR) { - auto temp_result = _new_result(gpgme_op_genkey_result(ctx_)); + if (CheckGpgError(err) == GPG_ERR_NO_ERROR) { + auto temp_result = NewResult(gpgme_op_genkey_result(ctx_)); std::swap(temp_result, result); } - return check_gpg_error(err); + return CheckGpgError(err); } /** @@ -265,7 +265,7 @@ GpgError GpgKeyOpera::GenerateSubkey( auto err = gpgme_op_createsubkey(ctx_, gpgme_key_t(key), algo, 0, expires, flags); - return check_gpg_error(err); + return CheckGpgError(err); } GpgError GpgKeyOpera::ModifyPassword(const GpgKey& key) { @@ -273,12 +273,12 @@ GpgError GpgKeyOpera::ModifyPassword(const GpgKey& key) { "core", "gpgme.ctx.gnupg_version", std::string{"2.0.0"}); SPDLOG_DEBUG("got gnupg version from rt: {}", gnupg_version); - if (software_version_compare(gnupg_version, "2.0.15") < 0) { + if (CompareSoftwareVersion(gnupg_version, "2.0.15") < 0) { SPDLOG_ERROR("operator not support"); return GPG_ERR_NOT_SUPPORTED; } auto err = gpgme_op_passwd(ctx_, gpgme_key_t(key), 0); - return check_gpg_error(err); + return CheckGpgError(err); } GpgError GpgKeyOpera::ModifyTOFUPolicy(const GpgKey& key, @@ -287,13 +287,13 @@ GpgError GpgKeyOpera::ModifyTOFUPolicy(const GpgKey& key, "core", "gpgme.ctx.gnupg_version", std::string{"2.0.0"}); SPDLOG_DEBUG("got gnupg version from rt: {}", gnupg_version); - if (software_version_compare(gnupg_version, "2.1.10") < 0) { + if (CompareSoftwareVersion(gnupg_version, "2.1.10") < 0) { SPDLOG_ERROR("operator not support"); return GPG_ERR_NOT_SUPPORTED; } auto err = gpgme_op_tofu_policy(ctx_, gpgme_key_t(key), tofu_policy); - return check_gpg_error(err); + return CheckGpgError(err); } void GpgKeyOpera::DeleteKey(const GpgFrontend::KeyId& key_id) { -- cgit v1.2.3 From 0251f35c93e3f0e0a6853a50fb5bd82c1b9e4187 Mon Sep 17 00:00:00 2001 From: saturneric Date: Mon, 6 Nov 2023 17:17:47 +0800 Subject: refactor: clean up core's codes --- src/core/function/gpg/GpgKeyOpera.cpp | 87 ++++++++++++++++++----------------- 1 file changed, 44 insertions(+), 43 deletions(-) (limited to 'src/core/function/gpg/GpgKeyOpera.cpp') diff --git a/src/core/function/gpg/GpgKeyOpera.cpp b/src/core/function/gpg/GpgKeyOpera.cpp index 4a8874c1..1b4d9881 100644 --- a/src/core/function/gpg/GpgKeyOpera.cpp +++ b/src/core/function/gpg/GpgKeyOpera.cpp @@ -34,10 +34,10 @@ #include #include -#include "GpgCommandExecutor.h" -#include "GpgKeyGetter.h" #include "core/GpgConstants.h" -#include "core/GpgGenKeyInfo.h" +#include "core/function/gpg/GpgCommandExecutor.h" +#include "core/function/gpg/GpgKeyGetter.h" +#include "core/model/GpgGenKeyInfo.h" #include "core/module/ModuleManager.h" namespace GpgFrontend { @@ -55,7 +55,7 @@ void GpgKeyOpera::DeleteKeys(GpgFrontend::KeyIdArgsListPtr key_ids) { auto key = GpgKeyGetter::GetInstance().GetKey(tmp); if (key.IsGood()) { err = CheckGpgError( - gpgme_op_delete_ext(ctx_, gpgme_key_t(key), + gpgme_op_delete_ext(ctx_, static_cast(key), GPGME_DELETE_ALLOW_SECRET | GPGME_DELETE_FORCE)); assert(gpg_err_code(err) == GPG_ERR_NO_ERROR); } else { @@ -72,26 +72,26 @@ void GpgKeyOpera::DeleteKeys(GpgFrontend::KeyIdArgsListPtr key_ids) { * @param expires date and time * @return if successful */ -GpgError GpgKeyOpera::SetExpire( - const GpgKey& key, const SubkeyId& subkey_fpr, - std::unique_ptr& expires) { +auto GpgKeyOpera::SetExpire(const GpgKey& key, const SubkeyId& subkey_fpr, + std::unique_ptr& expires) + -> GpgError { unsigned long expires_time = 0; if (expires != nullptr) { - using namespace boost::posix_time; - using namespace std::chrono; - expires_time = - to_time_t(*expires) - system_clock::to_time_t(system_clock::now()); + expires_time = to_time_t(*expires) - std::chrono::system_clock::to_time_t( + std::chrono::system_clock::now()); } SPDLOG_DEBUG(key.GetId(), subkey_fpr, expires_time); GpgError err; - if (key.GetFingerprint() == subkey_fpr || subkey_fpr.empty()) - err = gpgme_op_setexpire(ctx_, gpgme_key_t(key), expires_time, nullptr, 0); - else - err = gpgme_op_setexpire(ctx_, gpgme_key_t(key), expires_time, + if (key.GetFingerprint() == subkey_fpr || subkey_fpr.empty()) { + err = gpgme_op_setexpire(ctx_, static_cast(key), expires_time, + nullptr, 0); + } else { + err = gpgme_op_setexpire(ctx_, static_cast(key), expires_time, subkey_fpr.c_str(), 0); + } return err; } @@ -103,14 +103,14 @@ GpgError GpgKeyOpera::SetExpire( * @return the process doing this job */ void GpgKeyOpera::GenerateRevokeCert(const GpgKey& key, - const std::string& output_file_path) { + const std::string& output_path) { const auto app_path = Module::RetrieveRTValueTypedOrDefault<>( "core", "gpgme.ctx.app_path", std::string{}); // get all components GpgCommandExecutor::ExecuteSync( {app_path, - {"--command-fd", "0", "--status-fd", "1", "--no-tty", "-o", - output_file_path, "--gen-revoke", key.GetFingerprint().c_str()}, + {"--command-fd", "0", "--status-fd", "1", "--no-tty", "-o", output_path, + "--gen-revoke", key.GetFingerprint()}, [=](int exit_code, const std::string& p_out, const std::string& p_err) { if (exit_code != 0) { SPDLOG_ERROR( @@ -155,8 +155,8 @@ void GpgKeyOpera::GenerateRevokeCert(const GpgKey& key, * @param params key generation args * @return error information */ -GpgError GpgKeyOpera::GenerateKey(const std::unique_ptr& params, - GpgGenKeyResult& result) { +auto GpgKeyOpera::GenerateKey(const std::unique_ptr& params, + GpgGenKeyResult& result) -> GpgError { auto userid_utf8 = params->GetUserid(); const char* userid = userid_utf8.c_str(); auto algo_utf8 = params->GetAlgo() + params->GetKeySizeStr(); @@ -165,12 +165,9 @@ GpgError GpgKeyOpera::GenerateKey(const std::unique_ptr& params, const char* algo = algo_utf8.c_str(); unsigned long expires = 0; - { - using namespace boost::posix_time; - using namespace std::chrono; - expires = to_time_t(ptime(params->GetExpireTime())) - - system_clock::to_time_t(system_clock::now()); - } + expires = + to_time_t(boost::posix_time::ptime(params->GetExpireTime())) - + std::chrono::system_clock::to_time_t(std::chrono ::system_clock::now()); GpgError err; @@ -210,10 +207,12 @@ GpgError GpgKeyOpera::GenerateKey(const std::unique_ptr& params, if (!params->IsNonExpired()) { auto date = params->GetExpireTime().date(); ss << boost::format{"Expire-Date: %1%\n"} % to_iso_string(date); - } else + } else { ss << boost::format{"Expire-Date: 0\n"}; - if (!params->IsNoPassPhrase()) + } + if (!params->IsNoPassPhrase()) { ss << boost::format{"Passphrase: %1%\n"} % params->GetPassPhrase(); + } ss << ""; @@ -236,8 +235,9 @@ GpgError GpgKeyOpera::GenerateKey(const std::unique_ptr& params, * @param params opera args * @return error info */ -GpgError GpgKeyOpera::GenerateSubkey( - const GpgKey& key, const std::unique_ptr& params) { +auto GpgKeyOpera::GenerateSubkey(const GpgKey& key, + const std::unique_ptr& params) + -> GpgError { if (!params->IsSubKey()) return GPG_ERR_CANCELED; SPDLOG_DEBUG("generate subkey algo {} key size {}", params->GetAlgo(), @@ -246,12 +246,11 @@ GpgError GpgKeyOpera::GenerateSubkey( auto algo_utf8 = (params->GetAlgo() + params->GetKeySizeStr()); const char* algo = algo_utf8.c_str(); unsigned long expires = 0; - { - using namespace boost::posix_time; - using namespace std::chrono; - expires = to_time_t(ptime(params->GetExpireTime())) - - system_clock::to_time_t(system_clock::now()); - } + + expires = + to_time_t(boost::posix_time::ptime(params->GetExpireTime())) - + std::chrono::system_clock::to_time_t(std::chrono::system_clock::now()); + unsigned int flags = 0; if (!params->IsSubKey()) flags |= GPGME_CREATE_CERT; @@ -263,12 +262,12 @@ GpgError GpgKeyOpera::GenerateSubkey( SPDLOG_DEBUG("args: {} {} {} {}", key.GetId(), algo, expires, flags); - auto err = - gpgme_op_createsubkey(ctx_, gpgme_key_t(key), algo, 0, expires, flags); + auto err = gpgme_op_createsubkey(ctx_, static_cast(key), algo, 0, + expires, flags); return CheckGpgError(err); } -GpgError GpgKeyOpera::ModifyPassword(const GpgKey& key) { +auto GpgKeyOpera::ModifyPassword(const GpgKey& key) -> GpgError { const auto gnupg_version = Module::RetrieveRTValueTypedOrDefault<>( "core", "gpgme.ctx.gnupg_version", std::string{"2.0.0"}); SPDLOG_DEBUG("got gnupg version from rt: {}", gnupg_version); @@ -277,12 +276,13 @@ GpgError GpgKeyOpera::ModifyPassword(const GpgKey& key) { SPDLOG_ERROR("operator not support"); return GPG_ERR_NOT_SUPPORTED; } - auto err = gpgme_op_passwd(ctx_, gpgme_key_t(key), 0); + auto err = gpgme_op_passwd(ctx_, static_cast(key), 0); return CheckGpgError(err); } -GpgError GpgKeyOpera::ModifyTOFUPolicy(const GpgKey& key, - gpgme_tofu_policy_t tofu_policy) { +auto GpgKeyOpera::ModifyTOFUPolicy(const GpgKey& key, + gpgme_tofu_policy_t tofu_policy) + -> GpgError { const auto gnupg_version = Module::RetrieveRTValueTypedOrDefault<>( "core", "gpgme.ctx.gnupg_version", std::string{"2.0.0"}); SPDLOG_DEBUG("got gnupg version from rt: {}", gnupg_version); @@ -292,7 +292,8 @@ GpgError GpgKeyOpera::ModifyTOFUPolicy(const GpgKey& key, return GPG_ERR_NOT_SUPPORTED; } - auto err = gpgme_op_tofu_policy(ctx_, gpgme_key_t(key), tofu_policy); + auto err = + gpgme_op_tofu_policy(ctx_, static_cast(key), tofu_policy); return CheckGpgError(err); } -- cgit v1.2.3 From 889cb8092381b073a0f4a0411a4ede04cd7bdd14 Mon Sep 17 00:00:00 2001 From: saturneric Date: Mon, 6 Nov 2023 20:49:44 +0800 Subject: refactor: improve the code structure of core --- src/core/function/gpg/GpgKeyOpera.cpp | 3 +++ 1 file changed, 3 insertions(+) (limited to 'src/core/function/gpg/GpgKeyOpera.cpp') diff --git a/src/core/function/gpg/GpgKeyOpera.cpp b/src/core/function/gpg/GpgKeyOpera.cpp index 1b4d9881..c31a79e3 100644 --- a/src/core/function/gpg/GpgKeyOpera.cpp +++ b/src/core/function/gpg/GpgKeyOpera.cpp @@ -37,8 +37,11 @@ #include "core/GpgConstants.h" #include "core/function/gpg/GpgCommandExecutor.h" #include "core/function/gpg/GpgKeyGetter.h" +#include "core/function/result_analyse/GpgResultAnalyse.h" #include "core/model/GpgGenKeyInfo.h" #include "core/module/ModuleManager.h" +#include "core/utils/CommonUtils.h" +#include "core/utils/GpgUtils.h" namespace GpgFrontend { -- cgit v1.2.3 From 4dcd2ac8c4f673fc21c4cf0072d6cb648ca64e7e Mon Sep 17 00:00:00 2001 From: saturneric Date: Tue, 7 Nov 2023 15:57:28 +0800 Subject: refactor: separate typedef and impl --- src/core/function/gpg/GpgKeyOpera.cpp | 1 + 1 file changed, 1 insertion(+) (limited to 'src/core/function/gpg/GpgKeyOpera.cpp') diff --git a/src/core/function/gpg/GpgKeyOpera.cpp b/src/core/function/gpg/GpgKeyOpera.cpp index c31a79e3..e48a84d8 100644 --- a/src/core/function/gpg/GpgKeyOpera.cpp +++ b/src/core/function/gpg/GpgKeyOpera.cpp @@ -35,6 +35,7 @@ #include #include "core/GpgConstants.h" +#include "core/GpgModel.h" #include "core/function/gpg/GpgCommandExecutor.h" #include "core/function/gpg/GpgKeyGetter.h" #include "core/function/result_analyse/GpgResultAnalyse.h" -- cgit v1.2.3 From 0ec3358e4cfce7ad242e851c450292a25619221e Mon Sep 17 00:00:00 2001 From: saturneric Date: Sat, 2 Dec 2023 06:01:16 -0800 Subject: feat: add buddled qt pinentry and make it works --- src/core/function/gpg/GpgKeyOpera.cpp | 31 +++++++++++++++++++++++++++---- 1 file changed, 27 insertions(+), 4 deletions(-) (limited to 'src/core/function/gpg/GpgKeyOpera.cpp') diff --git a/src/core/function/gpg/GpgKeyOpera.cpp b/src/core/function/gpg/GpgKeyOpera.cpp index e48a84d8..64f33373 100644 --- a/src/core/function/gpg/GpgKeyOpera.cpp +++ b/src/core/function/gpg/GpgKeyOpera.cpp @@ -28,6 +28,9 @@ #include "GpgKeyOpera.h" +#include +#include + #include #include #include @@ -41,8 +44,12 @@ #include "core/function/result_analyse/GpgResultAnalyse.h" #include "core/model/GpgGenKeyInfo.h" #include "core/module/ModuleManager.h" +#include "core/thread/Task.h" +#include "core/thread/TaskRunnerGetter.h" #include "core/utils/CommonUtils.h" #include "core/utils/GpgUtils.h" +#include "model/DataObject.h" +#include "spdlog/spdlog.h" namespace GpgFrontend { @@ -271,17 +278,33 @@ auto GpgKeyOpera::GenerateSubkey(const GpgKey& key, return CheckGpgError(err); } -auto GpgKeyOpera::ModifyPassword(const GpgKey& key) -> GpgError { +void GpgKeyOpera::ModifyPassword(const GpgKey& key, + std::function callback) { const auto gnupg_version = Module::RetrieveRTValueTypedOrDefault<>( "core", "gpgme.ctx.gnupg_version", std::string{"2.0.0"}); SPDLOG_DEBUG("got gnupg version from rt: {}", gnupg_version); if (CompareSoftwareVersion(gnupg_version, "2.0.15") < 0) { SPDLOG_ERROR("operator not support"); - return GPG_ERR_NOT_SUPPORTED; + callback(GPG_ERR_NOT_SUPPORTED); + return; } - auto err = gpgme_op_passwd(ctx_, static_cast(key), 0); - return CheckGpgError(err); + + auto *task = new Thread::Task( + [&](const DataObjectPtr& data_object) -> int { + auto err = gpgme_op_passwd(ctx_, static_cast(key), 0); + data_object->Swap({err}); + return 0; + }, + "gpgme_op_passwd", TransferParams(), + [=](int, const DataObjectPtr& data_object) { + SPDLOG_DEBUG("callback called"); + callback(ExtractParams(data_object, 0)); + }); + + Thread::TaskRunnerGetter::GetInstance() + .GetTaskRunner(Thread::TaskRunnerGetter::kTaskRunnerType_GPG) + ->PostTask(task); } auto GpgKeyOpera::ModifyTOFUPolicy(const GpgKey& key, -- cgit v1.2.3 From e0bc882bd46c40c86d9497fa043bbfe3e469888f Mon Sep 17 00:00:00 2001 From: saturneric Date: Sat, 2 Dec 2023 23:28:41 -0800 Subject: feat: introduce mimalloc to replace secmem --- src/core/function/gpg/GpgKeyOpera.cpp | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) (limited to 'src/core/function/gpg/GpgKeyOpera.cpp') diff --git a/src/core/function/gpg/GpgKeyOpera.cpp b/src/core/function/gpg/GpgKeyOpera.cpp index 64f33373..751d4f51 100644 --- a/src/core/function/gpg/GpgKeyOpera.cpp +++ b/src/core/function/gpg/GpgKeyOpera.cpp @@ -49,7 +49,6 @@ #include "core/utils/CommonUtils.h" #include "core/utils/GpgUtils.h" #include "model/DataObject.h" -#include "spdlog/spdlog.h" namespace GpgFrontend { @@ -290,7 +289,7 @@ void GpgKeyOpera::ModifyPassword(const GpgKey& key, return; } - auto *task = new Thread::Task( + auto* task = new Thread::Task( [&](const DataObjectPtr& data_object) -> int { auto err = gpgme_op_passwd(ctx_, static_cast(key), 0); data_object->Swap({err}); -- cgit v1.2.3 From 883db05d54510e76b6548e107593187e1306117d Mon Sep 17 00:00:00 2001 From: saturneric Date: Sun, 3 Dec 2023 04:28:46 -0800 Subject: feat: general improvements of aync execution and memory security --- src/core/function/gpg/GpgKeyOpera.cpp | 216 +++++++++++++--------------------- 1 file changed, 84 insertions(+), 132 deletions(-) (limited to 'src/core/function/gpg/GpgKeyOpera.cpp') diff --git a/src/core/function/gpg/GpgKeyOpera.cpp b/src/core/function/gpg/GpgKeyOpera.cpp index 751d4f51..1c4c78a5 100644 --- a/src/core/function/gpg/GpgKeyOpera.cpp +++ b/src/core/function/gpg/GpgKeyOpera.cpp @@ -29,26 +29,25 @@ #include "GpgKeyOpera.h" #include -#include #include #include #include #include #include +#include -#include "core/GpgConstants.h" #include "core/GpgModel.h" #include "core/function/gpg/GpgCommandExecutor.h" #include "core/function/gpg/GpgKeyGetter.h" #include "core/function/result_analyse/GpgResultAnalyse.h" +#include "core/model/DataObject.h" #include "core/model/GpgGenKeyInfo.h" #include "core/module/ModuleManager.h" -#include "core/thread/Task.h" -#include "core/thread/TaskRunnerGetter.h" +#include "core/utils/AsyncUtils.h" #include "core/utils/CommonUtils.h" #include "core/utils/GpgUtils.h" -#include "model/DataObject.h" +#include "typedef/GpgTypedef.h" namespace GpgFrontend { @@ -165,78 +164,46 @@ void GpgKeyOpera::GenerateRevokeCert(const GpgKey& key, * @param params key generation args * @return error information */ -auto GpgKeyOpera::GenerateKey(const std::unique_ptr& params, - GpgGenKeyResult& result) -> GpgError { - auto userid_utf8 = params->GetUserid(); - const char* userid = userid_utf8.c_str(); - auto algo_utf8 = params->GetAlgo() + params->GetKeySizeStr(); - - SPDLOG_DEBUG("params: {} {}", params->GetAlgo(), params->GetKeySizeStr()); - - const char* algo = algo_utf8.c_str(); - unsigned long expires = 0; - expires = - to_time_t(boost::posix_time::ptime(params->GetExpireTime())) - - std::chrono::system_clock::to_time_t(std::chrono ::system_clock::now()); - - GpgError err; - - const auto gnupg_version = Module::RetrieveRTValueTypedOrDefault<>( - "core", "gpgme.ctx.gnupg_version", std::string{"2.0.0"}); - SPDLOG_DEBUG("got gnupg version from rt: {}", gnupg_version); - - if (CompareSoftwareVersion(gnupg_version, "2.1.0") >= 0) { - unsigned int flags = 0; - - if (!params->IsSubKey()) flags |= GPGME_CREATE_CERT; - if (params->IsAllowEncryption()) flags |= GPGME_CREATE_ENCR; - if (params->IsAllowSigning()) flags |= GPGME_CREATE_SIGN; - if (params->IsAllowAuthentication()) flags |= GPGME_CREATE_AUTH; - if (params->IsNonExpired()) flags |= GPGME_CREATE_NOEXPIRE; - if (params->IsNoPassPhrase()) flags |= GPGME_CREATE_NOPASSWD; - - SPDLOG_DEBUG("args: {}", userid, algo, expires, flags); - - err = gpgme_op_createkey(ctx_, userid, algo, 0, expires, nullptr, flags); - - } else { - std::stringstream ss; - auto param_format = - boost::format{ - "\n" - "Key-Type: %1%\n" - "Key-Usage: sign\n" - "Key-Length: %2%\n" - "Name-Real: %3%\n" - "Name-Comment: %4%\n" - "Name-Email: %5%\n"} % - params->GetAlgo() % params->GetKeyLength() % params->GetName() % - params->GetComment() % params->GetEmail(); - ss << param_format; - - if (!params->IsNonExpired()) { - auto date = params->GetExpireTime().date(); - ss << boost::format{"Expire-Date: %1%\n"} % to_iso_string(date); - } else { - ss << boost::format{"Expire-Date: 0\n"}; - } - if (!params->IsNoPassPhrase()) { - ss << boost::format{"Passphrase: %1%\n"} % params->GetPassPhrase(); - } - - ss << ""; - - SPDLOG_DEBUG("params: {}", ss.str()); - - err = gpgme_op_genkey(ctx_, ss.str().c_str(), nullptr, nullptr); - } - - if (CheckGpgError(err) == GPG_ERR_NO_ERROR) { - auto temp_result = NewResult(gpgme_op_genkey_result(ctx_)); - std::swap(temp_result, result); - } - - return CheckGpgError(err); +void GpgKeyOpera::GenerateKey(const std::shared_ptr& params, + const GpgOperationCallback& callback) { + RunGpgOperaAsync( + [&ctx = ctx_, params](const DataObjectPtr& data_object) -> GpgError { + auto userid_utf8 = params->GetUserid(); + const char* userid = userid_utf8.c_str(); + auto algo_utf8 = params->GetAlgo() + params->GetKeySizeStr(); + + SPDLOG_DEBUG("params: {} {}", params->GetAlgo(), + params->GetKeySizeStr()); + + const char* algo = algo_utf8.c_str(); + unsigned long expires = 0; + expires = to_time_t(boost::posix_time::ptime(params->GetExpireTime())) - + std::chrono::system_clock::to_time_t( + std::chrono ::system_clock::now()); + + GpgError err; + unsigned int flags = 0; + + if (!params->IsSubKey()) flags |= GPGME_CREATE_CERT; + if (params->IsAllowEncryption()) flags |= GPGME_CREATE_ENCR; + if (params->IsAllowSigning()) flags |= GPGME_CREATE_SIGN; + if (params->IsAllowAuthentication()) flags |= GPGME_CREATE_AUTH; + if (params->IsNonExpired()) flags |= GPGME_CREATE_NOEXPIRE; + if (params->IsNoPassPhrase()) flags |= GPGME_CREATE_NOPASSWD; + + SPDLOG_DEBUG("key generation args: {}", userid, algo, expires, flags); + err = gpgme_op_createkey(ctx, userid, algo, 0, expires, nullptr, flags); + + GpgGenKeyResult result; + if (CheckGpgError(err) == GPG_ERR_NO_ERROR) { + auto temp_result = NewResult(gpgme_op_genkey_result(ctx)); + std::swap(temp_result, result); + } + data_object->Swap({result}); + + return CheckGpgError(err); + }, + callback, "gpgme_op_passwd", "2.1.0"); } /** @@ -245,65 +212,50 @@ auto GpgKeyOpera::GenerateKey(const std::unique_ptr& params, * @param params opera args * @return error info */ -auto GpgKeyOpera::GenerateSubkey(const GpgKey& key, - const std::unique_ptr& params) - -> GpgError { - if (!params->IsSubKey()) return GPG_ERR_CANCELED; - - SPDLOG_DEBUG("generate subkey algo {} key size {}", params->GetAlgo(), - params->GetKeySizeStr()); - - auto algo_utf8 = (params->GetAlgo() + params->GetKeySizeStr()); - const char* algo = algo_utf8.c_str(); - unsigned long expires = 0; - - expires = - to_time_t(boost::posix_time::ptime(params->GetExpireTime())) - - std::chrono::system_clock::to_time_t(std::chrono::system_clock::now()); - - unsigned int flags = 0; - - if (!params->IsSubKey()) flags |= GPGME_CREATE_CERT; - if (params->IsAllowEncryption()) flags |= GPGME_CREATE_ENCR; - if (params->IsAllowSigning()) flags |= GPGME_CREATE_SIGN; - if (params->IsAllowAuthentication()) flags |= GPGME_CREATE_AUTH; - if (params->IsNonExpired()) flags |= GPGME_CREATE_NOEXPIRE; - if (params->IsNoPassPhrase()) flags |= GPGME_CREATE_NOPASSWD; - - SPDLOG_DEBUG("args: {} {} {} {}", key.GetId(), algo, expires, flags); - - auto err = gpgme_op_createsubkey(ctx_, static_cast(key), algo, 0, - expires, flags); - return CheckGpgError(err); +void GpgKeyOpera::GenerateSubkey(const GpgKey& key, + const std::shared_ptr& params, + const GpgOperationCallback& callback) { + RunGpgOperaAsync( + [key = key.Copy(), &ctx = ctx_, + params](const DataObjectPtr&) -> GpgError { + if (!params->IsSubKey()) return GPG_ERR_CANCELED; + + SPDLOG_DEBUG("generate subkey algo {} key size {}", params->GetAlgo(), + params->GetKeySizeStr()); + + auto algo_utf8 = (params->GetAlgo() + params->GetKeySizeStr()); + const char* algo = algo_utf8.c_str(); + unsigned long expires = 0; + + expires = to_time_t(boost::posix_time::ptime(params->GetExpireTime())) - + std::chrono::system_clock::to_time_t( + std::chrono::system_clock::now()); + + unsigned int flags = 0; + + if (!params->IsSubKey()) flags |= GPGME_CREATE_CERT; + if (params->IsAllowEncryption()) flags |= GPGME_CREATE_ENCR; + if (params->IsAllowSigning()) flags |= GPGME_CREATE_SIGN; + if (params->IsAllowAuthentication()) flags |= GPGME_CREATE_AUTH; + if (params->IsNonExpired()) flags |= GPGME_CREATE_NOEXPIRE; + if (params->IsNoPassPhrase()) flags |= GPGME_CREATE_NOPASSWD; + + SPDLOG_DEBUG("args: {} {} {} {}", key.GetId(), algo, expires, flags); + + auto err = gpgme_op_createsubkey(ctx, static_cast(key), + algo, 0, expires, flags); + return CheckGpgError(err); + }, + callback, "gpgme_op_createsubkey", "2.1.13"); } void GpgKeyOpera::ModifyPassword(const GpgKey& key, - std::function callback) { - const auto gnupg_version = Module::RetrieveRTValueTypedOrDefault<>( - "core", "gpgme.ctx.gnupg_version", std::string{"2.0.0"}); - SPDLOG_DEBUG("got gnupg version from rt: {}", gnupg_version); - - if (CompareSoftwareVersion(gnupg_version, "2.0.15") < 0) { - SPDLOG_ERROR("operator not support"); - callback(GPG_ERR_NOT_SUPPORTED); - return; - } - - auto* task = new Thread::Task( - [&](const DataObjectPtr& data_object) -> int { - auto err = gpgme_op_passwd(ctx_, static_cast(key), 0); - data_object->Swap({err}); - return 0; + const GpgOperationCallback& callback) { + RunGpgOperaAsync( + [&key, &ctx = ctx_](const DataObjectPtr&) -> GpgError { + return gpgme_op_passwd(ctx, static_cast(key), 0); }, - "gpgme_op_passwd", TransferParams(), - [=](int, const DataObjectPtr& data_object) { - SPDLOG_DEBUG("callback called"); - callback(ExtractParams(data_object, 0)); - }); - - Thread::TaskRunnerGetter::GetInstance() - .GetTaskRunner(Thread::TaskRunnerGetter::kTaskRunnerType_GPG) - ->PostTask(task); + callback, "gpgme_op_passwd", "2.0.15"); } auto GpgKeyOpera::ModifyTOFUPolicy(const GpgKey& key, -- cgit v1.2.3 From d0602f09564d3d200b20e83a977315134ced842e Mon Sep 17 00:00:00 2001 From: saturneric Date: Sun, 3 Dec 2023 05:01:27 -0800 Subject: fix: slove issues in key/subkey generation --- src/core/function/gpg/GpgKeyOpera.cpp | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) (limited to 'src/core/function/gpg/GpgKeyOpera.cpp') diff --git a/src/core/function/gpg/GpgKeyOpera.cpp b/src/core/function/gpg/GpgKeyOpera.cpp index 1c4c78a5..b4aa85eb 100644 --- a/src/core/function/gpg/GpgKeyOpera.cpp +++ b/src/core/function/gpg/GpgKeyOpera.cpp @@ -216,8 +216,7 @@ void GpgKeyOpera::GenerateSubkey(const GpgKey& key, const std::shared_ptr& params, const GpgOperationCallback& callback) { RunGpgOperaAsync( - [key = key.Copy(), &ctx = ctx_, - params](const DataObjectPtr&) -> GpgError { + [key, &ctx = ctx_, params](const DataObjectPtr&) -> GpgError { if (!params->IsSubKey()) return GPG_ERR_CANCELED; SPDLOG_DEBUG("generate subkey algo {} key size {}", params->GetAlgo(), -- cgit v1.2.3 From 054e6e28cca2517dda2319ef683314b3318c39a6 Mon Sep 17 00:00:00 2001 From: saturneric Date: Sun, 3 Dec 2023 12:25:21 -0800 Subject: feat: standarized and speed up app env loading process --- src/core/function/gpg/GpgKeyOpera.cpp | 34 ++++++++++++++++++++-------------- 1 file changed, 20 insertions(+), 14 deletions(-) (limited to 'src/core/function/gpg/GpgKeyOpera.cpp') diff --git a/src/core/function/gpg/GpgKeyOpera.cpp b/src/core/function/gpg/GpgKeyOpera.cpp index b4aa85eb..a89badc6 100644 --- a/src/core/function/gpg/GpgKeyOpera.cpp +++ b/src/core/function/gpg/GpgKeyOpera.cpp @@ -63,9 +63,9 @@ void GpgKeyOpera::DeleteKeys(GpgFrontend::KeyIdArgsListPtr key_ids) { for (const auto& tmp : *key_ids) { auto key = GpgKeyGetter::GetInstance().GetKey(tmp); if (key.IsGood()) { - err = CheckGpgError( - gpgme_op_delete_ext(ctx_, static_cast(key), - GPGME_DELETE_ALLOW_SECRET | GPGME_DELETE_FORCE)); + err = CheckGpgError(gpgme_op_delete_ext( + ctx_.DefaultContext(), static_cast(key), + GPGME_DELETE_ALLOW_SECRET | GPGME_DELETE_FORCE)); assert(gpg_err_code(err) == GPG_ERR_NO_ERROR); } else { SPDLOG_WARN("GpgKeyOpera DeleteKeys get key failed", tmp); @@ -95,11 +95,13 @@ auto GpgKeyOpera::SetExpire(const GpgKey& key, const SubkeyId& subkey_fpr, GpgError err; if (key.GetFingerprint() == subkey_fpr || subkey_fpr.empty()) { - err = gpgme_op_setexpire(ctx_, static_cast(key), expires_time, - nullptr, 0); + err = + gpgme_op_setexpire(ctx_.DefaultContext(), static_cast(key), + expires_time, nullptr, 0); } else { - err = gpgme_op_setexpire(ctx_, static_cast(key), expires_time, - subkey_fpr.c_str(), 0); + err = + gpgme_op_setexpire(ctx_.DefaultContext(), static_cast(key), + expires_time, subkey_fpr.c_str(), 0); } return err; @@ -192,11 +194,13 @@ void GpgKeyOpera::GenerateKey(const std::shared_ptr& params, if (params->IsNoPassPhrase()) flags |= GPGME_CREATE_NOPASSWD; SPDLOG_DEBUG("key generation args: {}", userid, algo, expires, flags); - err = gpgme_op_createkey(ctx, userid, algo, 0, expires, nullptr, flags); + err = gpgme_op_createkey(ctx.DefaultContext(), userid, algo, 0, expires, + nullptr, flags); GpgGenKeyResult result; if (CheckGpgError(err) == GPG_ERR_NO_ERROR) { - auto temp_result = NewResult(gpgme_op_genkey_result(ctx)); + auto temp_result = + NewResult(gpgme_op_genkey_result(ctx.DefaultContext())); std::swap(temp_result, result); } data_object->Swap({result}); @@ -241,8 +245,9 @@ void GpgKeyOpera::GenerateSubkey(const GpgKey& key, SPDLOG_DEBUG("args: {} {} {} {}", key.GetId(), algo, expires, flags); - auto err = gpgme_op_createsubkey(ctx, static_cast(key), - algo, 0, expires, flags); + auto err = gpgme_op_createsubkey(ctx.DefaultContext(), + static_cast(key), algo, 0, + expires, flags); return CheckGpgError(err); }, callback, "gpgme_op_createsubkey", "2.1.13"); @@ -252,7 +257,8 @@ void GpgKeyOpera::ModifyPassword(const GpgKey& key, const GpgOperationCallback& callback) { RunGpgOperaAsync( [&key, &ctx = ctx_](const DataObjectPtr&) -> GpgError { - return gpgme_op_passwd(ctx, static_cast(key), 0); + return gpgme_op_passwd(ctx.DefaultContext(), + static_cast(key), 0); }, callback, "gpgme_op_passwd", "2.0.15"); } @@ -269,8 +275,8 @@ auto GpgKeyOpera::ModifyTOFUPolicy(const GpgKey& key, return GPG_ERR_NOT_SUPPORTED; } - auto err = - gpgme_op_tofu_policy(ctx_, static_cast(key), tofu_policy); + auto err = gpgme_op_tofu_policy(ctx_.DefaultContext(), + static_cast(key), tofu_policy); return CheckGpgError(err); } -- cgit v1.2.3 From ee1a6bba20d71e710b169269565202d26794f44e Mon Sep 17 00:00:00 2001 From: saturneric Date: Sat, 23 Dec 2023 00:34:46 +0800 Subject: fix: slove compilation issue on macos --- src/core/function/gpg/GpgKeyOpera.cpp | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) (limited to 'src/core/function/gpg/GpgKeyOpera.cpp') diff --git a/src/core/function/gpg/GpgKeyOpera.cpp b/src/core/function/gpg/GpgKeyOpera.cpp index a89badc6..3ea9b365 100644 --- a/src/core/function/gpg/GpgKeyOpera.cpp +++ b/src/core/function/gpg/GpgKeyOpera.cpp @@ -199,9 +199,7 @@ void GpgKeyOpera::GenerateKey(const std::shared_ptr& params, GpgGenKeyResult result; if (CheckGpgError(err) == GPG_ERR_NO_ERROR) { - auto temp_result = - NewResult(gpgme_op_genkey_result(ctx.DefaultContext())); - std::swap(temp_result, result); + result = NewResult(gpgme_op_genkey_result(ctx.DefaultContext())); } data_object->Swap({result}); -- cgit v1.2.3 From f52e49d37e99be3568d20c658633f1e830b53d13 Mon Sep 17 00:00:00 2001 From: saturneric Date: Sat, 23 Dec 2023 14:05:19 +0800 Subject: fix: gen key test cases typeid rtti issues --- src/core/function/gpg/GpgKeyOpera.cpp | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) (limited to 'src/core/function/gpg/GpgKeyOpera.cpp') diff --git a/src/core/function/gpg/GpgKeyOpera.cpp b/src/core/function/gpg/GpgKeyOpera.cpp index 3ea9b365..378a946d 100644 --- a/src/core/function/gpg/GpgKeyOpera.cpp +++ b/src/core/function/gpg/GpgKeyOpera.cpp @@ -47,6 +47,7 @@ #include "core/utils/AsyncUtils.h" #include "core/utils/CommonUtils.h" #include "core/utils/GpgUtils.h" +#include "model/GpgGenerateKeyResult.h" #include "typedef/GpgTypedef.h" namespace GpgFrontend { @@ -197,11 +198,12 @@ void GpgKeyOpera::GenerateKey(const std::shared_ptr& params, err = gpgme_op_createkey(ctx.DefaultContext(), userid, algo, 0, expires, nullptr, flags); - GpgGenKeyResult result; if (CheckGpgError(err) == GPG_ERR_NO_ERROR) { - result = NewResult(gpgme_op_genkey_result(ctx.DefaultContext())); + data_object->Swap({GpgGenerateKeyResult{ + gpgme_op_genkey_result(ctx.DefaultContext())}}); + } else { + data_object->Swap({GpgGenerateKeyResult{}}); } - data_object->Swap({result}); return CheckGpgError(err); }, -- cgit v1.2.3 From 3c40fa27823e70215261d3845275360f85e59623 Mon Sep 17 00:00:00 2001 From: saturneric Date: Fri, 5 Jan 2024 16:11:24 +0800 Subject: fix: slove some known issues --- src/core/function/gpg/GpgKeyOpera.cpp | 1 - 1 file changed, 1 deletion(-) (limited to 'src/core/function/gpg/GpgKeyOpera.cpp') diff --git a/src/core/function/gpg/GpgKeyOpera.cpp b/src/core/function/gpg/GpgKeyOpera.cpp index 378a946d..c48b75f3 100644 --- a/src/core/function/gpg/GpgKeyOpera.cpp +++ b/src/core/function/gpg/GpgKeyOpera.cpp @@ -40,7 +40,6 @@ #include "core/GpgModel.h" #include "core/function/gpg/GpgCommandExecutor.h" #include "core/function/gpg/GpgKeyGetter.h" -#include "core/function/result_analyse/GpgResultAnalyse.h" #include "core/model/DataObject.h" #include "core/model/GpgGenKeyInfo.h" #include "core/module/ModuleManager.h" -- cgit v1.2.3 From 644aa4397b03dbef73f8bfedc13925b51cad836b Mon Sep 17 00:00:00 2001 From: saturneric Date: Fri, 5 Jan 2024 20:55:15 +0800 Subject: feat: integrate logging api to core --- src/core/function/gpg/GpgKeyOpera.cpp | 28 +++++++++++++++------------- 1 file changed, 15 insertions(+), 13 deletions(-) (limited to 'src/core/function/gpg/GpgKeyOpera.cpp') diff --git a/src/core/function/gpg/GpgKeyOpera.cpp b/src/core/function/gpg/GpgKeyOpera.cpp index c48b75f3..49703781 100644 --- a/src/core/function/gpg/GpgKeyOpera.cpp +++ b/src/core/function/gpg/GpgKeyOpera.cpp @@ -68,7 +68,7 @@ void GpgKeyOpera::DeleteKeys(GpgFrontend::KeyIdArgsListPtr key_ids) { GPGME_DELETE_ALLOW_SECRET | GPGME_DELETE_FORCE)); assert(gpg_err_code(err) == GPG_ERR_NO_ERROR); } else { - SPDLOG_WARN("GpgKeyOpera DeleteKeys get key failed", tmp); + GF_CORE_LOG_WARN("GpgKeyOpera DeleteKeys get key failed", tmp); } } } @@ -91,7 +91,7 @@ auto GpgKeyOpera::SetExpire(const GpgKey& key, const SubkeyId& subkey_fpr, std::chrono::system_clock::now()); } - SPDLOG_DEBUG(key.GetId(), subkey_fpr, expires_time); + GF_CORE_LOG_DEBUG(key.GetId(), subkey_fpr, expires_time); GpgError err; if (key.GetFingerprint() == subkey_fpr || subkey_fpr.empty()) { @@ -124,12 +124,12 @@ void GpgKeyOpera::GenerateRevokeCert(const GpgKey& key, "--gen-revoke", key.GetFingerprint()}, [=](int exit_code, const std::string& p_out, const std::string& p_err) { if (exit_code != 0) { - SPDLOG_ERROR( + GF_CORE_LOG_ERROR( "gnupg gen revoke execute error, process stderr: {}, process " "stdout: {}", p_err, p_out); } else { - SPDLOG_DEBUG( + GF_CORE_LOG_DEBUG( "gnupg gen revoke exit_code: {}, process stdout size: {}", exit_code, p_out.size()); } @@ -139,7 +139,7 @@ void GpgKeyOpera::GenerateRevokeCert(const GpgKey& key, // Code From Gpg4Win while (proc->canReadLine()) { const QString line = QString::fromUtf8(proc->readLine()).trimmed(); - SPDLOG_DEBUG("line: {}", line.toStdString()); + GF_CORE_LOG_DEBUG("line: {}", line.toStdString()); if (line == QLatin1String("[GNUPG:] GET_BOOL gen_revoke.okay")) { proc->write("y\n"); } else if (line == QLatin1String("[GNUPG:] GET_LINE " @@ -174,8 +174,8 @@ void GpgKeyOpera::GenerateKey(const std::shared_ptr& params, const char* userid = userid_utf8.c_str(); auto algo_utf8 = params->GetAlgo() + params->GetKeySizeStr(); - SPDLOG_DEBUG("params: {} {}", params->GetAlgo(), - params->GetKeySizeStr()); + GF_CORE_LOG_DEBUG("params: {} {}", params->GetAlgo(), + params->GetKeySizeStr()); const char* algo = algo_utf8.c_str(); unsigned long expires = 0; @@ -193,7 +193,8 @@ void GpgKeyOpera::GenerateKey(const std::shared_ptr& params, if (params->IsNonExpired()) flags |= GPGME_CREATE_NOEXPIRE; if (params->IsNoPassPhrase()) flags |= GPGME_CREATE_NOPASSWD; - SPDLOG_DEBUG("key generation args: {}", userid, algo, expires, flags); + GF_CORE_LOG_DEBUG("key generation args: {}", userid, algo, expires, + flags); err = gpgme_op_createkey(ctx.DefaultContext(), userid, algo, 0, expires, nullptr, flags); @@ -222,8 +223,8 @@ void GpgKeyOpera::GenerateSubkey(const GpgKey& key, [key, &ctx = ctx_, params](const DataObjectPtr&) -> GpgError { if (!params->IsSubKey()) return GPG_ERR_CANCELED; - SPDLOG_DEBUG("generate subkey algo {} key size {}", params->GetAlgo(), - params->GetKeySizeStr()); + GF_CORE_LOG_DEBUG("generate subkey algo {} key size {}", + params->GetAlgo(), params->GetKeySizeStr()); auto algo_utf8 = (params->GetAlgo() + params->GetKeySizeStr()); const char* algo = algo_utf8.c_str(); @@ -242,7 +243,8 @@ void GpgKeyOpera::GenerateSubkey(const GpgKey& key, if (params->IsNonExpired()) flags |= GPGME_CREATE_NOEXPIRE; if (params->IsNoPassPhrase()) flags |= GPGME_CREATE_NOPASSWD; - SPDLOG_DEBUG("args: {} {} {} {}", key.GetId(), algo, expires, flags); + GF_CORE_LOG_DEBUG("args: {} {} {} {}", key.GetId(), algo, expires, + flags); auto err = gpgme_op_createsubkey(ctx.DefaultContext(), static_cast(key), algo, 0, @@ -267,10 +269,10 @@ auto GpgKeyOpera::ModifyTOFUPolicy(const GpgKey& key, -> GpgError { const auto gnupg_version = Module::RetrieveRTValueTypedOrDefault<>( "core", "gpgme.ctx.gnupg_version", std::string{"2.0.0"}); - SPDLOG_DEBUG("got gnupg version from rt: {}", gnupg_version); + GF_CORE_LOG_DEBUG("got gnupg version from rt: {}", gnupg_version); if (CompareSoftwareVersion(gnupg_version, "2.1.10") < 0) { - SPDLOG_ERROR("operator not support"); + GF_CORE_LOG_ERROR("operator not support"); return GPG_ERR_NOT_SUPPORTED; } -- cgit v1.2.3 From 802d7ed9907a08941af353fd65c6d528a8d5ba2c Mon Sep 17 00:00:00 2001 From: saturneric Date: Wed, 10 Jan 2024 11:41:34 +0800 Subject: feat: update core apis, functions and models --- src/core/function/gpg/GpgKeyOpera.cpp | 93 ++++++++++++++++++++++++++++++++++- 1 file changed, 92 insertions(+), 1 deletion(-) (limited to 'src/core/function/gpg/GpgKeyOpera.cpp') diff --git a/src/core/function/gpg/GpgKeyOpera.cpp b/src/core/function/gpg/GpgKeyOpera.cpp index 49703781..90852b42 100644 --- a/src/core/function/gpg/GpgKeyOpera.cpp +++ b/src/core/function/gpg/GpgKeyOpera.cpp @@ -207,7 +207,7 @@ void GpgKeyOpera::GenerateKey(const std::shared_ptr& params, return CheckGpgError(err); }, - callback, "gpgme_op_passwd", "2.1.0"); + callback, "gpgme_op_createkey", "2.1.0"); } /** @@ -254,6 +254,97 @@ void GpgKeyOpera::GenerateSubkey(const GpgKey& key, callback, "gpgme_op_createsubkey", "2.1.13"); } +void GpgKeyOpera::GenerateKeyWithSubkey( + const std::shared_ptr& params, + const std::shared_ptr& subkey_params, + const GpgOperationCallback& callback) { + RunGpgOperaAsync( + [&ctx = ctx_, params, + subkey_params](const DataObjectPtr& data_object) -> GpgError { + auto userid_utf8 = params->GetUserid(); + const char* userid = userid_utf8.c_str(); + auto algo_utf8 = params->GetAlgo() + params->GetKeySizeStr(); + + const char* algo = algo_utf8.c_str(); + unsigned long expires = 0; + expires = to_time_t(boost::posix_time::ptime(params->GetExpireTime())) - + std::chrono::system_clock::to_time_t( + std::chrono ::system_clock::now()); + + GpgError err; + unsigned int flags = 0; + + if (!params->IsSubKey()) flags |= GPGME_CREATE_CERT; + if (params->IsAllowEncryption()) flags |= GPGME_CREATE_ENCR; + if (params->IsAllowSigning()) flags |= GPGME_CREATE_SIGN; + if (params->IsAllowAuthentication()) flags |= GPGME_CREATE_AUTH; + if (params->IsNonExpired()) flags |= GPGME_CREATE_NOEXPIRE; + if (params->IsNoPassPhrase()) flags |= GPGME_CREATE_NOPASSWD; + + GF_CORE_LOG_DEBUG("key generation args: {}", userid, algo, expires, + flags); + err = gpgme_op_createkey(ctx.DefaultContext(), userid, algo, 0, expires, + nullptr, flags); + + if (CheckGpgError(err) != GPG_ERR_NO_ERROR) { + data_object->Swap({GpgGenerateKeyResult{}}); + return err; + } + + auto genkey_result = + GpgGenerateKeyResult{gpgme_op_genkey_result(ctx.DefaultContext())}; + + auto key = + GpgKeyGetter::GetInstance().GetKey(genkey_result.GetFingerprint()); + if (!key.IsGood()) { + GF_CORE_LOG_ERROR("cannot get key which has been generate, fpr: {}", + genkey_result.GetFingerprint()); + return err; + } + + if (subkey_params == nullptr || !subkey_params->IsSubKey()) return err; + + GF_CORE_LOG_DEBUG( + "try to generate subkey of key: {}, algo {} key size {}", + key.GetId(), subkey_params->GetAlgo(), + subkey_params->GetKeySizeStr()); + + algo_utf8 = (subkey_params->GetAlgo() + subkey_params->GetKeySizeStr()); + algo = algo_utf8.c_str(); + expires = 0; + + expires = to_time_t(boost::posix_time::ptime( + subkey_params->GetExpireTime())) - + std::chrono::system_clock::to_time_t( + std::chrono::system_clock::now()); + + flags = 0; + if (subkey_params->IsAllowEncryption()) flags |= GPGME_CREATE_ENCR; + if (subkey_params->IsAllowSigning()) flags |= GPGME_CREATE_SIGN; + if (subkey_params->IsAllowAuthentication()) flags |= GPGME_CREATE_AUTH; + if (subkey_params->IsNonExpired()) flags |= GPGME_CREATE_NOEXPIRE; + if (subkey_params->IsNoPassPhrase()) flags |= GPGME_CREATE_NOPASSWD; + + GF_CORE_LOG_DEBUG("subkey generation args: {} {} {} {}", key.GetId(), + algo, expires, flags); + + err = gpgme_op_createsubkey(ctx.DefaultContext(), + static_cast(key), algo, 0, + expires, flags); + + if (CheckGpgError(err) == GPG_ERR_NO_ERROR) { + data_object->Swap( + {genkey_result, GpgGenerateKeyResult{gpgme_op_genkey_result( + ctx.DefaultContext())}}); + } else { + data_object->Swap({genkey_result, GpgGenerateKeyResult{}}); + } + + return CheckGpgError(err); + }, + callback, "gpgme_op_createkey&gpgme_op_createsubkey", "2.1.0"); +} + void GpgKeyOpera::ModifyPassword(const GpgKey& key, const GpgOperationCallback& callback) { RunGpgOperaAsync( -- cgit v1.2.3 From bf538056b24a68b8fd235b1c50991ee8eb46a776 Mon Sep 17 00:00:00 2001 From: saturneric Date: Fri, 12 Jan 2024 14:02:37 +0800 Subject: refactor: use QString instead of std::string and improve threading system --- src/core/function/gpg/GpgKeyOpera.cpp | 27 ++++++++++++--------------- 1 file changed, 12 insertions(+), 15 deletions(-) (limited to 'src/core/function/gpg/GpgKeyOpera.cpp') diff --git a/src/core/function/gpg/GpgKeyOpera.cpp b/src/core/function/gpg/GpgKeyOpera.cpp index 90852b42..88419237 100644 --- a/src/core/function/gpg/GpgKeyOpera.cpp +++ b/src/core/function/gpg/GpgKeyOpera.cpp @@ -33,7 +33,6 @@ #include #include #include -#include #include #include @@ -91,17 +90,15 @@ auto GpgKeyOpera::SetExpire(const GpgKey& key, const SubkeyId& subkey_fpr, std::chrono::system_clock::now()); } - GF_CORE_LOG_DEBUG(key.GetId(), subkey_fpr, expires_time); - GpgError err; - if (key.GetFingerprint() == subkey_fpr || subkey_fpr.empty()) { + if (key.GetFingerprint() == subkey_fpr || subkey_fpr.isEmpty()) { err = gpgme_op_setexpire(ctx_.DefaultContext(), static_cast(key), expires_time, nullptr, 0); } else { err = gpgme_op_setexpire(ctx_.DefaultContext(), static_cast(key), - expires_time, subkey_fpr.c_str(), 0); + expires_time, subkey_fpr.toUtf8(), 0); } return err; @@ -114,15 +111,15 @@ auto GpgKeyOpera::SetExpire(const GpgKey& key, const SubkeyId& subkey_fpr, * @return the process doing this job */ void GpgKeyOpera::GenerateRevokeCert(const GpgKey& key, - const std::string& output_path) { + const QString& output_path) { const auto app_path = Module::RetrieveRTValueTypedOrDefault<>( - "core", "gpgme.ctx.app_path", std::string{}); + "core", "gpgme.ctx.app_path", QString{}); // get all components GpgCommandExecutor::ExecuteSync( {app_path, {"--command-fd", "0", "--status-fd", "1", "--no-tty", "-o", output_path, "--gen-revoke", key.GetFingerprint()}, - [=](int exit_code, const std::string& p_out, const std::string& p_err) { + [=](int exit_code, const QString& p_out, const QString& p_err) { if (exit_code != 0) { GF_CORE_LOG_ERROR( "gnupg gen revoke execute error, process stderr: {}, process " @@ -171,13 +168,13 @@ void GpgKeyOpera::GenerateKey(const std::shared_ptr& params, RunGpgOperaAsync( [&ctx = ctx_, params](const DataObjectPtr& data_object) -> GpgError { auto userid_utf8 = params->GetUserid(); - const char* userid = userid_utf8.c_str(); + const char* userid = userid_utf8.toUtf8(); auto algo_utf8 = params->GetAlgo() + params->GetKeySizeStr(); GF_CORE_LOG_DEBUG("params: {} {}", params->GetAlgo(), params->GetKeySizeStr()); - const char* algo = algo_utf8.c_str(); + const char* algo = algo_utf8.toUtf8(); unsigned long expires = 0; expires = to_time_t(boost::posix_time::ptime(params->GetExpireTime())) - std::chrono::system_clock::to_time_t( @@ -227,7 +224,7 @@ void GpgKeyOpera::GenerateSubkey(const GpgKey& key, params->GetAlgo(), params->GetKeySizeStr()); auto algo_utf8 = (params->GetAlgo() + params->GetKeySizeStr()); - const char* algo = algo_utf8.c_str(); + const char* algo = algo_utf8.toUtf8(); unsigned long expires = 0; expires = to_time_t(boost::posix_time::ptime(params->GetExpireTime())) - @@ -262,10 +259,10 @@ void GpgKeyOpera::GenerateKeyWithSubkey( [&ctx = ctx_, params, subkey_params](const DataObjectPtr& data_object) -> GpgError { auto userid_utf8 = params->GetUserid(); - const char* userid = userid_utf8.c_str(); + const char* userid = userid_utf8.toUtf8(); auto algo_utf8 = params->GetAlgo() + params->GetKeySizeStr(); - const char* algo = algo_utf8.c_str(); + const char* algo = algo_utf8.toUtf8(); unsigned long expires = 0; expires = to_time_t(boost::posix_time::ptime(params->GetExpireTime())) - std::chrono::system_clock::to_time_t( @@ -310,7 +307,7 @@ void GpgKeyOpera::GenerateKeyWithSubkey( subkey_params->GetKeySizeStr()); algo_utf8 = (subkey_params->GetAlgo() + subkey_params->GetKeySizeStr()); - algo = algo_utf8.c_str(); + algo = algo_utf8.toUtf8(); expires = 0; expires = to_time_t(boost::posix_time::ptime( @@ -359,7 +356,7 @@ auto GpgKeyOpera::ModifyTOFUPolicy(const GpgKey& key, gpgme_tofu_policy_t tofu_policy) -> GpgError { const auto gnupg_version = Module::RetrieveRTValueTypedOrDefault<>( - "core", "gpgme.ctx.gnupg_version", std::string{"2.0.0"}); + "core", "gpgme.ctx.gnupg_version", QString{"2.0.0"}); GF_CORE_LOG_DEBUG("got gnupg version from rt: {}", gnupg_version); if (CompareSoftwareVersion(gnupg_version, "2.1.10") < 0) { -- cgit v1.2.3 From 6983b5c1dd82d159236ebd06cf17f071cc9c1ee9 Mon Sep 17 00:00:00 2001 From: saturneric Date: Fri, 12 Jan 2024 23:08:38 +0800 Subject: refactor: remove boost and use QString instead of std::filesystem::path --- src/core/function/gpg/GpgKeyOpera.cpp | 34 +++++++++++----------------------- 1 file changed, 11 insertions(+), 23 deletions(-) (limited to 'src/core/function/gpg/GpgKeyOpera.cpp') diff --git a/src/core/function/gpg/GpgKeyOpera.cpp b/src/core/function/gpg/GpgKeyOpera.cpp index 88419237..d31165be 100644 --- a/src/core/function/gpg/GpgKeyOpera.cpp +++ b/src/core/function/gpg/GpgKeyOpera.cpp @@ -30,10 +30,6 @@ #include -#include -#include -#include -#include #include #include "core/GpgModel.h" @@ -41,12 +37,12 @@ #include "core/function/gpg/GpgKeyGetter.h" #include "core/model/DataObject.h" #include "core/model/GpgGenKeyInfo.h" +#include "core/model/GpgGenerateKeyResult.h" #include "core/module/ModuleManager.h" +#include "core/typedef/GpgTypedef.h" #include "core/utils/AsyncUtils.h" #include "core/utils/CommonUtils.h" #include "core/utils/GpgUtils.h" -#include "model/GpgGenerateKeyResult.h" -#include "typedef/GpgTypedef.h" namespace GpgFrontend { @@ -81,13 +77,11 @@ void GpgKeyOpera::DeleteKeys(GpgFrontend::KeyIdArgsListPtr key_ids) { * @return if successful */ auto GpgKeyOpera::SetExpire(const GpgKey& key, const SubkeyId& subkey_fpr, - std::unique_ptr& expires) - -> GpgError { + std::unique_ptr& expires) -> GpgError { unsigned long expires_time = 0; if (expires != nullptr) { - expires_time = to_time_t(*expires) - std::chrono::system_clock::to_time_t( - std::chrono::system_clock::now()); + expires_time = QDateTime::currentDateTime().secsTo(*expires); } GpgError err; @@ -176,9 +170,8 @@ void GpgKeyOpera::GenerateKey(const std::shared_ptr& params, const char* algo = algo_utf8.toUtf8(); unsigned long expires = 0; - expires = to_time_t(boost::posix_time::ptime(params->GetExpireTime())) - - std::chrono::system_clock::to_time_t( - std::chrono ::system_clock::now()); + + expires = QDateTime::currentDateTime().secsTo(params->GetExpireTime()); GpgError err; unsigned int flags = 0; @@ -227,9 +220,7 @@ void GpgKeyOpera::GenerateSubkey(const GpgKey& key, const char* algo = algo_utf8.toUtf8(); unsigned long expires = 0; - expires = to_time_t(boost::posix_time::ptime(params->GetExpireTime())) - - std::chrono::system_clock::to_time_t( - std::chrono::system_clock::now()); + expires = QDateTime::currentDateTime().secsTo(params->GetExpireTime()); unsigned int flags = 0; @@ -264,9 +255,8 @@ void GpgKeyOpera::GenerateKeyWithSubkey( const char* algo = algo_utf8.toUtf8(); unsigned long expires = 0; - expires = to_time_t(boost::posix_time::ptime(params->GetExpireTime())) - - std::chrono::system_clock::to_time_t( - std::chrono ::system_clock::now()); + + expires = QDateTime::currentDateTime().secsTo(params->GetExpireTime()); GpgError err; unsigned int flags = 0; @@ -310,10 +300,8 @@ void GpgKeyOpera::GenerateKeyWithSubkey( algo = algo_utf8.toUtf8(); expires = 0; - expires = to_time_t(boost::posix_time::ptime( - subkey_params->GetExpireTime())) - - std::chrono::system_clock::to_time_t( - std::chrono::system_clock::now()); + expires = + QDateTime::currentDateTime().secsTo(subkey_params->GetExpireTime()); flags = 0; if (subkey_params->IsAllowEncryption()) flags |= GPGME_CREATE_ENCR; -- cgit v1.2.3 From 72e33ed248d3b3a90634895cfd8b49d6fb8654c2 Mon Sep 17 00:00:00 2001 From: saturneric Date: Tue, 16 Jan 2024 02:10:06 +0800 Subject: fix: slove a heap-use-after-free problem --- src/core/function/gpg/GpgKeyOpera.cpp | 34 ++++++++++++---------------------- 1 file changed, 12 insertions(+), 22 deletions(-) (limited to 'src/core/function/gpg/GpgKeyOpera.cpp') diff --git a/src/core/function/gpg/GpgKeyOpera.cpp b/src/core/function/gpg/GpgKeyOpera.cpp index d31165be..d9133905 100644 --- a/src/core/function/gpg/GpgKeyOpera.cpp +++ b/src/core/function/gpg/GpgKeyOpera.cpp @@ -168,10 +168,9 @@ void GpgKeyOpera::GenerateKey(const std::shared_ptr& params, GF_CORE_LOG_DEBUG("params: {} {}", params->GetAlgo(), params->GetKeySizeStr()); - const char* algo = algo_utf8.toUtf8(); - unsigned long expires = 0; - - expires = QDateTime::currentDateTime().secsTo(params->GetExpireTime()); + auto algo = algo_utf8.toUtf8(); + unsigned long expires = + QDateTime::currentDateTime().secsTo(params->GetExpireTime()); GpgError err; unsigned int flags = 0; @@ -216,12 +215,9 @@ void GpgKeyOpera::GenerateSubkey(const GpgKey& key, GF_CORE_LOG_DEBUG("generate subkey algo {} key size {}", params->GetAlgo(), params->GetKeySizeStr()); - auto algo_utf8 = (params->GetAlgo() + params->GetKeySizeStr()); - const char* algo = algo_utf8.toUtf8(); - unsigned long expires = 0; - - expires = QDateTime::currentDateTime().secsTo(params->GetExpireTime()); - + auto algo = (params->GetAlgo() + params->GetKeySizeStr()).toUtf8(); + unsigned long expires = + QDateTime::currentDateTime().secsTo(params->GetExpireTime()); unsigned int flags = 0; if (!params->IsSubKey()) flags |= GPGME_CREATE_CERT; @@ -249,14 +245,10 @@ void GpgKeyOpera::GenerateKeyWithSubkey( RunGpgOperaAsync( [&ctx = ctx_, params, subkey_params](const DataObjectPtr& data_object) -> GpgError { - auto userid_utf8 = params->GetUserid(); - const char* userid = userid_utf8.toUtf8(); - auto algo_utf8 = params->GetAlgo() + params->GetKeySizeStr(); - - const char* algo = algo_utf8.toUtf8(); - unsigned long expires = 0; - - expires = QDateTime::currentDateTime().secsTo(params->GetExpireTime()); + auto userid = params->GetUserid().toUtf8(); + auto algo = (params->GetAlgo() + params->GetKeySizeStr()).toUtf8(); + unsigned long expires = expires = + QDateTime::currentDateTime().secsTo(params->GetExpireTime()); GpgError err; unsigned int flags = 0; @@ -296,10 +288,8 @@ void GpgKeyOpera::GenerateKeyWithSubkey( key.GetId(), subkey_params->GetAlgo(), subkey_params->GetKeySizeStr()); - algo_utf8 = (subkey_params->GetAlgo() + subkey_params->GetKeySizeStr()); - algo = algo_utf8.toUtf8(); - expires = 0; - + algo = (subkey_params->GetAlgo() + subkey_params->GetKeySizeStr()) + .toUtf8(); expires = QDateTime::currentDateTime().secsTo(subkey_params->GetExpireTime()); -- cgit v1.2.3 From 37848811b6c8ca6c2a707431ec077c8098918afe Mon Sep 17 00:00:00 2001 From: saturneric Date: Thu, 18 Jan 2024 00:14:13 +0800 Subject: fix: improve code quality, docs and ci files --- src/core/function/gpg/GpgKeyOpera.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'src/core/function/gpg/GpgKeyOpera.cpp') diff --git a/src/core/function/gpg/GpgKeyOpera.cpp b/src/core/function/gpg/GpgKeyOpera.cpp index d9133905..9a722c0b 100644 --- a/src/core/function/gpg/GpgKeyOpera.cpp +++ b/src/core/function/gpg/GpgKeyOpera.cpp @@ -247,7 +247,7 @@ void GpgKeyOpera::GenerateKeyWithSubkey( subkey_params](const DataObjectPtr& data_object) -> GpgError { auto userid = params->GetUserid().toUtf8(); auto algo = (params->GetAlgo() + params->GetKeySizeStr()).toUtf8(); - unsigned long expires = expires = + unsigned long expires = QDateTime::currentDateTime().secsTo(params->GetExpireTime()); GpgError err; -- cgit v1.2.3 From e0d2c4021483e6e1366c1050ccb5a30e53e172bb Mon Sep 17 00:00:00 2001 From: saturneric Date: Thu, 18 Jan 2024 20:58:37 +0800 Subject: fix: add test cases and solve discovered issues --- src/core/function/gpg/GpgKeyOpera.cpp | 209 ++++++++++++++++++++++++++++++---- 1 file changed, 188 insertions(+), 21 deletions(-) (limited to 'src/core/function/gpg/GpgKeyOpera.cpp') diff --git a/src/core/function/gpg/GpgKeyOpera.cpp b/src/core/function/gpg/GpgKeyOpera.cpp index 9a722c0b..5f8daf81 100644 --- a/src/core/function/gpg/GpgKeyOpera.cpp +++ b/src/core/function/gpg/GpgKeyOpera.cpp @@ -161,14 +161,12 @@ void GpgKeyOpera::GenerateKey(const std::shared_ptr& params, const GpgOperationCallback& callback) { RunGpgOperaAsync( [&ctx = ctx_, params](const DataObjectPtr& data_object) -> GpgError { - auto userid_utf8 = params->GetUserid(); - const char* userid = userid_utf8.toUtf8(); - auto algo_utf8 = params->GetAlgo() + params->GetKeySizeStr(); + auto userid = params->GetUserid(); + auto algo = params->GetAlgo() + params->GetKeySizeStr(); GF_CORE_LOG_DEBUG("params: {} {}", params->GetAlgo(), params->GetKeySizeStr()); - auto algo = algo_utf8.toUtf8(); unsigned long expires = QDateTime::currentDateTime().secsTo(params->GetExpireTime()); @@ -182,10 +180,10 @@ void GpgKeyOpera::GenerateKey(const std::shared_ptr& params, if (params->IsNonExpired()) flags |= GPGME_CREATE_NOEXPIRE; if (params->IsNoPassPhrase()) flags |= GPGME_CREATE_NOPASSWD; - GF_CORE_LOG_DEBUG("key generation args: {}", userid, algo, expires, - flags); - err = gpgme_op_createkey(ctx.DefaultContext(), userid, algo, 0, expires, - nullptr, flags); + GF_CORE_LOG_DEBUG("key generation args: {} {} {} {}", userid, algo, + expires, flags); + err = gpgme_op_createkey(ctx.DefaultContext(), userid.toUtf8(), + algo.toUtf8(), 0, expires, nullptr, flags); if (CheckGpgError(err) == GPG_ERR_NO_ERROR) { data_object->Swap({GpgGenerateKeyResult{ @@ -199,23 +197,96 @@ void GpgKeyOpera::GenerateKey(const std::shared_ptr& params, callback, "gpgme_op_createkey", "2.1.0"); } -/** - * Generate a new subkey of a certain key pair - * @param key target key pair - * @param params opera args - * @return error info - */ +auto GpgKeyOpera::GenerateKeySync(const std::shared_ptr& params) + -> std::tuple { + return RunGpgOperaSync( + [=, &ctx = ctx_](const DataObjectPtr& data_object) -> GpgError { + auto userid = params->GetUserid(); + auto algo = params->GetAlgo() + params->GetKeySizeStr(); + + GF_CORE_LOG_DEBUG("params: {} {}", params->GetAlgo(), + params->GetKeySizeStr()); + + unsigned long expires = + QDateTime::currentDateTime().secsTo(params->GetExpireTime()); + + GpgError err; + unsigned int flags = 0; + + if (!params->IsSubKey()) flags |= GPGME_CREATE_CERT; + if (params->IsAllowEncryption()) flags |= GPGME_CREATE_ENCR; + if (params->IsAllowSigning()) flags |= GPGME_CREATE_SIGN; + if (params->IsAllowAuthentication()) flags |= GPGME_CREATE_AUTH; + if (params->IsNonExpired()) flags |= GPGME_CREATE_NOEXPIRE; + if (params->IsNoPassPhrase()) flags |= GPGME_CREATE_NOPASSWD; + + GF_CORE_LOG_DEBUG("key generation args: {} {} {} {}", userid, algo, + expires, flags); + err = gpgme_op_createkey(ctx.DefaultContext(), userid.toUtf8(), + algo.toUtf8(), 0, expires, nullptr, flags); + + if (CheckGpgError(err) == GPG_ERR_NO_ERROR) { + data_object->Swap({GpgGenerateKeyResult{ + gpgme_op_genkey_result(ctx.DefaultContext())}}); + } else { + data_object->Swap({GpgGenerateKeyResult{}}); + } + + return CheckGpgError(err); + }, + "gpgme_op_createkey", "2.1.0"); +} + void GpgKeyOpera::GenerateSubkey(const GpgKey& key, const std::shared_ptr& params, const GpgOperationCallback& callback) { RunGpgOperaAsync( - [key, &ctx = ctx_, params](const DataObjectPtr&) -> GpgError { + [key, &ctx = ctx_, params](const DataObjectPtr& data_object) -> GpgError { + if (!params->IsSubKey()) return GPG_ERR_CANCELED; + + GF_CORE_LOG_DEBUG("generate subkey algo {}, key size {}", + params->GetAlgo(), params->GetKeySizeStr()); + + auto algo = params->GetAlgo() + params->GetKeySizeStr(); + unsigned long expires = + QDateTime::currentDateTime().secsTo(params->GetExpireTime()); + unsigned int flags = 0; + + if (!params->IsSubKey()) flags |= GPGME_CREATE_CERT; + if (params->IsAllowEncryption()) flags |= GPGME_CREATE_ENCR; + if (params->IsAllowSigning()) flags |= GPGME_CREATE_SIGN; + if (params->IsAllowAuthentication()) flags |= GPGME_CREATE_AUTH; + if (params->IsNonExpired()) flags |= GPGME_CREATE_NOEXPIRE; + if (params->IsNoPassPhrase()) flags |= GPGME_CREATE_NOPASSWD; + + GF_CORE_LOG_DEBUG("subkey generation args: {} {} {} {}", key.GetId(), + algo, expires, flags); + auto err = gpgme_op_createsubkey(ctx.DefaultContext(), + static_cast(key), + algo.toUtf8(), 0, expires, flags); + if (CheckGpgError(err) != GPG_ERR_NO_ERROR) { + data_object->Swap({GpgGenerateKeyResult{}}); + return err; + } + + data_object->Swap({GpgGenerateKeyResult{ + gpgme_op_genkey_result(ctx.DefaultContext())}}); + return CheckGpgError(err); + }, + callback, "gpgme_op_createsubkey", "2.1.13"); +} + +auto GpgKeyOpera::GenerateSubkeySync(const GpgKey& key, + const std::shared_ptr& params) + -> std::tuple { + return RunGpgOperaSync( + [key, &ctx = ctx_, params](const DataObjectPtr& data_object) -> GpgError { if (!params->IsSubKey()) return GPG_ERR_CANCELED; GF_CORE_LOG_DEBUG("generate subkey algo {} key size {}", params->GetAlgo(), params->GetKeySizeStr()); - auto algo = (params->GetAlgo() + params->GetKeySizeStr()).toUtf8(); + auto algo = params->GetAlgo() + params->GetKeySizeStr(); unsigned long expires = QDateTime::currentDateTime().secsTo(params->GetExpireTime()); unsigned int flags = 0; @@ -231,11 +302,19 @@ void GpgKeyOpera::GenerateSubkey(const GpgKey& key, flags); auto err = gpgme_op_createsubkey(ctx.DefaultContext(), - static_cast(key), algo, 0, - expires, flags); + static_cast(key), + algo.toUtf8(), 0, expires, flags); + + if (CheckGpgError(err) != GPG_ERR_NO_ERROR) { + data_object->Swap({GpgGenerateKeyResult{}}); + return err; + } + + data_object->Swap({GpgGenerateKeyResult{ + gpgme_op_genkey_result(ctx.DefaultContext())}}); return CheckGpgError(err); }, - callback, "gpgme_op_createsubkey", "2.1.13"); + "gpgme_op_createsubkey", "2.1.13"); } void GpgKeyOpera::GenerateKeyWithSubkey( @@ -273,6 +352,11 @@ void GpgKeyOpera::GenerateKeyWithSubkey( auto genkey_result = GpgGenerateKeyResult{gpgme_op_genkey_result(ctx.DefaultContext())}; + if (subkey_params == nullptr || !subkey_params->IsSubKey()) { + data_object->Swap({genkey_result}); + return err; + } + auto key = GpgKeyGetter::GetInstance().GetKey(genkey_result.GetFingerprint()); if (!key.IsGood()) { @@ -281,8 +365,6 @@ void GpgKeyOpera::GenerateKeyWithSubkey( return err; } - if (subkey_params == nullptr || !subkey_params->IsSubKey()) return err; - GF_CORE_LOG_DEBUG( "try to generate subkey of key: {}, algo {} key size {}", key.GetId(), subkey_params->GetAlgo(), @@ -320,6 +402,91 @@ void GpgKeyOpera::GenerateKeyWithSubkey( callback, "gpgme_op_createkey&gpgme_op_createsubkey", "2.1.0"); } +auto GpgKeyOpera::GenerateKeyWithSubkeySync( + const std::shared_ptr& params, + const std::shared_ptr& subkey_params) + -> std::tuple { + return RunGpgOperaSync( + [&ctx = ctx_, params, + subkey_params](const DataObjectPtr& data_object) -> GpgError { + auto userid = params->GetUserid().toUtf8(); + auto algo = (params->GetAlgo() + params->GetKeySizeStr()).toUtf8(); + unsigned long expires = + QDateTime::currentDateTime().secsTo(params->GetExpireTime()); + + GpgError err; + unsigned int flags = 0; + + if (!params->IsSubKey()) flags |= GPGME_CREATE_CERT; + if (params->IsAllowEncryption()) flags |= GPGME_CREATE_ENCR; + if (params->IsAllowSigning()) flags |= GPGME_CREATE_SIGN; + if (params->IsAllowAuthentication()) flags |= GPGME_CREATE_AUTH; + if (params->IsNonExpired()) flags |= GPGME_CREATE_NOEXPIRE; + if (params->IsNoPassPhrase()) flags |= GPGME_CREATE_NOPASSWD; + + GF_CORE_LOG_DEBUG("key generation args: {}", userid, algo, expires, + flags); + err = gpgme_op_createkey(ctx.DefaultContext(), userid, algo, 0, expires, + nullptr, flags); + + if (CheckGpgError(err) != GPG_ERR_NO_ERROR) { + data_object->Swap({GpgGenerateKeyResult{}}); + return err; + } + + auto genkey_result = + GpgGenerateKeyResult{gpgme_op_genkey_result(ctx.DefaultContext())}; + + if (subkey_params == nullptr || !subkey_params->IsSubKey()) { + data_object->Swap({genkey_result}); + return err; + } + + auto key = + GpgKeyGetter::GetInstance().GetKey(genkey_result.GetFingerprint()); + if (!key.IsGood()) { + GF_CORE_LOG_ERROR("cannot get key which has been generate, fpr: {}", + genkey_result.GetFingerprint()); + return err; + } + + GF_CORE_LOG_DEBUG( + "try to generate subkey of key: {}, algo {} key size {}", + key.GetId(), subkey_params->GetAlgo(), + subkey_params->GetKeySizeStr()); + + algo = (subkey_params->GetAlgo() + subkey_params->GetKeySizeStr()) + .toUtf8(); + expires = + QDateTime::currentDateTime().secsTo(subkey_params->GetExpireTime()); + + flags = 0; + if (subkey_params->IsAllowEncryption()) flags |= GPGME_CREATE_ENCR; + if (subkey_params->IsAllowSigning()) flags |= GPGME_CREATE_SIGN; + if (subkey_params->IsAllowAuthentication()) flags |= GPGME_CREATE_AUTH; + if (subkey_params->IsNonExpired()) flags |= GPGME_CREATE_NOEXPIRE; + if (subkey_params->IsNoPassPhrase()) flags |= GPGME_CREATE_NOPASSWD; + + GF_CORE_LOG_DEBUG("subkey generation args: {} {} {} {}", key.GetId(), + algo, expires, flags); + + err = gpgme_op_createsubkey(ctx.DefaultContext(), + static_cast(key), algo, 0, + expires, flags); + + if (CheckGpgError(err) == GPG_ERR_NO_ERROR) { + data_object->Swap( + {genkey_result, GpgGenerateKeyResult{gpgme_op_genkey_result( + ctx.DefaultContext())}}); + } else { + data_object->Swap({genkey_result, GpgGenerateKeyResult{}}); + } + + return CheckGpgError(err); + }, + "gpgme_op_createkey&gpgme_op_createsubkey", "2.1.0"); +} + void GpgKeyOpera::ModifyPassword(const GpgKey& key, const GpgOperationCallback& callback) { RunGpgOperaAsync( -- cgit v1.2.3 From 4133b5cc1abf297f0e2a85799ed02c8b88c4215a Mon Sep 17 00:00:00 2001 From: saturneric Date: Mon, 22 Jan 2024 20:47:00 +0800 Subject: fix: QStringList is not equal to QList --- src/core/function/gpg/GpgKeyOpera.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'src/core/function/gpg/GpgKeyOpera.cpp') diff --git a/src/core/function/gpg/GpgKeyOpera.cpp b/src/core/function/gpg/GpgKeyOpera.cpp index 5f8daf81..118f4784 100644 --- a/src/core/function/gpg/GpgKeyOpera.cpp +++ b/src/core/function/gpg/GpgKeyOpera.cpp @@ -111,8 +111,8 @@ void GpgKeyOpera::GenerateRevokeCert(const GpgKey& key, // get all components GpgCommandExecutor::ExecuteSync( {app_path, - {"--command-fd", "0", "--status-fd", "1", "--no-tty", "-o", output_path, - "--gen-revoke", key.GetFingerprint()}, + QStringList{"--command-fd", "0", "--status-fd", "1", "--no-tty", "-o", + output_path, "--gen-revoke", key.GetFingerprint()}, [=](int exit_code, const QString& p_out, const QString& p_err) { if (exit_code != 0) { GF_CORE_LOG_ERROR( -- cgit v1.2.3