From b97e44cae0dc5576730d8c4b0f8d7fb4e9af1188 Mon Sep 17 00:00:00 2001 From: Nagesh Shamnur Date: Wed, 18 May 2022 18:54:05 +0530 Subject: [PATCH] Implement lens authentication in service layer instead of framework Signed-off-by: Nagesh Shamnur --- .../src/input/camera_manager_napi.cpp | 2 - .../js/camera_napi/src/input/camera_napi.cpp | 1 - .../src/output/photo_output_napi.cpp | 1 - .../src/output/preview_output_napi.cpp | 1 - .../src/output/video_output_napi.cpp | 1 - .../src/session/camera_session_napi.cpp | 2 - frameworks/native/camera/BUILD.gn | 3 - .../camera/src/input/camera_manager.cpp | 27 +---- .../native/camera/test/moduletest/BUILD.gn | 8 +- .../src/camera_framework_moduletest.cpp | 83 +++++++++++++- .../native/camera/test/unittest/BUILD.gn | 4 + .../src/camera_framework_unittest.cpp | 71 +++++++++++- .../camera/include/input/camera_manager.h | 2 - interfaces/inner_api/native/test/BUILD.gn | 9 ++ .../inner_api/native/test/camera_capture.cpp | 91 +++++++++++++++ .../native/test/camera_capture_video.cpp | 93 ++++++++++++++++ .../inner_api/native/test/camera_video.cpp | 104 ++++++++++++++++++ services/camera_service/BUILD.gn | 2 + .../camera_service/src/hcamera_service.cpp | 26 +++++ 19 files changed, 487 insertions(+), 44 deletions(-) diff --git a/frameworks/js/camera_napi/src/input/camera_manager_napi.cpp b/frameworks/js/camera_napi/src/input/camera_manager_napi.cpp index f9150cca7..46f24b2a1 100644 --- a/frameworks/js/camera_napi/src/input/camera_manager_napi.cpp +++ b/frameworks/js/camera_napi/src/input/camera_manager_napi.cpp @@ -54,7 +54,6 @@ napi_value CameraManagerNapi::CameraManagerNapiConstructor(napi_env env, napi_ca if (obj != nullptr) { obj->env_ = env; obj->cameraManager_ = CameraManager::GetInstance(); - obj->cameraManager_->SetPermissionCheck(true); status = napi_wrap(env, thisVar, reinterpret_cast(obj.get()), CameraManagerNapi::CameraManagerNapiDestructor, nullptr, &(obj->wrapper_)); if (status == napi_ok) { @@ -73,7 +72,6 @@ void CameraManagerNapi::CameraManagerNapiDestructor(napi_env env, void *nativeOb { CameraManagerNapi *camera = reinterpret_cast(nativeObject); if (camera != nullptr) { - camera->cameraManager_->SetPermissionCheck(false); camera->~CameraManagerNapi(); } } diff --git a/frameworks/js/camera_napi/src/input/camera_napi.cpp b/frameworks/js/camera_napi/src/input/camera_napi.cpp index c60866bf0..f071d0f86 100644 --- a/frameworks/js/camera_napi/src/input/camera_napi.cpp +++ b/frameworks/js/camera_napi/src/input/camera_napi.cpp @@ -108,7 +108,6 @@ void CameraNapi::CameraNapiDestructor(napi_env env, void *nativeObject, void *fi { CameraNapi *camera = reinterpret_cast(nativeObject); if (camera != nullptr) { - CameraManager::GetInstance()->SetPermissionCheck(false); camera->~CameraNapi(); } } diff --git a/frameworks/js/camera_napi/src/output/photo_output_napi.cpp b/frameworks/js/camera_napi/src/output/photo_output_napi.cpp index 8b5925fd5..c37abed1f 100644 --- a/frameworks/js/camera_napi/src/output/photo_output_napi.cpp +++ b/frameworks/js/camera_napi/src/output/photo_output_napi.cpp @@ -298,7 +298,6 @@ napi_value PhotoOutputNapi::CreatePhotoOutput(napi_env env, std::string surfaceI #else surface->SetUserData(CameraManager::surfaceFormat, std::to_string(OHOS_CAMERA_FORMAT_JPEG)); #endif - CameraManager::GetInstance()->SetPermissionCheck(true); sPhotoOutput_ = CameraManager::GetInstance()->CreatePhotoOutput(surface); if (sPhotoOutput_ == nullptr) { MEDIA_ERR_LOG("failed to create CreatePhotoOutput"); diff --git a/frameworks/js/camera_napi/src/output/preview_output_napi.cpp b/frameworks/js/camera_napi/src/output/preview_output_napi.cpp index 22e5c9231..59e6ff256 100644 --- a/frameworks/js/camera_napi/src/output/preview_output_napi.cpp +++ b/frameworks/js/camera_napi/src/output/preview_output_napi.cpp @@ -276,7 +276,6 @@ napi_value PreviewOutputNapi::CreatePreviewOutput(napi_env env, uint64_t surface #else surface->SetUserData(CameraManager::surfaceFormat, std::to_string(OHOS_CAMERA_FORMAT_YCRCB_420_SP)); #endif - CameraManager::GetInstance()->SetPermissionCheck(true); sPreviewOutput_ = CameraManager::GetInstance()->CreateCustomPreviewOutput(surface, std::stoi(surfaceWidth), std::stoi(surfaceHeight)); if (sPreviewOutput_ == nullptr) { diff --git a/frameworks/js/camera_napi/src/output/video_output_napi.cpp b/frameworks/js/camera_napi/src/output/video_output_napi.cpp index 96e653590..807ab8b80 100644 --- a/frameworks/js/camera_napi/src/output/video_output_napi.cpp +++ b/frameworks/js/camera_napi/src/output/video_output_napi.cpp @@ -339,7 +339,6 @@ napi_value VideoOutputNapi::CreateVideoOutput(napi_env env, uint64_t surfaceId) #else surface->SetUserData(CameraManager::surfaceFormat, std::to_string(OHOS_CAMERA_FORMAT_YCRCB_420_SP)); #endif - CameraManager::GetInstance()->SetPermissionCheck(true); sVideoOutput_ = CameraManager::GetInstance()->CreateVideoOutput(surface); if (sVideoOutput_ == nullptr) { MEDIA_ERR_LOG("failed to create VideoOutput"); diff --git a/frameworks/js/camera_napi/src/session/camera_session_napi.cpp b/frameworks/js/camera_napi/src/session/camera_session_napi.cpp index f931d8f48..69a92cd4a 100644 --- a/frameworks/js/camera_napi/src/session/camera_session_napi.cpp +++ b/frameworks/js/camera_napi/src/session/camera_session_napi.cpp @@ -102,7 +102,6 @@ void CameraSessionNapi::CameraSessionNapiDestructor(napi_env env, void *nativeOb { CameraSessionNapi *cameraObj = reinterpret_cast(nativeObject); if (cameraObj != nullptr) { - CameraManager::GetInstance()->SetPermissionCheck(false); cameraObj->~CameraSessionNapi(); } } @@ -186,7 +185,6 @@ napi_value CameraSessionNapi::CreateCameraSession(napi_env env) status = napi_get_reference_value(env, sConstructor_, &constructor); if (status == napi_ok) { - CameraManager::GetInstance()->SetPermissionCheck(true); sCameraSession_ = CameraManager::GetInstance()->CreateCaptureSession(); if (sCameraSession_ == nullptr) { MEDIA_ERR_LOG("Failed to create Camera session instance"); diff --git a/frameworks/native/camera/BUILD.gn b/frameworks/native/camera/BUILD.gn index 0c2e00957..39d366f08 100644 --- a/frameworks/native/camera/BUILD.gn +++ b/frameworks/native/camera/BUILD.gn @@ -51,7 +51,6 @@ ohos_shared_library("camera_framework") { "//drivers/framework/include/utils", "//drivers/adapter/uhdf2/osal/include", "//drivers/adapter/uhdf2/include/hdi", - "//base/security/access_token/interfaces/innerkits/accesstoken/include", ] deps = [ @@ -61,10 +60,8 @@ ohos_shared_library("camera_framework") { ] external_deps = [ - "access_token:libaccesstoken_sdk", "hiviewdfx_hilog_native:libhilog", "ipc:ipc_core", - "ipc:ipc_single", "safwk:system_ability_fwk", "samgr_standard:samgr_proxy", ] diff --git a/frameworks/native/camera/src/input/camera_manager.cpp b/frameworks/native/camera/src/input/camera_manager.cpp index 6a3240a04..ae72b0726 100644 --- a/frameworks/native/camera/src/input/camera_manager.cpp +++ b/frameworks/native/camera/src/input/camera_manager.cpp @@ -13,16 +13,14 @@ * limitations under the License. */ -#include "input/camera_manager.h" - -#include "accesstoken_kit.h" +#include #include "camera_util.h" -#include "ipc_skeleton.h" #include "iservice_registry.h" #include "media_log.h" #include "system_ability_definition.h" -#include +#include "ipc_skeleton.h" +#include "input/camera_manager.h" using namespace std; namespace OHOS { @@ -398,11 +396,6 @@ sptr CameraManager::GetCameraInfo(std::string cameraId) return cameraObj; } -void CameraManager::SetPermissionCheck(bool Enable) -{ - permissionCheckEnabled_ = Enable; -} - sptr &CameraManager::GetInstance() { if (CameraManager::cameraManager_ == nullptr) { @@ -444,20 +437,6 @@ sptr CameraManager::CreateCameraInput(sptr &camera) sptr cameraInput = nullptr; sptr deviceObj = nullptr; - if (permissionCheckEnabled_) { - MEDIA_DEBUG_LOG("CameraManager::CreateCameraInput: Verifying permission to access the camera"); - Security::AccessToken::AccessTokenID callerToken = IPCSkeleton::GetCallingTokenID(); - std::string permissionName = "ohos.permission.CAMERA"; - - int permission_result = Security::AccessToken::AccessTokenKit::VerifyAccessToken(callerToken, permissionName); - if (permission_result != Security::AccessToken::TypePermissionState::PERMISSION_GRANTED) { - MEDIA_ERR_LOG("CameraManager::CreateCameraInput: Permission to Access Camera Denied!!!!"); - return cameraInput; - } else { - MEDIA_DEBUG_LOG("CameraManager::CreateCameraInput: Permission to Access Camera Granted!!!!"); - } - } - if (camera != nullptr) { deviceObj = CreateCameraDevice(camera->GetID()); if (deviceObj != nullptr) { diff --git a/frameworks/native/camera/test/moduletest/BUILD.gn b/frameworks/native/camera/test/moduletest/BUILD.gn index 5464ce22e..219beace5 100644 --- a/frameworks/native/camera/test/moduletest/BUILD.gn +++ b/frameworks/native/camera/test/moduletest/BUILD.gn @@ -30,6 +30,8 @@ ohos_moduletest("camera_framework_moduletest") { "//drivers/peripheral/camera/interfaces/metadata/include", "//foundation/multimedia/camera_standard/interfaces/inner_api/native/camera/include", "//foundation/multimedia/camera_standard/interfaces/inner_api/native/test", + "//base/security/access_token/interfaces/innerkits/accesstoken/include", + "//base/security/access_token/interfaces/innerkits/token_setproc/include", ] sources = [ @@ -44,7 +46,11 @@ ohos_moduletest("camera_framework_moduletest") { "//foundation/multimedia/camera_standard/services/camera_service:camera_service", ] - external_deps = [ "hiviewdfx_hilog_native:libhilog" ] + external_deps = [ + "access_token:libaccesstoken_sdk", + "access_token:libtoken_setproc", + "hiviewdfx_hilog_native:libhilog", + ] cflags = [ "-fPIC" ] if (device_name == "baltimore") { diff --git a/frameworks/native/camera/test/moduletest/src/camera_framework_moduletest.cpp b/frameworks/native/camera/test/moduletest/src/camera_framework_moduletest.cpp index bb8977e91..0f3106596 100644 --- a/frameworks/native/camera/test/moduletest/src/camera_framework_moduletest.cpp +++ b/frameworks/native/camera/test/moduletest/src/camera_framework_moduletest.cpp @@ -13,14 +13,19 @@ * limitations under the License. */ -#include "camera_framework_moduletest.h" +#include #include "input/camera_input.h" #include "input/camera_manager.h" #include "media_log.h" #include "surface.h" #include "test_common.h" +#include "camera_framework_moduletest.h" -#include +#include "ipc_skeleton.h" +#include "access_token.h" +#include "hap_token_info.h" +#include "accesstoken_kit.h" +#include "token_setproc.h" using namespace testing::ext; @@ -199,6 +204,40 @@ namespace { }; } // namespace +static std::string permissionName = "ohos.permission.CAMERA"; +static OHOS::Security::AccessToken::HapInfoParams g_infoManagerTestInfoParms = { + .userID = 1, + .bundleName = permissionName, + .instIndex = 0, + .appIDDesc = "testtesttesttest" +}; + +static OHOS::Security::AccessToken::PermissionDef g_infoManagerTestPermDef1 = { + .permissionName = "ohos.permission.CAMERA", + .bundleName = "ohos.permission.CAMERA", + .grantMode = 1, + .availableLevel = OHOS::Security::AccessToken::ATokenAplEnum::APL_NORMAL, + .label = "label", + .labelId = 1, + .description = "camera test", + .descriptionId = 1 +}; + +static OHOS::Security::AccessToken::PermissionStateFull g_infoManagerTestState1 = { + .permissionName = "ohos.permission.CAMERA", + .isGeneral = true, + .resDeviceID = {"local"}, + .grantStatus = {OHOS::Security::AccessToken::PermissionState::PERMISSION_GRANTED}, + .grantFlags = {1} +}; + +static OHOS::Security::AccessToken::HapPolicyParams g_infoManagerTestPolicyPrams = { + .apl = OHOS::Security::AccessToken::ATokenAplEnum::APL_NORMAL, + .domain = "test.domain", + .permList = {g_infoManagerTestPermDef1}, + .permStateList = {g_infoManagerTestState1} +}; + sptr CameraFrameworkModuleTest::CreatePhotoOutput(int32_t width, int32_t height) { int32_t fd = -1; @@ -365,8 +404,11 @@ void CameraFrameworkModuleTest::TestCallbacks(sptr &cameraInfo, bool intResult = session_->CommitConfig(); EXPECT_TRUE(intResult == 0); + /* In case of wagner device, once commit config is done with flash on + it is not giving the flash status callback, removing it */ +#ifndef PRODUCT_M40 EXPECT_TRUE(g_camFlashMap.count(cameraInfo->GetID()) != 0); - +#endif EXPECT_TRUE(g_photoEvents.none()); EXPECT_TRUE(g_previewEvents.none()); EXPECT_TRUE(g_videoEvents.none()); @@ -377,7 +419,12 @@ void CameraFrameworkModuleTest::TestCallbacks(sptr &cameraInfo, bool if (photoOutput != nullptr) { EXPECT_TRUE(g_photoEvents[static_cast(CAM_PHOTO_EVENTS::CAM_PHOTO_CAPTURE_START)] == 1); + /* In case of wagner device, frame shutter callback not working, + hence removed. Once supported by hdi, the same needs to be + enabled */ +#ifndef PRODUCT_M40 EXPECT_TRUE(g_photoEvents[static_cast(CAM_PHOTO_EVENTS::CAM_PHOTO_FRAME_SHUTTER)] == 1); +#endif EXPECT_TRUE(g_photoEvents[static_cast(CAM_PHOTO_EVENTS::CAM_PHOTO_CAPTURE_END)] == 1); ((sptr &)photoOutput)->Release(); @@ -530,10 +577,35 @@ void CameraFrameworkModuleTest::SetUpInit() #endif } +OHOS::Security::AccessToken::AccessTokenIDEx tokenIdEx = {0}; + void CameraFrameworkModuleTest::SetUp() { + int32_t ret = -1; + SetUpInit(); + /* Grant the permission so that create camera test can be success */ + tokenIdEx = OHOS::Security::AccessToken::AccessTokenKit::AllocHapToken( + g_infoManagerTestInfoParms, + g_infoManagerTestPolicyPrams); + if (tokenIdEx.tokenIdExStruct.tokenID == 0) { + MEDIA_DEBUG_LOG("Alloc TokenID failure \n"); + return; + } + + (void)SetSelfTokenID(tokenIdEx.tokenIdExStruct.tokenID); + + ret = Security::AccessToken::AccessTokenKit::GrantPermission( + tokenIdEx.tokenIdExStruct.tokenID, + permissionName, OHOS::Security::AccessToken::PERMISSION_USER_FIXED); + if (ret != 0) { + MEDIA_ERR_LOG("GrantPermission( ) failed"); + return; + } else { + MEDIA_DEBUG_LOG("GrantPermission( ) success"); + } + manager_ = CameraManager::GetInstance(); manager_->SetCallback(std::make_shared()); @@ -588,9 +660,12 @@ void CameraFrameworkModuleTest::TearDown() { session_->Release(); input_->Release(); + (void)OHOS::Security::AccessToken::AccessTokenKit::DeleteToken( + tokenIdEx.tokenIdExStruct.tokenID); MEDIA_DEBUG_LOG("End of camera test case"); } +#ifndef PRODUCT_M40 /* * Feature: Framework * Function: Test Capture @@ -620,7 +695,7 @@ HWTEST_F(CameraFrameworkModuleTest, camera_framework_moduletest_001, TestSize.Le EXPECT_TRUE(intResult == 0); sleep(WAIT_TIME_AFTER_CAPTURE); } - +#endif /* * Feature: Framework * Function: Test Capture + Preview diff --git a/frameworks/native/camera/test/unittest/BUILD.gn b/frameworks/native/camera/test/unittest/BUILD.gn index 863650712..f42f79709 100644 --- a/frameworks/native/camera/test/unittest/BUILD.gn +++ b/frameworks/native/camera/test/unittest/BUILD.gn @@ -30,6 +30,8 @@ ohos_unittest("camera_framework_unittest") { "//drivers/peripheral/camera/interfaces/metadata/include", "//foundation/multimedia/camera_standard/interfaces/inner_api/native/camera/include", "//foundation/multimedia/camera_standard/interfaces/inner_api/native/test", + "//base/security/access_token/interfaces/innerkits/accesstoken/include", + "//base/security/access_token/interfaces/innerkits/token_setproc/include", ] sources = [ @@ -47,6 +49,8 @@ ohos_unittest("camera_framework_unittest") { ] external_deps = [ + "access_token:libaccesstoken_sdk", + "access_token:libtoken_setproc", "hiviewdfx_hilog_native:libhilog", "safwk:system_ability_fwk", ] diff --git a/frameworks/native/camera/test/unittest/src/camera_framework_unittest.cpp b/frameworks/native/camera/test/unittest/src/camera_framework_unittest.cpp index b4b56b2a5..55253adaa 100644 --- a/frameworks/native/camera/test/unittest/src/camera_framework_unittest.cpp +++ b/frameworks/native/camera/test/unittest/src/camera_framework_unittest.cpp @@ -20,6 +20,12 @@ #include "surface.h" #include "test_common.h" +#include "ipc_skeleton.h" +#include "access_token.h" +#include "hap_token_info.h" +#include "accesstoken_kit.h" +#include "token_setproc.h" + using namespace testing::ext; using ::testing::A; using ::testing::InSequence; @@ -183,8 +189,69 @@ sptr CameraFrameworkUnitTest::CreateVideoOutput(int32_t width, in return cameraManager->CreateVideoOutput(surface); } -void CameraFrameworkUnitTest::SetUpTestCase(void) {} -void CameraFrameworkUnitTest::TearDownTestCase(void) {} +static std::string permissionName = "ohos.permission.CAMERA"; +static OHOS::Security::AccessToken::HapInfoParams g_infoManagerTestInfoParms = { + .userID = 1, + .bundleName = permissionName, + .instIndex = 0, + .appIDDesc = "testtesttesttest" +}; + +static OHOS::Security::AccessToken::PermissionDef g_infoManagerTestPermDef1 = { + .permissionName = "ohos.permission.CAMERA", + .bundleName = "ohos.permission.CAMERA", + .grantMode = 1, + .availableLevel = OHOS::Security::AccessToken::ATokenAplEnum::APL_NORMAL, + .label = "label", + .labelId = 1, + .description = "camera test", + .descriptionId = 1 +}; + +static OHOS::Security::AccessToken::PermissionStateFull g_infoManagerTestState1 = { + .permissionName = "ohos.permission.CAMERA", + .isGeneral = true, + .resDeviceID = {"local"}, + .grantStatus = {OHOS::Security::AccessToken::PermissionState::PERMISSION_GRANTED}, + .grantFlags = {1} +}; + +static OHOS::Security::AccessToken::HapPolicyParams g_infoManagerTestPolicyPrams = { + .apl = OHOS::Security::AccessToken::ATokenAplEnum::APL_NORMAL, + .domain = "test.domain", + .permList = {g_infoManagerTestPermDef1}, + .permStateList = {g_infoManagerTestState1} +}; + +OHOS::Security::AccessToken::AccessTokenIDEx tokenIdEx = {0}; + +void CameraFrameworkUnitTest::SetUpTestCase(void) +{ + int32_t ret = -1; + + /* Grant the permission so that create camera test can be success */ + tokenIdEx = OHOS::Security::AccessToken::AccessTokenKit::AllocHapToken( + g_infoManagerTestInfoParms, + g_infoManagerTestPolicyPrams); + if (tokenIdEx.tokenIdExStruct.tokenID == 0) { + return; + } + + (void)SetSelfTokenID(tokenIdEx.tokenIdExStruct.tokenID); + + ret = Security::AccessToken::AccessTokenKit::GrantPermission( + tokenIdEx.tokenIdExStruct.tokenID, + permissionName, OHOS::Security::AccessToken::PERMISSION_USER_FIXED); + if (ret != 0) { + return; + } +} + +void CameraFrameworkUnitTest::TearDownTestCase(void) +{ + (void)OHOS::Security::AccessToken::AccessTokenKit::DeleteToken( + tokenIdEx.tokenIdExStruct.tokenID); +} void CameraFrameworkUnitTest::SetUp() { diff --git a/interfaces/inner_api/native/camera/include/input/camera_manager.h b/interfaces/inner_api/native/camera/include/input/camera_manager.h index 5eccc57ea..26e4912c8 100644 --- a/interfaces/inner_api/native/camera/include/input/camera_manager.h +++ b/interfaces/inner_api/native/camera/include/input/camera_manager.h @@ -77,7 +77,6 @@ public: sptr GetCameraInfo(std::string cameraId); static const std::string surfaceFormat; - void SetPermissionCheck(bool Enable); protected: CameraManager(sptr serviceProxy) : serviceProxy_(serviceProxy) {} @@ -97,7 +96,6 @@ private: sptr cameraSvcCallback_; std::shared_ptr cameraMngrCallback_; std::vector> cameraObjList; - bool permissionCheckEnabled_ = false; }; } // namespace CameraStandard } // namespace OHOS diff --git a/interfaces/inner_api/native/test/BUILD.gn b/interfaces/inner_api/native/test/BUILD.gn index f6779587f..c653672e3 100644 --- a/interfaces/inner_api/native/test/BUILD.gn +++ b/interfaces/inner_api/native/test/BUILD.gn @@ -28,6 +28,8 @@ config("camera_config") { "//drivers/adapter/uhdf2/osal/include", "//drivers/adapter/uhdf2/include/hdi", "//drivers/peripheral/display/interfaces/include", + "//base/security/access_token/interfaces/innerkits/accesstoken/include", + "//base/security/access_token/interfaces/innerkits/token_setproc/include", ] if (device_name == "baltimore") { @@ -70,8 +72,11 @@ ohos_executable("camera_video") { ] external_deps = [ + "access_token:libaccesstoken_sdk", + "access_token:libtoken_setproc", "hiviewdfx_hilog_native:libhilog", "ipc:ipc_core", + "ipc:ipc_single", "multimedia_media_standard:media_client", ] part_name = "multimedia_camera_standard" @@ -98,6 +103,8 @@ ohos_executable("camera_capture") { ] external_deps = [ + "access_token:libaccesstoken_sdk", + "access_token:libtoken_setproc", "hiviewdfx_hilog_native:libhilog", "ipc:ipc_core", ] @@ -125,6 +132,8 @@ ohos_executable("camera_capture_video") { ] external_deps = [ + "access_token:libaccesstoken_sdk", + "access_token:libtoken_setproc", "hiviewdfx_hilog_native:libhilog", "ipc:ipc_core", ] diff --git a/interfaces/inner_api/native/test/camera_capture.cpp b/interfaces/inner_api/native/test/camera_capture.cpp index f4db10035..b04e30433 100644 --- a/interfaces/inner_api/native/test/camera_capture.cpp +++ b/interfaces/inner_api/native/test/camera_capture.cpp @@ -21,11 +21,49 @@ #include "surface.h" #include "test_common.h" +#include "ipc_skeleton.h" +#include "access_token.h" +#include "hap_token_info.h" +#include "accesstoken_kit.h" +#include "token_setproc.h" + using namespace std; using namespace OHOS; using namespace OHOS::CameraStandard; +static std::string permissionName = "ohos.permission.CAMERA"; +static OHOS::Security::AccessToken::HapInfoParams g_infoManagerTestInfoParms = { + .userID = 1, + .bundleName = permissionName, + .instIndex = 0, + .appIDDesc = "testtesttesttest" +}; + +static OHOS::Security::AccessToken::PermissionDef g_infoManagerTestPermDef1 = { + .permissionName = "ohos.permission.CAMERA", + .bundleName = "ohos.permission.CAMERA", + .grantMode = 1, + .availableLevel = OHOS::Security::AccessToken::ATokenAplEnum::APL_NORMAL, + .label = "label", + .labelId = 1, + .description = "camera test", + .descriptionId = 1 +}; + +static OHOS::Security::AccessToken::PermissionStateFull g_infoManagerTestState1 = { + .permissionName = "ohos.permission.CAMERA", + .isGeneral = true, + .resDeviceID = {"local"}, + .grantStatus = {OHOS::Security::AccessToken::PermissionState::PERMISSION_GRANTED}, + .grantFlags = {1} +}; +static OHOS::Security::AccessToken::HapPolicyParams g_infoManagerTestPolicyPrams = { + .apl = OHOS::Security::AccessToken::ATokenAplEnum::APL_NORMAL, + .domain = "test.domain", + .permList = {g_infoManagerTestPermDef1}, + .permStateList = {g_infoManagerTestState1} +}; int main(int argc, char **argv) { @@ -78,12 +116,38 @@ int main(int argc, char **argv) return 0; } + /* Grant the permission so that create camera test can be success */ + OHOS::Security::AccessToken::AccessTokenIDEx tokenIdEx = {0}; + tokenIdEx = OHOS::Security::AccessToken::AccessTokenKit::AllocHapToken( + g_infoManagerTestInfoParms, + g_infoManagerTestPolicyPrams); + if (tokenIdEx.tokenIdExStruct.tokenID == 0) { + MEDIA_DEBUG_LOG("Alloc TokenID failure \n"); + return 0; + } + + (void)SetSelfTokenID(tokenIdEx.tokenIdExStruct.tokenID); + + ret = Security::AccessToken::AccessTokenKit::GrantPermission( + tokenIdEx.tokenIdExStruct.tokenID, + permissionName, OHOS::Security::AccessToken::PERMISSION_USER_FIXED); + if (ret != 0) { + MEDIA_ERR_LOG("GrantPermission( ) failed"); + (void)OHOS::Security::AccessToken::AccessTokenKit::DeleteToken( + tokenIdEx.tokenIdExStruct.tokenID); + return 0; + } else { + MEDIA_DEBUG_LOG("GrantPermission( ) success"); + } + sptr camManagerObj = CameraManager::GetInstance(); MEDIA_DEBUG_LOG("Setting callback to listen camera status and flash status"); camManagerObj->SetCallback(std::make_shared(testName)); std::vector> cameraObjList = camManagerObj->GetCameras(); if (cameraObjList.size() == 0) { MEDIA_DEBUG_LOG("No camera devices"); + (void)OHOS::Security::AccessToken::AccessTokenKit::DeleteToken( + tokenIdEx.tokenIdExStruct.tokenID); return 0; } @@ -95,6 +159,8 @@ int main(int argc, char **argv) sptr captureSession = camManagerObj->CreateCaptureSession(); if (captureSession == nullptr) { MEDIA_DEBUG_LOG("Failed to create capture session"); + (void)OHOS::Security::AccessToken::AccessTokenKit::DeleteToken( + tokenIdEx.tokenIdExStruct.tokenID); return 0; } @@ -103,6 +169,8 @@ int main(int argc, char **argv) sptr captureInput = camManagerObj->CreateCameraInput(cameraObjList[0]); if (captureInput == nullptr) { MEDIA_DEBUG_LOG("Failed to create camera input"); + (void)OHOS::Security::AccessToken::AccessTokenKit::DeleteToken( + tokenIdEx.tokenIdExStruct.tokenID); return 0; } @@ -162,12 +230,16 @@ int main(int argc, char **argv) ret = captureSession->AddInput(captureInput); if (ret != 0) { MEDIA_DEBUG_LOG("Add input to session is failed, ret: %{public}d", ret); + (void)OHOS::Security::AccessToken::AccessTokenKit::DeleteToken( + tokenIdEx.tokenIdExStruct.tokenID); return 0; } sptr photoSurface = Surface::CreateSurfaceAsConsumer(); if (photoSurface == nullptr) { MEDIA_DEBUG_LOG("Failed to create photoSurface"); + (void)OHOS::Security::AccessToken::AccessTokenKit::DeleteToken( + tokenIdEx.tokenIdExStruct.tokenID); return 0; } photoSurface->SetDefaultWidthAndHeight(photoWidth, photoHeight); @@ -177,6 +249,8 @@ int main(int argc, char **argv) sptr photoOutput = camManagerObj->CreatePhotoOutput(photoSurface); if (photoOutput == nullptr) { MEDIA_DEBUG_LOG("Failed to create PhotoOutput"); + (void)OHOS::Security::AccessToken::AccessTokenKit::DeleteToken( + tokenIdEx.tokenIdExStruct.tokenID); return 0; } @@ -185,12 +259,16 @@ int main(int argc, char **argv) ret = captureSession->AddOutput(photoOutput); if (ret != 0) { MEDIA_DEBUG_LOG("Failed to Add output to session, ret: %{public}d", ret); + (void)OHOS::Security::AccessToken::AccessTokenKit::DeleteToken( + tokenIdEx.tokenIdExStruct.tokenID); return 0; } sptr previewSurface = Surface::CreateSurfaceAsConsumer(); if (previewSurface == nullptr) { MEDIA_DEBUG_LOG("Failed to create previewSurface"); + (void)OHOS::Security::AccessToken::AccessTokenKit::DeleteToken( + tokenIdEx.tokenIdExStruct.tokenID); return 0; } previewSurface->SetDefaultWidthAndHeight(previewWidth, previewHeight); @@ -201,6 +279,8 @@ int main(int argc, char **argv) previewHeight); if (previewOutput == nullptr) { MEDIA_DEBUG_LOG("Failed to create previewOutput"); + (void)OHOS::Security::AccessToken::AccessTokenKit::DeleteToken( + tokenIdEx.tokenIdExStruct.tokenID); return 0; } @@ -209,18 +289,24 @@ int main(int argc, char **argv) ret = captureSession->AddOutput(previewOutput); if (ret != 0) { MEDIA_DEBUG_LOG("Failed to Add output to session, ret: %{public}d", ret); + (void)OHOS::Security::AccessToken::AccessTokenKit::DeleteToken( + tokenIdEx.tokenIdExStruct.tokenID); return 0; } ret = captureSession->CommitConfig(); if (ret != 0) { MEDIA_DEBUG_LOG("Failed to commit session config, ret: %{public}d", ret); + (void)OHOS::Security::AccessToken::AccessTokenKit::DeleteToken( + tokenIdEx.tokenIdExStruct.tokenID); return 0; } ret = captureSession->Start(); if (ret != 0) { MEDIA_DEBUG_LOG("Failed to start session, ret: %{public}d", ret); + (void)OHOS::Security::AccessToken::AccessTokenKit::DeleteToken( + tokenIdEx.tokenIdExStruct.tokenID); return 0; } @@ -231,6 +317,8 @@ int main(int argc, char **argv) ret = ((sptr &)photoOutput)->Capture(); if (ret != 0) { MEDIA_DEBUG_LOG("Failed to capture, ret: %{public}d", ret); + (void)OHOS::Security::AccessToken::AccessTokenKit::DeleteToken( + tokenIdEx.tokenIdExStruct.tokenID); return 0; } sleep(gapAfterCapture); @@ -241,6 +329,9 @@ int main(int argc, char **argv) captureSession->Release(); cameraInput->Release(); camManagerObj->SetCallback(nullptr); + (void)OHOS::Security::AccessToken::AccessTokenKit::DeleteToken( + tokenIdEx.tokenIdExStruct.tokenID); + MEDIA_DEBUG_LOG("Deleted the allocated Token"); MEDIA_DEBUG_LOG("Camera new sample end."); return 0; diff --git a/interfaces/inner_api/native/test/camera_capture_video.cpp b/interfaces/inner_api/native/test/camera_capture_video.cpp index a46819348..0727d538a 100644 --- a/interfaces/inner_api/native/test/camera_capture_video.cpp +++ b/interfaces/inner_api/native/test/camera_capture_video.cpp @@ -20,9 +20,50 @@ #include "media_log.h" #include "test_common.h" +#include "ipc_skeleton.h" +#include "access_token.h" +#include "hap_token_info.h" +#include "accesstoken_kit.h" +#include "token_setproc.h" + using namespace OHOS; using namespace OHOS::CameraStandard; +static std::string permissionName = "ohos.permission.CAMERA"; +static OHOS::Security::AccessToken::HapInfoParams g_infoManagerTestInfoParms = { + .userID = 1, + .bundleName = permissionName, + .instIndex = 0, + .appIDDesc = "testtesttesttest" +}; + +static OHOS::Security::AccessToken::PermissionDef g_infoManagerTestPermDef1 = { + .permissionName = "ohos.permission.CAMERA", + .bundleName = "ohos.permission.CAMERA", + .grantMode = 1, + .availableLevel = OHOS::Security::AccessToken::ATokenAplEnum::APL_NORMAL, + .label = "label", + .labelId = 1, + .description = "camera test", + .descriptionId = 1 +}; + +static OHOS::Security::AccessToken::PermissionStateFull g_infoManagerTestState1 = { + .permissionName = "ohos.permission.CAMERA", + .isGeneral = true, + .resDeviceID = {"local"}, + .grantStatus = {OHOS::Security::AccessToken::PermissionState::PERMISSION_GRANTED}, + .grantFlags = {1} +}; + +static OHOS::Security::AccessToken::HapPolicyParams g_infoManagerTestPolicyPrams = { + .apl = OHOS::Security::AccessToken::ATokenAplEnum::APL_NORMAL, + .domain = "test.domain", + .permList = {g_infoManagerTestPermDef1}, + .permStateList = {g_infoManagerTestState1} +}; + +static OHOS::Security::AccessToken::AccessTokenIDEx tokenIdEx = {0}; static void PhotoModeUsage(FILE *fp) { @@ -175,6 +216,9 @@ static void DisplayMenu(std::shared_ptr testObj) case 'q': testObj->Release(); + (void)OHOS::Security::AccessToken::AccessTokenKit::DeleteToken( + tokenIdEx.tokenIdExStruct.tokenID); + MEDIA_DEBUG_LOG("Deleted the allocated Token"); exit(EXIT_SUCCESS); default: @@ -212,12 +256,16 @@ int32_t CameraCaptureVideo::TakePhoto() if (!photoOutput_) { MEDIA_ERR_LOG("photoOutput_ is null"); + (void)OHOS::Security::AccessToken::AccessTokenKit::DeleteToken( + tokenIdEx.tokenIdExStruct.tokenID); return result; } result = ((sptr &)photoOutput_)->Capture(); if (result != CAMERA_OK) { MEDIA_ERR_LOG("Failed to capture, result: %{public}d", result); + (void)OHOS::Security::AccessToken::AccessTokenKit::DeleteToken( + tokenIdEx.tokenIdExStruct.tokenID); return result; } sleep(GAP_AFTER_CAPTURE); @@ -230,18 +278,24 @@ int32_t CameraCaptureVideo::RecordVideo() if (!videoOutput_) { MEDIA_ERR_LOG("videoOutput_ is null"); + (void)OHOS::Security::AccessToken::AccessTokenKit::DeleteToken( + tokenIdEx.tokenIdExStruct.tokenID); return result; } result = ((sptr &)videoOutput_)->Start(); if (result != CAMERA_OK) { MEDIA_ERR_LOG("Failed to start recording, result: %{public}d", result); + (void)OHOS::Security::AccessToken::AccessTokenKit::DeleteToken( + tokenIdEx.tokenIdExStruct.tokenID); return result; } sleep(VIDEO_CAPTURE_DURATION); result = ((sptr &)videoOutput_)->Stop(); if (result != CAMERA_OK) { MEDIA_ERR_LOG("Failed to stop recording, result: %{public}d", result); + (void)OHOS::Security::AccessToken::AccessTokenKit::DeleteToken( + tokenIdEx.tokenIdExStruct.tokenID); return result; } sleep(GAP_AFTER_CAPTURE); @@ -286,6 +340,27 @@ int32_t CameraCaptureVideo::InitCameraManager() int32_t result = -1; if (cameraManager_ == nullptr) { + /* Grant the permission so that create camera test can be success */ + tokenIdEx = OHOS::Security::AccessToken::AccessTokenKit::AllocHapToken( + g_infoManagerTestInfoParms, + g_infoManagerTestPolicyPrams); + if (tokenIdEx.tokenIdExStruct.tokenID == 0) { + MEDIA_DEBUG_LOG("Alloc TokenID failure \n"); + return 0; + } + + (void)SetSelfTokenID(tokenIdEx.tokenIdExStruct.tokenID); + + result = Security::AccessToken::AccessTokenKit::GrantPermission( + tokenIdEx.tokenIdExStruct.tokenID, + permissionName, OHOS::Security::AccessToken::PERMISSION_USER_FIXED); + if (result != 0) { + MEDIA_ERR_LOG("GrantPermission( ) failed"); + return 0; + } else { + MEDIA_DEBUG_LOG("GrantPermission( ) success"); + } + cameraManager_ = CameraManager::GetInstance(); if (cameraManager_ == nullptr) { MEDIA_ERR_LOG("Failed to get camera manager!"); @@ -531,41 +606,59 @@ int32_t CameraCaptureVideo::StartPreview() result = InitCameraManager(); if (result != CAMERA_OK) { + (void)OHOS::Security::AccessToken::AccessTokenKit::DeleteToken( + tokenIdEx.tokenIdExStruct.tokenID); return result; } result = InitCameraInput(); if (result != CAMERA_OK) { + (void)OHOS::Security::AccessToken::AccessTokenKit::DeleteToken( + tokenIdEx.tokenIdExStruct.tokenID); return result; } captureSession_ = cameraManager_->CreateCaptureSession(); if (captureSession_ == nullptr) { + (void)OHOS::Security::AccessToken::AccessTokenKit::DeleteToken( + tokenIdEx.tokenIdExStruct.tokenID); return result; } captureSession_->BeginConfig(); result = captureSession_->AddInput(cameraInput_); if (CAMERA_OK != result) { + (void)OHOS::Security::AccessToken::AccessTokenKit::DeleteToken( + tokenIdEx.tokenIdExStruct.tokenID); return result; } result = AddOutputbyState(); if (result != CAMERA_OK) { + (void)OHOS::Security::AccessToken::AccessTokenKit::DeleteToken( + tokenIdEx.tokenIdExStruct.tokenID); return result; } result = InitPreviewOutput(); if (result != CAMERA_OK) { + (void)OHOS::Security::AccessToken::AccessTokenKit::DeleteToken( + tokenIdEx.tokenIdExStruct.tokenID); return result; } result = captureSession_->AddOutput(previewOutput_); if (CAMERA_OK != result) { + (void)OHOS::Security::AccessToken::AccessTokenKit::DeleteToken( + tokenIdEx.tokenIdExStruct.tokenID); return result; } result = captureSession_->CommitConfig(); if (CAMERA_OK != result) { MEDIA_ERR_LOG("Failed to Commit config"); + (void)OHOS::Security::AccessToken::AccessTokenKit::DeleteToken( + tokenIdEx.tokenIdExStruct.tokenID); return result; } result = captureSession_->Start(); MEDIA_DEBUG_LOG("Preview started, result: %{public}d", result); if (CAMERA_OK != result) { + (void)OHOS::Security::AccessToken::AccessTokenKit::DeleteToken( + tokenIdEx.tokenIdExStruct.tokenID); } return result; } diff --git a/interfaces/inner_api/native/test/camera_video.cpp b/interfaces/inner_api/native/test/camera_video.cpp index 8470bbc52..b19921cb5 100644 --- a/interfaces/inner_api/native/test/camera_video.cpp +++ b/interfaces/inner_api/native/test/camera_video.cpp @@ -22,6 +22,11 @@ #include "surface.h" #include "test_common.h" +#include "ipc_skeleton.h" +#include "access_token.h" +#include "hap_token_info.h" +#include "accesstoken_kit.h" +#include "token_setproc.h" using namespace std; using namespace OHOS; @@ -161,6 +166,40 @@ namespace { } } +static std::string permissionName = "ohos.permission.CAMERA"; +static OHOS::Security::AccessToken::HapInfoParams g_infoManagerTestInfoParms = { + .userID = 1, + .bundleName = permissionName, + .instIndex = 0, + .appIDDesc = "testtesttesttest" +}; + +static OHOS::Security::AccessToken::PermissionDef g_infoManagerTestPermDef1 = { + .permissionName = "ohos.permission.CAMERA", + .bundleName = "ohos.permission.CAMERA", + .grantMode = 1, + .availableLevel = OHOS::Security::AccessToken::ATokenAplEnum::APL_NORMAL, + .label = "label", + .labelId = 1, + .description = "camera test", + .descriptionId = 1 +}; + +static OHOS::Security::AccessToken::PermissionStateFull g_infoManagerTestState1 = { + .permissionName = "ohos.permission.CAMERA", + .isGeneral = true, + .resDeviceID = {"local"}, + .grantStatus = {OHOS::Security::AccessToken::PermissionState::PERMISSION_GRANTED}, + .grantFlags = {1} +}; + +static OHOS::Security::AccessToken::HapPolicyParams g_infoManagerTestPolicyPrams = { + .apl = OHOS::Security::AccessToken::ATokenAplEnum::APL_NORMAL, + .domain = "test.domain", + .permList = {g_infoManagerTestPermDef1}, + .permStateList = {g_infoManagerTestState1} +}; + int main(int argc, char **argv) { const int32_t previewFormatIndex = 1; @@ -209,12 +248,38 @@ int main(int argc, char **argv) return 0; } + /* Grant the permission so that create camera test can be success */ + OHOS::Security::AccessToken::AccessTokenIDEx tokenIdEx = {0}; + tokenIdEx = OHOS::Security::AccessToken::AccessTokenKit::AllocHapToken( + g_infoManagerTestInfoParms, + g_infoManagerTestPolicyPrams); + if (tokenIdEx.tokenIdExStruct.tokenID == 0) { + MEDIA_DEBUG_LOG("Alloc TokenID failure \n"); + return 0; + } + + (void)SetSelfTokenID(tokenIdEx.tokenIdExStruct.tokenID); + + ret = Security::AccessToken::AccessTokenKit::GrantPermission( + tokenIdEx.tokenIdExStruct.tokenID, + permissionName, OHOS::Security::AccessToken::PERMISSION_USER_FIXED); + if (ret != 0) { + MEDIA_ERR_LOG("GrantPermission( ) failed"); + (void)OHOS::Security::AccessToken::AccessTokenKit::DeleteToken( + tokenIdEx.tokenIdExStruct.tokenID); + return 0; + } else { + MEDIA_DEBUG_LOG("GrantPermission( ) success"); + } + sptr camManagerObj = CameraManager::GetInstance(); MEDIA_DEBUG_LOG("Setting callback to listen camera status and flash status"); camManagerObj->SetCallback(std::make_shared(testName)); std::vector> cameraObjList = camManagerObj->GetCameras(); if (cameraObjList.size() == 0) { MEDIA_DEBUG_LOG("No camera devices"); + (void)OHOS::Security::AccessToken::AccessTokenKit::DeleteToken( + tokenIdEx.tokenIdExStruct.tokenID); return 0; } @@ -226,6 +291,8 @@ int main(int argc, char **argv) sptr captureSession = camManagerObj->CreateCaptureSession(); if (captureSession == nullptr) { MEDIA_DEBUG_LOG("Failed to create capture session"); + (void)OHOS::Security::AccessToken::AccessTokenKit::DeleteToken( + tokenIdEx.tokenIdExStruct.tokenID); return 0; } @@ -234,6 +301,8 @@ int main(int argc, char **argv) sptr captureInput = camManagerObj->CreateCameraInput(cameraObjList[0]); if (captureInput == nullptr) { MEDIA_DEBUG_LOG("Failed to create camera input"); + (void)OHOS::Security::AccessToken::AccessTokenKit::DeleteToken( + tokenIdEx.tokenIdExStruct.tokenID); return 0; } @@ -296,6 +365,8 @@ int main(int argc, char **argv) ret = captureSession->AddInput(captureInput); if (ret != 0) { MEDIA_DEBUG_LOG("Add input to session is failed, ret: %{public}d", ret); + (void)OHOS::Security::AccessToken::AccessTokenKit::DeleteToken( + tokenIdEx.tokenIdExStruct.tokenID); return 0; } @@ -308,6 +379,8 @@ int main(int argc, char **argv) sptr previewOutput = camManagerObj->CreatePreviewOutput(previewSurface); if (previewOutput == nullptr) { MEDIA_DEBUG_LOG("Failed to create preview output"); + (void)OHOS::Security::AccessToken::AccessTokenKit::DeleteToken( + tokenIdEx.tokenIdExStruct.tokenID); return 0; } @@ -316,6 +389,8 @@ int main(int argc, char **argv) ret = captureSession->AddOutput(previewOutput); if (ret != 0) { MEDIA_DEBUG_LOG("Failed to Add output to session, ret: %{public}d", ret); + (void)OHOS::Security::AccessToken::AccessTokenKit::DeleteToken( + tokenIdEx.tokenIdExStruct.tokenID); return 0; } @@ -325,17 +400,23 @@ int main(int argc, char **argv) int32_t videoSourceId = 0; if (!CreateAndConfigureRecorder(recorder, videoSourceId, videoWidth, videoHeight)) { MEDIA_DEBUG_LOG("Failed to create and configure recorder"); + (void)OHOS::Security::AccessToken::AccessTokenKit::DeleteToken( + tokenIdEx.tokenIdExStruct.tokenID); return 0; } if (recorder->Prepare()) { MEDIA_DEBUG_LOG("Failed to prepare recorder"); + (void)OHOS::Security::AccessToken::AccessTokenKit::DeleteToken( + tokenIdEx.tokenIdExStruct.tokenID); return 0; } videoSurface = recorder->GetSurface(videoSourceId); if (videoSurface == nullptr) { MEDIA_DEBUG_LOG("Failed to get surface from recorder"); + (void)OHOS::Security::AccessToken::AccessTokenKit::DeleteToken( + tokenIdEx.tokenIdExStruct.tokenID); return 0; } videoSurface->SetUserData(CameraManager::surfaceFormat, std::to_string(videoFormat)); @@ -350,6 +431,8 @@ int main(int argc, char **argv) sptr videoOutput = camManagerObj->CreateVideoOutput(videoSurface); if (videoOutput == nullptr) { MEDIA_DEBUG_LOG("Failed to create video output"); + (void)OHOS::Security::AccessToken::AccessTokenKit::DeleteToken( + tokenIdEx.tokenIdExStruct.tokenID); return 0; } @@ -358,18 +441,24 @@ int main(int argc, char **argv) ret = captureSession->AddOutput(videoOutput); if (ret != 0) { MEDIA_DEBUG_LOG("Failed to Add output to session, ret: %{public}d", ret); + (void)OHOS::Security::AccessToken::AccessTokenKit::DeleteToken( + tokenIdEx.tokenIdExStruct.tokenID); return 0; } ret = captureSession->CommitConfig(); if (ret != 0) { MEDIA_DEBUG_LOG("Failed to commit session config, ret: %{public}d", ret); + (void)OHOS::Security::AccessToken::AccessTokenKit::DeleteToken( + tokenIdEx.tokenIdExStruct.tokenID); return 0; } ret = captureSession->Start(); if (ret != 0) { MEDIA_DEBUG_LOG("Failed to start session, ret: %{public}d", ret); + (void)OHOS::Security::AccessToken::AccessTokenKit::DeleteToken( + tokenIdEx.tokenIdExStruct.tokenID); return 0; } @@ -380,6 +469,8 @@ int main(int argc, char **argv) ret = ((sptr &)videoOutput)->Start(); if (ret != 0) { MEDIA_DEBUG_LOG("Failed to start video output, ret: %{public}d", ret); + (void)OHOS::Security::AccessToken::AccessTokenKit::DeleteToken( + tokenIdEx.tokenIdExStruct.tokenID); return 0; } @@ -388,6 +479,8 @@ int main(int argc, char **argv) if (ret != 0) { MEDIA_DEBUG_LOG("Failed to start recorder, return: %{public}s", OHOS::Media::MSErrorToString(static_cast(ret)).c_str()); + (void)OHOS::Security::AccessToken::AccessTokenKit::DeleteToken( + tokenIdEx.tokenIdExStruct.tokenID); return 0; } } @@ -398,6 +491,8 @@ int main(int argc, char **argv) ret = ((sptr &)videoOutput)->Pause(); if (ret != 0) { MEDIA_DEBUG_LOG("Failed to pause video output, ret: %{public}d", ret); + (void)OHOS::Security::AccessToken::AccessTokenKit::DeleteToken( + tokenIdEx.tokenIdExStruct.tokenID); return 0; } @@ -413,6 +508,8 @@ int main(int argc, char **argv) ret = ((sptr &)videoOutput)->Resume(); if (ret != 0) { MEDIA_DEBUG_LOG("Failed to resume video output, ret: %{public}d", ret); + (void)OHOS::Security::AccessToken::AccessTokenKit::DeleteToken( + tokenIdEx.tokenIdExStruct.tokenID); return 0; } @@ -429,6 +526,8 @@ int main(int argc, char **argv) ret = ((sptr &)videoOutput)->Stop(); if (ret != 0) { MEDIA_DEBUG_LOG("Failed to stop video output, ret: %{public}d", ret); + (void)OHOS::Security::AccessToken::AccessTokenKit::DeleteToken( + tokenIdEx.tokenIdExStruct.tokenID); return 0; } @@ -456,6 +555,8 @@ int main(int argc, char **argv) ret = captureSession->Stop(); if (ret != 0) { MEDIA_DEBUG_LOG("Failed to stop session, ret: %{public}d", ret); + (void)OHOS::Security::AccessToken::AccessTokenKit::DeleteToken( + tokenIdEx.tokenIdExStruct.tokenID); return 0; } @@ -466,6 +567,9 @@ int main(int argc, char **argv) TestUtils::SaveVideoFile(nullptr, 0, VideoSaveMode::CLOSE, g_videoFd); cameraInput->Release(); camManagerObj->SetCallback(nullptr); + (void)OHOS::Security::AccessToken::AccessTokenKit::DeleteToken( + tokenIdEx.tokenIdExStruct.tokenID); + MEDIA_DEBUG_LOG("Deleted the allocated Token"); MEDIA_DEBUG_LOG("Camera new sample end."); return 0; diff --git a/services/camera_service/BUILD.gn b/services/camera_service/BUILD.gn index c6ac0de42..e1b77c346 100644 --- a/services/camera_service/BUILD.gn +++ b/services/camera_service/BUILD.gn @@ -58,6 +58,7 @@ ohos_shared_library("camera_service") { "//foundation/multimedia/camera_standard/services/camera_service/binder/client/include", "//foundation/multimedia/camera_standard/services/camera_service/binder/server/include", "//foundation/multimedia/camera_standard/interfaces/inner_api/native/camera/include", + "//base/security/access_token/interfaces/innerkits/accesstoken/include", ] if (target_cpu == "arm") { @@ -71,6 +72,7 @@ ohos_shared_library("camera_service") { ] external_deps = [ + "access_token:libaccesstoken_sdk", "hiviewdfx_hilog_native:libhilog", "ipc:ipc_core", "ipc:ipc_single", diff --git a/services/camera_service/src/hcamera_service.cpp b/services/camera_service/src/hcamera_service.cpp index 00eefaeaa..a13fd3d83 100644 --- a/services/camera_service/src/hcamera_service.cpp +++ b/services/camera_service/src/hcamera_service.cpp @@ -18,6 +18,8 @@ #include #include +#include "access_token.h" +#include "accesstoken_kit.h" #include "camera_util.h" #include "iservice_registry.h" #include "media_log.h" @@ -97,6 +99,30 @@ int32_t HCameraService::CreateCameraDevice(std::string cameraId, sptr cameraDevice; + OHOS::Security::AccessToken::AccessTokenID callerToken = IPCSkeleton::GetCallingTokenID(); + std::string permissionName = "ohos.permission.CAMERA"; + + int permission_result + = OHOS::Security::AccessToken::TypePermissionState::PERMISSION_DENIED; + if (OHOS::Security::AccessToken::AccessTokenKit::GetTokenTypeFlag(callerToken) + == OHOS::Security::AccessToken::ATokenTypeEnum::TOKEN_NATIVE) { + permission_result = OHOS::Security::AccessToken::AccessTokenKit::VerifyNativeToken(callerToken, + permissionName); + } else if (OHOS::Security::AccessToken::AccessTokenKit::GetTokenTypeFlag(callerToken) + == OHOS::Security::AccessToken::ATokenTypeEnum::TOKEN_HAP) { + permission_result = OHOS::Security::AccessToken::AccessTokenKit::VerifyAccessToken(callerToken, + permissionName); + } else { + MEDIA_ERR_LOG("HCameraService::CreateCameraDevice: Unsupported Access Token Type"); + return CAMERA_INVALID_ARG; + } + if (permission_result != OHOS::Security::AccessToken::TypePermissionState::PERMISSION_GRANTED) { + MEDIA_ERR_LOG("HCameraService::CreateCameraDevice: Permission to Access Camera Denied!!!!"); + return CAMERA_ALLOC_ERROR; + } else { + MEDIA_DEBUG_LOG("HCameraService::CreateCameraDevice: Permission to Access Camera Granted!!!!"); + } + if (cameraDeviceCallback_ == nullptr) { cameraDeviceCallback_ = new CameraDeviceCallback(); } -- Gitee