From c7c798b8c2b8a263ac6124f91a8e54053b9c3b9a Mon Sep 17 00:00:00 2001 From: lsq Date: Mon, 25 Jul 2022 21:51:45 +0800 Subject: [PATCH] =?UTF-8?q?=E6=9D=83=E9=99=90=E4=BD=BF=E7=94=A8=E8=AE=B0?= =?UTF-8?q?=E5=BD=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: lsq Change-Id: I1f023ed39749e16754c83887d44b8cb7f7edaa6d --- .../record/permission_record_manager.h | 5 +- .../src/record/permission_record_manager.cpp | 133 ++++++++++++++++++ 2 files changed, 137 insertions(+), 1 deletion(-) diff --git a/services/privacymanager/include/record/permission_record_manager.h b/services/privacymanager/include/record/permission_record_manager.h index 727599d11..9e3485252 100644 --- a/services/privacymanager/include/record/permission_record_manager.h +++ b/services/privacymanager/include/record/permission_record_manager.h @@ -46,13 +46,16 @@ public: int32_t GetPermissionUsedRecordsAsync( const PermissionUsedRequest& request, const sptr& callback); std::string DumpRecordInfo(const std::string& bundleName, const std::string& permissionName); + int32_t StartUsingPermission(AccessTokenID tokenID, const std::string& permissionName); + int32_t StopUsingPermission(AccessTokenID tokenID, const std::string& permissionName); + bool GetPermissionVisitor(AccessTokenID tokenID, PermissionVisitor& visitor); + bool HasStarted(AccessTokenID tokenID, const std::string& permissionName); private: PermissionRecordManager(); DISALLOW_COPY_AND_MOVE(PermissionRecordManager); bool AddVisitor(AccessTokenID tokenID, int32_t& visitorId); - bool GetPermissionVisitor(AccessTokenID tokenID, PermissionVisitor& visitor); bool AddRecord(int32_t visitorId, const std::string& permissionName, int32_t successCount, int32_t failCount); bool GetPermissionsRecord(int32_t visitorId, const std::string& permissionName, int32_t successCount, int32_t failCount, PermissionRecord& record); diff --git a/services/privacymanager/src/record/permission_record_manager.cpp b/services/privacymanager/src/record/permission_record_manager.cpp index 024790c7d..a206635c0 100644 --- a/services/privacymanager/src/record/permission_record_manager.cpp +++ b/services/privacymanager/src/record/permission_record_manager.cpp @@ -173,6 +173,139 @@ bool PermissionRecordManager::GetPermissionsRecord(int32_t visitorId, const std: return true; } +enum ActiveChangeType { + PERM_INACTIVE = 0, + PERM_ACTIVE_IN_FOREGROUND = 1, + PERM_ACTIVE_IN_BACKGRONGD = 2, +}; +enum AppStatus { + APP_CREATE = 0, + APP_DIE, + APP_FOREGROUND, + APP_BACKGROUND, +}; +typedef void (*OnAppStatusChangeCallback)(uint32_t tokenId, AppStatus status); +typedef void (*OnCameraFloatWindowChangeCallback)(uint32_t tokenId, bool isShowing); +extern void RegisterAppStatusChangeCallback(uint32_t tokenId, OnAppStatusChangeCallback callback); +extern void UnRegisterAppStatusChangeCallback(uint32_t tokenId, OnAppStatusChangeCallback callback); + +void FindPermissionsToBeExcuted(uint32_t tokenID, AppStatus status, std::vector& permist) +{ + ActiveChangeType goalStatus; + if (status == APP_FOREGROUND) { + goalStatus = PERM_ACTIVE_IN_BACKGRONGD; + } else if (status == APP_BACKGROUND) { + goalStatus = PERM_ACTIVE_IN_FOREGROUND; + } else { + return; + } + // find goal status permission in permission records + +} +// 被注册的函数 +void FrontAndBackGroundlistener(uint32_t tokenID, AppStatus status) +{ + ACCESSTOKEN_LOG_INFO(LABEL, "tokenID %{public}d, status %{public}d", tokenID, status); + + ActiveChangeType currtatus; + switch (status) { + case APP_FOREGROUND: + currtatus = PERM_ACTIVE_IN_FOREGROUND; + break; + case APP_BACKGROUND: + currtatus = PERM_ACTIVE_IN_BACKGRONGD; + break; + case APP_CREATE: + case APP_DIE: + default: + return; + } + // 获取当前tokenid对应的正在使用的权限列表,找出其中为PERM_ACTIVE_IN_FOREGROUND的permission + /* + + */ + PermissionVisitor visitor; + bool res = PermissionRecordManager::GetInstance().GetPermissionVisitor(tokenID, visitor); + if (!res) { + ACCESSTOKEN_LOG_ERROR(LABEL, "GetPermissionVisitor falied, tokenID %{public}d", tokenID); + return; + } + std::vector permList; + FindPermissionsToBeExcuted(tokenID, status, permList); + // 回调函数触发 + return; +} + +bool PermissionRecordManager::HasStarted(AccessTokenID tokenID, const std::string& permissionName) +{ + return false; +} + +int32_t PermissionRecordManager::StartUsingPermission(AccessTokenID tokenID, const std::string& permissionName) +{ + ACCESSTOKEN_LOG_DEBUG(LABEL, "Entry, tokenId: %{public}d, permissionName: %{public}s", + tokenID, permissionName.c_str()); + // ExecuteDeletePermissionRecordTask(); + + if (AccessTokenKit::GetTokenTypeFlag(tokenID) != TOKEN_HAP) { + ACCESSTOKEN_LOG_ERROR(LABEL, "Invalid token type"); + return Constant::SUCCESS; + } + + Utils::UniqueWriteGuard lk(this->rwLock_); + int32_t visitorId; + if (!AddVisitor(tokenID, visitorId)) { + return Constant::FAILURE; + } + PermissionRecord record; + if (!GetPermissionsRecord(visitorId, permissionName, 0, 0, record)) { + return false; + } + + // 看当前是否重复start,查询当前内存上是否有对应的tokenid的使用权限 + if (HasStarted(tokenID, permissionName)) { + ACCESSTOKEN_LOG_ERROR(LABEL, "Permission has been used already."); + return Constant::FAILURE; + } + + // 如果当前内存 + // 此处是否结合全局变量的使用来判断是否开始记录 + + // 如果全局变量为关闭,使用接口拉起授权弹窗 + + // 注册前后台监听 + RegisterAppStatusChangeCallback(tokenID, FrontAndBackGroundlistener); + + // 触发给systemUi当前的权限在前台使用 + PermissionVisitor visitor; + bool res = GetPermissionVisitor(tokenID, visitor); + if (!res) { + return Constant::FAILURE; + } + ActiveStatusCallbackManager::GetInstance().ExcuteCallbackAsync( + tokenID, permissionName, visitor.deviceId, PERM_ACTIVE_IN_FOREGROUND); + return Constant::SUCCESS; +} + +int32_t PermissionRecordManager::StopUsingPermission(AccessTokenID tokenID, const std::string& permissionName) +{ + // 记录结束使用 + + // 注册前后台监听 + UnRegisterAppStatusChangeCallback(tokenID, FrontAndBackGroundlistener); + + // 触发给systemUi当前的权限在前台使用 + PermissionVisitor visitor; + bool res = GetPermissionVisitor(tokenID, visitor); + if (!res) { + return Constant::FAILURE; + } + + ActiveStatusCallbackManager::GetInstance().ExcuteCallbackAsync( + tokenID, permissionName, visitor.deviceId, PERM_INACTIVE); + return Constant::SUCCESS; +} + int32_t PermissionRecordManager::AddPermissionUsedRecord(AccessTokenID tokenID, const std::string& permissionName, int32_t successCount, int32_t failCount) { -- Gitee