From 13bc3a9f39543529b8cbfbae3edfd7ce3bd626c3 Mon Sep 17 00:00:00 2001 From: zhangdi Date: Wed, 18 Jun 2025 11:36:05 +0800 Subject: [PATCH 1/3] =?UTF-8?q?VerifyPromiseInfo=E6=B7=BB=E5=8A=A0token?= =?UTF-8?q?=E5=9C=BA=E6=99=AF=E6=A0=A1=E9=AA=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: zhangdi --- .../service/rdb/rdb_service_impl.cpp | 7 +- .../service/test/BUILD.gn | 70 +++ .../service/test/mock/access_token_mock.cpp | 8 + .../service/test/mock/access_token_mock.h | 2 + .../test/rdb_service_impl_token_test.cpp | 408 ++++++++++++++++++ 5 files changed, 494 insertions(+), 1 deletion(-) create mode 100644 services/distributeddataservice/service/test/rdb_service_impl_token_test.cpp diff --git a/services/distributeddataservice/service/rdb/rdb_service_impl.cpp b/services/distributeddataservice/service/rdb/rdb_service_impl.cpp index d0ffa6fe5..234c10d59 100644 --- a/services/distributeddataservice/service/rdb/rdb_service_impl.cpp +++ b/services/distributeddataservice/service/rdb/rdb_service_impl.cpp @@ -1753,7 +1753,12 @@ int32_t RdbServiceImpl::VerifyPromiseInfo(const RdbSyncerParam ¶m) return RDB_ERROR; } ATokenTypeEnum type = AccessTokenKit::GetTokenType(tokenId); - if (type == ATokenTypeEnum::TOKEN_NATIVE) { + if (type == ATokenTypeEnum::TOKEN_INVALID) { + ZLOGE("invalid type! bundleName:%{public}s, storeName:%{public}s ", + meta.bundleName.c_str(), meta.storeId.c_str()); + return RDB_ERROR; + } + if (type == ATokenTypeEnum::TOKEN_NATIVE || type == ATokenTypeEnum::TOKEN_SHELL) { auto tokenIdRet = std::find(localMeta.promiseInfo.tokenIds.begin(), localMeta.promiseInfo.tokenIds.end(), tokenId); auto uidRet = std::find(localMeta.promiseInfo.uids.begin(), localMeta.promiseInfo.uids.end(), uid); diff --git a/services/distributeddataservice/service/test/BUILD.gn b/services/distributeddataservice/service/test/BUILD.gn index 142b49211..a3ff7c08e 100644 --- a/services/distributeddataservice/service/test/BUILD.gn +++ b/services/distributeddataservice/service/test/BUILD.gn @@ -616,6 +616,75 @@ ohos_unittest("RdbServiceImplTest") { ] } +ohos_unittest("RdbServiceImplTokenTest") { + sanitize = { + cfi = true + cfi_cross_dso = true + debug = false + } + module_out_path = module_output_path + sources = [ + "mock/access_token_mock.cpp", + "mock/checker_mock.cpp", + "mock/db_change_data_mock.cpp", + "mock/db_store_mock.cpp", + "rdb_service_impl_token_test.cpp", + ] + + include_dirs = [ + "${data_service_path}/adapter/include/communicator", + "${data_service_path}/framework/include/eventcenter", + "${data_service_path}/service/test/mock", + ] + + defines = [ + "TEST_ON_DEVICE", + "OPENSSL_SUPPRESS_DEPRECATED", + ] + cflags = [ + "-Werror", + "-Dprivate=public", + "-Dprotected=public", + "-Wno-multichar", + "-Wno-c99-designator", + "-fno-access-control", # Ignore Private Member Access Control + ] + + external_deps = [ + "ability_base:base", + "ability_base:want", + "access_token:libaccesstoken_sdk", + "access_token:libnativetoken", + "access_token:libtokenid_sdk", + "bundle_framework:appexecfwk_base", + "bundle_framework:appexecfwk_core", + "c_utils:utils", + "data_share:datashare_common", + "data_share:datashare_consumer", + "device_manager:devicemanagersdk", + "dsoftbus:softbus_client", + "googletest:gmock_main", + "googletest:gtest_main", + "hicollie:libhicollie", + "hilog:libhilog", + "hisysevent:libhisysevent", + "huks:libhukssdk", + "ipc:ipc_core", + "kv_store:datamgr_common", + "kv_store:distributeddata_inner", + "kv_store:distributeddb", + "relational_store:native_rdb", + "resource_management:global_resmgr", + ] + + deps = [ + "${data_service_path}/adapter/utils:distributeddata_utils", + "${data_service_path}/framework:distributeddatasvcfwk", + "${data_service_path}/service:distributeddatasvc", + "${data_service_path}/service/rdb:distributeddata_rdb", + ] +} + ohos_unittest("ObjectAssetLoaderTest") { module_out_path = module_output_path sources = [ @@ -1991,6 +2060,7 @@ group("unittest") { deps += [ ":RdbResultSetImplTest", ":RdbServiceImplTest", + ":RdbServiceImplTokenTest", ":RdbServiceTest", ] } diff --git a/services/distributeddataservice/service/test/mock/access_token_mock.cpp b/services/distributeddataservice/service/test/mock/access_token_mock.cpp index 2d80d5263..c0fe454a6 100644 --- a/services/distributeddataservice/service/test/mock/access_token_mock.cpp +++ b/services/distributeddataservice/service/test/mock/access_token_mock.cpp @@ -22,6 +22,14 @@ ATokenTypeEnum AccessTokenKit::GetTokenTypeFlag(AccessTokenID tokenID) return BAccessTokenKit::accessTokenkit->GetTokenTypeFlag(tokenID); } +ATokenTypeEnum AccessTokenKit::GetTokenType(AccessTokenID tokenID) +{ + if (BAccessTokenKit::accessTokenkit == nullptr) { + return ATokenTypeEnum::TOKEN_INVALID; + } + return BAccessTokenKit::accessTokenkit->GetTokenType(tokenID); +} + int AccessTokenKit::GetHapTokenInfo(AccessTokenID tokenID, HapTokenInfo& hapTokenInfoRes) { return BAccessTokenKit::accessTokenkit->GetHapTokenInfo(tokenID, hapTokenInfoRes); diff --git a/services/distributeddataservice/service/test/mock/access_token_mock.h b/services/distributeddataservice/service/test/mock/access_token_mock.h index 110dde08e..e02b6d0d4 100644 --- a/services/distributeddataservice/service/test/mock/access_token_mock.h +++ b/services/distributeddataservice/service/test/mock/access_token_mock.h @@ -25,6 +25,7 @@ namespace AccessToken { class BAccessTokenKit { public: virtual ATokenTypeEnum GetTokenTypeFlag(AccessTokenID) = 0; + virtual ATokenTypeEnum GetTokenType(AccessTokenID) = 0; virtual int GetHapTokenInfo(AccessTokenID, HapTokenInfo&) = 0; virtual int GetNativeTokenInfo(AccessTokenID, NativeTokenInfo&) = 0; virtual int VerifyAccessToken(AccessTokenID, const std::string&) = 0; @@ -37,6 +38,7 @@ private: class AccessTokenKitMock : public BAccessTokenKit { public: MOCK_METHOD(ATokenTypeEnum, GetTokenTypeFlag, (AccessTokenID)); + MOCK_METHOD(ATokenTypeEnum, GetTokenType, (AccessTokenID)); MOCK_METHOD(int, GetHapTokenInfo, (AccessTokenID, HapTokenInfo&)); MOCK_METHOD(int, GetNativeTokenInfo, (AccessTokenID, NativeTokenInfo&)); MOCK_METHOD(int, VerifyAccessToken, (AccessTokenID, const std::string&)); diff --git a/services/distributeddataservice/service/test/rdb_service_impl_token_test.cpp b/services/distributeddataservice/service/test/rdb_service_impl_token_test.cpp new file mode 100644 index 000000000..0fcc72c7e --- /dev/null +++ b/services/distributeddataservice/service/test/rdb_service_impl_token_test.cpp @@ -0,0 +1,408 @@ +/* + * Copyright (c) 2025 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 "account/account_delegate.h" +#include "rdb_service_impl.h" +#include "ipc_skeleton.h" +#include "gmock/gmock.h" +#include "mock/access_token_mock.h" +#include "bootstrap.h" +#include "checker_mock.h" +#include "crypto_manager.h" +#include "device_manager_adapter.h" +#include "device_matrix.h" +#include "metadata/meta_data_manager.h" +#include "metadata/store_meta_data.h" +#include "metadata/store_meta_data_local.h" +#include "mock/db_store_mock.h" +#include "rdb_types.h" +#include "relational_store_manager.h" +#include "gtest/gtest.h" +#include "directory/directory_manager.h" +using namespace OHOS::DistributedRdb; +using namespace OHOS::DistributedData; +using namespace DistributedDB; +using namespace OHOS::Security::AccessToken; +using namespace testing::ext; +using namespace testing; +using namespace std; +using DmAdapter = OHOS::DistributedData::DeviceManagerAdapter; + +namespace OHOS::Test { +namespace DistributedRDBTest { + +static constexpr const char *TEST_BUNDLE = "test_rdb_service_impl_bundleName"; +static constexpr const char *TEST_APPID = "test_rdb_service_impl_appid"; +static constexpr const char *TEST_STORE = "test_rdb_service_impl_store"; + +class RdbServiceImplTokenTest : public testing::Test { +public: + static void SetUpTestCase(void); + static void TearDownTestCase(void); + static void InitMetaData(); + void SetUp(); + void TearDown(); +protected: + static inline std::shared_ptr accTokenMock = nullptr; + static std::shared_ptr dbStoreMock_; + static StoreMetaData metaData_; + static CheckerMock checkerMock_; + static void InitMetaDataManager(); +}; +std::shared_ptr RdbServiceImplTokenTest::dbStoreMock_ = std::make_shared(); +StoreMetaData RdbServiceImplTokenTest::metaData_; +CheckerMock RdbServiceImplTokenTest::checkerMock_; + + +void RdbServiceImplTokenTest::InitMetaData() +{ + metaData_.deviceId = DmAdapter::GetInstance().GetLocalDevice().uuid; + metaData_.appId = TEST_APPID; + metaData_.bundleName = TEST_BUNDLE; + metaData_.tokenId = OHOS::IPCSkeleton::GetCallingTokenID(); + metaData_.user = std::to_string(AccountDelegate::GetInstance()->GetUserByToken(metaData_.tokenId)); + metaData_.area = OHOS::DistributedKv::EL1; + metaData_.instanceId = -1; + metaData_.isAutoSync = true; + metaData_.storeType = DistributedRdb::RDB_DEVICE_COLLABORATION; + metaData_.storeId = TEST_STORE; + metaData_.dataDir = DirectoryManager::GetInstance().GetStorePath(metaData_) + "/" + TEST_STORE; +} + +void RdbServiceImplTokenTest::InitMetaDataManager() +{ + MetaDataManager::GetInstance().Initialize(dbStoreMock_, nullptr, ""); + MetaDataManager::GetInstance().SetSyncer([](const auto &, auto) { + DeviceMatrix::GetInstance().OnChanged(DeviceMatrix::META_STORE_MASK); + }); +} + +void RdbServiceImplTokenTest::SetUpTestCase() +{ + accTokenMock = std::make_shared(); + BAccessTokenKit::accessTokenkit = accTokenMock; + size_t max = 12; + size_t min = 5; + auto dmExecutor = std::make_shared(max, min); + DeviceManagerAdapter::GetInstance().Init(dmExecutor); + InitMetaData(); + Bootstrap::GetInstance().LoadCheckers(); + CryptoManager::GetInstance().GenerateRootKey(); +} + +void RdbServiceImplTokenTest::TearDownTestCase() +{ + accTokenMock = nullptr; + BAccessTokenKit::accessTokenkit = nullptr; +} + +void RdbServiceImplTokenTest::SetUp() +{ +} + +void RdbServiceImplTokenTest::TearDown() +{ +} + +/** + * @tc.name: VerifyPromiseInfo001 + * @tc.desc: Test VerifyPromiseInfo when Store not exist. + * @tc.type: FUNC + * @tc.require: + * @tc.author: zd + */ +HWTEST_F(RdbServiceImplTokenTest, VerifyPromiseInfo001, TestSize.Level0) +{ + EXPECT_CALL(*accTokenMock, GetTokenType(testing::_)) + .WillOnce(testing::Return(ATokenTypeEnum::TOKEN_INVALID)) + .WillRepeatedly(testing::Return(ATokenTypeEnum::TOKEN_INVALID)); + RdbServiceImpl service; + RdbSyncerParam param; + int32_t result = service.VerifyPromiseInfo(param); + + EXPECT_EQ(result, RDB_ERROR); +} + +/** + * @tc.name: VerifyPromiseInfo002 + * @tc.desc: Test VerifyPromiseInfo when tokenId is INVALID. + * @tc.type: FUNC + * @tc.require: + * @tc.author: zd + */ +HWTEST_F(RdbServiceImplTokenTest, VerifyPromiseInfo002, TestSize.Level0) +{ + InitMetaDataManager(); + StoreMetaDataLocal localMeta; + auto tokenId = IPCSkeleton::GetCallingTokenID(); + localMeta.isAutoSync = true; + localMeta.promiseInfo.tokenIds = {tokenId}; + localMeta.promiseInfo.uids = {}; + localMeta.promiseInfo.permissionNames = {}; + EXPECT_EQ(MetaDataManager::GetInstance().SaveMeta(metaData_.GetKeyLocal(), localMeta, true), true); + + EXPECT_CALL(*accTokenMock, GetTokenType(testing::_)) + .WillOnce(testing::Return(ATokenTypeEnum::TOKEN_INVALID)) + .WillRepeatedly(testing::Return(ATokenTypeEnum::TOKEN_INVALID)); + RdbServiceImpl service; + RdbSyncerParam param; + param.bundleName_ = metaData_.bundleName; + param.type_ = metaData_.storeType; + param.level_ = metaData_.securityLevel; + param.area_ = metaData_.area; + param.hapName_ = metaData_.bundleName; + param.storeName_ = metaData_.storeId; + param.isEncrypt_ = metaData_.isEncrypt; + param.isSearchable_ = metaData_.isSearchable; + param.haMode_ = metaData_.haMode; + param.asyncDownloadAsset_ = metaData_.asyncDownloadAsset; + param.user_ = metaData_.user; + int32_t result = service.VerifyPromiseInfo(param); + + EXPECT_EQ(result, RDB_ERROR); + EXPECT_EQ(MetaDataManager::GetInstance().DelMeta(metaData_.GetKeyLocal(), true), true); +} + +/** + * @tc.name: VerifyPromiseInfo003 + * @tc.desc: Test VerifyPromiseInfo when tokenId is in promiseInfo and tokenid is TOKEN_SHELL. + * @tc.type: FUNC + * @tc.require: + * @tc.author: zd + */ +HWTEST_F(RdbServiceImplTokenTest, VerifyPromiseInfo003, TestSize.Level0) +{ + StoreMetaDataLocal localMeta; + auto tokenId = IPCSkeleton::GetCallingTokenID(); + localMeta.isAutoSync = true; + localMeta.promiseInfo.tokenIds = {tokenId}; + localMeta.promiseInfo.uids = {}; + localMeta.promiseInfo.permissionNames = {}; + EXPECT_EQ(MetaDataManager::GetInstance().SaveMeta(metaData_.GetKeyLocal(), localMeta, true), true); + + EXPECT_CALL(*accTokenMock, GetTokenType(testing::_)) + .WillOnce(testing::Return(ATokenTypeEnum::TOKEN_SHELL)) + .WillRepeatedly(testing::Return(ATokenTypeEnum::TOKEN_SHELL)); + RdbServiceImpl service; + RdbSyncerParam param; + param.bundleName_ = metaData_.bundleName; + param.type_ = metaData_.storeType; + param.level_ = metaData_.securityLevel; + param.area_ = metaData_.area; + param.hapName_ = metaData_.bundleName; + param.storeName_ = metaData_.storeId; + param.isEncrypt_ = metaData_.isEncrypt; + param.isSearchable_ = metaData_.isSearchable; + param.haMode_ = metaData_.haMode; + param.asyncDownloadAsset_ = metaData_.asyncDownloadAsset; + param.user_ = metaData_.user; + int32_t result = service.VerifyPromiseInfo(param); + + EXPECT_EQ(result, RDB_OK); + EXPECT_EQ(MetaDataManager::GetInstance().DelMeta(metaData_.GetKeyLocal(), true), true); +} + +/** + * @tc.name: VerifyPromiseInfo004 + * @tc.desc: Test VerifyPromiseInfo when tokenId is not in promiseInfo and tokenid is TOKEN_SHELL. + * @tc.type: FUNC + * @tc.require: + * @tc.author: zd + */ +HWTEST_F(RdbServiceImplTokenTest, VerifyPromiseInfo004, TestSize.Level0) +{ + StoreMetaDataLocal localMeta; + localMeta.isAutoSync = true; + localMeta.promiseInfo.tokenIds = {}; + localMeta.promiseInfo.uids = {}; + localMeta.promiseInfo.permissionNames = {}; + EXPECT_EQ(MetaDataManager::GetInstance().SaveMeta(metaData_.GetKeyLocal(), localMeta, true), true); + + EXPECT_CALL(*accTokenMock, GetTokenType(testing::_)) + .WillOnce(testing::Return(ATokenTypeEnum::TOKEN_SHELL)) + .WillRepeatedly(testing::Return(ATokenTypeEnum::TOKEN_SHELL)); + RdbServiceImpl service; + RdbSyncerParam param; + param.bundleName_ = metaData_.bundleName; + param.type_ = metaData_.storeType; + param.level_ = metaData_.securityLevel; + param.area_ = metaData_.area; + param.hapName_ = metaData_.bundleName; + param.storeName_ = metaData_.storeId; + param.isEncrypt_ = metaData_.isEncrypt; + param.isSearchable_ = metaData_.isSearchable; + param.haMode_ = metaData_.haMode; + param.asyncDownloadAsset_ = metaData_.asyncDownloadAsset; + param.user_ = metaData_.user; + int32_t result = service.VerifyPromiseInfo(param); + + EXPECT_EQ(result, RDB_ERROR); + EXPECT_EQ(MetaDataManager::GetInstance().DelMeta(metaData_.GetKeyLocal(), true), true); +} + +/** + * @tc.name: VerifyPromiseInfo005 + * @tc.desc: Test VerifyPromiseInfo when tokenId is in promiseInfo and tokenid is TOKEN_NATIVE. + * @tc.type: FUNC + * @tc.require: + * @tc.author: zd + */ +HWTEST_F(RdbServiceImplTokenTest, VerifyPromiseInfo005, TestSize.Level0) +{ + StoreMetaDataLocal localMeta; + auto tokenId = IPCSkeleton::GetCallingTokenID(); + localMeta.isAutoSync = true; + localMeta.promiseInfo.tokenIds = {tokenId}; + localMeta.promiseInfo.uids = {}; + localMeta.promiseInfo.permissionNames = {}; + EXPECT_EQ(MetaDataManager::GetInstance().SaveMeta(metaData_.GetKeyLocal(), localMeta, true), true); + + EXPECT_CALL(*accTokenMock, GetTokenType(testing::_)) + .WillOnce(testing::Return(ATokenTypeEnum::TOKEN_NATIVE)) + .WillRepeatedly(testing::Return(ATokenTypeEnum::TOKEN_NATIVE)); + RdbServiceImpl service; + RdbSyncerParam param; + param.bundleName_ = metaData_.bundleName; + param.type_ = metaData_.storeType; + param.level_ = metaData_.securityLevel; + param.area_ = metaData_.area; + param.hapName_ = metaData_.bundleName; + param.storeName_ = metaData_.storeId; + param.isEncrypt_ = metaData_.isEncrypt; + param.isSearchable_ = metaData_.isSearchable; + param.haMode_ = metaData_.haMode; + param.asyncDownloadAsset_ = metaData_.asyncDownloadAsset; + param.user_ = metaData_.user; + int32_t result = service.VerifyPromiseInfo(param); + + EXPECT_EQ(result, RDB_OK); + EXPECT_EQ(MetaDataManager::GetInstance().DelMeta(metaData_.GetKeyLocal(), true), true); +} + +/** + * @tc.name: VerifyPromiseInfo006 + * @tc.desc: Test VerifyPromiseInfo when tokenId is not in promiseInfo and tokenid is TOKEN_NATIVE. + * @tc.type: FUNC + * @tc.require: + * @tc.author: zd + */ +HWTEST_F(RdbServiceImplTokenTest, VerifyPromiseInfo006, TestSize.Level0) +{ + StoreMetaDataLocal localMeta; + localMeta.isAutoSync = true; + localMeta.promiseInfo.tokenIds = {}; + localMeta.promiseInfo.uids = {}; + localMeta.promiseInfo.permissionNames = {}; + EXPECT_EQ(MetaDataManager::GetInstance().SaveMeta(metaData_.GetKeyLocal(), localMeta, true), true); + + EXPECT_CALL(*accTokenMock, GetTokenType(testing::_)) + .WillOnce(testing::Return(ATokenTypeEnum::TOKEN_NATIVE)) + .WillRepeatedly(testing::Return(ATokenTypeEnum::TOKEN_NATIVE)); + RdbServiceImpl service; + RdbSyncerParam param; + param.bundleName_ = metaData_.bundleName; + param.type_ = metaData_.storeType; + param.level_ = metaData_.securityLevel; + param.area_ = metaData_.area; + param.hapName_ = metaData_.bundleName; + param.storeName_ = metaData_.storeId; + param.isEncrypt_ = metaData_.isEncrypt; + param.isSearchable_ = metaData_.isSearchable; + param.haMode_ = metaData_.haMode; + param.asyncDownloadAsset_ = metaData_.asyncDownloadAsset; + param.user_ = metaData_.user; + int32_t result = service.VerifyPromiseInfo(param); + + EXPECT_EQ(result, RDB_ERROR); + EXPECT_EQ(MetaDataManager::GetInstance().DelMeta(metaData_.GetKeyLocal(), true), true); +} +/** + * @tc.name: VerifyPromiseInfo007 + * @tc.desc: Test VerifyPromiseInfo when permissionNames is not in promiseInfo and tokenid is TOKEN_HAP. + * @tc.type: FUNC + * @tc.require: + * @tc.author: zd + */ +HWTEST_F(RdbServiceImplTokenTest, VerifyPromiseInfo007, TestSize.Level0) +{ + StoreMetaDataLocal localMeta; + auto tokenId = IPCSkeleton::GetCallingTokenID(); + localMeta.isAutoSync = true; + localMeta.promiseInfo.tokenIds = {tokenId}; + localMeta.promiseInfo.uids = {}; + localMeta.promiseInfo.permissionNames = {}; + EXPECT_EQ(MetaDataManager::GetInstance().SaveMeta(metaData_.GetKeyLocal(), localMeta, true), true); + + EXPECT_CALL(*accTokenMock, GetTokenType(testing::_)) + .WillOnce(testing::Return(ATokenTypeEnum::TOKEN_HAP)) + .WillRepeatedly(testing::Return(ATokenTypeEnum::TOKEN_HAP)); + RdbServiceImpl service; + RdbSyncerParam param; + param.bundleName_ = metaData_.bundleName; + param.type_ = metaData_.storeType; + param.level_ = metaData_.securityLevel; + param.area_ = metaData_.area; + param.hapName_ = metaData_.bundleName; + param.storeName_ = metaData_.storeId; + param.isEncrypt_ = metaData_.isEncrypt; + param.isSearchable_ = metaData_.isSearchable; + param.haMode_ = metaData_.haMode; + param.asyncDownloadAsset_ = metaData_.asyncDownloadAsset; + param.user_ = metaData_.user; + int32_t result = service.VerifyPromiseInfo(param); + + EXPECT_EQ(result, RDB_ERROR); + EXPECT_EQ(MetaDataManager::GetInstance().DelMeta(metaData_.GetKeyLocal(), true), true); +} + +/** + * @tc.name: VerifyPromiseInfo008 + * @tc.desc: Test VerifyPromiseInfo when permissionNames is in promiseInfo and tokenid is TOKEN_HAP. + * @tc.type: FUNC + * @tc.require: + * @tc.author: zd + */ +HWTEST_F(RdbServiceImplTokenTest, VerifyPromiseInfo008, TestSize.Level0) +{ + StoreMetaDataLocal localMeta; + auto tokenId = IPCSkeleton::GetCallingTokenID(); + localMeta.isAutoSync = true; + localMeta.promiseInfo.tokenIds = {tokenId}; + localMeta.promiseInfo.uids = {}; + localMeta.promiseInfo.permissionNames = {TEST_BUNDLE}; + EXPECT_EQ(MetaDataManager::GetInstance().SaveMeta(metaData_.GetKeyLocal(), localMeta, true), true); + + EXPECT_CALL(*accTokenMock, GetTokenType(testing::_)) + .WillOnce(testing::Return(ATokenTypeEnum::TOKEN_HAP)) + .WillRepeatedly(testing::Return(ATokenTypeEnum::TOKEN_HAP)); + RdbServiceImpl service; + RdbSyncerParam param; + param.bundleName_ = metaData_.bundleName; + param.type_ = metaData_.storeType; + param.level_ = metaData_.securityLevel; + param.area_ = metaData_.area; + param.hapName_ = metaData_.bundleName; + param.storeName_ = metaData_.storeId; + param.isEncrypt_ = metaData_.isEncrypt; + param.isSearchable_ = metaData_.isSearchable; + param.haMode_ = metaData_.haMode; + param.asyncDownloadAsset_ = metaData_.asyncDownloadAsset; + param.user_ = metaData_.user; + int32_t result = service.VerifyPromiseInfo(param); + + EXPECT_EQ(result, RDB_OK); + EXPECT_EQ(MetaDataManager::GetInstance().DelMeta(metaData_.GetKeyLocal(), true), true); +} +} // namespace DistributedRDBTest +} // namespace OHOS::Test \ No newline at end of file -- Gitee From 68f3141229f1f8d2774dc22821d46ddb050bdb1d Mon Sep 17 00:00:00 2001 From: zhangdi Date: Thu, 19 Jun 2025 16:04:46 +0800 Subject: [PATCH 2/3] =?UTF-8?q?=E5=8C=BF=E5=90=8D=E5=8C=96=E6=97=A5?= =?UTF-8?q?=E5=BF=97=E6=89=93=E5=8D=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: zhangdi --- .../service/rdb/rdb_service_impl.cpp | 16 ++- .../service/test/BUILD.gn | 1 - .../test/rdb_service_impl_token_test.cpp | 116 +++++------------- 3 files changed, 38 insertions(+), 95 deletions(-) diff --git a/services/distributeddataservice/service/rdb/rdb_service_impl.cpp b/services/distributeddataservice/service/rdb/rdb_service_impl.cpp index 234c10d59..6a15c4105 100644 --- a/services/distributeddataservice/service/rdb/rdb_service_impl.cpp +++ b/services/distributeddataservice/service/rdb/rdb_service_impl.cpp @@ -1749,15 +1749,10 @@ int32_t RdbServiceImpl::VerifyPromiseInfo(const RdbSyncerParam ¶m) auto isCreated = MetaDataManager::GetInstance().LoadMeta(meta.GetKeyLocal(), localMeta, true); if (!isCreated) { ZLOGE("Store not exist. bundleName:%{public}s, storeName:%{public}s", meta.bundleName.c_str(), - meta.storeId.c_str()); + Anonymous::Change(meta.storeId).c_str()); return RDB_ERROR; } ATokenTypeEnum type = AccessTokenKit::GetTokenType(tokenId); - if (type == ATokenTypeEnum::TOKEN_INVALID) { - ZLOGE("invalid type! bundleName:%{public}s, storeName:%{public}s ", - meta.bundleName.c_str(), meta.storeId.c_str()); - return RDB_ERROR; - } if (type == ATokenTypeEnum::TOKEN_NATIVE || type == ATokenTypeEnum::TOKEN_SHELL) { auto tokenIdRet = std::find(localMeta.promiseInfo.tokenIds.begin(), localMeta.promiseInfo.tokenIds.end(), tokenId); @@ -1770,15 +1765,18 @@ int32_t RdbServiceImpl::VerifyPromiseInfo(const RdbSyncerParam ¶m) !isPromise) { return RDB_ERROR; } - } - if (type == ATokenTypeEnum::TOKEN_HAP) { - for (const auto& permissionName : localMeta.promiseInfo.permissionNames) { + } else if (type == ATokenTypeEnum::TOKEN_HAP) { + for (const auto &permissionName : localMeta.promiseInfo.permissionNames) { if (PermitDelegate::VerifyPermission(permissionName, tokenId)) { return RDB_OK; } } ZLOGE("Permission denied! tokenId:0x%{public}x", tokenId); return RDB_ERROR; + } else { + ZLOGE("invalid type! bundleName:%{public}s, storeName:%{public}s, token_type is %{public}d.", + meta.bundleName.c_str(), Anonymous::Change(meta.storeId).c_str(), type); + return RDB_ERROR; } return RDB_OK; } diff --git a/services/distributeddataservice/service/test/BUILD.gn b/services/distributeddataservice/service/test/BUILD.gn index a3ff7c08e..d69c2976a 100644 --- a/services/distributeddataservice/service/test/BUILD.gn +++ b/services/distributeddataservice/service/test/BUILD.gn @@ -643,7 +643,6 @@ ohos_unittest("RdbServiceImplTokenTest") { ] cflags = [ "-Werror", - "-Dprivate=public", "-Dprotected=public", "-Wno-multichar", "-Wno-c99-designator", diff --git a/services/distributeddataservice/service/test/rdb_service_impl_token_test.cpp b/services/distributeddataservice/service/test/rdb_service_impl_token_test.cpp index 0fcc72c7e..14f826364 100644 --- a/services/distributeddataservice/service/test/rdb_service_impl_token_test.cpp +++ b/services/distributeddataservice/service/test/rdb_service_impl_token_test.cpp @@ -59,6 +59,7 @@ protected: static StoreMetaData metaData_; static CheckerMock checkerMock_; static void InitMetaDataManager(); + static void GetRdbSyncerParam(RdbSyncerParam ¶m); }; std::shared_ptr RdbServiceImplTokenTest::dbStoreMock_ = std::make_shared(); StoreMetaData RdbServiceImplTokenTest::metaData_; @@ -115,9 +116,24 @@ void RdbServiceImplTokenTest::TearDown() { } +void RdbServiceImplTokenTest::GetRdbSyncerParam(RdbSyncerParam ¶m) +{ + param.bundleName_ = metaData_.bundleName; + param.type_ = metaData_.storeType; + param.level_ = metaData_.securityLevel; + param.area_ = metaData_.area; + param.hapName_ = metaData_.bundleName; + param.storeName_ = metaData_.storeId; + param.isEncrypt_ = metaData_.isEncrypt; + param.isSearchable_ = metaData_.isSearchable; + param.haMode_ = metaData_.haMode; + param.asyncDownloadAsset_ = metaData_.asyncDownloadAsset; + param.user_ = metaData_.user; +} + /** * @tc.name: VerifyPromiseInfo001 - * @tc.desc: Test VerifyPromiseInfo when Store not exist. + * @tc.desc: Test VerifyPromiseInfo when tokenId and uid are not in promiseInfo. * @tc.type: FUNC * @tc.require: * @tc.author: zd @@ -136,7 +152,7 @@ HWTEST_F(RdbServiceImplTokenTest, VerifyPromiseInfo001, TestSize.Level0) /** * @tc.name: VerifyPromiseInfo002 - * @tc.desc: Test VerifyPromiseInfo when tokenId is INVALID. + * @tc.desc: Test VerifyPromiseInfo when tokenId and uid are not in promiseInfo. * @tc.type: FUNC * @tc.require: * @tc.author: zd @@ -157,17 +173,7 @@ HWTEST_F(RdbServiceImplTokenTest, VerifyPromiseInfo002, TestSize.Level0) .WillRepeatedly(testing::Return(ATokenTypeEnum::TOKEN_INVALID)); RdbServiceImpl service; RdbSyncerParam param; - param.bundleName_ = metaData_.bundleName; - param.type_ = metaData_.storeType; - param.level_ = metaData_.securityLevel; - param.area_ = metaData_.area; - param.hapName_ = metaData_.bundleName; - param.storeName_ = metaData_.storeId; - param.isEncrypt_ = metaData_.isEncrypt; - param.isSearchable_ = metaData_.isSearchable; - param.haMode_ = metaData_.haMode; - param.asyncDownloadAsset_ = metaData_.asyncDownloadAsset; - param.user_ = metaData_.user; + GetRdbSyncerParam(param); int32_t result = service.VerifyPromiseInfo(param); EXPECT_EQ(result, RDB_ERROR); @@ -176,7 +182,7 @@ HWTEST_F(RdbServiceImplTokenTest, VerifyPromiseInfo002, TestSize.Level0) /** * @tc.name: VerifyPromiseInfo003 - * @tc.desc: Test VerifyPromiseInfo when tokenId is in promiseInfo and tokenid is TOKEN_SHELL. + * @tc.desc: Test VerifyPromiseInfo when tokenId and uid are not in promiseInfo. * @tc.type: FUNC * @tc.require: * @tc.author: zd @@ -196,17 +202,7 @@ HWTEST_F(RdbServiceImplTokenTest, VerifyPromiseInfo003, TestSize.Level0) .WillRepeatedly(testing::Return(ATokenTypeEnum::TOKEN_SHELL)); RdbServiceImpl service; RdbSyncerParam param; - param.bundleName_ = metaData_.bundleName; - param.type_ = metaData_.storeType; - param.level_ = metaData_.securityLevel; - param.area_ = metaData_.area; - param.hapName_ = metaData_.bundleName; - param.storeName_ = metaData_.storeId; - param.isEncrypt_ = metaData_.isEncrypt; - param.isSearchable_ = metaData_.isSearchable; - param.haMode_ = metaData_.haMode; - param.asyncDownloadAsset_ = metaData_.asyncDownloadAsset; - param.user_ = metaData_.user; + GetRdbSyncerParam(param); int32_t result = service.VerifyPromiseInfo(param); EXPECT_EQ(result, RDB_OK); @@ -215,7 +211,7 @@ HWTEST_F(RdbServiceImplTokenTest, VerifyPromiseInfo003, TestSize.Level0) /** * @tc.name: VerifyPromiseInfo004 - * @tc.desc: Test VerifyPromiseInfo when tokenId is not in promiseInfo and tokenid is TOKEN_SHELL. + * @tc.desc: Test VerifyPromiseInfo when tokenId and uid are not in promiseInfo. * @tc.type: FUNC * @tc.require: * @tc.author: zd @@ -234,17 +230,7 @@ HWTEST_F(RdbServiceImplTokenTest, VerifyPromiseInfo004, TestSize.Level0) .WillRepeatedly(testing::Return(ATokenTypeEnum::TOKEN_SHELL)); RdbServiceImpl service; RdbSyncerParam param; - param.bundleName_ = metaData_.bundleName; - param.type_ = metaData_.storeType; - param.level_ = metaData_.securityLevel; - param.area_ = metaData_.area; - param.hapName_ = metaData_.bundleName; - param.storeName_ = metaData_.storeId; - param.isEncrypt_ = metaData_.isEncrypt; - param.isSearchable_ = metaData_.isSearchable; - param.haMode_ = metaData_.haMode; - param.asyncDownloadAsset_ = metaData_.asyncDownloadAsset; - param.user_ = metaData_.user; + GetRdbSyncerParam(param); int32_t result = service.VerifyPromiseInfo(param); EXPECT_EQ(result, RDB_ERROR); @@ -253,7 +239,7 @@ HWTEST_F(RdbServiceImplTokenTest, VerifyPromiseInfo004, TestSize.Level0) /** * @tc.name: VerifyPromiseInfo005 - * @tc.desc: Test VerifyPromiseInfo when tokenId is in promiseInfo and tokenid is TOKEN_NATIVE. + * @tc.desc: Test VerifyPromiseInfo when tokenId and uid are not in promiseInfo. * @tc.type: FUNC * @tc.require: * @tc.author: zd @@ -273,17 +259,7 @@ HWTEST_F(RdbServiceImplTokenTest, VerifyPromiseInfo005, TestSize.Level0) .WillRepeatedly(testing::Return(ATokenTypeEnum::TOKEN_NATIVE)); RdbServiceImpl service; RdbSyncerParam param; - param.bundleName_ = metaData_.bundleName; - param.type_ = metaData_.storeType; - param.level_ = metaData_.securityLevel; - param.area_ = metaData_.area; - param.hapName_ = metaData_.bundleName; - param.storeName_ = metaData_.storeId; - param.isEncrypt_ = metaData_.isEncrypt; - param.isSearchable_ = metaData_.isSearchable; - param.haMode_ = metaData_.haMode; - param.asyncDownloadAsset_ = metaData_.asyncDownloadAsset; - param.user_ = metaData_.user; + GetRdbSyncerParam(param); int32_t result = service.VerifyPromiseInfo(param); EXPECT_EQ(result, RDB_OK); @@ -292,7 +268,7 @@ HWTEST_F(RdbServiceImplTokenTest, VerifyPromiseInfo005, TestSize.Level0) /** * @tc.name: VerifyPromiseInfo006 - * @tc.desc: Test VerifyPromiseInfo when tokenId is not in promiseInfo and tokenid is TOKEN_NATIVE. + * @tc.desc: Test VerifyPromiseInfo when tokenId and uid are not in promiseInfo. * @tc.type: FUNC * @tc.require: * @tc.author: zd @@ -311,17 +287,7 @@ HWTEST_F(RdbServiceImplTokenTest, VerifyPromiseInfo006, TestSize.Level0) .WillRepeatedly(testing::Return(ATokenTypeEnum::TOKEN_NATIVE)); RdbServiceImpl service; RdbSyncerParam param; - param.bundleName_ = metaData_.bundleName; - param.type_ = metaData_.storeType; - param.level_ = metaData_.securityLevel; - param.area_ = metaData_.area; - param.hapName_ = metaData_.bundleName; - param.storeName_ = metaData_.storeId; - param.isEncrypt_ = metaData_.isEncrypt; - param.isSearchable_ = metaData_.isSearchable; - param.haMode_ = metaData_.haMode; - param.asyncDownloadAsset_ = metaData_.asyncDownloadAsset; - param.user_ = metaData_.user; + GetRdbSyncerParam(param); int32_t result = service.VerifyPromiseInfo(param); EXPECT_EQ(result, RDB_ERROR); @@ -329,7 +295,7 @@ HWTEST_F(RdbServiceImplTokenTest, VerifyPromiseInfo006, TestSize.Level0) } /** * @tc.name: VerifyPromiseInfo007 - * @tc.desc: Test VerifyPromiseInfo when permissionNames is not in promiseInfo and tokenid is TOKEN_HAP. + * @tc.desc: Test VerifyPromiseInfo when tokenId and uid are not in promiseInfo. * @tc.type: FUNC * @tc.require: * @tc.author: zd @@ -349,17 +315,7 @@ HWTEST_F(RdbServiceImplTokenTest, VerifyPromiseInfo007, TestSize.Level0) .WillRepeatedly(testing::Return(ATokenTypeEnum::TOKEN_HAP)); RdbServiceImpl service; RdbSyncerParam param; - param.bundleName_ = metaData_.bundleName; - param.type_ = metaData_.storeType; - param.level_ = metaData_.securityLevel; - param.area_ = metaData_.area; - param.hapName_ = metaData_.bundleName; - param.storeName_ = metaData_.storeId; - param.isEncrypt_ = metaData_.isEncrypt; - param.isSearchable_ = metaData_.isSearchable; - param.haMode_ = metaData_.haMode; - param.asyncDownloadAsset_ = metaData_.asyncDownloadAsset; - param.user_ = metaData_.user; + GetRdbSyncerParam(param); int32_t result = service.VerifyPromiseInfo(param); EXPECT_EQ(result, RDB_ERROR); @@ -368,7 +324,7 @@ HWTEST_F(RdbServiceImplTokenTest, VerifyPromiseInfo007, TestSize.Level0) /** * @tc.name: VerifyPromiseInfo008 - * @tc.desc: Test VerifyPromiseInfo when permissionNames is in promiseInfo and tokenid is TOKEN_HAP. + * @tc.desc: Test VerifyPromiseInfo when tokenId and uid are not in promiseInfo. * @tc.type: FUNC * @tc.require: * @tc.author: zd @@ -388,17 +344,7 @@ HWTEST_F(RdbServiceImplTokenTest, VerifyPromiseInfo008, TestSize.Level0) .WillRepeatedly(testing::Return(ATokenTypeEnum::TOKEN_HAP)); RdbServiceImpl service; RdbSyncerParam param; - param.bundleName_ = metaData_.bundleName; - param.type_ = metaData_.storeType; - param.level_ = metaData_.securityLevel; - param.area_ = metaData_.area; - param.hapName_ = metaData_.bundleName; - param.storeName_ = metaData_.storeId; - param.isEncrypt_ = metaData_.isEncrypt; - param.isSearchable_ = metaData_.isSearchable; - param.haMode_ = metaData_.haMode; - param.asyncDownloadAsset_ = metaData_.asyncDownloadAsset; - param.user_ = metaData_.user; + GetRdbSyncerParam(param); int32_t result = service.VerifyPromiseInfo(param); EXPECT_EQ(result, RDB_OK); -- Gitee From 867ee5350050c0306d63a01d2298b11910654d4a Mon Sep 17 00:00:00 2001 From: zhangdi Date: Thu, 19 Jun 2025 20:40:13 +0800 Subject: [PATCH 3/3] =?UTF-8?q?=E5=8C=BF=E5=90=8D=E5=8C=96=E6=97=A5?= =?UTF-8?q?=E5=BF=97=E6=89=93=E5=8D=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: zhangdi --- .../distributeddataservice/service/rdb/rdb_service_impl.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/services/distributeddataservice/service/rdb/rdb_service_impl.cpp b/services/distributeddataservice/service/rdb/rdb_service_impl.cpp index 6a15c4105..cf23627a6 100644 --- a/services/distributeddataservice/service/rdb/rdb_service_impl.cpp +++ b/services/distributeddataservice/service/rdb/rdb_service_impl.cpp @@ -1749,7 +1749,7 @@ int32_t RdbServiceImpl::VerifyPromiseInfo(const RdbSyncerParam ¶m) auto isCreated = MetaDataManager::GetInstance().LoadMeta(meta.GetKeyLocal(), localMeta, true); if (!isCreated) { ZLOGE("Store not exist. bundleName:%{public}s, storeName:%{public}s", meta.bundleName.c_str(), - Anonymous::Change(meta.storeId).c_str()); + meta.GetStoreAlias().c_str()); return RDB_ERROR; } ATokenTypeEnum type = AccessTokenKit::GetTokenType(tokenId); @@ -1775,7 +1775,7 @@ int32_t RdbServiceImpl::VerifyPromiseInfo(const RdbSyncerParam ¶m) return RDB_ERROR; } else { ZLOGE("invalid type! bundleName:%{public}s, storeName:%{public}s, token_type is %{public}d.", - meta.bundleName.c_str(), Anonymous::Change(meta.storeId).c_str(), type); + meta.bundleName.c_str(), meta.GetStoreAlias().c_str(), type); return RDB_ERROR; } return RDB_OK; -- Gitee