diff --git a/services/privacymanager/include/record/permission_record_manager.h b/services/privacymanager/include/record/permission_record_manager.h index 727599d119badad5f773cf53de783e45b9cf33d6..9e3485252968d8293eb4e23e18cfbdc3ddd34d8f 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 024790c7d1f230b01a13fe4c1ca016359d66253c..a206635c0b59fd213f45412fcca52871cfa55067 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) {