diff --git a/commondependency/include/deviceprofile_connector.h b/commondependency/include/deviceprofile_connector.h index 1aa8990e17a5031f78fa60426d4f400ebc7c6ec6..7665e3980d20b7816a2d823a6b4ee6c1352add36 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 4b3a3b1dda40d5aa3b6c5316d630de34f47f3499..30f4283756ae589639757635042465cabb45f009 100644 --- a/commondependency/src/deviceprofile_connector.cpp +++ b/commondependency/src/deviceprofile_connector.cpp @@ -1137,50 +1137,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, @@ -1896,20 +1962,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)); @@ -2485,19 +2553,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 32892edcc098ad633956e9c7e8c483bd482bd5e2..79b394f15771bf16a71fb714db9621cca25e2ce7 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 e85db72922df6703f92e12774e5625729423385e..e8eeadb323ced5fb584c4d195dbb651bcb7c0fbd 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 7e22d16a890f33f2410849e04ada8542e191a20a..7106d870407d3c91f5aec8d78157a8c78a521a13 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); @@ -295,6 +294,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 f52494632384d2f4ebaf68ac34cacd59e78507b4..5180e9530c3739d97ca28005ebbfa68e041b2956 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 0d38868934dd057183e676d037900ceca26f7396..18afcf9f640a12066ee309d0471e62df48fdc617 100644 --- a/services/implementation/src/device_manager_service_impl.cpp +++ b/services/implementation/src/device_manager_service_impl.cpp @@ -1856,28 +1856,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) @@ -2032,22 +2060,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 279490b25ce189ac03908dc4af5583fcce3e4ff6..eb21abdb520d6af1bc9c122d64f7af7200298e54 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 fbf03d22ab075989afc2b3f3cefeca6d724a6801..a01c3a210ebff9ad4524b725f9c177d19a48bfef 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; int32_t OpenAuthSessionWithPara(const std::string &deviceId, int32_t actionId, bool isEnable160m) override; @@ -132,6 +133,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 0a49ec5153d0c4d5d011319dcae2b570f206e349..70208a46bbc9327232d31f328188fc57fe7430ce 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 c32ff62d28d9928ff9ba0a52d9e2c805201924fa..00777c55315db927aeb912077bf9355980e47cf0 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 d1d0a84b8377d0256468ec5d844b975814030128..08cbb05a4224977dcdfac0fa2aa3e9b206066b97 100644 --- a/services/service/src/device_manager_service_listener.cpp +++ b/services/service/src/device_manager_service_listener.cpp @@ -56,6 +56,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" }; @@ -790,6 +792,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_); @@ -802,6 +810,10 @@ void DeviceManagerServiceListener::ProcessDeviceOffline(const std::vector autoLock(alreadyNotifyPkgNameLock_); + actUnrelatedPkgName_.clear(); + } } void DeviceManagerServiceListener::ProcessDeviceInfoChange(const std::vector &procInfoVec, @@ -1011,6 +1023,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 5400124c7787019e620ca5d467c4a4f7b08dda66..9779e73797222fe996c8103561b3c45f829e57a4 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 de578f338e99e8f3d42adedfd77727140c9b0f6e..5282d24cdabc5736d49934ff5e8c60ab55919e5e 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 c2c5a453e4d6edd33613bd957b1ebb2a86efd3b2..fee4c507201c4a8b978797e8edc176e0f1a73706 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 3badcf2992de30ab7a6b0953da5f31fdb3e8f0a8..dab94b6c117912b10f5a05939f0e327e233fe307 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 58c9e4ef6409ccfa8623031ea085b3e763428f38..b28cf20ccc598605845e83e386b3b9bf303880b6 100644 --- a/test/unittest/UTTest_dm_pin_holder.h +++ b/test/unittest/UTTest_dm_pin_holder.h @@ -261,6 +261,9 @@ public: return ""; } + virtual void SetExistPkgName(const std::set &pkgNameSet) + { + (void)pkgNameSet; virtual int32_t OpenAuthSessionWithPara(const std::string &deviceId, int32_t actionId, bool isEnable160m) { (void)deviceId; diff --git a/test/unittest/mock/deviceprofile_connector_mock.cpp b/test/unittest/mock/deviceprofile_connector_mock.cpp index 4f82813a289ff08bcde1d6432d874c10a940a3a5..0c587d2790a59846e108d2372c230a3a1518039f 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 84d5c9d04804bd05482ac71f3d149a58a32ab81a..467c99ad450d7e6e470df890701999478888024b 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 &));