From bd1a6114092f3a90c56f1ba1412f8330bd26a566 Mon Sep 17 00:00:00 2001 From: ding_dong_dong Date: Sun, 27 Apr 2025 20:28:04 +0800 Subject: [PATCH] modify account Signed-off-by: ding_dong_dong --- .../route_head_handler_impl.cpp | 95 +++++++++++++++---- .../session_manager/route_head_handler_impl.h | 7 ++ .../src/session_manager/session_manager.cpp | 27 +++--- .../app/src/session_manager/session_manager.h | 8 +- .../include/metadata/capability_meta_data.h | 4 +- 5 files changed, 104 insertions(+), 37 deletions(-) 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 f8063b9c5..de086ebf3 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 @@ -76,7 +76,8 @@ void RouteHeadHandlerImpl::Init() } } SessionPoint localPoint { DmAdapter::GetInstance().GetLocalDevice().uuid, - static_cast(atoi(userId_.c_str())), appId_, storeId_ }; + static_cast(atoi(userId_.c_str())), appId_, storeId_, + AccountDelegate::GetInstance()->GetCurrentAccountId() }; session_ = SessionManager::GetInstance().GetSession(localPoint, deviceId_); ZLOGD("valid session:appId:%{public}s, srcDevId:%{public}s, srcUser:%{public}u, trgDevId:%{public}s,", session_.appId.c_str(), Anonymous::Change(session_.sourceDeviceId).c_str(), @@ -113,8 +114,10 @@ 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() - + sizeof(SessionStoreId) + session_.storeId.size(); + + session_.targetUserIds.size() * sizeof(int) + + sizeof(SessionAppId) + session_.appId.size() + + sizeof(SessionStoreId) + session_.storeId.size() + + sizeof(SessionAccountId) + session_.accountId.size(); // align message uint width headSize = GET_ALIGNED_SIZE(expectSize, ALIGN_WIDTH); @@ -194,28 +197,42 @@ bool RouteHeadHandlerImpl::PackDataBody(uint8_t *data, uint32_t totalLen) } ptr += (sizeof(SessionUserPair) + session_.targetUserIds.size() * sizeof(int)); + uint8_t *end = data + totalLen; + SessionAppId *appPair = reinterpret_cast(ptr); uint32_t appIdSize = session_.appId.size(); appPair->len = HostToNet(appIdSize); - uint8_t *end = data + totalLen; ptr += sizeof(SessionAppId); ret = memcpy_s(appPair->appId, end - ptr, session_.appId.c_str(), appIdSize); if (ret != 0) { - ZLOGE("memcpy for app id failed, ret is %{public}d, leftSize is %{public}d, appIdSize is %{public}d", - ret, end - ptr, appIdSize); + ZLOGE("memcpy for app id failed, ret is %{public}d, leftSize is %{public}u, appIdSize is %{public}d", + ret, static_cast(end - ptr), appIdSize); return false; } ptr += appIdSize; SessionStoreId *storePair = reinterpret_cast(ptr); uint32_t storeIdSize = session_.storeId.size(); + storePair->len = HostToNet(storeIdSize); + ptr += sizeof(SessionStoreId); ret = memcpy_s(storePair->storeId, end - ptr, session_.storeId.data(), storeIdSize); if (ret != 0) { - ZLOGE("memcpy for store id failed, ret is %{public}d, leftSize is %{public}d, storeIdSize is %{public}d", - ret, end - ptr, storeIdSize); + ZLOGE("memcpy for store id failed, ret is %{public}d, leftSize is %{public}u, storeIdSize is %{public}d", + ret, static_cast(end - ptr), storeIdSize); + return false; + } + ptr += storeIdSize; + + SessionAccountId *accountPair = reinterpret_cast(ptr); + uint32_t accountIdSize = session_.accountId.size(); + accountPair->len = HostToNet(accountIdSize); + ptr += sizeof(SessionAccountId); + ret = memcpy_s(accountPair->accountId, end - ptr, session_.accountId.data(), accountIdSize); + if (ret != 0) { + ZLOGE("memcpy for account id failed, ret is %{public}d, leftSize is %{public}u, storeIdSize is %{public}d", + ret, static_cast(end - ptr), accountIdSize); return false; } - storePair->len = HostToNet(storeIdSize); return true; } @@ -283,13 +300,21 @@ bool RouteHeadHandlerImpl::ParseHeadDataUser(const uint8_t *data, uint32_t total // flip the local and peer ends SessionPoint local { .deviceId = session_.targetDeviceId, .appId = session_.appId }; - SessionPoint peer { .deviceId = session_.sourceDeviceId, .userId = session_.sourceUserId, .appId = session_.appId }; + SessionPoint peer { .deviceId = session_.sourceDeviceId, .userId = session_.sourceUserId, .appId = session_.appId, + .accountId = session_.accountId }; ZLOGD("valid session:appId:%{public}s, srcDevId:%{public}s, srcUser:%{public}u, trgDevId:%{public}s,", session_.appId.c_str(), Anonymous::Change(session_.sourceDeviceId).c_str(), session_.sourceUserId, Anonymous::Change(session_.targetDeviceId).c_str()); + bool flag = false; + auto peerCap = UpgradeManager::GetInstance().GetCapability(session_.sourceDeviceId, flag); + if (!flag) { + ZLOGI("get peer cap failed"); + return false; + } + bool accountFlag = peerCap.version >= CapMetaData::ACCOUNT_VERSION; for (const auto &item : session_.targetUserIds) { local.userId = item; - if (SessionManager::GetInstance().CheckSession(local, peer)) { + if (SessionManager::GetInstance().CheckSession(local, peer, accountFlag)) { UserInfo userInfo = { .receiveUser = std::to_string(item) }; userInfos.emplace_back(userInfo); } @@ -373,22 +398,35 @@ bool RouteHeadHandlerImpl::UnPackDataBody(const uint8_t *data, uint32_t totalLen ptr += userPairSize; leftSize -= userPairSize; + if (leftSize > 0 && !UnPackAppId(ptr, leftSize)) { + return false; + } + leftSize -= (sizeof(SessionAppId) + session_.appId.size()); + ptr += (sizeof(SessionAppId) + session_.appId.size()); + if (leftSize > 0 && !UnPackStoreId(ptr, leftSize)) { + return false; + } + leftSize -= (sizeof(SessionStoreId) + session_.storeId.size()); + ptr += (sizeof(SessionStoreId) + session_.storeId.size()); + if (leftSize > 0 && !UnPackAccountId(ptr, leftSize)) { + return false; + } + return true; +} + +bool RouteHeadHandlerImpl::UnPackAppId(const uint8_t *data, uint32_t leftSize) +{ if (leftSize < sizeof(SessionAppId)) { - ZLOGE("failed to parse app id, leftSize : %{public}d", leftSize); + ZLOGE("failed to parse app id, leftSize:%{public}d.", leftSize); return false; } - const SessionAppId *appId = reinterpret_cast(ptr); + const SessionAppId *appId = reinterpret_cast(data); auto appIdLen = NetToHost(appId->len); if (leftSize - sizeof(SessionAppId) < appIdLen) { ZLOGE("failed to parse app id, appIdLen:%{public}d, leftSize:%{public}d.", appIdLen, leftSize); return false; } - session_.appId.append(appId->appId, appIdLen); - leftSize -= (sizeof(SessionAppId) + appIdLen); - if (leftSize > 0) { - ptr += (sizeof(SessionAppId) + appIdLen); - return UnPackStoreId(ptr, leftSize); - } + session_.appId = std::string(appId->appId, appIdLen); return true; } @@ -398,8 +436,7 @@ bool RouteHeadHandlerImpl::UnPackStoreId(const uint8_t *data, uint32_t leftSize) ZLOGE("failed to parse store id, leftSize:%{public}d.", leftSize); return false; } - const uint8_t *ptr = data; - const SessionStoreId *storeId = reinterpret_cast(ptr); + const SessionStoreId *storeId = reinterpret_cast(data); auto storeIdLen = NetToHost(storeId->len); if (leftSize - sizeof(SessionStoreId) < storeIdLen) { ZLOGE("failed to parse store id, storeIdLen:%{public}d, leftSize:%{public}d.", storeIdLen, leftSize); @@ -408,4 +445,20 @@ bool RouteHeadHandlerImpl::UnPackStoreId(const uint8_t *data, uint32_t leftSize) session_.storeId = std::string(storeId->storeId, storeIdLen); return true; } + +bool RouteHeadHandlerImpl::UnPackAccountId(const uint8_t *data, uint32_t leftSize) +{ + if (leftSize < sizeof(SessionAccountId)) { + ZLOGE("failed to parse account id, leftSize:%{public}d.", leftSize); + return false; + } + const SessionAccountId *accountId = reinterpret_cast(data); + auto accountIdLen = NetToHost(accountId->len); + if (leftSize - sizeof(SessionAccountId) < accountIdLen) { + ZLOGE("failed to parse account id, accountIdLen:%{public}d, leftSize:%{public}d.", accountIdLen, leftSize); + return false; + } + session_.accountId = std::string(accountId->accountId, accountIdLen); + return true; +} } // namespace OHOS::DistributedData \ No newline at end of file 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 11583b7b1..6f4f4b124 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 @@ -58,6 +58,11 @@ struct SessionStoreId { uint32_t len; char storeId[0]; }; + +struct SessionAccountId { + uint32_t len; + char accountId[0]; +}; #pragma pack() class RouteHeadHandlerImpl : public DistributedData::RouteHeadHandler { @@ -79,7 +84,9 @@ private: bool UnPackDataHead(const uint8_t *data, uint32_t totalLen, RouteHead &routeHead); bool UnPackDataBody(const uint8_t *data, uint32_t totalLen); std::string ParseStoreId(const std::string &deviceId, const std::string &label); + bool UnPackAppId(const uint8_t *data, uint32_t leftSize); bool UnPackStoreId(const uint8_t *data, uint32_t leftSize); + bool UnPackAccountId(const uint8_t *data, uint32_t leftSize); std::string userId_; std::string appId_; diff --git a/services/distributeddataservice/app/src/session_manager/session_manager.cpp b/services/distributeddataservice/app/src/session_manager/session_manager.cpp index 1ef5c834a..cb435f6fb 100644 --- a/services/distributeddataservice/app/src/session_manager/session_manager.cpp +++ b/services/distributeddataservice/app/src/session_manager/session_manager.cpp @@ -48,6 +48,7 @@ Session SessionManager::GetSession(const SessionPoint &local, const std::string session.sourceUserId = local.userId; session.sourceDeviceId = local.deviceId; session.targetDeviceId = targetDeviceId; + session.accountId = local.accountId; auto users = UserDelegate::GetInstance().GetRemoteUserStatus(targetDeviceId); // system service if (local.userId == UserDelegate::SYSTEM_USER) { @@ -94,7 +95,7 @@ bool SessionManager::GetSendAuthParams(const SessionPoint &local, const std::str for (const auto &storeMeta : metaData) { if (storeMeta.appId == local.appId && storeMeta.storeId == local.storeId) { aclParams.accCaller.bundleName = storeMeta.bundleName; - aclParams.accCaller.accountId = AccountDelegate::GetInstance()->GetCurrentAccountId(); + aclParams.accCaller.accountId = local.accountId; aclParams.accCaller.userId = local.userId; aclParams.accCaller.networkId = DmAdapter::GetInstance().ToNetworkID(local.deviceId); @@ -109,13 +110,13 @@ bool SessionManager::GetSendAuthParams(const SessionPoint &local, const std::str return false; } -bool SessionManager::GetRecvAuthParams(const SessionPoint &local, const std::string &targetDeviceId, - AclParams &aclParams, int32_t peerUser) const +bool SessionManager::GetRecvAuthParams(const SessionPoint &local, const SessionPoint &peer, bool accountFlag, + AclParams &aclParams) const { std::vector metaData; - if (!MetaDataManager::GetInstance().LoadMeta(StoreMetaData::GetPrefix({ targetDeviceId }), metaData)) { - ZLOGE("load meta failed, deviceId:%{public}s, user:%{public}d", Anonymous::Change(targetDeviceId).c_str(), - peerUser); + if (!MetaDataManager::GetInstance().LoadMeta(StoreMetaData::GetPrefix({ peer.deviceId }), metaData)) { + ZLOGE("load meta failed, deviceId:%{public}s, user:%{public}d", Anonymous::Change(peer.deviceId).c_str(), + peer.userId); return false; } for (const auto &storeMeta : metaData) { @@ -126,23 +127,23 @@ bool SessionManager::GetRecvAuthParams(const SessionPoint &local, const std::str aclParams.accCaller.userId = local.userId; aclParams.accCaller.networkId = DmAdapter::GetInstance().ToNetworkID(local.deviceId); - aclParams.accCallee.accountId = accountId; - aclParams.accCallee.userId = peerUser; - aclParams.accCallee.networkId = DmAdapter::GetInstance().ToNetworkID(targetDeviceId); + aclParams.accCallee.accountId = accountFlag ? peer.accountId : accountId; + aclParams.accCallee.userId = peer.userId; + aclParams.accCallee.networkId = DmAdapter::GetInstance().ToNetworkID(peer.deviceId); aclParams.authType = storeMeta.authType; return true; } } ZLOGE("get params failed,appId:%{public}s,tarDevid:%{public}s,user:%{public}d,peer:%{public}d", - local.appId.c_str(), Anonymous::Change(targetDeviceId).c_str(), local.userId, peerUser); + local.appId.c_str(), Anonymous::Change(peer.deviceId).c_str(), local.userId, peer.userId); return false; } -bool SessionManager::CheckSession(const SessionPoint &local, const SessionPoint &peer) const +bool SessionManager::CheckSession(const SessionPoint &local, const SessionPoint &peer, bool accountFlag) const { AclParams aclParams; - if (!GetRecvAuthParams(local, peer.deviceId, aclParams, peer.userId)) { + if (!GetRecvAuthParams(local, peer, accountFlag, aclParams)) { ZLOGE("get recv auth params failed:%{public}s", Anonymous::Change(peer.deviceId).c_str()); return false; } @@ -165,6 +166,7 @@ bool Session::Marshal(json &node) const ret = SetValue(node[GET_NAME(targetUserIds)], targetUserIds) && ret; ret = SetValue(node[GET_NAME(appId)], appId) && ret; ret = SetValue(node[GET_NAME(storeId)], storeId) && ret; + ret = SetValue(node[GET_NAME(accountId)], accountId) && ret; return ret; } @@ -177,6 +179,7 @@ bool Session::Unmarshal(const json &node) ret = GetValue(node, GET_NAME(targetUserIds), targetUserIds) && ret; ret = GetValue(node, GET_NAME(appId), appId) && ret; ret = GetValue(node, GET_NAME(storeId), storeId) && ret; + ret = GetValue(node, GET_NAME(accountId), accountId) && ret; return ret; } } // namespace OHOS::DistributedData diff --git a/services/distributeddataservice/app/src/session_manager/session_manager.h b/services/distributeddataservice/app/src/session_manager/session_manager.h index c72c1bef1..c41e30c23 100644 --- a/services/distributeddataservice/app/src/session_manager/session_manager.h +++ b/services/distributeddataservice/app/src/session_manager/session_manager.h @@ -30,6 +30,7 @@ struct SessionPoint { uint32_t userId; std::string appId; std::string storeId; + std::string accountId; }; class Session : public Serializable { @@ -40,6 +41,7 @@ public: std::vector targetUserIds; std::string appId; std::string storeId; + std::string accountId; bool Marshal(json &node) const override; bool Unmarshal(const json &node) override; inline bool IsValid() @@ -52,12 +54,12 @@ class SessionManager { public: static SessionManager &GetInstance(); Session GetSession(const SessionPoint &local, const std::string &targetDeviceId) const; - bool CheckSession(const SessionPoint &local, const SessionPoint &peer) const; + bool CheckSession(const SessionPoint &local, const SessionPoint &peer, bool accountFlag) const; private: bool GetSendAuthParams(const SessionPoint &local, const std::string &targetDeviceId, AclParams &aclParams) const; - bool GetRecvAuthParams(const SessionPoint &local, const std::string &targetDeviceId, - AclParams &aclParams, int peerUser) const; + bool GetRecvAuthParams(const SessionPoint &local, const SessionPoint &peer, bool accountFlag, + AclParams &aclParams) const; }; } // namespace OHOS::DistributedData diff --git a/services/distributeddataservice/framework/include/metadata/capability_meta_data.h b/services/distributeddataservice/framework/include/metadata/capability_meta_data.h index 702a362a1..50b6f25ea 100644 --- a/services/distributeddataservice/framework/include/metadata/capability_meta_data.h +++ b/services/distributeddataservice/framework/include/metadata/capability_meta_data.h @@ -20,8 +20,10 @@ namespace OHOS::DistributedData { class API_EXPORT CapMetaData final : public Serializable { public: - static constexpr int32_t CURRENT_VERSION = 1; + // 1->2 add accountId to session + static constexpr int32_t CURRENT_VERSION = 2; static constexpr int32_t INVALID_VERSION = -1; + static constexpr int32_t ACCOUNT_VERSION = 2; int32_t version = INVALID_VERSION; API_EXPORT bool Marshal(json &node) const override; -- Gitee