diff --git a/frameworks/js/player/audio_player_napi.cpp b/frameworks/js/player/audio_player_napi.cpp index 35afd6dc3e35f93ce081f0f40146fddaf0634aff..88ecccec66fc1a4a9e93b2caef091b2d0ae3d25c 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 0f4b55454c5deb2fab6f4298f26399a55aa8e2df..6506cc2b3c412d8a5c2f372ef9b0edbe5dbd25ea 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 a11aceb903263b9bdce5d677d004641df266c560..3bac873515480a2ab9975f0ad91a1d3a030c929e 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 12475235cc4c8bcde9fea34570d7192e65395b92..448ecc0978beba184ef30f0995698390d48a5d49 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 50c9a58eec1e70f9d6036886894c485b7a37c0e1..6ca010bfe2086c524d0536f89236bb3b689a93b6 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