diff --git a/interfaces/innerkits/privacy/include/privacy_error.h b/interfaces/innerkits/privacy/include/privacy_error.h index dc98690a6da70cad9eceb7b06892bbdc704ec030..d89d2469d116861cef36d2e3a1df16569aceec9b 100644 --- a/interfaces/innerkits/privacy/include/privacy_error.h +++ b/interfaces/innerkits/privacy/include/privacy_error.h @@ -66,6 +66,7 @@ enum PrivacyError { ERR_FIRST_CALLER_NOT_EDM, ERR_ADD_DEATH_RECIPIENT_FAILED, PRIVACY_TOGGELE_RESTRICTED, + ERR_PERMISSION_NOT_ALLOW_USING }; } // namespace AccessToken } // namespace Security diff --git a/services/privacymanager/include/record/permission_record_manager.h b/services/privacymanager/include/record/permission_record_manager.h index 17f738733380a00281e40aa39a4eaf0cbe49d2e1..0be5e689863bb8b47eaced38dcee781e1748f847 100644 --- a/services/privacymanager/include/record/permission_record_manager.h +++ b/services/privacymanager/include/record/permission_record_manager.h @@ -15,7 +15,7 @@ #ifndef PERMISSION_RECORD_MANAGER_H #define PERMISSION_RECORD_MANAGER_H - +#include #include #include #include @@ -180,6 +180,9 @@ private: const PermissionUsedType type); void AddDataValueToResults(const GenericValues value, std::vector& results); + void AddCameraRecordToDB(); + void AddCameraRecord(const PermissionRecord& record); + #ifdef CAMERA_FLOAT_WINDOW_ENABLE bool HasUsingCamera(); void ClearWindowShowing(); @@ -222,6 +225,10 @@ private: bool isCamMixMute_ = false; bool isCamLoad_ = false; + std::mutex camRecordQueueMtx; + bool isWritingDB = false; + std::queue camRecordQueue; + // appState std::mutex appStateMutex_; sptr appStateCallback_ = nullptr; diff --git a/services/privacymanager/src/record/permission_record_manager.cpp b/services/privacymanager/src/record/permission_record_manager.cpp index 36fac081b13d37fba019ccb057022d1aa6b38bc1..f699fd8b68a63076de23e96ea260f568c36e6a20 100644 --- a/services/privacymanager/src/record/permission_record_manager.cpp +++ b/services/privacymanager/src/record/permission_record_manager.cpp @@ -17,6 +17,7 @@ #include #include +#include #include #ifndef APP_SECURITY_PRIVACY_SERVICE @@ -308,10 +309,6 @@ void PermissionRecordManager::UpdatePermRecImmediately() int32_t PermissionRecordManager::GetPermissionRecord(const AddPermParamInfo& info, PermissionRecord& record) { - if (AccessTokenKit::GetTokenTypeFlag(info.tokenId) != TOKEN_HAP) { - LOGE(PRI_DOMAIN, PRI_TAG, "Not hap(%{public}d).", info.tokenId); - return PrivacyError::ERR_PARAM_INVALID; - } int32_t opCode; if (!Constant::TransferPermissionToOpcode(info.permissionName, opCode)) { LOGE(PRI_DOMAIN, PRI_TAG, "Invalid perm(%{public}s)", info.permissionName.c_str()); @@ -438,6 +435,10 @@ int32_t PermissionRecordManager::AddPermissionUsedRecord(const AddPermParamInfo& return result; } + if (record.opCode == Constant::OP_CAMERA) { + AddCameraRecord(record); + return RET_SUCCESS; + } result = AddRecord(record); if (result != Constant::SUCCESS) { return result; @@ -447,6 +448,35 @@ int32_t PermissionRecordManager::AddPermissionUsedRecord(const AddPermParamInfo& info.tokenId, record.opCode, info.type) ? Constant::SUCCESS : Constant::FAILURE; } +void PermissionRecordManager::AddCameraRecordToDB() +{ + LOGI(PRI_DOMAIN, PRI_TAG, "camRecordQueue siize is (%{public}zu).", camRecordQueue.size()); + while (!camRecordQueue.empty()) { + PermissionRecord record = camRecordQueue.front(); + camRecordQueue.pop(); + int32_t result = AddRecord(record); + if (result != Constant::SUCCESS) { + LOGI(PRI_DOMAIN, PRI_TAG, "Fail to add camera record, err(%{public}d).", result); + continue; + } + if (!AddOrUpdateUsedTypeIfNeeded(record.tokenId, record.opCode, record.type)) { + LOGI(PRI_DOMAIN, PRI_TAG, "Fail to add usedType for camera."); + continue; + } + } + isWritingDB = false; +} + +void PermissionRecordManager::AddCameraRecord(const PermissionRecord& record) +{ + std::lock_guard lock(camRecordQueueMtx); + camRecordQueue.push(record); + if (!isWritingDB) { + isWritingDB = true; + std::async(std::launch::async, &PermissionRecordManager::AddCameraRecordToDB, this); + } +} + int32_t PermissionRecordManager::SetPermissionUsedRecordToggleStatus(int32_t userID, bool status) { if (userID == 0) { @@ -1340,6 +1370,9 @@ int32_t PermissionRecordManager::StartUsingPermission(const PermissionUsedTypeIn LOGD(PRI_DOMAIN, PRI_TAG, "Token(%{public}u), perm(%{public}s).", tokenId, permissionName.c_str()); return PrivacyError::ERR_PARAM_INVALID; } + if (!IsAllowedUsingCamera(tokenId, info.pid)) { + return PrivacyError::ERR_PERMISSION_NOT_ALLOW_USING; + } InitializeMuteState(permissionName); if (GetMuteStatus(permissionName, EDM)) {