diff --git a/services/cert_manager_standard/cert_manager_engine/main/core/include/cm_event_process.h b/services/cert_manager_standard/cert_manager_engine/main/core/include/cm_event_process.h index a118f6f9c28a71a2dd01f84a0e31c4441de7d395..d591bbf0f01dbebcdb43a96660be2cf5f62c9d12 100644 --- a/services/cert_manager_standard/cert_manager_engine/main/core/include/cm_event_process.h +++ b/services/cert_manager_standard/cert_manager_engine/main/core/include/cm_event_process.h @@ -27,6 +27,7 @@ extern "C" { #define INVALID_VALUE 0XFFFFFFFF int32_t CmDeleteProcessInfo(const struct CmContext *context); +void CmUserAddedProcess(uint32_t userId); #ifdef __cplusplus } diff --git a/services/cert_manager_standard/cert_manager_engine/main/core/src/cm_event_process.c b/services/cert_manager_standard/cert_manager_engine/main/core/src/cm_event_process.c index 859f00cd6ec92a755a1b94aeb619c8fbc820e72f..c9a8e7cbdc2be2fe74c504f47dd37b0f844817ef 100644 --- a/services/cert_manager_standard/cert_manager_engine/main/core/src/cm_event_process.c +++ b/services/cert_manager_standard/cert_manager_engine/main/core/src/cm_event_process.c @@ -509,3 +509,18 @@ int32_t CmDeleteProcessInfo(const struct CmContext *context) return ret; } + +void CmUserAddedProcess(uint32_t userId) +{ + char userIdPath[CERT_MAX_PATH_LEN] = { 0 }; + if (sprintf_s(userIdPath, CERT_MAX_PATH_LEN, "%s/%u", CERT_BACKUP_ROOT_DIR, userId) < 0) { + CM_LOG_E("Construct userIdPath failed"); + return; + } + + int32_t ret = CmUserBakupMakeDir(userIdPath, NULL); + if (ret != CMR_OK) { + CM_LOG_E("Create userIdPath failed, err code: %d", ret); + } + return; +} diff --git a/services/cert_manager_standard/cert_manager_service.cfg b/services/cert_manager_standard/cert_manager_service.cfg index 193d499326356c6634548ab25296cd403451c456..b8fd741a0b641bcad58688081168e3ad73e90465 100644 --- a/services/cert_manager_standard/cert_manager_service.cfg +++ b/services/cert_manager_standard/cert_manager_service.cfg @@ -9,6 +9,8 @@ "mkdir /data/service/el1/public/cert_manager_service/certificates/user 0700 cert_manager_server cert_manager_server", "mkdir /data/service/el1/public/cert_manager_service/certificates/priv_credential 0700 cert_manager_server cert_manager_server", "mkdir /data/service/el1/public/cert_manager_service/certificates/user_open 0701 cert_manager_server cert_manager_server", + "mkdir /data/service/el1/public/cert_manager_service/certificates/user_open/0 0705 cert_manager_server cert_manager_server", + "mkdir /data/service/el1/public/cert_manager_service/certificates/user_open/100 0705 cert_manager_server cert_manager_server", "mkdir /data/service/el1/public/cert_manager_service/certificates/user_config 0700 cert_manager_server cert_manager_server", "mkdir /data/service/el1/public/cert_manager_service/certificates/sys_credential 0700 cert_manager_server cert_manager_server", "mkdir /data/service/el1/public/cert_manager_service/rdb 0700 cert_manager_server cert_manager_server" 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 aa456bf8a1ccc9499578711db1512213d201e0cd..613ed4cd81616210d930de9ee6c577fe9ec23737 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 @@ -52,8 +52,12 @@ void SystemEventSubscriber::OnReceiveEvent(const OHOS::EventFwk::CommonEventData CmDeleteProcessInfo(&context); } else if (action == OHOS::EventFwk::CommonEventSupport::COMMON_EVENT_USER_REMOVED) { context.userId = static_cast(data.GetCode()); - CM_LOG_D("CmService user removed: userId is %d", context.userId); + CM_LOG_D("CmService user removed: userId is %u", context.userId); CmDeleteProcessInfo(&context); + } else if (action == OHOS::EventFwk::CommonEventSupport::COMMON_EVENT_USER_ADDED) { + uint32_t userId = static_cast(data.GetCode()); + CM_LOG_D("CmService user added: userId is %u", userId); + CmUserAddedProcess(userId); } } @@ -70,6 +74,7 @@ bool SystemEventObserver::SubscribeSystemEvent() matchingSkills.AddEvent(EventFwk::CommonEventSupport::COMMON_EVENT_PACKAGE_REMOVED); matchingSkills.AddEvent(EventFwk::CommonEventSupport::COMMON_EVENT_SANDBOX_PACKAGE_REMOVED); matchingSkills.AddEvent(EventFwk::CommonEventSupport::COMMON_EVENT_USER_REMOVED); + matchingSkills.AddEvent(EventFwk::CommonEventSupport::COMMON_EVENT_USER_ADDED); OHOS::EventFwk::CommonEventSubscribeInfo subscriberInfo(matchingSkills); systemEventSubscriber_ = std::make_shared(subscriberInfo); 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 bd54929a8ca88094acef6b4330044d929cf5a911..5829e9b2c69a5d985b9d1332cbecdb584020bae1 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 @@ -44,6 +44,7 @@ const uint32_t DELAY_INTERVAL = 200000; /* delay 200ms waiting for system event const std::string TASK_ID = "unload"; const uint32_t DELAY_TIME = 180000; /* delay 180000ms to unload SA */ const std::string USER_REMOVED_EVENT = "usual.event.USER_REMOVED"; +const std::string USER_ADDED_EVENT = "usual.event.USER_ADDED"; constexpr int CM_IPC_THREAD_NUM = 32; @@ -253,12 +254,17 @@ void CertManagerService::OnStart(const SystemAbilityOnDemandReason& startReason) } CM_LOG_D("certmanager start reason %s", startReason.GetName().c_str()); - if (startReason.GetId() == OnDemandReasonId::COMMON_EVENT && - startReason.GetName() == USER_REMOVED_EVENT) { - struct CmContext context = { 0, INVALID_VALUE, {0} }; - context.userId = (uint32_t)startReason.GetExtraData().GetCode(); - CM_LOG_D("user remove event, userId = %u", context.userId); - CmDeleteProcessInfo(&context); + if (startReason.GetId() == OnDemandReasonId::COMMON_EVENT) { + if (startReason.GetName() == USER_REMOVED_EVENT) { + struct CmContext context = { 0, INVALID_VALUE, {0} }; + context.userId = static_cast(startReason.GetExtraData().GetCode()); + CM_LOG_D("user remove event, userId = %u", context.userId); + CmDeleteProcessInfo(&context); + } else if (startReason.GetName() == USER_ADDED_EVENT) { + uint32_t userId = static_cast(startReason.GetExtraData().GetCode()); + CM_LOG_D("user added event, userId = %u", userId); + CmUserAddedProcess(userId); + } } IPCSkeleton::SetMaxWorkThreadNum(CM_IPC_THREAD_NUM); diff --git a/services/cert_manager_standard/cert_manager_service/main/os_dependency/sa/sa_profile/cert_manager_service.json b/services/cert_manager_standard/cert_manager_service/main/os_dependency/sa/sa_profile/cert_manager_service.json index 5688c9aec0dcbc41560665ba872aaed3036bb2e5..b82554c48b712a31a593b6f42f4cedb59625145a 100644 --- a/services/cert_manager_standard/cert_manager_service/main/os_dependency/sa/sa_profile/cert_manager_service.json +++ b/services/cert_manager_standard/cert_manager_service/main/os_dependency/sa/sa_profile/cert_manager_service.json @@ -13,6 +13,9 @@ { "name":"usual.event.USER_REMOVED" }, + { + "name":"usual.event.USER_ADDED" + }, { "name":"usual.event.PACKAGE_REMOVED" }