diff --git a/frameworks/js/napi/accesstoken/src/napi_request_permission.cpp b/frameworks/js/napi/accesstoken/src/napi_request_permission.cpp index 81f65d718..37a96aa45 100644 --- a/frameworks/js/napi/accesstoken/src/napi_request_permission.cpp +++ b/frameworks/js/napi/accesstoken/src/napi_request_permission.cpp @@ -858,7 +858,8 @@ void NapiRequestPermission::GetPermissionsStatusExecute(napi_env env, void* data LOGD(ATM_DOMAIN, ATM_TAG, "PermList size: %{public}zu, asyncContext->permissionList size: %{public}zu.", permList.size(), asyncContext->permissionList.size()); - asyncContext->result.errorCode = AccessTokenKit::GetPermissionsStatus(asyncContext->tokenId, permList); + asyncContext->SetErrorCode(AccessTokenKit::GetPermissionsStatus(asyncContext->tokenId, permList)); + for (const auto& permState : permList) { LOGD(ATM_DOMAIN, ATM_TAG, "Permission: %{public}s", permState.permissionName.c_str()); asyncContext->permissionQueryResults.emplace_back(permState.state); diff --git a/interfaces/kits/js/napi/accesstoken/include/napi_request_permission.h b/interfaces/kits/js/napi/accesstoken/include/napi_request_permission.h index c351a02cc..141b4cd90 100644 --- a/interfaces/kits/js/napi/accesstoken/include/napi_request_permission.h +++ b/interfaces/kits/js/napi/accesstoken/include/napi_request_permission.h @@ -56,6 +56,10 @@ struct RequestAsyncContext : public AtManagerAsyncWorkData { #ifdef EVENTHANDLER_ENABLE std::shared_ptr handler_ = nullptr; #endif + void SetErrorCode(int32_t errcode) + { + result.errorCode = errcode; + } }; struct RequestAsyncContextHandle { diff --git a/services/accesstokenmanager/permission_definitions.json b/services/accesstokenmanager/permission_definitions.json index d40b4d9b0..a3ff86aa8 100644 --- a/services/accesstokenmanager/permission_definitions.json +++ b/services/accesstokenmanager/permission_definitions.json @@ -7543,6 +7543,28 @@ "provisionEnable": true, "distributedSceneEnable": false, "deviceTypes": ["2in1"] + }, + { + "name": "ohos.permission.CAPTURE_SCREEN_ALL", + "grantMode": "system_grant", + "availableLevel": "system_core", + "availableType": "SYSTEM", + "since": 21, + "deprecated": "", + "provisionEnable": true, + "distributedSceneEnable": false, + "deviceTypes": ["general"] + }, + { + "name": "ohos.permission.CUSTOM_SCREEN_RECORDING", + "grantMode": "manual_settings", + "availableLevel": "system_basic", + "availableType": "NORMAL", + "since": 22, + "deprecated": "", + "provisionEnable": true, + "distributedSceneEnable": false, + "deviceTypes": ["2in1"] } ] } diff --git a/services/common/json_parse/src/json_parse_loader.cpp b/services/common/json_parse/src/json_parse_loader.cpp index 0c4bd78bc..76a51844d 100644 --- a/services/common/json_parse/src/json_parse_loader.cpp +++ b/services/common/json_parse/src/json_parse_loader.cpp @@ -495,15 +495,16 @@ static bool IsPermissionReqValid(int32_t tokenApl, const std::string& permission return false; } -std::string ConfigPolicLoader::DumpNativeTokenInfo(const NativeTokenInfoBase& native) +static void AddNativeTokenInfo(CJsonUnique& j, const NativeTokenInfoBase& native) { - CJsonUnique j = CreateJson(); (void)AddUnsignedIntToJson(j, "tokenID", native.tokenID); (void)AddStringToJson(j, "processName", native.processName); (void)AddIntToJson(j, "apl", native.apl); +} - CJsonUnique permStateListJson = CreateJsonArray(); - CJsonUnique invalidPermStringJson = CreateJsonArray(); +static void AddPermStateListInNativeTokenInfo(const NativeTokenInfoBase& native, + CJsonUnique& permStateListJson, CJsonUnique& invalidPermStringJson) +{ for (auto iter = native.permStateList.begin(); iter != native.permStateList.end(); ++iter) { if (!IsPermissionReqValid(native.apl, iter->permissionName, native.nativeAcls)) { CJsonUnique tmpJson = CreateJsonString(iter->permissionName); @@ -516,6 +517,16 @@ std::string ConfigPolicLoader::DumpNativeTokenInfo(const NativeTokenInfoBase& na (void)AddUnsignedIntToJson(permStateJson, "grantFlag", iter->grantFlag); (void)AddObjToArray(permStateListJson, permStateJson); } +} + +std::string ConfigPolicLoader::DumpNativeTokenInfo(const NativeTokenInfoBase& native) +{ + CJsonUnique j = CreateJson(); + AddNativeTokenInfo(j, native); + + CJsonUnique permStateListJson = CreateJsonArray(); + CJsonUnique invalidPermStringJson = CreateJsonArray(); + AddPermStateListInNativeTokenInfo(native, permStateListJson, invalidPermStringJson); (void)AddObjToJson(j, "permStateList", permStateListJson); (void)AddObjToJson(j, "invalidPermList", invalidPermStringJson); diff --git a/services/privacymanager/BUILD.gn b/services/privacymanager/BUILD.gn index 7b6242978..fa3f66446 100644 --- a/services/privacymanager/BUILD.gn +++ b/services/privacymanager/BUILD.gn @@ -250,5 +250,11 @@ if (is_standard_system && ability_base_enable == true) { include_dirs += [ "${access_token_path}/services/common/ability_manager/include" ] } + + if (hiviewdfx_hitrace_native_enable == true) { + cflags_cc += [ "-DHITRACE_NATIVE_ENABLE" ] + + external_deps += [ "hitrace:hitrace_meter" ] + } } } diff --git a/services/privacymanager/include/common/constant.h b/services/privacymanager/include/common/constant.h index 2d32f87af..3c710c8d3 100644 --- a/services/privacymanager/include/common/constant.h +++ b/services/privacymanager/include/common/constant.h @@ -71,6 +71,7 @@ public: SHORT_TERM_WRITE_IMAGEVIDEO = 42, CAMERA_BACKGROUND = 43, OP_CUSTOM_SCREEN_CAPTURE = 44, + OP_CUSTOM_SCREEN_RECORDING = 45, OP_HOOK_KEY_EVENT = 46, // 以下声明仅用于下载 桌面 文档文件夹权限的访问记录使用,需要和普通权限做区分 OP_READ_WRITE_DOWNLOAD_DIRECTORY_MEDIA_READ = 100, diff --git a/services/privacymanager/src/common/constant.cpp b/services/privacymanager/src/common/constant.cpp index eed9d0432..c08dacc7a 100644 --- a/services/privacymanager/src/common/constant.cpp +++ b/services/privacymanager/src/common/constant.cpp @@ -104,6 +104,8 @@ const std::map Constant::PERMISSION_OPCODE_MAP = { Constant::OP_READ_WRITE_DESKTOP_DIRECTORY_OTHER_READ), std::map::value_type("ohos.permission.READ_WRITE_DESKTOP_DIRECTORY_OTHER_WRITE", Constant::OP_READ_WRITE_DESKTOP_DIRECTORY_OTHER_WRITE), + std::map::value_type("ohos.permission.CUSTOM_SCREEN_RECORDING", + Constant::OP_CUSTOM_SCREEN_RECORDING), }; bool Constant::TransferPermissionToOpcode(const std::string& permissionName, int32_t& opCode) diff --git a/services/privacymanager/src/record/permission_record_manager.cpp b/services/privacymanager/src/record/permission_record_manager.cpp index cf616549f..0e0fcb2c1 100644 --- a/services/privacymanager/src/record/permission_record_manager.cpp +++ b/services/privacymanager/src/record/permission_record_manager.cpp @@ -1466,7 +1466,7 @@ bool PermissionRecordManager::IsAllowedUsingCamera(AccessTokenID tokenId, int32_ // allow foregound application or background application with CAMERA_BACKGROUND permission use camera int32_t status = GetAppStatus(tokenId, pid); - LOGI(PRI_DOMAIN, PRI_TAG, "Id %{public}d, appStatus %{public}d(1-foreground 2-background).", tokenId, status); + LOGI(PRI_DOMAIN, PRI_TAG, "Id %{public}d, pid %{public}d, status %{public}d(1-fore 2-back).", tokenId, pid, status); if (status == ActiveChangeType::PERM_ACTIVE_IN_FOREGROUND) { return true; } @@ -1477,7 +1477,7 @@ bool PermissionRecordManager::IsAllowedUsingCamera(AccessTokenID tokenId, int32_ bool PermissionRecordManager::IsAllowedUsingMicrophone(AccessTokenID tokenId, int32_t pid) { int32_t status = GetAppStatus(tokenId, pid); - LOGI(PRI_DOMAIN, PRI_TAG, "Id %{public}d, status is %{public}d(1-foreground 2-background).", tokenId, status); + LOGI(PRI_DOMAIN, PRI_TAG, "Id %{public}d, pid %{public}d, status %{public}d(1-fore 2-back).", tokenId, pid, status); if (status == ActiveChangeType::PERM_ACTIVE_IN_FOREGROUND) { return true; } diff --git a/services/privacymanager/src/service/privacy_manager_service.cpp b/services/privacymanager/src/service/privacy_manager_service.cpp index 23da941ba..898eca7c0 100644 --- a/services/privacymanager/src/service/privacy_manager_service.cpp +++ b/services/privacymanager/src/service/privacy_manager_service.cpp @@ -37,6 +37,11 @@ #include "string_ex.h" #include "tokenid_kit.h" +#ifdef HITRACE_NATIVE_ENABLE +#include "hitrace_meter.h" +#define PRIVACY_SYNC_TRACE HITRACE_METER_NAME(HITRACE_TAG_ACCESS_CONTROL, __PRETTY_FUNCTION__) +#endif + namespace OHOS { namespace Security { namespace AccessToken { @@ -90,6 +95,11 @@ void PrivacyManagerService::OnStop() int32_t PrivacyManagerService::AddPermissionUsedRecord(const AddPermParamInfoParcel& infoParcel) { +#ifdef HITRACE_NATIVE_ENABLE + PRIVACY_SYNC_TRACE; +#endif + LOGI(PRI_DOMAIN, PRI_TAG, "Entry!"); + uint32_t callingTokenID = IPCSkeleton::GetCallingTokenID(); if ((AccessTokenKit::GetTokenTypeFlag(callingTokenID) == TOKEN_HAP) && (!IsSystemAppCalling())) { return PrivacyError::ERR_NOT_SYSTEM_APP; @@ -98,11 +108,10 @@ int32_t PrivacyManagerService::AddPermissionUsedRecord(const AddPermParamInfoPar return PrivacyError::ERR_PERMISSION_DENIED; } - LOGD(PRI_DOMAIN, PRI_TAG, "id: %{public}d, perm: %{public}s, succCnt: %{public}d," - " failCnt: %{public}d, type: %{public}d", infoParcel.info.tokenId, infoParcel.info.permissionName.c_str(), - infoParcel.info.successCount, infoParcel.info.failCount, infoParcel.info.type); AddPermParamInfo info = infoParcel.info; - return PermissionRecordManager::GetInstance().AddPermissionUsedRecord(info); + int32_t res = PermissionRecordManager::GetInstance().AddPermissionUsedRecord(info); + LOGI(PRI_DOMAIN, PRI_TAG, "Exit!"); + return res; } int32_t PrivacyManagerService::AddPermissionUsedRecordAsync(const AddPermParamInfoParcel& infoParcel) @@ -201,6 +210,10 @@ int32_t PrivacyManagerService::StartUsingPermission( int32_t PrivacyManagerService::StartUsingPermissionCallback(const PermissionUsedTypeInfoParcel &infoParcel, const sptr& callback, const sptr& anonyStub) { +#ifdef HITRACE_NATIVE_ENABLE + PRIVACY_SYNC_TRACE; +#endif + LOGI(PRI_DOMAIN, PRI_TAG, "Entry!"); uint32_t callingTokenID = IPCSkeleton::GetCallingTokenID(); if ((AccessTokenKit::GetTokenTypeFlag(callingTokenID) == TOKEN_HAP) && (!IsSystemAppCalling())) { return PrivacyError::ERR_NOT_SYSTEM_APP; @@ -210,9 +223,10 @@ int32_t PrivacyManagerService::StartUsingPermissionCallback(const PermissionUsed } int32_t callerPid = IPCSkeleton::GetCallingPid(); - LOGI(PRI_DOMAIN, PRI_TAG, "Caller pid = %{public}d.", callerPid); ProcessProxyDeathStub(anonyStub, callerPid); - return PermissionRecordManager::GetInstance().StartUsingPermission(infoParcel.info, callback, callerPid); + int32_t res = PermissionRecordManager::GetInstance().StartUsingPermission(infoParcel.info, callback, callerPid); + LOGI(PRI_DOMAIN, PRI_TAG, "Exit!"); + return res; } int32_t PrivacyManagerService::StopUsingPermission( @@ -408,6 +422,10 @@ int32_t PrivacyManagerService::UnRegisterPermActiveStatusCallback(const sptr RemoteCommandManager::GetOrCreateRemoteCo std::shared_ptr RemoteCommandManager::GetExecutorChannel(const std::string &nodeId) { LOGD(ATM_DOMAIN, ATM_TAG, "Convert udid start, nodeId:%{public}s", ConstantCommon::EncryptDevId(nodeId).c_str()); - std::string udid = DeviceInfoManager::GetInstance().ConvertToUniqueDeviceIdOrFetch(nodeId); + std::string udid = SoftBusManager::GetInstance().ConvertToUniqueDeviceIdOrFetch(nodeId); if (!DataValidator::IsDeviceIdValid(udid)) { LOGW(ATM_DOMAIN, ATM_TAG, "Converted udid is invalid, nodeId:%{public}s", ConstantCommon::EncryptDevId(nodeId).c_str()); diff --git a/services/tokensyncmanager/src/remote/soft_bus_device_connection_listener.cpp b/services/tokensyncmanager/src/remote/soft_bus_device_connection_listener.cpp index b1fed6a56..601c0c6a3 100644 --- a/services/tokensyncmanager/src/remote/soft_bus_device_connection_listener.cpp +++ b/services/tokensyncmanager/src/remote/soft_bus_device_connection_listener.cpp @@ -20,6 +20,7 @@ #include "device_info_manager.h" #include "device_manager.h" #include "iservice_registry.h" +#include "soft_bus_manager.h" #include "soft_bus_socket_listener.h" #include "system_ability_definition.h" #include "constant_common.h" @@ -85,11 +86,8 @@ void SoftBusDeviceConnectionListener::UnloadTokensyncService() void SoftBusDeviceConnectionListener::OnDeviceOffline(const DistributedHardware::DmDeviceInfo &info) { std::string networkId = std::string(info.networkId); - std::string uuid = DeviceInfoManager::GetInstance().ConvertToUniversallyUniqueIdOrFetch(networkId); - if (uuid.empty()) { - uuid = SoftBusManager::GetInstance().GetUniversallyUniqueIdByNodeId(networkId); - } - std::string udid = DeviceInfoManager::GetInstance().ConvertToUniqueDeviceIdOrFetch(networkId); + std::string uuid = SoftBusManager::GetInstance().ConvertToUniversallyUniqueIdOrFetch(networkId); + std::string udid = SoftBusManager::GetInstance().ConvertToUniqueDeviceIdOrFetch(networkId); if ((uuid == "") || (udid == "")) { LOGE(ATM_DOMAIN, ATM_TAG, "Uuid or udid is empty, offline failed."); return; diff --git a/services/tokensyncmanager/src/remote/soft_bus_manager.cpp b/services/tokensyncmanager/src/remote/soft_bus_manager.cpp index 39d9aba5f..3f6cdf622 100644 --- a/services/tokensyncmanager/src/remote/soft_bus_manager.cpp +++ b/services/tokensyncmanager/src/remote/soft_bus_manager.cpp @@ -28,6 +28,7 @@ #include "libraryloader.h" #include "remote_command_manager.h" #include "soft_bus_device_connection_listener.h" +#include "soft_bus_manager.h" #include "soft_bus_socket_listener.h" #include "token_setproc.h" @@ -543,6 +544,34 @@ int SoftBusManager::FulfillLocalDeviceInfo() fulfillMutex_.unlock(); return Constant::SUCCESS; } + +std::string SoftBusManager::ConvertToUniversallyUniqueIdOrFetch(const std::string& nodeId) +{ + std::string uuid = DeviceInfoManager::GetInstance().ConvertToUniversallyUniqueId(nodeId); + if (uuid.empty()) { + uuid = GetUniversallyUniqueIdByNodeId(nodeId); + } + return uuid; +} + +std::string SoftBusManager::ConvertToUniqueDeviceIdOrFetch(const std::string& nodeId) +{ + bool isFoundDevice = false; + std::string uniqueDeviceId = DeviceInfoManager::GetInstance().ConvertToUniqueDeviceId(nodeId, isFoundDevice); + LOGE(ATM_DOMAIN, ATM_TAG, "nodeId %{public}d", isFoundDevice); + if (uniqueDeviceId.empty() && isFoundDevice) { + std::string udid = GetUniqueDeviceIdByNodeId(nodeId); + if (!udid.empty()) { + uniqueDeviceId = udid; + LOGD(ATM_DOMAIN, ATM_TAG, + "udid is empty, use local udid, nodeId(%{public}s)", ConstantCommon::EncryptDevId(nodeId).c_str()); + } else { + LOGD(ATM_DOMAIN, ATM_TAG, + "Udid and local udid is empty, nodeId(%{public}s)", ConstantCommon::EncryptDevId(nodeId).c_str()); + } + } + return uniqueDeviceId; +} } // namespace AccessToken } // namespace Security } // namespace OHOS diff --git a/services/tokensyncmanager/test/coverage/token_sync_service_coverage_test.cpp b/services/tokensyncmanager/test/coverage/token_sync_service_coverage_test.cpp index 5ac876c52..75b0c33c0 100644 --- a/services/tokensyncmanager/test/coverage/token_sync_service_coverage_test.cpp +++ b/services/tokensyncmanager/test/coverage/token_sync_service_coverage_test.cpp @@ -44,6 +44,7 @@ #include "remote_command_manager.h" #include "socket.h" #include "soft_bus_device_connection_listener.h" +#include "soft_bus_manager.h" #include "soft_bus_socket_listener.h" #include "test_common.h" #include "token_setproc.h" @@ -134,11 +135,8 @@ void TokenSyncServiceTest::TearDown() void TokenSyncServiceTest::OnDeviceOffline(const DistributedHardware::DmDeviceInfo &info) { std::string networkId = info.networkId; - std::string uuid = DeviceInfoManager::GetInstance().ConvertToUniversallyUniqueIdOrFetch(networkId); - if (uuid.empty()) { - uuid = SoftBusManager::GetInstance().GetUniversallyUniqueIdByNodeId(networkId); - } - std::string udid = DeviceInfoManager::GetInstance().ConvertToUniqueDeviceIdOrFetch(networkId); + std::string uuid = SoftBusManager::GetInstance().ConvertToUniversallyUniqueIdOrFetch(networkId); + std::string udid = SoftBusManager::GetInstance().ConvertToUniqueDeviceIdOrFetch(networkId); LOGI(ATM_DOMAIN, ATM_TAG, "networkId: %{public}s, uuid: %{public}s, udid: %{public}s", diff --git a/services/tokensyncmanager/test/unittest/token_sync_service_test.cpp b/services/tokensyncmanager/test/unittest/token_sync_service_test.cpp index 081c8fef8..ec1a4674a 100644 --- a/services/tokensyncmanager/test/unittest/token_sync_service_test.cpp +++ b/services/tokensyncmanager/test/unittest/token_sync_service_test.cpp @@ -45,6 +45,7 @@ #undef private #include "socket.h" #include "soft_bus_device_connection_listener.h" +#include "soft_bus_manager.h" #include "soft_bus_socket_listener.h" #include "test_common.h" #include "token_setproc.h" @@ -143,11 +144,8 @@ void TokenSyncServiceTest::TearDown() void TokenSyncServiceTest::OnDeviceOffline(const DistributedHardware::DmDeviceInfo &info) { std::string networkId = info.networkId; - std::string uuid = DeviceInfoManager::GetInstance().ConvertToUniversallyUniqueIdOrFetch(networkId); - if (uuid.empty()) { - uuid = SoftBusManager::GetInstance().GetUniversallyUniqueIdByNodeId(networkId); - } - std::string udid = DeviceInfoManager::GetInstance().ConvertToUniqueDeviceIdOrFetch(networkId); + std::string uuid = SoftBusManager::GetInstance().ConvertToUniversallyUniqueIdOrFetch(networkId); + std::string udid = SoftBusManager::GetInstance().ConvertToUniqueDeviceIdOrFetch(networkId); LOGI(ATM_DOMAIN, ATM_TAG, "networkId: %{public}s, uuid: %{public}s, udid: %{public}s", @@ -1020,18 +1018,18 @@ HWTEST_F(TokenSyncServiceTest, RemoveRemoteDeviceInfo001, TestSize.Level0) /** * @tc.name: ConvertToUniversallyUniqueIdOrFetch001 - * @tc.desc: DeviceInfoManager::ConvertToUniversallyUniqueIdOrFetch function test + * @tc.desc: SoftBusManager::ConvertToUniversallyUniqueIdOrFetch function test * @tc.type: FUNC * @tc.require: */ HWTEST_F(TokenSyncServiceTest, ConvertToUniversallyUniqueIdOrFetch001, TestSize.Level0) { std::string nodeId; - ASSERT_EQ("", DeviceInfoManager::GetInstance().ConvertToUniversallyUniqueIdOrFetch(nodeId)); // nodeId invalid + ASSERT_EQ("", SoftBusManager::GetInstance().ConvertToUniversallyUniqueIdOrFetch(nodeId)); // nodeId invalid nodeId = "123"; // FindDeviceInfo false - ASSERT_EQ("", DeviceInfoManager::GetInstance().ConvertToUniversallyUniqueIdOrFetch(nodeId)); + ASSERT_EQ("", SoftBusManager::GetInstance().ConvertToUniversallyUniqueIdOrFetch(nodeId)); std::string networkId = "123"; std::string universallyUniqueId = "123"; @@ -1043,7 +1041,7 @@ HWTEST_F(TokenSyncServiceTest, ConvertToUniversallyUniqueIdOrFetch001, TestSize. nodeId = "123"; // FindDeviceInfo true + universallyUniqueId is not empty - DeviceInfoManager::GetInstance().ConvertToUniversallyUniqueIdOrFetch(nodeId); + SoftBusManager::GetInstance().ConvertToUniversallyUniqueIdOrFetch(nodeId); nodeId = uniqueDeviceId; // FindDeviceInfo true + uniqueDeviceId != localDevice false @@ -1057,18 +1055,18 @@ HWTEST_F(TokenSyncServiceTest, ConvertToUniversallyUniqueIdOrFetch001, TestSize. /** * @tc.name: ConvertToUniqueDeviceIdOrFetch001 - * @tc.desc: DeviceInfoManager::ConvertToUniqueDeviceIdOrFetch function test + * @tc.desc: SoftBusManager::ConvertToUniqueDeviceIdOrFetch function test * @tc.type: FUNC * @tc.require: */ HWTEST_F(TokenSyncServiceTest, ConvertToUniqueDeviceIdOrFetch001, TestSize.Level0) { std::string nodeId; - ASSERT_EQ("", DeviceInfoManager::GetInstance().ConvertToUniqueDeviceIdOrFetch(nodeId)); // nodeId invalid + ASSERT_EQ("", SoftBusManager::GetInstance().ConvertToUniqueDeviceIdOrFetch(nodeId)); // nodeId invalid nodeId = "123"; // FindDeviceInfo false - ASSERT_EQ("", DeviceInfoManager::GetInstance().ConvertToUniqueDeviceIdOrFetch(nodeId)); + ASSERT_EQ("", SoftBusManager::GetInstance().ConvertToUniqueDeviceIdOrFetch(nodeId)); std::string networkId = "123"; std::string universallyUniqueId = "123"; @@ -1080,7 +1078,7 @@ HWTEST_F(TokenSyncServiceTest, ConvertToUniqueDeviceIdOrFetch001, TestSize.Level nodeId = "123"; // FindDeviceInfo true + universallyUniqueId is not empty - DeviceInfoManager::GetInstance().ConvertToUniqueDeviceIdOrFetch(nodeId); + SoftBusManager::GetInstance().ConvertToUniqueDeviceIdOrFetch(nodeId); nodeId = uniqueDeviceId; // FindDeviceInfo true + uniqueDeviceId != localDevice false