diff --git a/services/distributeddataservice/adapter/communicator/src/communicator_context.cpp b/services/distributeddataservice/adapter/communicator/src/communicator_context.cpp index 76f63db9f18f27dedcacf9e5f37ec6601c610d08..e99dbc81bda23de126c04882bf6e552673aea4b0 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 5d8e2cb4d114efcb23f3c13aa48d966aa97fbc16..291e85b459cac32a89277504f2120aacac594a1f 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 23c8c79167f5735c46c620a3d592cda106bede2b..485a44886c510591f78cadd0b9aa8f477b149447 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 a0196c94f3203f1475bb84c3c5c111e4dbc6ee31..49298f40200245bf7af7f57b9b19ea198e362ed9 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 6b1f1af696dcb9482181dea2df903ce5f51913a8..35de715921a843b3d18b9b09f189a4c97da400af 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 ce09ab58a92c4e58d37bf62b8f497cbb7af93ecb..e6cbf8f515039c461d87f96e7bc9b7cf01a57b92 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 f04980ccc167301f48916a6a907e72f745330e5e..c8041bea637c3dc0ab686b3e71f724a094ceebcc 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);