diff --git a/services/distributeddataservice/framework/include/metadata/appid_meta_data.h b/services/distributeddataservice/framework/include/metadata/appid_meta_data.h index 1707a360c45349d557dfa3e26331f39e9c0b6dfb..627440f1ad3a8a9f20d1c791d12f3be4307798ae 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 cb546472bfc129b8d9db2b7b895c4fc64475e88b..57a95079d946236f2202e0332599dfdc3bc3447b 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 71b61792f33c04942b741756538c589cbeab79a3..1a1a7c856ecbfaf7c35b9aafd489e65847a14524 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 3af423fb1c686d09c1adc5454ed0e84d5fb55586..08e1ef42f3a2756d53ae6c93c444c904c511db89 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 43c0c7cfb7742388bdae43d9884de443089ea025..b62f047ea50a692578e343317ac41748c4191696 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(), oldAppIdMeta, 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 abe2488366efda20b6e61484c63261d102a69a26..f144db0ff33f5d7a7eaf7b850f10085b2a48ac81 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); } /**