From f5211ca9fa4713668f8f04cf133c5d65f507c0af Mon Sep 17 00:00:00 2001 From: louzhihao Date: Fri, 30 May 2025 11:09:20 +0800 Subject: [PATCH] no inner template Signed-off-by: louzhihao Change-Id: I8c9937106f586cf9c37e04db421c331318f1afde --- .../data_share/data_share_service_stub.cpp | 42 ++++++++- .../data_share/data_share_service_stub.h | 1 + .../test/data_share_service_stub_test.cpp | 93 ++++++++++++++++++- 3 files changed, 134 insertions(+), 2 deletions(-) diff --git a/services/distributeddataservice/service/data_share/data_share_service_stub.cpp b/services/distributeddataservice/service/data_share/data_share_service_stub.cpp index 170de1bcb..41977a9d9 100644 --- a/services/distributeddataservice/service/data_share/data_share_service_stub.cpp +++ b/services/distributeddataservice/service/data_share/data_share_service_stub.cpp @@ -347,6 +347,44 @@ int32_t DataShareServiceStub::OnNotifyConnectDone(MessageParcel &data, MessagePa return 0; } +// template request do not allow normal app +bool DataShareServiceStub::IsTemplateRequest(uint32_t requestCode) +{ + // code in order + static uint32_t list[] = { + DATA_SHARE_SERVICE_CMD_ADD_TEMPLATE, + DATA_SHARE_SERVICE_CMD_DEL_TEMPLATE, + DATA_SHARE_SERVICE_CMD_PUBLISH, + DATA_SHARE_SERVICE_CMD_GET_DATA, + DATA_SHARE_SERVICE_CMD_SUBSCRIBE_RDB, + DATA_SHARE_SERVICE_CMD_UNSUBSCRIBE_RDB, + DATA_SHARE_SERVICE_CMD_ENABLE_SUBSCRIBE_RDB, + DATA_SHARE_SERVICE_CMD_DISABLE_SUBSCRIBE_RDB, + DATA_SHARE_SERVICE_CMD_SUBSCRIBE_PUBLISHED, + DATA_SHARE_SERVICE_CMD_UNSUBSCRIBE_PUBLISHED, + DATA_SHARE_SERVICE_CMD_ENABLE_SUBSCRIBE_PUBLISHED, + DATA_SHARE_SERVICE_CMD_DISABLE_SUBSCRIBE_PUBLISHED, + DATA_SHARE_SERVICE_CMD_NOTIFY_OBSERVERS + }; + + int32_t len = sizeof(list) / sizeof(uint32_t); + int32_t halfLen = len / 2; + + uint32_t startPos = 0; + uint32_t endPos = halfLen; + if (requestCode >= list[halfLen]) { + startPos = halfLen; + endPos = len; + } + + for (uint32_t i = startPos ; i < endPos; i++) { + if (requestCode == list[i]) { + return true; + } + } + return false; +} + int DataShareServiceStub::OnRemoteRequest(uint32_t code, MessageParcel &data, MessageParcel &reply) { // set thread qos @@ -364,12 +402,14 @@ int DataShareServiceStub::OnRemoteRequest(uint32_t code, MessageParcel &data, Me auto fullTokenId = IPCSkeleton::GetCallingFullTokenID(); bool isSystemApp = CheckSystemCallingPermission(IPCSkeleton::GetCallingTokenID(), fullTokenId); DataShareThreadLocal::SetFromSystemApp(isSystemApp); - if (code >= DATA_SHARE_CMD_SYSTEM_CODE) { + if (code >= DATA_SHARE_CMD_SYSTEM_CODE || IsTemplateRequest(code)) { if (!isSystemApp) { ZLOGE("CheckSystemCallingPermission fail, token:%{public}" PRIx64 ", callingPid:%{public}d, code:%{public}u", fullTokenId, callingPid, code); return E_NOT_SYSTEM_APP; } + } + if (code >= DATA_SHARE_CMD_SYSTEM_CODE) { code = code - DATA_SHARE_CMD_SYSTEM_CODE; } if (code != DATA_SHARE_SERVICE_CMD_QUERY && code != DATA_SHARE_SERVICE_CMD_GET_SILENT_PROXY_STATUS) { diff --git a/services/distributeddataservice/service/data_share/data_share_service_stub.h b/services/distributeddataservice/service/data_share/data_share_service_stub.h index 47603e959..69e2ce160 100644 --- a/services/distributeddataservice/service/data_share/data_share_service_stub.h +++ b/services/distributeddataservice/service/data_share/data_share_service_stub.h @@ -30,6 +30,7 @@ private: class QosManager; static constexpr std::chrono::milliseconds TIME_THRESHOLD = std::chrono::milliseconds(500); static bool CheckInterfaceToken(MessageParcel& data); + bool IsTemplateRequest(uint32_t code); int32_t OnQuery(MessageParcel& data, MessageParcel& reply); int32_t OnAddTemplate(MessageParcel& data, MessageParcel& reply); int32_t OnDelTemplate(MessageParcel& data, MessageParcel& reply); diff --git a/services/distributeddataservice/service/test/data_share_service_stub_test.cpp b/services/distributeddataservice/service/test/data_share_service_stub_test.cpp index 0acfb1358..371d55fa1 100644 --- a/services/distributeddataservice/service/test/data_share_service_stub_test.cpp +++ b/services/distributeddataservice/service/test/data_share_service_stub_test.cpp @@ -21,16 +21,17 @@ #include "data_share_service_impl.h" #include "ipc_skeleton.h" +#include "token_setproc.h" #include "log_print.h" using namespace testing::ext; using namespace OHOS::DataShare; -using namespace OHOS::DistributedData; const std::u16string INTERFACE_TOKEN = u"OHOS.DataShare.IDataShareService"; constexpr uint32_t CODE_MIN = 0; constexpr size_t TEST_SIZE = 1; constexpr uint8_t TEST_DATA = 1; constexpr uint32_t CODE_MAX = IDataShareService::DATA_SHARE_SERVICE_CMD_MAX + 1; +constexpr uint64_t SYSTEM_TOKENID = static_cast(1) << 32; namespace OHOS::Test { class DataShareServiceStubTest : public testing::Test { public: @@ -50,6 +51,9 @@ std::shared_ptr dataShareServiceStub = dataShareServiceImp */ HWTEST_F(DataShareServiceStubTest, OnRemoteRequest001, TestSize.Level1) { + ZLOGI("DataShareServiceStubTest::OnRemoteRequest001 start"); + auto originalToken = GetSelfTokenID(); + SetSelfTokenID(SYSTEM_TOKENID); uint8_t value = TEST_DATA; uint8_t *data = &value; size_t size = TEST_SIZE; @@ -64,6 +68,9 @@ HWTEST_F(DataShareServiceStubTest, OnRemoteRequest001, TestSize.Level1) result = dataShareServiceStub->OnNotifyConnectDone(request, reply); EXPECT_EQ(result, IDataShareService::DATA_SHARE_OK); + + SetSelfTokenID(originalToken); + ZLOGI("DataShareServiceStubTest::OnRemoteRequest001 end"); } /** @@ -74,6 +81,9 @@ HWTEST_F(DataShareServiceStubTest, OnRemoteRequest001, TestSize.Level1) */ HWTEST_F(DataShareServiceStubTest, OnRemoteRequest002, TestSize.Level1) { + ZLOGI("DataShareServiceStubTest::OnRemoteRequest002 start"); + auto originalToken = GetSelfTokenID(); + SetSelfTokenID(SYSTEM_TOKENID); uint8_t value = TEST_DATA; uint8_t *data = &value; uint32_t code = static_cast(*data) % (CODE_MAX - CODE_MIN + 1) + CODE_MIN; @@ -84,6 +94,87 @@ HWTEST_F(DataShareServiceStubTest, OnRemoteRequest002, TestSize.Level1) result = dataShareServiceStub->OnNotifyConnectDone(request, reply); EXPECT_EQ(result, IDataShareService::DATA_SHARE_OK); + SetSelfTokenID(originalToken); + ZLOGI("DataShareServiceStubTest::OnRemoteRequest002 end"); +} + +/** +* @tc.name: OnRemoteRequest003 +* @tc.desc: test OnRemoteRequest abnormal scene +* @tc.type: FUNC +* @tc.require:SQL +*/ +HWTEST_F(DataShareServiceStubTest, OnRemoteRequest003, TestSize.Level1) +{ + ZLOGI("DataShareServiceStubTest::OnRemoteRequest003 start"); + uint32_t code = DataShare::DataShareServiceImpl::DATA_SHARE_SERVICE_CMD_ADD_TEMPLATE; + MessageParcel request; + MessageParcel reply; + auto result = dataShareServiceStub->OnRemoteRequest(code, request, reply); + EXPECT_EQ(result, E_NOT_SYSTEM_APP); + + code = DataShare::DataShareServiceImpl::DATA_SHARE_SERVICE_CMD_ADD_TEMPLATE_SYSTEM; + result = dataShareServiceStub->OnRemoteRequest(code, request, reply); + EXPECT_EQ(result, E_NOT_SYSTEM_APP); + + ZLOGI("DataShareServiceStubTest::OnRemoteRequest003 end"); +} + +/** +* @tc.name: OnRemoteRequest004 +* @tc.desc: test OnRemoteRequest abnormal scene +* @tc.type: FUNC +* @tc.require:SQL +*/ +HWTEST_F(DataShareServiceStubTest, OnRemoteRequest004, TestSize.Level1) +{ + ZLOGI("DataShareServiceStubTest::OnRemoteRequest004 start"); + auto originalToken = GetSelfTokenID(); + SetSelfTokenID(SYSTEM_TOKENID); + uint32_t code = DataShare::DataShareServiceImpl::DATA_SHARE_SERVICE_CMD_QUERY_SYSTEM; + MessageParcel request; + MessageParcel reply; + auto result = dataShareServiceStub->OnRemoteRequest(code, request, reply); + EXPECT_EQ(result, IDataShareService::DATA_SHARE_ERROR); + + SetSelfTokenID(originalToken); + ZLOGI("DataShareServiceStubTest::OnRemoteRequest004 end"); +} + +HWTEST_F(DataShareServiceStubTest, IsTemplateRequest001, TestSize.Level1) +{ + ZLOGI("DataShareServiceStubTest::IsTemplateRequest001 start"); + static uint32_t list[] = { + DataShare::DataShareServiceImpl::DATA_SHARE_SERVICE_CMD_ADD_TEMPLATE, + DataShare::DataShareServiceImpl::DATA_SHARE_SERVICE_CMD_DEL_TEMPLATE, + DataShare::DataShareServiceImpl::DATA_SHARE_SERVICE_CMD_PUBLISH, + DataShare::DataShareServiceImpl::DATA_SHARE_SERVICE_CMD_GET_DATA, + DataShare::DataShareServiceImpl::DATA_SHARE_SERVICE_CMD_SUBSCRIBE_RDB, + DataShare::DataShareServiceImpl::DATA_SHARE_SERVICE_CMD_UNSUBSCRIBE_RDB, + DataShare::DataShareServiceImpl::DATA_SHARE_SERVICE_CMD_ENABLE_SUBSCRIBE_RDB, + DataShare::DataShareServiceImpl::DATA_SHARE_SERVICE_CMD_DISABLE_SUBSCRIBE_RDB, + DataShare::DataShareServiceImpl::DATA_SHARE_SERVICE_CMD_SUBSCRIBE_PUBLISHED, + DataShare::DataShareServiceImpl::DATA_SHARE_SERVICE_CMD_UNSUBSCRIBE_PUBLISHED, + DataShare::DataShareServiceImpl::DATA_SHARE_SERVICE_CMD_ENABLE_SUBSCRIBE_PUBLISHED, + DataShare::DataShareServiceImpl::DATA_SHARE_SERVICE_CMD_DISABLE_SUBSCRIBE_PUBLISHED, + DataShare::DataShareServiceImpl::DATA_SHARE_SERVICE_CMD_NOTIFY_OBSERVERS + }; + for (auto code : list) { + auto result = dataShareServiceStub->IsTemplateRequest(code); + EXPECT_EQ(result, true); + } + + auto result = dataShareServiceStub->IsTemplateRequest( + DataShare::DataShareServiceImpl::DATA_SHARE_SERVICE_CMD_QUERY); + EXPECT_EQ(result, false); + + // code out of range is false + for (int32_t code = DataShare::DataShareServiceImpl::DATA_SHARE_SERVICE_CMD_NOTIFY_OBSERVERS + 1; + code <= DataShare::DataShareServiceImpl::DATA_SHARE_SERVICE_CMD_MAX; code++) { + auto result = dataShareServiceStub->IsTemplateRequest(code); + EXPECT_EQ(result, false); + } + ZLOGI("DataShareServiceStubTest::IsTemplateRequest001 end"); } /** -- Gitee