From f576d95741ac9ff8c7e585a22d0dd01f2e6fd58a Mon Sep 17 00:00:00 2001 From: BrainL Date: Mon, 9 Jun 2025 18:18:34 +0800 Subject: [PATCH] process account logout Signed-off-by: BrainL --- .../include/deviceprofile_connector.h | 9 +- .../src/deviceprofile_connector.cpp | 124 ++++++++++++++---- .../native_cpp/include/dm_device_info.h | 7 + .../idevice_manager_service_listener.h | 3 + .../include/device_manager_service_impl.h | 4 +- .../device_manager_service_impl_lite.h | 3 +- .../src/device_manager_service_impl.cpp | 83 ++++++++---- .../src/device_manager_service_impl_lite.cpp | 9 +- .../include/device_manager_service_listener.h | 3 + .../include/idevice_manager_service_impl.h | 3 +- .../service/src/device_manager_service.cpp | 3 +- .../src/device_manager_service_listener.cpp | 21 +++ .../UTTest_dm_deviceprofile_connector.cpp | 17 +-- ...Test_dm_deviceprofile_connector_second.cpp | 4 +- .../UTTest_device_manager_service_impl.cpp | 18 +-- ...Test_device_manager_service_impl_first.cpp | 6 +- test/unittest/UTTest_dm_pin_holder.h | 5 + .../mock/deviceprofile_connector_mock.cpp | 8 +- .../mock/deviceprofile_connector_mock.h | 6 +- 19 files changed, 238 insertions(+), 98 deletions(-) diff --git a/commondependency/include/deviceprofile_connector.h b/commondependency/include/deviceprofile_connector.h index 1aa8990e1..7665e3980 100644 --- a/commondependency/include/deviceprofile_connector.h +++ b/commondependency/include/deviceprofile_connector.h @@ -174,8 +174,13 @@ public: std::vector bindTypeVec, std::string localDeviceId, std::string targetDeviceId); int32_t GetDeviceAclParam(DmDiscoveryInfo discoveryInfo, bool &isOnline, int32_t &authForm); - DM_EXPORT bool DeleteAclForAccountLogOut(const std::string &localUdid, - int32_t localUserId, const std::string &peerUdid, int32_t peerUserId, DmOfflineParam &offlineParam); + DM_EXPORT bool DeleteAclForAccountLogOut(const DMAclQuadInfo &info, const std::string &accountId, + DmOfflineParam &offlineParam); + DM_EXPORT bool DeleteAclByActhash(const DMAclQuadInfo &info, const std::string &accountIdHash, + DmOfflineParam &offlineParam); + DM_EXPORT void CacheOfflineParam(const DistributedDeviceProfile::AccessControlProfile &profile, + const DMAclQuadInfo &info, const std::string &accountIdHash, DmOfflineParam &offlineParam, + bool ¬ifyOffline); DM_EXPORT void DeleteAclForUserRemoved(std::string localUdid, int32_t userId, std::vector peerUdids, std::multimap &peerUserIdMap, DmOfflineParam &offlineParam); DM_EXPORT void DeleteAclForRemoteUserRemoved(std::string peerUdid, diff --git a/commondependency/src/deviceprofile_connector.cpp b/commondependency/src/deviceprofile_connector.cpp index aebb45459..9c3109b58 100644 --- a/commondependency/src/deviceprofile_connector.cpp +++ b/commondependency/src/deviceprofile_connector.cpp @@ -1139,50 +1139,116 @@ int32_t DeviceProfileConnector::PutAccessControlList(DmAclInfo aclInfo, DmAccess } DM_EXPORT bool DeviceProfileConnector::DeleteAclForAccountLogOut( - const std::string &localUdid, int32_t localUserId, - const std::string &peerUdid, int32_t peerUserId, DmOfflineParam &offlineParam) + const DMAclQuadInfo &info, const std::string &accountId, DmOfflineParam &offlineParam) { LOGI("localUdid %{public}s, localUserId %{public}d, peerUdid %{public}s, peerUserId %{public}d.", - GetAnonyString(localUdid).c_str(), localUserId, GetAnonyString(peerUdid).c_str(), peerUserId); + GetAnonyString(info.localUdid).c_str(), info.localUserId, GetAnonyString(info.peerUdid).c_str(), + info.peerUserId); std::vector profiles = GetAllAclIncludeLnnAcl(); - std::vector deleteProfiles; bool notifyOffline = false; - bool isDelete = false; for (const auto &item : profiles) { - if (item.GetTrustDeviceId() != peerUdid) { + if (item.GetTrustDeviceId() != info.peerUdid) { continue; } std::string accesserUdid = item.GetAccesser().GetAccesserDeviceId(); std::string accesseeUdid = item.GetAccessee().GetAccesseeDeviceId(); int32_t accesserUserId = item.GetAccesser().GetAccesserUserId(); int32_t accesseeUserId = item.GetAccessee().GetAccesseeUserId(); - if (accesserUdid == localUdid && accesserUserId == localUserId && - accesseeUdid == peerUdid && accesseeUserId == peerUserId) { - if (item.GetBindType() == DM_IDENTICAL_ACCOUNT) { - isDelete = true; - } - deleteProfiles.push_back(item); + std::string accesserAccountId = item.GetAccesser().GetAccesserAccountId(); + std::string accesseeAccountId = item.GetAccessee().GetAccesseeAccountId(); + if (accesserUdid == info.localUdid && accesserUserId == info.localUserId && + accesseeUdid == info.peerUdid && accesseeUserId == info.peerUserId && + accesserAccountId == accountId) { + offlineParam.bindType = item.GetBindType(); + ProcessInfo processInfo; + processInfo.pkgName = item.GetAccesser().GetAccesserBundleName(); + processInfo.pkgName = processInfo.pkgName.empty() ? std::string(DM_PKG_NAME) : processInfo.pkgName; + processInfo.userId = item.GetAccesser().GetAccesserUserId(); + offlineParam.processVec.emplace_back(processInfo); notifyOffline = (item.GetStatus() == ACTIVE); CacheAcerAclId(item, offlineParam.needDelAclInfos); continue; } - if (accesserUdid == peerUdid && accesserUserId == peerUserId && - accesseeUdid == localUdid && accesseeUserId == localUserId) { - if (item.GetBindType() == DM_IDENTICAL_ACCOUNT) { - isDelete = true; - } - deleteProfiles.push_back(item); + if (accesserUdid == info.peerUdid && accesserUserId == info.peerUserId && + accesseeUdid == info.localUdid && accesseeUserId == info.localUserId && + accesseeAccountId == accountId) { + offlineParam.bindType = item.GetBindType(); + ProcessInfo processInfo; + processInfo.pkgName = item.GetAccessee().GetAccesseeBundleName(); + processInfo.pkgName = processInfo.pkgName.empty() ? std::string(DM_PKG_NAME) : processInfo.pkgName; + processInfo.userId = item.GetAccessee().GetAccesseeUserId(); + offlineParam.processVec.emplace_back(processInfo); notifyOffline = (item.GetStatus() == ACTIVE); CacheAceeAclId(item, offlineParam.needDelAclInfos); continue; } } - if (!isDelete) { - return false; + return notifyOffline; +} + +DM_EXPORT bool DeviceProfileConnector::DeleteAclByActhash( + const DMAclQuadInfo &info, const std::string &accountIdHash, DmOfflineParam &offlineParam) +{ + LOGI("localUdid %{public}s, localUserId %{public}d, peerUdid %{public}s, peerUserId %{public}d.", + GetAnonyString(info.localUdid).c_str(), info.localUserId, GetAnonyString(info.peerUdid).c_str(), + info.peerUserId); + std::vector profiles = GetAllAclIncludeLnnAcl(); + bool notifyOffline = false; + for (const auto &item : profiles) { + if (item.GetTrustDeviceId() != info.peerUdid) { + continue; + } + CacheOfflineParam(item, info, accountIdHash, offlineParam, notifyOffline); } return notifyOffline; } +void DeviceProfileConnector::CacheOfflineParam(const DistributedDeviceProfile::AccessControlProfile &profile, + const DMAclQuadInfo &info, const std::string &accountIdHash, DmOfflineParam &offlineParam, bool ¬ifyOffline) +{ + std::string accesserUdid = profile.GetAccesser().GetAccesserDeviceId(); + std::string accesseeUdid = profile.GetAccessee().GetAccesseeDeviceId(); + int32_t accesserUserId = profile.GetAccesser().GetAccesserUserId(); + int32_t accesseeUserId = profile.GetAccessee().GetAccesseeUserId(); + std::string accesserAccountId = profile.GetAccesser().GetAccesserAccountId(); + std::string accesseeAccountId = profile.GetAccessee().GetAccesseeAccountId(); + char accesserAccountIdHash[DM_MAX_DEVICE_ID_LEN] = {0}; + if (Crypto::GetAccountIdHash(accesserAccountId, reinterpret_cast(accesserAccountIdHash)) != DM_OK) { + LOGE("GetAccountHash failed."); + return; + } + char accesseeAccountIdHash[DM_MAX_DEVICE_ID_LEN] = {0}; + if (Crypto::GetAccountIdHash(accesseeAccountId, reinterpret_cast(accesseeAccountIdHash)) != DM_OK) { + LOGE("GetAccountHash failed."); + return; + } + if (accesserUdid == info.localUdid && accesserUserId == info.localUserId && + accesseeUdid == info.peerUdid && accesseeUserId == info.peerUserId && + std::string(accesseeAccountIdHash) == accountIdHash) { + offlineParam.bindType = profile.GetBindType(); + ProcessInfo processInfo; + processInfo.pkgName = profile.GetAccesser().GetAccesserBundleName(); + processInfo.pkgName = processInfo.pkgName.empty() ? std::string(DM_PKG_NAME) : processInfo.pkgName; + processInfo.userId = profile.GetAccesser().GetAccesserUserId(); + offlineParam.processVec.emplace_back(processInfo); + notifyOffline = (profile.GetStatus() == ACTIVE); + CacheAcerAclId(profile, offlineParam.needDelAclInfos); + return; + } + if (accesserUdid == info.peerUdid && accesserUserId == info.peerUserId && + accesseeUdid == info.localUdid && accesseeUserId == info.localUserId && + std::string(accesserAccountIdHash) == accountIdHash) { + offlineParam.bindType = profile.GetBindType(); + ProcessInfo processInfo; + processInfo.pkgName = profile.GetAccessee().GetAccesseeBundleName(); + processInfo.pkgName = processInfo.pkgName.empty() ? std::string(DM_PKG_NAME) : processInfo.pkgName; + processInfo.userId = profile.GetAccessee().GetAccesseeUserId(); + offlineParam.processVec.emplace_back(processInfo); + notifyOffline = (profile.GetStatus() == ACTIVE); + CacheAceeAclId(profile, offlineParam.needDelAclInfos); + return; + } +} DM_EXPORT void DeviceProfileConnector::DeleteAclForUserRemoved(std::string localUdid, int32_t userId, std::vector peerUdids, std::multimap &peerUserIdMap, @@ -1898,20 +1964,22 @@ DM_EXPORT std::multimap DeviceProfileConnector::GetDeviceI { LOGI("localUdid %{public}s, userId %{public}d, accountId %{public}s.", GetAnonyString(localUdid).c_str(), userId, GetAnonyString(accountId).c_str()); - std::vector profiles = GetAllAccessControlProfile(); + std::vector profiles = GetAllAclIncludeLnnAcl(); std::multimap deviceIdMap; for (const auto &item : profiles) { std::string accesserUdid = item.GetAccesser().GetAccesserDeviceId(); std::string accesseeUdid = item.GetAccessee().GetAccesseeDeviceId(); int32_t accesserUserId = item.GetAccesser().GetAccesserUserId(); int32_t accesseeUserId = item.GetAccessee().GetAccesseeUserId(); - if (accesserUdid == localUdid && accesserUserId == userId && item.GetBindType() == DM_IDENTICAL_ACCOUNT) { + std::string accesserAccountId = item.GetAccesser().GetAccesserAccountId(); + std::string accesseeAccountId = item.GetAccessee().GetAccesseeAccountId(); + if (accesserUdid == localUdid && accesserUserId == userId && accesserAccountId == accountId) { LOGI("Account logout trust udid %{public}s userid %{public}d is src.", GetAnonyString(accesseeUdid).c_str(), accesseeUserId); deviceIdMap.insert(std::pair(accesseeUdid, accesseeUserId)); continue; } - if (accesseeUdid == localUdid && accesseeUserId == userId && item.GetBindType() == DM_IDENTICAL_ACCOUNT) { + if (accesseeUdid == localUdid && accesseeUserId == userId && accesseeAccountId == accountId) { LOGI("Account logout trust udid %{public}s userid %{public}d is sink.", GetAnonyString(accesserUdid).c_str(), accesserUserId); deviceIdMap.insert(std::pair(accesserUdid, accesserUserId)); @@ -2503,19 +2571,17 @@ DM_EXPORT std::multimap DeviceProfileConnector::GetDevIdAn } LOGI("accesserAccountIdHash %{public}s, accesseeAccountIdHash %{public}s", accesserAccountIdHash, accesseeAccountIdHash); - if (std::string(accesserAccountIdHash) != peerAccountHash || - std::string(accesseeAccountIdHash) != peerAccountHash) { - continue; - } std::string accesserUdid = item.GetAccesser().GetAccesserDeviceId(); std::string accesseeUdid = item.GetAccessee().GetAccesseeDeviceId(); int32_t accesserUserid = item.GetAccesser().GetAccesserUserId(); int32_t accesseeUserid = item.GetAccessee().GetAccesseeUserId(); - if (accesserUdid == localUdid && accesseeUdid == peerUdid && accesseeUserid == peerUserId) { + if (accesserUdid == localUdid && accesseeUdid == peerUdid && accesseeUserid == peerUserId && + std::string(accesseeAccountIdHash) == peerAccountHash) { deviceIdMap.insert(std::pair(accesserUdid, accesserUserid)); continue; } - if (accesseeUdid == localUdid && accesserUdid == peerUdid && accesserUserid == peerUserId) { + if (accesseeUdid == localUdid && accesserUdid == peerUdid && accesserUserid == peerUserId && + std::string(accesserAccountIdHash) == peerAccountHash) { deviceIdMap.insert(std::pair(accesseeUdid, accesseeUserid)); continue; } diff --git a/interfaces/inner_kits/native_cpp/include/dm_device_info.h b/interfaces/inner_kits/native_cpp/include/dm_device_info.h index 32892edcc..79b394f15 100644 --- a/interfaces/inner_kits/native_cpp/include/dm_device_info.h +++ b/interfaces/inner_kits/native_cpp/include/dm_device_info.h @@ -462,6 +462,13 @@ typedef struct DevUserInfo { std::string deviceId; int32_t userId; } DevUserInfo; + +typedef struct DMAclQuadInfo { + std::string localUdid; + int32_t localUserId; + std::string peerUdid; + int32_t peerUserId; +} DMAclQuadInfo; } // namespace DistributedHardware } // namespace OHOS #endif // OHOS_DM_DEVICE_INFO_H \ No newline at end of file diff --git a/interfaces/inner_kits/native_cpp/include/idevice_manager_service_listener.h b/interfaces/inner_kits/native_cpp/include/idevice_manager_service_listener.h index 5fc5b0a45..27ca66104 100644 --- a/interfaces/inner_kits/native_cpp/include/idevice_manager_service_listener.h +++ b/interfaces/inner_kits/native_cpp/include/idevice_manager_service_listener.h @@ -16,6 +16,8 @@ #ifndef OHOS_I_DM_SERVICE_LISTENER_H #define OHOS_I_DM_SERVICE_LISTENER_H +#include + #include "dm_device_info.h" #include "dm_device_profile_info.h" @@ -171,6 +173,7 @@ public: const std::string &deviceName, int32_t code) = 0; virtual void OnSetRemoteDeviceNameResult(const ProcessInfo &processInfo, const std::string &deviceId, const std::string &deviceName, int32_t code) = 0; + virtual void SetExistPkgName(const std::set &pkgNameSet) = 0; /** * @brief Get the Local Display Device Name after privacy processed diff --git a/services/implementation/include/device_manager_service_impl.h b/services/implementation/include/device_manager_service_impl.h index 8849dd626..6dc98eed8 100644 --- a/services/implementation/include/device_manager_service_impl.h +++ b/services/implementation/include/device_manager_service_impl.h @@ -155,8 +155,7 @@ public: void HandleDeviceNotTrust(const std::string &udid); int32_t GetBindLevel(const std::string &pkgName, const std::string &localUdid, const std::string &udid, uint64_t &tokenId); - void HandleIdentAccountLogout(const std::string &localUdid, int32_t localUserId, const std::string &peerUdid, - int32_t peerUserId); + void HandleIdentAccountLogout(const DMAclQuadInfo &info, const std::string &accountId); void HandleDeviceScreenStatusChange(DmDeviceInfo &devInfo); int32_t StopAuthenticateDevice(const std::string &pkgName); void HandleCredentialAuthStatus(const std::string &deviceList, uint16_t deviceTypeId, int32_t errcode); @@ -300,6 +299,7 @@ private: const std::string &pkgName); void OnAuthResultAndOnBindResult(const ProcessInfo &processInfo, const PeerTargetId &targetId, const std::string &deviceId, int32_t reason); + void GetBundleName(const DMAclQuadInfo &info, std::set &pkgNameSet); private: std::shared_ptr authMgr_; // Old protocol only diff --git a/services/implementation/include/device_manager_service_impl_lite.h b/services/implementation/include/device_manager_service_impl_lite.h index f52494632..5180e9530 100644 --- a/services/implementation/include/device_manager_service_impl_lite.h +++ b/services/implementation/include/device_manager_service_impl_lite.h @@ -138,8 +138,7 @@ public: void HandleAppUnBindEvent(int32_t remoteUserId, const std::string &remoteUdid, int32_t tokenId); void HandleAppUnBindEvent(int32_t remoteUserId, const std::string &remoteUdid, int32_t tokenId, int32_t peerTokenId); - void HandleIdentAccountLogout(const std::string &localUdid, int32_t localUserId, const std::string &peerUdid, - int32_t peerUserId); + void HandleIdentAccountLogout(const DMAclQuadInfo &info, const std::string &accountId); void HandleUserRemoved(std::vector peerUdids, int32_t preUserId); void HandleDeviceScreenStatusChange(DmDeviceInfo &devInfo); void HandleUserSwitched(const std::vector &deviceVec, int32_t currentUserId, diff --git a/services/implementation/src/device_manager_service_impl.cpp b/services/implementation/src/device_manager_service_impl.cpp index 236880e52..cfc53099e 100644 --- a/services/implementation/src/device_manager_service_impl.cpp +++ b/services/implementation/src/device_manager_service_impl.cpp @@ -1896,28 +1896,56 @@ void DeviceManagerServiceImpl::LoadHardwareFwkService() DmDistributedHardwareLoad::GetInstance().LoadDistributedHardwareFwk(); } -void DeviceManagerServiceImpl::HandleIdentAccountLogout(const std::string &localUdid, int32_t localUserId, - const std::string &peerUdid, int32_t peerUserId) +void DeviceManagerServiceImpl::HandleIdentAccountLogout(const DMAclQuadInfo &info, const std::string &accountId) { LOGI("localUdid %{public}s, localUserId %{public}d, peerUdid %{public}s, peerUserId %{public}d.", - GetAnonyString(localUdid).c_str(), localUserId, GetAnonyString(peerUdid).c_str(), peerUserId); + GetAnonyString(info.localUdid).c_str(), info.localUserId, GetAnonyString(info.peerUdid).c_str(), + info.peerUserId); DmOfflineParam offlineParam; - bool notifyOffline = DeviceProfileConnector::GetInstance().DeleteAclForAccountLogOut(localUdid, localUserId, - peerUdid, peerUserId, offlineParam); + bool notifyOffline = DeviceProfileConnector::GetInstance().DeleteAclForAccountLogOut(info, accountId, + offlineParam); + CHECK_NULL_VOID(hiChainConnector_); + hiChainConnector_->DeleteAllGroup(info.localUserId); + CHECK_NULL_VOID(hiChainAuthConnector_); + hiChainAuthConnector_->DeleteCredential(info.peerUdid, info.localUserId, info.peerUserId); + DeleteSkCredAndAcl(offlineParam.needDelAclInfos); + + std::set pkgNameSet; + GetBundleName(info, pkgNameSet); if (notifyOffline) { - ProcessInfo processInfo; - processInfo.pkgName = std::string(DM_PKG_NAME); - processInfo.userId = localUserId; CHECK_NULL_VOID(softbusConnector_); - softbusConnector_->SetProcessInfo(processInfo); + softbusConnector_->SetProcessInfoVec(offlineParam.processVec); + CHECK_NULL_VOID(listener_); + listener_->SetExistPkgName(pkgNameSet); CHECK_NULL_VOID(deviceStateMgr_); - deviceStateMgr_->OnDeviceOffline(peerUdid); + deviceStateMgr_->OnDeviceOffline(info.peerUdid); + } +} + +void DeviceManagerServiceImpl::GetBundleName(const DMAclQuadInfo &info, std::set &pkgNameSet) +{ + std::vector profiles = + DeviceProfileConnector::GetInstance().GetAllAclIncludeLnnAcl(); + for (auto &item : profiles) { + std::string accesserUdid = item.GetAccesser().GetAccesserDeviceId(); + std::string accesseeUdid = item.GetAccessee().GetAccesseeDeviceId(); + int32_t accesserUserId = item.GetAccesser().GetAccesserUserId(); + int32_t accesseeUserId = item.GetAccessee().GetAccesseeUserId(); + std::string accesserPkgName = item.GetAccesser().GetAccesserBundleName(); + std::string accesseePkgName = item.GetAccessee().GetAccesseeBundleName(); + if (accesserUdid == info.localUdid && accesserUserId == info.localUserId && + accesseeUdid == info.peerUdid && accesseeUserId == info.peerUserId && + (!accesserPkgName.empty())) { + pkgNameSet.insert(accesserPkgName); + continue; + } + if (accesserUdid == info.peerUdid && accesserUserId == info.peerUserId && + accesseeUdid == info.localUdid && accesseeUserId == info.localUserId && + (!accesseePkgName.empty())) { + pkgNameSet.insert(accesseePkgName); + continue; + } } - CHECK_NULL_VOID(hiChainConnector_); - hiChainConnector_->DeleteAllGroup(localUserId); - CHECK_NULL_VOID(hiChainAuthConnector_); - hiChainAuthConnector_->DeleteCredential(peerUdid, localUserId, peerUserId); - DeleteSkCredAndAcl(offlineParam.needDelAclInfos); } void DeviceManagerServiceImpl::HandleUserRemoved(std::vector peerUdids, int32_t preUserId) @@ -2072,22 +2100,25 @@ void DeviceManagerServiceImpl::HandleAccountLogoutEvent(int32_t remoteUserId, co for (const auto &item : devIdAndUserMap) { DmOfflineParam offlineParam; LOGI("remoteUdid %{public}s.", GetAnonyString(remoteUdid).c_str()); - bool notifyOffline = DeviceProfileConnector::GetInstance().DeleteAclForAccountLogOut(item.first, item.second, - remoteUdid, remoteUserId, offlineParam); - if (notifyOffline) { - ProcessInfo processInfo; - processInfo.pkgName = std::string(DM_PKG_NAME); - processInfo.userId = item.second; - CHECK_NULL_VOID(softbusConnector_); - softbusConnector_->SetProcessInfo(processInfo); - CHECK_NULL_VOID(deviceStateMgr_); - deviceStateMgr_->OnDeviceOffline(remoteUdid); - } + DMAclQuadInfo info = {item.first, item.second, remoteUdid, remoteUserId}; + bool notifyOffline = DeviceProfileConnector::GetInstance().DeleteAclByActhash(info, + remoteAccountHash, offlineParam); + CHECK_NULL_VOID(hiChainConnector_); hiChainConnector_->DeleteAllGroup(item.second); CHECK_NULL_VOID(hiChainAuthConnector_); hiChainAuthConnector_->DeleteCredential(remoteUdid, item.second, remoteUserId); DeleteSkCredAndAcl(offlineParam.needDelAclInfos); + std::set pkgNameSet; + GetBundleName(info, pkgNameSet); + if (notifyOffline) { + CHECK_NULL_VOID(softbusConnector_); + softbusConnector_->SetProcessInfoVec(offlineParam.processVec); + CHECK_NULL_VOID(listener_); + listener_->SetExistPkgName(pkgNameSet); + CHECK_NULL_VOID(deviceStateMgr_); + deviceStateMgr_->OnDeviceOffline(remoteUdid); + } } } diff --git a/services/implementation/src/device_manager_service_impl_lite.cpp b/services/implementation/src/device_manager_service_impl_lite.cpp index 279490b25..eb21abdb5 100644 --- a/services/implementation/src/device_manager_service_impl_lite.cpp +++ b/services/implementation/src/device_manager_service_impl_lite.cpp @@ -506,13 +506,10 @@ void DeviceManagerServiceImpl::HandleAppUnBindEvent(int32_t remoteUserId, const return; } -void DeviceManagerServiceImpl::HandleIdentAccountLogout(const std::string &localUdid, int32_t localUserId, - const std::string &peerUdid, int32_t peerUserId) +void DeviceManagerServiceImpl::HandleIdentAccountLogout(const DMAclQuadInfo &info, const std::string &accountId) { - (void)localUdid; - (void)localUserId; - (void)peerUdid; - (void)peerUserId; + (void)info; + (void)accountId; return; } diff --git a/services/service/include/device_manager_service_listener.h b/services/service/include/device_manager_service_listener.h index f4780273b..ea839b3c9 100644 --- a/services/service/include/device_manager_service_listener.h +++ b/services/service/include/device_manager_service_listener.h @@ -89,6 +89,7 @@ public: const std::string &deviceName, int32_t code) override; void OnSetRemoteDeviceNameResult(const ProcessInfo &processInfo, const std::string &deviceId, const std::string &deviceName, int32_t code) override; + void SetExistPkgName(const std::set &pkgNameSet) override; std::string GetLocalDisplayDeviceNameForPrivacy() override; @@ -131,6 +132,8 @@ private: static std::mutex alreadyNotifyPkgNameLock_; static std::map alreadyOnlinePkgName_; static std::unordered_set highPriorityPkgNameSet_; + static std::mutex actUnrelatedPkgNameLock_; + static std::set actUnrelatedPkgName_; #endif }; } // namespace DistributedHardware diff --git a/services/service/include/idevice_manager_service_impl.h b/services/service/include/idevice_manager_service_impl.h index 0a49ec515..70208a46b 100644 --- a/services/service/include/idevice_manager_service_impl.h +++ b/services/service/include/idevice_manager_service_impl.h @@ -238,8 +238,7 @@ public: int32_t tokenId, int32_t peerTokenId) = 0; virtual int32_t GetBindLevel(const std::string &pkgName, const std::string &localUdid, const std::string &udid, uint64_t &tokenId) = 0; - virtual void HandleIdentAccountLogout(const std::string &localUdid, int32_t localUserId, - const std::string &peerUdid, int32_t peerUserId) = 0; + virtual void HandleIdentAccountLogout(const DMAclQuadInfo &info, const std::string &accountId) = 0; virtual void HandleUserRemoved(std::vector peerUdids, int32_t preUserId) = 0; virtual void HandleDeviceScreenStatusChange(DmDeviceInfo &devInfo) = 0; virtual void HandleUserSwitched(const std::vector &deviceVec, int32_t currentUserId, diff --git a/services/service/src/device_manager_service.cpp b/services/service/src/device_manager_service.cpp index 2bcd88c8f..f2614ac1a 100644 --- a/services/service/src/device_manager_service.cpp +++ b/services/service/src/device_manager_service.cpp @@ -2427,7 +2427,8 @@ void DeviceManagerService::HandleAccountLogout(int32_t userId, const std::string NotifyRemoteLocalLogout(peerUdids, std::string(accountIdHash), accountName, userId); } for (const auto &item : deviceMap) { - dmServiceImpl_->HandleIdentAccountLogout(localUdid, userId, item.first, item.second); + DMAclQuadInfo info = {localUdid, userId, item.first, item.second}; + dmServiceImpl_->HandleIdentAccountLogout(info, accountId); } } diff --git a/services/service/src/device_manager_service_listener.cpp b/services/service/src/device_manager_service_listener.cpp index 2fa0fe73b..f48a13847 100644 --- a/services/service/src/device_manager_service_listener.cpp +++ b/services/service/src/device_manager_service_listener.cpp @@ -55,6 +55,8 @@ namespace OHOS { namespace DistributedHardware { std::mutex DeviceManagerServiceListener::alreadyNotifyPkgNameLock_; std::map DeviceManagerServiceListener::alreadyOnlinePkgName_ = {}; +std::mutex DeviceManagerServiceListener::actUnrelatedPkgNameLock_; +std::set DeviceManagerServiceListener::actUnrelatedPkgName_ = {}; std::unordered_set DeviceManagerServiceListener::highPriorityPkgNameSet_ = { "ohos.deviceprofile", "ohos.distributeddata.service" }; @@ -789,6 +791,12 @@ void DeviceManagerServiceListener::ProcessDeviceOffline(const std::vector pReq = std::make_shared(); std::shared_ptr pRsp = std::make_shared(); for (const auto &it : procInfoVec) { + { + std::lock_guard autoLock(alreadyNotifyPkgNameLock_); + if (actUnrelatedPkgName_.find(it.pkgName) != actUnrelatedPkgName_.end()) { + continue; + } + } std::string notifyPkgName = it.pkgName + "#" + std::to_string(it.userId) + "#" + std::string(info.deviceId); { std::lock_guard autoLock(alreadyNotifyPkgNameLock_); @@ -801,6 +809,10 @@ void DeviceManagerServiceListener::ProcessDeviceOffline(const std::vector autoLock(alreadyNotifyPkgNameLock_); + actUnrelatedPkgName_.clear(); + } } void DeviceManagerServiceListener::ProcessDeviceInfoChange(const std::vector &procInfoVec, @@ -1010,6 +1022,15 @@ void DeviceManagerServiceListener::OnSetRemoteDeviceNameResult(const ProcessInfo ipcServerListener_.SendRequest(SET_REMOTE_DEVICE_NAME_RESULT, pReq, pRsp); } +void DeviceManagerServiceListener::SetExistPkgName(const std::set &pkgNameSet) +{ + std::lock_guard autoLock(actUnrelatedPkgNameLock_); + actUnrelatedPkgName_.clear(); + for (auto it : pkgNameSet) { + actUnrelatedPkgName_.insert(it); + } +} + std::string DeviceManagerServiceListener::GetLocalDisplayDeviceNameForPrivacy() { #if !(defined(__LITEOS_M__) || defined(LITE_DEVICE)) diff --git a/test/commonunittest/UTTest_dm_deviceprofile_connector.cpp b/test/commonunittest/UTTest_dm_deviceprofile_connector.cpp index 5400124c7..9779e7379 100644 --- a/test/commonunittest/UTTest_dm_deviceprofile_connector.cpp +++ b/test/commonunittest/UTTest_dm_deviceprofile_connector.cpp @@ -1465,40 +1465,37 @@ HWTEST_F(DeviceProfileConnectorTest, DeleteAclForAccountLogOut_001, testing::ext std::string peerUdid = "deviceId"; int32_t peerUserId = 555; DmOfflineParam offlineParam; - bool ret = DeviceProfileConnector::GetInstance().DeleteAclForAccountLogOut(localUdid, localUserId, - peerUdid, peerUserId, offlineParam); + DMAclQuadInfo info = {localUdid, localUserId, peerUdid, peerUserId}; + std::string accoutId = "accountId"; + bool ret = DeviceProfileConnector::GetInstance().DeleteAclForAccountLogOut(info, accoutId, offlineParam); EXPECT_FALSE(ret); localUdid = "deviceId"; localUserId = 123456; peerUdid = "deviceId"; peerUserId = 456; - ret = DeviceProfileConnector::GetInstance().DeleteAclForAccountLogOut(localUdid, localUserId, peerUdid, peerUserId, - offlineParam); + ret = DeviceProfileConnector::GetInstance().DeleteAclForAccountLogOut(info, accoutId, offlineParam); EXPECT_FALSE(ret); localUdid = "deviceId"; localUserId = 123456; peerUdid = "deviceId"; peerUserId = 123456; - ret = DeviceProfileConnector::GetInstance().DeleteAclForAccountLogOut(localUdid, localUserId, peerUdid, peerUserId, - offlineParam); + ret = DeviceProfileConnector::GetInstance().DeleteAclForAccountLogOut(info, accoutId, offlineParam); EXPECT_FALSE(ret); localUdid = "localDeviceId"; localUserId = 123456; peerUdid = "remoteDeviceId"; peerUserId = 123456; - ret = DeviceProfileConnector::GetInstance().DeleteAclForAccountLogOut(localUdid, localUserId, peerUdid, peerUserId, - offlineParam); + ret = DeviceProfileConnector::GetInstance().DeleteAclForAccountLogOut(info, accoutId, offlineParam); EXPECT_FALSE(ret); localUdid = "remoteDeviceId"; localUserId = 1234; peerUdid = "localDeviceId"; peerUserId = 1234; - ret = DeviceProfileConnector::GetInstance().DeleteAclForAccountLogOut(localUdid, localUserId, peerUdid, peerUserId, - offlineParam); + ret = DeviceProfileConnector::GetInstance().DeleteAclForAccountLogOut(info, accoutId, offlineParam); EXPECT_FALSE(ret); } diff --git a/test/commonunittest/UTTest_dm_deviceprofile_connector_second.cpp b/test/commonunittest/UTTest_dm_deviceprofile_connector_second.cpp index de578f338..5282d24cd 100644 --- a/test/commonunittest/UTTest_dm_deviceprofile_connector_second.cpp +++ b/test/commonunittest/UTTest_dm_deviceprofile_connector_second.cpp @@ -242,8 +242,10 @@ HWTEST_F(DeviceProfileConnectorSecondTest, DeleteAclForAccountLogOut_001, testin std::string peerUdid = "peer_device_id"; int32_t peerUserId = 2; DmOfflineParam offlineParam; + DMAclQuadInfo info = {localUdid, localUserId, peerUdid, peerUserId}; + std::string accoutId = "accountId"; EXPECT_CALL(*distributedDeviceProfileClientMock_, GetAllAccessControlProfile(_)).WillOnce(Return(DM_OK)); - int32_t result = connector.DeleteAclForAccountLogOut(localUdid, localUserId, peerUdid, peerUserId, offlineParam); + int32_t result = connector.DeleteAclForAccountLogOut(info, accoutId, offlineParam); EXPECT_EQ(result, false); } diff --git a/test/unittest/UTTest_device_manager_service_impl.cpp b/test/unittest/UTTest_device_manager_service_impl.cpp index c2c5a453e..fee4c5072 100644 --- a/test/unittest/UTTest_device_manager_service_impl.cpp +++ b/test/unittest/UTTest_device_manager_service_impl.cpp @@ -470,16 +470,16 @@ HWTEST_F(DeviceManagerServiceImplTest, NotifyEvent_005, testing::ext::TestSize.L devIdAndUserMap.insert(std::make_pair("devId02", 102)); devIdAndUserMap.insert(std::make_pair("devId03", 103)); EXPECT_CALL(*deviceProfileConnectorMock_, GetDevIdAndUserIdByActHash(_, _, _, _)).WillOnce(Return(devIdAndUserMap)); - EXPECT_CALL(*deviceProfileConnectorMock_, DeleteAclForAccountLogOut(_, _, _, _, _)) - .Times(::testing::AtLeast(3)).WillOnce(Return(true)); deviceManagerServiceImpl_->HandleAccountLogoutEvent(remoteUserId, remoteAccountHash, remoteUdid); std::string localUdid = "localUdid"; int32_t localUserId = 123; std::string peerUdid = "peerUdid"; int32_t peerUserId = 456; - EXPECT_CALL(*deviceProfileConnectorMock_, DeleteAclForAccountLogOut(_, _, _, _, _)).WillOnce(Return(true)); - deviceManagerServiceImpl_->HandleIdentAccountLogout(localUdid, localUserId, peerUdid, peerUserId); + EXPECT_CALL(*deviceProfileConnectorMock_, DeleteAclForAccountLogOut(_, _, _)).WillOnce(Return(true)); + DMAclQuadInfo info = {localUdid, localUserId, peerUdid, peerUserId}; + std::string accountId = "accountId"; + deviceManagerServiceImpl_->HandleIdentAccountLogout(info, accountId); EXPECT_CALL(*dmDeviceStateManagerMock_, ProcNotifyEvent(_, _)).WillOnce(Return(DM_OK)); int ret = deviceManagerServiceImpl_->NotifyEvent(pkgName, eventId, event); @@ -1497,9 +1497,10 @@ HWTEST_F(DeviceManagerServiceImplTest, UnBindDevice_104, testing::ext::TestSize. int32_t userId = 100; std::string accountId = "60008"; std::vector peerUdids; - EXPECT_CALL(*deviceProfileConnectorMock_, DeleteAclForAccountLogOut(_, _, _, _, _)) + EXPECT_CALL(*deviceProfileConnectorMock_, DeleteAclForAccountLogOut(_, _, _)) .Times(::testing::AtLeast(1)).WillOnce(Return(true)); - deviceManagerServiceImpl_->HandleIdentAccountLogout(udid, userId, udid, userId); + DMAclQuadInfo info = {udid, userId, udid, userId}; + deviceManagerServiceImpl_->HandleIdentAccountLogout(info, accountId); deviceManagerServiceImpl_->HandleUserRemoved(peerUdids, userId); deviceManagerServiceImpl_->HandleDeviceNotTrust(udid); EXPECT_NE(ret, ERR_DM_INPUT_PARA_INVALID); @@ -1843,7 +1844,7 @@ HWTEST_F(DeviceManagerServiceImplTest, GetDeviceIdAndUserId_001, testing::ext::T int32_t localUserId = 123456; std::string peerUdid = "remoteUdid"; int32_t peerUserId = 1; - EXPECT_CALL(*deviceProfileConnectorMock_, DeleteAclForAccountLogOut(_, _, _, _, _)).WillRepeatedly(Return(true)); + EXPECT_CALL(*deviceProfileConnectorMock_, DeleteAclForAccountLogOut(_, _, _)).WillRepeatedly(Return(true)); if (deviceManagerServiceImpl_->softbusConnector_ == nullptr) { deviceManagerServiceImpl_->Initialize(listener_); } @@ -1851,7 +1852,8 @@ HWTEST_F(DeviceManagerServiceImplTest, GetDeviceIdAndUserId_001, testing::ext::T if (deviceManagerServiceImpl_->deviceStateMgr_ == nullptr) { deviceManagerServiceImpl_->Initialize(listener_); } - deviceManagerServiceImpl_->HandleIdentAccountLogout(localUdid, localUserId, peerUdid, peerUserId); + DMAclQuadInfo info = {localUdid, localUserId, peerUdid, peerUserId}; + deviceManagerServiceImpl_->HandleIdentAccountLogout(info, accountId); std::vector foregroundUserIds; std::vector backgroundUserIds; diff --git a/test/unittest/UTTest_device_manager_service_impl_first.cpp b/test/unittest/UTTest_device_manager_service_impl_first.cpp index 3badcf299..dab94b6c1 100644 --- a/test/unittest/UTTest_device_manager_service_impl_first.cpp +++ b/test/unittest/UTTest_device_manager_service_impl_first.cpp @@ -77,7 +77,7 @@ HWTEST_F(DeviceManagerServiceImplFirstTest, GetDeviceIdAndUserId_101, testing::e int32_t localUserId = 123456; std::string peerUdid = "remoteUdid"; int32_t peerUserId = 1; - EXPECT_CALL(*deviceProfileConnectorMock_, DeleteAclForAccountLogOut(_, _, _, _, _)).WillOnce(Return(true)); + EXPECT_CALL(*deviceProfileConnectorMock_, DeleteAclForAccountLogOut(_, _, _)).WillOnce(Return(true)); if (deviceManagerServiceImpl_->softbusConnector_ == nullptr) { deviceManagerServiceImpl_->Initialize(listener_); } @@ -85,7 +85,9 @@ HWTEST_F(DeviceManagerServiceImplFirstTest, GetDeviceIdAndUserId_101, testing::e if (deviceManagerServiceImpl_->deviceStateMgr_ == nullptr) { deviceManagerServiceImpl_->Initialize(listener_); } - deviceManagerServiceImpl_->HandleIdentAccountLogout(localUdid, localUserId, peerUdid, peerUserId); + DMAclQuadInfo info = {localUdid, localUserId, peerUdid, peerUserId}; + std::string accoutId = "accountId"; + deviceManagerServiceImpl_->HandleIdentAccountLogout(info, accoutId); std::vector foregroundUserIds; std::vector backgroundUserIds; diff --git a/test/unittest/UTTest_dm_pin_holder.h b/test/unittest/UTTest_dm_pin_holder.h index 3b3746bab..e6c45a7fc 100644 --- a/test/unittest/UTTest_dm_pin_holder.h +++ b/test/unittest/UTTest_dm_pin_holder.h @@ -260,6 +260,11 @@ public: { return ""; } + + virtual void SetExistPkgName(const std::set &pkgNameSet) + { + (void)pkgNameSet; + } }; } // namespace DistributedHardware } // namespace OHOS diff --git a/test/unittest/mock/deviceprofile_connector_mock.cpp b/test/unittest/mock/deviceprofile_connector_mock.cpp index 4f82813a2..0c587d279 100644 --- a/test/unittest/mock/deviceprofile_connector_mock.cpp +++ b/test/unittest/mock/deviceprofile_connector_mock.cpp @@ -50,11 +50,11 @@ std::map DeviceProfileConnector::GetUserIdAndBindLevel(const s return DmDeviceProfileConnector::dmDeviceProfileConnector->GetUserIdAndBindLevel(localUdid, peerUdid); } -bool DeviceProfileConnector::DeleteAclForAccountLogOut(const std::string &localUdid, int32_t localUserId, - const std::string &peerUdid, int32_t peerUserId, DmOfflineParam &offlineParam) +bool DeviceProfileConnector::DeleteAclForAccountLogOut(const DMAclQuadInfo &info, const std::string &accountId, + DmOfflineParam &offlineParam) { - return DmDeviceProfileConnector::dmDeviceProfileConnector->DeleteAclForAccountLogOut(localUdid, localUserId, - peerUdid, peerUserId, offlineParam); + return DmDeviceProfileConnector::dmDeviceProfileConnector->DeleteAclForAccountLogOut(info, accountId, + offlineParam); } DmOfflineParam DeviceProfileConnector::HandleAppUnBindEvent(int32_t remoteUserId, diff --git a/test/unittest/mock/deviceprofile_connector_mock.h b/test/unittest/mock/deviceprofile_connector_mock.h index 84d5c9d04..467c99ad4 100644 --- a/test/unittest/mock/deviceprofile_connector_mock.h +++ b/test/unittest/mock/deviceprofile_connector_mock.h @@ -35,8 +35,8 @@ public: virtual uint32_t CheckBindType(std::string trustDeviceId, std::string requestDeviceId) = 0; virtual std::map GetUserIdAndBindLevel(const std::string &localUdid, const std::string &peerUdid) = 0; - virtual bool DeleteAclForAccountLogOut(const std::string &localUdid, int32_t localUserId, - const std::string &peerUdid, int32_t peerUserId, DmOfflineParam &offlineParam) = 0; + virtual bool DeleteAclForAccountLogOut(const DMAclQuadInfo &info, const std::string &accountId, + DmOfflineParam &offlineParam) = 0; virtual DmOfflineParam HandleAppUnBindEvent(int32_t remoteUserId, const std::string &remoteUdid, int32_t tokenId, const std::string &localUdid) = 0; virtual std::multimap GetDevIdAndUserIdByActHash(const std::string &localUdid, @@ -87,7 +87,7 @@ public: const std::string &)); MOCK_METHOD(uint32_t, CheckBindType, (std::string, std::string)); MOCK_METHOD((std::map), GetUserIdAndBindLevel, (const std::string &, const std::string &)); - MOCK_METHOD(bool, DeleteAclForAccountLogOut, (const std::string &, int32_t, const std::string &, int32_t, + MOCK_METHOD(bool, DeleteAclForAccountLogOut, (const DMAclQuadInfo &, const std::string &, DmOfflineParam &)); MOCK_METHOD((DmOfflineParam), HandleAppUnBindEvent, (int32_t, const std::string &, int32_t, const std::string &)); -- Gitee