diff --git a/services/distributeddataservice/adapter/communicator/src/process_communicator_impl.cpp b/services/distributeddataservice/adapter/communicator/src/process_communicator_impl.cpp index 4eedaa7bc9b4a98b66af2d8a75a4c3d2041892a3..b7986050f21d8c6c17e50a1eb65bdd01543c18a7 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 c379ac097c610dd196454a285ed1b8464788015a..936919a7a7dc7b04ec94c95ed68029146dd9a57e 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 2399a18eff94ca990525dc2ace5a8be6adfc64b8..af87e85522a20d4a29e00562d34f1eaa9d42e372 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 85611780bd5256677d1d59686296a4a67622bbbc..12fe51f87b371bf78039706d8b8a404dd24428b0 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 cb435f6fb7e4e66e16f64ddff865e6b03bec3c9e..8b786159af17ae1c737f7b5182d337f7d666c205 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; }