diff --git a/services/implementation/include/device_manager_service_impl.h b/services/implementation/include/device_manager_service_impl.h index 4164ad304f71b49208167be35449d9f83746736b..2115a5c6470841ece25ea30408b57e4835da4931 100644 --- a/services/implementation/include/device_manager_service_impl.h +++ b/services/implementation/include/device_manager_service_impl.h @@ -178,7 +178,7 @@ public: void DeleteAlwaysAllowTimeOut(); void CheckDeleteCredential(const std::string &remoteUdid, int32_t remoteUserId); void HandleCredentialDeleted(const char *credId, const char *credInfo, const std::string &localUdid, - std::string &remoteUdid); + std::string &remoteUdid, bool &isSendBroadCast); void HandleShareUnbindBroadCast(const std::string &credId, const int32_t &userId, const std::string &localUdid); int32_t CheckDeviceInfoPermission(const std::string &localUdid, const std::string &peerDeviceId); int32_t DeleteAcl(const std::string &sessionName, const std::string &localUdid, const std::string &remoteUdid, @@ -298,6 +298,7 @@ private: void OnAuthResultAndOnBindResult(const ProcessInfo &processInfo, const PeerTargetId &targetId, const std::string &deviceId, int32_t reason); void GetBundleName(const DMAclQuadInfo &info, std::set &pkgNameSet); + void DeleteSessionKey(int32_t userId, const DistributedDeviceProfile::AccessControlProfile &profile); private: std::shared_ptr authMgr_; // Old protocol only @@ -311,6 +312,7 @@ private: std::shared_ptr commonEventManager_; std::shared_ptr listener_; std::atomic isCredentialType_ = false; + std::mutex logoutMutex_; sptr dpInitedCallback_ = nullptr; // The session ID corresponding to the device ID, used only on the src side diff --git a/services/implementation/include/device_manager_service_impl_lite.h b/services/implementation/include/device_manager_service_impl_lite.h index 54ccc4b6bde2c88f4d9cfe75c02da5ddea80a348..8ec4d49a25f0968d43a1658e3728e7f48ea24dbe 100644 --- a/services/implementation/include/device_manager_service_impl_lite.h +++ b/services/implementation/include/device_manager_service_impl_lite.h @@ -164,7 +164,7 @@ public: void DeleteAlwaysAllowTimeOut(); void CheckDeleteCredential(const std::string &remoteUdid, int32_t remoteUserId); void HandleCredentialDeleted(const char *credId, const char *credInfo, const std::string &localUdid, - std::string &remoteUdid); + std::string &remoteUdid, bool &isSendBroadCast); void HandleShareUnbindBroadCast(const std::string &credId, const int32_t &userId, const std::string &localUdid); int32_t CheckDeviceInfoPermission(const std::string &localUdid, const std::string &peerDeviceId); void HandleServiceUnBindEvent(int32_t userId, const std::string &remoteUdid, diff --git a/services/implementation/src/device_manager_service_impl.cpp b/services/implementation/src/device_manager_service_impl.cpp index 36dccf96aa6b107eb30ad7218818dec8efd90ffd..44e6388931f9faeb4a1ef8cab7ea3f7c1743f23e 100644 --- a/services/implementation/src/device_manager_service_impl.cpp +++ b/services/implementation/src/device_manager_service_impl.cpp @@ -1873,8 +1873,11 @@ void DeviceManagerServiceImpl::HandleIdentAccountLogout(const DMAclQuadInfo &inf CHECK_NULL_VOID(hiChainConnector_); hiChainConnector_->DeleteAllGroup(info.localUserId); CHECK_NULL_VOID(hiChainAuthConnector_); - hiChainAuthConnector_->DeleteCredential(info.peerUdid, info.localUserId, info.peerUserId); - DeleteSkCredAndAcl(offlineParam.needDelAclInfos); + { + std::lock_guard lock(logoutMutex_); + hiChainAuthConnector_->DeleteCredential(info.peerUdid, info.localUserId, info.peerUserId); + DeleteSkCredAndAcl(offlineParam.needDelAclInfos); + } std::set pkgNameSet; GetBundleName(info, pkgNameSet); @@ -2073,8 +2076,12 @@ void DeviceManagerServiceImpl::HandleAccountLogoutEvent(int32_t remoteUserId, co CHECK_NULL_VOID(hiChainConnector_); hiChainConnector_->DeleteAllGroup(item.second); CHECK_NULL_VOID(hiChainAuthConnector_); - hiChainAuthConnector_->DeleteCredential(remoteUdid, item.second, remoteUserId); - DeleteSkCredAndAcl(offlineParam.needDelAclInfos); + { + std::lock_guard lock(logoutMutex_); + hiChainAuthConnector_->DeleteCredential(remoteUdid, item.second, remoteUserId); + DeleteSkCredAndAcl(offlineParam.needDelAclInfos); + } + std::set pkgNameSet; GetBundleName(info, pkgNameSet); if (notifyOffline) { @@ -2654,10 +2661,14 @@ void DeviceManagerServiceImpl::CheckDeleteCredential(const std::string &remoteUd } void DeviceManagerServiceImpl::HandleCredentialDeleted(const char *credId, const char *credInfo, - const std::string &localUdid, std::string &remoteUdid) + const std::string &localUdid, std::string &remoteUdid, bool &isSendBroadCast) { - std::vector profiles = - DeviceProfileConnector::GetInstance().GetAccessControlProfile(); + std::vector profiles; + { + std::lock_guard lock(logoutMutex_); + profiles = DeviceProfileConnector::GetInstance().GetAccessControlProfile(); + } + JsonObject jsonObject; jsonObject.Parse(std::string(credInfo)); if (jsonObject.IsDiscarded()) { @@ -2689,6 +2700,8 @@ void DeviceManagerServiceImpl::HandleCredentialDeleted(const char *credId, const item.GetAccessee().GetAccesseeUserId() == localUserId && item.GetAccesser().GetAccesserUserId() == userId && item.GetAccesser().GetAccesserDeviceId() == remoteUdid)) { + isSendBroadCast = true; + DeleteSessionKey(userId, item); DeviceProfileConnector::GetInstance().DeleteAccessControlById(item.GetAccessControlId()); } } @@ -2697,8 +2710,11 @@ void DeviceManagerServiceImpl::HandleCredentialDeleted(const char *credId, const void DeviceManagerServiceImpl::HandleShareUnbindBroadCast(const std::string &credId, const int32_t &userId, const std::string &localUdid) { - std::vector profiles = - DeviceProfileConnector::GetInstance().GetAccessControlProfile(); + std::vector profiles; + { + std::lock_guard lock(logoutMutex_); + profiles = DeviceProfileConnector::GetInstance().GetAccessControlProfile(); + } int32_t localUserId = MultipleUserConnector::GetCurrentAccountUserID(); for (const auto &item : profiles) { if (item.GetBindType() != DM_SHARE) { @@ -2713,11 +2729,13 @@ void DeviceManagerServiceImpl::HandleShareUnbindBroadCast(const std::string &cre if (accesserCredId == credId && item.GetAccessee().GetAccesseeDeviceId() == localUdid && item.GetAccessee().GetAccesseeUserId() == localUserId && item.GetAccesser().GetAccesserUserId() == userId) { + DeleteSessionKey(userId, item); DeviceProfileConnector::GetInstance().DeleteAccessControlById(item.GetAccessControlId()); } if (accesseeCredId == credId && item.GetAccesser().GetAccesserDeviceId() == localUdid && item.GetAccesser().GetAccesserUserId() == localUserId && item.GetAccessee().GetAccesseeUserId() == userId) { + DeleteSessionKey(userId, item); DeviceProfileConnector::GetInstance().DeleteAccessControlById(item.GetAccessControlId()); } } @@ -3034,6 +3052,15 @@ void DeviceManagerServiceImpl::DeleteHoDevice(const std::string &peerUdid, return; } +void DeviceManagerServiceImpl::DeleteSessionKey(int32_t userId, + const DistributedDeviceProfile::AccessControlProfile &profile) +{ + int32_t skId = profile.GetAccesser().GetAccesserSessionKeyId(); + DeviceProfileConnector::GetInstance().DeleteSessionKey(userId, skId); + skId = profile.GetAccessee().GetAccesseeSessionKeyId(); + DeviceProfileConnector::GetInstance().DeleteSessionKey(userId, skId); +} + extern "C" IDeviceManagerServiceImpl *CreateDMServiceObject(void) { return new DeviceManagerServiceImpl; diff --git a/services/implementation/src/device_manager_service_impl_lite.cpp b/services/implementation/src/device_manager_service_impl_lite.cpp index 83aa48f44a37f2ed7664bc69a8c6867b1b1517da..445f2b0705a6c32ed583a1a5d39ffb8a6074e6c2 100644 --- a/services/implementation/src/device_manager_service_impl_lite.cpp +++ b/services/implementation/src/device_manager_service_impl_lite.cpp @@ -331,12 +331,13 @@ int32_t DeviceManagerServiceImpl::ImportAuthCode(const std::string &pkgName, con } void DeviceManagerServiceImpl::HandleCredentialDeleted(const char *credId, const char *credInfo, - const std::string &localUdid, std::string &remoteUdid) + const std::string &localUdid, std::string &remoteUdid, bool &isSendBroadCast) { (void)credId; (void)credInfo; (void)localUdid; (void)remoteUdid; + (void)isSendBroadCast; return; } diff --git a/services/service/include/idevice_manager_service_impl.h b/services/service/include/idevice_manager_service_impl.h index 48a3acbbacbf2c7ef7849e1b1d84e0d3f17bc574..949542bedeb80a1f942cc5aecc0edaf66183fd77 100644 --- a/services/service/include/idevice_manager_service_impl.h +++ b/services/service/include/idevice_manager_service_impl.h @@ -268,7 +268,7 @@ public: virtual void DeleteAlwaysAllowTimeOut() = 0; virtual void CheckDeleteCredential(const std::string &remoteUdid, int32_t remoteUserId) = 0; virtual void HandleCredentialDeleted(const char *credId, const char *credInfo, const std::string &localUdid, - std::string &remoteUdid) = 0; + std::string &remoteUdid, bool &isSendBroadCast) = 0; virtual void HandleShareUnbindBroadCast(const std::string &credId, const int32_t &userId, const std::string &localUdid) = 0; virtual int32_t CheckDeviceInfoPermission(const std::string &localUdid, const std::string &peerDeviceId) = 0; diff --git a/services/service/src/device_manager_service.cpp b/services/service/src/device_manager_service.cpp index edcb3401ca905e5de577e89c893cc1e2cb5b99af..2cd845b22fd9328a04901df260cbdf194caa8fcc 100644 --- a/services/service/src/device_manager_service.cpp +++ b/services/service/src/device_manager_service.cpp @@ -3123,11 +3123,16 @@ void DeviceManagerService::HandleCredentialDeleted(const char *credId, const cha return; } std::string remoteUdid = ""; - dmServiceImpl_->HandleCredentialDeleted(credId, credInfo, localUdid, remoteUdid); + bool isSendBroadCast = false; + dmServiceImpl_->HandleCredentialDeleted(credId, credInfo, localUdid, remoteUdid, isSendBroadCast); if (remoteUdid.empty()) { LOGE("HandleCredentialDeleted failed, remoteUdid is empty."); return; } + if (!isSendBroadCast) { + LOGI("HandleCredentialDeleted not need to send broadcast."); + return; + } std::vector peerUdids; peerUdids.emplace_back(remoteUdid); SendShareTypeUnBindBroadCast(credId, MultipleUserConnector::GetCurrentAccountUserID(), peerUdids); diff --git a/test/unittest/UTTest_device_manager_service_impl_first.cpp b/test/unittest/UTTest_device_manager_service_impl_first.cpp index dab94b6c117912b10f5a05939f0e327e233fe307..d778f74362f2f7d8802669a6e4a23023f3c1f05a 100644 --- a/test/unittest/UTTest_device_manager_service_impl_first.cpp +++ b/test/unittest/UTTest_device_manager_service_impl_first.cpp @@ -212,6 +212,7 @@ HWTEST_F(DeviceManagerServiceImplFirstTest, HandleCredentialDeleted_001, testing const char *credInfo = "invalid_json"; std::string localUdid = "localUdid"; std::string remoteUdid; + bool isSendBroadCast = false; std::vector profiles; @@ -220,7 +221,7 @@ HWTEST_F(DeviceManagerServiceImplFirstTest, HandleCredentialDeleted_001, testing EXPECT_CALL(*deviceProfileConnectorMock_, DeleteAccessControlById(_)) .Times(0); - deviceManagerServiceImpl_->HandleCredentialDeleted(credId, credInfo, localUdid, remoteUdid); + deviceManagerServiceImpl_->HandleCredentialDeleted(credId, credInfo, localUdid, remoteUdid, isSendBroadCast); } HWTEST_F(DeviceManagerServiceImplFirstTest, HandleCredentialDeleted_002, testing::ext::TestSize.Level1) @@ -229,6 +230,7 @@ HWTEST_F(DeviceManagerServiceImplFirstTest, HandleCredentialDeleted_002, testing const char *credInfo = R"({"deviceId": "remoteUdid", "userId": 1})"; std::string localUdid = "localUdid"; std::string remoteUdid; + bool isSendBroadCast = false; std::vector profiles; AccessControlProfile profile; @@ -239,7 +241,7 @@ HWTEST_F(DeviceManagerServiceImplFirstTest, HandleCredentialDeleted_002, testing .WillOnce(Return(profiles)); EXPECT_CALL(*deviceProfileConnectorMock_, DeleteAccessControlById(_)).Times(0); - deviceManagerServiceImpl_->HandleCredentialDeleted(credId, credInfo, localUdid, remoteUdid); + deviceManagerServiceImpl_->HandleCredentialDeleted(credId, credInfo, localUdid, remoteUdid, isSendBroadCast); } HWTEST_F(DeviceManagerServiceImplFirstTest, HandleCredentialDeleted_003, testing::ext::TestSize.Level1) @@ -248,6 +250,7 @@ HWTEST_F(DeviceManagerServiceImplFirstTest, HandleCredentialDeleted_003, testing const char *credInfo = R"({"deviceId": "remoteUdid", "userId": 1})"; std::string localUdid = "localUdid"; std::string remoteUdid; + bool isSendBroadCast = false; std::vector profiles; AccessControlProfile profile; @@ -265,7 +268,7 @@ HWTEST_F(DeviceManagerServiceImplFirstTest, HandleCredentialDeleted_003, testing EXPECT_CALL(*deviceProfileConnectorMock_, DeleteAccessControlById(_)) .Times(1); - deviceManagerServiceImpl_->HandleCredentialDeleted(credId, credInfo, localUdid, remoteUdid); + deviceManagerServiceImpl_->HandleCredentialDeleted(credId, credInfo, localUdid, remoteUdid, isSendBroadCast); } HWTEST_F(DeviceManagerServiceImplFirstTest, HandleCredentialDeleted_004, testing::ext::TestSize.Level1) @@ -274,6 +277,7 @@ HWTEST_F(DeviceManagerServiceImplFirstTest, HandleCredentialDeleted_004, testing const char *credInfo = R"({"deviceId": "remoteUdid", "userId": 1})"; std::string localUdid = "localUdid"; std::string remoteUdid; + bool isSendBroadCast = false; std::vector profiles; AccessControlProfile profile; @@ -291,7 +295,39 @@ HWTEST_F(DeviceManagerServiceImplFirstTest, HandleCredentialDeleted_004, testing EXPECT_CALL(*deviceProfileConnectorMock_, DeleteAccessControlById(_)) .Times(1); - deviceManagerServiceImpl_->HandleCredentialDeleted(credId, credInfo, localUdid, remoteUdid); + deviceManagerServiceImpl_->HandleCredentialDeleted(credId, credInfo, localUdid, remoteUdid, isSendBroadCast); +} + +HWTEST_F(DeviceManagerServiceImplFirstTest, HandleCredentialDeleted_005, testing::ext::TestSize.Level1) +{ + const char *credId = "testCredId"; + const char *credInfo = R"({"deviceId": "remoteUdid", "osAccountId": 1})"; + std::string localUdid = "localUdid"; + std::string remoteUdid = "remoteUdid"; + bool isSendBroadCast = false; + + EXPECT_CALL(*multipleUserConnectorMock_, GetCurrentAccountUserID()).Times(::testing::AtLeast(1)) + .WillOnce(Return(1)); + + std::vector profiles; + AccessControlProfile profile; + profile.SetBindType(DM_SHARE); + Accesser accesser; + accesser.SetAccesserCredentialIdStr(credId); + accesser.SetAccesserDeviceId(localUdid); + accesser.SetAccesserUserId(1); + Accessee accessee; + accessee.SetAccesseeUserId(1); + accessee.SetAccesseeDeviceId(remoteUdid); + profile.SetAccesser(accesser); + profile.SetAccessee(accessee); + profiles.push_back(profile); + + EXPECT_CALL(*deviceProfileConnectorMock_, GetAccessControlProfile()).WillOnce(Return(profiles)); + EXPECT_CALL(*deviceProfileConnectorMock_, DeleteAccessControlById(_)).Times(1); + + deviceManagerServiceImpl_->HandleCredentialDeleted(credId, credInfo, localUdid, remoteUdid, isSendBroadCast); + EXPECT_TRUE(isSendBroadCast); } HWTEST_F(DeviceManagerServiceImplFirstTest, HandleShareUnbindBroadCast_001, testing::ext::TestSize.Level1) diff --git a/test/unittest/UTTest_device_manager_service_two.cpp b/test/unittest/UTTest_device_manager_service_two.cpp index 1ecdd86fa305cbc697cf4487d2fe5676f5ce7a0b..230f7e18cae2cf2d1923f04d5741908e43acf25d 100644 --- a/test/unittest/UTTest_device_manager_service_two.cpp +++ b/test/unittest/UTTest_device_manager_service_two.cpp @@ -1880,7 +1880,7 @@ HWTEST_F(DeviceManagerServiceTest, SendShareTypeUnBindBroadCast_001, testing::ex HWTEST_F(DeviceManagerServiceTest, HandleCredentialDeleted_002, testing::ext::TestSize.Level1) { - EXPECT_CALL(*deviceManagerServiceImplMock_, HandleCredentialDeleted(_, _, _, _)).Times(0); + EXPECT_CALL(*deviceManagerServiceImplMock_, HandleCredentialDeleted(_, _, _, _, _)).Times(0); DeviceManagerService::GetInstance().HandleCredentialDeleted(nullptr, "credInfo"); } @@ -1893,6 +1893,34 @@ HWTEST_F(DeviceManagerServiceTest, HandleCredentialDeleted_004, testing::ext::Te DeviceManagerService::GetInstance().HandleCredentialDeleted("credId", "credInfo"); } +HWTEST_F(DeviceManagerServiceTest, HandleCredentialDeleted_005, testing::ext::TestSize.Level1) +{ + const char *credId = "testCredId"; + const char *credInfo = R"({"deviceId": "remoteUdid", "userId": 1})"; + std::string localUdid = "localUdid"; + std::string remoteUdid = "remoteUdid"; + bool isSendBroadCast = false; + + EXPECT_CALL(*deviceManagerServiceImplMock_, HandleCredentialDeleted(StrEq(credId), StrEq(credInfo), _, _, _)) + .WillOnce(DoAll(SetArgReferee<3>(remoteUdid), SetArgReferee<4>(isSendBroadCast))); + + DeviceManagerService::GetInstance().HandleCredentialDeleted(credId, credInfo); +} + +HWTEST_F(DeviceManagerServiceTest, HandleCredentialDeleted_006, testing::ext::TestSize.Level1) +{ + const char *credId = "testCredId"; + const char *credInfo = R"({"deviceId": "remoteUdid", "userId": 1})"; + std::string localUdid = "localUdid"; + std::string remoteUdid = "remoteUdid"; + bool isSendBroadCast = true; + + EXPECT_CALL(*deviceManagerServiceImplMock_, HandleCredentialDeleted(StrEq(credId), StrEq(credInfo), _, _, _)) + .WillOnce(DoAll(SetArgReferee<3>(remoteUdid), SetArgReferee<4>(isSendBroadCast))); + + DeviceManagerService::GetInstance().HandleCredentialDeleted(credId, credInfo); +} + HWTEST_F(DeviceManagerServiceTest, HandleShareUnbindBroadCast_001, testing::ext::TestSize.Level1) { std::string credId = "123456"; diff --git a/test/unittest/mock/device_manager_service_impl_mock.cpp b/test/unittest/mock/device_manager_service_impl_mock.cpp index e939ec1b3e08ab634dcc34ea904100a01e8b474c..80ac6e8c6370708a6ab95d8a9486cce16b05a09c 100644 --- a/test/unittest/mock/device_manager_service_impl_mock.cpp +++ b/test/unittest/mock/device_manager_service_impl_mock.cpp @@ -73,10 +73,10 @@ bool DeviceManagerServiceImpl::CheckSharePeerSrc(const std::string &peerUdid, co } void DeviceManagerServiceImpl::HandleCredentialDeleted(const char *credId, - const char *credInfo, const std::string &localUdid, std::string &remoteUdid) + const char *credInfo, const std::string &localUdid, std::string &remoteUdid, bool &isSendBroadCast) { DmDeviceManagerServiceImpl::dmDeviceManagerServiceImpl->HandleCredentialDeleted(credId, - credInfo, localUdid, remoteUdid); + credInfo, localUdid, remoteUdid, isSendBroadCast); } void DeviceManagerServiceImpl::HandleShareUnbindBroadCast(const std::string &credId, const int32_t &userId, const std::string &localUdid) diff --git a/test/unittest/mock/device_manager_service_impl_mock.h b/test/unittest/mock/device_manager_service_impl_mock.h index a8d9e45a899c4865e799be0c5b46ea15c1cd4e13..2886de7e3a61725e38eaf81aee69f52846be07fd 100644 --- a/test/unittest/mock/device_manager_service_impl_mock.h +++ b/test/unittest/mock/device_manager_service_impl_mock.h @@ -39,7 +39,7 @@ public: int32_t bindLevel, const std::string &extra) = 0; virtual bool CheckSharePeerSrc(const std::string &peerUdid, const std::string &localUdid) = 0; virtual void HandleCredentialDeleted(const char *credId, const char *credInfo, const std::string &localUdid, - std::string &remoteUdid) = 0; + std::string &remoteUdid, bool &isSendBroadCast) = 0; virtual void HandleShareUnbindBroadCast(const std::string &credId, const int32_t &userId, const std::string &localUdid) = 0; virtual int32_t CheckDeviceInfoPermission(const std::string &localUdid, const std::string &peerDeviceId) = 0; @@ -67,7 +67,7 @@ public: MOCK_METHOD(int32_t, UnBindDevice, (const std::string &, const std::string &, int32_t, const std::string &)); MOCK_METHOD(bool, CheckSharePeerSrc, (const std::string &peerUdid, const std::string &localUdid)); MOCK_METHOD(void, HandleCredentialDeleted, (const char *, const char *, const std::string &, - std::string &)); + std::string &, bool &)); MOCK_METHOD(void, HandleShareUnbindBroadCast, (const std::string &, const int32_t &, const std::string &)); MOCK_METHOD(int32_t, CheckDeviceInfoPermission, (const std::string &, const std::string &)); MOCK_METHOD(void, HandleAppUnBindEvent, (int32_t remoteUserId, const std::string &remoteUdid, int32_t tokenId));