diff --git a/services/distributedhardwarefwkservice/include/accessmanager/access_manager.h b/services/distributedhardwarefwkservice/include/accessmanager/access_manager.h index 74d95716f2893c184f912dc43fb609623073b8f6..834607581cc89e6de82345cec9f5c554a9afc588 100644 --- a/services/distributedhardwarefwkservice/include/accessmanager/access_manager.h +++ b/services/distributedhardwarefwkservice/include/accessmanager/access_manager.h @@ -29,7 +29,8 @@ namespace OHOS { namespace DistributedHardware { class AccessManager : public std::enable_shared_from_this, public DmInitCallback, - public DeviceStateCallback { + public DeviceStateCallback, + public DevTrustChangeCallback { public: AccessManager(const AccessManager &) = delete; AccessManager &operator = (const AccessManager &) = delete; @@ -46,6 +47,7 @@ public: virtual void OnDeviceOffline(const DmDeviceInfo &deviceInfo) override; virtual void OnDeviceReady(const DmDeviceInfo &deviceInfo) override; virtual void OnDeviceChanged(const DmDeviceInfo &deviceInfo) override; + virtual void OnDeviceTrustChange(const std::string &deviceId, DmAuthForm authform) override; /* Send device online event which is already online */ void CheckTrustedDeviceOnline(); int32_t Dump(const std::vector &argsStr, std::string &result); @@ -55,6 +57,7 @@ private: int32_t UnRegisterDevStateCallback(); int32_t InitDeviceManager(); int32_t UnInitDeviceManager(); + int32_t RegRemDevTrustChangeCallback(); std::mutex accessMutex_; }; } // namespace DistributedHardware diff --git a/services/distributedhardwarefwkservice/include/distributed_hardware_manager_factory.h b/services/distributedhardwarefwkservice/include/distributed_hardware_manager_factory.h index 3ff6c59bfcab49055564276c33ff198b929cd3d7..ad91d5a489d4f4d5ea29f843640201a15c4ec441 100644 --- a/services/distributedhardwarefwkservice/include/distributed_hardware_manager_factory.h +++ b/services/distributedhardwarefwkservice/include/distributed_hardware_manager_factory.h @@ -36,6 +36,7 @@ public: int32_t SendOffLineEvent(const std::string &networkId, const std::string &uuid, const std::string &udid, uint16_t deviceType); int32_t GetComponentVersion(std::unordered_map &versionMap); + int32_t DeleteCloudDataByKey(const std::string &deviceId); int Dump(const std::vector &argsStr, std::string &result); void UnInit(); diff --git a/services/distributedhardwarefwkservice/include/resourcemanager/db_adapter.h b/services/distributedhardwarefwkservice/include/resourcemanager/db_adapter.h index 935b9a08f850508b681782fed5d8af32557c6444..56ea9c928411b7a4ad4a4e9f351de9c55e33f01b 100644 --- a/services/distributedhardwarefwkservice/include/resourcemanager/db_adapter.h +++ b/services/distributedhardwarefwkservice/include/resourcemanager/db_adapter.h @@ -54,6 +54,7 @@ public: int32_t RemoveDataByKey(const std::string &key); std::vector GetEntriesByKeys(const std::vector &keys); bool SyncDataByNetworkId(const std::string &networkId); + bool DeleteCloudDataByKey(const std::string &deviceId); private: int32_t RegisterChangeListener(); diff --git a/services/distributedhardwarefwkservice/include/resourcemanager/meta_info_manager.h b/services/distributedhardwarefwkservice/include/resourcemanager/meta_info_manager.h index 94ab340193345b8205c582a4aaff9be113d5c69f..3c7216990254802d281456d1475fa6a66e9a3db4 100644 --- a/services/distributedhardwarefwkservice/include/resourcemanager/meta_info_manager.h +++ b/services/distributedhardwarefwkservice/include/resourcemanager/meta_info_manager.h @@ -51,6 +51,7 @@ public: std::vector> &metaCapInfos); int32_t GetMetaDataByDHType(const DHType dhType, MetaCapInfoMap &metaInfoMap); int32_t SyncDataByNetworkId(const std::string &networkId); + int32_t DeleteCloudDataByKey(const std::string &deviceId); /* Database data changes callback */ virtual void OnChange(const DistributedKv::ChangeNotification &changeNotification) override; /* Cloud data changes callback */ diff --git a/services/distributedhardwarefwkservice/src/accessmanager/access_manager.cpp b/services/distributedhardwarefwkservice/src/accessmanager/access_manager.cpp index d51862f5676e33b0d3ca9e08bb7dd4163ab8f596..357265847644d23c7108b4d92cb66b40ccfe4f98 100644 --- a/services/distributedhardwarefwkservice/src/accessmanager/access_manager.cpp +++ b/services/distributedhardwarefwkservice/src/accessmanager/access_manager.cpp @@ -58,6 +58,10 @@ int32_t AccessManager::Init() DHLOGE("RegisterDevStateCallback failed"); return ERR_DH_FWK_ACCESS_REGISTER_DM_FAILED; } + if (RegRemDevTrustChangeCallback() != DH_FWK_SUCCESS) { + DHLOGE("RegRemDevTrustChangeCallback failed"); + return ERR_DH_FWK_ACCESS_REGISTER_DM_FAILED; + } return DH_FWK_SUCCESS; } @@ -98,6 +102,12 @@ int32_t AccessManager::UnRegisterDevStateCallback() return DeviceManager::GetInstance().UnRegisterDevStateCallback(DH_FWK_PKG_NAME); } +int32_t AccessManager::RegRemDevTrustChangeCallback() +{ + return DeviceManager::GetInstance().RegRemDevTrustChangeCallback(DH_FWK_PKG_NAME, shared_from_this()); +} + + void AccessManager::OnRemoteDied() { for (int32_t tryCount = 0; tryCount < DH_RETRY_INIT_DM_COUNT; ++tryCount) { @@ -176,6 +186,18 @@ void AccessManager::OnDeviceChanged(const DmDeviceInfo &deviceInfo) return; } +void AccessManager::OnDeviceTrustChange(const std::string &deviceId, DmAuthForm authform) +{ + DHLOGI("Trust device: %{public}s state change, authform: %{public}d", + GetAnonyString(deviceId).c_str(), static_cast(authform)); + if (!IsIdLengthValid(deviceId)) { + return; + } + if (authform == DmAuthForm::IDENTICAL_ACCOUNT) { + DistributedHardwareManagerFactory::GetInstance().DeleteCloudDataByKey(deviceId); + } +} + void AccessManager::CheckTrustedDeviceOnline() { std::vector deviceList; diff --git a/services/distributedhardwarefwkservice/src/distributed_hardware_manager_factory.cpp b/services/distributedhardwarefwkservice/src/distributed_hardware_manager_factory.cpp index 45f651f122800b82ed78ecf7eedc5d299e1bb7d5..b42f2d2913d7ea78cd7c8aa18a8be36a00d4be72 100644 --- a/services/distributedhardwarefwkservice/src/distributed_hardware_manager_factory.cpp +++ b/services/distributedhardwarefwkservice/src/distributed_hardware_manager_factory.cpp @@ -225,6 +225,12 @@ int32_t DistributedHardwareManagerFactory::GetComponentVersion(std::unordered_ma return DistributedHardwareManager::GetInstance().GetComponentVersion(versionMap); } +int32_t DistributedHardwareManagerFactory::DeleteCloudDataByKey(const std::string &deviceId) +{ + DHLOGI("Deleta cloudData start"); + return MetaInfoManager::GetInstance()->DeleteCloudDataByKey(deviceId); +} + int32_t DistributedHardwareManagerFactory::Dump(const std::vector &argsStr, std::string &result) { return DistributedHardwareManager::GetInstance().Dump(argsStr, result); diff --git a/services/distributedhardwarefwkservice/src/resourcemanager/db_adapter.cpp b/services/distributedhardwarefwkservice/src/resourcemanager/db_adapter.cpp index 8743f00f938d8e1d3d2e19daebd9a8374e652b76..52f866957032a5632c26cfa477f60dd795c40c9c 100644 --- a/services/distributedhardwarefwkservice/src/resourcemanager/db_adapter.cpp +++ b/services/distributedhardwarefwkservice/src/resourcemanager/db_adapter.cpp @@ -560,5 +560,28 @@ bool DBAdapter::SyncDataByNetworkId(const std::string &networkId) } return true; } + +bool DBAdapter::DeleteCloudDataByKey(const std::string &deviceId) +{ + DHLOGI("Delete cloudData start, deviceId: %{public}s", GetAnonyString(deviceId).c_str()); + std::string udIdHash = Sha256(deviceId); + DistributedKv::Key allEntryKeyPrefix(udIdHash); + std::vector allEntries; + DistributedKv::Status status = kvStoragePtr_->GetEntries(allEntryKeyPrefix, allEntries); + if (status != DistributedKv::Status::SUCCESS) { + DHLOGE("GetEntries error: %{public}d", status); + return false; + } + std::vector keys; + for (const auto &entry : allEntries) { + keys.push_back(entry.key); + } + status = kvStoragePtr_->DeleteBatch(keys); + if (status != DistributedKv::Status::SUCCESS) { + DHLOGE("Delete cloudData failed, error: %{public}d", status); + return false; + } + return true; +} } // namespace DistributedHardware } // namespace OHOS diff --git a/services/distributedhardwarefwkservice/src/resourcemanager/meta_info_manager.cpp b/services/distributedhardwarefwkservice/src/resourcemanager/meta_info_manager.cpp index f4c6762e2585aab1f5a45e28cf55808d3b3e3d0d..7b9b88ac2360d64b9c35627425bf76db7f1bd684 100644 --- a/services/distributedhardwarefwkservice/src/resourcemanager/meta_info_manager.cpp +++ b/services/distributedhardwarefwkservice/src/resourcemanager/meta_info_manager.cpp @@ -339,6 +339,20 @@ int32_t MetaInfoManager::SyncDataByNetworkId(const std::string &networkId) return DH_FWK_SUCCESS; } +int32_t MetaInfoManager::DeleteCloudDataByKey(const std::string &deviceId) +{ + if (!IsIdLengthValid(deviceId)) { + DHLOGE("deviceId: %{public}s is invalid", GetAnonyString(deviceId).c_str()); + return ERR_DH_FWK_PARA_INVALID; + } + if (dbAdapterPtr_ == nullptr) { + DHLOGE("dbAdapterPtr is null"); + return ERR_DH_FWK_RESOURCE_DB_ADAPTER_POINTER_NULL; + } + dbAdapterPtr_->DeleteCloudDataByKey(deviceId); + return DH_FWK_SUCCESS; +} + void MetaInfoManager::OnChange(const DistributedKv::ChangeNotification &changeNotification) { DHLOGI("MetaInfoManager: DB data OnChange"); diff --git a/services/distributedhardwarefwkservice/test/unittest/common/resourcemanager/src/resource_manager_test.cpp b/services/distributedhardwarefwkservice/test/unittest/common/resourcemanager/src/resource_manager_test.cpp index e754cea83c724d54e166587320add5dd597caa81..5a80e39b22560e9a19914313ac5babf1ba09123e 100644 --- a/services/distributedhardwarefwkservice/test/unittest/common/resourcemanager/src/resource_manager_test.cpp +++ b/services/distributedhardwarefwkservice/test/unittest/common/resourcemanager/src/resource_manager_test.cpp @@ -1214,10 +1214,24 @@ HWTEST_F(ResourceManagerTest, SyncDataByNetworkId_001, TestSize.Level0) ret = MetaInfoManager::GetInstance()->SyncDataByNetworkId(networkId); EXPECT_EQ(DH_FWK_SUCCESS, ret); - MetaInfoManager::GetInstance()->dbAdapterPtr_ = nullptr; ret = MetaInfoManager::GetInstance()->SyncDataByNetworkId(networkId); EXPECT_EQ(ERR_DH_FWK_RESOURCE_DB_ADAPTER_POINTER_NULL, ret); } + +HWTEST_F(ResourceManagerTest, DeleteCloudDataByKey_001, TestSize.Level0) +{ + std::string deviceId = ""; + auto ret = MetaInfoManager::GetInstance()->DeleteCloudDataByKey(deviceId); + EXPECT_EQ(ERR_DH_FWK_PARA_INVALID, ret); + + deviceId = "deviceId_test"; + ret = MetaInfoManager::GetInstance()->DeleteCloudDataByKey(deviceId); + EXPECT_EQ(DH_FWK_SUCCESS, ret); + + MetaInfoManager::GetInstance()->dbAdapterPtr_ = nullptr; + ret = MetaInfoManager::GetInstance()->DeleteCloudDataByKey(deviceId); + EXPECT_EQ(ERR_DH_FWK_RESOURCE_DB_ADAPTER_POINTER_NULL, ret); +} } // namespace DistributedHardware } // namespace OHOS