diff --git a/frameworks/concurrent_task_client/include/concurrent_task_service_ipc_interface_code.h b/frameworks/concurrent_task_client/include/concurrent_task_service_ipc_interface_code.h index b1822ee6fabf8fc49c74cf65a25d46698de88cce..84c93517dd43a61ab7ef73b992cd10701d4eb058 100644 --- a/frameworks/concurrent_task_client/include/concurrent_task_service_ipc_interface_code.h +++ b/frameworks/concurrent_task_client/include/concurrent_task_service_ipc_interface_code.h @@ -23,6 +23,7 @@ enum class ConcurrentTaskInterfaceCode { REPORT_DATA = 1, QUERY_INTERVAL = 2, QUERY_DEADLINE = 3, + REQUEST_AUTH = 4, }; } // namespace ConcurrentTask } // namespace OHOS diff --git a/frameworks/concurrent_task_client/include/concurrent_task_service_proxy.h b/frameworks/concurrent_task_client/include/concurrent_task_service_proxy.h index 1d943c30a3d98d9edef6470efe2cfa3cc24c7018..1b27fda81e2ee9f6a1ed2e9a9ef440b81a0abe06 100644 --- a/frameworks/concurrent_task_client/include/concurrent_task_service_proxy.h +++ b/frameworks/concurrent_task_client/include/concurrent_task_service_proxy.h @@ -31,6 +31,7 @@ public: void ReportData(uint32_t resType, int64_t value, const Json::Value& payload) override; void QueryInterval(int queryItem, IntervalReply& queryRs) override; void QueryDeadline(int queryItem, DeadlineReply& ddlReply, const Json::Value& payload) override; + void RequestAuth(const Json::Value& payload) override; private: DISALLOW_COPY_AND_MOVE(ConcurrentTaskServiceProxy); diff --git a/frameworks/concurrent_task_client/include/iconcurrent_task_service.h b/frameworks/concurrent_task_client/include/iconcurrent_task_service.h index bbe82413935c601ba75bc338261266ab9350d514..7e70d7b2e49216bcbd6c3d4d8fa285a7a33a14aa 100644 --- a/frameworks/concurrent_task_client/include/iconcurrent_task_service.h +++ b/frameworks/concurrent_task_client/include/iconcurrent_task_service.h @@ -30,6 +30,7 @@ public: virtual void ReportData(uint32_t resType, int64_t value, const Json::Value& payload) = 0; virtual void QueryInterval(int queryItem, IntervalReply& queryRs) = 0; virtual void QueryDeadline(int queryItem, DeadlineReply& ddlReply, const Json::Value& payload) = 0; + virtual void RequestAuth(const Json::Value& payload) = 0; }; } // namespace ConcurrentTask } // namespace OHOS diff --git a/frameworks/concurrent_task_client/src/concurrent_task_client.cpp b/frameworks/concurrent_task_client/src/concurrent_task_client.cpp index 7418493de5d0c39828720875fbd8ce59fa1f1dfe..858694a60fbf04591da3898dfd9d1466b4f5e719 100644 --- a/frameworks/concurrent_task_client/src/concurrent_task_client.cpp +++ b/frameworks/concurrent_task_client/src/concurrent_task_client.cpp @@ -67,6 +67,19 @@ void ConcurrentTaskClient::QueryDeadline(int queryItem, DeadlineReply& ddlReply, return; } +void ConcurrentTaskClient::RequestAuth(const std::unordered_map& mapPayload) +{ + if (TryConnect() != ERR_OK) { + return; + } + Json::Value payload; + for (auto it = mapPayload.begin(); it != mapPayload.end(); ++it) { + payload[it->first] = it->second; + } + clientService_->RequestAuth(payload); + return; +} + ErrCode ConcurrentTaskClient::TryConnect() { std::lock_guard lock(mutex_); diff --git a/frameworks/concurrent_task_client/src/concurrent_task_service_proxy.cpp b/frameworks/concurrent_task_client/src/concurrent_task_service_proxy.cpp index 46eb020685f880eb4e63c14d25bd92f59c95a2ed..959c918b2ca73495b7866283750f0d2ebaaecec5 100644 --- a/frameworks/concurrent_task_client/src/concurrent_task_service_proxy.cpp +++ b/frameworks/concurrent_task_client/src/concurrent_task_service_proxy.cpp @@ -100,5 +100,28 @@ void ConcurrentTaskServiceProxy::QueryDeadline(int queryItem, DeadlineReply& ddl } CONCUR_LOGD("ConcurrentTaskServiceProxy::QueryDeadline success."); } + +void ConcurrentTaskServiceProxy::RequestAuth(const Json::Value& payload) +{ + int32_t error; + MessageParcel data; + MessageParcel reply; + MessageOption option = { MessageOption::TF_SYNC }; + if (!data.WriteInterfaceToken(ConcurrentTaskServiceProxy::GetDescriptor())) { + CONCUR_LOGE("Write interface token failed in RequestAuth Proxy"); + return; + } + if (!data.WriteString(payload.toStyledString())) { + CONCUR_LOGE("Write info failed in RequestAuth Proxy"); + return; + } + uint32_t code = static_cast(ConcurrentTaskInterfaceCode::REQUEST_AUTH); + error = Remote()->SendRequest(code, data, reply, option); + if (error != NO_ERROR) { + CONCUR_LOGE("Send request error: %{public}d", error); + return; + } + CONCUR_LOGD("ConcurrentTaskServiceProxy::RequestAuth success."); +} } // namespace ConcurrentTask } // namespace OHOS diff --git a/interfaces/inner_api/concurrent_task_client.h b/interfaces/inner_api/concurrent_task_client.h index f867391f24dfd62b2e9d2339b3033cd64964895b..603667d870e2f5664363c2b01c7cfbe0f25e7d78 100644 --- a/interfaces/inner_api/concurrent_task_client.h +++ b/interfaces/inner_api/concurrent_task_client.h @@ -55,9 +55,22 @@ public: */ void QueryInterval(int queryItem, IntervalReply& queryRs); + /** + * @brief Query rtg id and other info provided by concurrent task service. + * + * @param queryItem Information of the corresponding query module. + * @param ddlReply Indicates the setStatus of rate. + * @param mapPayload Indicates the context info of the frame rate data. + */ void QueryDeadline(int queryItem, DeadlineReply& ddlReply, const std::unordered_map& mapPayload); + /** + * @brief Report auth request data to the concurrent task service. + * + * @param mapPayload Indicates the context info of the auth request data. + */ + void RequestAuth(const std::unordered_map& mapPayload); /** * @brief Stop remote object and reset ConcurrentTaskClient. */ diff --git a/services/include/concurrent_task_controller.h b/services/include/concurrent_task_controller.h index 5cfc39aab5665f18e4b11255d87f66ec0eb1c46b..97cf3d04a26845bafbd7666a085391a36fd6d279 100644 --- a/services/include/concurrent_task_controller.h +++ b/services/include/concurrent_task_controller.h @@ -37,6 +37,7 @@ public: void ReportData(uint32_t resType, int64_t value, const Json::Value& payload); void QueryInterval(int queryItem, IntervalReply& queryRs); void QueryDeadline(int queryItem, DeadlineReply& ddlReply, const Json::Value& payload); + void RequestAuth(const Json::Value& payload); void Init(); void Release(); int CreateNewRtgGrp(int prioType, int rtNum); @@ -83,6 +84,7 @@ private: const std::string RENDER_SERVICE_PROCESS_NAME = "render_service"; const std::string RESOURCE_SCHEDULE_PROCESS_NAME = "resource_schedule_service"; + const std::string MEDIA_SERVICE_PROCESS_NAME = "media_service"; }; class ForegroundAppRecord { diff --git a/services/include/concurrent_task_service.h b/services/include/concurrent_task_service.h index 6eac2e19909fead7a1c19bd076ee7057be34c9d1..28b792bad188c714ee2e48d1d4a4ccc894cef363 100644 --- a/services/include/concurrent_task_service.h +++ b/services/include/concurrent_task_service.h @@ -29,6 +29,7 @@ public: void ReportData(uint32_t resType, int64_t value, const Json::Value& payload) override; void QueryInterval(int queryItem, IntervalReply& queryRs) override; void QueryDeadline(int queryItem, DeadlineReply& ddlReply, const Json::Value& payload) override; + void RequestAuth(const Json::Value& payload) override; private: DISALLOW_COPY_AND_MOVE(ConcurrentTaskService); }; diff --git a/services/include/concurrent_task_service_stub.h b/services/include/concurrent_task_service_stub.h index cbdc0980a3ca730ff7c748be8a4b39379665d4b5..4da67574c9d5ea5ef84d2e4e5ba56c74862b7858 100644 --- a/services/include/concurrent_task_service_stub.h +++ b/services/include/concurrent_task_service_stub.h @@ -33,6 +33,7 @@ private: int32_t ReportDataInner(MessageParcel& data, MessageParcel& reply); int32_t QueryIntervalInner(MessageParcel& data, MessageParcel& reply); int32_t QueryDeadlineInner(MessageParcel& data, MessageParcel& reply); + int32_t RequestAuthInner(MessageParcel& data, MessageParcel& reply); Json::Value StringToJson(const std::string& str); void Init(); diff --git a/services/src/concurrent_task_controller.cpp b/services/src/concurrent_task_controller.cpp index d8639e2b3d18ca419beae00aa17cf3e0005c794c..fcff9ac70ad755f33fef2946f47b181231c6d43d 100644 --- a/services/src/concurrent_task_controller.cpp +++ b/services/src/concurrent_task_controller.cpp @@ -52,6 +52,17 @@ TaskController& TaskController::GetInstance() return instance; } +void TaskController::RequestAuth(const Json::Value& payload) +{ + pid_t uid = IPCSkeleton::GetInstance().GetCallingUid(); + if (GetProcessNameByToken() != MEDIA_SERVICE_PROCESS_NAME) { + CONCUR_LOGE("Invalid uid %{public}d, only media service can call RequestAuth", uid); + return; + } + pid_t pid = IPCSkeleton::GetInstance().GetCallingPid(); + AuthSystemProcess(pid); +} + void TaskController::ReportData(uint32_t resType, int64_t value, const Json::Value& payload) { pid_t uid = IPCSkeleton::GetInstance().GetCallingUid(); diff --git a/services/src/concurrent_task_service.cpp b/services/src/concurrent_task_service.cpp index 23b6480ce93474399c81e0c1c9ec7decb3cd7c7d..4302e894c7672d31caf19777e0cafae8761e79c7 100644 --- a/services/src/concurrent_task_service.cpp +++ b/services/src/concurrent_task_service.cpp @@ -32,5 +32,11 @@ void ConcurrentTaskService::QueryDeadline(int queryItem, DeadlineReply& queryRs, { TaskController::GetInstance().QueryDeadline(queryItem, queryRs, payload); } + +void ConcurrentTaskService::RequestAuth(const Json::Value& payload) +{ + TaskController::GetInstance().RequestAuth(payload); +} + } // namespace ConcurrentTask } // namespace OHOS diff --git a/services/src/concurrent_task_service_stub.cpp b/services/src/concurrent_task_service_stub.cpp index 151c354201951f0557ee0f0c27c7fb0e0755eb83..1a1e13446bb03dcd3bb1b9f3578112716f4556b7 100644 --- a/services/src/concurrent_task_service_stub.cpp +++ b/services/src/concurrent_task_service_stub.cpp @@ -103,6 +103,24 @@ int32_t ConcurrentTaskServiceStub::QueryDeadlineInner(MessageParcel& data, [[may return ERR_OK; } +int32_t ConcurrentTaskServiceStub::RequestAuthInner(MessageParcel& data, [[maybe_unused]] MessageParcel& reply) +{ + if (!IsValidToken(data)) { + return ERR_CONCURRENT_TASK_PARCEL_ERROR; + } + + std::string payload; + if (!data.ReadString(payload)) { + CONCUR_LOGE("Read info failed in RequestAuth Stub"); + return IPC_STUB_ERR; + } + if (payload.empty()) { + return ERR_OK; + } + RequestAuth(StringToJson(payload)); + return ERR_OK; +} + int32_t ConcurrentTaskServiceStub::OnRemoteRequest(uint32_t code, MessageParcel& data, MessageParcel& reply, MessageOption& option) { @@ -153,6 +171,8 @@ void ConcurrentTaskServiceStub::Init() [this](auto& data, auto& reply) {return QueryIntervalInner(data, reply); } }, { static_cast(ConcurrentTaskInterfaceCode::QUERY_DEADLINE), [this](auto& data, auto& reply) {return QueryDeadlineInner(data, reply); } }, + { static_cast(ConcurrentTaskInterfaceCode::REQUEST_AUTH), + [this](auto& data, auto& reply) {return RequestAuthInner(data, reply); } }, }; } } // namespace ResourceSchedule diff --git a/test/fuzztest/concurrent_fuzzer/concurrent_fuzzer.cpp b/test/fuzztest/concurrent_fuzzer/concurrent_fuzzer.cpp index 19b9463ad533a7050e2260e57733d8f15bd9dc30..c7394fcf750939f60b074e293e4b00dcb14dc4fa 100644 --- a/test/fuzztest/concurrent_fuzzer/concurrent_fuzzer.cpp +++ b/test/fuzztest/concurrent_fuzzer/concurrent_fuzzer.cpp @@ -140,6 +140,30 @@ bool FuzzConcurrentTaskServiceQueryDeadline(const uint8_t* data, size_t size) return true; } +bool FuzzConcurrentTaskServiceRequestAuth(const uint8_t* data, size_t size) +{ + g_baseFuzzData = data; + g_baseFuzzSize = size; + g_baseFuzzPos = 0; + if (size > sizeof(int) + sizeof(int)) { + MessageParcel data1; + Parcel parcel; + sptr iremoteobject = IRemoteObject::Unmarshalling(parcel); + int intdata = GetData(); + void *voiddata = &intdata; + size_t size1 = sizeof(int); + data1.WriteRemoteObject(iremoteobject); + data1.WriteRawData(voiddata, size1); + data1.ReadRawData(size1); + MessageParcel reply; + MessageOption option; + uint32_t code = static_cast(ConcurrentTaskInterfaceCode::REQUEST_AUTH); + ConcurrentTaskService s = ConcurrentTaskService(); + s.OnRemoteRequest(code, data1, reply, option); + } + return true; +} + bool FuzzConcurrentTaskServiceStopRemoteObject(const uint8_t* data, size_t size) { g_baseFuzzData = data; @@ -220,6 +244,7 @@ extern "C" int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size) /* Run your code on data */ OHOS::FuzzConcurrentTaskTryConnect(data, size); OHOS::FuzzConcurrentTaskServiceReportData(data, size); + OHOS::FuzzConcurrentTaskServiceRequestAuth(data, size); OHOS::FuzzConcurrentTaskServiceQueryInterval(data, size); OHOS::FuzzConcurrentTaskServiceStopRemoteObject(data, size); OHOS::FuzzConcurrentTaskServiceSetThreadQos(data, size); diff --git a/test/unittest/phone/concurrent_task_client_test.cpp b/test/unittest/phone/concurrent_task_client_test.cpp index 6fb545312375bd44cb3c92eb3ccd0e9a10cc6acc..69367b5e2da930883dbf2d5f5f00e048f4e11854 100644 --- a/test/unittest/phone/concurrent_task_client_test.cpp +++ b/test/unittest/phone/concurrent_task_client_test.cpp @@ -99,5 +99,18 @@ HWTEST_F(ConcurrentTaskClientTest, QueryDeadlineTest, TestSize.Level1) payload[2222] = 90; ConcurrentTaskClient::GetInstance().QueryDeadline(queryItem, ddlReply, payload); } + +/** + * @tc.name: RequestAuthTest + * @tc.desc: Test whether the RequestAuth interface are normal. + * @tc.type: FUNC +*/ +HWTEST_F(ConcurrentTaskClientTest, RequestAuthTest, TestSize.Level1) +{ + std::unordered_map payload; + payload["uid"] = "3587"; + payload["pid"] = "12345"; + ConcurrentTaskClient::GetInstance().RequestAuth(payload); +} } } \ No newline at end of file