diff --git a/frameworks/privacy/include/i_privacy_manager.h b/frameworks/privacy/include/i_privacy_manager.h index c375649469372c9b62afe98c69c163fdff72102a..cb80f091ca047143dcd83bbe1d1501c2a0760fe2 100644 --- a/frameworks/privacy/include/i_privacy_manager.h +++ b/frameworks/privacy/include/i_privacy_manager.h @@ -47,15 +47,18 @@ public: virtual int32_t RegisterPermActiveStatusCallback( std::vector& permList, const sptr& callback) = 0; virtual int32_t UnRegisterPermActiveStatusCallback(const sptr& callback) = 0; + virtual bool IsAllowedUsingPermission(AccessTokenID tokenID, const std::string& permissionName) = 0; enum class InterfaceCode { - ADD_PERMISSION_USED_RECORD = 0xf001, + ADD_PERMISSION_USED_RECORD, START_USING_PERMISSION, STOP_USING_PERMISSION, DELETE_PERMISSION_USED_RECORDS, GET_PERMISSION_USED_RECORDS, GET_PERMISSION_USED_RECORDS_ASYNC, + DUMP_RECORD_INFO, REGISTER_PERM_ACTIVE_STATUS_CHANGE_CALLBACK, UNREGISTER_PERM_ACTIVE_STATUS_CHANGE_CALLBACK, + IS_ALLOWED_USING_PERMISSION, }; }; } // namespace AccessToken diff --git a/interfaces/innerkits/privacy/include/privacy_kit.h b/interfaces/innerkits/privacy/include/privacy_kit.h index 832a77b3abe3ebb53dca24d098b7c220f34b6675..9eda251574fb862d2a7cd3816026259f903396a1 100644 --- a/interfaces/innerkits/privacy/include/privacy_kit.h +++ b/interfaces/innerkits/privacy/include/privacy_kit.h @@ -39,6 +39,7 @@ public: const PermissionUsedRequest& request, const sptr& callback); static int32_t RegisterPermActiveStatusCallback(const std::shared_ptr& callback); static int32_t UnRegisterPermActiveStatusCallback(const std::shared_ptr& callback); + static bool IsAllowedUsingPermission(AccessTokenID tokenID, const std::string& permissionName); }; } // namespace AccessToken } // namespace Security diff --git a/interfaces/innerkits/privacy/src/privacy_kit.cpp b/interfaces/innerkits/privacy/src/privacy_kit.cpp index 2d26151f6108367401ba56c324e87992c9626d0d..4ce616f9fd5cc8aecb778f63f1972049a5925d48 100644 --- a/interfaces/innerkits/privacy/src/privacy_kit.cpp +++ b/interfaces/innerkits/privacy/src/privacy_kit.cpp @@ -79,6 +79,15 @@ int32_t PrivacyKit::UnRegisterPermActiveStatusCallback(const std::shared_ptrIsAllowedUsingPermission(tokenID, permissionName); +} + void PrivacyManagerClient::InitProxy() { std::lock_guard lock(proxyMutex_); diff --git a/interfaces/innerkits/privacy/src/privacy_manager_client.h b/interfaces/innerkits/privacy/src/privacy_manager_client.h index ce1dcfbd61dc8b071af55922acc4776dabb86f44..df68a40e90f9a598d1ae725fac9718abb89d7065 100644 --- a/interfaces/innerkits/privacy/src/privacy_manager_client.h +++ b/interfaces/innerkits/privacy/src/privacy_manager_client.h @@ -48,7 +48,7 @@ public: int32_t CreateActiveStatusChangeCbk( const std::shared_ptr& callback, sptr& callbackWrap); - + bool IsAllowedUsingPermission(AccessTokenID tokenID, const std::string& permissionName); void OnRemoteDiedHandle(); private: PrivacyManagerClient(); diff --git a/interfaces/innerkits/privacy/src/privacy_manager_proxy.cpp b/interfaces/innerkits/privacy/src/privacy_manager_proxy.cpp index 6e7f1125f328c50406790953cf1d59a3fe810065..dc7fb7a8c7ec84d63903ff2396ee1f9a4dda1364 100644 --- a/interfaces/innerkits/privacy/src/privacy_manager_proxy.cpp +++ b/interfaces/innerkits/privacy/src/privacy_manager_proxy.cpp @@ -273,6 +273,35 @@ int32_t PrivacyManagerProxy::UnRegisterPermActiveStatusCallback(const sptr& permList, const sptr& callback) override; int32_t UnRegisterPermActiveStatusCallback(const sptr& callback) override; - + bool IsAllowedUsingPermission(AccessTokenID tokenID, const std::string& permissionName) override; private: bool SendRequest(IPrivacyManager::InterfaceCode code, MessageParcel& data, MessageParcel& reply); static inline BrokerDelegator delegator_; diff --git a/services/privacymanager/include/service/privacy_manager_service.h b/services/privacymanager/include/service/privacy_manager_service.h index a8721474cbb129002625fe69287735b78d64ba3b..d0e062961ca48f3b33f0f1d095c35e0cb5a32272 100644 --- a/services/privacymanager/include/service/privacy_manager_service.h +++ b/services/privacymanager/include/service/privacy_manager_service.h @@ -48,6 +48,7 @@ public: int32_t RegisterPermActiveStatusCallback( std::vector& permList, const sptr& callback) override; int32_t UnRegisterPermActiveStatusCallback(const sptr& callback) override; + bool IsAllowedUsingPermission(AccessTokenID tokenId, const std::string& permissionName) override; int32_t Dump(int fd, const std::vector& args) override; private: bool Initialize() const; diff --git a/services/privacymanager/include/service/privacy_manager_stub.h b/services/privacymanager/include/service/privacy_manager_stub.h index 0151ca494e37133ed55acc26f43a6526d9f447b3..0e14bbdb3d7cc886254d8d6823153610f8b1d4e5 100644 --- a/services/privacymanager/include/service/privacy_manager_stub.h +++ b/services/privacymanager/include/service/privacy_manager_stub.h @@ -40,6 +40,7 @@ private: void GetPermissionUsedRecordsAsyncInner(MessageParcel& data, MessageParcel& reply); void RegisterPermActiveStatusCallbackInner(MessageParcel& data, MessageParcel& reply); void UnRegisterPermActiveStatusCallbackInner(MessageParcel& data, MessageParcel& reply); + void IsAllowedUsingPermissionInner(MessageParcel& data, MessageParcel& reply); bool IsAccessTokenCalling() const; bool VerifyPermission(const std::string& permission) const; static const int32_t ACCESSTOKEN_UID = 3020; diff --git a/services/privacymanager/src/service/privacy_manager_service.cpp b/services/privacymanager/src/service/privacy_manager_service.cpp index 5ec1ca392648c35347c0b895b748666acbe54427..6e9a07421f14a184c9fed956d06db5b680467f7b 100644 --- a/services/privacymanager/src/service/privacy_manager_service.cpp +++ b/services/privacymanager/src/service/privacy_manager_service.cpp @@ -184,6 +184,11 @@ int32_t PrivacyManagerService::UnRegisterPermActiveStatusCallback(const sptr(IPrivacyManager::InterfaceCode::UNREGISTER_PERM_ACTIVE_STATUS_CHANGE_CALLBACK): UnRegisterPermActiveStatusCallbackInner(data, reply); break; + case static_cast(IPrivacyManager::InterfaceCode::IS_ALLOWED_USING_PERMISSION): + IsAllowedUsingPermissionInner(data, reply); + break; default: return IPCObjectStub::OnRemoteRequest(code, data, reply, option); } @@ -203,6 +206,21 @@ void PrivacyManagerStub::UnRegisterPermActiveStatusCallbackInner(MessageParcel& reply.WriteInt32(result); } +void PrivacyManagerStub::IsAllowedUsingPermissionInner(MessageParcel& data, MessageParcel& reply) +{ + if (!VerifyPermission(PERMISSION_USED_STATS)) { + reply.WriteInt32(RET_FAILED); + return; + } + AccessTokenID tokenId = data.ReadUint32(); + std::string permissionName = data.ReadString(); + bool result = this->IsAllowedUsingPermission(tokenId, permissionName); + if (!reply.WriteBool(result)) { + ACCESSTOKEN_LOG_ERROR(LABEL, "Failed to WriteBool(%{public}s)", permissionName.c_str()); + return; + } +} + bool PrivacyManagerStub::IsAccessTokenCalling() const { int32_t callingUid = IPCSkeleton::GetCallingUid();