/* * Copyright (c) 2021-2023 Huawei Device Co., Ltd. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include "inner_bundle_info.h" #include <regex> #ifdef BUNDLE_FRAMEWORK_APP_CONTROL #include "app_control_constants.h" #include "app_control_manager.h" #endif #include "app_log_tag_wrapper.h" #include "bundle_mgr_client.h" #include "bundle_permission_mgr.h" #include "bundle_util.h" #include "free_install_params.h" namespace OHOS { namespace AppExecFwk { namespace { constexpr const char* APP_TYPE = "appType"; constexpr const char* BUNDLE_STATUS = "bundleStatus"; constexpr const char* BASE_APPLICATION_INFO = "baseApplicationInfo"; constexpr const char* BASE_BUNDLE_INFO = "baseBundleInfo"; constexpr const char* BASE_ABILITY_INFO = "baseAbilityInfos"; constexpr const char* INNER_MODULE_INFO = "innerModuleInfos"; constexpr const char* SKILL_INFOS = "skillInfos"; constexpr const char* USER_ID = "userId_"; constexpr const char* APP_FEATURE = "appFeature"; constexpr const char* NAME = "name"; constexpr const char* MODULE_PACKAGE = "modulePackage"; constexpr const char* MODULE_PATH = "modulePath"; constexpr const char* MODULE_NAME = "moduleName"; constexpr const char* MODULE_DESCRIPTION = "description"; constexpr const char* MODULE_DESCRIPTION_ID = "descriptionId"; constexpr const char* MODULE_ICON = "icon"; constexpr const char* MODULE_ICON_ID = "iconId"; constexpr const char* MODULE_LABEL = "label"; constexpr const char* MODULE_LABEL_ID = "labelId"; constexpr const char* MODULE_DESCRIPTION_INSTALLATION_FREE = "installationFree"; constexpr const char* MODULE_IS_REMOVABLE = "isRemovable"; constexpr const char* MODULE_UPGRADE_FLAG = "upgradeFlag"; constexpr const char* MODULE_IS_ENTRY = "isEntry"; constexpr const char* MODULE_METADATA = "metaData"; constexpr const char* MODULE_HNP_PACKAGE = "hnpPackage"; constexpr const char* MODULE_COLOR_MODE = "colorMode"; constexpr const char* MODULE_DISTRO = "distro"; constexpr const char* MODULE_REQ_CAPABILITIES = "reqCapabilities"; constexpr const char* MODULE_DATA_DIR = "moduleDataDir"; constexpr const char* MODULE_RES_PATH = "moduleResPath"; constexpr const char* MODULE_HAP_PATH = "hapPath"; constexpr const char* MODULE_ABILITY_KEYS = "abilityKeys"; constexpr const char* MODULE_SKILL_KEYS = "skillKeys"; constexpr const char* MODULE_FORMS = "formInfos"; constexpr const char* MODULE_SHORTCUT = "shortcutInfos"; constexpr const char* MODULE_COMMON_EVENT = "commonEvents"; constexpr const char* MODULE_MAIN_ABILITY = "mainAbility"; constexpr const char* MODULE_ENTRY_ABILITY_KEY = "entryAbilityKey"; constexpr const char* MODULE_DEPENDENCIES = "dependencies"; constexpr const char* MODULE_IS_LIB_ISOLATED = "isLibIsolated"; constexpr const char* MODULE_NATIVE_LIBRARY_PATH = "nativeLibraryPath"; constexpr const char* MODULE_CPU_ABI = "cpuAbi"; constexpr const char* MODULE_SRC_PATH = "srcPath"; constexpr const char* MODULE_HASH_VALUE = "hashValue"; constexpr const char* PORT_SEPARATOR = ":"; constexpr const char* INSTALL_MARK = "installMark"; constexpr const char* INNER_BUNDLE_USER_INFOS = "innerBundleUserInfos"; constexpr const char* MODULE_PROCESS = "process"; constexpr const char* MODULE_SRC_ENTRANCE = "srcEntrance"; constexpr const char* MODULE_DEVICE_TYPES = "deviceTypes"; constexpr const char* MODULE_VIRTUAL_MACHINE = "virtualMachine"; constexpr const char* MODULE_UI_SYNTAX = "uiSyntax"; constexpr const char* MODULE_PAGES = "pages"; constexpr const char* MODULE_META_DATA = "metadata"; constexpr const char* MODULE_REQUEST_PERMISSIONS = "requestPermissions"; constexpr const char* MODULE_DEFINE_PERMISSIONS = "definePermissions"; constexpr const char* MODULE_EXTENSION_KEYS = "extensionKeys"; constexpr const char* MODULE_EXTENSION_SKILL_KEYS = "extensionSkillKeys"; constexpr const char* MODULE_IS_MODULE_JSON = "isModuleJson"; constexpr const char* MODULE_IS_STAGE_BASED_MODEL = "isStageBasedModel"; constexpr const char* BUNDLE_IS_NEW_VERSION = "isNewVersion"; constexpr const char* BUNDLE_BASE_EXTENSION_INFOS = "baseExtensionInfos"; constexpr const char* BUNDLE_EXTENSION_SKILL_INFOS = "extensionSkillInfos"; constexpr const char* BUNDLE_EXTEND_RESOURCES = "extendResources"; constexpr const char* CUR_DYNAMIC_ICON_MODULE = "curDynamicIconModule"; constexpr const char* BUNDLE_PACK_INFO = "bundlePackInfo"; constexpr const char* ALLOWED_ACLS = "allowedAcls"; constexpr const char* APP_INDEX = "appIndex"; constexpr const char* BUNDLE_IS_SANDBOX_APP = "isSandboxApp"; constexpr const char* MODULE_COMPILE_MODE = "compileMode"; constexpr const char* BUNDLE_HQF_INFOS = "hqfInfos"; constexpr const char* MODULE_TARGET_MODULE_NAME = "targetModuleName"; constexpr const char* MODULE_TARGET_PRIORITY = "targetPriority"; constexpr const char* MODULE_OVERLAY_MODULE_INFO = "overlayModuleInfo"; constexpr const char* OVERLAY_BUNDLE_INFO = "overlayBundleInfo"; constexpr const char* OVERLAY_TYPE = "overlayType"; constexpr const char* APPLY_QUICK_FIX_FREQUENCY = "applyQuickFixFrequency"; constexpr const char* MODULE_PRELOADS = "preloads"; constexpr const char* INNER_SHARED_MODULE_INFO = "innerSharedModuleInfos"; constexpr const char* MODULE_BUNDLE_TYPE = "bundleType"; constexpr const char* MODULE_VERSION_CODE = "versionCode"; constexpr const char* MODULE_VERSION_NAME = "versionName"; constexpr const char* MODULE_PROXY_DATAS = "proxyDatas"; constexpr const char* MODULE_BUILD_HASH = "buildHash"; constexpr const char* MODULE_ISOLATION_MODE = "isolationMode"; constexpr const char* MODULE_COMPRESS_NATIVE_LIBS = "compressNativeLibs"; constexpr const char* MODULE_NATIVE_LIBRARY_FILE_NAMES = "nativeLibraryFileNames"; constexpr const char* MODULE_AOT_COMPILE_STATUS = "aotCompileStatus"; constexpr const char* DATA_GROUP_INFOS = "dataGroupInfos"; constexpr const char* MODULE_FILE_CONTEXT_MENU = "fileContextMenu"; constexpr const char* MODULE_IS_ENCRYPTED = "isEncrypted"; constexpr const char* MODULE_ROUTER_MAP = "routerMap"; constexpr const char* EXT_RESOURCE_MODULE_NAME = "moduleName"; constexpr const char* EXT_RESOURCE_ICON_ID = "iconId"; constexpr const char* EXT_RESOURCE_FILE_PATH = "filePath"; constexpr const char* DEVELOPER_ID = "developerId"; constexpr const char* ODID = "odid"; constexpr const char* UNINSTALL_STATE = "uninstallState"; const int32_t SINGLE_HSP_VERSION = 1; const std::map<std::string, IsolationMode> ISOLATION_MODE_MAP = { {"isolationOnly", IsolationMode::ISOLATION_ONLY}, {"nonisolationOnly", IsolationMode::NONISOLATION_ONLY}, {"isolationFirst", IsolationMode::ISOLATION_FIRST}, }; constexpr const char* NATIVE_LIBRARY_PATH_SYMBOL = "!/"; constexpr const char* MODULE_QUERY_SCHEMES = "querySchemes"; constexpr const char* MODULE_APP_ENVIRONMENTS = "appEnvironments"; constexpr const char* MODULE_ASAN_ENABLED = "asanEnabled"; constexpr const char* MODULE_GWP_ASAN_ENABLED = "gwpAsanEnabled"; constexpr const char* MODULE_TSAN_ENABLED = "tsanEnabled"; constexpr const char* MODULE_PACKAGE_NAME = "packageName"; constexpr const char* MODULE_APP_STARTUP = "appStartup"; constexpr const char* MODULE_HWASAN_ENABLED = "hwasanEnabled"; constexpr uint32_t PREINSTALL_SOURCE_CLEAN_MASK = ~0B1110; inline CompileMode ConvertCompileMode(const std::string& compileMode) { if (compileMode == Profile::COMPILE_MODE_ES_MODULE) { return CompileMode::ES_MODULE; } else { return CompileMode::JS_BUNDLE; } } const std::string NameAndUserIdToKey(const std::string &bundleName, int32_t userId) { return bundleName + Constants::FILE_UNDERLINE + std::to_string(userId); } } // namespace void from_json(const nlohmann::json &jsonObject, ExtendResourceInfo &extendResourceInfo) { const auto &jsonObjectEnd = jsonObject.end(); int32_t parseResult = ERR_OK; GetValueIfFindKey<std::string>(jsonObject, jsonObjectEnd, EXT_RESOURCE_MODULE_NAME, extendResourceInfo.moduleName, JsonType::STRING, false, parseResult, ArrayType::NOT_ARRAY); GetValueIfFindKey<int32_t>(jsonObject, jsonObjectEnd, EXT_RESOURCE_ICON_ID, extendResourceInfo.iconId, JsonType::NUMBER, false, parseResult, ArrayType::NOT_ARRAY); GetValueIfFindKey<std::string>(jsonObject, jsonObjectEnd, EXT_RESOURCE_FILE_PATH, extendResourceInfo.filePath, JsonType::STRING, false, parseResult, ArrayType::NOT_ARRAY); if (parseResult != ERR_OK) { APP_LOGE("read ExtendResourceInfo from json error, error code : %{public}d", parseResult); } } void to_json(nlohmann::json &jsonObject, const ExtendResourceInfo &extendResourceInfo) { jsonObject = nlohmann::json { {EXT_RESOURCE_MODULE_NAME, extendResourceInfo.moduleName}, {EXT_RESOURCE_ICON_ID, extendResourceInfo.iconId}, {EXT_RESOURCE_FILE_PATH, extendResourceInfo.filePath} }; } void InnerBundleInfo::SetAOTCompileStatus(const std::string &moduleName, AOTCompileStatus aotCompileStatus) { auto item = innerModuleInfos_.find(moduleName); if (item == innerModuleInfos_.end()) { APP_LOGE("moduleName %{public}s not exist", moduleName.c_str()); return; } item->second.aotCompileStatus = aotCompileStatus; } AOTCompileStatus InnerBundleInfo::GetAOTCompileStatus(const std::string &moduleName) const { auto item = innerModuleInfos_.find(moduleName); if (item == innerModuleInfos_.end()) { APP_LOGE("moduleName %{public}s not exist", moduleName.c_str()); return AOTCompileStatus::NOT_COMPILED; } return item->second.aotCompileStatus; } void InnerBundleInfo::ResetAOTFlags() { baseApplicationInfo_->arkNativeFilePath.clear(); baseApplicationInfo_->arkNativeFileAbi.clear(); std::for_each(innerModuleInfos_.begin(), innerModuleInfos_.end(), [](auto &item) { item.second.aotCompileStatus = AOTCompileStatus::NOT_COMPILED; }); } ErrCode InnerBundleInfo::ResetAOTCompileStatus(const std::string &moduleName) { auto item = innerModuleInfos_.find(moduleName); if (item == innerModuleInfos_.end()) { APP_LOGE("moduleName %{public}s not exist", moduleName.c_str()); return ERR_BUNDLE_MANAGER_MODULE_NOT_EXIST; } item->second.aotCompileStatus = AOTCompileStatus::NOT_COMPILED; return ERR_OK; } void InnerBundleInfo::GetInternalDependentHspInfo( const std::string &moduleName, std::vector<HspInfo> &hspInfoVector) const { std::vector<std::string> dependentModuleNames; if (!GetAllDependentModuleNames(moduleName, dependentModuleNames)) { return; } for (const auto &name : dependentModuleNames) { auto item = innerModuleInfos_.find(name); if (item == innerModuleInfos_.end()) { continue; } HspInfo hspInfo; hspInfo.bundleName = baseApplicationInfo_->bundleName; hspInfo.moduleName = item->second.moduleName; hspInfo.hapPath = item->second.hapPath; hspInfoVector.emplace_back(hspInfo); } } InnerBundleInfo::InnerBundleInfo() { baseApplicationInfo_ = std::make_shared<ApplicationInfo>(); if (baseApplicationInfo_ == nullptr) { APP_LOGE("baseApplicationInfo_ is nullptr, create failed"); } baseBundleInfo_ = std::make_shared<BundleInfo>(); if (baseBundleInfo_ == nullptr) { APP_LOGE("baseBundleInfo_ is nullptr, create failed"); } bundlePackInfo_ = std::make_shared<BundlePackInfo>(); if (bundlePackInfo_ == nullptr) { APP_LOGE("bundlePackInfo_ is nullptr, create failed"); } APP_LOGD("inner bundle info instance is created"); } InnerBundleInfo &InnerBundleInfo::operator=(const InnerBundleInfo &info) { if (this == &info) { return *this; } this->appType_ = info.appType_; this->userId_ = info.userId_; this->bundleStatus_ = info.bundleStatus_; this->appFeature_ = info.appFeature_; this->allowedAcls_ = info.allowedAcls_; this->mark_ = info.mark_; this->appIndex_ = info.appIndex_; this->isSandboxApp_ = info.isSandboxApp_; this->currentPackage_ = info.currentPackage_; this->onlyCreateBundleUser_ = info.onlyCreateBundleUser_; this->innerModuleInfos_ = info.innerModuleInfos_; this->innerSharedModuleInfos_ = info.innerSharedModuleInfos_; this->formInfos_ = info.formInfos_; this->commonEvents_ = info.commonEvents_; this->shortcutInfos_ = info.shortcutInfos_; this->baseAbilityInfos_ = info.baseAbilityInfos_; this->skillInfos_ = info.skillInfos_; this->innerBundleUserInfos_ = info.innerBundleUserInfos_; this->bundlePackInfo_ = std::make_shared<BundlePackInfo>(); if (info.bundlePackInfo_ != nullptr) { *(this->bundlePackInfo_) = *(info.bundlePackInfo_); } this->isNewVersion_ = info.isNewVersion_; this->baseExtensionInfos_= info.baseExtensionInfos_; this->extensionSkillInfos_ = info.extensionSkillInfos_; this->extendResourceInfos_ = info.extendResourceInfos_; this->curDynamicIconModule_ = info.curDynamicIconModule_; this->baseApplicationInfo_ = std::make_shared<ApplicationInfo>(); if (info.baseApplicationInfo_ != nullptr) { *(this->baseApplicationInfo_) = *(info.baseApplicationInfo_); } this->baseBundleInfo_ = std::make_shared<BundleInfo>(); if (info.baseBundleInfo_ != nullptr) { *(this->baseBundleInfo_) = *(info.baseBundleInfo_); } this->hqfInfos_ = info.hqfInfos_; this->overlayBundleInfo_ = info.overlayBundleInfo_; this->overlayType_ = info.overlayType_; this->applyQuickFixFrequency_ = info.applyQuickFixFrequency_; this->provisionMetadatas_ = info.provisionMetadatas_; this->dataGroupInfos_ = info.dataGroupInfos_; this->developerId_ = info.developerId_; this->odid_ = info.odid_; this->uninstallState_ = info.uninstallState_; return *this; } InnerBundleInfo::~InnerBundleInfo() { APP_LOGD("inner bundle info instance is destroyed"); } void to_json(nlohmann::json &jsonObject, const Distro &distro) { jsonObject = nlohmann::json { {ProfileReader::BUNDLE_MODULE_PROFILE_KEY_DELIVERY_WITH_INSTALL, distro.deliveryWithInstall}, {ProfileReader::BUNDLE_MODULE_PROFILE_KEY_MODULE_NAME, distro.moduleName}, {ProfileReader::BUNDLE_MODULE_PROFILE_KEY_MODULE_TYPE, distro.moduleType}, {ProfileReader::BUNDLE_MODULE_PROFILE_KEY_MODULE_INSTALLATION_FREE, distro.installationFree} }; } void to_json(nlohmann::json &jsonObject, const DefinePermission &definePermission) { jsonObject = nlohmann::json { {Profile::DEFINEPERMISSION_NAME, definePermission.name}, {Profile::DEFINEPERMISSION_GRANT_MODE, definePermission.grantMode}, {Profile::DEFINEPERMISSION_AVAILABLE_LEVEL, definePermission.availableLevel}, {Profile::DEFINEPERMISSION_PROVISION_ENABLE, definePermission.provisionEnable}, {Profile::DEFINEPERMISSION_DISTRIBUTED_SCENE_ENABLE, definePermission.distributedSceneEnable}, {Profile::LABEL, definePermission.label}, {Profile::LABEL_ID, definePermission.labelId}, {Profile::DESCRIPTION, definePermission.description}, {Profile::DESCRIPTION_ID, definePermission.descriptionId}, {Profile::DEFINEPERMISSION_AVAILABLE_TYPE, definePermission.availableType} }; } void to_json(nlohmann::json &jsonObject, const Dependency &dependency) { jsonObject = nlohmann::json { {Profile::DEPENDENCIES_MODULE_NAME, dependency.moduleName}, {Profile::DEPENDENCIES_BUNDLE_NAME, dependency.bundleName}, {Profile::APP_VERSION_CODE, dependency.versionCode} }; } void to_json(nlohmann::json &jsonObject, const InnerModuleInfo &info) { jsonObject = nlohmann::json { {NAME, info.name}, {MODULE_PACKAGE, info.modulePackage}, {MODULE_NAME, info.moduleName}, {MODULE_PATH, info.modulePath}, {MODULE_DATA_DIR, info.moduleDataDir}, {MODULE_RES_PATH, info.moduleResPath}, {MODULE_IS_ENTRY, info.isEntry}, {MODULE_METADATA, info.metaData}, {MODULE_COLOR_MODE, info.colorMode}, {MODULE_DISTRO, info.distro}, {MODULE_DESCRIPTION, info.description}, {MODULE_DESCRIPTION_ID, info.descriptionId}, {MODULE_ICON, info.icon}, {MODULE_ICON_ID, info.iconId}, {MODULE_LABEL, info.label}, {MODULE_LABEL_ID, info.labelId}, {MODULE_DESCRIPTION_INSTALLATION_FREE, info.installationFree}, {MODULE_IS_REMOVABLE, info.isRemovable}, {MODULE_UPGRADE_FLAG, info.upgradeFlag}, {MODULE_REQ_CAPABILITIES, info.reqCapabilities}, {MODULE_ABILITY_KEYS, info.abilityKeys}, {MODULE_SKILL_KEYS, info.skillKeys}, {MODULE_MAIN_ABILITY, info.mainAbility}, {MODULE_ENTRY_ABILITY_KEY, info.entryAbilityKey}, {MODULE_SRC_PATH, info.srcPath}, {MODULE_HASH_VALUE, info.hashValue}, {MODULE_PROCESS, info.process}, {MODULE_SRC_ENTRANCE, info.srcEntrance}, {MODULE_DEVICE_TYPES, info.deviceTypes}, {MODULE_VIRTUAL_MACHINE, info.virtualMachine}, {MODULE_UI_SYNTAX, info.uiSyntax}, {MODULE_PAGES, info.pages}, {MODULE_META_DATA, info.metadata}, {MODULE_HNP_PACKAGE, info.hnpPackages}, {MODULE_REQUEST_PERMISSIONS, info.requestPermissions}, {MODULE_DEFINE_PERMISSIONS, info.definePermissions}, {MODULE_EXTENSION_KEYS, info.extensionKeys}, {MODULE_EXTENSION_SKILL_KEYS, info.extensionSkillKeys}, {MODULE_IS_MODULE_JSON, info.isModuleJson}, {MODULE_IS_STAGE_BASED_MODEL, info.isStageBasedModel}, {MODULE_DEPENDENCIES, info.dependencies}, {MODULE_IS_LIB_ISOLATED, info.isLibIsolated}, {MODULE_NATIVE_LIBRARY_PATH, info.nativeLibraryPath}, {MODULE_CPU_ABI, info.cpuAbi}, {MODULE_HAP_PATH, info.hapPath}, {MODULE_COMPILE_MODE, info.compileMode}, {MODULE_TARGET_MODULE_NAME, info.targetModuleName}, {MODULE_TARGET_PRIORITY, info.targetPriority}, {MODULE_OVERLAY_MODULE_INFO, info.overlayModuleInfo}, {MODULE_PRELOADS, info.preloads}, {MODULE_BUNDLE_TYPE, info.bundleType}, {MODULE_VERSION_CODE, info.versionCode}, {MODULE_VERSION_NAME, info.versionName}, {MODULE_PROXY_DATAS, info.proxyDatas}, {MODULE_BUILD_HASH, info.buildHash}, {MODULE_ISOLATION_MODE, info.isolationMode}, {MODULE_COMPRESS_NATIVE_LIBS, info.compressNativeLibs}, {MODULE_NATIVE_LIBRARY_FILE_NAMES, info.nativeLibraryFileNames}, {MODULE_AOT_COMPILE_STATUS, info.aotCompileStatus}, {MODULE_FILE_CONTEXT_MENU, info.fileContextMenu}, {MODULE_IS_ENCRYPTED, info.isEncrypted}, {MODULE_QUERY_SCHEMES, info.querySchemes}, {MODULE_ROUTER_MAP, info.routerMap}, {MODULE_APP_ENVIRONMENTS, info.appEnvironments}, {MODULE_ASAN_ENABLED, info.asanEnabled}, {MODULE_GWP_ASAN_ENABLED, info.gwpAsanEnabled}, {MODULE_TSAN_ENABLED, info.tsanEnabled}, {MODULE_PACKAGE_NAME, info.packageName}, {MODULE_APP_STARTUP, info.appStartup}, {MODULE_HWASAN_ENABLED, static_cast<bool>(info.innerModuleInfoFlag & static_cast<uint32_t>(GetInnerModuleInfoFlag::GET_INNER_MODULE_INFO_WITH_HWASANENABLED))}, }; } void to_json(nlohmann::json &jsonObject, const InstallMark &installMark) { jsonObject = nlohmann::json { {ProfileReader::BUNDLE_INSTALL_MARK_BUNDLE, installMark.bundleName}, {ProfileReader::BUNDLE_INSTALL_MARK_PACKAGE, installMark.packageName}, {ProfileReader::BUNDLE_INSTALL_MARK_STATUS, installMark.status} }; } void InnerBundleInfo::ToJson(nlohmann::json &jsonObject) const { jsonObject[APP_TYPE] = appType_; jsonObject[BUNDLE_STATUS] = bundleStatus_; jsonObject[ALLOWED_ACLS] = allowedAcls_; jsonObject[BASE_APPLICATION_INFO] = *baseApplicationInfo_; jsonObject[BASE_BUNDLE_INFO] = *baseBundleInfo_; jsonObject[BASE_ABILITY_INFO] = baseAbilityInfos_; jsonObject[INNER_MODULE_INFO] = innerModuleInfos_; jsonObject[INNER_SHARED_MODULE_INFO] = innerSharedModuleInfos_; jsonObject[SKILL_INFOS] = skillInfos_; jsonObject[USER_ID] = userId_; jsonObject[APP_FEATURE] = appFeature_; jsonObject[MODULE_FORMS] = formInfos_; jsonObject[MODULE_SHORTCUT] = shortcutInfos_; jsonObject[MODULE_COMMON_EVENT] = commonEvents_; jsonObject[INSTALL_MARK] = mark_; jsonObject[INNER_BUNDLE_USER_INFOS] = innerBundleUserInfos_; jsonObject[BUNDLE_IS_NEW_VERSION] = isNewVersion_; jsonObject[BUNDLE_BASE_EXTENSION_INFOS] = baseExtensionInfos_; jsonObject[BUNDLE_EXTENSION_SKILL_INFOS] = extensionSkillInfos_; jsonObject[BUNDLE_EXTEND_RESOURCES] = extendResourceInfos_; jsonObject[CUR_DYNAMIC_ICON_MODULE] = curDynamicIconModule_; jsonObject[BUNDLE_PACK_INFO] = *bundlePackInfo_; jsonObject[APP_INDEX] = appIndex_; jsonObject[BUNDLE_IS_SANDBOX_APP] = isSandboxApp_; jsonObject[BUNDLE_HQF_INFOS] = hqfInfos_; jsonObject[OVERLAY_BUNDLE_INFO] = overlayBundleInfo_; jsonObject[OVERLAY_TYPE] = overlayType_; jsonObject[APPLY_QUICK_FIX_FREQUENCY] = applyQuickFixFrequency_; jsonObject[DATA_GROUP_INFOS] = dataGroupInfos_; jsonObject[DEVELOPER_ID] = developerId_; jsonObject[ODID] = odid_; jsonObject[UNINSTALL_STATE] = uninstallState_; } void from_json(const nlohmann::json &jsonObject, InnerModuleInfo &info) { // these are not required fields. const auto &jsonObjectEnd = jsonObject.end(); int32_t parseResult = ERR_OK; bool hwasanEnabled = static_cast<bool>(info.innerModuleInfoFlag & InnerBundleInfo::GetSanitizerFlag(GetInnerModuleInfoFlag::GET_INNER_MODULE_INFO_WITH_HWASANENABLED)); GetValueIfFindKey<std::string>(jsonObject, jsonObjectEnd, NAME, info.name, JsonType::STRING, false, parseResult, ArrayType::NOT_ARRAY); GetValueIfFindKey<std::string>(jsonObject, jsonObjectEnd, MODULE_PACKAGE, info.modulePackage, JsonType::STRING, false, parseResult, ArrayType::NOT_ARRAY); GetValueIfFindKey<std::string>(jsonObject, jsonObjectEnd, MODULE_NAME, info.moduleName, JsonType::STRING, false, parseResult, ArrayType::NOT_ARRAY); GetValueIfFindKey<std::string>(jsonObject, jsonObjectEnd, MODULE_PATH, info.modulePath, JsonType::STRING, false, parseResult, ArrayType::NOT_ARRAY); GetValueIfFindKey<std::string>(jsonObject, jsonObjectEnd, MODULE_DATA_DIR, info.moduleDataDir, JsonType::STRING, false, parseResult, ArrayType::NOT_ARRAY); GetValueIfFindKey<std::string>(jsonObject, jsonObjectEnd, MODULE_HAP_PATH, info.hapPath, JsonType::STRING, false, parseResult, ArrayType::NOT_ARRAY); GetValueIfFindKey<std::string>(jsonObject, jsonObjectEnd, MODULE_RES_PATH, info.moduleResPath, JsonType::STRING, false, parseResult, ArrayType::NOT_ARRAY); GetValueIfFindKey<bool>(jsonObject, jsonObjectEnd, MODULE_IS_ENTRY, info.isEntry, JsonType::BOOLEAN, false, parseResult, ArrayType::NOT_ARRAY); GetValueIfFindKey<MetaData>(jsonObject, jsonObjectEnd, MODULE_METADATA, info.metaData, JsonType::OBJECT, false, parseResult, ArrayType::NOT_ARRAY); GetValueIfFindKey<ModuleColorMode>(jsonObject, jsonObjectEnd, MODULE_COLOR_MODE, info.colorMode, JsonType::NUMBER, false, parseResult, ArrayType::NOT_ARRAY); GetValueIfFindKey<Distro>(jsonObject, jsonObjectEnd, MODULE_DISTRO, info.distro, JsonType::OBJECT, false, parseResult, ArrayType::NOT_ARRAY); GetValueIfFindKey<std::string>(jsonObject, jsonObjectEnd, MODULE_DESCRIPTION, info.description, JsonType::STRING, false, parseResult, ArrayType::NOT_ARRAY); GetValueIfFindKey<int32_t>(jsonObject, jsonObjectEnd, MODULE_DESCRIPTION_ID, info.descriptionId, JsonType::NUMBER, false, parseResult, ArrayType::NOT_ARRAY); GetValueIfFindKey<std::string>(jsonObject, jsonObjectEnd, MODULE_ICON, info.icon, JsonType::STRING, false, parseResult, ArrayType::NOT_ARRAY); GetValueIfFindKey<int32_t>(jsonObject, jsonObjectEnd, MODULE_ICON_ID, info.iconId, JsonType::NUMBER, false, parseResult, ArrayType::NOT_ARRAY); GetValueIfFindKey<std::string>(jsonObject, jsonObjectEnd, MODULE_LABEL, info.label, JsonType::STRING, false, parseResult, ArrayType::NOT_ARRAY); GetValueIfFindKey<int32_t>(jsonObject, jsonObjectEnd, MODULE_LABEL_ID, info.labelId, JsonType::NUMBER, false, parseResult, ArrayType::NOT_ARRAY); GetValueIfFindKey<std::string>(jsonObject, jsonObjectEnd, MODULE_MAIN_ABILITY, info.mainAbility, JsonType::STRING, false, parseResult, ArrayType::NOT_ARRAY); GetValueIfFindKey<std::string>(jsonObject, jsonObjectEnd, MODULE_ENTRY_ABILITY_KEY, info.entryAbilityKey, JsonType::STRING, false, parseResult, ArrayType::NOT_ARRAY); GetValueIfFindKey<std::string>(jsonObject, jsonObjectEnd, MODULE_SRC_PATH, info.srcPath, JsonType::STRING, false, parseResult, ArrayType::NOT_ARRAY); GetValueIfFindKey<std::string>(jsonObject, jsonObjectEnd, MODULE_HASH_VALUE, info.hashValue, JsonType::STRING, false, parseResult, ArrayType::NOT_ARRAY); GetValueIfFindKey<bool>(jsonObject, jsonObjectEnd, MODULE_DESCRIPTION_INSTALLATION_FREE, info.installationFree, JsonType::BOOLEAN, false, parseResult, ArrayType::NOT_ARRAY); GetValueIfFindKey<std::map<std::string, bool>>(jsonObject, jsonObjectEnd, MODULE_IS_REMOVABLE, info.isRemovable, JsonType::OBJECT, false, parseResult, ArrayType::NOT_ARRAY); GetValueIfFindKey<int32_t>(jsonObject, jsonObjectEnd, MODULE_UPGRADE_FLAG, info.upgradeFlag, JsonType::NUMBER, false, parseResult, ArrayType::NOT_ARRAY); GetValueIfFindKey<std::vector<std::string>>(jsonObject, jsonObjectEnd, MODULE_REQ_CAPABILITIES, info.reqCapabilities, JsonType::ARRAY, false, parseResult, ArrayType::STRING); GetValueIfFindKey<std::vector<std::string>>(jsonObject, jsonObjectEnd, MODULE_ABILITY_KEYS, info.abilityKeys, JsonType::ARRAY, false, parseResult, ArrayType::STRING); GetValueIfFindKey<std::vector<std::string>>(jsonObject, jsonObjectEnd, MODULE_SKILL_KEYS, info.skillKeys, JsonType::ARRAY, false, parseResult, ArrayType::STRING); GetValueIfFindKey<std::string>(jsonObject, jsonObjectEnd, MODULE_PROCESS, info.process, JsonType::STRING, false, parseResult, ArrayType::NOT_ARRAY); GetValueIfFindKey<std::string>(jsonObject, jsonObjectEnd, MODULE_SRC_ENTRANCE, info.srcEntrance, JsonType::STRING, false, parseResult, ArrayType::NOT_ARRAY); GetValueIfFindKey<std::vector<std::string>>(jsonObject, jsonObjectEnd, MODULE_DEVICE_TYPES, info.deviceTypes, JsonType::ARRAY, false, parseResult, ArrayType::STRING); GetValueIfFindKey<std::string>(jsonObject, jsonObjectEnd, MODULE_VIRTUAL_MACHINE, info.virtualMachine, JsonType::STRING, false, parseResult, ArrayType::NOT_ARRAY); GetValueIfFindKey<std::string>(jsonObject, jsonObjectEnd, MODULE_UI_SYNTAX, info.uiSyntax, JsonType::STRING, false, parseResult, ArrayType::NOT_ARRAY); GetValueIfFindKey<std::string>(jsonObject, jsonObjectEnd, MODULE_PAGES, info.pages, JsonType::STRING, false, parseResult, ArrayType::NOT_ARRAY); GetValueIfFindKey<std::vector<Metadata>>(jsonObject, jsonObjectEnd, MODULE_META_DATA, info.metadata, JsonType::ARRAY, false, parseResult, ArrayType::OBJECT); GetValueIfFindKey<std::vector<HnpPackage>>(jsonObject, jsonObjectEnd, MODULE_HNP_PACKAGE, info.hnpPackages, JsonType::ARRAY, false, parseResult, ArrayType::OBJECT); GetValueIfFindKey<std::vector<RequestPermission>>(jsonObject, jsonObjectEnd, MODULE_REQUEST_PERMISSIONS, info.requestPermissions, JsonType::ARRAY, false, parseResult, ArrayType::OBJECT); GetValueIfFindKey<std::vector<DefinePermission>>(jsonObject, jsonObjectEnd, MODULE_DEFINE_PERMISSIONS, info.definePermissions, JsonType::ARRAY, false, parseResult, ArrayType::OBJECT); GetValueIfFindKey<std::vector<std::string>>(jsonObject, jsonObjectEnd, MODULE_EXTENSION_KEYS, info.extensionKeys, JsonType::ARRAY, false, parseResult, ArrayType::STRING); GetValueIfFindKey<std::vector<std::string>>(jsonObject, jsonObjectEnd, MODULE_EXTENSION_SKILL_KEYS, info.extensionSkillKeys, JsonType::ARRAY, false, parseResult, ArrayType::STRING); GetValueIfFindKey<bool>(jsonObject, jsonObjectEnd, MODULE_IS_MODULE_JSON, info.isModuleJson, JsonType::BOOLEAN, false, parseResult, ArrayType::NOT_ARRAY); GetValueIfFindKey<bool>(jsonObject, jsonObjectEnd, MODULE_IS_STAGE_BASED_MODEL, info.isStageBasedModel, JsonType::BOOLEAN, false, parseResult, ArrayType::NOT_ARRAY); GetValueIfFindKey<std::vector<Dependency>>(jsonObject, jsonObjectEnd, MODULE_DEPENDENCIES, info.dependencies, JsonType::ARRAY, false, parseResult, ArrayType::OBJECT); GetValueIfFindKey<std::string>(jsonObject, jsonObjectEnd, MODULE_COMPILE_MODE, info.compileMode, JsonType::STRING, false, parseResult, ArrayType::NOT_ARRAY); GetValueIfFindKey<bool>(jsonObject, jsonObjectEnd, MODULE_IS_LIB_ISOLATED, info.isLibIsolated, JsonType::BOOLEAN, false, parseResult, ArrayType::NOT_ARRAY); GetValueIfFindKey<std::string>(jsonObject, jsonObjectEnd, MODULE_NATIVE_LIBRARY_PATH, info.nativeLibraryPath, JsonType::STRING, false, parseResult, ArrayType::NOT_ARRAY); GetValueIfFindKey<std::string>(jsonObject, jsonObjectEnd, MODULE_CPU_ABI, info.cpuAbi, JsonType::STRING, false, parseResult, ArrayType::NOT_ARRAY); GetValueIfFindKey<std::string>(jsonObject, jsonObjectEnd, MODULE_TARGET_MODULE_NAME, info.targetModuleName, JsonType::STRING, false, parseResult, ArrayType::NOT_ARRAY); GetValueIfFindKey<int32_t>(jsonObject, jsonObjectEnd, MODULE_TARGET_PRIORITY, info.targetPriority, JsonType::NUMBER, false, parseResult, ArrayType::NOT_ARRAY); GetValueIfFindKey<std::vector<OverlayModuleInfo>>(jsonObject, jsonObjectEnd, MODULE_OVERLAY_MODULE_INFO, info.overlayModuleInfo, JsonType::ARRAY, false, parseResult, ArrayType::OBJECT); GetValueIfFindKey<std::vector<std::string>>(jsonObject, jsonObjectEnd, MODULE_PRELOADS, info.preloads, JsonType::ARRAY, false, parseResult, ArrayType::STRING); GetValueIfFindKey<BundleType>(jsonObject, jsonObjectEnd, MODULE_BUNDLE_TYPE, info.bundleType, JsonType::NUMBER, false, parseResult, ArrayType::NOT_ARRAY); GetValueIfFindKey<uint32_t>(jsonObject, jsonObjectEnd, MODULE_VERSION_CODE, info.versionCode, JsonType::NUMBER, false, parseResult, ArrayType::NOT_ARRAY); GetValueIfFindKey<std::string>(jsonObject, jsonObjectEnd, MODULE_VERSION_NAME, info.versionName, JsonType::STRING, false, parseResult, ArrayType::NOT_ARRAY); GetValueIfFindKey<std::vector<ProxyData>>(jsonObject, jsonObjectEnd, MODULE_PROXY_DATAS, info.proxyDatas, JsonType::ARRAY, false, parseResult, ArrayType::OBJECT); GetValueIfFindKey<std::string>(jsonObject, jsonObjectEnd, MODULE_BUILD_HASH, info.buildHash, JsonType::STRING, false, parseResult, ArrayType::NOT_ARRAY); GetValueIfFindKey<std::string>(jsonObject, jsonObjectEnd, MODULE_ISOLATION_MODE, info.isolationMode, JsonType::STRING, false, parseResult, ArrayType::NOT_ARRAY); GetValueIfFindKey<bool>(jsonObject, jsonObjectEnd, MODULE_COMPRESS_NATIVE_LIBS, info.compressNativeLibs, JsonType::BOOLEAN, false, parseResult, ArrayType::NOT_ARRAY); GetValueIfFindKey<std::vector<std::string>>(jsonObject, jsonObjectEnd, MODULE_NATIVE_LIBRARY_FILE_NAMES, info.nativeLibraryFileNames, JsonType::ARRAY, false, parseResult, ArrayType::STRING); GetValueIfFindKey<AOTCompileStatus>(jsonObject, jsonObjectEnd, MODULE_AOT_COMPILE_STATUS, info.aotCompileStatus, JsonType::NUMBER, false, parseResult, ArrayType::NOT_ARRAY); GetValueIfFindKey<std::string>(jsonObject, jsonObjectEnd, MODULE_FILE_CONTEXT_MENU, info.fileContextMenu, JsonType::STRING, false, parseResult, ArrayType::NOT_ARRAY); GetValueIfFindKey<bool>(jsonObject, jsonObjectEnd, MODULE_IS_ENCRYPTED, info.isEncrypted, JsonType::BOOLEAN, false, parseResult, ArrayType::NOT_ARRAY); GetValueIfFindKey<std::vector<std::string>>(jsonObject, jsonObjectEnd, MODULE_QUERY_SCHEMES, info.querySchemes, JsonType::ARRAY, false, parseResult, ArrayType::STRING); GetValueIfFindKey<std::string>(jsonObject, jsonObjectEnd, MODULE_ROUTER_MAP, info.routerMap, JsonType::STRING, false, parseResult, ArrayType::NOT_ARRAY); GetValueIfFindKey<std::vector<AppEnvironment>>(jsonObject, jsonObjectEnd, MODULE_APP_ENVIRONMENTS, info.appEnvironments, JsonType::ARRAY, false, parseResult, ArrayType::OBJECT); GetValueIfFindKey<bool>(jsonObject, jsonObjectEnd, MODULE_ASAN_ENABLED, info.asanEnabled, JsonType::BOOLEAN, false, parseResult, ArrayType::NOT_ARRAY); GetValueIfFindKey<bool>(jsonObject, jsonObjectEnd, MODULE_GWP_ASAN_ENABLED, info.gwpAsanEnabled, JsonType::BOOLEAN, false, parseResult, ArrayType::NOT_ARRAY); GetValueIfFindKey<bool>(jsonObject, jsonObjectEnd, MODULE_TSAN_ENABLED, info.tsanEnabled, JsonType::BOOLEAN, false, parseResult, ArrayType::NOT_ARRAY); GetValueIfFindKey<std::string>(jsonObject, jsonObjectEnd, MODULE_PACKAGE_NAME, info.packageName, JsonType::STRING, false, parseResult, ArrayType::NOT_ARRAY); GetValueIfFindKey<std::string>(jsonObject, jsonObjectEnd, MODULE_APP_STARTUP, info.appStartup, JsonType::STRING, false, parseResult, ArrayType::NOT_ARRAY); GetValueIfFindKey<bool>(jsonObject, jsonObjectEnd, MODULE_HWASAN_ENABLED, hwasanEnabled, JsonType::BOOLEAN, false, parseResult, ArrayType::NOT_ARRAY); if (parseResult != ERR_OK) { APP_LOGE("read InnerModuleInfo from database error code : %{public}d", parseResult); } else { info.innerModuleInfoFlag = hwasanEnabled ? info.innerModuleInfoFlag | InnerBundleInfo::GetSanitizerFlag( GetInnerModuleInfoFlag::GET_INNER_MODULE_INFO_WITH_HWASANENABLED) : info.innerModuleInfoFlag & (~InnerBundleInfo::GetSanitizerFlag(GetInnerModuleInfoFlag::GET_INNER_MODULE_INFO_WITH_HWASANENABLED)); } } void from_json(const nlohmann::json &jsonObject, Distro &distro) { const auto &jsonObjectEnd = jsonObject.end(); int32_t parseResult = ERR_OK; GetValueIfFindKey<bool>(jsonObject, jsonObjectEnd, ProfileReader::BUNDLE_MODULE_PROFILE_KEY_DELIVERY_WITH_INSTALL, distro.deliveryWithInstall, JsonType::BOOLEAN, true, parseResult, ArrayType::NOT_ARRAY); GetValueIfFindKey<std::string>(jsonObject, jsonObjectEnd, ProfileReader::BUNDLE_MODULE_PROFILE_KEY_MODULE_NAME, distro.moduleName, JsonType::STRING, true, parseResult, ArrayType::NOT_ARRAY); GetValueIfFindKey<std::string>(jsonObject, jsonObjectEnd, ProfileReader::BUNDLE_MODULE_PROFILE_KEY_MODULE_TYPE, distro.moduleType, JsonType::STRING, true, parseResult, ArrayType::NOT_ARRAY); // mustFlag decide by distro.moduleType GetValueIfFindKey<bool>(jsonObject, jsonObjectEnd, ProfileReader::BUNDLE_MODULE_PROFILE_KEY_MODULE_INSTALLATION_FREE, distro.installationFree, JsonType::BOOLEAN, false, parseResult, ArrayType::NOT_ARRAY); if (parseResult != ERR_OK) { APP_LOGE("Distro from_json error, error code : %{public}d", parseResult); } } void from_json(const nlohmann::json &jsonObject, InstallMark &installMark) { const auto &jsonObjectEnd = jsonObject.end(); int32_t parseResult = ERR_OK; GetValueIfFindKey<std::string>(jsonObject, jsonObjectEnd, ProfileReader::BUNDLE_INSTALL_MARK_BUNDLE, installMark.bundleName, JsonType::STRING, false, parseResult, ArrayType::NOT_ARRAY); GetValueIfFindKey<std::string>(jsonObject, jsonObjectEnd, ProfileReader::BUNDLE_INSTALL_MARK_PACKAGE, installMark.packageName, JsonType::STRING, false, parseResult, ArrayType::NOT_ARRAY); GetValueIfFindKey<int32_t>(jsonObject, jsonObjectEnd, ProfileReader::BUNDLE_INSTALL_MARK_STATUS, installMark.status, JsonType::NUMBER, false, parseResult, ArrayType::NOT_ARRAY); if (parseResult != ERR_OK) { APP_LOGE("InstallMark from_json error, error code : %{public}d", parseResult); } } void from_json(const nlohmann::json &jsonObject, DefinePermission &definePermission) { const auto &jsonObjectEnd = jsonObject.end(); int32_t parseResult = ERR_OK; GetValueIfFindKey<std::string>(jsonObject, jsonObjectEnd, Profile::DEFINEPERMISSION_NAME, definePermission.name, JsonType::STRING, false, parseResult, ArrayType::NOT_ARRAY); GetValueIfFindKey<std::string>(jsonObject, jsonObjectEnd, Profile::DEFINEPERMISSION_GRANT_MODE, definePermission.grantMode, JsonType::STRING, false, parseResult, ArrayType::NOT_ARRAY); GetValueIfFindKey<std::string>(jsonObject, jsonObjectEnd, Profile::DEFINEPERMISSION_AVAILABLE_LEVEL, definePermission.availableLevel, JsonType::STRING, false, parseResult, ArrayType::NOT_ARRAY); GetValueIfFindKey<bool>(jsonObject, jsonObjectEnd, Profile::DEFINEPERMISSION_PROVISION_ENABLE, definePermission.provisionEnable, JsonType::BOOLEAN, false, parseResult, ArrayType::NOT_ARRAY); GetValueIfFindKey<bool>(jsonObject, jsonObjectEnd, Profile::DEFINEPERMISSION_DISTRIBUTED_SCENE_ENABLE, definePermission.distributedSceneEnable, JsonType::BOOLEAN, false, parseResult, ArrayType::NOT_ARRAY); GetValueIfFindKey<std::string>(jsonObject, jsonObjectEnd, Profile::LABEL, definePermission.label, JsonType::STRING, false, parseResult, ArrayType::NOT_ARRAY); GetValueIfFindKey<int32_t>(jsonObject, jsonObjectEnd, Profile::LABEL_ID, definePermission.labelId, JsonType::NUMBER, false, parseResult, ArrayType::NOT_ARRAY); GetValueIfFindKey<std::string>(jsonObject, jsonObjectEnd, Profile::DESCRIPTION, definePermission.description, JsonType::STRING, false, parseResult, ArrayType::NOT_ARRAY); GetValueIfFindKey<int32_t>(jsonObject, jsonObjectEnd, Profile::DESCRIPTION_ID, definePermission.descriptionId, JsonType::NUMBER, false, parseResult, ArrayType::NOT_ARRAY); GetValueIfFindKey<std::string>(jsonObject, jsonObjectEnd, Profile::DEFINEPERMISSION_AVAILABLE_TYPE, definePermission.availableType, JsonType::STRING, false, parseResult, ArrayType::NOT_ARRAY); if (parseResult != ERR_OK) { APP_LOGE("DefinePermission from_json error, error code : %{public}d", parseResult); } } void from_json(const nlohmann::json &jsonObject, Dependency &dependency) { const auto &jsonObjectEnd = jsonObject.end(); int32_t parseResult = ERR_OK; GetValueIfFindKey<std::string>(jsonObject, jsonObjectEnd, Profile::DEPENDENCIES_MODULE_NAME, dependency.moduleName, JsonType::STRING, false, parseResult, ArrayType::NOT_ARRAY); GetValueIfFindKey<std::string>(jsonObject, jsonObjectEnd, Profile::DEPENDENCIES_BUNDLE_NAME, dependency.bundleName, JsonType::STRING, false, parseResult, ArrayType::NOT_ARRAY); GetValueIfFindKey<int>(jsonObject, jsonObjectEnd, Profile::APP_VERSION_CODE, dependency.versionCode, JsonType::NUMBER, false, parseResult, ArrayType::NOT_ARRAY); if (parseResult != ERR_OK) { APP_LOGE("Dependency from_json error, error code : %{public}d", parseResult); } } int32_t InnerBundleInfo::FromJson(const nlohmann::json &jsonObject) { const auto &jsonObjectEnd = jsonObject.end(); int32_t parseResult = ERR_OK; GetValueIfFindKey<Constants::AppType>(jsonObject, jsonObjectEnd, APP_TYPE, appType_, JsonType::NUMBER, true, parseResult, ArrayType::NOT_ARRAY); GetValueIfFindKey<std::vector<std::string>>(jsonObject, jsonObjectEnd, ALLOWED_ACLS, allowedAcls_, JsonType::ARRAY, false, parseResult, ArrayType::STRING); GetValueIfFindKey<BundleStatus>(jsonObject, jsonObjectEnd, BUNDLE_STATUS, bundleStatus_, JsonType::NUMBER, true, parseResult, ArrayType::NOT_ARRAY); GetValueIfFindKey<BundleInfo>(jsonObject, jsonObjectEnd, BASE_BUNDLE_INFO, *baseBundleInfo_, JsonType::OBJECT, true, parseResult, ArrayType::NOT_ARRAY); GetValueIfFindKey<ApplicationInfo>(jsonObject, jsonObjectEnd, BASE_APPLICATION_INFO, *baseApplicationInfo_, JsonType::OBJECT, true, parseResult, ArrayType::NOT_ARRAY); GetValueIfFindKey<std::map<std::string, AbilityInfo>>(jsonObject, jsonObjectEnd, BASE_ABILITY_INFO, baseAbilityInfos_, JsonType::OBJECT, true, parseResult, ArrayType::NOT_ARRAY); GetValueIfFindKey<std::map<std::string, InnerModuleInfo>>(jsonObject, jsonObjectEnd, INNER_MODULE_INFO, innerModuleInfos_, JsonType::OBJECT, true, parseResult, ArrayType::NOT_ARRAY); GetValueIfFindKey<std::map<std::string, std::vector<InnerModuleInfo>>>(jsonObject, jsonObjectEnd, INNER_SHARED_MODULE_INFO, innerSharedModuleInfos_, JsonType::OBJECT, false, parseResult, ArrayType::NOT_ARRAY); GetValueIfFindKey<std::map<std::string, std::vector<Skill>>>(jsonObject, jsonObjectEnd, SKILL_INFOS, skillInfos_, JsonType::OBJECT, true, parseResult, ArrayType::NOT_ARRAY); GetValueIfFindKey<int>(jsonObject, jsonObjectEnd, USER_ID, userId_, JsonType::NUMBER, true, parseResult, ArrayType::NOT_ARRAY); GetValueIfFindKey<std::string>(jsonObject, jsonObjectEnd, APP_FEATURE, appFeature_, JsonType::STRING, true, parseResult, ArrayType::NOT_ARRAY); GetValueIfFindKey<std::map<std::string, std::vector<FormInfo>>>(jsonObject, jsonObjectEnd, MODULE_FORMS, formInfos_, JsonType::OBJECT, true, parseResult, ArrayType::NOT_ARRAY); GetValueIfFindKey<std::map<std::string, ShortcutInfo>>(jsonObject, jsonObjectEnd, MODULE_SHORTCUT, shortcutInfos_, JsonType::OBJECT, true, parseResult, ArrayType::NOT_ARRAY); GetValueIfFindKey<std::map<std::string, CommonEventInfo>>(jsonObject, jsonObjectEnd, MODULE_COMMON_EVENT, commonEvents_, JsonType::OBJECT, true, parseResult, ArrayType::NOT_ARRAY); GetValueIfFindKey<InstallMark>(jsonObject, jsonObjectEnd, INSTALL_MARK, mark_, JsonType::OBJECT, false, parseResult, ArrayType::NOT_ARRAY); int32_t isOldVersion = ERR_OK; GetValueIfFindKey<std::map<std::string, InnerBundleUserInfo>>(jsonObject, jsonObjectEnd, INNER_BUNDLE_USER_INFOS, innerBundleUserInfos_, JsonType::OBJECT, true, isOldVersion, ArrayType::NOT_ARRAY); if (parseResult == ERR_OK && isOldVersion == ERR_APPEXECFWK_PARSE_PROFILE_MISSING_PROP) { // To be compatible with the old database, // if the old data does not have bundleUserInfos, // the default user information needs to be constructed. BuildDefaultUserInfo(); } GetValueIfFindKey<bool>(jsonObject, jsonObjectEnd, BUNDLE_IS_NEW_VERSION, isNewVersion_, JsonType::BOOLEAN, false, parseResult, ArrayType::NOT_ARRAY); GetValueIfFindKey<std::map<std::string, ExtensionAbilityInfo>>(jsonObject, jsonObjectEnd, BUNDLE_BASE_EXTENSION_INFOS, baseExtensionInfos_, JsonType::OBJECT, false, parseResult, ArrayType::NOT_ARRAY); GetValueIfFindKey<std::map<std::string, std::vector<Skill>>>(jsonObject, jsonObjectEnd, BUNDLE_EXTENSION_SKILL_INFOS, extensionSkillInfos_, JsonType::OBJECT, false, parseResult, ArrayType::NOT_ARRAY); GetValueIfFindKey<std::map<std::string, ExtendResourceInfo>>(jsonObject, jsonObjectEnd, BUNDLE_EXTEND_RESOURCES, extendResourceInfos_, JsonType::OBJECT, false, parseResult, ArrayType::NOT_ARRAY); GetValueIfFindKey<std::string>(jsonObject, jsonObjectEnd, CUR_DYNAMIC_ICON_MODULE, curDynamicIconModule_, JsonType::STRING, false, parseResult, ArrayType::NOT_ARRAY); GetValueIfFindKey<BundlePackInfo>(jsonObject, jsonObjectEnd, BUNDLE_PACK_INFO, *bundlePackInfo_, JsonType::OBJECT, false, parseResult, ArrayType::NOT_ARRAY); GetValueIfFindKey<int>(jsonObject, jsonObjectEnd, APP_INDEX, appIndex_, JsonType::NUMBER, false, parseResult, ArrayType::NOT_ARRAY); GetValueIfFindKey<bool>(jsonObject, jsonObjectEnd, BUNDLE_IS_SANDBOX_APP, isSandboxApp_, JsonType::BOOLEAN, false, parseResult, ArrayType::NOT_ARRAY); GetValueIfFindKey<std::vector<HqfInfo>>(jsonObject, jsonObjectEnd, BUNDLE_HQF_INFOS, hqfInfos_, JsonType::ARRAY, false, parseResult, ArrayType::OBJECT); GetValueIfFindKey<std::vector<OverlayBundleInfo>>(jsonObject, jsonObjectEnd, OVERLAY_BUNDLE_INFO, overlayBundleInfo_, JsonType::ARRAY, false, parseResult, ArrayType::OBJECT); GetValueIfFindKey<int32_t>(jsonObject, jsonObjectEnd, OVERLAY_TYPE, overlayType_, JsonType::NUMBER, false, parseResult, ArrayType::NOT_ARRAY); GetValueIfFindKey<int32_t>(jsonObject, jsonObjectEnd, APPLY_QUICK_FIX_FREQUENCY, applyQuickFixFrequency_, JsonType::NUMBER, false, parseResult, ArrayType::NOT_ARRAY); GetValueIfFindKey<std::unordered_map<std::string, std::vector<DataGroupInfo>>>(jsonObject, jsonObjectEnd, DATA_GROUP_INFOS, dataGroupInfos_, JsonType::OBJECT, false, parseResult, ArrayType::NOT_ARRAY); GetValueIfFindKey<std::string>(jsonObject, jsonObjectEnd, DEVELOPER_ID, developerId_, JsonType::STRING, false, parseResult, ArrayType::NOT_ARRAY); GetValueIfFindKey<std::string>(jsonObject, jsonObjectEnd, ODID, odid_, JsonType::STRING, false, parseResult, ArrayType::NOT_ARRAY); GetValueIfFindKey<bool>(jsonObject, jsonObjectEnd, UNINSTALL_STATE, uninstallState_, JsonType::BOOLEAN, false, parseResult, ArrayType::NOT_ARRAY); if (parseResult != ERR_OK) { APP_LOGE("read InnerBundleInfo from database error code : %{public}d", parseResult); } return parseResult; } void InnerBundleInfo::BuildDefaultUserInfo() { APP_LOGD("BuildDefaultUserInfo: bundleName: %{public}s", baseApplicationInfo_->bundleName.c_str()); InnerBundleUserInfo defaultInnerBundleUserInfo; defaultInnerBundleUserInfo.bundleUserInfo.userId = GetUserId(); defaultInnerBundleUserInfo.uid = uid_; defaultInnerBundleUserInfo.gids.emplace_back(gid_); defaultInnerBundleUserInfo.installTime = baseBundleInfo_->installTime; defaultInnerBundleUserInfo.updateTime = baseBundleInfo_->updateTime; defaultInnerBundleUserInfo.bundleName = baseApplicationInfo_->bundleName; defaultInnerBundleUserInfo.bundleUserInfo.enabled = baseApplicationInfo_->enabled; AddInnerBundleUserInfo(defaultInnerBundleUserInfo); } std::optional<HapModuleInfo> InnerBundleInfo::FindHapModuleInfo( const std::string &modulePackage, int32_t userId, int32_t appIndex) const { auto it = innerModuleInfos_.find(modulePackage); if (it == innerModuleInfos_.end()) { APP_LOGE("not find module %{public}s", modulePackage.c_str()); return std::nullopt; } HapModuleInfo hapInfo; hapInfo.name = it->second.name; hapInfo.package = it->second.modulePackage; hapInfo.moduleName = it->second.moduleName; hapInfo.description = it->second.description; hapInfo.descriptionId = it->second.descriptionId; hapInfo.label = it->second.label; hapInfo.labelId = it->second.labelId; hapInfo.iconPath = it->second.icon; hapInfo.iconId = it->second.iconId; hapInfo.mainAbility = it->second.mainAbility; hapInfo.srcPath = it->second.srcPath; hapInfo.hapPath = it->second.hapPath; hapInfo.supportedModes = baseApplicationInfo_->supportedModes; hapInfo.reqCapabilities = it->second.reqCapabilities; hapInfo.colorMode = it->second.colorMode; hapInfo.isRemovable = it->second.isRemovable; hapInfo.upgradeFlag = it->second.upgradeFlag; hapInfo.isLibIsolated = it->second.isLibIsolated; hapInfo.nativeLibraryPath = it->second.nativeLibraryPath; hapInfo.cpuAbi = it->second.cpuAbi; hapInfo.bundleName = baseApplicationInfo_->bundleName; hapInfo.mainElementName = it->second.mainAbility; hapInfo.pages = it->second.pages; hapInfo.process = it->second.process; hapInfo.resourcePath = it->second.moduleResPath; hapInfo.srcEntrance = it->second.srcEntrance; hapInfo.uiSyntax = it->second.uiSyntax; hapInfo.virtualMachine = it->second.virtualMachine; hapInfo.deliveryWithInstall = it->second.distro.deliveryWithInstall; hapInfo.installationFree = it->second.distro.installationFree; hapInfo.isModuleJson = it->second.isModuleJson; hapInfo.isStageBasedModel = it->second.isStageBasedModel; hapInfo.deviceTypes = it->second.deviceTypes; hapInfo.appStartup = it->second.appStartup; std::string moduleType = it->second.distro.moduleType; if (moduleType == Profile::MODULE_TYPE_ENTRY) { hapInfo.moduleType = ModuleType::ENTRY; } else if (moduleType == Profile::MODULE_TYPE_FEATURE) { hapInfo.moduleType = ModuleType::FEATURE; } else if (moduleType == Profile::MODULE_TYPE_SHARED) { hapInfo.moduleType = ModuleType::SHARED; } else { hapInfo.moduleType = ModuleType::UNKNOWN; } std::string key; key.append(".").append(modulePackage).append("."); for (const auto &extension : baseExtensionInfos_) { if ((extension.first.find(key) != std::string::npos) && (extension.second.moduleName == hapInfo.moduleName)) { hapInfo.extensionInfos.emplace_back(extension.second); } } hapInfo.metadata = it->second.metadata; for (auto &ability : baseAbilityInfos_) { if (ability.second.name == ServiceConstants::APP_DETAIL_ABILITY) { continue; } if ((ability.first.find(key) != std::string::npos) && (ability.second.moduleName == hapInfo.moduleName)) { auto &abilityInfo = hapInfo.abilityInfos.emplace_back(ability.second); GetApplicationInfo(ApplicationFlag::GET_APPLICATION_INFO_WITH_PERMISSION | ApplicationFlag::GET_APPLICATION_INFO_WITH_CERTIFICATE_FINGERPRINT, userId, abilityInfo.applicationInfo, appIndex); } } hapInfo.dependencies = it->second.dependencies; hapInfo.compileMode = ConvertCompileMode(it->second.compileMode); for (const auto &hqf : hqfInfos_) { if (hqf.moduleName == it->second.moduleName) { hapInfo.hqfInfo = hqf; break; } } for (const auto &item : it->second.preloads) { PreloadItem preload(item); hapInfo.preloads.emplace_back(preload); } for (const auto &item : it->second.proxyDatas) { ProxyData proxyData(item); hapInfo.proxyDatas.emplace_back(proxyData); } hapInfo.buildHash = it->second.buildHash; hapInfo.isolationMode = GetIsolationMode(it->second.isolationMode); hapInfo.compressNativeLibs = it->second.compressNativeLibs; hapInfo.nativeLibraryFileNames = it->second.nativeLibraryFileNames; hapInfo.aotCompileStatus = it->second.aotCompileStatus; hapInfo.fileContextMenu = it->second.fileContextMenu; hapInfo.routerMap = it->second.routerMap; hapInfo.appEnvironments = it->second.appEnvironments; hapInfo.packageName = it->second.packageName; return hapInfo; } std::optional<AbilityInfo> InnerBundleInfo::FindAbilityInfo( const std::string &moduleName, const std::string &abilityName, int32_t userId) const { for (const auto &ability : baseAbilityInfos_) { auto abilityInfo = ability.second; if ((abilityInfo.name == abilityName) && (moduleName.empty() || (abilityInfo.moduleName == moduleName))) { GetApplicationInfo(ApplicationFlag::GET_APPLICATION_INFO_WITH_PERMISSION | ApplicationFlag::GET_APPLICATION_INFO_WITH_CERTIFICATE_FINGERPRINT, userId, abilityInfo.applicationInfo); return abilityInfo; } } return std::nullopt; } std::optional<AbilityInfo> InnerBundleInfo::FindAbilityInfoV9( const std::string &moduleName, const std::string &abilityName) const { for (const auto &ability : baseAbilityInfos_) { auto abilityInfo = ability.second; if ((abilityInfo.name == abilityName) && (moduleName.empty() || (abilityInfo.moduleName == moduleName))) { return abilityInfo; } } APP_LOGE("bundleName: %{public}s not find moduleName:%{public}s, abilityName:%{public}s", GetBundleName().c_str(), moduleName.c_str(), abilityName.c_str()); return std::nullopt; } ErrCode InnerBundleInfo::FindAbilityInfo( const std::string &moduleName, const std::string &abilityName, AbilityInfo &info) const { bool isModuleFind = false; for (const auto &ability : baseAbilityInfos_) { auto abilityInfo = ability.second; if ((abilityInfo.moduleName == moduleName)) { isModuleFind = true; if (abilityInfo.name == abilityName) { info = abilityInfo; return ERR_OK; } } } APP_LOGE("bundleName: %{public}s not find moduleName:%{public}s, abilityName:%{public}s, isModuleFind:%{public}d", GetBundleName().c_str(), moduleName.c_str(), abilityName.c_str(), isModuleFind); if (isModuleFind) { return ERR_BUNDLE_MANAGER_ABILITY_NOT_EXIST; } else { return ERR_BUNDLE_MANAGER_MODULE_NOT_EXIST; } } std::optional<std::vector<AbilityInfo>> InnerBundleInfo::FindAbilityInfos(int32_t userId) const { if (!HasInnerBundleUserInfo(userId)) { return std::nullopt; } std::vector<AbilityInfo> abilitys; for (const auto &ability : baseAbilityInfos_) { if (ability.second.name == ServiceConstants::APP_DETAIL_ABILITY) { continue; } auto abilityInfo = ability.second; GetApplicationInfo(ApplicationFlag::GET_APPLICATION_INFO_WITH_PERMISSION | ApplicationFlag::GET_APPLICATION_INFO_WITH_CERTIFICATE_FINGERPRINT, userId, abilityInfo.applicationInfo); abilitys.emplace_back(abilityInfo); } if (abilitys.empty()) { return std::nullopt; } return abilitys; } std::optional<AbilityInfo> InnerBundleInfo::FindAbilityInfo(const std::string continueType, int32_t userId) const { for (const auto &ability : baseAbilityInfos_) { AbilityInfo abilityInfo = ability.second; std::vector<std::string> continueTypes = abilityInfo.continueType; auto item = std::find(continueTypes.begin(), continueTypes.end(), continueType); if (item != continueTypes.end()) { GetApplicationInfo(ApplicationFlag::GET_APPLICATION_INFO_WITH_PERMISSION | ApplicationFlag::GET_APPLICATION_INFO_WITH_CERTIFICATE_FINGERPRINT, userId, abilityInfo.applicationInfo); return abilityInfo; } } return std::nullopt; } std::optional<ExtensionAbilityInfo> InnerBundleInfo::FindExtensionInfo( const std::string &moduleName, const std::string &extensionName) const { for (const auto &extension : baseExtensionInfos_) { if ((extension.second.name == extensionName) && (moduleName.empty() || (extension.second.moduleName == moduleName))) { return extension.second; } } return std::nullopt; } std::optional<std::vector<ExtensionAbilityInfo>> InnerBundleInfo::FindExtensionInfos() const { std::vector<ExtensionAbilityInfo> extensions; for (const auto &extension : baseExtensionInfos_) { extensions.emplace_back(extension.second); } if (extensions.empty()) { return std::nullopt; } return extensions; } bool InnerBundleInfo::AddModuleInfo(const InnerBundleInfo &newInfo) { if (newInfo.currentPackage_.empty()) { APP_LOGE("current package is empty"); return false; } if (FindModule(newInfo.currentPackage_)) { APP_LOGE("current package %{public}s exist", currentPackage_.c_str()); return false; } AddInnerModuleInfo(newInfo.innerModuleInfos_); AddModuleAbilityInfo(newInfo.baseAbilityInfos_); AddModuleSkillInfo(newInfo.skillInfos_); AddModuleExtensionInfos(newInfo.baseExtensionInfos_); AddModuleExtensionSkillInfos(newInfo.extensionSkillInfos_); AddModuleFormInfo(newInfo.formInfos_); AddModuleShortcutInfo(newInfo.shortcutInfos_); AddModuleCommonEvent(newInfo.commonEvents_); UpdateIsCompressNativeLibs(); return true; } void InnerBundleInfo::UpdateBaseBundleInfo(const BundleInfo &bundleInfo, bool isEntry) { baseBundleInfo_->name = bundleInfo.name; baseBundleInfo_->versionCode = bundleInfo.versionCode; baseBundleInfo_->versionName = bundleInfo.versionName; baseBundleInfo_->minCompatibleVersionCode = bundleInfo.minCompatibleVersionCode; baseBundleInfo_->compatibleVersion = bundleInfo.compatibleVersion; baseBundleInfo_->targetVersion = bundleInfo.targetVersion; baseBundleInfo_->isKeepAlive = bundleInfo.isKeepAlive; baseBundleInfo_->singleton = bundleInfo.singleton; if (!baseBundleInfo_->isPreInstallApp) { baseBundleInfo_->isPreInstallApp = bundleInfo.isPreInstallApp; } baseBundleInfo_->vendor = bundleInfo.vendor; if (!baseBundleInfo_->isNativeApp) { baseBundleInfo_->isNativeApp = bundleInfo.isNativeApp; } if (isEntry) { baseBundleInfo_->mainEntry = bundleInfo.mainEntry; baseBundleInfo_->entryModuleName = bundleInfo.entryModuleName; } } void InnerBundleInfo::UpdateBaseApplicationInfo( const ApplicationInfo &applicationInfo, bool isEntry) { baseApplicationInfo_->name = applicationInfo.name; baseApplicationInfo_->bundleName = applicationInfo.bundleName; baseApplicationInfo_->versionCode = applicationInfo.versionCode; baseApplicationInfo_->versionName = applicationInfo.versionName; baseApplicationInfo_->minCompatibleVersionCode = applicationInfo.minCompatibleVersionCode; baseApplicationInfo_->apiCompatibleVersion = applicationInfo.apiCompatibleVersion; baseApplicationInfo_->apiTargetVersion = applicationInfo.apiTargetVersion; baseApplicationInfo_->iconPath = applicationInfo.iconPath; baseApplicationInfo_->iconId = applicationInfo.iconId; baseApplicationInfo_->label = applicationInfo.label; baseApplicationInfo_->labelId = applicationInfo.labelId; baseApplicationInfo_->description = applicationInfo.description; baseApplicationInfo_->descriptionId = applicationInfo.descriptionId; baseApplicationInfo_->iconResource = applicationInfo.iconResource; baseApplicationInfo_->labelResource = applicationInfo.labelResource; baseApplicationInfo_->descriptionResource = applicationInfo.descriptionResource; baseApplicationInfo_->singleton = applicationInfo.singleton; baseApplicationInfo_->userDataClearable = applicationInfo.userDataClearable; baseApplicationInfo_->accessible = applicationInfo.accessible; baseApplicationInfo_->cloudFileSyncEnabled = applicationInfo.cloudFileSyncEnabled; if (!baseApplicationInfo_->isSystemApp) { baseApplicationInfo_->isSystemApp = applicationInfo.isSystemApp; } if (!baseApplicationInfo_->isLauncherApp) { baseApplicationInfo_->isLauncherApp = applicationInfo.isLauncherApp; } baseApplicationInfo_->deviceId = applicationInfo.deviceId; baseApplicationInfo_->distributedNotificationEnabled = applicationInfo.distributedNotificationEnabled; baseApplicationInfo_->entityType = applicationInfo.entityType; baseApplicationInfo_->process = applicationInfo.process; baseApplicationInfo_->supportedModes = applicationInfo.supportedModes; baseApplicationInfo_->vendor = applicationInfo.vendor; baseApplicationInfo_->appDistributionType = applicationInfo.appDistributionType; baseApplicationInfo_->appProvisionType = applicationInfo.appProvisionType; baseApplicationInfo_->formVisibleNotify = applicationInfo.formVisibleNotify; baseApplicationInfo_->needAppDetail = applicationInfo.needAppDetail; baseApplicationInfo_->appDetailAbilityLibraryPath = applicationInfo.appDetailAbilityLibraryPath; baseApplicationInfo_->bundleType = applicationInfo.bundleType; UpdatePrivilegeCapability(applicationInfo); SetHideDesktopIcon(applicationInfo.hideDesktopIcon); #ifdef BUNDLE_FRAMEWORK_OVERLAY_INSTALLATION baseApplicationInfo_->targetBundleName = applicationInfo.targetBundleName; baseApplicationInfo_->targetPriority = applicationInfo.targetPriority; #endif UpdateDebug(applicationInfo.debug, isEntry); baseApplicationInfo_->organization = applicationInfo.organization; baseApplicationInfo_->multiProjects = applicationInfo.multiProjects; baseApplicationInfo_->appEnvironments = applicationInfo.appEnvironments; baseApplicationInfo_->maxChildProcess = applicationInfo.maxChildProcess; baseApplicationInfo_->installSource = applicationInfo.installSource; baseApplicationInfo_->configuration = applicationInfo.configuration; } ErrCode InnerBundleInfo::GetApplicationEnabledV9(int32_t userId, bool &isEnabled, int32_t appIndex) const { InnerBundleUserInfo innerBundleUserInfo; if (!GetInnerBundleUserInfo(userId, innerBundleUserInfo)) { APP_LOGD("can not find bundleUserInfo in userId: %{public}d when GetApplicationEnabled", userId); return ERR_BUNDLE_MANAGER_BUNDLE_NOT_EXIST; } if (appIndex == 0) { isEnabled = innerBundleUserInfo.bundleUserInfo.enabled; PrintSetEnabledInfo(isEnabled, userId, appIndex, innerBundleUserInfo.bundleName, innerBundleUserInfo.bundleUserInfo.setEnabledCaller); return ERR_OK; } else if (appIndex > 0 && appIndex <= Constants::INITIAL_SANDBOX_APP_INDEX) { const std::map<std::string, InnerBundleCloneInfo> mpCloneInfos = innerBundleUserInfo.cloneInfos; std::string key = InnerBundleUserInfo::AppIndexToKey(appIndex); if (mpCloneInfos.find(key) == mpCloneInfos.end()) { return ERR_APPEXECFWK_CLONE_QUERY_NO_CLONE_APP; } isEnabled = mpCloneInfos.at(key).enabled; PrintSetEnabledInfo(isEnabled, userId, appIndex, innerBundleUserInfo.bundleName, mpCloneInfos.at(key).setEnabledCaller); return ERR_OK; } else { return ERR_APPEXECFWK_APP_INDEX_OUT_OF_RANGE; } } void InnerBundleInfo::UpdateAppDetailAbilityAttrs() { if (IsExistLauncherAbility()) { baseApplicationInfo_->needAppDetail = false; baseApplicationInfo_->appDetailAbilityLibraryPath = Constants::EMPTY_STRING; } for (auto iter = baseAbilityInfos_.begin(); iter != baseAbilityInfos_.end(); ++iter) { if (iter->second.name == ServiceConstants::APP_DETAIL_ABILITY) { baseAbilityInfos_.erase(iter); return; } } } bool InnerBundleInfo::IsHideDesktopIcon() const { return baseApplicationInfo_->hideDesktopIcon ? true : !IsExistLauncherAbility(); } bool InnerBundleInfo::IsExistLauncherAbility() const { bool isExistLauncherAbility = false; OHOS::AAFwk::Want want; want.SetAction(OHOS::AAFwk::Want::ACTION_HOME); want.AddEntity(OHOS::AAFwk::Want::ENTITY_HOME); for (const auto& abilityInfoPair : baseAbilityInfos_) { auto skillsPair = skillInfos_.find(abilityInfoPair.first); if (skillsPair == skillInfos_.end()) { continue; } for (const Skill& skill : skillsPair->second) { if (skill.MatchLauncher(want) && (abilityInfoPair.second.type == AbilityType::PAGE)) { isExistLauncherAbility = true; break; } } } return isExistLauncherAbility; } void InnerBundleInfo::UpdateNativeLibAttrs(const ApplicationInfo &applicationInfo) { baseApplicationInfo_->cpuAbi = applicationInfo.cpuAbi; baseApplicationInfo_->nativeLibraryPath = applicationInfo.nativeLibraryPath; } void InnerBundleInfo::UpdateArkNativeAttrs(const ApplicationInfo &applicationInfo) { baseApplicationInfo_->arkNativeFileAbi = applicationInfo.arkNativeFileAbi; baseApplicationInfo_->arkNativeFilePath = applicationInfo.arkNativeFilePath; } void InnerBundleInfo::UpdatePrivilegeCapability(const ApplicationInfo &applicationInfo) { SetKeepAlive(applicationInfo.keepAlive); baseApplicationInfo_->runningResourcesApply = applicationInfo.runningResourcesApply; baseApplicationInfo_->associatedWakeUp = applicationInfo.associatedWakeUp; SetAllowCommonEvent(applicationInfo.allowCommonEvent); SetAllowAppRunWhenDeviceFirstLocked(applicationInfo.allowAppRunWhenDeviceFirstLocked); baseApplicationInfo_->resourcesApply = applicationInfo.resourcesApply; baseApplicationInfo_->allowEnableNotification = applicationInfo.allowEnableNotification; if (applicationInfo.hideDesktopIcon) { SetHideDesktopIcon(true); } } void InnerBundleInfo::UpdateRemovable(bool isPreInstall, bool removable) { #ifdef USE_PRE_BUNDLE_PROFILE if (!isPreInstall) { return; } #endif baseApplicationInfo_->removable = removable; } void InnerBundleInfo::UpdateModuleInfo(const InnerBundleInfo &newInfo) { if (newInfo.currentPackage_.empty()) { APP_LOGE("no package in new info"); return; } RemoveModuleInfo(newInfo.currentPackage_); AddInnerModuleInfo(newInfo.innerModuleInfos_); AddModuleAbilityInfo(newInfo.baseAbilityInfos_); AddModuleSkillInfo(newInfo.skillInfos_); AddModuleExtensionInfos(newInfo.baseExtensionInfos_); AddModuleExtensionSkillInfos(newInfo.extensionSkillInfos_); AddModuleFormInfo(newInfo.formInfos_); AddModuleShortcutInfo(newInfo.shortcutInfos_); AddModuleCommonEvent(newInfo.commonEvents_); UpdateIsCompressNativeLibs(); } bool InnerBundleInfo::GetMaxVerBaseSharedBundleInfo(const std::string &moduleName, BaseSharedBundleInfo &baseSharedBundleInfo) const { auto it = innerSharedModuleInfos_.find(moduleName); if (it == innerSharedModuleInfos_.end()) { APP_LOGE("The shared module(%{public}s) infomation not exist", moduleName.c_str()); return false; } auto sharedModuleInfoVector = it->second; if (sharedModuleInfoVector.empty()) { APP_LOGE("No version exists for the shared module(%{public}s)", moduleName.c_str()); return false; } InnerModuleInfo innerModuleInfo = sharedModuleInfoVector.front(); if (innerModuleInfo.bundleType != BundleType::SHARED) { APP_LOGE("GetMaxVerBaseSharedBundleInfo failed, bundleType is invalid"); return false; } baseSharedBundleInfo.bundleName = baseBundleInfo_->name; baseSharedBundleInfo.moduleName = innerModuleInfo.moduleName; baseSharedBundleInfo.versionCode = innerModuleInfo.versionCode; baseSharedBundleInfo.nativeLibraryPath = innerModuleInfo.nativeLibraryPath; baseSharedBundleInfo.hapPath = innerModuleInfo.hapPath; baseSharedBundleInfo.compressNativeLibs = innerModuleInfo.compressNativeLibs; baseSharedBundleInfo.nativeLibraryFileNames = innerModuleInfo.nativeLibraryFileNames; return true; } bool InnerBundleInfo::GetBaseSharedBundleInfo(const std::string &moduleName, uint32_t versionCode, BaseSharedBundleInfo &baseSharedBundleInfo) const { auto it = innerSharedModuleInfos_.find(moduleName); if (it == innerSharedModuleInfos_.end()) { APP_LOGE("The shared module(%{public}s) infomation not exist", moduleName.c_str()); return false; } auto sharedModuleInfoVector = it->second; if (sharedModuleInfoVector.empty()) { APP_LOGE("No version exists for the shared module(%{public}s)", moduleName.c_str()); return false; } for (const auto &item : sharedModuleInfoVector) { if (item.bundleType != BundleType::SHARED) { APP_LOGE("GetBaseSharedBundleInfo failed, bundleType is invalid"); return false; } if (item.versionCode == versionCode) { baseSharedBundleInfo.bundleName = baseBundleInfo_->name; baseSharedBundleInfo.moduleName = item.moduleName; baseSharedBundleInfo.versionCode = item.versionCode; baseSharedBundleInfo.nativeLibraryPath = item.nativeLibraryPath; baseSharedBundleInfo.hapPath = item.hapPath; baseSharedBundleInfo.compressNativeLibs = item.compressNativeLibs; baseSharedBundleInfo.nativeLibraryFileNames = item.nativeLibraryFileNames; return true; } } APP_LOGE("GetBaseSharedBundleInfo failed, the version(%{public}d) not exists for this module(%{public}s)", versionCode, moduleName.c_str()); return false; } void InnerBundleInfo::InsertInnerSharedModuleInfo(const std::string &moduleName, const InnerModuleInfo &innerModuleInfo) { auto iterator = innerSharedModuleInfos_.find(moduleName); if (iterator != innerSharedModuleInfos_.end()) { auto innerModuleInfoVector = iterator->second; bool insertFlag = false; for (unsigned long i = 0; i < innerModuleInfoVector.size(); i++) { if (innerModuleInfo.versionCode == innerModuleInfoVector.at(i).versionCode) { // if the inserted versionCode same as the existing one, replace old innerModuleInfo. innerModuleInfoVector.at(i) = innerModuleInfo; insertFlag = true; break; } else if (innerModuleInfo.versionCode > innerModuleInfoVector.at(i).versionCode) { // if the inserted versionCode bigger then the existing one, insert the specified location. innerModuleInfoVector.emplace(innerModuleInfoVector.begin() + i, innerModuleInfo); insertFlag = true; break; } else { continue; } } if (!insertFlag) { // insert innerModuleInfo in last location. innerModuleInfoVector.emplace(innerModuleInfoVector.end(), innerModuleInfo); } innerSharedModuleInfos_[moduleName] = innerModuleInfoVector; } else { std::vector<InnerModuleInfo> newInnerModuleInfoVector; newInnerModuleInfoVector.emplace_back(innerModuleInfo); innerSharedModuleInfos_.try_emplace(moduleName, newInnerModuleInfoVector); } } void InnerBundleInfo::SetSharedModuleNativeLibraryPath(const std::string &nativeLibraryPath) { auto sharedModuleInfoIterator = innerSharedModuleInfos_.find(currentPackage_); auto moduleInfoIterator = innerModuleInfos_.find(currentPackage_); if ((sharedModuleInfoIterator == innerSharedModuleInfos_.end()) || (moduleInfoIterator == innerModuleInfos_.end())) { APP_LOGE("The shared module(%{public}s) infomation not exist", currentPackage_.c_str()); return; } auto &innerModuleInfoVector = sharedModuleInfoIterator->second; for (auto iter = innerModuleInfoVector.begin(); iter != innerModuleInfoVector.end(); ++iter) { if (iter->versionCode == moduleInfoIterator->second.versionCode) { iter->nativeLibraryPath = nativeLibraryPath; return; } } } bool InnerBundleInfo::GetSharedBundleInfo(SharedBundleInfo &sharedBundleInfo) const { sharedBundleInfo.name = GetBundleName(); sharedBundleInfo.compatiblePolicy = CompatiblePolicy::BACKWARD_COMPATIBILITY; std::vector<SharedModuleInfo> sharedModuleInfos; for (const auto &infoVector : innerSharedModuleInfos_) { for (const auto &info : infoVector.second) { SharedModuleInfo sharedModuleInfo; sharedModuleInfo.name = info.name; sharedModuleInfo.versionCode = info.versionCode; sharedModuleInfo.versionName = info.versionName; sharedModuleInfo.description = info.description; sharedModuleInfo.descriptionId = info.descriptionId; sharedModuleInfo.compressNativeLibs = info.compressNativeLibs; sharedModuleInfo.hapPath = info.hapPath; sharedModuleInfo.cpuAbi = info.cpuAbi; sharedModuleInfo.nativeLibraryPath = info.nativeLibraryPath; sharedModuleInfo.nativeLibraryFileNames = info.nativeLibraryFileNames; sharedModuleInfos.emplace_back(sharedModuleInfo); } } sharedBundleInfo.sharedModuleInfos = sharedModuleInfos; return true; } bool InnerBundleInfo::GetSharedDependencies(const std::string &moduleName, std::vector<Dependency> &dependencies) const { if (innerModuleInfos_.find(moduleName) != innerModuleInfos_.end()) { dependencies = innerModuleInfos_.at(moduleName).dependencies; return true; } APP_LOGE("GetSharedDependencies not find module %{public}s", moduleName.c_str()); return false; } bool InnerBundleInfo::GetAllSharedDependencies(const std::string &moduleName, std::vector<Dependency> &dependencies) const { if (!GetSharedDependencies(moduleName, dependencies)) { return false; } std::deque<Dependency> dependenciesDeque; std::copy(dependencies.begin(), dependencies.end(), std::back_inserter(dependenciesDeque)); dependencies.clear(); while (!dependenciesDeque.empty()) { bool isAdd = true; Dependency itemDependency = dependenciesDeque.front(); dependenciesDeque.pop_front(); for (const auto &item : dependencies) { if (item.bundleName == itemDependency.bundleName && item.moduleName == itemDependency.moduleName && item.versionCode == itemDependency.versionCode) { isAdd = false; break; } } if (isAdd) { dependencies.push_back(itemDependency); std::vector<Dependency> tempDependencies; if (GetSharedDependencies(itemDependency.moduleName, tempDependencies)) { std::copy(tempDependencies.begin(), tempDependencies.end(), std::back_inserter(dependenciesDeque)); } } } return true; } void InnerBundleInfo::RemoveModuleInfo(const std::string &modulePackage) { auto it = innerModuleInfos_.find(modulePackage); if (it == innerModuleInfos_.end()) { APP_LOGE("The module(%{public}s) infomation not exist", modulePackage.c_str()); return; } auto oldModuleInfo = it->second; if (oldModuleInfo.isEntry) { baseBundleInfo_->mainEntry.clear(); baseBundleInfo_->entryModuleName.clear(); } innerModuleInfos_.erase(it); std::string key; key.append(".").append(modulePackage).append("."); for (auto iter = shortcutInfos_.begin(); iter != shortcutInfos_.end();) { if (iter->first.find(key) != std::string::npos) { shortcutInfos_.erase(iter++); } else { ++iter; } } for (auto iter = commonEvents_.begin(); iter != commonEvents_.end();) { if (iter->first.find(key) != std::string::npos) { commonEvents_.erase(iter++); } else { ++iter; } } // delete old abilityInfos for (auto abilityKey : oldModuleInfo.abilityKeys) { auto abilityItem = baseAbilityInfos_.find(abilityKey); if (abilityItem == baseAbilityInfos_.end()) { continue; } baseAbilityInfos_.erase(abilityItem); formInfos_.erase(abilityKey); } // delete old skillInfos for (auto skillKey : oldModuleInfo.skillKeys) { auto skillItem = skillInfos_.find(skillKey); if (skillItem == skillInfos_.end()) { continue; } skillInfos_.erase(skillItem); } // delete old extensionInfos for (auto extensionKey : oldModuleInfo.extensionKeys) { auto extensionItem = baseExtensionInfos_.find(extensionKey); if (extensionItem == baseExtensionInfos_.end()) { continue; } baseExtensionInfos_.erase(extensionItem); } // delete old extensionSkillInfos for (auto extensionSkillKey : oldModuleInfo.extensionSkillKeys) { auto extensionSkillItem = extensionSkillInfos_.find(extensionSkillKey); if (extensionSkillItem == extensionSkillInfos_.end()) { continue; } extensionSkillInfos_.erase(extensionSkillItem); } } std::string InnerBundleInfo::ToString() const { nlohmann::json j; ToJson(j); return j.dump(); } void InnerBundleInfo::GetApplicationInfo(int32_t flags, int32_t userId, ApplicationInfo &appInfo, int32_t appIndex) const { InnerBundleUserInfo innerBundleUserInfo; if (!GetInnerBundleUserInfo(userId, innerBundleUserInfo)) { LOG_E(BMS_TAG_QUERY, "can not find userId %{public}d when get applicationInfo", userId); return; } if (baseApplicationInfo_ == nullptr) { LOG_E(BMS_TAG_QUERY, "baseApplicationInfo_ is nullptr"); return; } appInfo = *baseApplicationInfo_; if (!GetApplicationInfoAdaptBundleClone(innerBundleUserInfo, appIndex, appInfo)) { return; } for (const auto &info : innerModuleInfos_) { bool deCompress = info.second.hapPath.empty(); ModuleInfo moduleInfo; moduleInfo.moduleName = info.second.moduleName; if (deCompress) { moduleInfo.moduleSourceDir = info.second.modulePath; appInfo.moduleSourceDirs.emplace_back(info.second.modulePath); } if (info.second.hnpPackages.size() > 0) { appInfo.hnpPackages[info.second.moduleName] = info.second.hnpPackages; } moduleInfo.preloads = info.second.preloads; appInfo.moduleInfos.emplace_back(moduleInfo); if (deCompress && info.second.isEntry) { appInfo.entryDir = info.second.modulePath; } if ((static_cast<uint32_t>(flags) & GET_APPLICATION_INFO_WITH_PERMISSION) == GET_APPLICATION_INFO_WITH_PERMISSION) { for (const auto &item : info.second.requestPermissions) { appInfo.permissions.push_back(item.name); } } if ((static_cast<uint32_t>(flags) & GET_APPLICATION_INFO_WITH_METADATA) == GET_APPLICATION_INFO_WITH_METADATA) { bool isModuleJson = info.second.isModuleJson; if (!isModuleJson && info.second.metaData.customizeData.size() > 0) { appInfo.metaData[info.second.moduleName] = info.second.metaData.customizeData; } if (isModuleJson && info.second.metadata.size() > 0) { appInfo.metadata[info.second.moduleName] = info.second.metadata; } } if ((static_cast<uint32_t>(flags) & GET_APPLICATION_INFO_WITH_CERTIFICATE_FINGERPRINT) != GET_APPLICATION_INFO_WITH_CERTIFICATE_FINGERPRINT) { appInfo.fingerprint.clear(); } } if (!appInfo.permissions.empty()) { RemoveDuplicateName(appInfo.permissions); } appInfo.appIndex = appIndex; // The label and icon are first used under main ability AdaptMainLauncherResourceInfo(appInfo); } ErrCode InnerBundleInfo::GetApplicationInfoV9(int32_t flags, int32_t userId, ApplicationInfo &appInfo, int32_t appIndex) const { InnerBundleUserInfo innerBundleUserInfo; if (!GetInnerBundleUserInfo(userId, innerBundleUserInfo)) { LOG_E(BMS_TAG_QUERY, "can not find userId %{public}d when get applicationInfo", userId); return ERR_BUNDLE_MANAGER_INTERNAL_ERROR; } appInfo = *baseApplicationInfo_; if (!GetApplicationInfoAdaptBundleClone(innerBundleUserInfo, appIndex, appInfo)) { return ERR_APPEXECFWK_CLONE_INSTALL_INVALID_APP_INDEX; } for (const auto &info : innerModuleInfos_) { bool deCompress = info.second.hapPath.empty(); ModuleInfo moduleInfo; moduleInfo.moduleName = info.second.moduleName; if (deCompress) { moduleInfo.moduleSourceDir = info.second.modulePath; appInfo.moduleSourceDirs.emplace_back(info.second.modulePath); } if (info.second.hnpPackages.size() > 0) { appInfo.hnpPackages[info.second.moduleName] = info.second.hnpPackages; } moduleInfo.preloads = info.second.preloads; appInfo.moduleInfos.emplace_back(moduleInfo); if (deCompress && info.second.isEntry) { appInfo.entryDir = info.second.modulePath; } if ((static_cast<uint32_t>(flags) & static_cast<uint32_t>(GetApplicationFlag::GET_APPLICATION_INFO_WITH_PERMISSION)) == static_cast<uint32_t>(GetApplicationFlag::GET_APPLICATION_INFO_WITH_PERMISSION)) { for (const auto &item : info.second.requestPermissions) { appInfo.permissions.push_back(item.name); } } if ((static_cast<uint32_t>(flags) & static_cast<uint32_t>(GetApplicationFlag::GET_APPLICATION_INFO_WITH_METADATA)) == static_cast<uint32_t>(GetApplicationFlag::GET_APPLICATION_INFO_WITH_METADATA)) { bool isModuleJson = info.second.isModuleJson; if (!isModuleJson && info.second.metaData.customizeData.size() > 0) { appInfo.metaData[info.second.moduleName] = info.second.metaData.customizeData; } if (isModuleJson && info.second.metadata.size() > 0) { appInfo.metadata[info.second.moduleName] = info.second.metadata; } } } if (!appInfo.permissions.empty()) { RemoveDuplicateName(appInfo.permissions); } // The label and icon are first used under main ability AdaptMainLauncherResourceInfo(appInfo); return ERR_OK; } bool InnerBundleInfo::GetBundleInfo(int32_t flags, BundleInfo &bundleInfo, int32_t userId, int32_t appIndex) const { InnerBundleUserInfo innerBundleUserInfo; if (!GetInnerBundleUserInfo(userId, innerBundleUserInfo)) { LOG_E(BMS_TAG_QUERY, "can not find userId %{public}d when GetBundleInfo bundleName:%{public}s", userId, GetBundleName().c_str()); return false; } bundleInfo = *baseBundleInfo_; if (!GetBundleInfoAdaptBundleClone(innerBundleUserInfo, appIndex, bundleInfo)) { LOG_E(BMS_TAG_QUERY, "userId %{public}d index %{public}d not exist", userId, appIndex); return false; } bundleInfo.overlayType = overlayType_; bundleInfo.isNewVersion = isNewVersion_; GetApplicationInfo(ApplicationFlag::GET_APPLICATION_INFO_WITH_CERTIFICATE_FINGERPRINT, userId, bundleInfo.applicationInfo, appIndex); for (const auto &info : innerModuleInfos_) { if ((static_cast<uint32_t>(flags) & GET_BUNDLE_WITH_REQUESTED_PERMISSION) == GET_BUNDLE_WITH_REQUESTED_PERMISSION) { for (const auto &item : info.second.requestPermissions) { bundleInfo.reqPermissions.push_back(item.name); } for (const auto &item : info.second.definePermissions) { bundleInfo.defPermissions.push_back(item.name); } } bundleInfo.hapModuleNames.emplace_back(info.second.modulePackage); auto hapmoduleinfo = FindHapModuleInfo(info.second.modulePackage, userId); if (hapmoduleinfo) { GetModuleWithHashValue(flags, info.second.modulePackage, *hapmoduleinfo); bundleInfo.hapModuleInfos.emplace_back(*hapmoduleinfo); bundleInfo.moduleNames.emplace_back(info.second.moduleName); bundleInfo.moduleDirs.emplace_back(info.second.modulePath); bundleInfo.modulePublicDirs.emplace_back(info.second.moduleDataDir); bundleInfo.moduleResPaths.emplace_back(info.second.moduleResPath); } else { LOG_E(BMS_TAG_QUERY, "can not find hapmoduleinfo %{public}s", info.second.moduleName.c_str()); } } if ((static_cast<uint32_t>(flags) & GET_BUNDLE_WITH_REQUESTED_PERMISSION) == GET_BUNDLE_WITH_REQUESTED_PERMISSION) { if (!bundleInfo.reqPermissions.empty()) { RemoveDuplicateName(bundleInfo.reqPermissions); } if (!bundleInfo.defPermissions.empty()) { RemoveDuplicateName(bundleInfo.defPermissions); } if (!BundlePermissionMgr::GetRequestPermissionStates(bundleInfo, bundleInfo.applicationInfo.accessTokenId, bundleInfo.applicationInfo.deviceId)) { LOG_E(BMS_TAG_QUERY, "get request permission state failed"); } bundleInfo.reqPermissionDetails = GetAllRequestPermissions(); } GetBundleWithAbilities(flags, bundleInfo, appIndex, userId); GetBundleWithExtension(flags, bundleInfo, appIndex, userId); return true; } ErrCode InnerBundleInfo::GetBundleInfoV9(int32_t flags, BundleInfo &bundleInfo, int32_t userId, int32_t appIndex) const { InnerBundleUserInfo innerBundleUserInfo; if (!GetInnerBundleUserInfo(userId, innerBundleUserInfo)) { LOG_E(BMS_TAG_QUERY, "can not find userId %{public}d when GetBundleInfo", userId); return ERR_BUNDLE_MANAGER_INTERNAL_ERROR; } bundleInfo = *baseBundleInfo_; if (!GetBundleInfoAdaptBundleClone(innerBundleUserInfo, appIndex, bundleInfo)) { LOG_E(BMS_TAG_QUERY, "userId %{public}d index %{public}d not exist", userId, appIndex); return ERR_BUNDLE_MANAGER_INTERNAL_ERROR; } bundleInfo.overlayType = overlayType_; bundleInfo.isNewVersion = isNewVersion_; for (const auto &info : innerModuleInfos_) { bundleInfo.hapModuleNames.emplace_back(info.second.modulePackage); auto hapmoduleinfo = FindHapModuleInfo(info.second.modulePackage, userId, appIndex); if (hapmoduleinfo) { bundleInfo.moduleNames.emplace_back(info.second.moduleName); bundleInfo.moduleDirs.emplace_back(info.second.modulePath); bundleInfo.modulePublicDirs.emplace_back(info.second.moduleDataDir); bundleInfo.moduleResPaths.emplace_back(info.second.moduleResPath); } else { LOG_E(BMS_TAG_QUERY, "can not find hapmoduleinfo %{public}s", info.second.moduleName.c_str()); } } ProcessBundleFlags(flags, userId, bundleInfo, appIndex); return ERR_OK; } bool InnerBundleInfo::GetSharedBundleInfo(int32_t flags, BundleInfo &bundleInfo) const { bundleInfo = *baseBundleInfo_; ProcessBundleWithHapModuleInfoFlag(flags, bundleInfo, Constants::ALL_USERID); bundleInfo.applicationInfo = *baseApplicationInfo_; return true; } void InnerBundleInfo::ProcessBundleFlags( int32_t flags, int32_t userId, BundleInfo &bundleInfo, int32_t appIndex) const { if ((static_cast<uint32_t>(flags) & static_cast<uint32_t>(GetBundleInfoFlag::GET_BUNDLE_INFO_WITH_APPLICATION)) == static_cast<uint32_t>(GetBundleInfoFlag::GET_BUNDLE_INFO_WITH_APPLICATION)) { if ((static_cast<uint32_t>(flags) & static_cast<uint32_t>(GetBundleInfoFlag::GET_BUNDLE_INFO_WITH_METADATA)) == static_cast<uint32_t>(GetBundleInfoFlag::GET_BUNDLE_INFO_WITH_METADATA)) { GetApplicationInfoV9(static_cast<int32_t>(GetApplicationFlag::GET_APPLICATION_INFO_WITH_METADATA), userId, bundleInfo.applicationInfo, appIndex); } else { GetApplicationInfoV9(static_cast<int32_t>(GetApplicationFlag::GET_APPLICATION_INFO_DEFAULT), userId, bundleInfo.applicationInfo, appIndex); } } bundleInfo.applicationInfo.appIndex = appIndex; GetBundleWithReqPermissionsV9(flags, userId, bundleInfo, appIndex); ProcessBundleWithHapModuleInfoFlag(flags, bundleInfo, userId, appIndex); if ((static_cast<uint32_t>(flags) & static_cast<uint32_t>(GetBundleInfoFlag::GET_BUNDLE_INFO_WITH_SIGNATURE_INFO)) == static_cast<uint32_t>(GetBundleInfoFlag::GET_BUNDLE_INFO_WITH_SIGNATURE_INFO)) { bundleInfo.signatureInfo.appId = baseBundleInfo_->appId; bundleInfo.signatureInfo.fingerprint = baseApplicationInfo_->fingerprint; bundleInfo.signatureInfo.certificate = baseBundleInfo_->signatureInfo.certificate; } } void InnerBundleInfo::GetBundleWithReqPermissionsV9( int32_t flags, int32_t userId, BundleInfo &bundleInfo, int32_t appIndex) const { if ((static_cast<uint32_t>(flags) & static_cast<uint32_t>(GetBundleInfoFlag::GET_BUNDLE_INFO_WITH_REQUESTED_PERMISSION)) != static_cast<uint32_t>(GetBundleInfoFlag::GET_BUNDLE_INFO_WITH_REQUESTED_PERMISSION)) { return; } for (const auto &info : innerModuleInfos_) { for (const auto &item : info.second.requestPermissions) { bundleInfo.reqPermissions.push_back(item.name); } for (const auto &item : info.second.definePermissions) { bundleInfo.defPermissions.push_back(item.name); } } if (!bundleInfo.reqPermissions.empty()) { RemoveDuplicateName(bundleInfo.reqPermissions); } if (!bundleInfo.defPermissions.empty()) { RemoveDuplicateName(bundleInfo.defPermissions); } InnerBundleUserInfo innerBundleUserInfo; if (!GetInnerBundleUserInfo(userId, innerBundleUserInfo)) { APP_LOGE("not find userId %{public}d when get applicationInfo", userId); return; } uint32_t tokenId = innerBundleUserInfo.accessTokenId; std::string deviceId = baseApplicationInfo_->deviceId; if (appIndex != 0) { // clone app const std::map<std::string, InnerBundleCloneInfo> &mpCloneInfos = innerBundleUserInfo.cloneInfos; std::string appIndexKey = InnerBundleUserInfo::AppIndexToKey(appIndex); if (mpCloneInfos.find(appIndexKey) == mpCloneInfos.end()) { LOG_E(BMS_TAG_QUERY, "can not find userId %{public}d, appIndex %{public}d when get applicationInfo", userId, appIndex); return; } const InnerBundleCloneInfo &cloneInfo = mpCloneInfos.at(appIndexKey); tokenId = cloneInfo.accessTokenId; } if (!BundlePermissionMgr::GetRequestPermissionStates(bundleInfo, tokenId, deviceId)) { APP_LOGE("get request permission state failed"); } bundleInfo.reqPermissionDetails = GetAllRequestPermissions(); } void InnerBundleInfo::GetModuleWithHashValue( int32_t flags, const std::string &modulePackage, HapModuleInfo &hapModuleInfo) const { if (!(static_cast<uint32_t>(flags) & GET_BUNDLE_WITH_HASH_VALUE)) { return; } auto it = innerModuleInfos_.find(modulePackage); if (it == innerModuleInfos_.end()) { APP_LOGE("not find module %{public}s", modulePackage.c_str()); return; } hapModuleInfo.hashValue = it->second.hashValue; } void InnerBundleInfo::ProcessBundleWithHapModuleInfoFlag( int32_t flags, BundleInfo &bundleInfo, int32_t userId, int32_t appIndex) const { if ((static_cast<uint32_t>(flags) & static_cast<uint32_t>(GetBundleInfoFlag::GET_BUNDLE_INFO_WITH_HAP_MODULE)) != static_cast<uint32_t>(GetBundleInfoFlag::GET_BUNDLE_INFO_WITH_HAP_MODULE)) { bundleInfo.hapModuleInfos.clear(); return; } for (const auto &info : innerModuleInfos_) { auto hapmoduleinfo = FindHapModuleInfo(info.second.modulePackage, userId, appIndex); if (hapmoduleinfo) { HapModuleInfo hapModuleInfo = *hapmoduleinfo; auto it = innerModuleInfos_.find(info.second.modulePackage); if (it == innerModuleInfos_.end()) { APP_LOGE("not find module %{public}s", info.second.modulePackage.c_str()); } else { hapModuleInfo.hashValue = it->second.hashValue; } if (hapModuleInfo.hapPath.empty()) { hapModuleInfo.moduleSourceDir = info.second.modulePath; } if ((static_cast<uint32_t>(flags) & static_cast<uint32_t>(GetBundleInfoFlag::GET_BUNDLE_INFO_WITH_METADATA)) != static_cast<uint32_t>(GetBundleInfoFlag::GET_BUNDLE_INFO_WITH_METADATA)) { hapModuleInfo.metadata.clear(); } GetBundleWithAbilitiesV9(flags, hapModuleInfo, userId, appIndex); GetBundleWithExtensionAbilitiesV9(flags, hapModuleInfo, appIndex); bundleInfo.hapModuleInfos.emplace_back(hapModuleInfo); } } } void InnerBundleInfo::GetBundleWithAbilitiesV9( int32_t flags, HapModuleInfo &hapModuleInfo, int32_t userId, int32_t appIndex) const { hapModuleInfo.abilityInfos.clear(); if ((static_cast<uint32_t>(flags) & static_cast<uint32_t>(GetBundleInfoFlag::GET_BUNDLE_INFO_WITH_ABILITY)) != static_cast<uint32_t>(GetBundleInfoFlag::GET_BUNDLE_INFO_WITH_ABILITY)) { return; } APP_LOGD("Get bundleInfo with abilities"); for (auto &ability : baseAbilityInfos_) { if ((ability.second.moduleName != hapModuleInfo.moduleName) || (ability.second.name == ServiceConstants::APP_DETAIL_ABILITY)) { continue; } bool isEnabled = IsAbilityEnabled(ability.second, userId, appIndex); if (!(static_cast<uint32_t>(flags) & static_cast<uint32_t>(GetBundleInfoFlag::GET_BUNDLE_INFO_WITH_DISABLE)) && !isEnabled) { APP_LOGW_NOFUNC("ability:%{public}s disabled,", ability.second.name.c_str()); continue; } AbilityInfo abilityInfo = ability.second; abilityInfo.enabled = isEnabled; abilityInfo.appIndex = appIndex; if ((static_cast<uint32_t>(flags) & static_cast<uint32_t>(GetBundleInfoFlag::GET_BUNDLE_INFO_WITH_METADATA)) != static_cast<uint32_t>(GetBundleInfoFlag::GET_BUNDLE_INFO_WITH_METADATA)) { abilityInfo.metaData.customizeData.clear(); abilityInfo.metadata.clear(); } if ((static_cast<uint32_t>(flags) & static_cast<uint32_t>(GetBundleInfoFlag::GET_BUNDLE_INFO_WITH_SKILL)) != static_cast<uint32_t>(GetBundleInfoFlag::GET_BUNDLE_INFO_WITH_SKILL)) { abilityInfo.skills.clear(); } hapModuleInfo.abilityInfos.emplace_back(abilityInfo); } } void InnerBundleInfo::GetBundleWithExtensionAbilitiesV9( int32_t flags, HapModuleInfo &hapModuleInfo, int32_t appIndex) const { hapModuleInfo.extensionInfos.clear(); if ((static_cast<uint32_t>(flags) & static_cast<uint32_t>(GetBundleInfoFlag::GET_BUNDLE_INFO_WITH_EXTENSION_ABILITY)) != static_cast<uint32_t>(GetBundleInfoFlag::GET_BUNDLE_INFO_WITH_EXTENSION_ABILITY)) { return; } APP_LOGD("Get bundleInfo with extensionAbilities"); for (const auto &extensionInfo : baseExtensionInfos_) { if (extensionInfo.second.moduleName != hapModuleInfo.moduleName || !extensionInfo.second.enabled) { continue; } ExtensionAbilityInfo info = extensionInfo.second; info.appIndex = appIndex; if ((static_cast<uint32_t>(flags) & static_cast<uint32_t>(GetBundleInfoFlag::GET_BUNDLE_INFO_WITH_METADATA)) != static_cast<uint32_t>(GetBundleInfoFlag::GET_BUNDLE_INFO_WITH_METADATA)) { info.metadata.clear(); } if ((static_cast<uint32_t>(flags) & static_cast<uint32_t>(GetBundleInfoFlag::GET_BUNDLE_INFO_WITH_SKILL)) != static_cast<uint32_t>(GetBundleInfoFlag::GET_BUNDLE_INFO_WITH_SKILL)) { info.skills.clear(); } hapModuleInfo.extensionInfos.emplace_back(info); } } void InnerBundleInfo::GetBundleWithAbilities( int32_t flags, BundleInfo &bundleInfo, int32_t appIndex, int32_t userId) const { APP_LOGD("bundleName:%{public}s userid:%{public}d", bundleInfo.name.c_str(), userId); if (static_cast<uint32_t>(flags) & GET_BUNDLE_WITH_ABILITIES) { for (auto &ability : baseAbilityInfos_) { if (ability.second.name == ServiceConstants::APP_DETAIL_ABILITY) { continue; } bool isEnabled = IsAbilityEnabled(ability.second, userId); if (!(static_cast<uint32_t>(flags) & GET_ABILITY_INFO_WITH_DISABLE) && !isEnabled) { APP_LOGW_NOFUNC("ability:%{public}s disabled,", ability.second.name.c_str()); continue; } AbilityInfo abilityInfo = ability.second; abilityInfo.enabled = isEnabled; if ((static_cast<uint32_t>(flags) & GET_BUNDLE_WITH_SKILL) != GET_BUNDLE_WITH_SKILL) { abilityInfo.skills.clear(); } abilityInfo.appIndex = appIndex; bundleInfo.abilityInfos.emplace_back(abilityInfo); } } } void InnerBundleInfo::GetBundleWithExtension( int32_t flags, BundleInfo &bundleInfo, int32_t appIndex, int32_t userId) const { APP_LOGD("get bundleInfo with extensionInfo begin"); if ((static_cast<uint32_t>(flags) & GET_BUNDLE_WITH_EXTENSION_INFO) == GET_BUNDLE_WITH_EXTENSION_INFO) { for (const auto &extensionInfo : baseExtensionInfos_) { if (!extensionInfo.second.enabled) { continue; } ExtensionAbilityInfo info = extensionInfo.second; if ((static_cast<uint32_t>(flags) & GET_BUNDLE_WITH_SKILL) != GET_BUNDLE_WITH_SKILL) { info.skills.clear(); } info.appIndex = appIndex; bundleInfo.extensionInfos.emplace_back(info); } } APP_LOGD("get bundleInfo with extensionInfo end"); } bool InnerBundleInfo::CheckSpecialMetaData(const std::string &metaData) const { if (isNewVersion_) { for (const auto &moduleInfo : innerModuleInfos_) { for (const auto &data : moduleInfo.second.metadata) { if (metaData == data.name) { return true; } } } return false; } // old version for (const auto &moduleInfo : innerModuleInfos_) { for (const auto &data : moduleInfo.second.metaData.customizeData) { if (metaData == data.name) { return true; } } } return false; } void InnerBundleInfo::GetFormsInfoByModule(const std::string &moduleName, std::vector<FormInfo> &formInfos) const { for (const auto &data : formInfos_) { for (auto &form : data.second) { if (form.moduleName == moduleName) { formInfos.emplace_back(form); } } } } void InnerBundleInfo::GetFormsInfoByApp(std::vector<FormInfo> &formInfos) const { for (const auto &data : formInfos_) { std::copy(data.second.begin(), data.second.end(), std::back_inserter(formInfos)); } } void InnerBundleInfo::GetShortcutInfos(std::vector<ShortcutInfo> &shortcutInfos) const { for (const auto &shortcut : shortcutInfos_) { shortcutInfos.emplace_back(shortcut.second); } } void InnerBundleInfo::GetCommonEvents(const std::string &eventKey, std::vector<CommonEventInfo> &commonEvents) const { CommonEventInfo item; for (const auto &commonEvent : commonEvents_) { for (const auto &event : commonEvent.second.events) { if (event == eventKey) { item = commonEvent.second; item.uid = GetUid(GetUserId()); commonEvents.emplace_back(item); break; } } } } std::optional<InnerModuleInfo> InnerBundleInfo::GetInnerModuleInfoByModuleName(const std::string &moduleName) const { for (const auto &innerModuleInfo : innerModuleInfos_) { APP_LOGD("info.moduleName = %{public}s, moduleName= %{public}s", innerModuleInfo.second.moduleName.c_str(), moduleName.c_str()); if (innerModuleInfo.second.moduleName == moduleName) { return innerModuleInfo.second; } } return std::nullopt; } std::optional<std::vector<HnpPackage>> InnerBundleInfo::GetInnerModuleInfoHnpInfo(const std::string &moduleName) const { for (const auto &innerModuleInfo : innerModuleInfos_) { if (!(innerModuleInfo.second.hnpPackages.empty())) { if (innerModuleInfo.second.moduleName == moduleName) { return innerModuleInfo.second.hnpPackages; } } } return std::nullopt; } std::string InnerBundleInfo::GetInnerModuleInfoHnpPath(const std::string &moduleName) const { for (const auto &innerModuleInfo : innerModuleInfos_) { if (!(innerModuleInfo.second.hnpPackages.empty())) { if (innerModuleInfo.second.moduleName == moduleName) { return innerModuleInfo.second.moduleHnpsPath; } } } return ""; } void InnerBundleInfo::GetModuleNames(std::vector<std::string> &moduleNames) const { for (const auto &innerModuleInfo : innerModuleInfos_) { moduleNames.emplace_back(innerModuleInfo.second.moduleName); } } void InnerBundleInfo::ResetBundleState(int32_t userId) { if (userId == Constants::ALL_USERID) { for (auto& innerBundleUserInfo : innerBundleUserInfos_) { innerBundleUserInfo.second.bundleUserInfo.Reset(); } return; } auto& key = NameAndUserIdToKey(GetBundleName(), userId); if (innerBundleUserInfos_.find(key) == innerBundleUserInfos_.end()) { APP_LOGD("no this user %{public}s", key.c_str()); return; } innerBundleUserInfos_.at(key).bundleUserInfo.Reset(); } void InnerBundleInfo::RemoveInnerBundleUserInfo(int32_t userId) { auto& key = NameAndUserIdToKey(GetBundleName(), userId); auto infoItem = innerBundleUserInfos_.find(key); if (infoItem == innerBundleUserInfos_.end()) { return; } auto result = innerBundleUserInfos_.erase(key); if (result == 0) { APP_LOGE("remove userId:%{public}d key:%{public}s info failed", userId, key.c_str()); } for (auto &innerModuleInfo : innerModuleInfos_) { DeleteModuleRemovable(innerModuleInfo.second.moduleName, userId); } } void InnerBundleInfo::AddInnerBundleUserInfo( const InnerBundleUserInfo& innerBundleUserInfo) { auto& key = NameAndUserIdToKey( GetBundleName(), innerBundleUserInfo.bundleUserInfo.userId); auto infoItem = innerBundleUserInfos_.find(key); if (infoItem == innerBundleUserInfos_.end()) { innerBundleUserInfos_.emplace(key, innerBundleUserInfo); return; } innerBundleUserInfos_[key] = innerBundleUserInfo; } bool InnerBundleInfo::GetInnerBundleUserInfo( int32_t userId, InnerBundleUserInfo& innerBundleUserInfo) const { if (userId == ServiceConstants::NOT_EXIST_USERID) { return true; } if (userId == Constants::ALL_USERID) { if (innerBundleUserInfos_.empty()) { return false; } innerBundleUserInfo = innerBundleUserInfos_.begin()->second; return true; } auto& key = NameAndUserIdToKey(GetBundleName(), userId); auto infoItem = innerBundleUserInfos_.find(key); if (infoItem == innerBundleUserInfos_.end()) { return false; } innerBundleUserInfo = infoItem->second; return true; } bool InnerBundleInfo::HasInnerBundleUserInfo(int32_t userId) const { if (userId == Constants::ALL_USERID || userId == Constants::ANY_USERID) { return !innerBundleUserInfos_.empty(); } auto& key = NameAndUserIdToKey(GetBundleName(), userId); auto infoItem = innerBundleUserInfos_.find(key); return infoItem != innerBundleUserInfos_.end(); } void InnerBundleInfo::SetBundleInstallTime(const int64_t time, int32_t userId) { auto& key = NameAndUserIdToKey(GetBundleName(), userId); auto infoItem = innerBundleUserInfos_.find(key); if (infoItem == innerBundleUserInfos_.end()) { return; } infoItem->second.installTime = time; infoItem->second.updateTime = time; } void InnerBundleInfo::SetAccessTokenId(uint32_t accessToken, const int32_t userId) { auto& key = NameAndUserIdToKey(GetBundleName(), userId); auto infoItem = innerBundleUserInfos_.find(key); if (infoItem == innerBundleUserInfos_.end()) { return; } infoItem->second.accessTokenId = accessToken; } void InnerBundleInfo::SetAccessTokenIdEx( const Security::AccessToken::AccessTokenIDEx accessTokenIdEx, const int32_t userId) { auto& key = NameAndUserIdToKey(GetBundleName(), userId); auto infoItem = innerBundleUserInfos_.find(key); if (infoItem == innerBundleUserInfos_.end()) { return; } infoItem->second.accessTokenId = accessTokenIdEx.tokenIdExStruct.tokenID; infoItem->second.accessTokenIdEx = accessTokenIdEx.tokenIDEx; } void InnerBundleInfo::SetAccessTokenIdExWithAppIndex( const Security::AccessToken::AccessTokenIDEx accessTokenIdEx, const int32_t userId, const int32_t appIndex) { auto& key = NameAndUserIdToKey(GetBundleName(), userId); auto infoItem = innerBundleUserInfos_.find(key); if (infoItem == innerBundleUserInfos_.end()) { return; } auto& userInfo = infoItem->second; std::map<std::string, InnerBundleCloneInfo> &cloneInfos = userInfo.cloneInfos; auto cloneKey = InnerBundleUserInfo::AppIndexToKey(appIndex); auto cloneItem = cloneInfos.find(cloneKey); if (cloneItem == cloneInfos.end()) { return; } cloneItem->second.accessTokenId = accessTokenIdEx.tokenIdExStruct.tokenID; cloneItem->second.accessTokenIdEx = accessTokenIdEx.tokenIDEx; } void InnerBundleInfo::SetkeyId(const int32_t userId, const std::string &keyId) { if (keyId.empty()) { APP_LOGE("SetkeyId failed, keyId is empty"); return; } auto& key = NameAndUserIdToKey(GetBundleName(), userId); auto infoItem = innerBundleUserInfos_.find(key); if (infoItem == innerBundleUserInfos_.end()) { APP_LOGE("SetkeyId failed, not find userInfo for userId %{public}d", userId); return; } infoItem->second.keyId = keyId; } void InnerBundleInfo::SetBundleUpdateTime(const int64_t time, int32_t userId) { auto& key = NameAndUserIdToKey(GetBundleName(), userId); auto infoItem = innerBundleUserInfos_.find(key); if (infoItem == innerBundleUserInfos_.end()) { return; } infoItem->second.updateTime = time; } bool InnerBundleInfo::IsAbilityEnabled(const AbilityInfo &abilityInfo, int32_t userId, int32_t appIndex) const { APP_LOGD("IsAbilityEnabled bundleName:%{public}s, userId:%{public}d", abilityInfo.bundleName.c_str(), userId); if (userId == ServiceConstants::NOT_EXIST_USERID) { return true; } auto& key = NameAndUserIdToKey(abilityInfo.bundleName, userId); auto infoItem = innerBundleUserInfos_.find(key); if (infoItem == innerBundleUserInfos_.end()) { APP_LOGD("innerBundleUserInfos find key:%{public}s, error", key.c_str()); return false; } if (appIndex == 0) { auto disabledAbilities = infoItem->second.bundleUserInfo.disabledAbilities; if (std::find(disabledAbilities.begin(), disabledAbilities.end(), abilityInfo.name) != disabledAbilities.end()) { return false; } else { return true; } } const std::map<std::string, InnerBundleCloneInfo> &mpCloneInfos = infoItem->second.cloneInfos; std::string appIndexKey = InnerBundleUserInfo::AppIndexToKey(appIndex); if (mpCloneInfos.find(appIndexKey) == mpCloneInfos.end()) { return false; } auto disabledAbilities = mpCloneInfos.at(appIndexKey).disabledAbilities; if (std::find(disabledAbilities.begin(), disabledAbilities.end(), abilityInfo.name) != disabledAbilities.end()) { return false; } else { return true; } } void InnerBundleInfo::SetOverlayModuleState(const std::string &moduleName, int32_t state, int32_t userId) { APP_LOGD("start to set overlay moduleInfo state of module %{public}s", moduleName.c_str()); if (overlayType_ == NON_OVERLAY_TYPE) { APP_LOGW("no overlay module"); return; } for (auto &innerUserInfo : innerBundleUserInfos_) { if (innerUserInfo.second.bundleUserInfo.userId != userId) { continue; } auto &overlayStates = innerUserInfo.second.bundleUserInfo.overlayModulesState; bool isSetSucc = std::any_of(overlayStates.begin(), overlayStates.end(), [&moduleName, &state](auto &item) { if (item.find(moduleName + Constants::FILE_UNDERLINE) != std::string::npos) { item = moduleName + Constants::FILE_UNDERLINE + std::to_string(state); return true; } return false; }); if (!isSetSucc) { APP_LOGD("no overlay module state info under user %{public}d", userId); overlayStates.emplace_back(moduleName + Constants::FILE_UNDERLINE + std::to_string(state)); } } } void InnerBundleInfo::SetOverlayModuleState(const std::string &moduleName, int32_t state) { APP_LOGD("start to set overlay moduleInfo state of module %{public}s", moduleName.c_str()); if (overlayType_ == NON_OVERLAY_TYPE) { APP_LOGW("no overlay module"); return; } for (auto &innerUserInfo : innerBundleUserInfos_) { auto &overlayStates = innerUserInfo.second.bundleUserInfo.overlayModulesState; bool isSetSucc = std::any_of(overlayStates.begin(), overlayStates.end(), [&moduleName, &state](auto &item) { if (item.find(moduleName + Constants::FILE_UNDERLINE) != std::string::npos) { item = moduleName + Constants::FILE_UNDERLINE + std::to_string(state); return true; } return false; }); if (!isSetSucc) { overlayStates.emplace_back(moduleName + Constants::FILE_UNDERLINE + std::to_string(state)); } } } bool InnerBundleInfo::GetOverlayModuleState(const std::string &moduleName, int32_t userId, int32_t &state) const { APP_LOGD("start to get overlay state of moduleName:%{public}s, userId:%{public}d", moduleName.c_str(), userId); if (userId == ServiceConstants::NOT_EXIST_USERID) { APP_LOGE("invalid userId %{public}d", userId); return false; } auto& key = NameAndUserIdToKey(GetBundleName(), userId); auto infoItem = innerBundleUserInfos_.find(key); if (infoItem == innerBundleUserInfos_.end()) { APP_LOGE("no userInfo under userId %{public}d", userId); return false; } auto overlayModulesState = infoItem->second.bundleUserInfo.overlayModulesState; if (overlayModulesState.empty()) { APP_LOGE("no overlay module installed under userId %{public}d", userId); return false; } for (const auto &item : overlayModulesState) { auto pos = item.find(moduleName + Constants::FILE_UNDERLINE); if (pos == std::string::npos) { continue; } return OHOS::StrToInt(item.substr(moduleName.length() + 1), state); } APP_LOGE("no overlay module installed under userId %{public}d", userId); return false; } void InnerBundleInfo::ClearOverlayModuleStates(const std::string &moduleName) { // delete overlay module state for (auto &innerUserInfo : innerBundleUserInfos_) { auto &overlayStates = innerUserInfo.second.bundleUserInfo.overlayModulesState; auto iter = std::find_if(overlayStates.begin(), overlayStates.end(), [&moduleName](const auto &item) { if (item.find(moduleName + Constants::FILE_UNDERLINE) != std::string::npos) { return true; } return false; }); if (iter != overlayStates.end()) { overlayStates.erase(iter); } } } ErrCode InnerBundleInfo::IsAbilityEnabledV9(const AbilityInfo &abilityInfo, int32_t userId, bool &isEnable, int32_t appIndex) const { APP_LOGD("IsAbilityEnabled bundleName:%{public}s, userId:%{public}d", abilityInfo.bundleName.c_str(), userId); if (userId == ServiceConstants::NOT_EXIST_USERID) { isEnable = true; return ERR_OK; } auto& key = NameAndUserIdToKey(abilityInfo.bundleName, userId); auto infoItem = innerBundleUserInfos_.find(key); if (infoItem == innerBundleUserInfos_.end()) { APP_LOGE("innerBundleUserInfos find key:%{public}s, error", key.c_str()); return ERR_BUNDLE_MANAGER_BUNDLE_NOT_EXIST; } if (appIndex == 0) { auto disabledAbilities = infoItem->second.bundleUserInfo.disabledAbilities; if (std::find(disabledAbilities.begin(), disabledAbilities.end(), abilityInfo.name) != disabledAbilities.end()) { isEnable = false; } else { isEnable = true; } return ERR_OK; } const std::map<std::string, InnerBundleCloneInfo> &mpCloneInfos = infoItem->second.cloneInfos; std::string appIndexKey = InnerBundleUserInfo::AppIndexToKey(appIndex); if (mpCloneInfos.find(appIndexKey) == mpCloneInfos.end()) { return ERR_APPEXECFWK_CLONE_QUERY_NO_CLONE_APP; } auto disabledAbilities = mpCloneInfos.at(appIndexKey).disabledAbilities; if (std::find(disabledAbilities.begin(), disabledAbilities.end(), abilityInfo.name) != disabledAbilities.end()) { isEnable = false; } else { isEnable = true; } return ERR_OK; } ErrCode InnerBundleInfo::SetAbilityEnabled( const std::string &moduleName, const std::string &abilityName, bool isEnabled, int32_t userId) { APP_LOGD("SetAbilityEnabled : %{public}s, %{public}s, %{public}d", moduleName.c_str(), abilityName.c_str(), userId); for (const auto &ability : baseAbilityInfos_) { if ((ability.second.name == abilityName) && (moduleName.empty() || (ability.second.moduleName == moduleName))) { auto &key = NameAndUserIdToKey(GetBundleName(), userId); auto infoItem = innerBundleUserInfos_.find(key); if (infoItem == innerBundleUserInfos_.end()) { APP_LOGE("SetAbilityEnabled find innerBundleUserInfo failed"); return ERR_BUNDLE_MANAGER_BUNDLE_NOT_EXIST; } auto iter = std::find(infoItem->second.bundleUserInfo.disabledAbilities.begin(), infoItem->second.bundleUserInfo.disabledAbilities.end(), abilityName); if (iter != infoItem->second.bundleUserInfo.disabledAbilities.end()) { if (isEnabled) { infoItem->second.bundleUserInfo.disabledAbilities.erase(iter); } } else { if (!isEnabled) { infoItem->second.bundleUserInfo.disabledAbilities.push_back(abilityName); } } return ERR_OK; } } APP_LOGE("SetAbilityEnabled find abilityInfo failed"); return ERR_BUNDLE_MANAGER_ABILITY_NOT_EXIST; } ErrCode InnerBundleInfo::SetCloneAbilityEnabled(const std::string &moduleName, const std::string &abilityName, bool isEnabled, int32_t userId, int32_t appIndex) { APP_LOGD("SetAbilityEnabled : %{public}s, %{public}s, %{public}d for appIndex %{public}d", moduleName.c_str(), abilityName.c_str(), userId, appIndex); for (const auto &ability : baseAbilityInfos_) { if ((ability.second.name == abilityName) && (moduleName.empty() || (ability.second.moduleName == moduleName))) { auto &key = NameAndUserIdToKey(GetBundleName(), userId); auto infoItem = innerBundleUserInfos_.find(key); if (infoItem == innerBundleUserInfos_.end()) { APP_LOGE("SetAbilityEnabled find innerBundleUserInfo failed"); return ERR_BUNDLE_MANAGER_INVALID_USER_ID; } auto cloneIter = infoItem->second.cloneInfos.find(std::to_string(appIndex)); if (cloneIter == infoItem->second.cloneInfos.end()) { APP_LOGW("appIndex %{public}d invalid", appIndex); return ERR_APPEXECFWK_SANDBOX_INSTALL_INVALID_APP_INDEX; } auto iter = std::find(cloneIter->second.disabledAbilities.begin(), cloneIter->second.disabledAbilities.end(), abilityName); if (iter != cloneIter->second.disabledAbilities.end() && isEnabled) { cloneIter->second.disabledAbilities.erase(iter); } if (iter == cloneIter->second.disabledAbilities.end() && !isEnabled) { cloneIter->second.disabledAbilities.push_back(abilityName); } return ERR_OK; } } APP_LOGW("SetCloneAbilityEnabled find abilityInfo failed"); return ERR_BUNDLE_MANAGER_ABILITY_NOT_EXIST; } void InnerBundleInfo::RemoveDuplicateName(std::vector<std::string> &name) const { std::sort(name.begin(), name.end()); auto iter = std::unique(name.begin(), name.end()); name.erase(iter, name.end()); } void InnerBundleInfo::SetInnerModuleNeedDelete(const std::string &moduleName, const bool needDelete) { if (innerModuleInfos_.find(moduleName) == innerModuleInfos_.end()) { APP_LOGE("innerBundleInfo does not contain the module module %{public}s", moduleName.c_str()); return; } innerModuleInfos_.at(moduleName).needDelete = needDelete; } bool InnerBundleInfo::GetInnerModuleNeedDelete(const std::string &moduleName) { if (innerModuleInfos_.find(moduleName) == innerModuleInfos_.end()) { APP_LOGE("innerBundleInfo does not contain the module %{public}s", moduleName.c_str()); return true; } return innerModuleInfos_.at(moduleName).needDelete; } std::vector<DefinePermission> InnerBundleInfo::GetAllDefinePermissions() const { std::vector<DefinePermission> definePermissions; for (const auto &info : innerModuleInfos_) { if (info.second.needDelete) { continue; } std::transform(info.second.definePermissions.begin(), info.second.definePermissions.end(), std::back_inserter(definePermissions), [](const auto &p) { return p; }); } if (!definePermissions.empty()) { std::sort(definePermissions.begin(), definePermissions.end(), [](DefinePermission defPermA, DefinePermission defPermB) { return defPermA.name < defPermB.name; }); auto iter = std::unique(definePermissions.begin(), definePermissions.end(), [](DefinePermission defPermA, DefinePermission defPermB) { return defPermA.name == defPermB.name; }); definePermissions.erase(iter, definePermissions.end()); } return definePermissions; } std::vector<RequestPermission> InnerBundleInfo::GetAllRequestPermissions() const { std::unordered_map<std::string, std::string> moduleNameMap; std::vector<RequestPermission> requestPermissions; for (const auto &info : innerModuleInfos_) { if (info.second.needDelete) { continue; } for (auto item : info.second.requestPermissions) { item.moduleName = info.second.moduleName; requestPermissions.push_back(item); if (moduleNameMap.find(item.moduleName) == moduleNameMap.end()) { moduleNameMap[item.moduleName] = info.second.distro.moduleType; } } } if (!requestPermissions.empty()) { InnerProcessRequestPermissions(moduleNameMap, requestPermissions); } return requestPermissions; } void InnerBundleInfo::InnerProcessRequestPermissions( const std::unordered_map<std::string, std::string> &moduleNameMap, std::vector<RequestPermission> &requestPermissions) const { std::sort(requestPermissions.begin(), requestPermissions.end(), [&moduleNameMap](RequestPermission reqPermA, RequestPermission reqPermB) { if (reqPermA.name == reqPermB.name) { if ((reqPermA.reasonId == 0) || (reqPermB.reasonId == 0)) { return reqPermA.reasonId > reqPermB.reasonId; } auto moduleTypeA = moduleNameMap.find(reqPermA.moduleName); if (moduleTypeA == moduleNameMap.end()) { return reqPermA.reasonId > reqPermB.reasonId; } auto moduleTypeB = moduleNameMap.find(reqPermB.moduleName); if (moduleTypeB == moduleNameMap.end()) { return reqPermA.reasonId > reqPermB.reasonId; } if ((moduleTypeA->second == Profile::MODULE_TYPE_ENTRY) && ((moduleTypeB->second == Profile::MODULE_TYPE_ENTRY))) { return reqPermA.reasonId > reqPermB.reasonId; } else if (moduleTypeA->second == Profile::MODULE_TYPE_ENTRY) { return true; } else if (moduleTypeB->second == Profile::MODULE_TYPE_ENTRY) { return false; } if ((moduleTypeA->second == Profile::MODULE_TYPE_FEATURE) && ((moduleTypeB->second == Profile::MODULE_TYPE_FEATURE))) { return reqPermA.reasonId > reqPermB.reasonId; } else if (moduleTypeA->second == Profile::MODULE_TYPE_FEATURE) { return true; } else if (moduleTypeB->second == Profile::MODULE_TYPE_FEATURE) { return false; } return reqPermA.reasonId > reqPermB.reasonId; } return reqPermA.name < reqPermB.name; }); auto iter = std::unique(requestPermissions.begin(), requestPermissions.end(), [](RequestPermission reqPermA, RequestPermission reqPermB) { return reqPermA.name == reqPermB.name; }); requestPermissions.erase(iter, requestPermissions.end()); } ErrCode InnerBundleInfo::SetApplicationEnabled(bool enabled, const std::string &caller, int32_t userId) { auto& key = NameAndUserIdToKey(GetBundleName(), userId); auto infoItem = innerBundleUserInfos_.find(key); if (infoItem == innerBundleUserInfos_.end()) { APP_LOGE("SetApplicationEnabled not find:%{public}s bundleUserInfo in userId: %{public}d", GetBundleName().c_str(), userId); return ERR_BUNDLE_MANAGER_BUNDLE_NOT_EXIST; } infoItem->second.bundleUserInfo.enabled = enabled; if (!caller.empty()) { infoItem->second.bundleUserInfo.setEnabledCaller = caller; } return ERR_OK; } ErrCode InnerBundleInfo::SetCloneApplicationEnabled(bool enabled, int32_t appIndex, const std::string &caller, int32_t userId) { auto& key = NameAndUserIdToKey(GetBundleName(), userId); auto infoItem = innerBundleUserInfos_.find(key); if (infoItem == innerBundleUserInfos_.end()) { APP_LOGE_NOFUNC("SetCloneApplicationEnabled not find:%{public}s bundleUserInfo in userId:%{public}d", GetBundleName().c_str(), userId); return ERR_BUNDLE_MANAGER_INVALID_USER_ID; } auto iter = infoItem->second.cloneInfos.find(std::to_string(appIndex)); if (iter == infoItem->second.cloneInfos.end()) { APP_LOGE_NOFUNC("SetCloneApplicationEnabled not find:%{public}d appIndex in userId:%{public}d", appIndex, userId); return ERR_APPEXECFWK_SANDBOX_INSTALL_INVALID_APP_INDEX; } iter->second.enabled = enabled; iter->second.setEnabledCaller = caller; return ERR_OK; } const std::string InnerBundleInfo::GetCurModuleName() const { if (innerModuleInfos_.find(currentPackage_) != innerModuleInfos_.end()) { return innerModuleInfos_.at(currentPackage_).moduleName; } return Constants::EMPTY_STRING; } bool InnerBundleInfo::IsBundleRemovable() const { if (IsPreInstallApp()) { APP_LOGE("PreInstallApp should not be cleaned"); return false; } for (const auto &innerModuleInfo : innerModuleInfos_) { if (!innerModuleInfo.second.installationFree) { return false; } for (const auto &stateIter : innerModuleInfo.second.isRemovable) { if (!stateIter.second) { return false; } } } return true; } int64_t InnerBundleInfo::GetLastInstallationTime() const { int64_t installTime = 0; for (const auto &innerBundleUserInfo : innerBundleUserInfos_) { installTime = innerBundleUserInfo.second.updateTime > installTime ? innerBundleUserInfo.second.updateTime : installTime; } return installTime; } bool InnerBundleInfo::GetRemovableModules(std::vector<std::string> &moduleToDelete) const { for (const auto &innerModuleInfo : innerModuleInfos_) { if (!innerModuleInfo.second.installationFree) { continue; } bool canDelete = true; for (const auto &stateIter : innerModuleInfo.second.isRemovable) { if (!stateIter.second) { canDelete = false; break; } } if (canDelete) { moduleToDelete.emplace_back(innerModuleInfo.second.moduleName); } } return !moduleToDelete.empty(); } bool InnerBundleInfo::GetFreeInstallModules(std::vector<std::string> &freeInstallModule) const { for (const auto &innerModuleInfo : innerModuleInfos_) { if (!innerModuleInfo.second.installationFree) { continue; } freeInstallModule.emplace_back(innerModuleInfo.second.moduleName); } return !freeInstallModule.empty(); } bool InnerBundleInfo::IsUserExistModule(const std::string &moduleName, int32_t userId) const { APP_LOGD("userId:%{public}d moduleName:%{public}s", userId, moduleName.c_str()); auto modInfoItem = GetInnerModuleInfoByModuleName(moduleName); if (!modInfoItem) { APP_LOGE("get InnerModuleInfo by moduleName(%{public}s) failed", moduleName.c_str()); return false; } auto item = modInfoItem->isRemovable.find(std::to_string(userId)); if (item == modInfoItem->isRemovable.end()) { APP_LOGE("userId:%{public}d not moduleName:%{public}s", userId, moduleName.c_str()); return false; } APP_LOGD("userId:%{public}d exist moduleName:%{public}s", userId, moduleName.c_str()); return true; } ErrCode InnerBundleInfo::IsModuleRemovable( const std::string &moduleName, int32_t userId, bool &isRemovable) const { APP_LOGD("userId:%{public}d moduleName:%{public}s", userId, moduleName.c_str()); auto modInfoItem = GetInnerModuleInfoByModuleName(moduleName); if (!modInfoItem) { APP_LOGE("get InnerModuleInfo by moduleName(%{public}s) failed", moduleName.c_str()); return ERR_BUNDLE_MANAGER_MODULE_NOT_EXIST; } auto item = modInfoItem->isRemovable.find(std::to_string(userId)); if (item == modInfoItem->isRemovable.end()) { APP_LOGW("userId:%{public}d not moduleName:%{public}s", userId, moduleName.c_str()); isRemovable = false; return ERR_OK; } isRemovable = item->second; APP_LOGD("userId:%{public}d, moduleName:%{public}s, isRemovable:%{public}d,", userId, moduleName.c_str(), isRemovable); return ERR_OK; } bool InnerBundleInfo::AddModuleRemovableInfo( InnerModuleInfo &info, const std::string &stringUserId, bool isEnable) const { auto item = info.isRemovable.find(stringUserId); if (item == info.isRemovable.end()) { auto result = info.isRemovable.try_emplace(stringUserId, isEnable); if (!result.second) { APP_LOGE("add userId:%{public}s isRemovable:%{public}d failed", stringUserId.c_str(), isEnable); return false; } APP_LOGD("add userId:%{public}s isRemovable:%{public}d into map", stringUserId.c_str(), isEnable); return true; } item->second = isEnable; APP_LOGD("set userId:%{public}s isEnable:%{public}d ok", stringUserId.c_str(), isEnable); return true; } bool InnerBundleInfo::SetModuleRemovable(const std::string &moduleName, bool isEnable, int32_t userId) { std::string stringUserId = std::to_string(userId); APP_LOGD("userId:%{public}d moduleName:%{public}s isEnable:%{public}d", userId, moduleName.c_str(), isEnable); for (auto &innerModuleInfo : innerModuleInfos_) { if (innerModuleInfo.second.moduleName == moduleName) { return AddModuleRemovableInfo(innerModuleInfo.second, stringUserId, isEnable); } } return false; } void InnerBundleInfo::DeleteModuleRemovableInfo(InnerModuleInfo &info, const std::string &stringUserId) { auto item = info.isRemovable.find(stringUserId); if (item == info.isRemovable.end()) { return; } info.isRemovable.erase(stringUserId); } void InnerBundleInfo::DeleteModuleRemovable(const std::string &moduleName, int32_t userId) { std::string stringUserId = std::to_string(userId); APP_LOGD("userId:%{public}d moduleName:%{public}s", userId, moduleName.c_str()); for (auto &innerModuleInfo : innerModuleInfos_) { if (innerModuleInfo.second.moduleName == moduleName) { DeleteModuleRemovableInfo(innerModuleInfo.second, stringUserId); return; } } } ErrCode InnerBundleInfo::SetModuleUpgradeFlag(std::string moduleName, int32_t upgradeFlag) { APP_LOGD("moduleName= %{public}s, upgradeFlag = %{public}d", moduleName.c_str(), upgradeFlag); for (auto &innerModuleInfo : innerModuleInfos_) { if (innerModuleInfo.second.moduleName == moduleName) { innerModuleInfo.second.upgradeFlag = upgradeFlag; return ERR_OK; } } return ERR_BUNDLE_MANAGER_MODULE_NOT_EXIST; } int32_t InnerBundleInfo::GetModuleUpgradeFlag(std::string moduleName) const { auto moduleInfo = GetInnerModuleInfoByModuleName(moduleName); if (!moduleInfo) { APP_LOGE("get InnerModuleInfo by moduleName(%{public}s) failed", moduleName.c_str()); return UpgradeFlag::NOT_UPGRADE; } APP_LOGD("innerModuleInfo.upgradeFlag : %{public}d", moduleInfo->upgradeFlag); return moduleInfo->upgradeFlag; } int32_t InnerBundleInfo::GetResponseUserId(int32_t requestUserId) const { if (innerBundleUserInfos_.empty()) { APP_LOGD("user map is empty"); return Constants::INVALID_USERID; } if (requestUserId == Constants::ANY_USERID) { return innerBundleUserInfos_.begin()->second.bundleUserInfo.userId; } if (HasInnerBundleUserInfo(requestUserId)) { return requestUserId; } if (requestUserId < Constants::START_USERID) { APP_LOGD("requestUserId(%{public}d) less than start userId", requestUserId); return Constants::INVALID_USERID; } int32_t responseUserId = Constants::INVALID_USERID; for (const auto &innerBundleUserInfo : innerBundleUserInfos_) { if (innerBundleUserInfo.second.bundleUserInfo.userId < Constants::START_USERID) { responseUserId = innerBundleUserInfo.second.bundleUserInfo.userId; break; } } APP_LOGD("requestUserId(%{public}d) and responseUserId(%{public}d)", requestUserId, responseUserId); return responseUserId; } bool InnerBundleInfo::GetDependentModuleNames(const std::string &moduleName, std::vector<std::string> &dependentModuleNames) const { for (auto iter = innerModuleInfos_.begin(); iter != innerModuleInfos_.end(); ++iter) { if (iter->second.moduleName == moduleName) { for (const auto &dependency : iter->second.dependencies) { dependentModuleNames.push_back(dependency.moduleName); } return true; } } APP_LOGE("GetDependentModuleNames not find module %{public}s", moduleName.c_str()); return false; } bool InnerBundleInfo::GetAllDependentModuleNames(const std::string &moduleName, std::vector<std::string> &dependentModuleNames) const { if (!GetDependentModuleNames(moduleName, dependentModuleNames)) { return false; } std::deque<std::string> moduleDeque; std::copy(dependentModuleNames.begin(), dependentModuleNames.end(), std::back_inserter(moduleDeque)); dependentModuleNames.clear(); while (!moduleDeque.empty()) { std::string name = moduleDeque.front(); moduleDeque.pop_front(); if (std::find(dependentModuleNames.begin(), dependentModuleNames.end(), name) == dependentModuleNames.end()) { dependentModuleNames.push_back(name); std::vector<std::string> tempModuleNames; if (GetDependentModuleNames(name, tempModuleNames)) { std::copy(tempModuleNames.begin(), tempModuleNames.end(), std::back_inserter(moduleDeque)); } } } return true; } std::string InnerBundleInfo::GetMainAbility() const { AbilityInfo abilityInfo; GetMainAbilityInfo(abilityInfo); return abilityInfo.name; } void InnerBundleInfo::GetMainAbilityInfo(AbilityInfo &abilityInfo) const { for (const auto& item : innerModuleInfos_) { const std::string& key = item.second.entryAbilityKey; if (!key.empty() && (baseAbilityInfos_.count(key) != 0)) { abilityInfo = baseAbilityInfos_.at(key); if (item.second.isEntry) { return; } } } } bool InnerBundleInfo::HasEntry() const { return std::any_of(innerModuleInfos_.begin(), innerModuleInfos_.end(), [](const auto &item) { return item.second.isEntry; }); } bool InnerBundleInfo::IsHsp() const { if (!innerModuleInfos_.empty()) { return std::all_of(innerModuleInfos_.begin(), innerModuleInfos_.end(), [](const auto &item) { return item.second.distro.moduleType == Profile::MODULE_TYPE_SHARED; }); } return false; } void InnerBundleInfo::SetAppDistributionType(const std::string &appDistributionType) { baseApplicationInfo_->appDistributionType = appDistributionType; } std::string InnerBundleInfo::GetAppDistributionType() const { return baseApplicationInfo_->appDistributionType; } void InnerBundleInfo::SetAppProvisionType(const std::string &appProvisionType) { baseApplicationInfo_->appProvisionType = appProvisionType; } std::string InnerBundleInfo::GetAppProvisionType() const { return baseApplicationInfo_->appProvisionType; } void InnerBundleInfo::SetAppCrowdtestDeadline(int64_t crowdtestDeadline) { baseApplicationInfo_->crowdtestDeadline = crowdtestDeadline; } int64_t InnerBundleInfo::GetAppCrowdtestDeadline() const { return baseApplicationInfo_->crowdtestDeadline; } std::vector<std::string> InnerBundleInfo::GetDistroModuleName() const { std::vector<std::string> moduleVec; for (const auto &item : innerModuleInfos_) { moduleVec.push_back(item.second.moduleName); } return moduleVec; } std::string InnerBundleInfo::GetModuleNameByPackage(const std::string &packageName) const { auto it = innerModuleInfos_.find(packageName); if (it == innerModuleInfos_.end()) { return Constants::EMPTY_STRING; } return it->second.moduleName; } std::string InnerBundleInfo::GetModuleTypeByPackage(const std::string &packageName) const { auto it = innerModuleInfos_.find(packageName); if (it == innerModuleInfos_.end()) { return Constants::EMPTY_STRING; } return it->second.distro.moduleType; } AppQuickFix InnerBundleInfo::GetAppQuickFix() const { return baseApplicationInfo_->appQuickFix; } void InnerBundleInfo::SetAppQuickFix(const AppQuickFix &appQuickFix) { baseApplicationInfo_->appQuickFix = appQuickFix; if (appQuickFix.deployedAppqfInfo.hqfInfos.empty() && appQuickFix.deployingAppqfInfo.hqfInfos.empty()) { baseApplicationInfo_->appQuickFix.bundleName = Constants::EMPTY_STRING; baseApplicationInfo_->appQuickFix.versionCode = 0; baseApplicationInfo_->appQuickFix.versionName = Constants::EMPTY_STRING; } SetQuickFixHqfInfos(appQuickFix.deployedAppqfInfo.hqfInfos); } std::vector<HqfInfo> InnerBundleInfo::GetQuickFixHqfInfos() const { return hqfInfos_; } void InnerBundleInfo::SetQuickFixHqfInfos(const std::vector<HqfInfo> &hqfInfos) { hqfInfos_ = hqfInfos; } bool InnerBundleInfo::FetchNativeSoAttrs( const std::string &requestPackage, std::string &cpuAbi, std::string &nativeLibraryPath) const { auto moduleIter = innerModuleInfos_.find(requestPackage); if (moduleIter == innerModuleInfos_.end()) { APP_LOGE("requestPackage(%{public}s) not exist", requestPackage.c_str()); return false; } auto &moduleInfo = moduleIter->second; if (!moduleInfo.compressNativeLibs) { cpuAbi = moduleInfo.cpuAbi; nativeLibraryPath = moduleInfo.nativeLibraryPath; return !nativeLibraryPath.empty(); } if (moduleInfo.isLibIsolated) { cpuAbi = moduleInfo.cpuAbi; nativeLibraryPath = moduleInfo.nativeLibraryPath; } else { cpuAbi = baseApplicationInfo_->cpuAbi; nativeLibraryPath = baseApplicationInfo_->nativeLibraryPath; } return !nativeLibraryPath.empty(); } bool InnerBundleInfo::IsLibIsolated(const std::string &moduleName) const { auto moduleInfo = GetInnerModuleInfoByModuleName(moduleName); if (!moduleInfo) { APP_LOGE("Get moduleInfo(%{public}s) failed", moduleName.c_str()); return false; } return moduleInfo->isLibIsolated; } std::vector<std::string> InnerBundleInfo::GetDeviceType(const std::string &packageName) const { auto it = innerModuleInfos_.find(packageName); if (it == innerModuleInfos_.end()) { APP_LOGW("%{public}s not existed", packageName.c_str()); return std::vector<std::string>(); } return innerModuleInfos_.at(packageName).deviceTypes; } void InnerBundleInfo::AddApplyQuickFixFrequency() { ++applyQuickFixFrequency_; } int32_t InnerBundleInfo::GetApplyQuickFixFrequency() const { return applyQuickFixFrequency_; } void InnerBundleInfo::ResetApplyQuickFixFrequency() { applyQuickFixFrequency_ = 0; } std::vector<uint32_t> InnerBundleInfo::GetAllHspVersion() const { std::vector<uint32_t> versionCodes; for (const auto &[moduleName, modules] : innerSharedModuleInfos_) { for (const auto &module : modules) { if (std::find(versionCodes.begin(), versionCodes.end(), module.versionCode) == versionCodes.end()) { versionCodes.emplace_back(module.versionCode); } } } return versionCodes; } void InnerBundleInfo::DeleteHspModuleByVersion(int32_t versionCode) { for (auto modulesIt = innerSharedModuleInfos_.begin(); modulesIt != innerSharedModuleInfos_.end();) { if (modulesIt->second.size() == SINGLE_HSP_VERSION && modulesIt->second.front().versionCode == static_cast<uint32_t>(versionCode)) { modulesIt = innerSharedModuleInfos_.erase(modulesIt); } else { modulesIt->second.erase( std::remove_if(modulesIt->second.begin(), modulesIt->second.end(), [versionCode] (InnerModuleInfo &module) { return module.versionCode == static_cast<uint32_t>(versionCode); })); ++modulesIt; } } } ErrCode InnerBundleInfo::GetProxyDataInfos( const std::string &moduleName, std::vector<ProxyData> &proxyDatas) const { if (moduleName == Constants::EMPTY_STRING) { GetAllProxyDataInfos(proxyDatas); return ERR_OK; } auto moduleIt = std::find_if(innerModuleInfos_.begin(), innerModuleInfos_.end(), [&moduleName](const auto &info) { return info.second.moduleName == moduleName; }); if (moduleIt != innerModuleInfos_.end()) { proxyDatas.insert( proxyDatas.end(), moduleIt->second.proxyDatas.begin(), moduleIt->second.proxyDatas.end()); } else { APP_LOGE("moduleName %{public}s not found", moduleName.c_str()); return ERR_BUNDLE_MANAGER_MODULE_NOT_EXIST; } if (proxyDatas.empty()) { APP_LOGW("proxyDatas is empty"); } return ERR_OK; } void InnerBundleInfo::GetAllProxyDataInfos(std::vector<ProxyData> &proxyDatas) const { for (const auto &innerModuleInfo : innerModuleInfos_) { proxyDatas.insert( proxyDatas.end(), innerModuleInfo.second.proxyDatas.begin(), innerModuleInfo.second.proxyDatas.end()); } } IsolationMode InnerBundleInfo::GetIsolationMode(const std::string &isolationMode) const { auto isolationModeRes = ISOLATION_MODE_MAP.find(isolationMode); if (isolationModeRes != ISOLATION_MODE_MAP.end()) { return isolationModeRes->second; } else { return IsolationMode::NONISOLATION_FIRST; } } void InnerBundleInfo::SetModuleHapPath(const std::string &hapPath) { if (innerModuleInfos_.count(currentPackage_) == 1) { innerModuleInfos_.at(currentPackage_).hapPath = hapPath; for (auto &abilityInfo : baseAbilityInfos_) { abilityInfo.second.hapPath = hapPath; } for (auto &extensionInfo : baseExtensionInfos_) { extensionInfo.second.hapPath = hapPath; } if (!innerModuleInfos_.at(currentPackage_).compressNativeLibs && !innerModuleInfos_.at(currentPackage_).nativeLibraryPath.empty()) { auto pos = hapPath.rfind(ServiceConstants::PATH_SEPARATOR); if (pos != std::string::npos) { innerModuleInfos_.at(currentPackage_).nativeLibraryPath = hapPath.substr(pos + 1, hapPath.length() - pos - 1) + NATIVE_LIBRARY_PATH_SYMBOL + innerModuleInfos_.at(currentPackage_).nativeLibraryPath; return; } innerModuleInfos_.at(currentPackage_).nativeLibraryPath = hapPath + NATIVE_LIBRARY_PATH_SYMBOL + innerModuleInfos_.at(currentPackage_).nativeLibraryPath; } } } bool InnerBundleInfo::IsCompressNativeLibs(const std::string &moduleName) const { auto moduleInfo = GetInnerModuleInfoByModuleName(moduleName); if (!moduleInfo) { APP_LOGE("Get moduleInfo(%{public}s) failed", moduleName.c_str()); return true; // compressNativeLibs default true } return moduleInfo->compressNativeLibs; } void InnerBundleInfo::SetNativeLibraryFileNames(const std::string &moduleName, const std::vector<std::string> &fileNames) { if (innerModuleInfos_.find(moduleName) == innerModuleInfos_.end()) { APP_LOGE("innerBundleInfo not contain the module: %{public}s", moduleName.c_str()); return; } innerModuleInfos_.at(moduleName).nativeLibraryFileNames = fileNames; } void InnerBundleInfo::UpdateSharedModuleInfo() { auto sharedModuleInfoIter = innerSharedModuleInfos_.find(currentPackage_); auto moduleInfoIter = innerModuleInfos_.find(currentPackage_); if ((sharedModuleInfoIter == innerSharedModuleInfos_.end()) || (moduleInfoIter == innerModuleInfos_.end())) { APP_LOGE("The shared module(%{public}s) infomation not exist", currentPackage_.c_str()); return; } auto &innerModuleInfoVector = sharedModuleInfoIter->second; for (auto iter = innerModuleInfoVector.begin(); iter != innerModuleInfoVector.end(); ++iter) { if (iter->versionCode == moduleInfoIter->second.versionCode) { iter->hapPath = moduleInfoIter->second.hapPath; iter->compressNativeLibs = moduleInfoIter->second.compressNativeLibs; iter->cpuAbi = moduleInfoIter->second.cpuAbi; iter->nativeLibraryPath = moduleInfoIter->second.nativeLibraryPath; iter->nativeLibraryFileNames = moduleInfoIter->second.nativeLibraryFileNames; return; } } } ErrCode InnerBundleInfo::SetExtName( const std::string &moduleName, const std::string &abilityName, const std::string extName) { auto abilityInfoPair = baseAbilityInfos_.find(abilityName); if (abilityInfoPair == baseAbilityInfos_.end()) { APP_LOGE("ability %{public}s not exists", abilityName.c_str()); return ERR_BUNDLE_MANAGER_ABILITY_NOT_EXIST; } if (moduleName != abilityInfoPair->second.moduleName) { APP_LOGE("module %{public}s not exists", moduleName.c_str()); return ERR_BUNDLE_MANAGER_MODULE_NOT_EXIST; } auto &supportExtNames = abilityInfoPair->second.supportExtNames; bool duplicated = std::any_of(supportExtNames.begin(), supportExtNames.end(), [&extName](const auto &name) { return extName == name; }); if (duplicated) { APP_LOGW("extName %{public}s already exist in ability %{public}s", extName.c_str(), abilityName.c_str()); return ERR_BUNDLE_MANAGER_DUPLICATED_EXT_OR_TYPE; } supportExtNames.emplace_back(extName); return ERR_OK; } ErrCode InnerBundleInfo::SetMimeType( const std::string &moduleName, const std::string &abilityName, const std::string mimeType) { auto abilityInfoPair = baseAbilityInfos_.find(abilityName); if (abilityInfoPair == baseAbilityInfos_.end()) { APP_LOGE("ability %{public}s not exists", abilityName.c_str()); return ERR_BUNDLE_MANAGER_ABILITY_NOT_EXIST; } if (moduleName != abilityInfoPair->second.moduleName) { APP_LOGE("module %{public}s not exists", moduleName.c_str()); return ERR_BUNDLE_MANAGER_MODULE_NOT_EXIST; } auto &supportMimeTypes = abilityInfoPair->second.supportMimeTypes; bool duplicated = std::any_of(supportMimeTypes.begin(), supportMimeTypes.end(), [&mimeType](const auto &type) { return mimeType == type; }); if (duplicated) { APP_LOGW("MIME type %{public}s already exist in ability %{public}s", mimeType.c_str(), abilityName.c_str()); return ERR_BUNDLE_MANAGER_DUPLICATED_EXT_OR_TYPE; } abilityInfoPair->second.supportMimeTypes.emplace_back(mimeType); return ERR_OK; } ErrCode InnerBundleInfo::DelExtName( const std::string &moduleName, const std::string &abilityName, const std::string extName) { auto abilityInfoPair = baseAbilityInfos_.find(abilityName); if (abilityInfoPair == baseAbilityInfos_.end()) { APP_LOGE("ability %{public}s not exists", abilityName.c_str()); return ERR_BUNDLE_MANAGER_ABILITY_NOT_EXIST; } if (moduleName != abilityInfoPair->second.moduleName) { APP_LOGE("module %{public}s not exists", moduleName.c_str()); return ERR_BUNDLE_MANAGER_MODULE_NOT_EXIST; } auto &supportExtNames = abilityInfoPair->second.supportExtNames; supportExtNames.erase(std::remove(supportExtNames.begin(), supportExtNames.end(), extName), supportExtNames.end()); return ERR_OK; } ErrCode InnerBundleInfo::DelMimeType( const std::string &moduleName, const std::string &abilityName, const std::string mimeType) { auto abilityInfoPair = baseAbilityInfos_.find(abilityName); if (abilityInfoPair == baseAbilityInfos_.end()) { APP_LOGE("ability %{public}s not exists", abilityName.c_str()); return ERR_BUNDLE_MANAGER_ABILITY_NOT_EXIST; } if (moduleName != abilityInfoPair->second.moduleName) { APP_LOGE("module %{public}s not exists", moduleName.c_str()); return ERR_BUNDLE_MANAGER_MODULE_NOT_EXIST; } auto &supportMimeTypes = abilityInfoPair->second.supportMimeTypes; supportMimeTypes.erase( std::remove(supportMimeTypes.begin(), supportMimeTypes.end(), mimeType), supportMimeTypes.end()); return ERR_OK; } ErrCode InnerBundleInfo::GetAppServiceHspInfo(BundleInfo &bundleInfo) const { if (baseApplicationInfo_->bundleType != BundleType::APP_SERVICE_FWK) { APP_LOGW("%{public}s is not app service", GetBundleName().c_str()); return ERR_BUNDLE_MANAGER_BUNDLE_NOT_EXIST; } bundleInfo = *baseBundleInfo_; bundleInfo.applicationInfo = *baseApplicationInfo_; for (const auto &info : innerModuleInfos_) { if (info.second.distro.moduleType == Profile::MODULE_TYPE_SHARED) { auto hapmoduleinfo = FindHapModuleInfo(info.second.modulePackage, Constants::ALL_USERID); if (hapmoduleinfo) { HapModuleInfo hapModuleInfo = *hapmoduleinfo; hapModuleInfo.moduleSourceDir = hapModuleInfo.hapPath.empty() ? info.second.modulePath : hapModuleInfo.moduleSourceDir; bundleInfo.hapModuleInfos.emplace_back(hapModuleInfo); } } } if (bundleInfo.hapModuleInfos.empty()) { APP_LOGE("bundleName:%{public}s no hsp module info", baseApplicationInfo_->bundleName.c_str()); return ERR_BUNDLE_MANAGER_MODULE_NOT_EXIST; } return ERR_OK; } void InnerBundleInfo::UpdateIsCompressNativeLibs() { if (innerModuleInfos_.empty()) { baseApplicationInfo_->isCompressNativeLibs = true; return; } baseApplicationInfo_->isCompressNativeLibs = false; for (const auto &info : innerModuleInfos_) { baseApplicationInfo_->isCompressNativeLibs = (baseApplicationInfo_->isCompressNativeLibs || info.second.compressNativeLibs) ? true : false; } } void InnerBundleInfo::SetResourcesApply(const std::vector<int32_t> &resourcesApply) { baseApplicationInfo_->resourcesApply = resourcesApply; } void InnerBundleInfo::InnerProcessShortcut(const Shortcut &oldShortcut, ShortcutInfo &shortcutInfo) const { shortcutInfo.id = oldShortcut.shortcutId; shortcutInfo.icon = oldShortcut.icon; shortcutInfo.label = oldShortcut.label; shortcutInfo.iconId = oldShortcut.iconId; if (shortcutInfo.iconId == 0) { auto iter = oldShortcut.icon.find(PORT_SEPARATOR); if (iter != std::string::npos) { shortcutInfo.iconId = static_cast<uint32_t>(atoi(oldShortcut.icon.substr(iter + 1).c_str())); } } shortcutInfo.labelId = oldShortcut.labelId; if (shortcutInfo.labelId == 0) { auto iter = oldShortcut.label.find(PORT_SEPARATOR); if (iter != std::string::npos) { shortcutInfo.labelId = static_cast<uint32_t>(atoi(oldShortcut.label.substr(iter + 1).c_str())); } } for (const ShortcutWant &shortcutWant : oldShortcut.wants) { ShortcutIntent shortcutIntent; shortcutIntent.targetBundle = shortcutWant.bundleName; shortcutIntent.targetModule = shortcutWant.moduleName; shortcutIntent.targetClass = shortcutWant.abilityName; shortcutIntent.parameters = shortcutWant.parameters; shortcutInfo.intents.emplace_back(shortcutIntent); } } std::string InnerBundleInfo::GetEntryModuleName() const { for (const auto &item : innerModuleInfos_) { if (item.second.isEntry) { return item.second.modulePackage; } } return Constants::EMPTY_STRING; } void InnerBundleInfo::SetMoudleIsEncrpted(const std::string &packageName, bool isEncrypted) { auto it = innerModuleInfos_.find(packageName); if (it == innerModuleInfos_.end()) { return; } it->second.isEncrypted = isEncrypted; } bool InnerBundleInfo::IsEncryptedMoudle(const std::string &packageName) const { auto it = innerModuleInfos_.find(packageName); if (it == innerModuleInfos_.end()) { return false; } return it->second.isEncrypted; } void InnerBundleInfo::GetAllEncryptedModuleNames(std::vector<std::string> &moduleNames) const { for (const auto &info : innerModuleInfos_) { if (info.second.isEncrypted) { moduleNames.emplace_back(info.second.moduleName); } } } bool InnerBundleInfo::IsContainEncryptedModule() const { for (const auto &info : innerModuleInfos_) { if (info.second.isEncrypted) { return true; } } return false; } std::string InnerBundleInfo::GetAppIdentifier() const { return baseBundleInfo_->signatureInfo.appIdentifier; } void InnerBundleInfo::SetAppIdentifier(const std::string &appIdentifier) { baseBundleInfo_->signatureInfo.appIdentifier = appIdentifier; } void InnerBundleInfo::SetCertificate(const std::string &certificate) { baseBundleInfo_->signatureInfo.certificate = certificate; } std::string InnerBundleInfo::GetCertificate() const { return baseBundleInfo_->signatureInfo.certificate; } void InnerBundleInfo::UpdateDebug(bool debug, bool isEntry) { if (isEntry) { baseApplicationInfo_->debug = debug; } else if (!HasEntry() && debug) { baseApplicationInfo_->debug = debug; } } void InnerBundleInfo::AddOldAppId(const std::string &appId) { auto appIds = baseBundleInfo_->oldAppIds; if (std::find(appIds.begin(), appIds.end(), appId) == appIds.end()) { baseBundleInfo_->oldAppIds.emplace_back(appId); } } std::vector<std::string> InnerBundleInfo::GetOldAppIds() const { return baseBundleInfo_->oldAppIds; } std::vector<std::string> InnerBundleInfo::GetQuerySchemes() const { std::string entryModuleName = GetEntryModuleName(); auto it = innerModuleInfos_.find(entryModuleName); if (it == innerModuleInfos_.end()) { return std::vector<std::string>(); } std::vector<std::string> querySchemes = innerModuleInfos_.at(entryModuleName).querySchemes; for (size_t i = 0; i < querySchemes.size(); i++) { transform(querySchemes[i].begin(), querySchemes[i].end(), querySchemes[i].begin(), ::tolower); } return querySchemes; } void InnerBundleInfo::UpdateOdid(const std::string &developerId, const std::string &odid) { developerId_ = developerId; odid_ = odid; } void InnerBundleInfo::UpdateOdidByBundleInfo(const InnerBundleInfo &info) { std::string developerId; std::string odid; info.GetDeveloperidAndOdid(developerId, odid); developerId_ = developerId; odid_ = odid; } void InnerBundleInfo::GetDeveloperidAndOdid(std::string &developerId, std::string &odid) const { developerId = developerId_; odid = odid_; } void InnerBundleInfo::GetOdid(std::string &odid) const { odid = odid_; } void InnerBundleInfo::AddAllowedAcls(const std::vector<std::string> &allowedAcls) { for (const auto &acl : allowedAcls) { if (!acl.empty() && (std::find(allowedAcls_.begin(), allowedAcls_.end(), acl) == allowedAcls_.end())) { allowedAcls_.emplace_back(acl); } } } bool InnerBundleInfo::IsAsanEnabled() const { for (const auto &item : innerModuleInfos_) { if (item.second.asanEnabled) { return true; } } for (const auto &[moduleName, modules] : innerSharedModuleInfos_) { for (const auto &module : modules) { if (module.asanEnabled) { return true; } } } return false; } bool InnerBundleInfo::IsGwpAsanEnabled() const { for (const auto &item : innerModuleInfos_) { if (item.second.gwpAsanEnabled) { return true; } } for (const auto &[moduleName, modules] : innerSharedModuleInfos_) { for (const auto &module : modules) { if (module.gwpAsanEnabled) { return true; } } } return false; } bool InnerBundleInfo::IsTsanEnabled() const { for (const auto &item : innerModuleInfos_) { if (item.second.tsanEnabled) { return true; } } for (const auto &[moduleName, modules] : innerSharedModuleInfos_) { for (const auto &module : modules) { if (module.tsanEnabled) { return true; } } } return false; } bool InnerBundleInfo::IsHwasanEnabled() const { bool hwasanEnabled = false; for (const auto &item : innerModuleInfos_) { hwasanEnabled = static_cast<bool>(item.second.innerModuleInfoFlag & GetSanitizerFlag(GetInnerModuleInfoFlag::GET_INNER_MODULE_INFO_WITH_HWASANENABLED)); if (hwasanEnabled) { return true; } } for (const auto &[moduleName, modules] : innerSharedModuleInfos_) { for (const auto &module : modules) { hwasanEnabled = static_cast<bool>(module.innerModuleInfoFlag & GetSanitizerFlag(GetInnerModuleInfoFlag::GET_INNER_MODULE_INFO_WITH_HWASANENABLED)); if (hwasanEnabled) { return true; } } } return false; } bool InnerBundleInfo::GetUninstallState() const { return uninstallState_; } void InnerBundleInfo::SetUninstallState(const bool &uninstallState) { uninstallState_ = uninstallState; } bool InnerBundleInfo::IsNeedSendNotify() const { return isNeedSendNotify_; } void InnerBundleInfo::SetNeedSendNotify(const bool needStatus) { isNeedSendNotify_ = needStatus; } std::vector<std::string> InnerBundleInfo::GetAllExtensionDirsInSpecifiedModule(const std::string &moduleName) const { std::vector<std::string> dirVec; auto extensionInfoMap = GetInnerExtensionInfos(); for (auto item : extensionInfoMap) { if (item.second.moduleName != moduleName || !item.second.needCreateSandbox) { continue; } std::string dir = ServiceConstants::EXTENSION_DIR + item.second.moduleName + ServiceConstants::FILE_SEPARATOR_LINE + item.second.name + ServiceConstants::FILE_SEPARATOR_PLUS + item.second.bundleName; dirVec.emplace_back(dir); } return dirVec; } std::vector<std::string> InnerBundleInfo::GetAllExtensionDirs() const { std::vector<std::string> dirVec; auto extensionInfoMap = GetInnerExtensionInfos(); for (auto item : extensionInfoMap) { if (!item.second.needCreateSandbox) { continue; } // eg: +extension-entry-inputMethodExtAbility+com.example.myapplication std::string dir = ServiceConstants::EXTENSION_DIR + item.second.moduleName + ServiceConstants::FILE_SEPARATOR_LINE + item.second.name + ServiceConstants::FILE_SEPARATOR_PLUS + item.second.bundleName; dirVec.emplace_back(dir); } return dirVec; } void InnerBundleInfo::SetApplicationFlags(ApplicationInfoFlag flag) { uint32_t applicationFlags = static_cast<uint32_t>(baseApplicationInfo_->applicationFlags); uint32_t installSourceFlag = static_cast<uint32_t>(flag); baseApplicationInfo_->applicationFlags = static_cast<int32_t>((applicationFlags & PREINSTALL_SOURCE_CLEAN_MASK) | installSourceFlag); } void InnerBundleInfo::UpdateExtensionSandboxInfo(const std::vector<std::string> &typeList) { for (auto &extensionItem : baseExtensionInfos_) { extensionItem.second.needCreateSandbox = false; std::string typeName = extensionItem.second.extensionTypeName; auto it = std::find(typeList.begin(), typeList.end(), typeName); if (it != typeList.end()) { extensionItem.second.needCreateSandbox = true; } } } void InnerBundleInfo::UpdateExtensionDataGroupInfo( const std::string &key, const std::vector<std::string>& dataGroupIds) { auto it = baseExtensionInfos_.find(key); if (it == baseExtensionInfos_.end()) { APP_LOGW("UpdateExtensionDataGroupInfo not find key: %{public}s", key.c_str()); return; } it->second.validDataGroupIds = dataGroupIds; } void InnerBundleInfo::AddDataGroupInfo(const std::string &dataGroupId, const DataGroupInfo &info) { APP_LOGD("AddDataGroupInfo, dataGroupId: %{public}s, dataGroupInfo: %{public}s", dataGroupId.c_str(), info.ToString().c_str()); auto dataGroupInfosItem = dataGroupInfos_.find(dataGroupId); if (dataGroupInfosItem == dataGroupInfos_.end()) { APP_LOGD("AddDataGroupInfo add new dataGroupInfo for dataGroupId: %{public}s", dataGroupId.c_str()); dataGroupInfos_[dataGroupId] = std::vector<DataGroupInfo> { info }; return; } int32_t userId = info.userId; auto iter = std::find_if(std::begin(dataGroupInfos_[dataGroupId]), std::end(dataGroupInfos_[dataGroupId]), [userId](const DataGroupInfo &dataGroupinfo) { return dataGroupinfo.userId == userId; }); if (iter != std::end(dataGroupInfos_[dataGroupId])) { if ((iter->uid == info.uid) && (iter->uuid == info.uuid)) { return; } APP_LOGW("uid or uuid not same, dataGroupId: %{public}s", dataGroupId.c_str()); dataGroupInfos_[dataGroupId].erase(iter); } APP_LOGD("AddDataGroupInfo add new dataGroupInfo for user: %{public}d", info.userId); dataGroupInfos_[dataGroupId].emplace_back(info); } ErrCode InnerBundleInfo::AddCloneBundle(const InnerBundleCloneInfo &attr) { int32_t userId = attr.userId; int32_t appIndex = attr.appIndex; const std::string key = NameAndUserIdToKey(GetBundleName(), userId); if (innerBundleUserInfos_.find(key) == innerBundleUserInfos_.end()) { APP_LOGE("Add Clone Bundle Fail, userId: %{public}d not found in bundleName: %{public}s", userId, GetBundleName().c_str()); return ERR_APPEXECFWK_CLONE_INSTALL_USER_NOT_EXIST; } InnerBundleUserInfo &userInfo = innerBundleUserInfos_.find(key)->second; std::map<std::string, InnerBundleCloneInfo> &cloneInfos = userInfo.cloneInfos; if (appIndex < ServiceConstants::CLONE_APP_INDEX_MIN || appIndex > ServiceConstants::CLONE_APP_INDEX_MAX) { APP_LOGE("Add Clone Bundle Fail, appIndex: %{public}d not in valid range", appIndex); return ERR_APPEXECFWK_CLONE_INSTALL_INVALID_APP_INDEX; } std::string appIndexKey = InnerBundleUserInfo::AppIndexToKey(appIndex); if (cloneInfos.find(appIndexKey) != cloneInfos.end()) { APP_LOGE("Add Clone Bundle Fail, appIndex: %{public}d existed", appIndex); return ERR_APPEXECFWK_CLONE_INSTALL_APP_INDEX_EXISTED; } InnerBundleCloneInfo cloneInfo; cloneInfo.userId = userId; cloneInfo.appIndex = appIndex; // copy from user cloneInfo.enabled = userInfo.bundleUserInfo.enabled; cloneInfo.disabledAbilities = userInfo.bundleUserInfo.disabledAbilities; cloneInfo.accessTokenId = attr.accessTokenId; cloneInfo.accessTokenIdEx = attr.accessTokenIdEx; cloneInfo.uid = attr.uid; cloneInfo.gids = attr.gids; int64_t now = BundleUtil::GetCurrentTime(); cloneInfo.installTime = now; cloneInfos[appIndexKey] = cloneInfo; APP_LOGD("Add clone app userId: %{public}d appIndex: %{public}d in bundle: %{public}s", userId, appIndex, GetBundleName().c_str()); return ERR_OK; } ErrCode InnerBundleInfo::RemoveCloneBundle(const int32_t userId, const int32_t appIndex) { const std::string key = NameAndUserIdToKey(GetBundleName(), userId); if (innerBundleUserInfos_.find(key) == innerBundleUserInfos_.end()) { APP_LOGE("Remove Clone Bundle Fail, userId: %{public}d not found in bundleName: %{public}s", userId, GetBundleName().c_str()); return ERR_APPEXECFWK_CLONE_INSTALL_USER_NOT_EXIST; } InnerBundleUserInfo &userInfo = innerBundleUserInfos_.find(key)->second; std::map<std::string, InnerBundleCloneInfo> &cloneInfos = userInfo.cloneInfos; if (appIndex < ServiceConstants::CLONE_APP_INDEX_MIN || appIndex > ServiceConstants::CLONE_APP_INDEX_MAX) { APP_LOGE("Remove Clone Bundle Fail, appIndex: %{public}d not in valid range", appIndex); return ERR_APPEXECFWK_CLONE_INSTALL_INVALID_APP_INDEX; } std::string appIndexKey = InnerBundleUserInfo::AppIndexToKey(appIndex); if (cloneInfos.find(appIndexKey) == cloneInfos.end()) { APP_LOGD("appIndex: %{public}d not found", appIndex); return ERR_OK; } cloneInfos.erase(appIndexKey); APP_LOGD("Remove clone app userId: %{public}d appIndex: %{public}d in bundle: %{public}s", userId, appIndex, GetBundleName().c_str()); return ERR_OK; } ErrCode InnerBundleInfo::GetAvailableCloneAppIndex(const int32_t userId, int32_t &appIndex) { const std::string key = NameAndUserIdToKey(GetBundleName(), userId); if (innerBundleUserInfos_.find(key) == innerBundleUserInfos_.end()) { return ERR_APPEXECFWK_CLONE_INSTALL_USER_NOT_EXIST; } InnerBundleUserInfo &userInfo = innerBundleUserInfos_.find(key)->second; std::map<std::string, InnerBundleCloneInfo> &cloneInfos = userInfo.cloneInfos; int32_t candidateAppIndex = 1; while (cloneInfos.find(InnerBundleUserInfo::AppIndexToKey(candidateAppIndex)) != cloneInfos.end()) { candidateAppIndex++; } appIndex = candidateAppIndex; return ERR_OK; } ErrCode InnerBundleInfo::IsCloneAppIndexExisted(const int32_t userId, const int32_t appIndex, bool &res) { const std::string key = NameAndUserIdToKey(GetBundleName(), userId); if (innerBundleUserInfos_.find(key) == innerBundleUserInfos_.end()) { return ERR_APPEXECFWK_CLONE_INSTALL_USER_NOT_EXIST; } InnerBundleUserInfo &userInfo = innerBundleUserInfos_.find(key)->second; std::map<std::string, InnerBundleCloneInfo> &cloneInfos = userInfo.cloneInfos; res = cloneInfos.find(InnerBundleUserInfo::AppIndexToKey(appIndex)) != cloneInfos.end(); return ERR_OK; } bool InnerBundleInfo::GetApplicationInfoAdaptBundleClone( const InnerBundleUserInfo &innerBundleUserInfo, int32_t appIndex, ApplicationInfo &appInfo) const { if (appIndex == 0 || appIndex > Constants::INITIAL_SANDBOX_APP_INDEX) { if (appInfo.removable && !innerBundleUserInfo.isRemovable) { appInfo.removable = false; } appInfo.accessTokenId = innerBundleUserInfo.accessTokenId; appInfo.accessTokenIdEx = innerBundleUserInfo.accessTokenIdEx; appInfo.enabled = innerBundleUserInfo.bundleUserInfo.enabled; appInfo.uid = innerBundleUserInfo.uid; return true; } APP_LOGD("start appIndex: %{public}d", appIndex); auto iter = innerBundleUserInfo.cloneInfos.find(std::to_string(appIndex)); if (iter == innerBundleUserInfo.cloneInfos.end()) { APP_LOGE("appIndex %{public}d not exist", appIndex); return false; } appInfo.accessTokenId = iter->second.accessTokenId; appInfo.accessTokenIdEx = iter->second.accessTokenIdEx; appInfo.enabled = iter->second.enabled; appInfo.uid = iter->second.uid; appInfo.appIndex = iter->second.appIndex; return true; } bool InnerBundleInfo::GetBundleInfoAdaptBundleClone( const InnerBundleUserInfo &innerBundleUserInfo, int32_t appIndex, BundleInfo &bundleInfo) const { if (appIndex == 0 || appIndex > Constants::INITIAL_SANDBOX_APP_INDEX) { bundleInfo.uid = innerBundleUserInfo.uid; if (!innerBundleUserInfo.gids.empty()) { bundleInfo.gid = innerBundleUserInfo.gids[0]; } bundleInfo.installTime = innerBundleUserInfo.installTime; bundleInfo.updateTime = innerBundleUserInfo.updateTime; bundleInfo.appIndex = appIndex_; return true; } APP_LOGD("start appIndex: %{public}d", appIndex); auto iter = innerBundleUserInfo.cloneInfos.find(std::to_string(appIndex)); if (iter == innerBundleUserInfo.cloneInfos.end()) { APP_LOGE("appIndex %{public}d not exist", appIndex); return false; } bundleInfo.uid = iter->second.uid; bundleInfo.gid = iter->second.uid; // no gids, need add bundleInfo.installTime = iter->second.installTime; bundleInfo.updateTime = innerBundleUserInfo.updateTime; bundleInfo.appIndex = appIndex; return true; } ErrCode InnerBundleInfo::VerifyAndAckCloneAppIndex(int32_t userId, int32_t &appIndex) { auto multiAppModeData = this->baseApplicationInfo_->multiAppMode; if (multiAppModeData.multiAppModeType != MultiAppModeType::APP_CLONE) { APP_LOGE("bundleName:%{public}s is not clone app", GetBundleName().c_str()); return ERR_APPEXECFWK_CLONE_INSTALL_APP_NOT_SUPPORTED_MULTI_TYPE; } if (appIndex < 0) { APP_LOGE("appIndex:%{public}d not in valid range", appIndex); return ERR_APPEXECFWK_CLONE_INSTALL_INVALID_APP_INDEX; } if (appIndex == 0) { ErrCode availableRes = GetAvailableCloneAppIndex(userId, appIndex); if (availableRes != ERR_OK) { APP_LOGE("Get Available Clone AppIndex Fail for, errCode: %{public}d", availableRes); return availableRes; } } else { bool found = false; ErrCode isExistedRes = IsCloneAppIndexExisted(userId, appIndex, found); if (isExistedRes != ERR_OK) { return isExistedRes; } if (found) { APP_LOGE("AppIndex %{public}d existed in userId %{public}d", appIndex, userId); return ERR_APPEXECFWK_CLONE_INSTALL_APP_INDEX_EXISTED; } } int32_t maxCount = std::min(multiAppModeData.maxCount, ServiceConstants::CLONE_APP_INDEX_MAX); if (appIndex > maxCount) { APP_LOGE("AppIndex %{public}d exceed max limit %{public}d in userId: %{public}d", appIndex, maxCount, userId); return ERR_APPEXECFWK_CLONE_INSTALL_APP_INDEX_EXCEED_MAX_NUMBER; } return ERR_OK; } void InnerBundleInfo::UpdateMultiAppMode(const InnerBundleInfo &newInfo) { std::string moduleType = newInfo.GetModuleTypeByPackage(newInfo.GetCurrentModulePackage()); if (moduleType == Profile::MODULE_TYPE_ENTRY || moduleType == Profile::MODULE_TYPE_FEATURE) { baseApplicationInfo_->multiAppMode = newInfo.GetBaseApplicationInfo().multiAppMode; } } void InnerBundleInfo::UpdateReleaseType(const InnerBundleInfo &newInfo) { if (baseBundleInfo_->releaseType.empty() || baseApplicationInfo_->apiReleaseType.empty() || !newInfo.IsHsp()) { baseBundleInfo_->releaseType = newInfo.GetBaseBundleInfo().releaseType; baseApplicationInfo_->apiReleaseType = newInfo.GetBaseApplicationInfo().apiReleaseType; } } void InnerBundleInfo::AdaptMainLauncherResourceInfo(ApplicationInfo &applicationInfo) const { if (ServiceConstants::ALLOW_MULTI_ICON_BUNDLE.find(GetBundleName()) != ServiceConstants::ALLOW_MULTI_ICON_BUNDLE.end()) { return; } AbilityInfo mainAbilityInfo; GetMainAbilityInfo(mainAbilityInfo); if ((mainAbilityInfo.labelId != 0) && (mainAbilityInfo.iconId != 0)) { applicationInfo.labelId = mainAbilityInfo.labelId ; applicationInfo.labelResource.id = mainAbilityInfo.labelId; applicationInfo.labelResource.moduleName = mainAbilityInfo.moduleName; applicationInfo.labelResource.bundleName = mainAbilityInfo.bundleName; applicationInfo.iconId = mainAbilityInfo.iconId ; applicationInfo.iconResource.id = mainAbilityInfo.iconId; applicationInfo.iconResource.moduleName = mainAbilityInfo.moduleName; applicationInfo.iconResource.bundleName = mainAbilityInfo.bundleName; } } std::set<int32_t> InnerBundleInfo::GetCloneBundleAppIndexes() const { std::set<int32_t> appIndexes; for (const auto &innerBundleUserInfo : innerBundleUserInfos_) { for (const auto &cloneInfo : innerBundleUserInfo.second.cloneInfos) { appIndexes.insert(cloneInfo.second.appIndex); } } return appIndexes; } uint8_t InnerBundleInfo::GetSanitizerFlag(GetInnerModuleInfoFlag flag) { return 1 << (static_cast<uint8_t>(flag) - 1); } void InnerBundleInfo::PrintSetEnabledInfo(bool isEnabled, int32_t userId, int32_t appIndex, const std::string &bundleName, const std::string &caller) const { if (!isEnabled) { APP_LOGW_NOFUNC("-n %{public}s -u %{public}d -i %{public}d disabled caller is %{public}s", bundleName.c_str(), userId, appIndex, caller.c_str()); } } } // namespace AppExecFwk } // namespace OHOS