From 81fc127b7a7fed703076749f32e73600e7593e9d Mon Sep 17 00:00:00 2001 From: ding_dong_dong Date: Tue, 20 May 2025 16:37:11 +0800 Subject: [PATCH] modify session key Signed-off-by: ding_dong_dong --- .../communicator/src/communicator_context.cpp | 10 +++++ .../src/softbus_adapter_standard.cpp | 38 +++++++++++++++++++ .../communicator/src/softbus_client.cpp | 18 +++++++++ .../adapter/communicator/src/softbus_client.h | 16 ++++++++ .../include/communicator/commu_types.h | 6 +++ .../communicator/communicator_context.h | 3 ++ .../service/kvdb/kvdb_service_impl.cpp | 3 ++ 7 files changed, 94 insertions(+) diff --git a/services/distributeddataservice/adapter/communicator/src/communicator_context.cpp b/services/distributeddataservice/adapter/communicator/src/communicator_context.cpp index 76f63db9f..e99dbc81b 100644 --- a/services/distributeddataservice/adapter/communicator/src/communicator_context.cpp +++ b/services/distributeddataservice/adapter/communicator/src/communicator_context.cpp @@ -119,4 +119,14 @@ bool CommunicatorContext::IsSessionReady(const std::string &deviceId) } return devices_.Contains(deviceId); } + +void CommunicatorContext::SetSyncInfo(const SyncInfo &info) +{ + info_ = info; +} + +SyncInfo CommunicatorContext::GetSyncInfo() +{ + return info_; +} } // namespace OHOS::DistributedData \ No newline at end of file diff --git a/services/distributeddataservice/adapter/communicator/src/softbus_adapter_standard.cpp b/services/distributeddataservice/adapter/communicator/src/softbus_adapter_standard.cpp index 5d8e2cb4d..291e85b45 100644 --- a/services/distributeddataservice/adapter/communicator/src/softbus_adapter_standard.cpp +++ b/services/distributeddataservice/adapter/communicator/src/softbus_adapter_standard.cpp @@ -55,6 +55,8 @@ public: static void OnServerBind(int32_t socket, PeerSocketInfo info); static void OnServerShutdown(int32_t socket, ShutdownReason reason); static void OnServerBytesReceived(int32_t socket, const void *data, uint32_t dataLen); + static bool OnServerAccessCheck(int32_t socket, PeerSocketInfo info, SocketAccessInfo *peerInfo, + SocketAccessInfo *localInfo); private: // notify all listeners when received message @@ -102,6 +104,7 @@ SoftBusAdapter::SoftBusAdapter() serverListener_.OnShutdown = AppDataListenerWrap::OnServerShutdown; serverListener_.OnBytes = AppDataListenerWrap::OnServerBytesReceived; serverListener_.OnMessage = AppDataListenerWrap::OnServerBytesReceived; + serverListener_.OnNegotiate2 = AppDataListenerWrap::OnServerAccessCheck; auto status = DmAdapter::GetInstance().StartWatchDeviceChange(this, { "softBusAdapter" }); if (status != Status::SUCCESS) { @@ -529,6 +532,41 @@ void AppDataListenerWrap::OnServerBytesReceived(int32_t socket, const void *data NotifyDataListeners(reinterpret_cast(data), dataLen, peerDevUuid, { pipeId, "" }); } +bool AppDataListenerWrap::OnServerAccessCheck(int32_t socket, PeerSocketInfo info, SocketAccessInfo *peerInfo, + SocketAccessInfo *localInfo) +{ + ZLOGI("receive bind request, socket:%{public}d", socket); + int foregroundUserId = 0; + if (!AccountDelegate::GetInstance()->QueryForegroundUserId(foregroundUserId)) { + return false; + } + AccessExtraInfo extraInfo; + if (!DistributedData::Serializable::Unmarshall(peerInfo.extraAccessInfo, extraInfo)) { + ZLOGE("Unmarshall failed, peer extraAccessInfo:%{public}s", peerInfo.extraAccessInfo.c_str()); + return false; + } + AclParams aclParams; + aclParams.accCaller.bundleName = extraInfo.bundleName; + aclParams.accCaller.accountId = AccountDelegate::GetInstance()->GetCurrentAccountId(); + aclParams.accCaller.userId = foregroundUserId; + aclParams.accCaller.networkId = DmAdapter::GetInstance().GetLocalDevice().netWorkId; + + aclParams.accCallee.accountId = peerInfo.accountId; + aclParams.accCallee.userId = peerInfo.userId; + aclParams.accCallee.networkId = info.networkId; + + if (DmAdapter::GetInstance().IsSameAccount(aclParams.accCaller, aclParams.accCallee) || + DmAdapter::GetInstance().CheckAccessControl(aclParams.accCaller, aclParams.accCallee)) { + localInfo.userId = foregroundUserId; + localInfo.localTokenId = + Security::AccessToken::AccessTokenKit::GetHapTokenID(foregroundUserId, extraInfo.bundleName, 0);; + AccessExtraInfo extraInfo = { .bundleName = extraInfo.bundleName }; + accessInfo.extraAccessInfo = const_cast(Serializable::Marshall(extraInfo).c_str()); + return true; + } + return false; +} + std::string AppDataListenerWrap::GetPipeId(const std::string &name) { auto pos = name.find('_'); diff --git a/services/distributeddataservice/adapter/communicator/src/softbus_client.cpp b/services/distributeddataservice/adapter/communicator/src/softbus_client.cpp index 23c8c7916..485a44886 100644 --- a/services/distributeddataservice/adapter/communicator/src/softbus_client.cpp +++ b/services/distributeddataservice/adapter/communicator/src/softbus_client.cpp @@ -28,6 +28,7 @@ namespace OHOS::AppDistributedKv { using namespace OHOS::DistributedKv; using DmAdapter = OHOS::DistributedData::DeviceManagerAdapter; using Context = DistributedData::CommunicatorContext; +using Serializable = DistributedData::Serializable; SoftBusClient::SoftBusClient(const PipeInfo& pipeInfo, const DeviceId& deviceId, const std::string& networkId, uint32_t type) : type_(type), pipe_(pipeInfo), device_(deviceId), networkId_(networkId) { @@ -134,6 +135,23 @@ int32_t SoftBusClient::CreateSocket() const int32_t socket = Socket(socketInfo); if (socket <= 0) { ZLOGE("Create the client Socket:%{public}d failed, peerName:%{public}s", socket, socketInfo.peerName); + return socket; + } + auto syncInfo = Context::GetInstance().GetSyncInfo(); + SocketAccessInfo accessInfo; + int foregroundUserId = 0; + if (!AccountDelegate::GetInstance()->QueryForegroundUserId(foregroundUserId)) { + return -1; + } + accessInfo.userId = foregroundUserId; + accessInfo.localTokenId = syncInfo.tokenId; + AccessExtraInfo extraInfo = { .bundleName = syncInfo.bundleName }; + accessInfo.extraAccessInfo = const_cast(Serializable::Marshall(extraInfo).c_str()); + auto status = SetAccessInfo(socket, accessInfo); + if (status != 0) { + ZLOGE("SetAccessInfo fail, status:%{public}d, userId:%{public}d, tokenId:%{public}d, bundleName:%{public}s", + status, syncInfo.userId, syncInfo.tokenId, syncInfo.bundleName.c_str()); + return -1; } return socket; } diff --git a/services/distributeddataservice/adapter/communicator/src/softbus_client.h b/services/distributeddataservice/adapter/communicator/src/softbus_client.h index a0196c94f..49298f402 100644 --- a/services/distributeddataservice/adapter/communicator/src/softbus_client.h +++ b/services/distributeddataservice/adapter/communicator/src/softbus_client.h @@ -22,11 +22,27 @@ #include "commu_types.h" #include "executor_pool.h" +#include "serializable/serializable.h" #include "socket.h" #include "softbus_bus_center.h" namespace OHOS::AppDistributedKv { class SoftBusClient : public std::enable_shared_from_this { public: + struct AccessExtraInfo final : public Serializable { + std::string bundleName = ""; + + AccessExtraInfo() {}; + ~AccessExtraInfo() {}; + bool Marshal(json &node) const override + { + return SetValue(node[GET_NAME(bundleName)], bundleName); + }; + bool Unmarshal(const json &node) override + { + return GetValue(node, GET_NAME(bundleName), bundleName); + }; + }; + enum QoSType { QOS_BR, QOS_HML, diff --git a/services/distributeddataservice/adapter/include/communicator/commu_types.h b/services/distributeddataservice/adapter/include/communicator/commu_types.h index 6b1f1af69..35de71592 100644 --- a/services/distributeddataservice/adapter/include/communicator/commu_types.h +++ b/services/distributeddataservice/adapter/include/communicator/commu_types.h @@ -99,5 +99,11 @@ struct API_EXPORT LevelInfo { uint32_t switches; uint16_t switchesLen; }; + +struct API_EXPORT SyncInfo { + int32_t userId; + int64_t tokenId; + std::string bundleName; +}; } #endif // OHOS_DISTRIBUTED_DATA_ADAPTER_COMMUNICATOR_COMMU_TYPES_H diff --git a/services/distributeddataservice/adapter/include/communicator/communicator_context.h b/services/distributeddataservice/adapter/include/communicator/communicator_context.h index ce09ab58a..e6cbf8f51 100644 --- a/services/distributeddataservice/adapter/include/communicator/communicator_context.h +++ b/services/distributeddataservice/adapter/include/communicator/communicator_context.h @@ -40,6 +40,8 @@ public: void NotifySessionClose(const std::string &deviceId); void SetSessionListener(const OnCloseAble &closeAbleCallback); bool IsSessionReady(const std::string &deviceId); + void SetSyncInfo(const SyncInfo &info); + SyncInfo GetSyncInfo(); private: CommunicatorContext() = default; @@ -55,6 +57,7 @@ private: std::mutex mutex_; std::vector observers_; ConcurrentMap devices_ {}; + SyncInfo info_; }; } // namespace OHOS::DistributedData #endif // DISTRIBUTEDDATAMGR_COMMUNICATOR_CONTEXT_H \ No newline at end of file diff --git a/services/distributeddataservice/service/kvdb/kvdb_service_impl.cpp b/services/distributeddataservice/service/kvdb/kvdb_service_impl.cpp index f04980ccc..c8041bea6 100644 --- a/services/distributeddataservice/service/kvdb/kvdb_service_impl.cpp +++ b/services/distributeddataservice/service/kvdb/kvdb_service_impl.cpp @@ -1171,6 +1171,9 @@ Status KVDBServiceImpl::DoSyncBegin(const std::vector &devices, con syncParam); auto status = Status(ret.first); if (status != Status::SUCCESS) { + SyncInfo info = { .userId = std::atoi(meta.user.c_str()), .tokenId = meta.tokenId, + .bundleName = meta.bundleName }; + CommContext::GetInstance().SetSyncInfo(info); RADAR_REPORT(STANDARD_DEVICE_SYNC, START_SYNC, RADAR_FAILED, ERROR_CODE, status, BIZ_STATE, END, SYNC_STORE_ID, Anonymous::Change(meta.storeId), SYNC_APP_ID, meta.bundleName, CONCURRENT_ID, std::to_string(info.syncId), DATA_TYPE, meta.dataType); -- Gitee