From 693ffe98dd2a54044841abb5b526c832fd614ffc Mon Sep 17 00:00:00 2001 From: MengYao Date: Fri, 22 Aug 2025 17:26:56 +0800 Subject: [PATCH 1/2] =?UTF-8?q?rdb=E6=9C=8D=E5=8A=A1=E7=AB=AF=E5=87=8F?= =?UTF-8?q?=E5=B0=91load=E7=9A=84=E6=AC=A1=E6=95=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: MengYao --- .../include/metadata/appid_meta_data.h | 1 + .../include/metadata/secret_key_meta_data.h | 2 ++ .../framework/metadata/appid_meta_data.cpp | 5 ++++ .../metadata/secret_key_meta_data.cpp | 11 +++++++++ .../service/rdb/rdb_service_impl.cpp | 16 ++++++++++++- .../service/test/rdb_service_impl_test.cpp | 24 +++++++++++++++++-- 6 files changed, 56 insertions(+), 3 deletions(-) diff --git a/services/distributeddataservice/framework/include/metadata/appid_meta_data.h b/services/distributeddataservice/framework/include/metadata/appid_meta_data.h index 1707a360c..627440f1a 100644 --- a/services/distributeddataservice/framework/include/metadata/appid_meta_data.h +++ b/services/distributeddataservice/framework/include/metadata/appid_meta_data.h @@ -26,6 +26,7 @@ struct API_EXPORT AppIDMetaData final : public Serializable { API_EXPORT AppIDMetaData(); API_EXPORT AppIDMetaData(const std::string &appId, const std::string &bundleName); API_EXPORT ~AppIDMetaData(); + API_EXPORT bool operator==(const AppIDMetaData &appIdMetaData) const; API_EXPORT bool Marshal(json &node) const override; API_EXPORT bool Unmarshal(const json &node) override; API_EXPORT std::string GetKey() const; diff --git a/services/distributeddataservice/framework/include/metadata/secret_key_meta_data.h b/services/distributeddataservice/framework/include/metadata/secret_key_meta_data.h index cb546472b..57a95079d 100644 --- a/services/distributeddataservice/framework/include/metadata/secret_key_meta_data.h +++ b/services/distributeddataservice/framework/include/metadata/secret_key_meta_data.h @@ -27,6 +27,8 @@ struct API_EXPORT SecretKeyMetaData final : public Serializable { API_EXPORT SecretKeyMetaData(); API_EXPORT ~SecretKeyMetaData(); + API_EXPORT bool operator==(const SecretKeyMetaData &secretKey) const; + API_EXPORT bool operator!=(const SecretKeyMetaData &secretKey) const; API_EXPORT bool Marshal(json &node) const override; API_EXPORT bool Unmarshal(const json &node) override; diff --git a/services/distributeddataservice/framework/metadata/appid_meta_data.cpp b/services/distributeddataservice/framework/metadata/appid_meta_data.cpp index 71b61792f..1a1a7c856 100644 --- a/services/distributeddataservice/framework/metadata/appid_meta_data.cpp +++ b/services/distributeddataservice/framework/metadata/appid_meta_data.cpp @@ -43,6 +43,11 @@ AppIDMetaData::~AppIDMetaData() { } +bool AppIDMetaData::operator==(const AppIDMetaData &appIdMetaData) const +{ + return (appId == appIdMetaData.appId && bundleName == appIdMetaData.bundleName); +} + std::string AppIDMetaData::GetKey() const { return appId; diff --git a/services/distributeddataservice/framework/metadata/secret_key_meta_data.cpp b/services/distributeddataservice/framework/metadata/secret_key_meta_data.cpp index 3af423fb1..08e1ef42f 100644 --- a/services/distributeddataservice/framework/metadata/secret_key_meta_data.cpp +++ b/services/distributeddataservice/framework/metadata/secret_key_meta_data.cpp @@ -27,6 +27,17 @@ SecretKeyMetaData::~SecretKeyMetaData() nonce.assign(nonce.size(), 0); } +bool SecretKeyMetaData::operator==(const SecretKeyMetaData &secretKey) const +{ + return sKey == secretKey.sKey && nonce == secretKey.nonce && storeType == secretKey.storeType && + area == secretKey.area; +} + +bool SecretKeyMetaData::operator!=(const SecretKeyMetaData &secretKey) const +{ + return !(*this == secretKey); +} + bool SecretKeyMetaData::Marshal(json &node) const { SetValue(node[GET_NAME(time)], time); diff --git a/services/distributeddataservice/service/rdb/rdb_service_impl.cpp b/services/distributeddataservice/service/rdb/rdb_service_impl.cpp index 43c0c7cfb..ae302db1e 100644 --- a/services/distributeddataservice/service/rdb/rdb_service_impl.cpp +++ b/services/distributeddataservice/service/rdb/rdb_service_impl.cpp @@ -914,13 +914,17 @@ void RdbServiceImpl::SaveSecretKeyMeta(const StoreMetaData &metaData, const std: auto encryptKey = CryptoManager::GetInstance().Encrypt(password, encryptParams); if (!encryptKey.empty() && !encryptParams.nonce.empty()) { SecretKeyMetaData secretKey; + SecretKeyMetaData oldSecretKey; secretKey.storeType = metaData.storeType; secretKey.area = metaData.area; secretKey.sKey = encryptKey; secretKey.nonce = encryptParams.nonce; auto time = system_clock::to_time_t(system_clock::now()); secretKey.time = { reinterpret_cast(&time), reinterpret_cast(&time) + sizeof(time) }; - MetaDataManager::GetInstance().SaveMeta(metaData.GetSecretKey(), secretKey, true); + if (!MetaDataManager::GetInstance().LoadMeta(metaData.GetSecretKey(), oldSecretKey, true) || + secretKey != oldSecretKey) { + MetaDataManager::GetInstance().SaveMeta(metaData.GetSecretKey(), secretKey, true); + } } SecretKeyMetaData cloneKey; auto metaKey = metaData.GetCloneSecretKey(); @@ -988,8 +992,12 @@ int32_t RdbServiceImpl::AfterOpen(const RdbSyncerParam ¶m) bool RdbServiceImpl::SaveAppIDMeta(const StoreMetaData &meta, const StoreMetaData &old) { AppIDMetaData appIdMeta; + AppIDMetaData oldAppIdMeta; appIdMeta.bundleName = meta.bundleName; appIdMeta.appId = meta.appId; + if (MetaDataManager::GetInstance().LoadMeta(appIdMeta.GetKey(), appIdMeta, true) && appIdMeta == oldAppIdMeta) { + return true; + } if (!MetaDataManager::GetInstance().SaveMeta(appIdMeta.GetKey(), appIdMeta, true)) { ZLOGE("meta bundle:%{public}s store:%{public}s type:%{public}d->%{public}d encrypt:%{public}d->%{public}d " "area:%{public}d->%{public}d", meta.bundleName.c_str(), meta.GetStoreAlias().c_str(), old.storeType, @@ -1741,6 +1749,12 @@ int32_t RdbServiceImpl::SavePromiseInfo(const StoreMetaData &metaData, const Rdb return RDB_OK; } StoreMetaDataLocal localMeta; + if (MetaDataManager::GetInstance().LoadMeta(metaData.GetKeyLocal(), localMeta, true)) { + if (param.tokenIds_ == localMeta.promiseInfo.tokenIds && param.uids_ == localMeta.promiseInfo.uids && + param.permissionNames_ == localMeta.promiseInfo.permissionNames) { + return RDB_OK; + } + } localMeta.promiseInfo.tokenIds = param.tokenIds_; localMeta.promiseInfo.uids = param.uids_; localMeta.promiseInfo.permissionNames = param.permissionNames_; diff --git a/services/distributeddataservice/service/test/rdb_service_impl_test.cpp b/services/distributeddataservice/service/test/rdb_service_impl_test.cpp index abe248836..f144db0ff 100644 --- a/services/distributeddataservice/service/test/rdb_service_impl_test.cpp +++ b/services/distributeddataservice/service/test/rdb_service_impl_test.cpp @@ -25,6 +25,7 @@ #include "device_matrix.h" #include "event_center.h" #include "ipc_skeleton.h" +#include "metadata/appid_meta_data.h" #include "metadata/capability_meta_data.h" #include "metadata/meta_data_manager.h" #include "metadata/store_meta_data.h" @@ -791,15 +792,34 @@ HWTEST_F(RdbServiceImplTest, AfterOpen002, TestSize.Level0) */ HWTEST_F(RdbServiceImplTest, AfterOpen003, TestSize.Level0) { - EXPECT_EQ(MetaDataManager::GetInstance().SaveMeta(metaData_.GetKeyWithoutPath(), metaData_, false), true); + EXPECT_EQ(MetaDataManager::GetInstance().SaveMeta(metaData_.GetKey(), metaData_, true), true); RdbServiceImpl service; RdbSyncerParam param; param.bundleName_ = metaData_.bundleName; param.storeName_ = metaData_.storeId; + param.tokenIds_ = {123}; + param.uids_ = {123}; + param.permissionNames_ = {}; + AppIDMetaData appIdMeta; + appIdMeta.bundleName = metaData_.bundleName; + appIdMeta.appId = metaData_.appId; + EXPECT_EQ(MetaDataManager::GetInstance().SaveMeta(appIdMeta.GetKey(), appIdMeta, true), true); + StoreMetaDataLocal localMeta; + EXPECT_EQ(MetaDataManager::GetInstance().SaveMeta(metaData_.GetKeyLocal(), localMeta, true), true); int32_t result = service.AfterOpen(param); - EXPECT_EQ(result, RDB_OK); EXPECT_EQ(MetaDataManager::GetInstance().DelMeta(metaData_.GetKeyWithoutPath(), false), true); + param.tokenIds_ = {123}; + param.uids_ = {456}; + result = service.AfterOpen(param); + EXPECT_EQ(result, RDB_OK); + param.permissionNames_ = {"com.example.myapplication"}; + result = service.AfterOpen(param); + EXPECT_EQ(result, RDB_OK); + + EXPECT_EQ(MetaDataManager::GetInstance().DelMeta(metaData_.GetKey(), true), true); + EXPECT_EQ(MetaDataManager::GetInstance().DelMeta(metaData_.GetKeyLocal(), true), true); + EXPECT_EQ(MetaDataManager::GetInstance().DelMeta(appIdMeta.GetKey(), true), true); } /** -- Gitee From 5b48e2b94cc302fa4a7e77a97752f5a09240ae95 Mon Sep 17 00:00:00 2001 From: MengYao Date: Fri, 22 Aug 2025 19:27:43 +0800 Subject: [PATCH 2/2] fix Signed-off-by: MengYao --- .../distributeddataservice/service/rdb/rdb_service_impl.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/services/distributeddataservice/service/rdb/rdb_service_impl.cpp b/services/distributeddataservice/service/rdb/rdb_service_impl.cpp index ae302db1e..b62f047ea 100644 --- a/services/distributeddataservice/service/rdb/rdb_service_impl.cpp +++ b/services/distributeddataservice/service/rdb/rdb_service_impl.cpp @@ -995,7 +995,7 @@ bool RdbServiceImpl::SaveAppIDMeta(const StoreMetaData &meta, const StoreMetaDat AppIDMetaData oldAppIdMeta; appIdMeta.bundleName = meta.bundleName; appIdMeta.appId = meta.appId; - if (MetaDataManager::GetInstance().LoadMeta(appIdMeta.GetKey(), appIdMeta, true) && appIdMeta == oldAppIdMeta) { + if (MetaDataManager::GetInstance().LoadMeta(appIdMeta.GetKey(), oldAppIdMeta, true) && appIdMeta == oldAppIdMeta) { return true; } if (!MetaDataManager::GetInstance().SaveMeta(appIdMeta.GetKey(), appIdMeta, true)) { -- Gitee