diff --git a/interfaces/inner_api/appexecfwk_core/include/app_control/app_control_host.h b/interfaces/inner_api/appexecfwk_core/include/app_control/app_control_host.h index 648cb4b6e44b2df32baab9f361fdfbac5951ff47..c7ef072f707572b587a274abcb81931de8b77053 100644 --- a/interfaces/inner_api/appexecfwk_core/include/app_control/app_control_host.h +++ b/interfaces/inner_api/appexecfwk_core/include/app_control/app_control_host.h @@ -60,6 +60,7 @@ private: ErrCode HandleGetDisposedRule(MessageParcel& data, MessageParcel& reply); ErrCode HandleSetDisposedRule(MessageParcel& data, MessageParcel& reply); ErrCode HandleSetDisposedRules(MessageParcel& data, MessageParcel& reply); + ErrCode HandleDeleteDisposedRules(MessageParcel& data, MessageParcel& reply); ErrCode HandleGetAbilityRunningControlRule(MessageParcel& data, MessageParcel& reply); ErrCode HandleGetDisposedRuleForCloneApp(MessageParcel& data, MessageParcel& reply); ErrCode HandleSetDisposedRuleForCloneApp(MessageParcel& data, MessageParcel& reply); diff --git a/interfaces/inner_api/appexecfwk_core/include/app_control/app_control_interface.h b/interfaces/inner_api/appexecfwk_core/include/app_control/app_control_interface.h index cd48132b9c0f5bbb5c959b66d7fce76559b542c5..5787776771a3ade914918c6994671fd09bb54a50 100644 --- a/interfaces/inner_api/appexecfwk_core/include/app_control/app_control_interface.h +++ b/interfaces/inner_api/appexecfwk_core/include/app_control/app_control_interface.h @@ -143,6 +143,11 @@ public: { return ERR_APPEXECFWK_SERVICE_INTERNAL_ERROR; } + virtual ErrCode DeleteDisposedRules( + std::vector &disposedRuleConfigurations, int32_t userId) + { + return ERR_APPEXECFWK_SERVICE_INTERNAL_ERROR; + } virtual ErrCode GetAbilityRunningControlRule(const std::string &bundleName, int32_t userId, std::vector& disposedRules, int32_t appIndex = Constants::MAIN_APP_INDEX) { diff --git a/interfaces/inner_api/appexecfwk_core/include/app_control/app_control_proxy.h b/interfaces/inner_api/appexecfwk_core/include/app_control/app_control_proxy.h index 9877cab9c867eefac92262ce71cf25a17d0c6138..cb16d4289e4cc6bf455312db8f40a8160ed2c9a6 100644 --- a/interfaces/inner_api/appexecfwk_core/include/app_control/app_control_proxy.h +++ b/interfaces/inner_api/appexecfwk_core/include/app_control/app_control_proxy.h @@ -67,6 +67,8 @@ public: DisposedRule& disposedRule, int32_t userId = Constants::UNSPECIFIED_USERID) override; virtual ErrCode SetDisposedRules(std::vector &disposedRuleConfigurations, int32_t userId) override; + virtual ErrCode DeleteDisposedRules( + std::vector &disposedRuleConfigurations, int32_t userId) override; virtual ErrCode SetDisposedRule(const std::string &appId, DisposedRule& disposedRule, int32_t userId = Constants::UNSPECIFIED_USERID) override; virtual ErrCode GetAbilityRunningControlRule(const std::string &bundleName, int32_t userId, 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 24288a334512dc9ca7879bef803e410e09bc305b..be59b80bd80fd7deb315363bbc87c8bade0ed27f 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 @@ -260,6 +260,7 @@ enum class AppControlManagerInterfaceCode : uint8_t { GET_UNINSTALL_DISPOSED_RULE = 25, DELETE_UNINSTALL_DISPOSED_RULE = 26, SET_DISPOSED_RULES = 27, + DELETE_DISPOSED_RULES = 28, }; /* SAID: 401-96 Interface No.96 subservice also provides the following interfaces */ diff --git a/interfaces/inner_api/appexecfwk_core/src/app_control/app_control_host.cpp b/interfaces/inner_api/appexecfwk_core/src/app_control/app_control_host.cpp index cb8db8333455855b584a9ef5fcb0e392152110e1..67b5241349027dd302c6dfc0d5953bd13345711f 100644 --- a/interfaces/inner_api/appexecfwk_core/src/app_control/app_control_host.cpp +++ b/interfaces/inner_api/appexecfwk_core/src/app_control/app_control_host.cpp @@ -119,6 +119,8 @@ int AppControlHost::OnRemoteRequest( return HandleSetDisposedRule(data, reply); case static_cast(AppControlManagerInterfaceCode::SET_DISPOSED_RULES): return HandleSetDisposedRules(data, reply); + case static_cast(AppControlManagerInterfaceCode::DELETE_DISPOSED_RULES): + return HandleDeleteDisposedRules(data, reply); case static_cast(AppControlManagerInterfaceCode::GET_DISPOSED_RULE): return HandleGetDisposedRule(data, reply); case static_cast(AppControlManagerInterfaceCode::GET_ABILITY_RUNNING_CONTROL_RULE): @@ -470,6 +472,27 @@ ErrCode AppControlHost::HandleSetDisposedRules(MessageParcel& data, MessageParce return ERR_OK; } +ErrCode AppControlHost::HandleDeleteDisposedRules(MessageParcel& data, MessageParcel& reply) +{ + std::vector disposedRuleConfigurations; + auto ret = GetVectorParcelInfo(data, disposedRuleConfigurations); + if (ret != ERR_OK) { + LOG_E(BMS_TAG_DEFAULT, "read DisposedRuleConfiguration failed"); + return ret; + } + if (disposedRuleConfigurations.empty() || disposedRuleConfigurations.size() > MAX_VECTOR_NUM) { + LOG_E(BMS_TAG_DEFAULT, "disposedRuleConfiguration count is error"); + return ERR_BUNDLE_MANAGER_PARAM_ERROR; + } + int32_t userId = data.ReadInt32(); + ret = DeleteDisposedRules(disposedRuleConfigurations, userId); + if (!reply.WriteInt32(ret)) { + LOG_E(BMS_TAG_DEFAULT, "write ret failed"); + return ERR_APPEXECFWK_PARCEL_ERROR; + } + return ERR_OK; +} + ErrCode AppControlHost::HandleGetAbilityRunningControlRule(MessageParcel& data, MessageParcel& reply) { std::string bundleName = data.ReadString(); diff --git a/interfaces/inner_api/appexecfwk_core/src/app_control/app_control_proxy.cpp b/interfaces/inner_api/appexecfwk_core/src/app_control/app_control_proxy.cpp index 265251fae0952314d5ade4ccb7307bbccb3279d5..4052b96fbd28b147d293d21d60c7d1cfc8d02a5a 100644 --- a/interfaces/inner_api/appexecfwk_core/src/app_control/app_control_proxy.cpp +++ b/interfaces/inner_api/appexecfwk_core/src/app_control/app_control_proxy.cpp @@ -537,6 +537,41 @@ ErrCode AppControlProxy::SetDisposedRules( return ERR_OK; } +ErrCode AppControlProxy::DeleteDisposedRules( + std::vector &disposedRuleConfigurations, int32_t userId) +{ + if (disposedRuleConfigurations.empty() || disposedRuleConfigurations.size() > MAX_VECTOR_NUM) { + LOG_E(BMS_TAG_DEFAULT, "params error"); + return ERR_BUNDLE_MANAGER_PARAM_ERROR; + } + MessageParcel data; + if (!data.WriteInterfaceToken(GetDescriptor())) { + LOG_E(BMS_TAG_DEFAULT, "WriteInterfaceToken failed"); + return ERR_APPEXECFWK_PARCEL_ERROR; + } + auto ret = WriteVectorToParcel(disposedRuleConfigurations, data); + if (ret != ERR_OK) { + LOG_E(BMS_TAG_DEFAULT, "write DisposedRuleConfiguration failed"); + return ERR_APPEXECFWK_PARCEL_ERROR; + } + if (!data.WriteInt32(userId)) { + LOG_E(BMS_TAG_DEFAULT, "write userId failed"); + return ERR_APPEXECFWK_PARCEL_ERROR; + } + MessageParcel reply; + ret = SendRequest(AppControlManagerInterfaceCode::DELETE_DISPOSED_RULES, data, reply); + if (ret != ERR_OK) { + LOG_E(BMS_TAG_DEFAULT, "SendRequest failed"); + return ret; + } + ret = reply.ReadInt32(); + if (ret != ERR_OK) { + LOG_E(BMS_TAG_DEFAULT, "host return error : %{public}d", ret); + return ret; + } + return ERR_OK; +} + ErrCode AppControlProxy::GetDisposedRule(const std::string &appId, DisposedRule &rule, int32_t userId) { LOG_D(BMS_TAG_DEFAULT, "proxy begin to GetDisposedRule"); diff --git a/services/bundlemgr/include/app_control/app_control_manager_host_impl.h b/services/bundlemgr/include/app_control/app_control_manager_host_impl.h index f4fafad391bdb8efe387246bfcf631193d229925..f31794973267f6a37d9e410b9e1a189a78f6debb 100644 --- a/services/bundlemgr/include/app_control/app_control_manager_host_impl.h +++ b/services/bundlemgr/include/app_control/app_control_manager_host_impl.h @@ -77,6 +77,9 @@ public: virtual ErrCode SetDisposedRules( std::vector &disposedRuleConfigurations, int32_t userId) override; + virtual ErrCode DeleteDisposedRules( + std::vector &disposedRuleConfigurations, int32_t userId) override; + virtual ErrCode GetDisposedRule( const std::string &appId, DisposedRule &DisposedRule, int32_t userId) override; diff --git a/services/bundlemgr/src/app_control/app_control_manager_host_impl.cpp b/services/bundlemgr/src/app_control/app_control_manager_host_impl.cpp index 9d64f9bb268574be3d0fecf08b7d3a9be89011ec..d800875dc5c47f5c19cdbd8f9244ea9a3891bcbe 100644 --- a/services/bundlemgr/src/app_control/app_control_manager_host_impl.cpp +++ b/services/bundlemgr/src/app_control/app_control_manager_host_impl.cpp @@ -638,6 +638,41 @@ ErrCode AppControlManagerHostImpl::SetDisposedRules( return ERR_OK; } +ErrCode AppControlManagerHostImpl::DeleteDisposedRules( + std::vector &disposedRuleConfigurations, int32_t userId) +{ + LOG_NOFUNC_I(BMS_TAG_DEFAULT, "begin DeleteDisposedRules -u %{public}d", userId); + if (!BundlePermissionMgr::IsSystemApp()) { + LOG_E(BMS_TAG_DEFAULT, "non-system app calling system api"); + return ERR_BUNDLE_MANAGER_SYSTEM_API_DENIED; + } + if (!BundlePermissionMgr::VerifyCallingPermissionForAll(PERMISSION_DISPOSED_STATUS)) { + LOG_W(BMS_TAG_DEFAULT, "verify permission ohos.permission.MANAGE_DISPOSED_STATUS failed"); + return ERR_BUNDLE_MANAGER_PERMISSION_DENIED; + } + if (!appControlManager_) { + LOG_E(BMS_TAG_DEFAULT, "appControlManager_ is nullptr"); + return ERR_APPEXECFWK_NULL_PTR; + } + + int32_t uid = OHOS::IPCSkeleton::GetCallingUid(); + std::string callerName; + GetCallerByUid(uid, callerName); + for (auto &disposedRuleConfiguration : disposedRuleConfigurations) { + ErrCode ret = appControlManager_->DeleteDisposedRule( + callerName, disposedRuleConfiguration.appId, disposedRuleConfiguration.appIndex, userId); + if (ret != ERR_OK) { + LOG_NOFUNC_W(BMS_TAG_DEFAULT, "DeleteDisposedRules err:%{public}d appId:%{private}s -i %{public}d", + ret, disposedRuleConfiguration.appId.c_str(), disposedRuleConfiguration.appIndex); + continue; + } + SendAppControlEvent(ControlActionType::DISPOSE_RULE, ControlOperationType::REMOVE_RULE, + callerName, userId, disposedRuleConfiguration.appIndex, { disposedRuleConfiguration.appId }, + Constants::EMPTY_STRING); + } + return ERR_OK; +} + ErrCode AppControlManagerHostImpl::SetDisposedRule(const std::string &appId, DisposedRule &rule, int32_t userId) { LOG_D(BMS_TAG_DEFAULT, "host begin to SetDisposedRule"); diff --git a/services/bundlemgr/test/unittest/bms_app_control_proxy_test/bms_app_control_proxy_test.cpp b/services/bundlemgr/test/unittest/bms_app_control_proxy_test/bms_app_control_proxy_test.cpp index 0dd9d49b284884f5017025d16ae3dfa3eaff606d..f216fe131d7af4d7c2e3dae209314a17036429fd 100644 --- a/services/bundlemgr/test/unittest/bms_app_control_proxy_test/bms_app_control_proxy_test.cpp +++ b/services/bundlemgr/test/unittest/bms_app_control_proxy_test/bms_app_control_proxy_test.cpp @@ -844,5 +844,77 @@ HWTEST_F(BmsAppControlProxyTest, SetDisposedRules_0400, Function | MediumTest | auto res = appControlProxy.SetDisposedRules(disposedRuleConfigurations, USERID); EXPECT_EQ(res, ERR_BUNDLE_MANAGER_PARAM_ERROR); } + +/** + * @tc.number: DeleteDisposedRules_0100 + * @tc.name: test the DeleteDisposedRules_0100 + * @tc.desc: test the DeleteDisposedRules_0100 + */ +HWTEST_F(BmsAppControlProxyTest, DeleteDisposedRules_0100, Function | MediumTest | Level1) +{ + AppControlProxy appControlProxy(nullptr); + DisposedRuleConfiguration disposedRuleConfiguration; + disposedRuleConfiguration.appId = APPID; + disposedRuleConfiguration.appIndex = APP_INDEX; + std::vector disposedRuleConfigurations; + disposedRuleConfigurations.push_back(disposedRuleConfiguration); + auto res = appControlProxy.DeleteDisposedRules(disposedRuleConfigurations, USERID); + EXPECT_EQ(res, ERR_BUNDLE_MANAGER_INTERNAL_ERROR); +} + +/** + * @tc.number: DeleteDisposedRules_0200 + * @tc.name: test the DeleteDisposedRules_0200 + * @tc.desc: test the DeleteDisposedRules_0200 + */ +HWTEST_F(BmsAppControlProxyTest, DeleteDisposedRules_0200, Function | MediumTest | Level1) +{ + sptr mockRemoteObject = new MockRemoteObject(); + AppControlProxy appControlProxy(mockRemoteObject); + DisposedRuleConfiguration disposedRuleConfiguration; + disposedRuleConfiguration.appId = APPID; + disposedRuleConfiguration.appIndex = APP_INDEX; + std::vector disposedRuleConfigurations; + disposedRuleConfigurations.push_back(disposedRuleConfiguration); + auto res = appControlProxy.DeleteDisposedRules(disposedRuleConfigurations, USERID); + EXPECT_EQ(res, ERR_OK); +} + +/** + * @tc.number: DeleteDisposedRules_0300 + * @tc.name: test the DeleteDisposedRules_0300 + * @tc.desc: test the DeleteDisposedRules_0300 + */ +HWTEST_F(BmsAppControlProxyTest, DeleteDisposedRules_0300, Function | MediumTest | Level1) +{ + sptr mockRemoteObject = new MockRemoteObject(); + AppControlProxy appControlProxy(mockRemoteObject); + std::vector disposedRuleConfigurations; + disposedRuleConfigurations.clear(); + auto res = appControlProxy.DeleteDisposedRules(disposedRuleConfigurations, USERID); + EXPECT_EQ(res, ERR_BUNDLE_MANAGER_PARAM_ERROR); +} + +/** + * @tc.number: DeleteDisposedRules_0400 + * @tc.name: test DeleteDisposedRules_0400 + * @tc.desc: test DeleteDisposedRules_0400 + */ +HWTEST_F(BmsAppControlProxyTest, DeleteDisposedRules_0400, Function | MediumTest | Level1) +{ + sptr mockRemoteObject = new MockRemoteObject(); + AppControlProxy appControlProxy(mockRemoteObject); + DisposedRuleConfiguration disposedRuleConfiguration; + disposedRuleConfiguration.appId = APPID; + disposedRuleConfiguration.appIndex = APP_INDEX; + std::vector disposedRuleConfigurations; + disposedRuleConfigurations.reserve(MAX_VECTOR_NUM); + + for (int i = 0; i < MAX_VECTOR_NUM; ++i) { + disposedRuleConfigurations.push_back(disposedRuleConfiguration); + } + auto res = appControlProxy.DeleteDisposedRules(disposedRuleConfigurations, USERID); + EXPECT_EQ(res, ERR_BUNDLE_MANAGER_PARAM_ERROR); +} } // AppExecFwk } // OHOS \ No newline at end of file diff --git a/services/bundlemgr/test/unittest/bms_bundle_app_control_test/bms_bundle_app_control_test.cpp b/services/bundlemgr/test/unittest/bms_bundle_app_control_test/bms_bundle_app_control_test.cpp index 7eb7602c0997826dd881ea6b4790abfb26441c2e..1965718924ab5eb385658196acb3b3dc6ccb0111 100644 --- a/services/bundlemgr/test/unittest/bms_bundle_app_control_test/bms_bundle_app_control_test.cpp +++ b/services/bundlemgr/test/unittest/bms_bundle_app_control_test/bms_bundle_app_control_test.cpp @@ -3307,6 +3307,59 @@ HWTEST_F(BmsBundleAppControlTest, OnRemoteRequest_3000, Function | MediumTest | EXPECT_EQ(res, OBJECT_NULL); } +/** + * @tc.number: OnRemoteRequest_3100 + * @tc.name: test the OnRemoteRequest + * @tc.desc: 1. system running normally + * 2. test OnRemoteRequest + */ +HWTEST_F(BmsBundleAppControlTest, OnRemoteRequest_3100, Function | MediumTest | Level0) +{ + AppControlHost appControlHost; + MessageParcel data; + data.WriteInterfaceToken(AppControlHost::GetDescriptor()); + MessageParcel reply; + MessageOption option(MessageOption::TF_SYNC); + ErrCode res = appControlHost.OnRemoteRequest( + static_cast(AppControlManagerInterfaceCode::DELETE_DISPOSED_RULES), data, reply, option); + EXPECT_EQ(res, ERR_BUNDLE_MANAGER_PARAM_ERROR); +} + +/** + * @tc.number: OnRemoteRequest_3200 + * @tc.name: test the OnRemoteRequest + * @tc.desc: 1. system running normally + * 2. test OnRemoteRequest + */ +HWTEST_F(BmsBundleAppControlTest, OnRemoteRequest_3200, Function | MediumTest | Level0) +{ + AppControlHost appControlHost; + MessageParcel data; + MessageParcel reply; + data.WriteInt32(2); + ErrCode res = appControlHost.HandleDeleteDisposedRules(data, reply); + EXPECT_EQ(res, ERR_APPEXECFWK_PARCEL_ERROR); +} + +/** + * @tc.number: OnRemoteRequest_3300 + * @tc.name: test the OnRemoteRequest + * @tc.desc: 1. system running normally + * 2. test OnRemoteRequest + */ +HWTEST_F(BmsBundleAppControlTest, OnRemoteRequest_3300, Function | MediumTest | Level0) +{ + AppControlHost appControlHost; + MessageParcel data; + MessageParcel reply; + data.WriteInt32(1); + DisposedRuleConfiguration config; + data.WriteParcelable(&config); + data.WriteInt32(100); + ErrCode res = appControlHost.HandleDeleteDisposedRules(data, reply); + EXPECT_EQ(res, ERR_BUNDLE_MANAGER_PARAM_ERROR); +} + /** * @tc.number: DisposeRuleCacheOnlyForBms_1000 * @tc.name: test DisposeRuleCacheOnlyForBms @@ -4197,4 +4250,42 @@ HWTEST_F(BmsBundleAppControlTest, AppRunningControlRule_1000, Function | SmallTe EXPECT_EQ(res, ERR_OK); appControlManager.appRunningControlRuleResult_.clear(); } + +/** + * @tc.number: DeleteDisposedRules_0100 + * @tc.name: test DeleteDisposedRules_0100 + * @tc.desc: test DeleteDisposedRules_0100 + */ +HWTEST_F(BmsBundleAppControlTest, DeleteDisposedRules_0100, Function | SmallTest | Level1) +{ + auto impl = std::make_shared(); + DisposedRuleConfiguration disposedRuleConfiguration; + disposedRuleConfiguration.appId = APPID; + disposedRuleConfiguration.appIndex = APP_INDEX; + std::vector disposedRuleConfigurations; + disposedRuleConfigurations.push_back(disposedRuleConfiguration); + + impl->appControlManager_ = nullptr; + ErrCode res = impl->DeleteDisposedRules(disposedRuleConfigurations, USERID); + EXPECT_EQ(res, ERR_APPEXECFWK_NULL_PTR); +} + +/** + * @tc.number: DeleteDisposedRules_0200 + * @tc.name: test DeleteDisposedRules_0200 + * @tc.desc: test DeleteDisposedRules_0200 + */ +HWTEST_F(BmsBundleAppControlTest, DeleteDisposedRules_0200, Function | SmallTest | Level1) +{ + auto impl = std::make_shared(); + DisposedRuleConfiguration disposedRuleConfiguration; + disposedRuleConfiguration.appId = APPID; + disposedRuleConfiguration.appIndex = APP_INDEX; + std::vector disposedRuleConfigurations; + disposedRuleConfigurations.push_back(disposedRuleConfiguration); + + impl->appControlManager_ = DelayedSingleton::GetInstance(); + ErrCode res = impl->DeleteDisposedRules(disposedRuleConfigurations, USERID); + EXPECT_EQ(res, ERR_OK); +} } // OHOS \ No newline at end of file diff --git a/services/bundlemgr/test/unittest/bms_bundle_permission_grant_test/bms_bundle_permission_false_test.cpp b/services/bundlemgr/test/unittest/bms_bundle_permission_grant_test/bms_bundle_permission_false_test.cpp index 0fba46759cda2e99e871869f29c4839d007f11ff..bc05284646639a5340ef77bc6b2bcd53ca31506d 100644 --- a/services/bundlemgr/test/unittest/bms_bundle_permission_grant_test/bms_bundle_permission_false_test.cpp +++ b/services/bundlemgr/test/unittest/bms_bundle_permission_grant_test/bms_bundle_permission_false_test.cpp @@ -1343,6 +1343,9 @@ HWTEST_F(BmsBundlePermissionFalseTest, BmsBundlePermissionFalseTest_8900, Functi res = impl->SetDisposedRules(disposedRuleConfigurations, USERID); EXPECT_EQ(res, ERR_BUNDLE_MANAGER_PERMISSION_DENIED); + + res = impl->DeleteDisposedRules(disposedRuleConfigurations, USERID); + EXPECT_EQ(res, ERR_BUNDLE_MANAGER_PERMISSION_DENIED); } /** diff --git a/services/bundlemgr/test/unittest/bms_bundle_permission_grant_test/bms_bundle_permission_system_app_test.cpp b/services/bundlemgr/test/unittest/bms_bundle_permission_grant_test/bms_bundle_permission_system_app_test.cpp index 7e801efe6dbc4b93b155edc69f3d01270b41d3d6..e8f2fb56f9c3443d628009f9e5659e7a11ebf0a2 100644 --- a/services/bundlemgr/test/unittest/bms_bundle_permission_grant_test/bms_bundle_permission_system_app_test.cpp +++ b/services/bundlemgr/test/unittest/bms_bundle_permission_grant_test/bms_bundle_permission_system_app_test.cpp @@ -939,6 +939,9 @@ HWTEST_F(BmsBundlePermissionSyetemAppFalseTest, BmsBundleSyetemAppFalseTest_5800 res = impl->SetDisposedRules(disposedRuleConfigurations, USERID); EXPECT_EQ(res, ERR_BUNDLE_MANAGER_SYSTEM_API_DENIED); + + res = impl->DeleteDisposedRules(disposedRuleConfigurations, USERID); + EXPECT_EQ(res, ERR_BUNDLE_MANAGER_SYSTEM_API_DENIED); } /**