From 9d21813695979dc90c7034f4401ea79490f41ea9 Mon Sep 17 00:00:00 2001 From: donglin Date: Mon, 18 Sep 2023 09:08:37 +0000 Subject: [PATCH 1/4] add IsAbilityControllerStart ipc-interface Signed-off-by: donglin Change-Id: I630ba82ba92a70299103a973662694c4419c234d --- .../include/ability_manager_client.h | 7 ++++++ .../include/ability_manager_interface.h | 10 ++++++++ .../ability_manager_ipc_interface_code.h | 1 + .../include/ability_manager_proxy.h | 7 ++++++ .../include/ability_manager_service.h | 7 ++++++ .../abilitymgr/include/ability_manager_stub.h | 2 ++ .../abilitymgr/src/ability_manager_client.cpp | 11 +++++++++ .../abilitymgr/src/ability_manager_proxy.cpp | 24 +++++++++++++++++++ .../src/ability_manager_service.cpp | 11 +++++++++ .../abilitymgr/src/ability_manager_stub.cpp | 14 +++++++++++ 10 files changed, 94 insertions(+) diff --git a/interfaces/inner_api/ability_manager/include/ability_manager_client.h b/interfaces/inner_api/ability_manager/include/ability_manager_client.h index d98ead7b8c..0865f9d264 100644 --- a/interfaces/inner_api/ability_manager/include/ability_manager_client.h +++ b/interfaces/inner_api/ability_manager/include/ability_manager_client.h @@ -1187,6 +1187,13 @@ public: */ ErrCode RegisterSessionHandler(const sptr &object); + /** + * @brief Check if ability controller can start. + * @param want The want of ability to start. + * @return Return true to allow ability to start, or false to reject. + */ + bool IsAbilityControllerStart(const Want &want); + private: class AbilityMgrDeathRecipient : public IRemoteObject::DeathRecipient { public: diff --git a/interfaces/inner_api/ability_manager/include/ability_manager_interface.h b/interfaces/inner_api/ability_manager/include/ability_manager_interface.h index 44d5323f0b..ed1ddd613e 100644 --- a/interfaces/inner_api/ability_manager/include/ability_manager_interface.h +++ b/interfaces/inner_api/ability_manager/include/ability_manager_interface.h @@ -1149,6 +1149,16 @@ public: { return 0; } + + /** + * @brief Check if ability controller can start. + * @param want The want of ability to start. + * @return Return true to allow ability to start, or false to reject. + */ + virtual bool IsAbilityControllerStart(const Want &want) + { + return true; + } }; } // namespace AAFwk } // namespace OHOS diff --git a/interfaces/inner_api/ability_manager/include/ability_manager_ipc_interface_code.h b/interfaces/inner_api/ability_manager/include/ability_manager_ipc_interface_code.h index 92457944ba..b6de359e0e 100644 --- a/interfaces/inner_api/ability_manager/include/ability_manager_ipc_interface_code.h +++ b/interfaces/inner_api/ability_manager/include/ability_manager_ipc_interface_code.h @@ -408,6 +408,7 @@ enum class AbilityManagerInterfaceCode { UNREGISTER_COLLABORATOR = 4051, MOVE_MISSION_TO_BACKGROUND = 4052, TERMINATE_MISSION = 4053, + IS_ABILITY_CONTROLLER_START = 4054, GET_ABILITY_TOKEN = 5001, diff --git a/services/abilitymgr/include/ability_manager_proxy.h b/services/abilitymgr/include/ability_manager_proxy.h index dc490baa45..6c300b0f42 100644 --- a/services/abilitymgr/include/ability_manager_proxy.h +++ b/services/abilitymgr/include/ability_manager_proxy.h @@ -919,6 +919,13 @@ public: virtual int PrepareTerminateAbilityBySCB(const sptr &sessionInfo, bool &isPrepareTerminate) override; virtual int RegisterSessionHandler(const sptr &object) override; + /** + * @brief Check if ability controller can start. + * @param want The want of ability to start. + * @return Return true to allow ability to start, or false to reject. + */ + virtual bool IsAbilityControllerStart(const Want &want) override; + private: template int GetParcelableInfos(MessageParcel &reply, std::vector &parcelableInfos); diff --git a/services/abilitymgr/include/ability_manager_service.h b/services/abilitymgr/include/ability_manager_service.h index 3bb06479c4..2157c1d382 100644 --- a/services/abilitymgr/include/ability_manager_service.h +++ b/services/abilitymgr/include/ability_manager_service.h @@ -1215,6 +1215,13 @@ public: */ virtual int PrepareTerminateAbilityBySCB(const sptr &sessionInfo, bool &isTerminate) override; + /** + * @brief Check if ability controller can start. + * @param want The want of ability to start. + * @return Return true to allow ability to start, or false to reject. + */ + virtual bool IsAbilityControllerStart(const Want &want) override; + // MSG 0 - 20 represents timeout message static constexpr uint32_t LOAD_TIMEOUT_MSG = 0; static constexpr uint32_t ACTIVE_TIMEOUT_MSG = 1; diff --git a/services/abilitymgr/include/ability_manager_stub.h b/services/abilitymgr/include/ability_manager_stub.h index 283f77e5fb..056cbcaa43 100644 --- a/services/abilitymgr/include/ability_manager_stub.h +++ b/services/abilitymgr/include/ability_manager_stub.h @@ -243,6 +243,8 @@ private: int PrepareTerminateAbilityBySCBInner(MessageParcel &data, MessageParcel &reply); int RegisterSessionHandlerInner(MessageParcel &data, MessageParcel &reply); + + int32_t IsAbilityControllerStartInner(MessageParcel &data, MessageParcel &reply); }; } // namespace AAFwk } // namespace OHOS diff --git a/services/abilitymgr/src/ability_manager_client.cpp b/services/abilitymgr/src/ability_manager_client.cpp index 524717ba2d..e6fc15ceaa 100644 --- a/services/abilitymgr/src/ability_manager_client.cpp +++ b/services/abilitymgr/src/ability_manager_client.cpp @@ -1483,5 +1483,16 @@ ErrCode AbilityManagerClient::RegisterSessionHandler(const sptr & CHECK_POINTER_RETURN_NOT_CONNECTED(abms); return abms->RegisterSessionHandler(object); } + +bool AbilityManagerClient::IsAbilityControllerStart(const Want &want) +{ + HILOG_DEBUG("call"); + auto abms = GetAbilityManager(); + if (abms == nullptr) { + HILOG_ERROR("abms is nullptr."); + return true; + } + return abms->IsAbilityControllerStart(want); +} } // namespace AAFwk } // namespace OHOS diff --git a/services/abilitymgr/src/ability_manager_proxy.cpp b/services/abilitymgr/src/ability_manager_proxy.cpp index 9b4d87e321..5bf96da8c6 100644 --- a/services/abilitymgr/src/ability_manager_proxy.cpp +++ b/services/abilitymgr/src/ability_manager_proxy.cpp @@ -4120,6 +4120,30 @@ int AbilityManagerProxy::PrepareTerminateAbilityBySCB(const sptr &s return NO_ERROR; } +bool AbilityManagerProxy::IsAbilityControllerStart(const Want &want) +{ + MessageParcel data; + MessageParcel reply; + MessageOption option; + + if (!WriteInterfaceToken(data)) { + HILOG_ERROR("Write interface token failed."); + return true; + } + if (!data.WriteParcelable(&want)) { + HILOG_ERROR("WriteWantObject failed."); + return true; + } + + auto error = SendRequest(AbilityManagerInterfaceCode::IS_ABILITY_CONTROLLER_START, + data, reply, option); + if (error != NO_ERROR) { + HILOG_ERROR("Send request error: %{public}d", error); + return true; + } + return reply.ReadBool(); +} + ErrCode AbilityManagerProxy::SendRequest(AbilityManagerInterfaceCode code, MessageParcel &data, MessageParcel &reply, MessageOption& option) { diff --git a/services/abilitymgr/src/ability_manager_service.cpp b/services/abilitymgr/src/ability_manager_service.cpp index 9735521bdd..6c0885ea1a 100644 --- a/services/abilitymgr/src/ability_manager_service.cpp +++ b/services/abilitymgr/src/ability_manager_service.cpp @@ -8210,5 +8210,16 @@ bool AbilityManagerService::CheckUserIdActive(int32_t userId) } return true; } + +bool AbilityManagerService::IsAbilityControllerStart(const Want &want) +{ + auto isSaCall = AAFwk::PermissionVerification::GetInstance()->IsSACall(); + auto callingUid = IPCSkeleton::GetCallingUid(); + if (!isSaCall || (callingUid != BROKER_UID && callingUid != BROKER_RESERVE_UID)) { + HILOG_ERROR("The interface only support for broker"); + return true; + } + return IsAbilityControllerStart(want, want.GetBundle()); +} } // namespace AAFwk } // namespace OHOS diff --git a/services/abilitymgr/src/ability_manager_stub.cpp b/services/abilitymgr/src/ability_manager_stub.cpp index d323a397fd..bb28bc3e85 100644 --- a/services/abilitymgr/src/ability_manager_stub.cpp +++ b/services/abilitymgr/src/ability_manager_stub.cpp @@ -147,6 +147,8 @@ void AbilityManagerStub::FirstStepInit() &AbilityManagerStub::MoveMissionToBackgroundInner; requestFuncMap_[static_cast(AbilityManagerInterfaceCode::TERMINATE_MISSION)] = &AbilityManagerStub::TerminateMissionInner; + requestFuncMap_[static_cast(AbilityManagerInterfaceCode::IS_ABILITY_CONTROLLER_START)] = + &AbilityManagerStub::IsAbilityControllerStartInner; } void AbilityManagerStub::SecondStepInit() @@ -2502,5 +2504,17 @@ int AbilityManagerStub::RegisterSessionHandlerInner(MessageParcel &data, Message reply.WriteInt32(result); return NO_ERROR; } + +int32_t AbilityManagerStub::IsAbilityControllerStartInner(MessageParcel &data, MessageParcel &reply) +{ + Want *want = data.ReadParcelable(); + if (want == nullptr) { + HILOG_ERROR("want is nullptr"); + return true; + } + bool result = IsAbilityControllerStart(*want); + reply.WriteBool(result); + return NO_ERROR; +} } // namespace AAFwk } // namespace OHOS From fb07f3dd0ef9d1debfe759ac3997bc38a1860234 Mon Sep 17 00:00:00 2001 From: donglin Date: Tue, 19 Sep 2023 06:07:32 +0000 Subject: [PATCH 2/4] add tdd Signed-off-by: donglin Change-Id: Iff5da5fe06b337be11ff3da4a8dd8521d4208672 --- .../abilitymgr/src/ability_manager_stub.cpp | 2 +- .../ability_manager_client_branch_test.cpp | 12 ++++++++++++ .../ability_manager_proxy_test.cpp | 17 +++++++++++++++++ .../ability_manager_stub_mock.h | 1 + .../ability_manager_service_test.cpp | 13 +++++++++++++ .../ability_manager_stub_impl_mock.h | 1 + .../ability_manager_stub_test.cpp | 17 +++++++++++++++++ 7 files changed, 62 insertions(+), 1 deletion(-) diff --git a/services/abilitymgr/src/ability_manager_stub.cpp b/services/abilitymgr/src/ability_manager_stub.cpp index bb28bc3e85..70587eb26a 100644 --- a/services/abilitymgr/src/ability_manager_stub.cpp +++ b/services/abilitymgr/src/ability_manager_stub.cpp @@ -2507,7 +2507,7 @@ int AbilityManagerStub::RegisterSessionHandlerInner(MessageParcel &data, Message int32_t AbilityManagerStub::IsAbilityControllerStartInner(MessageParcel &data, MessageParcel &reply) { - Want *want = data.ReadParcelable(); + std::unique_ptr want(data.ReadParcelable()); if (want == nullptr) { HILOG_ERROR("want is nullptr"); return true; diff --git a/test/unittest/ability_manager_client_branch_test/ability_manager_client_branch_test.cpp b/test/unittest/ability_manager_client_branch_test/ability_manager_client_branch_test.cpp index 41b808f84c..ff1b899e78 100644 --- a/test/unittest/ability_manager_client_branch_test/ability_manager_client_branch_test.cpp +++ b/test/unittest/ability_manager_client_branch_test/ability_manager_client_branch_test.cpp @@ -1667,5 +1667,17 @@ HWTEST_F(AbilityManagerClientBranchTest, StartSpecifiedAbilityBySCB_0100, TestSi Want want; client_->StartSpecifiedAbilityBySCB(want); } + +/** + * @tc.name: AbilityManagerClient_IsAbilityControllerStart_0100 + * @tc.desc: IsAbilityControllerStart + * @tc.type: FUNC + */ +HWTEST_F(AbilityManagerClientBranchTest, IsAbilityControllerStart_0100, TestSize.Level1) +{ + Want want; + bool result = client_->IsAbilityControllerStart(want); + EXPECT_TRUE(result); +} } // namespace AAFwk } // namespace OHOS \ No newline at end of file diff --git a/test/unittest/ability_manager_proxy_test/ability_manager_proxy_test.cpp b/test/unittest/ability_manager_proxy_test/ability_manager_proxy_test.cpp index 500d0c1270..c6eac3f20b 100644 --- a/test/unittest/ability_manager_proxy_test/ability_manager_proxy_test.cpp +++ b/test/unittest/ability_manager_proxy_test/ability_manager_proxy_test.cpp @@ -2378,5 +2378,22 @@ HWTEST_F(AbilityManagerProxyTest, AbilityManagerProxy_StartSpecifiedAbilityBySCB Want want; proxy_->StartSpecifiedAbilityBySCB(want); } + +/* + * Feature: AbilityManagerService + * Function: IsAbilityControllerStart + * SubFunction: NA + * FunctionPoints: AbilityManagerService IsAbilityControllerStart + * EnvConditions: NA + * CaseDescription: Verify the normal process of IsAbilityControllerStart + */ +HWTEST_F(AbilityManagerProxyTest, AbilityManagerProxy_IsAbilityControllerStart_001, TestSize.Level1) +{ + proxy_ = std::make_shared(mock_); + EXPECT_TRUE(proxy_ != nullptr); + EXPECT_CALL(*mock_, SendRequest(_, _, _, _)).Times(1).WillOnce(Return(NO_ERROR)); + Want want; + proxy_->IsAbilityControllerStart(want); +} } // namespace AAFwk } // namespace OHOS diff --git a/test/unittest/ability_manager_proxy_test/ability_manager_stub_mock.h b/test/unittest/ability_manager_proxy_test/ability_manager_stub_mock.h index 62371f2d5f..45f4ddd000 100644 --- a/test/unittest/ability_manager_proxy_test/ability_manager_stub_mock.h +++ b/test/unittest/ability_manager_proxy_test/ability_manager_stub_mock.h @@ -393,6 +393,7 @@ public: } #endif MOCK_METHOD2(IsValidMissionIds, int32_t(const std::vector&, std::vector&)); + MOCK_METHOD1(IsAbilityControllerStart, bool(const Want& want)); }; } // namespace AAFwk } // namespace OHOS diff --git a/test/unittest/ability_manager_service_test/ability_manager_service_test.cpp b/test/unittest/ability_manager_service_test/ability_manager_service_test.cpp index 55ef5c6bb8..2063e00917 100644 --- a/test/unittest/ability_manager_service_test/ability_manager_service_test.cpp +++ b/test/unittest/ability_manager_service_test/ability_manager_service_test.cpp @@ -4041,5 +4041,18 @@ HWTEST_F(AbilityManagerServiceTest, RegisterSessionHandler_002, TestSize.Level1) EXPECT_EQ(abilityMs_->RegisterSessionHandler(nullptr), ERR_WRONG_INTERFACE_CALL); HILOG_INFO("AbilityManagerServiceTest RegisterSessionHandler_002 end"); } + +/* + * Feature: AbilityManagerService + * Function: IsAbilityControllerStart + * SubFunction: NA + * FunctionPoints: AbilityManagerService IsAbilityControllerStart + */ +HWTEST_F(AbilityManagerServiceTest, IsAbilityControllerStart_003, TestSize.Level1) +{ + auto abilityMs_ = std::make_shared(); + Want want; + EXPECT_TRUE(abilityMs_->IsAbilityControllerStart(want)); +} } // namespace AAFwk } // namespace OHOS diff --git a/test/unittest/ability_manager_stub_test/ability_manager_stub_impl_mock.h b/test/unittest/ability_manager_stub_test/ability_manager_stub_impl_mock.h index c6dd896930..1b1cf1f0a3 100644 --- a/test/unittest/ability_manager_stub_test/ability_manager_stub_impl_mock.h +++ b/test/unittest/ability_manager_stub_test/ability_manager_stub_impl_mock.h @@ -393,6 +393,7 @@ public: #endif MOCK_METHOD2(IsValidMissionIds, int32_t(const std::vector&, std::vector&)); MOCK_METHOD2(PrepareTerminateAbilityBySCB, int32_t(const sptr &sessionInfo, bool &isPrepareTerminate)); + MOCK_METHOD1(IsAbilityControllerStart, bool(const Want& want)); }; } // namespace AAFwk } // namespace OHOS diff --git a/test/unittest/ability_manager_stub_test/ability_manager_stub_test.cpp b/test/unittest/ability_manager_stub_test/ability_manager_stub_test.cpp index 77dd2287cc..9111433813 100644 --- a/test/unittest/ability_manager_stub_test/ability_manager_stub_test.cpp +++ b/test/unittest/ability_manager_stub_test/ability_manager_stub_test.cpp @@ -2407,5 +2407,22 @@ HWTEST_F(AbilityManagerStubTest, AbilityManagerStub_StartSpecifiedAbilityBySCBIn data.WriteParcelable(&want); EXPECT_EQ(stub_->StartSpecifiedAbilityBySCBInner(data, reply), NO_ERROR); } + +/* + * Feature: AbilityManagerService + * Function: IsAbilityControllerStartInner + * SubFunction: NA + * FunctionPoints: AbilityManagerService IsAbilityControllerStartInner + * EnvConditions: NA + * CaseDescription: Verify the function IsAbilityControllerStartInner is normal flow. + */ +HWTEST_F(AbilityManagerStubTest, AbilityManagerStub_IsAbilityControllerStartInner_001, TestSize.Level1) +{ + MessageParcel data; + MessageParcel reply; + Want want; + data.WriteParcelable(&want); + EXPECT_EQ(stub_->IsAbilityControllerStartInner(data, reply), NO_ERROR); +} } // namespace AAFwk } // namespace OHOS From 94729892b8da470856e2eb9232ee8a67b70dad53 Mon Sep 17 00:00:00 2001 From: donglin Date: Fri, 22 Sep 2023 03:10:34 +0000 Subject: [PATCH 3/4] add WMS permission Signed-off-by: donglin Change-Id: I00b9a6b3c193f35589dbe87ef491a810892bc007 --- services/abilitymgr/src/ability_manager_service.cpp | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/services/abilitymgr/src/ability_manager_service.cpp b/services/abilitymgr/src/ability_manager_service.cpp index 6c0885ea1a..69c575bd21 100644 --- a/services/abilitymgr/src/ability_manager_service.cpp +++ b/services/abilitymgr/src/ability_manager_service.cpp @@ -180,6 +180,7 @@ const int32_t ACCOUNT_MGR_SERVICE_UID = 3058; const int32_t BROKER_UID = 5557; const int32_t BROKER_RESERVE_UID = 5005; const int32_t DMS_UID = 5522; +const int32_t WMS_UID = 4606; const int32_t PREPARE_TERMINATE_TIMEOUT_MULTIPLE = 10; const std::string BUNDLE_NAME_KEY = "bundleName"; const std::string DM_PKG_NAME = "ohos.distributedhardware.devicemanager"; @@ -8215,8 +8216,9 @@ bool AbilityManagerService::IsAbilityControllerStart(const Want &want) { auto isSaCall = AAFwk::PermissionVerification::GetInstance()->IsSACall(); auto callingUid = IPCSkeleton::GetCallingUid(); - if (!isSaCall || (callingUid != BROKER_UID && callingUid != BROKER_RESERVE_UID)) { - HILOG_ERROR("The interface only support for broker"); + if (!isSaCall || (callingUid != BROKER_UID && callingUid != BROKER_RESERVE_UID && + callingUid != WMS_UID)) { + HILOG_ERROR("The interface only support for broker and WMS"); return true; } return IsAbilityControllerStart(want, want.GetBundle()); From 182a843150775b5b2117e7aa1cd2d1e84d4ded87 Mon Sep 17 00:00:00 2001 From: donglin Date: Tue, 26 Sep 2023 02:44:07 +0000 Subject: [PATCH 4/4] update test/unittest/ability_manager_service_third_test/ability_manager_service_third_test.cpp. Signed-off-by: donglin --- .../ability_manager_service_third_test.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/unittest/ability_manager_service_third_test/ability_manager_service_third_test.cpp b/test/unittest/ability_manager_service_third_test/ability_manager_service_third_test.cpp index 1193481f5a..67dffefe7a 100644 --- a/test/unittest/ability_manager_service_third_test/ability_manager_service_third_test.cpp +++ b/test/unittest/ability_manager_service_third_test/ability_manager_service_third_test.cpp @@ -1074,7 +1074,7 @@ HWTEST_F(AbilityManagerServiceThirdTest, RegisterSessionHandler_002, TestSize.Le * SubFunction: NA * FunctionPoints: AbilityManagerService IsAbilityControllerStart */ -HWTEST_F(AbilityManagerServiceTest, IsAbilityControllerStart_003, TestSize.Level1) +HWTEST_F(AbilityManagerServiceThirdTest, IsAbilityControllerStart_003, TestSize.Level1) { auto abilityMs_ = std::make_shared(); Want want;