From 12d70e1792a5b1ff08d4b58fb49fb9e58d6551a8 Mon Sep 17 00:00:00 2001 From: saturneric Date: Thu, 29 Feb 2024 00:32:43 +0800 Subject: feat: upgrade module system 1. load module and resolve symbols at runtime 2. restrict sdk functions and structures to c style 3. add some core api to support it --- src/core/module/ModuleManager.cpp | 79 ++++++++++++++++++++++++++++++++++++--- 1 file changed, 74 insertions(+), 5 deletions(-) (limited to 'src/core/module/ModuleManager.cpp') diff --git a/src/core/module/ModuleManager.cpp b/src/core/module/ModuleManager.cpp index 83e7c1ff..17191af2 100644 --- a/src/core/module/ModuleManager.cpp +++ b/src/core/module/ModuleManager.cpp @@ -29,16 +29,17 @@ #include "ModuleManager.h" #include +#include #include "GpgConstants.h" +#include "core/function/SecureMemoryAllocator.h" +#include "core/function/basic/GpgFunctionObject.h" #include "core/module/GlobalModuleContext.h" #include "core/module/GlobalRegisterTable.h" #include "core/module/Module.h" #include "core/thread/Task.h" -#include "function/SecureMemoryAllocator.h" -#include "function/basic/GpgFunctionObject.h" -#include "thread/TaskRunnerGetter.h" -#include "utils/MemoryUtils.h" +#include "core/thread/TaskRunnerGetter.h" +#include "core/utils/MemoryUtils.h" namespace GpgFrontend::Module { @@ -50,13 +51,57 @@ class ModuleManager::Impl { ~Impl() = default; + auto LoadAndRegisterModule(const QString& module_library_path) -> void { + Thread::TaskRunnerGetter::GetInstance() + .GetTaskRunner(Thread::TaskRunnerGetter::kTaskRunnerType_Default) + ->PostTask(new Thread::Task( + [=](GpgFrontend::DataObjectPtr) -> int { + QLibrary module_library(module_library_path); + if (!module_library.load()) { + GF_CORE_LOG_WARN( + "module manager failed to load module, " + "reason: broken library: {} ", + module_library.fileName()); + return -1; + } + + auto module = SecureCreateSharedObject(module_library); + if (!module->IsGood()) { + GF_CORE_LOG_WARN( + "module manager failed to load module, " + "reason: illegal module: {}", + module_library.fileName()); + return -1; + } + + module->SetGPC(gmc_.get()); + return gmc_->RegisterModule(module) ? 0 : -1; + }, + __func__, nullptr)); + } + + auto SearchModule(ModuleIdentifier module_id) -> ModulePtr { + return gmc_->SearchModule(std::move(module_id)); + } + void RegisterModule(const ModulePtr& module) { Thread::TaskRunnerGetter::GetInstance() .GetTaskRunner(Thread::TaskRunnerGetter::kTaskRunnerType_Default) ->PostTask(new Thread::Task( [=](GpgFrontend::DataObjectPtr) -> int { module->SetGPC(gmc_.get()); - gmc_->RegisterModule(module); + return gmc_->RegisterModule(module) ? 0 : -1; + }, + __func__, nullptr)); + } + + void ListenEvent(const ModuleIdentifier& module_id, + const EventIdentifier& event_id) { + Thread::TaskRunnerGetter::GetInstance() + .GetTaskRunner(Thread::TaskRunnerGetter::kTaskRunnerType_Default) + ->PostTask(new Thread::Task( + [=](const GpgFrontend::DataObjectPtr&) -> int { + gmc_->ListenEvent(module_id, event_id); return 0; }, __func__, nullptr)); @@ -73,6 +118,11 @@ class ModuleManager::Impl { __func__, nullptr)); } + auto SearchEvent(EventTriggerIdentifier trigger_id) + -> std::optional { + return gmc_->SearchEvent(std::move(trigger_id)); + } + void ActiveModule(const ModuleIdentifier& identifier) { Thread::TaskRunnerGetter::GetInstance() .GetTaskRunner(Thread::TaskRunnerGetter::kTaskRunnerType_Default) @@ -113,6 +163,7 @@ class ModuleManager::Impl { static ModuleMangerPtr global_module_manager; SecureUniquePtr gmc_; SecureUniquePtr grt_; + QList module_libraries_; }; auto IsModuleAcivate(ModuleIdentifier id) -> bool { @@ -141,14 +192,32 @@ ModuleManager::ModuleManager(int channel) ModuleManager::~ModuleManager() = default; +void ModuleManager::LoadModule(QString module_library_path) { + return p_->LoadAndRegisterModule(module_library_path); +} + +auto ModuleManager::SearchModule(ModuleIdentifier module_id) -> ModulePtr { + return p_->SearchModule(std::move(module_id)); +} + void ModuleManager::RegisterModule(ModulePtr module) { return p_->RegisterModule(module); } +void ModuleManager::ListenEvent(ModuleIdentifier module, + EventIdentifier event) { + return p_->ListenEvent(module, event); +} + void ModuleManager::TriggerEvent(EventRefrernce event) { return p_->TriggerEvent(event); } +auto ModuleManager::SearchEvent(EventTriggerIdentifier trigger_id) + -> std::optional { + return p_->SearchEvent(std::move(trigger_id)); +} + void ModuleManager::ActiveModule(ModuleIdentifier id) { return p_->ActiveModule(id); } -- cgit v1.2.3 From c1f5b3336836e15d193582e9b8f3e044f7d8bc1b Mon Sep 17 00:00:00 2001 From: saturneric Date: Thu, 29 Feb 2024 18:15:57 +0800 Subject: feat: add module controller and continue to work on module system 1. speed up building by reducing build info sheader including 2. add module controller 3. continue to work on module system --- src/core/module/ModuleManager.cpp | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) (limited to 'src/core/module/ModuleManager.cpp') diff --git a/src/core/module/ModuleManager.cpp b/src/core/module/ModuleManager.cpp index 17191af2..f49a0b1e 100644 --- a/src/core/module/ModuleManager.cpp +++ b/src/core/module/ModuleManager.cpp @@ -84,6 +84,10 @@ class ModuleManager::Impl { return gmc_->SearchModule(std::move(module_id)); } + auto ListAllRegisteredModuleID() -> QList { + return gmc_->ListAllRegisteredModuleID(); + } + void RegisterModule(const ModulePtr& module) { Thread::TaskRunnerGetter::GetInstance() .GetTaskRunner(Thread::TaskRunnerGetter::kTaskRunnerType_Default) @@ -123,6 +127,11 @@ class ModuleManager::Impl { return gmc_->SearchEvent(std::move(trigger_id)); } + auto GetModuleListening(ModuleIdentifier module_id) + -> QList { + return gmc_->GetModuleListening(std::move(module_id)); + } + void ActiveModule(const ModuleIdentifier& identifier) { Thread::TaskRunnerGetter::GetInstance() .GetTaskRunner(Thread::TaskRunnerGetter::kTaskRunnerType_Default) @@ -209,6 +218,11 @@ void ModuleManager::ListenEvent(ModuleIdentifier module, return p_->ListenEvent(module, event); } +auto ModuleManager::GetModuleListening(ModuleIdentifier module_id) + -> QList { + return p_->GetModuleListening(module_id); +} + void ModuleManager::TriggerEvent(EventRefrernce event) { return p_->TriggerEvent(event); } @@ -250,4 +264,7 @@ auto ModuleManager::IsModuleActivated(ModuleIdentifier id) -> bool { return p_->IsModuleActivated(id); } +auto ModuleManager::ListAllRegisteredModuleID() -> QList { + return p_->ListAllRegisteredModuleID(); +}; } // namespace GpgFrontend::Module \ No newline at end of file -- cgit v1.2.3 From 84b04d88723ef05f7873082c235ecfd56facf934 Mon Sep 17 00:00:00 2001 From: saturneric Date: Thu, 29 Feb 2024 22:36:25 +0800 Subject: feat: add prefix GF to all sdk and module symbols --- src/core/module/ModuleManager.cpp | 15 +++++++++++++++ 1 file changed, 15 insertions(+) (limited to 'src/core/module/ModuleManager.cpp') diff --git a/src/core/module/ModuleManager.cpp b/src/core/module/ModuleManager.cpp index f49a0b1e..253ea8eb 100644 --- a/src/core/module/ModuleManager.cpp +++ b/src/core/module/ModuleManager.cpp @@ -143,6 +143,17 @@ class ModuleManager::Impl { __func__, nullptr)); } + void DeactiveModule(const ModuleIdentifier& identifier) { + Thread::TaskRunnerGetter::GetInstance() + .GetTaskRunner(Thread::TaskRunnerGetter::kTaskRunnerType_Default) + ->PostTask(new Thread::Task( + [=](const GpgFrontend::DataObjectPtr&) -> int { + gmc_->DeactivateModule(identifier); + return 0; + }, + __func__, nullptr)); + } + auto GetTaskRunner(ModuleIdentifier module_id) -> std::optional { return gmc_->GetTaskRunner(std::move(module_id)); @@ -236,6 +247,10 @@ void ModuleManager::ActiveModule(ModuleIdentifier id) { return p_->ActiveModule(id); } +void ModuleManager::DeactiveModule(ModuleIdentifier id) { + return p_->DeactiveModule(id); +} + auto ModuleManager::GetTaskRunner(ModuleIdentifier id) -> std::optional { return p_->GetTaskRunner(std::move(id)); -- cgit v1.2.3 From 26e24222e434036e5ec13f8ec99b958faf325154 Mon Sep 17 00:00:00 2001 From: saturneric Date: Fri, 12 Apr 2024 11:14:37 +0200 Subject: feat: add auto activate function and optimums for some structures --- src/core/module/ModuleManager.cpp | 19 ++++++++++++++++++- 1 file changed, 18 insertions(+), 1 deletion(-) (limited to 'src/core/module/ModuleManager.cpp') diff --git a/src/core/module/ModuleManager.cpp b/src/core/module/ModuleManager.cpp index 253ea8eb..0e1f6984 100644 --- a/src/core/module/ModuleManager.cpp +++ b/src/core/module/ModuleManager.cpp @@ -34,9 +34,11 @@ #include "GpgConstants.h" #include "core/function/SecureMemoryAllocator.h" #include "core/function/basic/GpgFunctionObject.h" +#include "core/model/SettingsObject.h" #include "core/module/GlobalModuleContext.h" #include "core/module/GlobalRegisterTable.h" #include "core/module/Module.h" +#include "core/struct/settings_object/ModuleSO.h" #include "core/thread/Task.h" #include "core/thread/TaskRunnerGetter.h" #include "core/utils/MemoryUtils.h" @@ -75,7 +77,22 @@ class ModuleManager::Impl { } module->SetGPC(gmc_.get()); - return gmc_->RegisterModule(module) ? 0 : -1; + if (!gmc_->RegisterModule(module)) return -1; + + SettingsObject so( + QString("module.%1.so").arg(module->GetModuleIdentifier())); + ModuleSO module_so(so); + + // if user has set auto active enable + if (module_so.module_id == module->GetModuleIdentifier() && + module_so.module_hash == module->GetModuleHash() && + module_so.auto_activate) { + if (gmc_->ActiveModule(module->GetModuleIdentifier())) { + return -1; + } + } + + return 0; }, __func__, nullptr)); } -- cgit v1.2.3 From 5967d6ccd9e382254a4fffdf5b54655b0faae6fb Mon Sep 17 00:00:00 2001 From: saturneric Date: Sun, 14 Apr 2024 10:19:01 +0200 Subject: fix: use qt designer placeholder instead of custom initialized --- src/core/module/ModuleManager.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'src/core/module/ModuleManager.cpp') diff --git a/src/core/module/ModuleManager.cpp b/src/core/module/ModuleManager.cpp index 0e1f6984..6da48eec 100644 --- a/src/core/module/ModuleManager.cpp +++ b/src/core/module/ModuleManager.cpp @@ -203,7 +203,7 @@ class ModuleManager::Impl { QList module_libraries_; }; -auto IsModuleAcivate(ModuleIdentifier id) -> bool { +auto IsModuleActivate(ModuleIdentifier id) -> bool { return ModuleManager::GetInstance().IsModuleActivated(id); } -- cgit v1.2.3 From cb2672ca430c54244df7bd46ef97256c3d840cbf Mon Sep 17 00:00:00 2001 From: saturneric Date: Sun, 14 Apr 2024 14:56:18 +0200 Subject: feat: add a grt viewer and solve some issues in gnupg info tab --- src/core/module/ModuleManager.cpp | 5 +++++ 1 file changed, 5 insertions(+) (limited to 'src/core/module/ModuleManager.cpp') diff --git a/src/core/module/ModuleManager.cpp b/src/core/module/ModuleManager.cpp index 6da48eec..e00c8c8c 100644 --- a/src/core/module/ModuleManager.cpp +++ b/src/core/module/ModuleManager.cpp @@ -196,6 +196,8 @@ class ModuleManager::Impl { return gmc_->IsModuleActivated(id); } + auto GRT() -> GlobalRegisterTable* { return grt_.get(); } + private: static ModuleMangerPtr global_module_manager; SecureUniquePtr gmc_; @@ -299,4 +301,7 @@ auto ModuleManager::IsModuleActivated(ModuleIdentifier id) -> bool { auto ModuleManager::ListAllRegisteredModuleID() -> QList { return p_->ListAllRegisteredModuleID(); }; + +auto ModuleManager::GRT() -> GlobalRegisterTable* { return p_->GRT(); } + } // namespace GpgFrontend::Module \ No newline at end of file -- cgit v1.2.3 From 3d2ab7c349b02740511f0f2113fd80f7f44c8333 Mon Sep 17 00:00:00 2001 From: saturneric Date: Tue, 30 Apr 2024 16:07:33 +0200 Subject: feat: improve functions and ui on module --- src/core/module/ModuleManager.cpp | 50 ++++++++++++++++++++++++++++++--------- 1 file changed, 39 insertions(+), 11 deletions(-) (limited to 'src/core/module/ModuleManager.cpp') diff --git a/src/core/module/ModuleManager.cpp b/src/core/module/ModuleManager.cpp index e00c8c8c..7094b801 100644 --- a/src/core/module/ModuleManager.cpp +++ b/src/core/module/ModuleManager.cpp @@ -53,7 +53,8 @@ class ModuleManager::Impl { ~Impl() = default; - auto LoadAndRegisterModule(const QString& module_library_path) -> void { + auto LoadAndRegisterModule(const QString& module_library_path, + bool integrated_module) -> void { Thread::TaskRunnerGetter::GetInstance() .GetTaskRunner(Thread::TaskRunnerGetter::kTaskRunnerType_Default) ->PostTask(new Thread::Task( @@ -77,21 +78,39 @@ class ModuleManager::Impl { } module->SetGPC(gmc_.get()); - if (!gmc_->RegisterModule(module)) return -1; + if (!gmc_->RegisterModule(module, integrated_module)) return -1; - SettingsObject so( - QString("module.%1.so").arg(module->GetModuleIdentifier())); + const auto module_id = module->GetModuleIdentifier(); + const auto module_hash = module->GetModuleHash(); + + SettingsObject so(QString("module.%1.so").arg(module_id)); ModuleSO module_so(so); // if user has set auto active enable - if (module_so.module_id == module->GetModuleIdentifier() && - module_so.module_hash == module->GetModuleHash() && - module_so.auto_activate) { - if (gmc_->ActiveModule(module->GetModuleIdentifier())) { + if ((module_so.module_id == module_id && + module_so.module_hash == module_hash && + module_so.auto_activate) || + // integrated modules activate by default + ((module_so.module_id.isEmpty() || + module_so.module_hash.isEmpty()) && + integrated_module)) { + if (!gmc_->ActiveModule(module_id)) { return -1; } } + // reset module settings after change + if ((module_so.module_id.isEmpty() || + module_so.module_id != module_id) || + (module_so.module_hash.isEmpty() || + module_so.module_hash != module_hash)) { + module_so.module_id = module_id; + module_so.module_hash = module_hash; + module_so.auto_activate = integrated_module; + + so.Store(module_so.ToJson()); + } + return 0; }, __func__, nullptr)); @@ -111,7 +130,7 @@ class ModuleManager::Impl { ->PostTask(new Thread::Task( [=](GpgFrontend::DataObjectPtr) -> int { module->SetGPC(gmc_.get()); - return gmc_->RegisterModule(module) ? 0 : -1; + return gmc_->RegisterModule(module, false) ? 0 : -1; }, __func__, nullptr)); } @@ -196,6 +215,10 @@ class ModuleManager::Impl { return gmc_->IsModuleActivated(id); } + auto IsIntegratedModule(ModuleIdentifier id) -> bool { + return gmc_->IsIntegratedModule(id); + } + auto GRT() -> GlobalRegisterTable* { return grt_.get(); } private: @@ -231,8 +254,9 @@ ModuleManager::ModuleManager(int channel) ModuleManager::~ModuleManager() = default; -void ModuleManager::LoadModule(QString module_library_path) { - return p_->LoadAndRegisterModule(module_library_path); +void ModuleManager::LoadModule(QString module_library_path, + bool integrated_module) { + return p_->LoadAndRegisterModule(module_library_path, integrated_module); } auto ModuleManager::SearchModule(ModuleIdentifier module_id) -> ModulePtr { @@ -298,6 +322,10 @@ auto ModuleManager::IsModuleActivated(ModuleIdentifier id) -> bool { return p_->IsModuleActivated(id); } +auto ModuleManager::IsIntegratedModule(ModuleIdentifier id) -> bool { + return p_->IsIntegratedModule(id); +} + auto ModuleManager::ListAllRegisteredModuleID() -> QList { return p_->ListAllRegisteredModuleID(); }; -- cgit v1.2.3 From 46870f10fdbc18d695242c945c0c39e4d832ec39 Mon Sep 17 00:00:00 2001 From: saturneric Date: Tue, 30 Apr 2024 19:58:36 +0200 Subject: fix: reset module settings object in a proper way --- src/core/module/ModuleManager.cpp | 39 ++++++++++++++++----------------------- 1 file changed, 16 insertions(+), 23 deletions(-) (limited to 'src/core/module/ModuleManager.cpp') diff --git a/src/core/module/ModuleManager.cpp b/src/core/module/ModuleManager.cpp index 7094b801..d07ca989 100644 --- a/src/core/module/ModuleManager.cpp +++ b/src/core/module/ModuleManager.cpp @@ -31,7 +31,6 @@ #include #include -#include "GpgConstants.h" #include "core/function/SecureMemoryAllocator.h" #include "core/function/basic/GpgFunctionObject.h" #include "core/model/SettingsObject.h" @@ -86,31 +85,25 @@ class ModuleManager::Impl { SettingsObject so(QString("module.%1.so").arg(module_id)); ModuleSO module_so(so); - // if user has set auto active enable - if ((module_so.module_id == module_id && - module_so.module_hash == module_hash && - module_so.auto_activate) || - // integrated modules activate by default - ((module_so.module_id.isEmpty() || - module_so.module_hash.isEmpty()) && - integrated_module)) { - if (!gmc_->ActiveModule(module_id)) { - return -1; - } - } - - // reset module settings after change - if ((module_so.module_id.isEmpty() || - module_so.module_id != module_id) || - (module_so.module_hash.isEmpty() || - module_so.module_hash != module_hash)) { + // reset module settings if necessary + if (module_so.module_id != module_id || + module_so.module_hash != module_hash) { module_so.module_id = module_id; module_so.module_hash = module_hash; + // auto active integrated module by default module_so.auto_activate = integrated_module; + module_so.set_by_user = false; so.Store(module_so.ToJson()); } + // if this module need auto active + if (module_so.auto_activate) { + if (!gmc_->ActiveModule(module_id)) { + return -1; + } + } + return 0; }, __func__, nullptr)); @@ -147,7 +140,7 @@ class ModuleManager::Impl { __func__, nullptr)); } - void TriggerEvent(const EventRefrernce& event) { + void TriggerEvent(const EventReference& event) { Thread::TaskRunnerGetter::GetInstance() .GetTaskRunner(Thread::TaskRunnerGetter::kTaskRunnerType_Default) ->PostTask(new Thread::Task( @@ -159,7 +152,7 @@ class ModuleManager::Impl { } auto SearchEvent(EventTriggerIdentifier trigger_id) - -> std::optional { + -> std::optional { return gmc_->SearchEvent(std::move(trigger_id)); } @@ -277,12 +270,12 @@ auto ModuleManager::GetModuleListening(ModuleIdentifier module_id) return p_->GetModuleListening(module_id); } -void ModuleManager::TriggerEvent(EventRefrernce event) { +void ModuleManager::TriggerEvent(EventReference event) { return p_->TriggerEvent(event); } auto ModuleManager::SearchEvent(EventTriggerIdentifier trigger_id) - -> std::optional { + -> std::optional { return p_->SearchEvent(std::move(trigger_id)); } -- cgit v1.2.3