diff --git a/dmserver/BUILD.gn b/dmserver/BUILD.gn index ca7fdfa2120b344beb87854878ec7a88c32cb5e8..57c0c61f368618ab94e52b9b78c59321a8e0960e 100644 --- a/dmserver/BUILD.gn +++ b/dmserver/BUILD.gn @@ -51,6 +51,8 @@ ohos_shared_library("libdms") { external_deps = [ "bytrace_standard:bytrace_core", + "ability_runtime:ability_manager", + "access_token:libaccesstoken_sdk", "graphic_standard:surface", "hilog_native:libhilog", "ipc:ipc_core", diff --git a/dmserver/include/display_manager_stub.h b/dmserver/include/display_manager_stub.h index d88c4a0c652f4591b600a1e4b2f5ed339502127e..32488a7c2adc148c53ab5855dd51a7d079172af1 100644 --- a/dmserver/include/display_manager_stub.h +++ b/dmserver/include/display_manager_stub.h @@ -27,6 +27,9 @@ public: ~DisplayManagerStub() = default; virtual int32_t OnRemoteRequest(uint32_t code, MessageParcel &data, MessageParcel &reply, MessageOption &option) override; +private: + bool CheckCallingPermission(const std::string &permission); + bool IsStartByHdcd(); }; } // namespace OHOS::Rosen diff --git a/dmserver/src/display_manager_stub.cpp b/dmserver/src/display_manager_stub.cpp index e7a520e8fdf5b36a63c392142fe01cf0070c501f..b4e0537aca3e93e5f3fdb245bf745f110bd99400 100644 --- a/dmserver/src/display_manager_stub.cpp +++ b/dmserver/src/display_manager_stub.cpp @@ -19,6 +19,8 @@ #include +#include "accesstoken_kit.h" +#include "bundle_constants.h" #include "window_manager_hilog.h" #include "transaction/rs_interfaces.h" @@ -28,6 +30,27 @@ namespace { constexpr HiviewDFX::HiLogLabel LABEL = {LOG_CORE, HILOG_DOMAIN_DISPLAY, "DisplayManagerStub"}; } +bool DisplayManagerStub::CheckCallingPermission(const std::string &permission) +{ + if (Security::AccessToken::AccessTokenKit::VerifyAccessToken(IPCSkeleton::GetCallingTokenID(), permission) != + AppExecFwk::Constants::PERMISSION_GRANTED) { + return false; + } + return true; +} + +bool DisplayManagerStub::IsStartByHdcd() +{ + OHOS::Security::AccessToken::NativeTokenInfo info; + if (Security::AccessToken::AccessTokenKit::GetNativeTokenInfo(IPCSkeleton::GetCallingTokenID(), info) != 0) { + return false; + } + if (info.processName.compare("hdcd") == 0) { + return true; + } + return false; +} + int32_t DisplayManagerStub::OnRemoteRequest(uint32_t code, MessageParcel &data, MessageParcel &reply, MessageOption &option) { @@ -107,9 +130,14 @@ int32_t DisplayManagerStub::OnRemoteRequest(uint32_t code, MessageParcel &data, break; } case TRANS_ID_GET_DISPLAY_SNAPSHOT: { - DisplayId displayId = data.ReadUint64(); - std::shared_ptr displaySnapshot = GetDisplaySnapshot(displayId); - reply.WriteParcelable(displaySnapshot == nullptr ? nullptr : displaySnapshot.get()); + if (CheckCallingPermission("ohos.permission.CAPTURE_SCREEN") || IsStartByHdcd()) { + DisplayId displayId = data.ReadUint64(); + std::shared_ptr displaySnapshot = GetDisplaySnapshot(displayId); + reply.WriteParcelable(displaySnapshot == nullptr ? nullptr : displaySnapshot.get()); + break; + } + WLOGFE("check permission failed!"); + reply.WriteParcelable(nullptr); break; } case TRANS_ID_REGISTER_DISPLAY_MANAGER_AGENT: { @@ -326,4 +354,4 @@ int32_t DisplayManagerStub::OnRemoteRequest(uint32_t code, MessageParcel &data, } return 0; } -} // namespace OHOS::Rosen \ No newline at end of file +} // namespace OHOS::Rosen diff --git a/interfaces/kits/napi/screenshot/native_screenshot_module.cpp b/interfaces/kits/napi/screenshot/native_screenshot_module.cpp index b800fe155eb34f7f582e0224ccfdcd206e20b6d6..fbb32433afbcf264beddca1888ff112943097047 100644 --- a/interfaces/kits/napi/screenshot/native_screenshot_module.cpp +++ b/interfaces/kits/napi/screenshot/native_screenshot_module.cpp @@ -164,13 +164,6 @@ static void GetScreenshotParam(napi_env env, std::unique_ptr ¶m, napi static void AsyncGetScreenshot(napi_env env, std::unique_ptr ¶m) { - if (!CheckCallingPermission("ohos.permission.CAPTURE_SCREEN")) { - WLOGFE("Get Screenshot failed. Do not have permission!"); - param->image = nullptr; - param->wret = WMError::WM_ERROR_INVALID_PERMISSION; - param->errMessage = "Get Screenshot Failed: Do not have ohos.permission.CAPTURE_SCREEN"; - return; - } if (!param->validInputParam) { WLOGFE("Invalid Input Param!"); param->image = nullptr;