From ef123208b1c6e3cd98fdd174f18111e4658e1dd9 Mon Sep 17 00:00:00 2001 From: byndyx Date: Wed, 18 Jun 2025 17:05:39 +0800 Subject: [PATCH] ho not allowed Signed-off-by: byndyx --- common/include/daudio_constants.h | 4 ++ common/src/daudio_util.cpp | 1 + .../managersink/include/daudio_sink_manager.h | 2 + .../managersink/src/daudio_sink_manager.cpp | 41 +++++++++++++++++++ .../managersource/include/daudio_source_dev.h | 2 + .../managersource/src/daudio_source_dev.cpp | 40 ++++++++++++++++++ .../src/daudio_sink_manager_test.cpp | 37 +++++++++++++++++ .../src/daudio_source_dev_test.cpp | 37 +++++++++++++++++ 8 files changed, 164 insertions(+) diff --git a/common/include/daudio_constants.h b/common/include/daudio_constants.h index b9b09e4d..7ff4e92f 100644 --- a/common/include/daudio_constants.h +++ b/common/include/daudio_constants.h @@ -73,6 +73,9 @@ static constexpr int32_t LOW_LATENCY_RENDER_ID = 1 << 1 | 1 << 0; static constexpr int32_t DEFAULT_RENDER_ID = 1; static constexpr int32_t DEFAULT_CAPTURE_ID = 1 << 27 | 1 << 0; +constexpr int32_t VALID_OS_TYPE = 10; +constexpr int32_t INVALID_OS_TYPE = -1; + const std::string DAUDIO_LOG_TITLE_TAG = "DAUDIO"; const std::string DAUDIO_PREFIX = "DISTRIBUTED_AUDIO"; const std::string AUDIO_PREFIX = "AUDIO"; @@ -122,6 +125,7 @@ constexpr const char *KEY_RANDOM_TASK_CODE = "randomTaskCode"; constexpr const char *KEY_USERID = "userId"; constexpr const char *KEY_TOKENID = "tokenId"; constexpr const char *KEY_ACCOUNTID = "accountId"; +constexpr const char *KEY_OS_TYPE = "OS_TYPE"; constexpr const char *KEY_SAMPLING_RATE = "samplingRate"; constexpr const char *KEY_CHANNELS = "channels"; diff --git a/common/src/daudio_util.cpp b/common/src/daudio_util.cpp index 25b6c485..38414645 100644 --- a/common/src/daudio_util.cpp +++ b/common/src/daudio_util.cpp @@ -71,6 +71,7 @@ std::map typeCheckMap = { std::map::value_type(KEY_USERID, &DistributedHardware::IsInt32), std::map::value_type(KEY_TOKENID, &DistributedHardware::IsInt32), std::map::value_type(KEY_ACCOUNTID, &DistributedHardware::IsString), + std::map::value_type(KEY_OS_TYPE, &DistributedHardware::IsInt32), }; std::map eventNameMap = { diff --git a/services/audiomanager/managersink/include/daudio_sink_manager.h b/services/audiomanager/managersink/include/daudio_sink_manager.h index 439b5f0b..5d4a8643 100644 --- a/services/audiomanager/managersink/include/daudio_sink_manager.h +++ b/services/audiomanager/managersink/include/daudio_sink_manager.h @@ -73,6 +73,7 @@ public: int32_t ResumeDistributedHardware(const std::string &networkId); int32_t StopDistributedHardware(const std::string &networkId); void SetCallerTokenId(uint64_t tokenId); + int32_t CheckOsType(const std::string &networkId, bool &isInvalid); private: DAudioSinkManager(); @@ -86,6 +87,7 @@ private: std::string GetUdidByNetworkId(const std::string &networkId); int32_t VerifySecurityLevel(const std::string &devId); int32_t InitAudioDevice(std::shared_ptr dev, const std::string &devId, bool isSpkOrMic); + int32_t ParseValueFromCjson(std::string args, std::string key); private: static constexpr const char* DEVCLEAR_THREAD = "sinkClearTh"; diff --git a/services/audiomanager/managersink/src/daudio_sink_manager.cpp b/services/audiomanager/managersink/src/daudio_sink_manager.cpp index a68b43ef..1e671e06 100644 --- a/services/audiomanager/managersink/src/daudio_sink_manager.cpp +++ b/services/audiomanager/managersink/src/daudio_sink_manager.cpp @@ -23,6 +23,7 @@ #include "daudio_errorcode.h" #include "daudio_log.h" #include "daudio_util.h" +#include "device_manager.h" #undef DH_LOG_TAG #define DH_LOG_TAG "DAudioSinkManager" @@ -409,6 +410,9 @@ void CtrlChannelListener::OnCtrlChannelEvent(const AVTransEvent &event) if (event.type == EventType::EVENT_CHANNEL_OPENED) { DHLOGI("Received control channel opened event, create audio device for peerDevId=%{public}s, " "content=%{public}s.", GetAnonyString(event.peerDevId).c_str(), event.content.c_str()); + bool isInvalid = false; + CHECK_AND_RETURN_LOG(DAudioSinkManager::GetInstance().CheckOsType(event.peerDevId, isInvalid) && isInvalid, + "GetOsType failed or invalid osType"); DAudioSinkManager::GetInstance().SetChannelState(event.content); DAudioSinkManager::GetInstance().CreateAudioDevice(event.peerDevId); } else if (event.type == EventType::EVENT_CHANNEL_CLOSED) { @@ -565,6 +569,43 @@ int32_t DAudioSinkManager::VerifySecurityLevel(const std::string &devId) return DH_SUCCESS; } +int32_t DAudioSinkManager::ParseValueFromCjson(std::string args, std::string key) +{ + DHLOGD("ParseValueFromCjson"); + cJSON *jParam = cJSON_Parse(args.c_str()); + CHECK_NULL_RETURN(jParam, ERR_DH_AUDIO_FAILED); + CHECK_AND_FREE_RETURN_RET_LOG(!CJsonParamCheck(jParam, { key }), ERR_DH_AUDIO_FAILED, jParam, "Not found key"); + cJSON *retItem = cJSON_GetObjectItem(jParam, key.c_str()); + CHECK_AND_FREE_RETURN_RET_LOG(retItem == NULL || !cJSON_IsNumber(retItem), + ERR_DH_AUDIO_FAILED, jParam, "Not found key result"); + int32_t ret = retItem->valueint; + cJSON_Delete(jParam); + return ret; +} + +int32_t DAudioSinkManager::CheckOsType(const std::string &networkId, bool &isInvalid) +{ + std::shared_ptr initCallback = std::make_shared(); + int32_t ret = DeviceManager::GetInstance().InitDeviceManager(PKG_NAME, initCallback); + CHECK_AND_RETURN_RET_LOG(ret != DH_SUCCESS, ERR_DH_AUDIO_FAILED, "InitDeviceManager failed ret = %{public}d", ret); + std::vector dmDeviceInfoList; + int32_t errCode = DeviceManager::GetInstance().GetTrustedDeviceList(PKG_NAME, "", dmDeviceInfoList); + CHECK_AND_RETURN_RET_LOG(errCode != DH_SUCCESS, ERR_DH_AUDIO_FAILED, + "Get device manager trusted device list fail, errCode %{public}d", errCode); + for (const auto& dmDeviceInfo : dmDeviceInfoList) { + if (dmDeviceInfo.networkId == networkId) { + int32_t osType = ParseValueFromCjson(dmDeviceInfo.extraData, KEY_OS_TYPE); + if (osType == INVALID_OS_TYPE && osType != ERR_DH_AUDIO_FAILED) { + isInvalid = true; + } + DHLOGI("remote found, osType: %{public}d, isInvalid: %{public}d", osType, isInvalid); + return DH_SUCCESS; + } + } + DHLOGI("remote not found."); + return DH_SUCCESS; +} + void DAudioSinkManager::SetCallerTokenId(uint64_t tokenId) { callerTokenId_ = tokenId; diff --git a/services/audiomanager/managersource/include/daudio_source_dev.h b/services/audiomanager/managersource/include/daudio_source_dev.h index df422afd..19a08371 100644 --- a/services/audiomanager/managersource/include/daudio_source_dev.h +++ b/services/audiomanager/managersource/include/daudio_source_dev.h @@ -89,6 +89,8 @@ private: void OnDisableTaskResult(int32_t resultCode, const std::string &result, const std::string &funcName); void OnEnableTaskResult(int32_t resultCode, const std::string &result, const std::string &funcName); void OnTaskResult(int32_t resultCode, const std::string &result, const std::string &funcName); + int32_t ParseValueFromCjson(std::string args, std::string key); + int32_t CheckOsType(std::string &networkId, bool &isInvalid); int32_t HandleOpenDSpeaker(const AudioEvent &event); int32_t HandleCloseDSpeaker(const AudioEvent &event); diff --git a/services/audiomanager/managersource/src/daudio_source_dev.cpp b/services/audiomanager/managersource/src/daudio_source_dev.cpp index f472c1c7..d03b4e4c 100644 --- a/services/audiomanager/managersource/src/daudio_source_dev.cpp +++ b/services/audiomanager/managersource/src/daudio_source_dev.cpp @@ -413,6 +413,9 @@ int32_t DAudioSourceDev::HandleOpenDSpeaker(const AudioEvent &event) DHLOGI("Open speaker device."); CHECK_AND_RETURN_RET_LOG(!CheckAclRight(), ERR_DH_AUDIO_FAILED, "ACL check failed."); + bool isInvalid = false; + CHECK_AND_RETURN_RET_LOG(CheckOsType(devId_, isInvalid) && isInvalid, ERR_DH_AUDIO_FAILED, + "GetOsType failed or invalid osType"); CHECK_NULL_RETURN(handler_, ERR_DH_AUDIO_NULLPTR); auto eventParam = std::make_shared(event); auto msgEvent = AppExecFwk::InnerEvent::Get(EVENT_OPEN_SPEAKER, eventParam, 0); @@ -527,6 +530,9 @@ int32_t DAudioSourceDev::HandleOpenDMic(const AudioEvent &event) DHLOGI("Open mic device."); CHECK_AND_RETURN_RET_LOG(!CheckAclRight(), ERR_DH_AUDIO_FAILED, "ACL check failed."); + bool isInvalid = false; + CHECK_AND_RETURN_RET_LOG(CheckOsType(devId_, isInvalid) && isInvalid, ERR_DH_AUDIO_FAILED, + "GetOsType failed or invalid osType"); CHECK_NULL_RETURN(handler_, ERR_DH_AUDIO_NULLPTR); auto eventParam = std::make_shared(event); auto msgEvent = AppExecFwk::InnerEvent::Get(EVENT_OPEN_MIC, eventParam, 0); @@ -1543,6 +1549,40 @@ void DAudioSourceDev::SetTokenId(uint64_t value) tokenId_ = value; } +int32_t DAudioSourceDev::ParseValueFromCjson(std::string args, std::string key) +{ + DHLOGD("ParseValueFromCjson"); + cJSON *jParam = cJSON_Parse(args.c_str()); + CHECK_NULL_RETURN(jParam, ERR_DH_AUDIO_FAILED); + CHECK_AND_FREE_RETURN_RET_LOG(!CJsonParamCheck(jParam, { key }), ERR_DH_AUDIO_FAILED, jParam, "Not found key"); + cJSON *retItem = cJSON_GetObjectItem(jParam, key.c_str()); + CHECK_AND_FREE_RETURN_RET_LOG(retItem == NULL || !cJSON_IsNumber(retItem), + ERR_DH_AUDIO_FAILED, jParam, "Not found key result"); + int32_t ret = retItem->valueint; + cJSON_Delete(jParam); + return ret; +} + +int32_t DAudioSourceDev::CheckOsType(std::string &networkId, bool &isInvalid) +{ + std::vector dmDeviceInfoList; + int32_t errCode = DeviceManager::GetInstance().GetTrustedDeviceList(PKG_NAME, "", dmDeviceInfoList); + CHECK_AND_RETURN_RET_LOG(errCode != DH_SUCCESS, ERR_DH_AUDIO_FAILED, + "Get device manager trusted device list fail, errCode %{public}d", errCode); + for (const auto& dmDeviceInfo : dmDeviceInfoList) { + if (dmDeviceInfo.networkId == networkId) { + int32_t osType = ParseValueFromCjson(dmDeviceInfo.extraData, KEY_OS_TYPE); + if (osType == INVALID_OS_TYPE && osType != ERR_DH_AUDIO_FAILED) { + isInvalid = true; + } + DHLOGI("remote found, osType: %{public}d, isInvalid: %{public}d", osType, isInvalid); + return DH_SUCCESS; + } + } + DHLOGI("remote not found."); + return DH_SUCCESS; +} + DAudioSourceDev::SourceEventHandler::SourceEventHandler(const std::shared_ptr &runner, const std::shared_ptr &dev) : AppExecFwk::EventHandler(runner), sourceDev_(dev) { diff --git a/services/audiomanager/test/unittest/managersink/src/daudio_sink_manager_test.cpp b/services/audiomanager/test/unittest/managersink/src/daudio_sink_manager_test.cpp index de66db64..2f9a1e67 100644 --- a/services/audiomanager/test/unittest/managersink/src/daudio_sink_manager_test.cpp +++ b/services/audiomanager/test/unittest/managersink/src/daudio_sink_manager_test.cpp @@ -281,5 +281,42 @@ HWTEST_F(DAudioSinkManagerTest, OnProviderEvent_001, TestSize.Level1) AVTransEvent event3 = { EventType::EVENT_REMOVE_STREAM, "", ""}; EXPECT_EQ(DH_SUCCESS, daudioSinkManager.providerListener_->OnProviderEvent(event3)); } + +/** + * @tc.name: ParseValueFromCjson_001 + * @tc.desc: Verify the ParseValueFromCjson function. + * @tc.type: FUNC + * @tc.require: AR000H0E5F + */ +HWTEST_F(DAudioSinkManagerTest, ParseValueFromCjson_001, TestSize.Level1) +{ + int32_t volume = 50; + std::string jsonStr = "{\"OS_TYPE\": 50}"; + std::string key = "OS_TYPE"; + int32_t result = daudioSinkManager.ParseValueFromCjson(jsonStr, key); + EXPECT_EQ(result, volume); + + jsonStr = "invalid_json"; + key = "volume"; + result = daudioSinkManager.ParseValueFromCjson(jsonStr, key); + EXPECT_EQ(result, ERR_DH_AUDIO_FAILED); + + jsonStr = "{\"brightness\": 80}"; + result = daudioSinkManager.ParseValueFromCjson(jsonStr, key); + EXPECT_EQ(result, ERR_DH_AUDIO_FAILED); + + jsonStr = "{\"volume\": \"high\"}"; + result = daudioSinkManager.ParseValueFromCjson(jsonStr, key); + EXPECT_EQ(result, ERR_DH_AUDIO_FAILED); + + jsonStr = ""; + result = daudioSinkManager.ParseValueFromCjson(jsonStr, key); + EXPECT_EQ(result, ERR_DH_AUDIO_FAILED); + + jsonStr = "null"; + key = "volume"; + result = daudioSinkManager.ParseValueFromCjson(jsonStr, key); + EXPECT_EQ(result, ERR_DH_AUDIO_FAILED); +} } // DistributedHardware } // OHOS diff --git a/services/audiomanager/test/unittest/sourcedevice/src/daudio_source_dev_test.cpp b/services/audiomanager/test/unittest/sourcedevice/src/daudio_source_dev_test.cpp index 85ca7d62..003fb4af 100644 --- a/services/audiomanager/test/unittest/sourcedevice/src/daudio_source_dev_test.cpp +++ b/services/audiomanager/test/unittest/sourcedevice/src/daudio_source_dev_test.cpp @@ -1233,5 +1233,42 @@ HWTEST_F(DAudioSourceDevTest, EnableDAudio_001, TestSize.Level1) std::string argsFull = "{\"dataType\":\"full\"}"; EXPECT_EQ(DH_SUCCESS, sourceDev_->EnableDAudio(DH_ID_SPK, argsFull)); } + +/** + * @tc.name: ParseValueFromCjson_001 + * @tc.desc: Verify the ParseValueFromCjson function. + * @tc.type: FUNC + * @tc.require: AR000H0E5F + */ +HWTEST_F(DAudioSourceDevTest, ParseValueFromCjson_001, TestSize.Level1) +{ + int32_t volume = 50; + std::string jsonStr = "{\"OS_TYPE\": 50}"; + std::string key = "OS_TYPE"; + int32_t result = sourceDev_->ParseValueFromCjson(jsonStr, key); + EXPECT_EQ(result, volume); + + jsonStr = "invalid_json"; + key = "volume"; + result = sourceDev_->ParseValueFromCjson(jsonStr, key); + EXPECT_EQ(result, ERR_DH_AUDIO_FAILED); + + jsonStr = "{\"brightness\": 80}"; + result = sourceDev_->ParseValueFromCjson(jsonStr, key); + EXPECT_EQ(result, ERR_DH_AUDIO_FAILED); + + jsonStr = "{\"volume\": \"high\"}"; + result = sourceDev_->ParseValueFromCjson(jsonStr, key); + EXPECT_EQ(result, ERR_DH_AUDIO_FAILED); + + jsonStr = ""; + result = sourceDev_->ParseValueFromCjson(jsonStr, key); + EXPECT_EQ(result, ERR_DH_AUDIO_FAILED); + + jsonStr = "null"; + key = "volume"; + result = sourceDev_->ParseValueFromCjson(jsonStr, key); + EXPECT_EQ(result, ERR_DH_AUDIO_FAILED); +} } // namespace DistributedHardware } // namespace OHOS -- Gitee