diff --git a/commondependency/include/deviceprofile_connector.h b/commondependency/include/deviceprofile_connector.h index d0bb054cee7b6b3fd346a475676c667a09371b0a..f37fc6b9bae10627e86100480d2c73c6ad3f9dad 100644 --- a/commondependency/include/deviceprofile_connector.h +++ b/commondependency/include/deviceprofile_connector.h @@ -167,6 +167,7 @@ public: int32_t SubscribeDeviceProfileInited(sptr dpInitedCallback); int32_t UnSubscribeDeviceProfileInited(); int32_t PutAllTrustedDevices(const std::vector &deviceInfos); + int32_t CheckDeviceInfoPermission(const std::string &localUdid, const std::string &peerDeviceId); private: int32_t HandleDmAuthForm(DistributedDeviceProfile::AccessControlProfile profiles, DmDiscoveryInfo discoveryInfo); diff --git a/commondependency/src/deviceprofile_connector.cpp b/commondependency/src/deviceprofile_connector.cpp index 6d57f99bc7785a08d306bda9d9362f08727bad26..184c02f2b4c34a80a651316e204d864c8dd05095 100644 --- a/commondependency/src/deviceprofile_connector.cpp +++ b/commondependency/src/deviceprofile_connector.cpp @@ -1631,6 +1631,42 @@ int32_t DeviceProfileConnector::PutAllTrustedDevices( return DM_OK; } +int32_t DeviceProfileConnector::CheckDeviceInfoPermission(const std::string &localUdid, + const std::string &peerDeviceId) +{ + LOGI("CheckDeviceInfoPermission Start."); + int32_t localUserId = 0; + uint32_t tempLocalTokenId = 0; + MultipleUserConnector::GetTokenIdAndForegroundUserId(tempLocalTokenId, localUserId); + int64_t localTokenId = static_cast(tempLocalTokenId); + std::string localAccountId = MultipleUserConnector::GetOhosAccountIdByUserId(localUserId); + std::vector profiles = GetAccessControlProfileByUserId(localUserId); + for (auto &item : profiles) { + if (item.GetTrustDeviceId() == peerDeviceId) { + if (item.GetBindType() == DM_IDENTICAL_ACCOUNT || item.GetBindLevel() == DEVICE) { + return DM_OK; + } + } + int32_t profileUserId = item.GetAccesser().GetAccesserUserId(); + if (item.GetAccesser().GetAccesserDeviceId() == localUdid && + (profileUserId == localUserId || profileUserId == -1 || profileUserId == 0) && + item.GetAccesser().GetAccesserAccountId() == localAccountId && + item.GetAccesser().GetAccesserTokenId() == localTokenId && + item.GetAccessee().GetAccesseeDeviceId() == peerDeviceId) { + return DM_OK; + } + profileUserId = item.GetAccessee().GetAccesseeUserId(); + if (item.GetAccessee().GetAccesseeDeviceId() == localUdid && + (profileUserId == localUserId || profileUserId == -1 || profileUserId == 0) && + item.GetAccessee().GetAccesseeAccountId() == localAccountId && + item.GetAccessee().GetAccesseeTokenId() == localTokenId && + item.GetAccesser().GetAccesserDeviceId() == peerDeviceId) { + return DM_OK; + } + } + return ERR_DM_NO_PERMISSION; +} + IDeviceProfileConnector *CreateDpConnectorInstance() { return &DeviceProfileConnector::GetInstance(); diff --git a/services/implementation/include/device_manager_service_impl.h b/services/implementation/include/device_manager_service_impl.h index 0ad140dc58a1529e70d654733817526d9733da5a..2f91bd3d882e33604a9d4cef9d19df816b053fa1 100644 --- a/services/implementation/include/device_manager_service_impl.h +++ b/services/implementation/include/device_manager_service_impl.h @@ -134,6 +134,7 @@ public: void HandleDeviceUnBind(int32_t bindType, const std::string &peerUdid, const std::string &localUdid, int32_t localUserId, const std::string &localAccountId); int32_t RegisterAuthenticationType(int32_t authenticationType); + int32_t CheckDeviceInfoPermission(const std::string &localUdid, const std::string &peerDeviceId); private: int32_t PraseNotifyEventJson(const std::string &event, nlohmann::json &jsonObject); std::string GetUdidHashByNetworkId(const std::string &networkId); diff --git a/services/implementation/include/device_manager_service_impl_lite.h b/services/implementation/include/device_manager_service_impl_lite.h index 017f4631630a8a8ae765df1d76548d2c558349ea..cab542b2cf8e0228e823ff0a47c26d0f81bac0f8 100644 --- a/services/implementation/include/device_manager_service_impl_lite.h +++ b/services/implementation/include/device_manager_service_impl_lite.h @@ -156,6 +156,7 @@ public: void HandleDeviceUnBind(int32_t bindType, const std::string &peerUdid, const std::string &localUdid, int32_t localUserId, const std::string &localAccountId); int32_t RegisterAuthenticationType(int32_t authenticationType); + int32_t CheckDeviceInfoPermission(const std::string &localUdid, const std::string &peerDeviceId); private: std::string GetUdidHashByNetworkId(const std::string &networkId); diff --git a/services/implementation/src/device_manager_service_impl.cpp b/services/implementation/src/device_manager_service_impl.cpp index df37b5f6da677e2873aa17658288e75b4cd8b272..5d914b48ed3ef00068a01b71b44b3454dadc1782 100644 --- a/services/implementation/src/device_manager_service_impl.cpp +++ b/services/implementation/src/device_manager_service_impl.cpp @@ -1016,6 +1016,17 @@ int32_t DeviceManagerServiceImpl::RegisterAuthenticationType(int32_t authenticat return authMgr_->RegisterAuthenticationType(authenticationType); } +int32_t DeviceManagerServiceImpl::CheckDeviceInfoPermission(const std::string &localUdid, + const std::string &peerDeviceId) +{ + int32_t ret = DeviceProfileConnector::GetInstance().CheckDeviceInfoPermission(localUdid, peerDeviceId); + if (ret != DM_OK) { + LOGE("CheckDeviceInfoPermission failed, ret: %{public}d", ret); + return ret; + } + return DM_OK; +} + extern "C" IDeviceManagerServiceImpl *CreateDMServiceObject(void) { return new DeviceManagerServiceImpl; diff --git a/services/implementation/src/device_manager_service_impl_lite.cpp b/services/implementation/src/device_manager_service_impl_lite.cpp index 9bad670d588dd2eaafb3582d5777283cd019a8b9..4959149a737ed10458c8faa6e5a5a64aab55a94f 100644 --- a/services/implementation/src/device_manager_service_impl_lite.cpp +++ b/services/implementation/src/device_manager_service_impl_lite.cpp @@ -593,6 +593,14 @@ int32_t DeviceManagerServiceImpl::RegisterAuthenticationType(int32_t authenticat return DM_OK; } +int32_t DeviceManagerServiceImpl::CheckDeviceInfoPermission(const std::string &localUdid, + const std::string &peerDeviceId) +{ + (void)localUdid; + (void)peerDeviceId; + return DM_OK; +} + extern "C" IDeviceManagerServiceImpl *CreateDMServiceObject(void) { return new DeviceManagerServiceImpl; diff --git a/services/service/include/idevice_manager_service_impl.h b/services/service/include/idevice_manager_service_impl.h index 52292916ecd3ab97ba10ca823d77a9cfa29e603d..9247e049e44d8f6c6a1c12600e7bbc67be3e7d62 100644 --- a/services/service/include/idevice_manager_service_impl.h +++ b/services/service/include/idevice_manager_service_impl.h @@ -257,6 +257,7 @@ public: virtual void HandleDeviceUnBind(int32_t bindType, const std::string &peerUdid, const std::string &localUdid, int32_t localUserId, const std::string &localAccountId) = 0; virtual int32_t RegisterAuthenticationType(int32_t authenticationType) = 0; + virtual int32_t CheckDeviceInfoPermission(const std::string &localUdid, const std::string &peerDeviceId) = 0; }; using CreateDMServiceFuncPtr = IDeviceManagerServiceImpl *(*)(void); diff --git a/services/service/src/device_manager_service.cpp b/services/service/src/device_manager_service.cpp index 77278786900b06bf3cdf964881ff8a7facd55d0a..dfac00129833d7640d88cdbe1b1701e4e6c41cd1 100755 --- a/services/service/src/device_manager_service.cpp +++ b/services/service/src/device_manager_service.cpp @@ -379,11 +379,29 @@ int32_t DeviceManagerService::GetDeviceInfo(const std::string &networkId, DmDevi return ERR_DM_INPUT_PARA_INVALID; } CHECK_NULL_RETURN(softbusListener_, ERR_DM_POINT_NULL); - int32_t ret = softbusListener_->GetDeviceInfo(networkId, info); - if (ret != DM_OK) { - LOGE("Get DeviceInfo By NetworkId failed, ret : %{public}d", ret); + std::string peerDeviceId = ""; + int32_t udidRet = SoftbusListener::GetUdidByNetworkId(networkId.c_str(), peerDeviceId); + if (udidRet != DM_OK) { + LOGE("GetUdidByNetworkId failed, ret : %{public}d", udidRet); + return ERR_DM_FAILED; + } + if (!IsDMServiceImplReady()) { + LOGE("GetDeviceInfo failed, instance not init or init failed."); + return ERR_DM_NOT_INIT; + } + char localDeviceId[DEVICE_UUID_LENGTH] = {0}; + GetDevUdid(localDeviceId, DEVICE_UUID_LENGTH); + std::string localUdid = static_cast(localDeviceId); + int32_t permissionRet = dmServiceImpl_->CheckDeviceInfoPermission(localUdid, peerDeviceId); + if (permissionRet == DM_OK) { + int32_t ret = softbusListener_->GetDeviceInfo(networkId, info); + if (ret != DM_OK) { + LOGE("Get DeviceInfo By NetworkId failed, ret : %{public}d", ret); + } + return ret; + } else { + return ERR_DM_NO_PERMISSION; } - return ret; } int32_t DeviceManagerService::GetLocalDeviceInfo(DmDeviceInfo &info) diff --git a/test/unittest/UTTest_device_manager_impl.cpp b/test/unittest/UTTest_device_manager_impl.cpp index 3ccd06d71a8928dc81aa8ea40f6042d98fc8c978..c0e5b6039091223a22e8a2f597d2af32f3e1bba3 100644 --- a/test/unittest/UTTest_device_manager_impl.cpp +++ b/test/unittest/UTTest_device_manager_impl.cpp @@ -418,7 +418,7 @@ HWTEST_F(DeviceManagerImplTest, GetDeviceName_104, testing::ext::TestSize.Level0 std::shared_ptr callback = std::make_shared(); int32_t ret = DeviceManager::GetInstance().InitDeviceManager(packName, callback); ret = DeviceManager::GetInstance().GetDeviceName(packName, networkId, deviceName); - ASSERT_EQ(ret, DM_OK); + ASSERT_EQ(ret, ERR_DM_FAILED); DeviceManager::GetInstance().UnInitDeviceManager(packName); } @@ -498,7 +498,7 @@ HWTEST_F(DeviceManagerImplTest, GetDeviceType_104, testing::ext::TestSize.Level0 std::shared_ptr callback = std::make_shared(); int32_t ret = DeviceManager::GetInstance().InitDeviceManager(packName, callback); ret = DeviceManager::GetInstance().GetDeviceType(packName, networkId, deviceType); - ASSERT_EQ(ret, DM_OK); + ASSERT_EQ(ret, ERR_DM_FAILED); DeviceManager::GetInstance().UnInitDeviceManager(packName); } diff --git a/test/unittest/UTTest_device_manager_service.cpp b/test/unittest/UTTest_device_manager_service.cpp index 7c0840fd2e38d6b7119ada845da33733aaaf77f7..4e37e0fa6e6dcf5a54369a7dbd2b6ae5e4c782d2 100644 --- a/test/unittest/UTTest_device_manager_service.cpp +++ b/test/unittest/UTTest_device_manager_service.cpp @@ -2319,8 +2319,10 @@ HWTEST_F(DeviceManagerServiceTest, GetDeviceInfo_003, testing::ext::TestSize.Lev std::string networkId = "networkIdTest3"; DmDeviceInfo info; DeviceManagerService::GetInstance().softbusListener_ = std::make_shared(); + EXPECT_CALL(*softbusListenerMock_, GetDeviceInfo(_, _)).WillOnce(Return(DM_OK)); + EXPECT_CALL(*softbusListenerMock_, GetUdidByNetworkId(_, _)).WillOnce(Return(ERR_DM_FAILED)); int32_t ret = DeviceManagerService::GetInstance().GetDeviceInfo(networkId, info); - EXPECT_EQ(ret, DM_OK); + EXPECT_EQ(ret, ERR_DM_FAILED); DeviceManagerService::GetInstance().softbusListener_ = nullptr; } @@ -2561,12 +2563,14 @@ HWTEST_F(DeviceManagerServiceTest, GetDeviceInfo_005, testing::ext::TestSize.Lev DmDeviceInfo info; DeviceManagerService::GetInstance().softbusListener_ = std::make_shared(); EXPECT_CALL(*softbusListenerMock_, GetDeviceInfo(_, _)).WillOnce(Return(DM_OK)); + EXPECT_CALL(*softbusListenerMock_, GetUdidByNetworkId(_, _)).WillOnce(Return(ERR_DM_FAILED)); int32_t ret = DeviceManagerService::GetInstance().GetDeviceInfo(networkId, info); - EXPECT_EQ(ret, DM_OK); + EXPECT_EQ(ret, ERR_DM_FAILED); EXPECT_CALL(*softbusListenerMock_, GetDeviceInfo(_, _)).WillOnce(Return(ERR_DM_FAILED)); + EXPECT_CALL(*softbusListenerMock_, GetUdidByNetworkId(_, _)).WillOnce(Return(DM_OK)); ret = DeviceManagerService::GetInstance().GetDeviceInfo(networkId, info); - EXPECT_EQ(ret, ERR_DM_FAILED); + EXPECT_EQ(ret, ERR_DM_NO_PERMISSION); DeviceManagerService::GetInstance().softbusListener_ = nullptr; }