diff --git a/interfaces/inner_api/appexecfwk_core/include/bundle_framework_core_ipc_interface_code.h b/interfaces/inner_api/appexecfwk_core/include/bundle_framework_core_ipc_interface_code.h index be59b80bd80fd7deb315363bbc87c8bade0ed27f..1e941692e9ac20c14a9daa2bfe052d023af15bd5 100644 --- a/interfaces/inner_api/appexecfwk_core/include/bundle_framework_core_ipc_interface_code.h +++ b/interfaces/inner_api/appexecfwk_core/include/bundle_framework_core_ipc_interface_code.h @@ -228,6 +228,7 @@ enum class BundleMgrInterfaceCode : uint32_t { IS_DEBUGGABLE_APPLICATION = 202, GET_ALL_BUNDLE_NAMES = 203, GET_ABILITY_RESOURCE_INFO = 204, + CHECK_DEVICE_TYPE = 205, }; /* SAID: 401-85 Interface No.85 subservice also provides the following interfaces */ diff --git a/interfaces/inner_api/appexecfwk_core/include/bundlemgr/bundle_mgr_host.h b/interfaces/inner_api/appexecfwk_core/include/bundlemgr/bundle_mgr_host.h index 0b96b59aa8aa012f42ae474e8b14192ad26e79b8..11ed0e0d77bd1541222e54ff49d54f0f9b50f3c9 100644 --- a/interfaces/inner_api/appexecfwk_core/include/bundlemgr/bundle_mgr_host.h +++ b/interfaces/inner_api/appexecfwk_core/include/bundlemgr/bundle_mgr_host.h @@ -949,6 +949,7 @@ private: * @return Returns ERR_OK if called successfully; returns error code otherwise. */ ErrCode HandleGetAbilityResourceInfo(MessageParcel &data, MessageParcel &reply); + ErrCode HandleCheckDeviceType(MessageParcel &data, MessageParcel &reply); private: /** * @brief Write a parcelabe vector objects to the proxy node. diff --git a/interfaces/inner_api/appexecfwk_core/include/bundlemgr/bundle_mgr_interface.h b/interfaces/inner_api/appexecfwk_core/include/bundlemgr/bundle_mgr_interface.h index b2968a5969cc3623f0dd9da1155267db4123f0ef..0812f6391b9d33ec87fa27ad756cb06e7e17b204 100644 --- a/interfaces/inner_api/appexecfwk_core/include/bundlemgr/bundle_mgr_interface.h +++ b/interfaces/inner_api/appexecfwk_core/include/bundlemgr/bundle_mgr_interface.h @@ -1890,6 +1890,11 @@ public: { return ERR_APPEXECFWK_SERVICE_INTERNAL_ERROR; } + + virtual ErrCode CheckDeviceType(BundleInfo &bundleInfo) + { + return ERR_APPEXECFWK_SERVICE_INTERNAL_ERROR; + } }; #define WRITE_PARCEL(func) \ diff --git a/interfaces/inner_api/appexecfwk_core/include/bundlemgr/bundle_mgr_proxy.h b/interfaces/inner_api/appexecfwk_core/include/bundlemgr/bundle_mgr_proxy.h index 06878c3b918bcbf5468e803479261cada6b1c22a..795f76e1982967569394c31acdd7a581eb8a7b76 100644 --- a/interfaces/inner_api/appexecfwk_core/include/bundlemgr/bundle_mgr_proxy.h +++ b/interfaces/inner_api/appexecfwk_core/include/bundlemgr/bundle_mgr_proxy.h @@ -1279,6 +1279,8 @@ public: virtual ErrCode GetTestRunner(const std::string &bundleName, const std::string &moduleName, ModuleTestRunner &testRunner) override; + + virtual ErrCode CheckDeviceType(BundleInfo &bundleInfo) override; private: /** * @brief Send a command message from the proxy object. diff --git a/interfaces/inner_api/appexecfwk_core/src/bundlemgr/bundle_mgr_host.cpp b/interfaces/inner_api/appexecfwk_core/src/bundlemgr/bundle_mgr_host.cpp index bcbfc8bb7a11fa3519529be825afa06c78a69e4b..67d17844e1bab43abbd3b687906012d63834bde6 100644 --- a/interfaces/inner_api/appexecfwk_core/src/bundlemgr/bundle_mgr_host.cpp +++ b/interfaces/inner_api/appexecfwk_core/src/bundlemgr/bundle_mgr_host.cpp @@ -708,6 +708,9 @@ int BundleMgrHost::OnRemoteRequest(uint32_t code, MessageParcel &data, MessagePa case static_cast(BundleMgrInterfaceCode::GET_ABILITY_RESOURCE_INFO): errCode = HandleGetAbilityResourceInfo(data, reply); break; + case static_cast(BundleMgrInterfaceCode::CHECK_DEVICE_TYPE): + errCode = HandleCheckDeviceType(data, reply); + break; default : APP_LOGW("bundleMgr host receives unknown code %{public}u", code); return IPCObjectStub::OnRemoteRequest(code, data, reply, option); @@ -5030,5 +5033,17 @@ ErrCode BundleMgrHost::HandleGetAbilityResourceInfo(MessageParcel &data, Message } return ERR_OK; } + +ErrCode BundleMgrHost::HandleCheckDeviceType(MessageParcel &data, MessageParcel &reply) +{ + HITRACE_METER_NAME_EX(HITRACE_LEVEL_INFO, HITRACE_TAG_APP, __PRETTY_FUNCTION__, nullptr); + std::unique_ptr bundleInfo(data.ReadParcelable()); + auto ret = CheckDeviceType(*bundleInfo); + if (!reply.WriteInt32(ret)) { + APP_LOGE("WriteInt32 failed"); + return ERR_APPEXECFWK_PARCEL_ERROR; + } + return ERR_OK; +} } // namespace AppExecFwk } // namespace OHOS diff --git a/interfaces/inner_api/appexecfwk_core/src/bundlemgr/bundle_mgr_proxy.cpp b/interfaces/inner_api/appexecfwk_core/src/bundlemgr/bundle_mgr_proxy.cpp index f973df156964dd0d4ef2b69a78d8b135ecbb5c75..36f93d27577a18c5b0fd40c9e097018efb0d14a0 100644 --- a/interfaces/inner_api/appexecfwk_core/src/bundlemgr/bundle_mgr_proxy.cpp +++ b/interfaces/inner_api/appexecfwk_core/src/bundlemgr/bundle_mgr_proxy.cpp @@ -6587,5 +6587,25 @@ ErrCode BundleMgrProxy::GetTestRunner( } return ERR_OK; } + +ErrCode BundleMgrProxy::CheckDeviceType(BundleInfo &bundleInfo) +{ + HITRACE_METER_NAME_EX(HITRACE_LEVEL_INFO, HITRACE_TAG_APP, __PRETTY_FUNCTION__, nullptr); + MessageParcel data; + if (!data.WriteInterfaceToken(GetDescriptor())) { + APP_LOGE("CheckDeviceType write InterfaceToken fail"); + return ERR_APPEXECFWK_PARCEL_ERROR; + } + if (!data.WriteParcelable(&bundleInfo)) { + APP_LOGE("CheckDeviceType write info failed"); + return ERR_APPEXECFWK_PARCEL_ERROR; + } + + MessageParcel reply; + if (!SendTransactCmd(BundleMgrInterfaceCode::CHECK_DEVICE_TYPE, data, reply)) { + return false; + } + return reply.ReadInt32(); +} } // namespace AppExecFwk } // namespace OHOS diff --git a/services/bundlemgr/include/bundle_data_mgr.h b/services/bundlemgr/include/bundle_data_mgr.h index ca3a6466c7f6baf5466a32de34bbe7f7041b2bcc..e0dc8f192b1c30eca310a129756f2dff3e04a4e9 100644 --- a/services/bundlemgr/include/bundle_data_mgr.h +++ b/services/bundlemgr/include/bundle_data_mgr.h @@ -39,6 +39,7 @@ #endif #include "bundle_data_storage_interface.h" #include "bundle_event_callback_interface.h" +#include "bundle_install_checker.h" #include "bundle_promise.h" #include "bundle_sandbox_app_helper.h" #include "bundle_state_storage.h" @@ -1192,6 +1193,7 @@ public: void AddOtaNewInstallBundleName(const std::string &bundleName); std::set GetOtaNewInstallBundleNames(); void ClearOtaNewInstallBundleNames(); + ErrCode CheckDeviceType(BundleInfo &bundleInfo) const; private: /** @@ -1434,6 +1436,7 @@ private: std::shared_ptr uninstallDataMgr_; std::shared_ptr firstInstallDataMgr_; std::shared_ptr shortcutVisibleStorage_; + std::unique_ptr bundleInstallChecker_ = nullptr; // use vector because these functions using for IPC, the bundleName may duplicate std::vector> callbackList_; // common event callback diff --git a/services/bundlemgr/include/bundle_mgr_host_impl.h b/services/bundlemgr/include/bundle_mgr_host_impl.h index bf143ebfa942ef65beabb2c44d450bd1b9c88fe1..479c6503ec0372e804ea51540e04b03fe8105c1d 100644 --- a/services/bundlemgr/include/bundle_mgr_host_impl.h +++ b/services/bundlemgr/include/bundle_mgr_host_impl.h @@ -1197,6 +1197,7 @@ public: ModuleTestRunner &testRunner) override; virtual ErrCode GetAbilityResourceInfo(const std::string &fileType, std::vector &launcherAbilityResourceInfos) override; + virtual ErrCode CheckDeviceType(BundleInfo &bundleInfo) override; private: bool GetLabelByBundleName(const std::string &bundleName, int32_t userId, std::string &label); diff --git a/services/bundlemgr/src/bundle_data_mgr.cpp b/services/bundlemgr/src/bundle_data_mgr.cpp index 3018b073110524839ac11044ea3e649d31165a74..18ef8ef7057516dfc3d45dab2b857d02a3a1b4e7 100644 --- a/services/bundlemgr/src/bundle_data_mgr.cpp +++ b/services/bundlemgr/src/bundle_data_mgr.cpp @@ -156,6 +156,7 @@ BundleDataMgr::BundleDataMgr() routerStorage_ = std::make_shared(); uninstallDataMgr_ = std::make_shared(); firstInstallDataMgr_ = std::make_shared(); + bundleInstallChecker_ = std::make_unique(); baseAppUid_ = system::GetIntParameter("const.product.baseappid", Constants::BASE_APP_UID); if (baseAppUid_ < Constants::BASE_APP_UID || baseAppUid_ >= MAX_APP_UID) { baseAppUid_ = Constants::BASE_APP_UID; @@ -11460,5 +11461,29 @@ ErrCode BundleDataMgr::ImplicitQueryAbilityInfosWithDefault(const Want &want, in #endif return ERR_OK; } + +ErrCode BundleDataMgr::CheckDeviceType(BundleInfo &bundleInfo) const +{ + if (bundleInfo.hapModuleInfos.empty()) { + return ERR_BUNDLE_MANAGER_PARAM_ERROR; + } + std::unordered_map innerBundleInfos; + for (auto info : bundleInfo.hapModuleInfos) { + InnerModuleInfo innerModuleInfo; + innerModuleInfo.deviceTypes = info.deviceTypes; + innerModuleInfo.requiredDeviceFeatures = info.requiredDeviceFeatures; + std::map innerModuleInfos = { { bundleInfo.mainEntry, innerModuleInfo } }; + InnerBundleInfo innerBundleInfo; + innerBundleInfo.AddInnerModuleInfo(innerModuleInfos); + innerBundleInfo.SetCurrentModulePackage(bundleInfo.mainEntry); + innerBundleInfos.emplace(bundleInfo.name, innerBundleInfo); + } + + if (bundleInstallChecker_ == nullptr) { + APP_LOGW("bundleInstallChecker_ is null"); + return ERR_APPEXECFWK_NULL_PTR; + } + return bundleInstallChecker_->CheckDeviceType(innerBundleInfos); +} } // namespace AppExecFwk } // namespace OHOS diff --git a/services/bundlemgr/src/bundle_mgr_host_impl.cpp b/services/bundlemgr/src/bundle_mgr_host_impl.cpp index f841ca40e80f5da75840b24ebffb7ed95d6b32fc..8c4511fa24169d295151f63b7d3aafdfd0cbde00 100644 --- a/services/bundlemgr/src/bundle_mgr_host_impl.cpp +++ b/services/bundlemgr/src/bundle_mgr_host_impl.cpp @@ -6300,5 +6300,20 @@ ErrCode BundleMgrHostImpl::GetAbilityResourceInfo(const std::string &fileType, APP_LOGI("GetAbilityResourceInfo end, size: %{public}zu", launcherAbilityResourceInfos.size()); return ERR_OK; } + +ErrCode BundleMgrHostImpl::CheckDeviceType(BundleInfo &bundleInfo) +{ + if (!BundlePermissionMgr::IsSystemApp()) { + APP_LOGE("non-system app calling system api"); + return ERR_BUNDLE_MANAGER_SYSTEM_API_DENIED; + } + + auto dataMgr = GetDataMgrFromService(); + if (dataMgr == nullptr) { + APP_LOGE("dataMgr is nullptr"); + return ERR_APPEXECFWK_NULL_PTR; + } + return dataMgr->CheckDeviceType(bundleInfo); +} } // namespace AppExecFwk } // namespace OHOS diff --git a/services/bundlemgr/test/unittest/bms_bundle_kit_service_test/bms_bundle_data_mgr_test.cpp b/services/bundlemgr/test/unittest/bms_bundle_kit_service_test/bms_bundle_data_mgr_test.cpp index 7c69becbd4eede951194dc733a49e1b12dc677f3..231d7f76eb197452795f1fb75d0c1a122c9e98b9 100644 --- a/services/bundlemgr/test/unittest/bms_bundle_kit_service_test/bms_bundle_data_mgr_test.cpp +++ b/services/bundlemgr/test/unittest/bms_bundle_kit_service_test/bms_bundle_data_mgr_test.cpp @@ -4703,4 +4703,16 @@ HWTEST_F(BmsBundleDataMgrTest, GetTestRunner_0300, Function | MediumTest | Level MockUninstallBundle(BUNDLE_NAME_TEST); } + +/** + * @tc.number: CheckDeviceType_0100 + * @tc.name: CheckDeviceType_0100 + * @tc.desc: test CheckDeviceType + */ +HWTEST_F(BmsBundleDataMgrTest, CheckDeviceType_0100, Function | MediumTest | Level1) +{ + BundleInfo bundleInfo; + ErrCode ret = GetBundleDataMgr()->CheckDeviceType(bundleInfo); + EXPECT_EQ(ret, ERR_BUNDLE_MANAGER_PARAM_ERROR); +} } // OHOS diff --git a/services/bundlemgr/test/unittest/bms_bundle_kit_service_test/bms_bundle_kit_service_test.cpp b/services/bundlemgr/test/unittest/bms_bundle_kit_service_test/bms_bundle_kit_service_test.cpp index 636019918206e4d981169c44393bd68ae9ff2491..b4a0eb2f91842446ef2b4c401555a8dc5f8384ae 100644 --- a/services/bundlemgr/test/unittest/bms_bundle_kit_service_test/bms_bundle_kit_service_test.cpp +++ b/services/bundlemgr/test/unittest/bms_bundle_kit_service_test/bms_bundle_kit_service_test.cpp @@ -9284,4 +9284,31 @@ HWTEST_F(BmsBundleKitServiceTest, GetTestRunner_0100, Function | SmallTest | Lev EXPECT_EQ(ret, ERR_BUNDLE_MANAGER_PERMISSION_DENIED); MockUninstallBundle(BUNDLE_NAME_DEMO); } + +/** + * @tc.number: CheckDeviceType_0100 + * @tc.name: CheckDeviceType + * @tc.desc: test BundleMgrProxy interface CheckDeviceType. + */ +HWTEST_F(BmsBundleKitServiceTest, CheckDeviceType_0100, Function | SmallTest | Level1) +{ + sptr bundleMgrProxy = GetBundleMgrProxy(); + ASSERT_NE(bundleMgrProxy, nullptr); + BundleInfo bundleInfo; + ErrCode ret = bundleMgrProxy->CheckDeviceType(bundleInfo); + EXPECT_EQ(ret, ERR_OK); +} + +/** + * @tc.number: CheckDeviceType_0200 + * @tc.name: Test CheckDeviceType + * @tc.desc: 1.Test the CheckDeviceType by BundleMgrHostImpl + */ +HWTEST_F(BmsBundleKitServiceTest, CheckDeviceType_0200, Function | SmallTest | Level1) +{ + auto hostImpl = std::make_unique(); + BundleInfo bundleInfo; + ErrCode ret = hostImpl->CheckDeviceType(bundleInfo); + EXPECT_EQ(ret, ERR_BUNDLE_MANAGER_PARAM_ERROR); +} } diff --git a/services/bundlemgr/test/unittest/bms_bundle_manager_test/bms_bundle_manager_test_three.cpp b/services/bundlemgr/test/unittest/bms_bundle_manager_test/bms_bundle_manager_test_three.cpp index f6697dd2640e51ac76823b892aa63e1be3f720a9..a4e7d9375a2daaaed52cad9928bb3e7a78b4740c 100644 --- a/services/bundlemgr/test/unittest/bms_bundle_manager_test/bms_bundle_manager_test_three.cpp +++ b/services/bundlemgr/test/unittest/bms_bundle_manager_test/bms_bundle_manager_test_three.cpp @@ -2273,4 +2273,34 @@ HWTEST_F(BmsBundleManagerTest3, RemoveSameAbilityResourceInfo_0001, Function | S hostImpl->RemoveSameAbilityResourceInfo(launcherAbilityResourceInfos); EXPECT_EQ(launcherAbilityResourceInfos.size(), 2); } + +/** +* @tc.number: CheckDeviceType_0100 +* @tc.name: CheckDeviceType_0100 +* @tc.desc: test CheckDeviceType +*/ +HWTEST_F(BmsBundleManagerTest3, CheckDeviceType_0100, Function | MediumTest | Level1) +{ + BundleInfo bundleInfo; + HapModuleInfo hapModuleInfo; + bundleInfo.hapModuleInfos.emplace_back(hapModuleInfo); + ErrCode ret = GetBundleDataMgr()->CheckDeviceType(bundleInfo); + EXPECT_EQ(ret, ERR_OK); +} + +/** +* @tc.number: CheckDeviceType_0200 +* @tc.name: CheckDeviceType_0200 +* @tc.desc: test CheckDeviceType +*/ +HWTEST_F(BmsBundleManagerTest3, CheckDeviceType_0200, Function | MediumTest | Level1) +{ + BundleInfo bundleInfo; + HapModuleInfo hapModuleInfo; + bundleInfo.hapModuleInfos.emplace_back(hapModuleInfo); + auto bundleDataMgr = GetBundleDataMgr(); + bundleDataMgr->bundleInstallChecker_ = nullptr; + ErrCode ret = bundleDataMgr->CheckDeviceType(bundleInfo); + EXPECT_EQ(ret, ERR_APPEXECFWK_NULL_PTR); +} } // OHOS \ No newline at end of file