From 4423b4d89f6dea215bb5601eb521c4a0c970ce41 Mon Sep 17 00:00:00 2001 From: ding_dong_dong Date: Mon, 1 Sep 2025 16:52:22 +0800 Subject: [PATCH] modify multiuser Signed-off-by: ding_dong_dong --- .../src/process_communicator_impl.cpp | 6 +++- .../include/communicator/route_head_handler.h | 2 +- .../route_head_handler_impl.cpp | 29 +++++++++++-------- .../session_manager/route_head_handler_impl.h | 4 +-- .../src/session_manager/session_manager.cpp | 3 -- 5 files changed, 25 insertions(+), 19 deletions(-) diff --git a/services/distributeddataservice/adapter/communicator/src/process_communicator_impl.cpp b/services/distributeddataservice/adapter/communicator/src/process_communicator_impl.cpp index 4eedaa7bc..b7986050f 100644 --- a/services/distributeddataservice/adapter/communicator/src/process_communicator_impl.cpp +++ b/services/distributeddataservice/adapter/communicator/src/process_communicator_impl.cpp @@ -284,12 +284,16 @@ DBStatus ProcessCommunicatorImpl::GetDataUserInfo(DataUserInfo dataUserInfo, std return DBStatus::DB_ERROR; } auto ret = handler->ParseHeadDataUser(dataUserInfo.data, dataUserInfo.totalLen, dataUserInfo.label, userInfos); - if (!ret) { + if (!ret.first) { ZLOGE("illegal head format, dataLen:%{public}u, label:%{public}s, device:%{public}s", dataUserInfo.totalLen, Anonymous::Change(dataUserInfo.label).c_str(), Anonymous::Change(dataUserInfo.device).c_str()); return DBStatus::INVALID_FORMAT; } + if (!ret.second) { + ZLOGE("acl conflict, need retry, device:%{public}s", Anonymous::Change(dataUserInfo.device).c_str()); + return DBStatus::NEED_CORRECT_TARGET_USER; + } if (userInfos.empty()) { ZLOGW("no valid user"); return DBStatus::NO_PERMISSION; diff --git a/services/distributeddataservice/adapter/include/communicator/route_head_handler.h b/services/distributeddataservice/adapter/include/communicator/route_head_handler.h index c379ac097..936919a7a 100644 --- a/services/distributeddataservice/adapter/include/communicator/route_head_handler.h +++ b/services/distributeddataservice/adapter/include/communicator/route_head_handler.h @@ -28,7 +28,7 @@ public: virtual bool ParseHeadDataLen(const uint8_t *data, uint32_t totalLen, uint32_t &headSize, const std::string &device) = 0; - virtual bool ParseHeadDataUser(const uint8_t *data, uint32_t totalLen, const std::string &label, + virtual std::pair ParseHeadDataUser(const uint8_t *data, uint32_t totalLen, const std::string &label, std::vector &userInfos) = 0; }; } // namespace OHOS::DistributedData diff --git a/services/distributeddataservice/app/src/session_manager/route_head_handler_impl.cpp b/services/distributeddataservice/app/src/session_manager/route_head_handler_impl.cpp index 2399a18ef..af87e8552 100644 --- a/services/distributeddataservice/app/src/session_manager/route_head_handler_impl.cpp +++ b/services/distributeddataservice/app/src/session_manager/route_head_handler_impl.cpp @@ -141,7 +141,7 @@ DistributedDB::DBStatus RouteHeadHandlerImpl::GetHeadDataSize(uint32_t &headSize return DistributedDB::DB_ERROR; } size_t expectSize = sizeof(RouteHead) + sizeof(SessionDevicePair) + sizeof(SessionUserPair) + - session_.targetUserIds.size() * sizeof(int) + sizeof(SessionAppId) + session_.appId.size() + + session_.targetUserCount * sizeof(int) + sizeof(SessionAppId) + session_.appId.size() + sizeof(SessionStoreId) + session_.storeId.size() + sizeof(SessionAccountId) + session_.accountId.size(); // align message uint width @@ -220,10 +220,7 @@ bool RouteHeadHandlerImpl::PackDataBody(uint8_t *data, uint32_t totalLen) SessionUserPair *userPair = reinterpret_cast(ptr); userPair->sourceUserId = HostToNet(session_.sourceUserId); - userPair->targetUserCount = session_.targetUserIds.size(); - for (size_t i = 0; i < session_.targetUserIds.size(); ++i) { - *(userPair->targetUserIds + i) = HostToNet(session_.targetUserIds[i]); - } + *(userPair->targetUserIds) = HostToNet(session_.targetUserIds[0]); ptr += (sizeof(SessionUserPair) + session_.targetUserIds.size() * sizeof(int)); const uint8_t *end = data + totalLen; @@ -329,13 +326,13 @@ std::string RouteHeadHandlerImpl::ParseStoreId(const std::string &deviceId, cons return ""; } -bool RouteHeadHandlerImpl::ParseHeadDataUser(const uint8_t *data, uint32_t totalLen, const std::string &label, - std::vector &userInfos) +std::pair RouteHeadHandlerImpl::ParseHeadDataUser(const uint8_t *data, uint32_t totalLen, + const std::string &label, std::vector &userInfos) { uint32_t headSize = 0; auto ret = UnPackData(data, totalLen, headSize); if (!ret) { - return false; + return std::pair(false, false); } auto time = static_cast(duration_cast(system_clock::now().time_since_epoch()).count()); ZLOGI("unpacked size:%{public}u times %{public}" PRIu64 ".", headSize, time); @@ -354,7 +351,7 @@ bool RouteHeadHandlerImpl::ParseHeadDataUser(const uint8_t *data, uint32_t total UserInfo userInfo = { .receiveUser = std::to_string(foregroundUserId), .sendUser = std::to_string(session_.sourceUserId) }; userInfos.emplace_back(userInfo); - return true; + return std::pair(true, true); } } } @@ -370,17 +367,25 @@ bool RouteHeadHandlerImpl::ParseHeadDataUser(const uint8_t *data, uint32_t total auto peerCap = UpgradeManager::GetInstance().GetCapability(session_.sourceDeviceId, flag); if (!flag) { ZLOGI("get peer cap failed, peer deviceId:%{public}s", Anonymous::Change(session_.sourceDeviceId).c_str()); - return false; + return std::pair(false, false); } bool accountFlag = peerCap.version >= CapMetaData::ACCOUNT_VERSION; + bool result = true; for (const auto &item : session_.targetUserIds) { local.userId = item; - if (SessionManager::GetInstance().CheckSession(local, peer, accountFlag)) { + auto flag = SessionManager::GetInstance().CheckSession(local, peer, accountFlag); + auto isForeground = Account::GetInstance()->IsUserForeground(local.userId); + if (!flag && !isForeground) { + result = false; + break; + } + if (flag && (std::to_string(local.userId) != DEFAULT_USERID || isForeground)) { UserInfo userInfo = { .receiveUser = std::to_string(item), .sendUser = std::to_string(peer.userId) }; userInfos.emplace_back(userInfo); + break; } } - return true; + return std::pair(true, result); } bool RouteHeadHandlerImpl::UnPackData(const uint8_t *data, uint32_t totalLen, uint32_t &unpackedSize) diff --git a/services/distributeddataservice/app/src/session_manager/route_head_handler_impl.h b/services/distributeddataservice/app/src/session_manager/route_head_handler_impl.h index 85611780b..12fe51f87 100644 --- a/services/distributeddataservice/app/src/session_manager/route_head_handler_impl.h +++ b/services/distributeddataservice/app/src/session_manager/route_head_handler_impl.h @@ -45,7 +45,7 @@ struct SessionDevicePair { struct SessionUserPair { uint32_t sourceUserId; - uint8_t targetUserCount; + uint8_t targetUserCount = 1; uint32_t targetUserIds[0]; }; @@ -73,7 +73,7 @@ public: DBStatus FillHeadData(uint8_t *data, uint32_t headSize, uint32_t totalLen) override; bool ParseHeadDataLen(const uint8_t *data, uint32_t totalLen, uint32_t &headSize, const std::string &device) override; - bool ParseHeadDataUser(const uint8_t *data, uint32_t totalLen, const std::string &label, + std::pair ParseHeadDataUser(const uint8_t *data, uint32_t totalLen, const std::string &label, std::vector &userInfos) override; std::string GetTargetUserId() override; diff --git a/services/distributeddataservice/app/src/session_manager/session_manager.cpp b/services/distributeddataservice/app/src/session_manager/session_manager.cpp index cb435f6fb..8b786159a 100644 --- a/services/distributeddataservice/app/src/session_manager/session_manager.cpp +++ b/services/distributeddataservice/app/src/session_manager/session_manager.cpp @@ -151,9 +151,6 @@ bool SessionManager::CheckSession(const SessionPoint &local, const SessionPoint peer.userId, peer.deviceId, aclParams); ZLOGD("peer.deviceId:%{public}s, peer.userId:%{public}d, isPermitted:%{public}d, isSameAccount: %{public}d", Anonymous::Change(peer.deviceId).c_str(), peer.userId, isPermitted, isSameAccount); - if (isPermitted && local.userId != UserDelegate::SYSTEM_USER) { - isPermitted = Account::GetInstance()->IsUserForeground(local.userId); - } return isPermitted; } -- Gitee