From cacc7946040594155463f620fc694dda1d5175a9 Mon Sep 17 00:00:00 2001 From: zhangzezhong Date: Fri, 8 Aug 2025 15:24:11 +0800 Subject: [PATCH] =?UTF-8?q?OTA=20=E8=87=AA=E5=90=AF=E6=B5=8B=E8=AF=95?= =?UTF-8?q?=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: zhangzezhong --- .../ability_auto_startup_data_manager.h | 8 +- .../include/ability_auto_startup_service.h | 17 +- .../src/ability_auto_startup_data_manager.cpp | 113 +++---- .../src/ability_auto_startup_service.cpp | 282 ++++++++---------- 4 files changed, 182 insertions(+), 238 deletions(-) diff --git a/services/abilitymgr/include/ability_auto_startup_data_manager.h b/services/abilitymgr/include/ability_auto_startup_data_manager.h index 9abee27b744..3cc62389073 100644 --- a/services/abilitymgr/include/ability_auto_startup_data_manager.h +++ b/services/abilitymgr/include/ability_auto_startup_data_manager.h @@ -42,7 +42,7 @@ public: AutoStartupStatus QueryAutoStartupData(const AutoStartupInfo &info); - int32_t QueryAllAutoStartupApplications(std::vector &infoList, int32_t userId, bool isCalledByEDM); + int32_t QueryAllAutoStartupApplications(std::vector &infoList, int32_t userId); int32_t GetCurrentAppAutoStartupData(const std::string &bundleName, std::vector &infoList, const std::string &accessTokenId); @@ -52,13 +52,11 @@ private: DistributedKv::Status GetKvStore(); bool CheckKvStore(); DistributedKv::Value ConvertAutoStartupStatusToValue( - const AutoStartupInfo &info, bool isAutoStartup, bool isEdmForce); - void ConvertAutoStartupStatusFromValue(const DistributedKv::Value &value, AutoStartupStatus &startupStatus); + bool isAutoStartup, bool isEdmForce, const std::string &abilityTypeName); + void ConvertAutoStartupStatusFromValue(const DistributedKv::Value &value, bool &isAutoStartup, bool &isEdmForce); DistributedKv::Key ConvertAutoStartupDataToKey(const AutoStartupInfo &info); AutoStartupInfo ConvertAutoStartupInfoFromKeyAndValue( const DistributedKv::Key &key, const DistributedKv::Value &value); - void ConvertAutoStartupInfoFromKey(const DistributedKv::Key &key, AutoStartupInfo &info); - void ConvertAutoStartupInfoFromValue(const DistributedKv::Value &value, AutoStartupInfo &info); bool IsEqual(const DistributedKv::Key &key, const AutoStartupInfo &info); bool IsEqual(const DistributedKv::Key &key, const std::string &accessTokenId); bool IsEqual(const DistributedKv::Key &key, int32_t userId); diff --git a/services/abilitymgr/include/ability_auto_startup_service.h b/services/abilitymgr/include/ability_auto_startup_service.h index a9ea45b1101..e1afb9dd8e2 100644 --- a/services/abilitymgr/include/ability_auto_startup_service.h +++ b/services/abilitymgr/include/ability_auto_startup_service.h @@ -144,20 +144,19 @@ private: void CleanResource(const wptr &remote); std::string GetSelfApplicationBundleName(); bool CheckSelfApplication(const std::string &bundleName); - int32_t GetValidUserId(int32_t userId); - bool GetBundleInfo(const std::string &bundleName, int32_t userId, int32_t appIndex, - AppExecFwk::BundleInfo &bundleInfo); - bool GetAbilityData(const AutoStartupInfo &info, AutoStartupAbilityData &abilityData); - bool IsTargetAbility(const AutoStartupInfo &info, const AppExecFwk::AbilityInfo &abilityInfo); - bool IsTargetExtension(const AutoStartupInfo &info, const AppExecFwk::ExtensionAbilityInfo &extensionInfo); - std::string GetAbilityTypeName(const AppExecFwk::AbilityInfo &abilityInfo); - std::string GetExtensionTypeName(const AppExecFwk::ExtensionAbilityInfo &extensionInfo); + bool GetBundleInfo(const std::string &bundleName, AppExecFwk::BundleInfo &bundleInfo, int32_t uid, + int32_t &userId, int32_t appIndex); + bool GetAbilityData(const AutoStartupInfo &info, bool &isVisible, + std::string &abilityTypeName, std::string &accessTokenId, int32_t &userId); + std::string GetAbilityTypeName(AppExecFwk::AbilityInfo abilityInfo); + std::string GetExtensionTypeName(AppExecFwk::ExtensionAbilityInfo extensionInfo); std::shared_ptr GetBundleMgrClient(); int32_t CheckPermissionForSystem(); int32_t CheckPermissionForSelf(const std::string &bundleName); int32_t CheckPermissionForEDM(); int32_t InnerApplicationAutoStartupByEDM(const AutoStartupInfo &info, bool isSet, bool flag); - int32_t GetAbilityInfo(const AutoStartupInfo &info, AutoStartupAbilityData &abilityData); + int32_t GetAbilityInfo(const AutoStartupInfo &info, std::string &abilityTypeName, + std::string &accessTokenId, int32_t &userId); void GetCallbackVector(std::vector>& callbackVector); mutable std::mutex autoStartUpMutex_; diff --git a/services/abilitymgr/src/ability_auto_startup_data_manager.cpp b/services/abilitymgr/src/ability_auto_startup_data_manager.cpp index 91e31782c06..3ba31688adc 100644 --- a/services/abilitymgr/src/ability_auto_startup_data_manager.cpp +++ b/services/abilitymgr/src/ability_auto_startup_data_manager.cpp @@ -17,7 +17,6 @@ #include -#include "ability_manager_constants.h" #include "accesstoken_kit.h" #include "hilog_tag_wrapper.h" #include "json_utils.h" @@ -25,7 +24,6 @@ namespace OHOS { namespace AbilityRuntime { -using namespace OHOS::AAFwk; namespace { constexpr int32_t CHECK_INTERVAL = 100000; // 100ms constexpr int32_t MAX_TIMES = 5; // 5 * 100ms = 500ms @@ -38,9 +36,7 @@ const std::string JSON_KEY_IS_EDM_FORCE = "isEdmForce"; const std::string JSON_KEY_TYPE_NAME = "abilityTypeName"; const std::string JSON_KEY_APP_CLONE_INDEX = "appCloneIndex"; const std::string JSON_KEY_ACCESS_TOKENID = "accessTokenId"; -const std::string JSON_KEY_SETTER_USERID = "setterUserId"; const std::string JSON_KEY_USERID = "userId"; -const std::string JSON_KEY_SETTER_TYPE = "setterType"; } // namespace const DistributedKv::AppId AbilityAutoStartupDataManager::APP_ID = { "auto_startup_storage" }; const DistributedKv::StoreId AbilityAutoStartupDataManager::STORE_ID = { "auto_startup_infos" }; @@ -116,18 +112,16 @@ bool AbilityAutoStartupDataManager::CheckKvStore() int32_t AbilityAutoStartupDataManager::InsertAutoStartupData( const AutoStartupInfo &info, bool isAutoStartup, bool isEdmForce) { - if (info.bundleName.empty() || info.abilityName.empty() || info.accessTokenId.empty() || - info.setterUserId == -1 || info.userId == -1 || info.setterType == AutoStartupSetterType::UNSPECIFIED) { + if (info.bundleName.empty() || info.abilityName.empty() || info.accessTokenId.empty() || info.userId == -1) { TAG_LOGE(AAFwkTag::AUTO_STARTUP, "Invalid value"); return ERR_INVALID_VALUE; } TAG_LOGD(AAFwkTag::AUTO_STARTUP, "bundleName: %{public}s, moduleName: %{public}s, abilityName: %{public}s," - " accessTokenId: %{public}s, setterUserId: %{public}d, userId: %{public}d, setterType: %{public}d", + " accessTokenId: %{public}s, userId: %{public}d", info.bundleName.c_str(), info.moduleName.c_str(), - info.abilityName.c_str(), info.accessTokenId.c_str(), info.setterUserId, info.userId, - static_cast(info.setterType)); + info.abilityName.c_str(), info.accessTokenId.c_str(), info.userId); { std::lock_guard lock(kvStorePtrMutex_); if (!CheckKvStore()) { @@ -137,7 +131,7 @@ int32_t AbilityAutoStartupDataManager::InsertAutoStartupData( } DistributedKv::Key key = ConvertAutoStartupDataToKey(info); - DistributedKv::Value value = ConvertAutoStartupStatusToValue(info, isAutoStartup, isEdmForce); + DistributedKv::Value value = ConvertAutoStartupStatusToValue(isAutoStartup, isEdmForce, info.abilityTypeName); DistributedKv::Status status; { std::lock_guard lock(kvStorePtrMutex_); @@ -158,18 +152,16 @@ int32_t AbilityAutoStartupDataManager::InsertAutoStartupData( int32_t AbilityAutoStartupDataManager::UpdateAutoStartupData( const AutoStartupInfo &info, bool isAutoStartup, bool isEdmForce) { - if (info.bundleName.empty() || info.abilityName.empty() || info.accessTokenId.empty() || - info.setterUserId == -1 || info.userId == -1 || info.setterType == AutoStartupSetterType::UNSPECIFIED) { + if (info.bundleName.empty() || info.abilityName.empty() || info.accessTokenId.empty() || info.userId == -1) { TAG_LOGW(AAFwkTag::AUTO_STARTUP, "Invalid value"); return ERR_INVALID_VALUE; } TAG_LOGD(AAFwkTag::AUTO_STARTUP, "bundleName: %{public}s, moduleName: %{public}s, abilityName: %{public}s," - " accessTokenId: %{public}s, setterUserId: %{public}d, userId: %{public}d, setterType: %{public}d", + " accessTokenId: %{public}s, userId: %{public}d", info.bundleName.c_str(), info.moduleName.c_str(), - info.abilityName.c_str(), info.accessTokenId.c_str(), info.setterUserId, info.userId, - static_cast(info.setterType)); + info.abilityName.c_str(), info.accessTokenId.c_str(), info.userId); { std::lock_guard lock(kvStorePtrMutex_); if (!CheckKvStore()) { @@ -192,7 +184,7 @@ int32_t AbilityAutoStartupDataManager::UpdateAutoStartupData( } return ERR_INVALID_OPERATION; } - DistributedKv::Value value = ConvertAutoStartupStatusToValue(info, isAutoStartup, isEdmForce); + DistributedKv::Value value = ConvertAutoStartupStatusToValue(isAutoStartup, isEdmForce, info.abilityTypeName); { std::lock_guard lock(kvStorePtrMutex_); status = kvStorePtr_->Put(key, value); @@ -218,7 +210,7 @@ int32_t AbilityAutoStartupDataManager::DeleteAutoStartupData(const AutoStartupIn TAG_LOGD(AAFwkTag::AUTO_STARTUP, "bundleName: %{public}s, moduleName: %{public}s, abilityName: %{public}s," - " accessTokenId: %{public}s, userId:%{public}d", + " accessTokenId: %{public}s, userId: %{public}d", info.bundleName.c_str(), info.moduleName.c_str(), info.abilityName.c_str(), info.accessTokenId.c_str(), info.userId); { @@ -302,11 +294,11 @@ int32_t AbilityAutoStartupDataManager::DeleteAutoStartupData(const std::string & AutoStartupStatus AbilityAutoStartupDataManager::QueryAutoStartupData(const AutoStartupInfo &info) { - AutoStartupStatus startupStatus; + AutoStartupStatus asustatus; if (info.bundleName.empty() || info.abilityName.empty() || info.accessTokenId.empty() || info.userId == -1) { TAG_LOGW(AAFwkTag::AUTO_STARTUP, "Invalid value"); - startupStatus.code = ERR_INVALID_VALUE; - return startupStatus; + asustatus.code = ERR_INVALID_VALUE; + return asustatus; } TAG_LOGD(AAFwkTag::AUTO_STARTUP, @@ -318,8 +310,8 @@ AutoStartupStatus AbilityAutoStartupDataManager::QueryAutoStartupData(const Auto std::lock_guard lock(kvStorePtrMutex_); if (!CheckKvStore()) { TAG_LOGE(AAFwkTag::AUTO_STARTUP, "null kvStore"); - startupStatus.code = ERR_NO_INIT; - return startupStatus; + asustatus.code = ERR_NO_INIT; + return asustatus; } } @@ -335,23 +327,23 @@ AutoStartupStatus AbilityAutoStartupDataManager::QueryAutoStartupData(const Auto std::lock_guard lock(kvStorePtrMutex_); status = RestoreKvStore(status); } - startupStatus.code = ERR_INVALID_OPERATION; - return startupStatus; + asustatus.code = ERR_INVALID_OPERATION; + return asustatus; } - startupStatus.code = ERR_NAME_NOT_FOUND; + asustatus.code = ERR_NAME_NOT_FOUND; for (const auto &item : allEntries) { if (IsEqual(item.key, info)) { - ConvertAutoStartupStatusFromValue(item.value, startupStatus); - startupStatus.code = ERR_OK; + ConvertAutoStartupStatusFromValue(item.value, asustatus.isAutoStartup, asustatus.isEdmForce); + asustatus.code = ERR_OK; } } - return startupStatus; + return asustatus; } int32_t AbilityAutoStartupDataManager::QueryAllAutoStartupApplications(std::vector &infoList, - int32_t userId, bool isCalledByEDM) + int32_t userId) { TAG_LOGD(AAFwkTag::AUTO_STARTUP, "called"); { @@ -378,12 +370,12 @@ int32_t AbilityAutoStartupDataManager::QueryAllAutoStartupApplications(std::vect } for (const auto &item : allEntries) { - if ((!isCalledByEDM) && (!IsEqual(item.key, userId))) { + if (!IsEqual(item.key, userId)) { continue; } - AutoStartupStatus startupStatus; - ConvertAutoStartupStatusFromValue(item.value, startupStatus); - if (startupStatus.isAutoStartup) { + bool isAutoStartup, isEdmForce; + ConvertAutoStartupStatusFromValue(item.value, isAutoStartup, isEdmForce); + if (isAutoStartup) { infoList.emplace_back(ConvertAutoStartupInfoFromKeyAndValue(item.key, item.value)); } } @@ -428,14 +420,12 @@ int32_t AbilityAutoStartupDataManager::GetCurrentAppAutoStartupData( } DistributedKv::Value AbilityAutoStartupDataManager::ConvertAutoStartupStatusToValue( - const AutoStartupInfo &info, bool isAutoStartup, bool isEdmForce) + bool isAutoStartup, bool isEdmForce, const std::string &abilityTypeName) { nlohmann::json jsonObject = nlohmann::json { { JSON_KEY_IS_AUTO_STARTUP, isAutoStartup }, { JSON_KEY_IS_EDM_FORCE, isEdmForce }, - { JSON_KEY_TYPE_NAME, info.abilityTypeName }, - { JSON_KEY_SETTER_USERID, info.setterUserId }, - { JSON_KEY_SETTER_TYPE, info.setterType }, + { JSON_KEY_TYPE_NAME, abilityTypeName }, }; DistributedKv::Value value(jsonObject.dump()); TAG_LOGD(AAFwkTag::AUTO_STARTUP, "value: %{public}s", value.ToString().c_str()); @@ -443,7 +433,7 @@ DistributedKv::Value AbilityAutoStartupDataManager::ConvertAutoStartupStatusToVa } void AbilityAutoStartupDataManager::ConvertAutoStartupStatusFromValue( - const DistributedKv::Value &value, AutoStartupStatus &startupStatus) + const DistributedKv::Value &value, bool &isAutoStartup, bool &isEdmForce) { nlohmann::json jsonObject = nlohmann::json::parse(value.ToString(), nullptr, false); if (jsonObject.is_discarded()) { @@ -451,16 +441,10 @@ void AbilityAutoStartupDataManager::ConvertAutoStartupStatusFromValue( return; } if (jsonObject.contains(JSON_KEY_IS_AUTO_STARTUP) && jsonObject[JSON_KEY_IS_AUTO_STARTUP].is_boolean()) { - startupStatus.isAutoStartup = jsonObject.at(JSON_KEY_IS_AUTO_STARTUP).get(); + isAutoStartup = jsonObject.at(JSON_KEY_IS_AUTO_STARTUP).get(); } if (jsonObject.contains(JSON_KEY_IS_EDM_FORCE) && jsonObject[JSON_KEY_IS_EDM_FORCE].is_boolean()) { - startupStatus.isEdmForce = jsonObject.at(JSON_KEY_IS_EDM_FORCE).get(); - } - if (jsonObject.contains(JSON_KEY_SETTER_USERID) && jsonObject[JSON_KEY_SETTER_USERID].is_number()) { - startupStatus.setterUserId = jsonObject.at(JSON_KEY_SETTER_USERID).get(); - } - if (jsonObject.contains(JSON_KEY_SETTER_TYPE) && jsonObject[JSON_KEY_SETTER_TYPE].is_number()) { - startupStatus.setterType = jsonObject.at(JSON_KEY_SETTER_TYPE).get(); + isEdmForce = jsonObject.at(JSON_KEY_IS_EDM_FORCE).get(); } } @@ -471,7 +455,7 @@ DistributedKv::Key AbilityAutoStartupDataManager::ConvertAutoStartupDataToKey(co { JSON_KEY_MODULE_NAME, info.moduleName }, { JSON_KEY_ABILITY_NAME, info.abilityName }, { JSON_KEY_APP_CLONE_INDEX, info.appCloneIndex }, - { JSON_KEY_ACCESS_TOKENID, info.accessTokenId }, + { JSON_KEY_ACCESS_TOKENID, info.accessTokenId }, { JSON_KEY_USERID, info.userId }, }; DistributedKv::Key key(jsonObject.dump()); @@ -483,18 +467,10 @@ AutoStartupInfo AbilityAutoStartupDataManager::ConvertAutoStartupInfoFromKeyAndV const DistributedKv::Key &key, const DistributedKv::Value &value) { AutoStartupInfo info; - ConvertAutoStartupInfoFromKey(key, info); - ConvertAutoStartupInfoFromValue(value, info); - return info; -} - -void AbilityAutoStartupDataManager::ConvertAutoStartupInfoFromKey( - const DistributedKv::Key &key, AutoStartupInfo &info) -{ nlohmann::json jsonObject = nlohmann::json::parse(key.ToString(), nullptr, false); if (jsonObject.is_discarded()) { TAG_LOGE(AAFwkTag::AUTO_STARTUP, "parse jsonObject fail"); - return; + return info; } if (jsonObject.contains(JSON_KEY_BUNDLE_NAME) && jsonObject[JSON_KEY_BUNDLE_NAME].is_string()) { @@ -520,28 +496,17 @@ void AbilityAutoStartupDataManager::ConvertAutoStartupInfoFromKey( if (jsonObject.contains(JSON_KEY_USERID) && jsonObject[JSON_KEY_USERID].is_number()) { info.userId = jsonObject.at(JSON_KEY_USERID).get(); } -} -void AbilityAutoStartupDataManager::ConvertAutoStartupInfoFromValue( - const DistributedKv::Value &value, AutoStartupInfo &info) -{ nlohmann::json jsonValueObject = nlohmann::json::parse(value.ToString(), nullptr, false); if (jsonValueObject.is_discarded()) { TAG_LOGE(AAFwkTag::AUTO_STARTUP, "parse jsonValueObject fail"); - return; + return info; } if (jsonValueObject.contains(JSON_KEY_TYPE_NAME) && jsonValueObject[JSON_KEY_TYPE_NAME].is_string()) { info.abilityTypeName = jsonValueObject.at(JSON_KEY_TYPE_NAME).get(); } - - if (jsonValueObject.contains(JSON_KEY_IS_EDM_FORCE) && jsonValueObject[JSON_KEY_IS_EDM_FORCE].is_boolean()) { - info.canUserModify = !(jsonValueObject.at(JSON_KEY_IS_EDM_FORCE).get()); - } - - if (jsonValueObject.contains(JSON_KEY_SETTER_USERID) && jsonValueObject[JSON_KEY_SETTER_USERID].is_number()) { - info.setterUserId = jsonValueObject.at(JSON_KEY_SETTER_USERID).get(); - } + return info; } bool AbilityAutoStartupDataManager::IsEqual(const DistributedKv::Key &key, const AutoStartupInfo &info) @@ -586,11 +551,11 @@ bool AbilityAutoStartupDataManager::IsEqual(const DistributedKv::Key &key, int32 TAG_LOGE(AAFwkTag::AUTO_STARTUP, "parse jsonObject fail"); return false; } - auto &jsonUtil = AAFwk::JsonUtils::GetInstance(); - if (jsonUtil.IsEqual(jsonObject, JSON_KEY_USERID, userId) || - jsonUtil.IsEqual(jsonObject, JSON_KEY_USERID, U0_USER_ID) || - jsonUtil.IsEqual(jsonObject, JSON_KEY_USERID, U1_USER_ID)) { - return true; + + if (jsonObject.contains(JSON_KEY_USERID) && jsonObject[JSON_KEY_USERID].is_number()) { + if (userId == jsonObject.at(JSON_KEY_USERID).get()) { + return true; + } } return false; } diff --git a/services/abilitymgr/src/ability_auto_startup_service.cpp b/services/abilitymgr/src/ability_auto_startup_service.cpp index 6c6d2a2218c..6ea4a022336 100644 --- a/services/abilitymgr/src/ability_auto_startup_service.cpp +++ b/services/abilitymgr/src/ability_auto_startup_service.cpp @@ -37,6 +37,7 @@ AbilityAutoStartupService::~AbilityAutoStartupService() {} int32_t AbilityAutoStartupService::RegisterAutoStartupSystemCallback(const sptr &callback) { + TAG_LOGD(AAFwkTag::AUTO_STARTUP, "called"); int32_t code = CheckPermissionForSystem(); if (code != ERR_OK) { return code; @@ -66,6 +67,7 @@ int32_t AbilityAutoStartupService::RegisterAutoStartupSystemCallback(const sptr< int32_t AbilityAutoStartupService::UnregisterAutoStartupSystemCallback(const sptr &callback) { + TAG_LOGD(AAFwkTag::AUTO_STARTUP, "called"); int32_t code = CheckPermissionForSystem(); if (code != ERR_OK) { return code; @@ -94,27 +96,32 @@ int32_t AbilityAutoStartupService::SetApplicationAutoStartup(const AutoStartupIn { TAG_LOGD(AAFwkTag::AUTO_STARTUP, "Called, bundleName: %{public}s, moduleName: %{public}s, abilityName: %{public}s," - " accessTokenId: %{public}s, setterUserId: %{public}d", + " accessTokenId: %{public}s, userId: %{public}d", info.bundleName.c_str(), info.moduleName.c_str(), - info.abilityName.c_str(), info.accessTokenId.c_str(), info.setterUserId); + info.abilityName.c_str(), info.accessTokenId.c_str(), info.userId); int32_t code = CheckPermissionForSystem(); if (code != ERR_OK) { return code; } - AutoStartupAbilityData abilityData; - code = GetAbilityInfo(info, abilityData); - if (code != ERR_OK) { - return code; + bool isVisible; + int32_t userId; + std::string abilityTypeName; + std::string accessTokenId; + if (!GetAbilityData(info, isVisible, abilityTypeName, accessTokenId, userId)) { + TAG_LOGE(AAFwkTag::AUTO_STARTUP, "GetAbilityData fail"); + return INNER_ERR; + } + + if (!isVisible) { + TAG_LOGE(AAFwkTag::AUTO_STARTUP, "not visible"); + return ABILITY_VISIBLE_FALSE_DENY_REQUEST; } AutoStartupInfo fullInfo(info); - fullInfo.abilityTypeName = abilityData.abilityTypeName; - fullInfo.setterUserId = abilityData.setterUserId; - fullInfo.accessTokenId = abilityData.accessTokenId; - fullInfo.userId = abilityData.userId; - fullInfo.canUserModify = true; - fullInfo.setterType = AutoStartupSetterType::USER; + fullInfo.abilityTypeName = abilityTypeName; + fullInfo.userId = userId; + fullInfo.accessTokenId = accessTokenId; return InnerSetApplicationAutoStartup(fullInfo); } @@ -150,34 +157,39 @@ int32_t AbilityAutoStartupService::InnerSetApplicationAutoStartup(const AutoStar } return result; } - return ERR_OK; + return ERR_ALREADY_EXISTS; } int32_t AbilityAutoStartupService::CancelApplicationAutoStartup(const AutoStartupInfo &info) { TAG_LOGD(AAFwkTag::AUTO_STARTUP, "Called, bundleName: %{public}s, moduleName: %{public}s, abilityName: %{public}s," - " accessTokenId: %{public}s, setterUserId: %{public}d", + " accessTokenId: %{public}s, userId: %{public}d", info.bundleName.c_str(), info.moduleName.c_str(), - info.abilityName.c_str(), info.accessTokenId.c_str(), info.setterUserId); + info.abilityName.c_str(), info.accessTokenId.c_str(), info.userId); int32_t code = CheckPermissionForSystem(); if (code != ERR_OK) { return code; } - AutoStartupAbilityData abilityData; - code = GetAbilityInfo(info, abilityData); - if (code != ERR_OK) { - return code; + bool isVisible; + std::string abilityTypeName; + std::string accessTokenId; + int32_t userId; + if (!GetAbilityData(info, isVisible, abilityTypeName, accessTokenId, userId)) { + TAG_LOGE(AAFwkTag::AUTO_STARTUP, "GetAbilityData fail"); + return INNER_ERR; + } + + if (!isVisible) { + TAG_LOGE(AAFwkTag::AUTO_STARTUP, "not visible"); + return ABILITY_VISIBLE_FALSE_DENY_REQUEST; } AutoStartupInfo fullInfo(info); - fullInfo.abilityTypeName = abilityData.abilityTypeName; - fullInfo.accessTokenId = abilityData.accessTokenId; - fullInfo.setterUserId = abilityData.setterUserId; - fullInfo.userId = abilityData.userId; - fullInfo.canUserModify = true; - fullInfo.setterType = AutoStartupSetterType::USER; + fullInfo.abilityTypeName = abilityTypeName; + fullInfo.accessTokenId = accessTokenId; + fullInfo.userId = userId; return InnerCancelApplicationAutoStartup(fullInfo); } @@ -197,12 +209,6 @@ int32_t AbilityAutoStartupService::InnerCancelApplicationAutoStartup(const AutoS } if (status.isAutoStartup) { - if (status.setterUserId != -1 && - status.setterUserId != info.setterUserId && - status.setterType == AutoStartupSetterType::USER) { - TAG_LOGE(AAFwkTag::AUTO_STARTUP, "setter id is different, cannot cancel"); - return ERR_INVALID_OPERATION; - } int32_t result = DelayedSingleton::GetInstance()->DeleteAutoStartupData(info); if (result == ERR_OK) { ExecuteCallbacks(false, info); @@ -215,45 +221,44 @@ int32_t AbilityAutoStartupService::InnerCancelApplicationAutoStartup(const AutoS int32_t AbilityAutoStartupService::QueryAllAutoStartupApplications(std::vector &infoList, int32_t userId) { + TAG_LOGD(AAFwkTag::AUTO_STARTUP, "called"); int32_t code = CheckPermissionForEDM(); - bool isCalledByEDM = (code == ERR_OK); - if (!isCalledByEDM) { - code = CheckPermissionForSystem(); - } + code = code == ERR_OK ? code : CheckPermissionForSystem(); if (code != ERR_OK) { TAG_LOGE(AAFwkTag::AUTO_STARTUP, "permission verification fail"); return code; } return DelayedSingleton::GetInstance()->QueryAllAutoStartupApplications(infoList, - userId, isCalledByEDM); + userId); } int32_t AbilityAutoStartupService::QueryAllAutoStartupApplicationsWithoutPermission( std::vector &infoList, int32_t userId) { + TAG_LOGD(AAFwkTag::AUTO_STARTUP, "called"); if (!system::GetBoolParameter(PRODUCT_APPBOOT_SETTING_ENABLED, false)) { TAG_LOGE(AAFwkTag::AUTO_STARTUP, "Disabled config"); return ERR_NOT_SUPPORTED_PRODUCT_TYPE; } return DelayedSingleton::GetInstance()->QueryAllAutoStartupApplications(infoList, - userId, false); + userId); } int32_t AbilityAutoStartupService::DeleteAutoStartupData(const std::string &bundleName, const int32_t accessTokenId) { + TAG_LOGD(AAFwkTag::AUTO_STARTUP, "called"); return DelayedSingleton::GetInstance()->DeleteAutoStartupData( bundleName, accessTokenId); } int32_t AbilityAutoStartupService::CheckAutoStartupData(const std::string &bundleName, int32_t uid) { + int32_t userId; int32_t appIndex = 0; AppExecFwk::BundleInfo bundleInfo; - int32_t userId = uid / AppExecFwk::Constants::BASE_USER_RANGE; - int32_t validUserId = GetValidUserId(userId); - if (!GetBundleInfo(bundleName, validUserId, appIndex, bundleInfo)) { + if (!GetBundleInfo(bundleName, bundleInfo, uid, userId, appIndex)) { return INNER_ERR; } auto tokenId = bundleInfo.applicationInfo.accessTokenId; @@ -272,7 +277,8 @@ int32_t AbilityAutoStartupService::CheckAutoStartupData(const std::string &bundl bool isFound = false; for (auto info : infoList) { for (auto abilityInfo : bundleInfo.abilityInfos) { - if (IsTargetAbility(info, abilityInfo)) { + if ((abilityInfo.bundleName == info.bundleName) && (abilityInfo.name == info.abilityName) && + (info.moduleName.empty() || (abilityInfo.moduleName == info.moduleName))) { isFound = true; break; } @@ -297,16 +303,9 @@ void AbilityAutoStartupService::ExecuteCallbacks(bool isCallOn, const AutoStartu { TAG_LOGD(AAFwkTag::AUTO_STARTUP, "Called, bundleName: %{public}s, moduleName: %{public}s, abilityName: %{public}s," - " accessTokenId: %{public}s, setterUserId: %{public}d, userId: %{public}d", + " accessTokenId: %{public}s, userId: %{public}d", info.bundleName.c_str(), info.moduleName.c_str(), - info.abilityName.c_str(), info.accessTokenId.c_str(), info.setterUserId, info.userId); - int32_t currentUserId = DelayedSingleton::GetInstance()->GetUserId(); - bool isUserIdMatch = (info.userId == currentUserId); - bool isUserIdU0OrU1 = (U0_USER_ID == info.userId) || (U1_USER_ID == info.userId); - if (!isUserIdMatch && !isUserIdU0OrU1) { - TAG_LOGE(AAFwkTag::AUTO_STARTUP, "Condition not satisfied"); - return; - } + info.abilityName.c_str(), info.accessTokenId.c_str(), info.userId); std::vector> callbackVector; GetCallbackVector(callbackVector); for (auto& item : callbackVector) { @@ -324,6 +323,7 @@ void AbilityAutoStartupService::ExecuteCallbacks(bool isCallOn, const AutoStartu void AbilityAutoStartupService::SetDeathRecipient( const sptr &callback, const sptr &deathRecipient) { + TAG_LOGD(AAFwkTag::AUTO_STARTUP, "called"); if (callback == nullptr || deathRecipient == nullptr) { TAG_LOGE(AAFwkTag::AUTO_STARTUP, "callerToken or deathRecipient empty"); return; @@ -340,6 +340,7 @@ void AbilityAutoStartupService::SetDeathRecipient( void AbilityAutoStartupService::CleanResource(const wptr &remote) { + TAG_LOGD(AAFwkTag::AUTO_STARTUP, "called"); auto object = remote.promote(); if (object == nullptr) { TAG_LOGE(AAFwkTag::AUTO_STARTUP, "null remote obj"); @@ -376,6 +377,7 @@ AbilityAutoStartupService::ClientDeathRecipient::ClientDeathRecipient( void AbilityAutoStartupService::ClientDeathRecipient::OnRemoteDied(const wptr &remote) { + TAG_LOGD(AAFwkTag::AUTO_STARTUP, "called"); auto abilityAutoStartupService = weakPtr_.lock(); if (abilityAutoStartupService == nullptr) { TAG_LOGE(AAFwkTag::AUTO_STARTUP, "null abilityAutoStartupService"); @@ -408,23 +410,24 @@ bool AbilityAutoStartupService::CheckSelfApplication(const std::string &bundleNa return GetSelfApplicationBundleName() == bundleName ? true : false; } -int32_t AbilityAutoStartupService::GetValidUserId(int32_t userId) +bool AbilityAutoStartupService::GetBundleInfo(const std::string &bundleName, + AppExecFwk::BundleInfo &bundleInfo, int32_t uid, int32_t &userId, int32_t appIndex) { - TAG_LOGD(AAFwkTag::AUTO_STARTUP, "userId = %{public}d.", userId); - int32_t validUserId = userId; + TAG_LOGD(AAFwkTag::AUTO_STARTUP, "called"); - if (userId == -1) { - validUserId = IPCSkeleton::GetCallingUid() / AppExecFwk::Constants::BASE_USER_RANGE; + if (uid == -1) { + userId = IPCSkeleton::GetCallingUid() / AppExecFwk::Constants::BASE_USER_RANGE; + } else { + userId = uid / AppExecFwk::Constants::BASE_USER_RANGE; } - if (validUserId == U0_USER_ID || validUserId == U1_USER_ID) { - validUserId = DelayedSingleton::GetInstance()->GetUserId(); + if (userId == 0) { + auto abilityMgr = DelayedSingleton::GetInstance(); + if (abilityMgr == nullptr) { + TAG_LOGE(AAFwkTag::AUTO_STARTUP, "null abilityMgr"); + return false; + } + userId = abilityMgr->GetUserId(); } - return validUserId; -} - -bool AbilityAutoStartupService::GetBundleInfo(const std::string &bundleName, int32_t userId, int32_t appIndex, - AppExecFwk::BundleInfo &bundleInfo) -{ TAG_LOGD(AAFwkTag::AUTO_STARTUP, "bundleName: %{public}s, userId: %{public}d, appIndex: %{public}d", bundleName.c_str(), userId, appIndex); auto bundleMgrHelper = DelayedSingleton::GetInstance(); @@ -435,11 +438,11 @@ bool AbilityAutoStartupService::GetBundleInfo(const std::string &bundleName, int if (appIndex == 0) { auto flags = AppExecFwk::BundleFlag::GET_BUNDLE_WITH_ABILITIES | AppExecFwk::BundleFlag::GET_BUNDLE_WITH_EXTENSION_INFO; - if (!IN_PROCESS_CALL(bundleMgrHelper->GetBundleInfo( - bundleName, static_cast(flags), bundleInfo, userId))) { - TAG_LOGE(AAFwkTag::AUTO_STARTUP, "get bundleInfo fail"); - return false; - } + if (!IN_PROCESS_CALL(bundleMgrHelper->GetBundleInfo( + bundleName, static_cast(flags), bundleInfo, userId))) { + TAG_LOGE(AAFwkTag::AUTO_STARTUP, "get bundleInfo fail"); + return false; + } } else if (appIndex <= GlobalConstant::MAX_APP_CLONE_INDEX) { auto bundleFlag = static_cast(AppExecFwk::GetBundleInfoFlag::GET_BUNDLE_INFO_WITH_APPLICATION) + static_cast(AppExecFwk::GetBundleInfoFlag::GET_BUNDLE_INFO_WITH_ABILITY) + @@ -447,95 +450,83 @@ bool AbilityAutoStartupService::GetBundleInfo(const std::string &bundleName, int static_cast(AppExecFwk::GetBundleInfoFlag::GET_BUNDLE_INFO_WITH_HAP_MODULE); auto bundleMgrResult = IN_PROCESS_CALL( bundleMgrHelper->GetCloneBundleInfo(bundleName, bundleFlag, appIndex, bundleInfo, userId)); - if (bundleMgrResult != ERR_OK) { - TAG_LOGE(AAFwkTag::AUTO_STARTUP, "error bundleMgrResult"); - return false; - } + if (bundleMgrResult != ERR_OK) { + TAG_LOGE(AAFwkTag::AUTO_STARTUP, "error bundleMgrResult"); + return false; + } } else { - if (!IN_PROCESS_CALL(bundleMgrHelper->GetSandboxBundleInfo(bundleName, appIndex, userId, bundleInfo))) { - TAG_LOGE(AAFwkTag::AUTO_STARTUP, "GetSandboxBundleInfo fail"); - return false; - } + if (!IN_PROCESS_CALL(bundleMgrHelper->GetSandboxBundleInfo(bundleName, appIndex, userId, bundleInfo))) { + TAG_LOGE(AAFwkTag::AUTO_STARTUP, "GetSandboxBundleInfo fail"); + return false; + } } return true; } -bool AbilityAutoStartupService::GetAbilityData(const AutoStartupInfo &info, AutoStartupAbilityData &abilityData) +bool AbilityAutoStartupService::GetAbilityData(const AutoStartupInfo &info, bool &isVisible, + std::string &abilityTypeName, std::string &accessTokenId, int32_t &userId) { TAG_LOGD(AAFwkTag::AUTO_STARTUP, "bundleName: %{public}s, moduleName: %{public}s, abilityName: %{public}s," - " accessTokenId: %{public}s, setterUserId: %{public}d", + " accessTokenId: %{public}s, userId: %{public}d", info.bundleName.c_str(), info.moduleName.c_str(), - info.abilityName.c_str(), info.accessTokenId.c_str(), info.setterUserId); + info.abilityName.c_str(), info.accessTokenId.c_str(), info.userId); AppExecFwk::BundleInfo bundleInfo; - int32_t validUserId = GetValidUserId(info.userId); - if (!GetBundleInfo(info.bundleName, validUserId, info.appCloneIndex, bundleInfo)) { + int32_t currentUserId; + int32_t uid = bundleInfo.applicationInfo.uid; + if (!GetBundleInfo(info.bundleName, bundleInfo, uid, currentUserId, info.appCloneIndex)) { TAG_LOGE(AAFwkTag::AUTO_STARTUP, "GetBundleInfo fail"); return false; } + userId = currentUserId; auto accessTokenIdStr = bundleInfo.applicationInfo.accessTokenId; - abilityData.accessTokenId = std::to_string(accessTokenIdStr); - abilityData.setterUserId = IPCSkeleton::GetCallingUid() / AppExecFwk::Constants::BASE_USER_RANGE; - abilityData.userId = bundleInfo.applicationInfo.uid / AppExecFwk::Constants::BASE_USER_RANGE; + accessTokenId = std::to_string(accessTokenIdStr); for (const auto& hapModuleInfo : bundleInfo.hapModuleInfos) { for (const auto& abilityInfo : hapModuleInfo.abilityInfos) { - if (IsTargetAbility(info, abilityInfo)) { - abilityData.isVisible = abilityInfo.visible; - abilityData.abilityTypeName = GetAbilityTypeName(abilityInfo); + if ((abilityInfo.bundleName == info.bundleName) && (abilityInfo.name == info.abilityName) && + (info.moduleName.empty() || (abilityInfo.moduleName == info.moduleName))) { + isVisible = abilityInfo.visible; + abilityTypeName = GetAbilityTypeName(abilityInfo); + TAG_LOGD(AAFwkTag::AUTO_STARTUP, "Get ability info success"); return true; } } } - for (const auto& extensionInfo : bundleInfo.extensionInfos) { - if (IsTargetExtension(info, extensionInfo)) { - abilityData.isVisible = extensionInfo.visible; - abilityData.abilityTypeName = GetExtensionTypeName(extensionInfo); - return true; + for (auto extensionInfo : bundleInfo.extensionInfos) { + if ((extensionInfo.bundleName == info.bundleName) && (extensionInfo.name == info.abilityName)) { + if (info.moduleName.empty() || (extensionInfo.moduleName == info.moduleName)) { + isVisible = extensionInfo.visible; + abilityTypeName = GetExtensionTypeName(extensionInfo); + TAG_LOGD(AAFwkTag::AUTO_STARTUP, "Get extension info success"); + return true; + } } } return false; } -bool AbilityAutoStartupService::IsTargetAbility(const AutoStartupInfo &info, - const AppExecFwk::AbilityInfo &abilityInfo) -{ - return ((abilityInfo.bundleName == info.bundleName) && - (abilityInfo.name == info.abilityName) && - (info.moduleName.empty() || abilityInfo.moduleName == info.moduleName)); -} - -bool AbilityAutoStartupService::IsTargetExtension(const AutoStartupInfo &info, - const AppExecFwk::ExtensionAbilityInfo &extensionInfo) -{ - return ((extensionInfo.bundleName == info.bundleName) && - (extensionInfo.name == info.abilityName) && - (info.moduleName.empty() || extensionInfo.moduleName == info.moduleName)); -} - -std::string AbilityAutoStartupService::GetAbilityTypeName(const AppExecFwk::AbilityInfo &abilityInfo) +std::string AbilityAutoStartupService::GetAbilityTypeName(AppExecFwk::AbilityInfo abilityInfo) { + std::string abilityTypeName; if (abilityInfo.type == AppExecFwk::AbilityType::PAGE) { - return "UIAbility"; + abilityTypeName = "UIAbility"; } - return ""; + return abilityTypeName; } -std::string AbilityAutoStartupService::GetExtensionTypeName( - const AppExecFwk::ExtensionAbilityInfo &extensionInfo) +std::string AbilityAutoStartupService::GetExtensionTypeName(AppExecFwk::ExtensionAbilityInfo extensionInfo) { - switch (extensionInfo.type) { - case AppExecFwk::ExtensionAbilityType::APP_SERVICE: - return EXTENSION_TYPE_APP_SERVICE; - case AppExecFwk::ExtensionAbilityType::SERVICE: - return "ServiceExtension"; - default: - return ""; + std::string abilityTypeName; + if (extensionInfo.type == AppExecFwk::ExtensionAbilityType::SERVICE) { + abilityTypeName = "ServiceExtension"; } + return abilityTypeName; } std::shared_ptr AbilityAutoStartupService::GetBundleMgrClient() { + TAG_LOGD(AAFwkTag::AUTO_STARTUP, "called"); if (bundleMgrClient_ == nullptr) { bundleMgrClient_ = DelayedSingleton::GetInstance(); } @@ -578,24 +569,19 @@ int32_t AbilityAutoStartupService::CheckPermissionForSelf(const std::string &bun } int32_t AbilityAutoStartupService::GetAbilityInfo( - const AutoStartupInfo &info, AutoStartupAbilityData &abilityData) + const AutoStartupInfo &info, std::string &abilityTypeName, std::string &accessTokenId, int32_t &userId) { - if (!GetAbilityData(info, abilityData)) { + bool isVisible = false; + if (!GetAbilityData(info, isVisible, abilityTypeName, accessTokenId, userId)) { TAG_LOGE(AAFwkTag::AUTO_STARTUP, "GetAbilityData fail"); return INNER_ERR; } - if (!abilityData.isVisible) { + if (!isVisible) { TAG_LOGE(AAFwkTag::AUTO_STARTUP, "not visible"); return ABILITY_VISIBLE_FALSE_DENY_REQUEST; } - if ((abilityData.abilityTypeName == EXTENSION_TYPE_APP_SERVICE) && - (abilityData.userId != U1_USER_ID)) { - TAG_LOGE(AAFwkTag::AUTO_STARTUP, "AppServiceExtension does not belong to U1"); - return INNER_ERR; - } - return ERR_OK; } @@ -605,18 +591,18 @@ int32_t AbilityAutoStartupService::SetApplicationAutoStartupByEDM(const AutoStar if (errorCode != ERR_OK) { return errorCode; } - AutoStartupAbilityData abilityData; - errorCode = GetAbilityInfo(info, abilityData); + int32_t userId; + std::string typeName; + std::string accessTokenId; + + errorCode = GetAbilityInfo(info, typeName, accessTokenId, userId); if (errorCode != ERR_OK) { return errorCode; } AutoStartupInfo fullInfo(info); - fullInfo.abilityTypeName = abilityData.abilityTypeName; - fullInfo.accessTokenId = abilityData.accessTokenId; - fullInfo.setterUserId = abilityData.setterUserId; - fullInfo.userId = abilityData.userId; - fullInfo.canUserModify = !flag; - fullInfo.setterType = AutoStartupSetterType::SYSTEM; + fullInfo.abilityTypeName = typeName; + fullInfo.accessTokenId = accessTokenId; + fullInfo.userId = userId; return InnerApplicationAutoStartupByEDM(fullInfo, true, flag); } @@ -626,18 +612,17 @@ int32_t AbilityAutoStartupService::CancelApplicationAutoStartupByEDM(const AutoS if (errorCode != ERR_OK) { return errorCode; } - AutoStartupAbilityData abilityData; - errorCode = GetAbilityInfo(info, abilityData); + int32_t userId; + std::string typeName; + std::string accessTokenId; + errorCode = GetAbilityInfo(info, typeName, accessTokenId, userId); if (errorCode != ERR_OK) { return errorCode; } AutoStartupInfo fullInfo(info); - fullInfo.abilityTypeName = abilityData.abilityTypeName; - fullInfo.accessTokenId = abilityData.accessTokenId; - fullInfo.setterUserId = abilityData.setterUserId; - fullInfo.userId = abilityData.userId; - fullInfo.canUserModify = !flag; - fullInfo.setterType = AutoStartupSetterType::SYSTEM; + fullInfo.abilityTypeName = typeName; + fullInfo.accessTokenId = accessTokenId; + fullInfo.userId = userId; return InnerApplicationAutoStartupByEDM(fullInfo, false, flag); } @@ -645,9 +630,9 @@ int32_t AbilityAutoStartupService::InnerApplicationAutoStartupByEDM(const AutoSt { TAG_LOGD(AAFwkTag::AUTO_STARTUP, "Called, bundleName: %{public}s, moduleName: %{public}s, abilityName: %{public}s, accessTokenId: %{public}s," - " setterUserId: %{public}d, isSet: %{public}d, flag: %{public}d", + " userId: %{public}d, isSet: %{public}d, flag: %{public}d", info.bundleName.c_str(), info.moduleName.c_str(), info.abilityName.c_str(), - info.accessTokenId.c_str(), info.setterUserId, isSet, flag); + info.accessTokenId.c_str(), info.userId, isSet, flag); AutoStartupStatus status = DelayedSingleton::GetInstance()->QueryAutoStartupData(info); if (status.code != ERR_OK && status.code != ERR_NAME_NOT_FOUND) { @@ -677,9 +662,6 @@ int32_t AbilityAutoStartupService::InnerApplicationAutoStartupByEDM(const AutoSt if (status.isEdmForce != flag) { result = DelayedSingleton::GetInstance()->UpdateAutoStartupData(info, isSet, flag); - if (result == ERR_OK) { - ExecuteCallbacks(isSet, info); - } return result; } -- Gitee