From a9eb2bb54b8fe3353addac8a86e1d2e2b4d845ba Mon Sep 17 00:00:00 2001 From: FileStream Date: Sat, 24 Aug 2024 16:03:09 +0800 Subject: [PATCH 1/2] =?UTF-8?q?=E9=94=99=E8=AF=AF=E7=A0=81=E5=AE=89?= =?UTF-8?q?=E5=85=A8=E6=95=B4=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: FileStream --- frameworks/js/player/audio_player_napi.cpp | 6 +++ .../js/recorder/audio_recorder_napi.cpp | 9 ++++ .../js/recorder/video_recorder_napi.cpp | 45 +++++++++++++++++++ services/utils/include/media_permission.h | 2 + services/utils/media_permission.cpp | 20 +++++++++ 5 files changed, 82 insertions(+) diff --git a/frameworks/js/player/audio_player_napi.cpp b/frameworks/js/player/audio_player_napi.cpp index 35afd6dc3..88ecccec6 100644 --- a/frameworks/js/player/audio_player_napi.cpp +++ b/frameworks/js/player/audio_player_napi.cpp @@ -18,6 +18,7 @@ #include "player_callback_napi.h" #include "media_log.h" #include "media_errors.h" +#include "media_permission.h" #include "string_ex.h" #ifdef SUPPORT_JSSTACK #include "xpower_event_js.h" @@ -221,6 +222,11 @@ napi_value AudioPlayerNapi::SetSrc(napi_env env, napi_callback_info info) return undefinedResult; } + auto asyncContext = std::make_unique(env); + if (!(MediaPermission::CheckReadMediaPermission() || MediaPermission::CheckNetWorkPermission())) { + asyncContext->SignError(MSERR_EXT_API9_NO_PERMISSION, "CreateAudioRecorder no permission"); + } + napi_valuetype valueType = napi_undefined; if (napi_typeof(env, args[0], &valueType) != napi_ok || valueType != napi_string) { player->ErrorCallback(MSERR_EXT_INVALID_VAL, "napi_typeof failed, please check the input parameters"); diff --git a/frameworks/js/recorder/audio_recorder_napi.cpp b/frameworks/js/recorder/audio_recorder_napi.cpp index 0f4b55454..06abd2fd4 100644 --- a/frameworks/js/recorder/audio_recorder_napi.cpp +++ b/frameworks/js/recorder/audio_recorder_napi.cpp @@ -223,6 +223,15 @@ napi_value AudioRecorderNapi::Prepare(napi_env env, napi_callback_info info) return undefinedResult; } + auto asyncCtx = std::make_unique(env); + if (!SystemPermission()) { + asyncCtx->SignError(MSERR_EXT_API9_PERMISSION_DENIED, "CreateVideoRecorder no system app"); + } + + if (!MediaPermission::CheckMicPermission()) { + asyncCtx->SignError(MSERR_EXT_API9_NO_PERMISSION, "CreateVideoRecorder no MicPermission"); + } + AudioRecorderNapi *recorderNapi = nullptr; status = napi_unwrap(env, jsThis, reinterpret_cast(&recorderNapi)); CHECK_AND_RETURN_RET_LOG(status == napi_ok && recorderNapi != nullptr, undefinedResult, diff --git a/frameworks/js/recorder/video_recorder_napi.cpp b/frameworks/js/recorder/video_recorder_napi.cpp index a11aceb90..3bac87351 100644 --- a/frameworks/js/recorder/video_recorder_napi.cpp +++ b/frameworks/js/recorder/video_recorder_napi.cpp @@ -193,6 +193,11 @@ napi_value VideoRecorderNapi::Prepare(napi_env env, napi_callback_info info) auto asyncCtx = std::make_unique(env); + if (!SystemPermission()) { + SignError(asyncCtx.get(), + MSERR_EXT_API9_PERMISSION_DENIED, "CreateVideoRecorder", "system"); + } + size_t argCount = 2; napi_status status = napi_get_cb_info(env, info, &argCount, args, &jsThis, nullptr); if (status != napi_ok || jsThis == nullptr) { @@ -256,6 +261,11 @@ napi_value VideoRecorderNapi::GetInputSurface(napi_env env, napi_callback_info i auto asyncCtx = std::make_unique(env); + if (!SystemPermission()) { + SignError(asyncCtx.get(), + MSERR_EXT_API9_PERMISSION_DENIED, "CreateVideoRecorder", "system"); + } + // get args napi_value jsThis = nullptr; napi_value args[1] = {nullptr}; @@ -308,6 +318,11 @@ napi_value VideoRecorderNapi::Start(napi_env env, napi_callback_info info) auto asyncCtx = std::make_unique(env); + if (!SystemPermission()) { + SignError(asyncCtx.get(), + MSERR_EXT_API9_PERMISSION_DENIED, "CreateVideoRecorder", "system"); + } + napi_value jsThis = nullptr; napi_value args[1] = { nullptr }; size_t argCount = 1; @@ -353,6 +368,11 @@ napi_value VideoRecorderNapi::Pause(napi_env env, napi_callback_info info) auto asyncCtx = std::make_unique(env); + if (!SystemPermission()) { + SignError(asyncCtx.get(), + MSERR_EXT_API9_PERMISSION_DENIED, "CreateVideoRecorder", "system"); + } + napi_value jsThis = nullptr; napi_value args[1] = { nullptr }; size_t argCount = 1; @@ -396,6 +416,11 @@ napi_value VideoRecorderNapi::Resume(napi_env env, napi_callback_info info) auto asyncCtx = std::make_unique(env); + if (!SystemPermission()) { + SignError(asyncCtx.get(), + MSERR_EXT_API9_PERMISSION_DENIED, "CreateVideoRecorder", "system"); + } + napi_value jsThis = nullptr; napi_value args[1] = { nullptr }; size_t argCount = 1; @@ -441,6 +466,11 @@ napi_value VideoRecorderNapi::Stop(napi_env env, napi_callback_info info) auto asyncCtx = std::make_unique(env); + if (!SystemPermission()) { + SignError(asyncCtx.get(), + MSERR_EXT_API9_PERMISSION_DENIED, "CreateVideoRecorder", "system"); + } + napi_value jsThis = nullptr; napi_value args[1] = { nullptr }; size_t argCount = 1; @@ -484,6 +514,11 @@ napi_value VideoRecorderNapi::Reset(napi_env env, napi_callback_info info) auto asyncCtx = std::make_unique(env); + if (!SystemPermission()) { + SignError(asyncCtx.get(), + MSERR_EXT_API9_PERMISSION_DENIED, "CreateVideoRecorder", "system"); + } + napi_value jsThis = nullptr; napi_value args[1] = { nullptr }; size_t argCount = 1; @@ -534,6 +569,11 @@ napi_value VideoRecorderNapi::Release(napi_env env, napi_callback_info info) auto asyncCtx = std::make_unique(env); + if (!SystemPermission()) { + SignError(asyncCtx.get(), + MSERR_EXT_API9_PERMISSION_DENIED, "CreateVideoRecorder", "system"); + } + napi_value jsThis = nullptr; napi_value args[1] = { nullptr }; size_t argCount = 1; @@ -583,6 +623,11 @@ napi_value VideoRecorderNapi::On(napi_env env, napi_callback_info info) auto asyncCtx = std::make_unique(env); + if (!SystemPermission()) { + SignError(asyncCtx.get(), + MSERR_EXT_API9_PERMISSION_DENIED, "CreateVideoRecorder", "system"); + } + static constexpr size_t minArgCount = 2; size_t argCount = minArgCount; napi_value args[minArgCount] = { nullptr, nullptr }; diff --git a/services/utils/include/media_permission.h b/services/utils/include/media_permission.h index 12475235c..448ecc097 100644 --- a/services/utils/include/media_permission.h +++ b/services/utils/include/media_permission.h @@ -21,6 +21,8 @@ class __attribute__((visibility("default"))) MediaPermission { public: static int32_t CheckMicPermission(); static int32_t CheckNetWorkPermission(int32_t appUid, int32_t appPid, uint32_t appTokenId); + static int32_t CheckNetWorkPermission(); + static int32_t CheckReadMediaPermission(); }; } // namespace Media } // namespace OHOS diff --git a/services/utils/media_permission.cpp b/services/utils/media_permission.cpp index 50c9a58ee..b047b73d2 100644 --- a/services/utils/media_permission.cpp +++ b/services/utils/media_permission.cpp @@ -49,5 +49,25 @@ int32_t MediaPermission::CheckNetWorkPermission(int32_t appUid, int32_t appPid, Security::AccessToken::AccessTokenID tokenCaller = appTokenId; return Security::AccessToken::AccessTokenKit::VerifyAccessToken(tokenCaller, "ohos.permission.INTERNET"); } + +int32_t MediaPermission::CheckNetWorkPermission() +{ + auto callerUid = IPCSkeleton::GetCallingUid(); + if (callerUid == ROOT_UID) { + MEDIA_LOGI("Root user. Permission Granted"); + return Security::AccessToken::PERMISSION_GRANTED; + } + Security::AccessToken::AccessTokenID tokenCaller = IPCSkeleton::GetCallingTokenID(); + return Security::AccessToken::AccessTokenKit::VerifyAccessToken(tokenCaller, "ohos.permission.INTERNET"); } + +int32_t MediaPermission::CheckReadMediaPermission() +{ + auto callerUid = IPCSkeleton::GetCallingUid(); + if (callerUid == ROOT_UID) { + MEDIA_LOGI("Root user. Permission Granted"); + return Security::AccessToken::PERMISSION_GRANTED; + } + Security::AccessToken::AccessTokenID tokenCaller = IPCSkeleton::GetCallingTokenID(); + return Security::AccessToken::AccessTokenKit::VerifyAccessToken(tokenCaller, "ohos.permission.READ_MEDIA"); } \ No newline at end of file -- Gitee From e4ea512f85a97a1bb303099f907af006bd5c9162 Mon Sep 17 00:00:00 2001 From: FileStream Date: Sat, 24 Aug 2024 16:03:09 +0800 Subject: [PATCH 2/2] =?UTF-8?q?=E9=94=99=E8=AF=AF=E7=A0=81=E5=AE=89?= =?UTF-8?q?=E5=85=A8=E6=95=B4=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: FileStream --- frameworks/js/player/audio_player_napi.cpp | 6 +++ .../js/recorder/audio_recorder_napi.cpp | 10 +++++ .../js/recorder/video_recorder_napi.cpp | 45 +++++++++++++++++++ services/utils/include/media_permission.h | 2 + services/utils/media_permission.cpp | 22 +++++++++ 5 files changed, 85 insertions(+) diff --git a/frameworks/js/player/audio_player_napi.cpp b/frameworks/js/player/audio_player_napi.cpp index 35afd6dc3..88ecccec6 100644 --- a/frameworks/js/player/audio_player_napi.cpp +++ b/frameworks/js/player/audio_player_napi.cpp @@ -18,6 +18,7 @@ #include "player_callback_napi.h" #include "media_log.h" #include "media_errors.h" +#include "media_permission.h" #include "string_ex.h" #ifdef SUPPORT_JSSTACK #include "xpower_event_js.h" @@ -221,6 +222,11 @@ napi_value AudioPlayerNapi::SetSrc(napi_env env, napi_callback_info info) return undefinedResult; } + auto asyncContext = std::make_unique(env); + if (!(MediaPermission::CheckReadMediaPermission() || MediaPermission::CheckNetWorkPermission())) { + asyncContext->SignError(MSERR_EXT_API9_NO_PERMISSION, "CreateAudioRecorder no permission"); + } + napi_valuetype valueType = napi_undefined; if (napi_typeof(env, args[0], &valueType) != napi_ok || valueType != napi_string) { player->ErrorCallback(MSERR_EXT_INVALID_VAL, "napi_typeof failed, please check the input parameters"); diff --git a/frameworks/js/recorder/audio_recorder_napi.cpp b/frameworks/js/recorder/audio_recorder_napi.cpp index 0f4b55454..6506cc2b3 100644 --- a/frameworks/js/recorder/audio_recorder_napi.cpp +++ b/frameworks/js/recorder/audio_recorder_napi.cpp @@ -20,6 +20,7 @@ #include "recorder_callback_napi.h" #include "media_log.h" #include "media_errors.h" +#include "media_permission.h" #include "directory_ex.h" #include "string_ex.h" #include "common_napi.h" @@ -223,6 +224,15 @@ napi_value AudioRecorderNapi::Prepare(napi_env env, napi_callback_info info) return undefinedResult; } + auto asyncCtx = std::make_unique(env); + if (!SystemPermission()) { + asyncCtx->SignError(MSERR_EXT_API9_PERMISSION_DENIED, "CreateVideoRecorder no system app"); + } + + if (!MediaPermission::CheckMicPermission()) { + asyncCtx->SignError(MSERR_EXT_API9_NO_PERMISSION, "CreateVideoRecorder no MicPermission"); + } + AudioRecorderNapi *recorderNapi = nullptr; status = napi_unwrap(env, jsThis, reinterpret_cast(&recorderNapi)); CHECK_AND_RETURN_RET_LOG(status == napi_ok && recorderNapi != nullptr, undefinedResult, diff --git a/frameworks/js/recorder/video_recorder_napi.cpp b/frameworks/js/recorder/video_recorder_napi.cpp index a11aceb90..3bac87351 100644 --- a/frameworks/js/recorder/video_recorder_napi.cpp +++ b/frameworks/js/recorder/video_recorder_napi.cpp @@ -193,6 +193,11 @@ napi_value VideoRecorderNapi::Prepare(napi_env env, napi_callback_info info) auto asyncCtx = std::make_unique(env); + if (!SystemPermission()) { + SignError(asyncCtx.get(), + MSERR_EXT_API9_PERMISSION_DENIED, "CreateVideoRecorder", "system"); + } + size_t argCount = 2; napi_status status = napi_get_cb_info(env, info, &argCount, args, &jsThis, nullptr); if (status != napi_ok || jsThis == nullptr) { @@ -256,6 +261,11 @@ napi_value VideoRecorderNapi::GetInputSurface(napi_env env, napi_callback_info i auto asyncCtx = std::make_unique(env); + if (!SystemPermission()) { + SignError(asyncCtx.get(), + MSERR_EXT_API9_PERMISSION_DENIED, "CreateVideoRecorder", "system"); + } + // get args napi_value jsThis = nullptr; napi_value args[1] = {nullptr}; @@ -308,6 +318,11 @@ napi_value VideoRecorderNapi::Start(napi_env env, napi_callback_info info) auto asyncCtx = std::make_unique(env); + if (!SystemPermission()) { + SignError(asyncCtx.get(), + MSERR_EXT_API9_PERMISSION_DENIED, "CreateVideoRecorder", "system"); + } + napi_value jsThis = nullptr; napi_value args[1] = { nullptr }; size_t argCount = 1; @@ -353,6 +368,11 @@ napi_value VideoRecorderNapi::Pause(napi_env env, napi_callback_info info) auto asyncCtx = std::make_unique(env); + if (!SystemPermission()) { + SignError(asyncCtx.get(), + MSERR_EXT_API9_PERMISSION_DENIED, "CreateVideoRecorder", "system"); + } + napi_value jsThis = nullptr; napi_value args[1] = { nullptr }; size_t argCount = 1; @@ -396,6 +416,11 @@ napi_value VideoRecorderNapi::Resume(napi_env env, napi_callback_info info) auto asyncCtx = std::make_unique(env); + if (!SystemPermission()) { + SignError(asyncCtx.get(), + MSERR_EXT_API9_PERMISSION_DENIED, "CreateVideoRecorder", "system"); + } + napi_value jsThis = nullptr; napi_value args[1] = { nullptr }; size_t argCount = 1; @@ -441,6 +466,11 @@ napi_value VideoRecorderNapi::Stop(napi_env env, napi_callback_info info) auto asyncCtx = std::make_unique(env); + if (!SystemPermission()) { + SignError(asyncCtx.get(), + MSERR_EXT_API9_PERMISSION_DENIED, "CreateVideoRecorder", "system"); + } + napi_value jsThis = nullptr; napi_value args[1] = { nullptr }; size_t argCount = 1; @@ -484,6 +514,11 @@ napi_value VideoRecorderNapi::Reset(napi_env env, napi_callback_info info) auto asyncCtx = std::make_unique(env); + if (!SystemPermission()) { + SignError(asyncCtx.get(), + MSERR_EXT_API9_PERMISSION_DENIED, "CreateVideoRecorder", "system"); + } + napi_value jsThis = nullptr; napi_value args[1] = { nullptr }; size_t argCount = 1; @@ -534,6 +569,11 @@ napi_value VideoRecorderNapi::Release(napi_env env, napi_callback_info info) auto asyncCtx = std::make_unique(env); + if (!SystemPermission()) { + SignError(asyncCtx.get(), + MSERR_EXT_API9_PERMISSION_DENIED, "CreateVideoRecorder", "system"); + } + napi_value jsThis = nullptr; napi_value args[1] = { nullptr }; size_t argCount = 1; @@ -583,6 +623,11 @@ napi_value VideoRecorderNapi::On(napi_env env, napi_callback_info info) auto asyncCtx = std::make_unique(env); + if (!SystemPermission()) { + SignError(asyncCtx.get(), + MSERR_EXT_API9_PERMISSION_DENIED, "CreateVideoRecorder", "system"); + } + static constexpr size_t minArgCount = 2; size_t argCount = minArgCount; napi_value args[minArgCount] = { nullptr, nullptr }; diff --git a/services/utils/include/media_permission.h b/services/utils/include/media_permission.h index 12475235c..448ecc097 100644 --- a/services/utils/include/media_permission.h +++ b/services/utils/include/media_permission.h @@ -21,6 +21,8 @@ class __attribute__((visibility("default"))) MediaPermission { public: static int32_t CheckMicPermission(); static int32_t CheckNetWorkPermission(int32_t appUid, int32_t appPid, uint32_t appTokenId); + static int32_t CheckNetWorkPermission(); + static int32_t CheckReadMediaPermission(); }; } // namespace Media } // namespace OHOS diff --git a/services/utils/media_permission.cpp b/services/utils/media_permission.cpp index 50c9a58ee..6ca010bfe 100644 --- a/services/utils/media_permission.cpp +++ b/services/utils/media_permission.cpp @@ -49,5 +49,27 @@ int32_t MediaPermission::CheckNetWorkPermission(int32_t appUid, int32_t appPid, Security::AccessToken::AccessTokenID tokenCaller = appTokenId; return Security::AccessToken::AccessTokenKit::VerifyAccessToken(tokenCaller, "ohos.permission.INTERNET"); } + +int32_t MediaPermission::CheckNetWorkPermission() +{ + auto callerUid = IPCSkeleton::GetCallingUid(); + if (callerUid == ROOT_UID) { + MEDIA_LOGI("Root user. Permission Granted"); + return Security::AccessToken::PERMISSION_GRANTED; + } + Security::AccessToken::AccessTokenID tokenCaller = IPCSkeleton::GetCallingTokenID(); + return Security::AccessToken::AccessTokenKit::VerifyAccessToken(tokenCaller, "ohos.permission.INTERNET"); +} + +int32_t MediaPermission::CheckReadMediaPermission() +{ + auto callerUid = IPCSkeleton::GetCallingUid(); + if (callerUid == ROOT_UID) { + MEDIA_LOGI("Root user. Permission Granted"); + return Security::AccessToken::PERMISSION_GRANTED; + } + Security::AccessToken::AccessTokenID tokenCaller = IPCSkeleton::GetCallingTokenID(); + return Security::AccessToken::AccessTokenKit::VerifyAccessToken(tokenCaller, "ohos.permission.READ_MEDIA"); +} } } \ No newline at end of file -- Gitee