diff --git a/services/cert_manager_standard/cert_manager_service/main/os_dependency/idl/cm_ipc/cm_ipc_service.h b/services/cert_manager_standard/cert_manager_service/main/os_dependency/idl/cm_ipc/cm_ipc_service.h index 8849f0d2ee90a5cd5049e98ab8df65d015d87cb1..3f594609830151f4d65fbf58f1abf3605aa04ff1 100644 --- a/services/cert_manager_standard/cert_manager_service/main/os_dependency/idl/cm_ipc/cm_ipc_service.h +++ b/services/cert_manager_standard/cert_manager_service/main/os_dependency/idl/cm_ipc/cm_ipc_service.h @@ -25,6 +25,7 @@ extern "C" { struct CertParam { uint8_t *aliasBuff; uint8_t *passWdBuff; + struct CmContext *cmContext; }; void CmIpcServiceGetCertificateList(const struct CmBlob *srcData, const struct CmContext *context); diff --git a/services/cert_manager_standard/cert_manager_service/main/os_dependency/sa/cm_event_observer.cpp b/services/cert_manager_standard/cert_manager_service/main/os_dependency/sa/cm_event_observer.cpp index be71ff688d520549907d7de55a8e401c0343a5c3..5a471e96f639dcaf2445a13caa47c493edecf6d1 100644 --- a/services/cert_manager_standard/cert_manager_service/main/os_dependency/sa/cm_event_observer.cpp +++ b/services/cert_manager_standard/cert_manager_service/main/os_dependency/sa/cm_event_observer.cpp @@ -26,7 +26,7 @@ namespace OHOS { namespace Security { -namespace Cm { +namespace CertManager { std::shared_ptr SystemEventObserver::systemEventSubscriber_ = nullptr; SystemEventSubscriber::SystemEventSubscriber(const OHOS::EventFwk::CommonEventSubscribeInfo &subscriberInfo) @@ -36,9 +36,10 @@ SystemEventSubscriber::SystemEventSubscriber(const OHOS::EventFwk::CommonEventSu void SystemEventSubscriber::OnReceiveEvent(const OHOS::EventFwk::CommonEventData &data) { + CM_LOG_I("SystemEventSubscriber::OnReceiveEvent"); int userId; struct CmContext context; - context.userId = INVALID_VALUE; + context.uid = INVALID_VALUE; auto want = data.GetWant(); std::string action = want.GetAction(); if (action == OHOS::EventFwk::CommonEventSupport::COMMON_EVENT_PACKAGE_REMOVED || diff --git a/services/cert_manager_standard/cert_manager_service/main/os_dependency/sa/cm_event_observer.h b/services/cert_manager_standard/cert_manager_service/main/os_dependency/sa/cm_event_observer.h index 092cfa75587e33afab11617065e7783ca2e61351..fd6bd40eec9927521bcf03f9357bee4d0e053a7d 100644 --- a/services/cert_manager_standard/cert_manager_service/main/os_dependency/sa/cm_event_observer.h +++ b/services/cert_manager_standard/cert_manager_service/main/os_dependency/sa/cm_event_observer.h @@ -22,12 +22,12 @@ namespace OHOS { namespace Security { -namespace Cm { +namespace CertManager { class SystemEventSubscriber : public OHOS::EventFwk::CommonEventSubscriber { public: explicit SystemEventSubscriber(const OHOS::EventFwk::CommonEventSubscribeInfo &subscriberInfo); ~SystemEventSubscriber() = default; - virtual void OnReceiveEvent(const OHOS::EventFwk::CommonEventData &data); + void OnReceiveEvent(const OHOS::EventFwk::CommonEventData &data) override; }; class SystemEventObserver { diff --git a/services/cert_manager_standard/cert_manager_service/main/os_dependency/sa/cm_sa.cpp b/services/cert_manager_standard/cert_manager_service/main/os_dependency/sa/cm_sa.cpp index d280fe478699d76784c120eb75cdb150fb2da381..7d9338cc49862df000a5998dcdf7f8e174097cb7 100644 --- a/services/cert_manager_standard/cert_manager_service/main/os_dependency/sa/cm_sa.cpp +++ b/services/cert_manager_standard/cert_manager_service/main/os_dependency/sa/cm_sa.cpp @@ -14,18 +14,18 @@ */ #include "cm_sa.h" - #include "ipc_skeleton.h" #include "iservice_registry.h" #include "string_ex.h" #include "system_ability_definition.h" - #include "cm_log.h" #include "cm_mem.h" #include "cm_ipc_service.h" - #include "cert_manager.h" #include "cert_manager_type.h" +#include +#include +#include "cm_event_observer.h" static bool g_certManagerStatusInit = false; @@ -37,6 +37,8 @@ REGISTER_SYSTEM_ABILITY_BY_ID(CertManagerService, SA_ID_KEYSTORE_SERVICE, true); std::mutex CertManagerService::instanceLock; sptr CertManagerService::instance; const uint32_t MAX_MALLOC_LEN = 1 * 1024 * 1024; /* max malloc size 1 MB */ +const uint32_t MAX_DELAY_TIMES = 100; +const uint32_t DELAY_INTERVAL = 200000; /* delay 200ms waiting for system event */ using CmIpcHandlerFuncProc = void (*)(const struct CmBlob *msg, const CmContext *context); @@ -102,6 +104,32 @@ static struct CmIpcEntryPoint g_cmIpcMessageHandler[] = { { CM_MSG_SET_CERTIFICATE_STATUS, CmIpcServiceSetCertStatus }, }; +static void SubscribEvent() +{ + for (uint32_t i = 0; i < MAX_DELAY_TIMES; ++i) { + if (SystemEventObserver::SubscribeSystemEvent()) { + CM_LOG_I("subscribe system event success, i = %u", i); + return; + } else { + CM_LOG_E("subscribe system event failed %u times", i); + usleep(DELAY_INTERVAL); + } + } + CM_LOG_E("subscribe system event failed"); + return; +} + +static void CmSubscribeSystemEvent() +{ + pthread_t subscribeThread; + if ((pthread_create(&subscribeThread, nullptr, (void *(*)(void *))SubscribEvent, nullptr)) == -1) { + CM_LOG_E("create thread failed"); + return; + } + + CM_LOG_I("create thread success"); +} + static inline bool IsInvalidLength(uint32_t length) { return (length == 0) || (length > MAX_MALLOC_LEN); @@ -256,10 +284,23 @@ void CertManagerService::OnStart() } } + (void)AddSystemAbilityListener(COMMON_EVENT_SERVICE_ID); + runningState_ = STATE_RUNNING; CM_LOG_I("CertManagerService start success."); } +void CertManagerService::OnAddSystemAbility(int32_t systemAbilityId, const std::string &deviceId) +{ + CM_LOG_I("systemAbilityId is %d!", systemAbilityId); + CmSubscribeSystemEvent(); +} + +void CertManagerService::OnRemoveSystemAbility(int32_t systemAbilityId, const std::string& deviceId) +{ + CM_LOG_I("systemAbilityId is %d!", systemAbilityId); +} + void CertManagerService::OnStop() { CM_LOG_I("CertManagerService Service OnStop"); diff --git a/services/cert_manager_standard/cert_manager_service/main/os_dependency/sa/cm_sa.h b/services/cert_manager_standard/cert_manager_service/main/os_dependency/sa/cm_sa.h index 1c0ee55c1c605262ce30b89c99264e06379230fb..0269f182248c66a02f85e3603c9238c3f7d6264b 100644 --- a/services/cert_manager_standard/cert_manager_service/main/os_dependency/sa/cm_sa.h +++ b/services/cert_manager_standard/cert_manager_service/main/os_dependency/sa/cm_sa.h @@ -56,6 +56,8 @@ public: protected: void OnStart() override; void OnStop() override; + void OnAddSystemAbility(int32_t systemAbilityId, const std::string &deviceId) override; + void OnRemoveSystemAbility(int32_t systemAbilityId, const std::string& deviceId) override; private: CertManagerService();