diff options
Diffstat (limited to 'src/module')
-rw-r--r-- | src/module/integrated/gnupg_info_gathering_module/GnuPGInfoGatheringModule.cpp | 94 | ||||
-rw-r--r-- | src/module/integrated/version_checking_module/VersionCheckTask.cpp | 9 | ||||
-rw-r--r-- | src/module/integrated/version_checking_module/VersionCheckingModule.h | 2 | ||||
-rw-r--r-- | src/module/sdk/Basic.cpp | 20 | ||||
-rw-r--r-- | src/module/sdk/Basic.h | 32 | ||||
-rw-r--r-- | src/module/sdk/Module.cpp | 22 |
6 files changed, 123 insertions, 56 deletions
diff --git a/src/module/integrated/gnupg_info_gathering_module/GnuPGInfoGatheringModule.cpp b/src/module/integrated/gnupg_info_gathering_module/GnuPGInfoGatheringModule.cpp index 67dd5227..0595a8ac 100644 --- a/src/module/integrated/gnupg_info_gathering_module/GnuPGInfoGatheringModule.cpp +++ b/src/module/integrated/gnupg_info_gathering_module/GnuPGInfoGatheringModule.cpp @@ -32,9 +32,8 @@ #include "GpgInfo.h" #include "Log.h" -ModuleMetaData *g_module_metadata = nullptr; - -extern auto CheckBinaryChacksum(QString path) -> std::optional<QString>; +extern auto CalculateBinaryChacksum(const QString &path) + -> std::optional<QString>; extern void GetGpgComponentInfos(void *, int, const char *, const char *); @@ -50,30 +49,33 @@ using Context = struct { auto RegisterModule() -> int { ModuleLogDebug("gnupg info gathering module registering"); + return 0; +} - g_module_metadata = +auto GetModuleID() -> const char * { + return GFModuleStrDup( + "com.bktus.gpgfrontend.module.integrated.gnupg-info-gathering"); +} + +auto GetModuleVersion() -> const char * { return GFModuleStrDup("1.0.0"); } + +auto GetModuleMetaData() -> ModuleMetaData * { + auto *p_meta = static_cast<ModuleMetaData *>(AllocateMemory(sizeof(ModuleMetaData))); + auto *h_meta = p_meta; - auto *p_meta = g_module_metadata; - p_meta->key = "description"; - p_meta->value = "try to gathering gnupg informations"; + p_meta->key = "Description"; + p_meta->value = "Try to gathering gnupg informations"; p_meta->next = static_cast<ModuleMetaData *>(AllocateMemory(sizeof(ModuleMetaData))); p_meta = p_meta->next; - p_meta->key = "author"; - p_meta->value = "saturneric"; + p_meta->key = "Author"; + p_meta->value = "Saturneric"; p_meta->next = nullptr; - return 0; -} -auto GetModuleID() -> const char * { - return "com.bktus.gpgfrontend.module.integrated.gnupg-info-gathering"; + return h_meta; } -auto GetModuleVersion() -> const char * { return "1.0.0"; } - -auto GetModuleMetaData() -> ModuleMetaData * { return g_module_metadata; } - auto ActiveModule() -> int { ModuleLogDebug("gnupg info gathering module activating"); ListenEvent(GetModuleID(), "GPGFRONTEND_CORE_INITLIZED"); @@ -101,12 +103,16 @@ auto ExecuteModule(ModuleEvent *event) -> int { auto context = Context{gpgme_version, gpgconf_path}; // get all components - const char *argv[] = {"--list-components"}; + const char *argv[] = {GFModuleStrDup("--list-components")}; ExecuteCommandSync(gpgconf_path, 1, argv, GetGpgComponentInfos, &context); + ModuleLogDebug("load gnupg component info done."); QList<CommandExecuteContext> exec_contexts; - const char *argv_0[] = {"--list-dirs"}; + const char **argv_0 = + static_cast<const char **>(AllocateMemory(sizeof(const char *))); + argv_0[0] = GFModuleStrDup("--list-dirs"); + exec_contexts.push_back( {gpgconf_path, 1, argv_0, GetGpgDirectoryInfos, nullptr}); @@ -139,9 +145,12 @@ auto ExecuteModule(ModuleEvent *event) -> int { auto context = Context{gpgme_version, gpgconf_path, component_info}; - const char *argv_0[] = {"--list-options", component_info.name.toUtf8()}; + const char **argv_0 = + static_cast<const char **>(AllocateMemory(sizeof(const char *) * 2)); + argv_0[0] = GFModuleStrDup("--list-options"), + argv_0[1] = GFModuleStrDup(component_info.name.toUtf8()); exec_contexts.push_back( - {gpgconf_path, 1, argv_0, GetGpgDirectoryInfos, &context}); + {gpgconf_path, 2, argv_0, GetGpgDirectoryInfos, &context}); } ExecuteCommandBatchSync(static_cast<int32_t>(exec_contexts.size()), @@ -149,10 +158,8 @@ auto ExecuteModule(ModuleEvent *event) -> int { UpsertRTValue(GetModuleID(), "gnupg.gathering_done", "true"); - char **event_argv = static_cast<char **>(AllocateMemory(sizeof(char *) * 1)); - event_argv[0] = static_cast<char *>(AllocateMemory(5)); - memcpy(event_argv[0], "true", 4); - event_argv[0][4] = '\0'; + char **event_argv = static_cast<char **>(AllocateMemory(sizeof(char **) * 1)); + event_argv[0] = GFModuleStrDup("true"); TriggerModuleEventCallback(event, GetModuleID(), 1, event_argv); @@ -164,11 +171,10 @@ auto DeactiveModule() -> int { return 0; } auto UnregisterModule() -> int { ModuleLogDebug("gnupg info gathering module unregistering"); - FreeMemory(g_module_metadata); return 0; } -auto CheckBinaryChacksum(QString path) -> std::optional<QString> { +auto CalculateBinaryChacksum(const QString &path) -> std::optional<QString> { // check file info and access rights QFileInfo info(path); if (!info.exists() || !info.isFile() || !info.isReadable()) { @@ -181,19 +187,33 @@ auto CheckBinaryChacksum(QString path) -> std::optional<QString> { // open and read file QFile f(info.filePath()); if (!f.open(QIODevice::ReadOnly)) { - ModuleLogError(fmt::format("open {} to calculate check sum error: {}", path, - f.errorString()) + ModuleLogError(fmt::format("open {} to calculate checksum error: {}", + path.toStdString(), + f.errorString().toStdString()) .c_str()); return {}; } - // read all data from file - auto buffer = f.readAll(); + QCryptographicHash hash_sha(QCryptographicHash::Sha256); + + // read data by chunks + const qint64 buffer_size = 8192; // Define a suitable buffer size + while (!f.atEnd()) { + QByteArray buffer = f.read(buffer_size); + if (buffer.isEmpty()) { + ModuleLogError( + fmt::format("error reading file {} during checksum calculation", + path.toStdString()) + .c_str()); + return {}; + } + hash_sha.addData(buffer); + } + + // close the file f.close(); - auto hash_sha = QCryptographicHash(QCryptographicHash::Sha256); - // md5 - hash_sha.addData(buffer); + // return the first 6 characters of the SHA-256 hash of the file return QString(hash_sha.result().toHex()).left(6); } @@ -229,7 +249,7 @@ void GetGpgComponentInfos(void *data, int exit_code, const char *out, c_i_gpgconf.desc = "GPG Configure"; c_i_gpgconf.version = "/"; c_i_gpgconf.path = context->gpgconf_path; - auto gpgconf_binary_checksum = CheckBinaryChacksum(context->gpgconf_path); + auto gpgconf_binary_checksum = CalculateBinaryChacksum(context->gpgconf_path); c_i_gpgconf.binary_checksum = (gpgconf_binary_checksum.has_value() ? gpgconf_binary_checksum.value() : QString("/")); @@ -260,7 +280,7 @@ void GetGpgComponentInfos(void *data, int exit_code, const char *out, component_path.replace("%3a", ":"); #endif - auto binary_checksum = CheckBinaryChacksum(component_path); + auto binary_checksum = CalculateBinaryChacksum(component_path); ModuleLogDebug( fmt::format("gnupg component name: {} desc: {} checksum: {} path: {} ", @@ -305,6 +325,8 @@ void GetGpgComponentInfos(void *data, int exit_code, const char *out, component_infos.push_back(c_i); } + + ModuleLogDebug("load gnupg component info actually done."); } } diff --git a/src/module/integrated/version_checking_module/VersionCheckTask.cpp b/src/module/integrated/version_checking_module/VersionCheckTask.cpp index 91d5edff..eeb0231c 100644 --- a/src/module/integrated/version_checking_module/VersionCheckTask.cpp +++ b/src/module/integrated/version_checking_module/VersionCheckTask.cpp @@ -31,15 +31,14 @@ #include <QMetaType> #include <QtNetwork> -#include "GpgFrontendBuildInfo.h" +#include "core/utils/BuildInfoUtils.h" namespace GpgFrontend::Module::Integrated::VersionCheckingModule { VersionCheckTask::VersionCheckTask() : Task("version_check_task"), network_manager_(new QNetworkAccessManager(this)), - current_version_(QString("v") + VERSION_MAJOR + "." + VERSION_MINOR + - "." + VERSION_PATCH) { + current_version_(GetProjectVersion()) { HoldOnLifeCycle(true); qRegisterMetaType<SoftwareVersion>("SoftwareVersion"); version_.current_version = current_version_; @@ -53,7 +52,7 @@ auto VersionCheckTask::Run() -> int { QNetworkRequest latest_request(latest_version_url); latest_request.setHeader(QNetworkRequest::UserAgentHeader, - HTTP_REQUEST_USER_AGENT); + GetHttpRequestUserAgent()); latest_reply_ = network_manager_->get(latest_request); connect(latest_reply_, &QNetworkReply::finished, this, @@ -122,7 +121,7 @@ void VersionCheckTask::slot_parse_latest_version_info() { QNetworkRequest current_request(current_version_url); current_request.setHeader(QNetworkRequest::UserAgentHeader, - HTTP_REQUEST_USER_AGENT); + GetHttpRequestUserAgent()); current_reply_ = network_manager_->get(current_request); diff --git a/src/module/integrated/version_checking_module/VersionCheckingModule.h b/src/module/integrated/version_checking_module/VersionCheckingModule.h index 65b20198..387cdb3c 100644 --- a/src/module/integrated/version_checking_module/VersionCheckingModule.h +++ b/src/module/integrated/version_checking_module/VersionCheckingModule.h @@ -32,6 +32,8 @@ #include "SoftwareVersion.h" #include "core/module/Module.h" + + namespace GpgFrontend::Module::Integrated::VersionCheckingModule { class GF_MODULE_EXPORT VersionCheckingModule : public Module { diff --git a/src/module/sdk/Basic.cpp b/src/module/sdk/Basic.cpp index 35ce8054..ce222fbd 100644 --- a/src/module/sdk/Basic.cpp +++ b/src/module/sdk/Basic.cpp @@ -57,12 +57,16 @@ void ExecuteCommandSync(const char* cmd, int32_t argc, const char** argv, void ExecuteCommandBatchSync(int32_t context_size, const CommandExecuteContext* context) { QList<GpgFrontend::GpgCommandExecutor::ExecuteContext> contexts; + for (int i = 0; i < context_size; i++) { - auto exec_context = context[i]; + const auto& exec_context = context[i]; + QStringList args; - for (int i = 0; i < exec_context.argc; i++) { - args.append(QString::fromUtf8(exec_context.argv[i])); + const char** argv = exec_context.argv; + for (int j = 0; j < exec_context.argc; j++) { + args.append(QString::fromUtf8(argv[j])); } + contexts.append( {exec_context.cmd, args, [data = exec_context.data, cb = exec_context.cb]( @@ -72,4 +76,14 @@ void ExecuteCommandBatchSync(int32_t context_size, } GpgFrontend::GpgCommandExecutor::ExecuteConcurrentlySync(contexts); +} + +auto GPGFRONTEND_MODULE_SDK_EXPORT GFModuleStrDup(const char* src) -> char* { + auto len = strlen(src); + + char* dst = static_cast<char*>(AllocateMemory((len + 1) * sizeof(char))); + memcpy(dst, src, len); + dst[len] = '\0'; + + return dst; }
\ No newline at end of file diff --git a/src/module/sdk/Basic.h b/src/module/sdk/Basic.h index a232fd64..123b3783 100644 --- a/src/module/sdk/Basic.h +++ b/src/module/sdk/Basic.h @@ -43,16 +43,48 @@ using CommandExecuteContext = struct { void* data; }; +/** + * @brief + * + * @param size + * @return void* + */ auto GPGFRONTEND_MODULE_SDK_EXPORT AllocateMemory(uint32_t size) -> void*; +/** + * @brief + * + */ void GPGFRONTEND_MODULE_SDK_EXPORT FreeMemory(void*); +/** + * @brief + * + * @param cmd + * @param argc + * @param argv + * @param cb + * @param data + */ void GPGFRONTEND_MODULE_SDK_EXPORT ExecuteCommandSync(const char* cmd, int32_t argc, const char** argv, CommandExeucteCallback cb, void* data); +/** + * @brief + * + * @param context_size + * @param context + */ void GPGFRONTEND_MODULE_SDK_EXPORT ExecuteCommandBatchSync( int32_t context_size, const CommandExecuteContext* context); + +/** + * @brief + * + * @return char* + */ +auto GPGFRONTEND_MODULE_SDK_EXPORT GFModuleStrDup(const char*) -> char*; }
\ No newline at end of file diff --git a/src/module/sdk/Module.cpp b/src/module/sdk/Module.cpp index 36fe7b91..c69f6e5c 100644 --- a/src/module/sdk/Module.cpp +++ b/src/module/sdk/Module.cpp @@ -29,9 +29,9 @@ #include "Module.h" #include <core/module/ModuleManager.h> +#include <core/utils/CommonUtils.h> #include "Basic.h" -#include "core/utils/CommonUtils.h" void ListenEvent(const char *module_id, const char *event_id) { return GpgFrontend::Module::ModuleManager::GetInstance().ListenEvent( @@ -40,13 +40,16 @@ void ListenEvent(const char *module_id, const char *event_id) { auto RetrieveRTValueOrDefault(const char *namespace_, const char *key, const char *default_value) -> const char * { - return GpgFrontend::Module::RetrieveRTValueTypedOrDefault( - namespace_, key, QString::fromUtf8(default_value)) - .toUtf8(); + return GpgFrontend::GFStrDup( + GpgFrontend::Module::RetrieveRTValueTypedOrDefault( + QString::fromUtf8(namespace_), QString::fromUtf8(key), + QString::fromUtf8(default_value))); } void UpsertRTValue(const char *namespace_, const char *key, const char *vaule) { - GpgFrontend::Module::UpsertRTValue(namespace_, key, vaule); + GpgFrontend::Module::UpsertRTValue(QString::fromUtf8(namespace_), + QString::fromUtf8(key), + QString::fromUtf8(vaule)); } auto ListRTChildKeys(const char *namespace_, const char *key, @@ -57,15 +60,10 @@ auto ListRTChildKeys(const char *namespace_, const char *key, if (keys.empty()) return 0; *child_keys = - static_cast<char **>(AllocateMemory(sizeof(const char **) * keys.size())); + static_cast<char **>(AllocateMemory(sizeof(char **) * keys.size())); for (int i = 0; i < keys.size(); i++) { - *child_keys[i] = - static_cast<char *>(AllocateMemory(sizeof(char) * keys[i].size() + 1)); - - auto key = keys[i].toUtf8(); - memcpy(reinterpret_cast<void *>(*child_keys[i]), key, key.size()); - (*child_keys[i])[key.size()] = '\0'; + (*child_keys)[i] = GpgFrontend::GFStrDup(keys[i]); } return static_cast<int32_t>(keys.size()); |