18e745fdaSopenharmony_ci/*
28e745fdaSopenharmony_ci * Copyright (c) 2024 Huawei Device Co., Ltd.
38e745fdaSopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License");
48e745fdaSopenharmony_ci * you may not use this file except in compliance with the License.
58e745fdaSopenharmony_ci * You may obtain a copy of the License at
68e745fdaSopenharmony_ci *
78e745fdaSopenharmony_ci * http://www.apache.org/licenses/LICENSE-2.0
88e745fdaSopenharmony_ci *
98e745fdaSopenharmony_ci * Unless required by applicable law or agreed to in writing, software
108e745fdaSopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS,
118e745fdaSopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
128e745fdaSopenharmony_ci * See the License for the specific language governing permissions and
138e745fdaSopenharmony_ci * limitations under the License.
148e745fdaSopenharmony_ci */
158e745fdaSopenharmony_ci
168e745fdaSopenharmony_ci#include <arpa/inet.h>
178e745fdaSopenharmony_ci#include <sys/socket.h>
188e745fdaSopenharmony_ci
198e745fdaSopenharmony_ci#include "errors.h"
208e745fdaSopenharmony_ci#include "hilog/log.h"
218e745fdaSopenharmony_ci#include "ipc_object_stub.h"
228e745fdaSopenharmony_ci#include "ipc_types.h"
238e745fdaSopenharmony_ci#include "message_parcel.h"
248e745fdaSopenharmony_ci#include "netfirewall_hisysevent.h"
258e745fdaSopenharmony_ci#include "netmanager_base_common_utils.h"
268e745fdaSopenharmony_ci#include "netmanager_base_permission.h"
278e745fdaSopenharmony_ci#include "netmgr_ext_log_wrapper.h"
288e745fdaSopenharmony_ci#include "netfirewall_stub.h"
298e745fdaSopenharmony_ci
308e745fdaSopenharmony_cinamespace OHOS {
318e745fdaSopenharmony_cinamespace NetManagerStandard {
328e745fdaSopenharmony_cinamespace {
338e745fdaSopenharmony_ciconst std::string PERMISSION_MANAGE_NET_FIREWALL = "ohos.permission.MANAGE_NET_FIREWALL";
348e745fdaSopenharmony_ciconst std::string PERMISSION_GET_NET_FIREWALL = "ohos.permission.GET_NET_FIREWALL";
358e745fdaSopenharmony_ci}
368e745fdaSopenharmony_ciNetFirewallStub::NetFirewallStub()
378e745fdaSopenharmony_ci{
388e745fdaSopenharmony_ci    memberFuncMap_[static_cast<uint32_t>(SET_NET_FIREWALL_STATUS)] = {PERMISSION_MANAGE_NET_FIREWALL,
398e745fdaSopenharmony_ci                                                                      &NetFirewallStub::OnSetNetFirewallPolicy};
408e745fdaSopenharmony_ci    memberFuncMap_[static_cast<uint32_t>(GET_NET_FIREWALL_STATUS)] = {PERMISSION_GET_NET_FIREWALL,
418e745fdaSopenharmony_ci                                                                      &NetFirewallStub::OnGetNetFirewallPolicy};
428e745fdaSopenharmony_ci    memberFuncMap_[static_cast<uint32_t>(ADD_NET_FIREWALL_RULE)] = {PERMISSION_MANAGE_NET_FIREWALL,
438e745fdaSopenharmony_ci                                                                    &NetFirewallStub::OnAddNetFirewallRule};
448e745fdaSopenharmony_ci    memberFuncMap_[static_cast<uint32_t>(UPDATE_NET_FIREWALL_RULE)] = {PERMISSION_MANAGE_NET_FIREWALL,
458e745fdaSopenharmony_ci                                                                       &NetFirewallStub::OnUpdateNetFirewallRule};
468e745fdaSopenharmony_ci    memberFuncMap_[static_cast<uint32_t>(DELETE_NET_FIREWALL_RULE)] = {PERMISSION_MANAGE_NET_FIREWALL,
478e745fdaSopenharmony_ci                                                                       &NetFirewallStub::OnDeleteNetFirewallRule};
488e745fdaSopenharmony_ci    memberFuncMap_[static_cast<uint32_t>(GET_ALL_NET_FIREWALL_RULES)] = {PERMISSION_GET_NET_FIREWALL,
498e745fdaSopenharmony_ci                                                                        &NetFirewallStub::OnGetNetFirewallRules};
508e745fdaSopenharmony_ci    memberFuncMap_[static_cast<uint32_t>(GET_NET_FIREWALL_RULE)] = {PERMISSION_GET_NET_FIREWALL,
518e745fdaSopenharmony_ci                                                                    &NetFirewallStub::OnGetNetFirewallRule};
528e745fdaSopenharmony_ci    memberFuncMap_[static_cast<uint32_t>(GET_ALL_INTERCEPT_RECORDS)] = {PERMISSION_GET_NET_FIREWALL,
538e745fdaSopenharmony_ci                                                                       &NetFirewallStub::OnGetInterceptRecords};
548e745fdaSopenharmony_ci}
558e745fdaSopenharmony_ci
568e745fdaSopenharmony_ciint32_t NetFirewallStub::CheckFirewallPermission(std::string &strPermission)
578e745fdaSopenharmony_ci{
588e745fdaSopenharmony_ci    if (!strPermission.empty() && !NetManagerPermission::CheckPermission(strPermission)) {
598e745fdaSopenharmony_ci        NETMGR_EXT_LOG_E("Permission denied permission: %{public}s", strPermission.c_str());
608e745fdaSopenharmony_ci        return FIREWALL_ERR_PERMISSION_DENIED;
618e745fdaSopenharmony_ci    }
628e745fdaSopenharmony_ci    return FIREWALL_SUCCESS;
638e745fdaSopenharmony_ci}
648e745fdaSopenharmony_ci
658e745fdaSopenharmony_ciint32_t NetFirewallStub::OnRemoteRequest(uint32_t code, MessageParcel &data, MessageParcel &reply,
668e745fdaSopenharmony_ci    MessageOption &option)
678e745fdaSopenharmony_ci{
688e745fdaSopenharmony_ci    std::u16string myDescripter = NetFirewallStub::GetDescriptor();
698e745fdaSopenharmony_ci    std::u16string remoteDescripter = data.ReadInterfaceToken();
708e745fdaSopenharmony_ci    if (myDescripter != remoteDescripter) {
718e745fdaSopenharmony_ci        NETMGR_EXT_LOG_E("descriptor checked fail");
728e745fdaSopenharmony_ci        return NETMANAGER_EXT_ERR_DESCRIPTOR_MISMATCH;
738e745fdaSopenharmony_ci    }
748e745fdaSopenharmony_ci    auto itFunc = memberFuncMap_.find(code);
758e745fdaSopenharmony_ci    if (itFunc != memberFuncMap_.end()) {
768e745fdaSopenharmony_ci        NETMGR_EXT_LOG_I("enter OnRemoteRequest code %{public}d:", code);
778e745fdaSopenharmony_ci        int32_t checkResult = CheckFirewallPermission(itFunc->second.strPermission);
788e745fdaSopenharmony_ci        if (checkResult != FIREWALL_SUCCESS) {
798e745fdaSopenharmony_ci            return checkResult;
808e745fdaSopenharmony_ci        }
818e745fdaSopenharmony_ci        auto serviceFunc = itFunc->second.serviceFunc;
828e745fdaSopenharmony_ci        if (serviceFunc != nullptr) {
838e745fdaSopenharmony_ci            return (this->*serviceFunc)(data, reply);
848e745fdaSopenharmony_ci        }
858e745fdaSopenharmony_ci    }
868e745fdaSopenharmony_ci    return IPCObjectStub::OnRemoteRequest(code, data, reply, option);
878e745fdaSopenharmony_ci}
888e745fdaSopenharmony_ci
898e745fdaSopenharmony_ciint32_t NetFirewallStub::OnSetNetFirewallPolicy(MessageParcel &data, MessageParcel &reply)
908e745fdaSopenharmony_ci{
918e745fdaSopenharmony_ci    int32_t userId;
928e745fdaSopenharmony_ci    if (!data.ReadInt32(userId)) {
938e745fdaSopenharmony_ci        return NETMANAGER_EXT_ERR_READ_DATA_FAIL;
948e745fdaSopenharmony_ci    }
958e745fdaSopenharmony_ci    if (userId <= 0) {
968e745fdaSopenharmony_ci        NETMGR_EXT_LOG_E("Parameter error.");
978e745fdaSopenharmony_ci        return FIREWALL_ERR_INVALID_PARAMETER;
988e745fdaSopenharmony_ci    }
998e745fdaSopenharmony_ci    sptr<NetFirewallPolicy> status = NetFirewallPolicy::Unmarshalling(data);
1008e745fdaSopenharmony_ci    if (status == nullptr) {
1018e745fdaSopenharmony_ci        NETMGR_EXT_LOG_E("status is nullptr.");
1028e745fdaSopenharmony_ci        return FIREWALL_ERR_INTERNAL;
1038e745fdaSopenharmony_ci    }
1048e745fdaSopenharmony_ci
1058e745fdaSopenharmony_ci    return SetNetFirewallPolicy(userId, status);
1068e745fdaSopenharmony_ci}
1078e745fdaSopenharmony_ci
1088e745fdaSopenharmony_ciint32_t NetFirewallStub::OnGetNetFirewallPolicy(MessageParcel &data, MessageParcel &reply)
1098e745fdaSopenharmony_ci{
1108e745fdaSopenharmony_ci    int32_t userId;
1118e745fdaSopenharmony_ci    if (!data.ReadInt32(userId)) {
1128e745fdaSopenharmony_ci        return NETMANAGER_EXT_ERR_READ_DATA_FAIL;
1138e745fdaSopenharmony_ci    }
1148e745fdaSopenharmony_ci    if (userId <= 0) {
1158e745fdaSopenharmony_ci        NETMGR_EXT_LOG_E("Parameter error.");
1168e745fdaSopenharmony_ci        return FIREWALL_ERR_INVALID_PARAMETER;
1178e745fdaSopenharmony_ci    }
1188e745fdaSopenharmony_ci    sptr<NetFirewallPolicy> status = new (std::nothrow) NetFirewallPolicy();
1198e745fdaSopenharmony_ci    int32_t ret = GetNetFirewallPolicy(userId, status);
1208e745fdaSopenharmony_ci    if (ret == FIREWALL_SUCCESS) {
1218e745fdaSopenharmony_ci        if (!status->Marshalling(reply)) {
1228e745fdaSopenharmony_ci            return NETMANAGER_EXT_ERR_WRITE_REPLY_FAIL;
1238e745fdaSopenharmony_ci        }
1248e745fdaSopenharmony_ci    }
1258e745fdaSopenharmony_ci    return ret;
1268e745fdaSopenharmony_ci}
1278e745fdaSopenharmony_ci
1288e745fdaSopenharmony_ciint32_t NetFirewallStub::OnAddNetFirewallRule(MessageParcel &data, MessageParcel &reply)
1298e745fdaSopenharmony_ci{
1308e745fdaSopenharmony_ci    sptr<NetFirewallRule> rule = NetFirewallRule::Unmarshalling(data);
1318e745fdaSopenharmony_ci    if (rule == nullptr) {
1328e745fdaSopenharmony_ci        NETMGR_EXT_LOG_E("rule is nullptr.");
1338e745fdaSopenharmony_ci        return FIREWALL_ERR_INTERNAL;
1348e745fdaSopenharmony_ci    }
1358e745fdaSopenharmony_ci    if (rule->userId <= 0) {
1368e745fdaSopenharmony_ci        NETMGR_EXT_LOG_E("Parameter error.");
1378e745fdaSopenharmony_ci        return FIREWALL_ERR_INVALID_PARAMETER;
1388e745fdaSopenharmony_ci    }
1398e745fdaSopenharmony_ci    if (rule->ruleName.empty() || rule->ruleName.size() > MAX_RULE_NAME_LEN ||
1408e745fdaSopenharmony_ci        rule->ruleDescription.size() > MAX_RULE_DESCRIPTION_LEN) {
1418e745fdaSopenharmony_ci        NETMANAGER_EXT_LOGE("rule name or description is too long");
1428e745fdaSopenharmony_ci        return FIREWALL_ERR_INVALID_PARAMETER;
1438e745fdaSopenharmony_ci    }
1448e745fdaSopenharmony_ci    if (rule->localIps.size() > MAX_RULE_IP_COUNT || rule->remoteIps.size() > MAX_RULE_IP_COUNT) {
1458e745fdaSopenharmony_ci        NETMGR_EXT_LOG_E("ip invalid, size is too long.");
1468e745fdaSopenharmony_ci        return FIREWALL_ERR_EXCEED_MAX_IP;
1478e745fdaSopenharmony_ci    }
1488e745fdaSopenharmony_ci
1498e745fdaSopenharmony_ci    if (rule->localPorts.size() > MAX_RULE_PORT_COUNT || rule->remotePorts.size() > MAX_RULE_PORT_COUNT) {
1508e745fdaSopenharmony_ci        NETMGR_EXT_LOG_E("port invalid, size is too long.");
1518e745fdaSopenharmony_ci        return FIREWALL_ERR_EXCEED_MAX_PORT;
1528e745fdaSopenharmony_ci    }
1538e745fdaSopenharmony_ci
1548e745fdaSopenharmony_ci    if (rule->domains.size() > MAX_RULE_DOMAIN_COUNT) {
1558e745fdaSopenharmony_ci        NETMGR_EXT_LOG_E("domain invalid, size is too long.");
1568e745fdaSopenharmony_ci        return FIREWALL_ERR_EXCEED_MAX_DOMAIN;
1578e745fdaSopenharmony_ci    }
1588e745fdaSopenharmony_ci
1598e745fdaSopenharmony_ci    int32_t result = 0;
1608e745fdaSopenharmony_ci    int32_t ret = AddNetFirewallRule(rule, result);
1618e745fdaSopenharmony_ci    if (ret == FIREWALL_SUCCESS) {
1628e745fdaSopenharmony_ci        if (!reply.WriteUint32(result)) {
1638e745fdaSopenharmony_ci            ret = NETMANAGER_EXT_ERR_WRITE_REPLY_FAIL;
1648e745fdaSopenharmony_ci        }
1658e745fdaSopenharmony_ci    }
1668e745fdaSopenharmony_ci    NetFirewallHisysEvent::SendFirewallConfigReport(rule->userId, ret);
1678e745fdaSopenharmony_ci    return ret;
1688e745fdaSopenharmony_ci}
1698e745fdaSopenharmony_ci
1708e745fdaSopenharmony_ciint32_t NetFirewallStub::OnUpdateNetFirewallRule(MessageParcel &data, MessageParcel &reply)
1718e745fdaSopenharmony_ci{
1728e745fdaSopenharmony_ci    sptr<NetFirewallRule> rule = NetFirewallRule::Unmarshalling(data);
1738e745fdaSopenharmony_ci    if (rule == nullptr) {
1748e745fdaSopenharmony_ci        NETMGR_EXT_LOG_E("rule is nullptr.");
1758e745fdaSopenharmony_ci        return FIREWALL_ERR_INTERNAL;
1768e745fdaSopenharmony_ci    }
1778e745fdaSopenharmony_ci    if (rule->userId <= 0) {
1788e745fdaSopenharmony_ci        NETMGR_EXT_LOG_E("Parameter error.");
1798e745fdaSopenharmony_ci        return FIREWALL_ERR_INVALID_PARAMETER;
1808e745fdaSopenharmony_ci    }
1818e745fdaSopenharmony_ci    if (rule->ruleName.empty() || rule->ruleName.size() > MAX_RULE_NAME_LEN ||
1828e745fdaSopenharmony_ci        rule->ruleDescription.size() > MAX_RULE_DESCRIPTION_LEN) {
1838e745fdaSopenharmony_ci        NETMANAGER_EXT_LOGE("rule name or description is too long");
1848e745fdaSopenharmony_ci        return FIREWALL_ERR_INVALID_PARAMETER;
1858e745fdaSopenharmony_ci    }
1868e745fdaSopenharmony_ci    if (rule->localIps.size() > MAX_RULE_IP_COUNT || rule->remoteIps.size() > MAX_RULE_IP_COUNT) {
1878e745fdaSopenharmony_ci        NETMGR_EXT_LOG_E("ip invalid, size is too long.");
1888e745fdaSopenharmony_ci        return FIREWALL_ERR_EXCEED_MAX_IP;
1898e745fdaSopenharmony_ci    }
1908e745fdaSopenharmony_ci
1918e745fdaSopenharmony_ci    if (rule->localPorts.size() > MAX_RULE_PORT_COUNT || rule->remotePorts.size() > MAX_RULE_PORT_COUNT) {
1928e745fdaSopenharmony_ci        NETMGR_EXT_LOG_E("port invalid, size is too long.");
1938e745fdaSopenharmony_ci        return FIREWALL_ERR_EXCEED_MAX_PORT;
1948e745fdaSopenharmony_ci    }
1958e745fdaSopenharmony_ci
1968e745fdaSopenharmony_ci    if (rule->domains.size() > MAX_RULE_DOMAIN_COUNT) {
1978e745fdaSopenharmony_ci        NETMGR_EXT_LOG_E("domain invalid, size is too long.");
1988e745fdaSopenharmony_ci        return FIREWALL_ERR_EXCEED_MAX_DOMAIN;
1998e745fdaSopenharmony_ci    }
2008e745fdaSopenharmony_ci
2018e745fdaSopenharmony_ci    int32_t ret = UpdateNetFirewallRule(rule);
2028e745fdaSopenharmony_ci    NetFirewallHisysEvent::SendFirewallConfigReport(rule->userId, ret);
2038e745fdaSopenharmony_ci    return ret;
2048e745fdaSopenharmony_ci}
2058e745fdaSopenharmony_ci
2068e745fdaSopenharmony_ciint32_t NetFirewallStub::OnDeleteNetFirewallRule(MessageParcel &data, MessageParcel &reply)
2078e745fdaSopenharmony_ci{
2088e745fdaSopenharmony_ci    int32_t userId;
2098e745fdaSopenharmony_ci    if (!data.ReadInt32(userId)) {
2108e745fdaSopenharmony_ci        return NETMANAGER_EXT_ERR_READ_DATA_FAIL;
2118e745fdaSopenharmony_ci    }
2128e745fdaSopenharmony_ci    if (userId <= 0) {
2138e745fdaSopenharmony_ci        NETMGR_EXT_LOG_E("Parameter error.");
2148e745fdaSopenharmony_ci        return FIREWALL_ERR_INVALID_PARAMETER;
2158e745fdaSopenharmony_ci    }
2168e745fdaSopenharmony_ci    int32_t ruleId;
2178e745fdaSopenharmony_ci    if (!data.ReadInt32(ruleId)) {
2188e745fdaSopenharmony_ci        return NETMANAGER_EXT_ERR_READ_DATA_FAIL;
2198e745fdaSopenharmony_ci    }
2208e745fdaSopenharmony_ci    if (ruleId <= 0) {
2218e745fdaSopenharmony_ci        NETMGR_EXT_LOG_E("Parameter error.");
2228e745fdaSopenharmony_ci        return FIREWALL_ERR_INVALID_PARAMETER;
2238e745fdaSopenharmony_ci    }
2248e745fdaSopenharmony_ci    int32_t ret = DeleteNetFirewallRule(userId, ruleId);
2258e745fdaSopenharmony_ci    NetFirewallHisysEvent::SendFirewallRequestReport(userId, ret);
2268e745fdaSopenharmony_ci    return ret;
2278e745fdaSopenharmony_ci}
2288e745fdaSopenharmony_ci
2298e745fdaSopenharmony_ciint32_t NetFirewallStub::OnGetNetFirewallRules(MessageParcel &data, MessageParcel &reply)
2308e745fdaSopenharmony_ci{
2318e745fdaSopenharmony_ci    int32_t userId;
2328e745fdaSopenharmony_ci    if (!data.ReadInt32(userId)) {
2338e745fdaSopenharmony_ci        return NETMANAGER_EXT_ERR_READ_DATA_FAIL;
2348e745fdaSopenharmony_ci    }
2358e745fdaSopenharmony_ci    if (userId <= 0) {
2368e745fdaSopenharmony_ci        NETMGR_EXT_LOG_E("Parameter error.");
2378e745fdaSopenharmony_ci        return FIREWALL_ERR_INVALID_PARAMETER;
2388e745fdaSopenharmony_ci    }
2398e745fdaSopenharmony_ci    sptr<RequestParam> param = RequestParam::Unmarshalling(data);
2408e745fdaSopenharmony_ci    if (param == nullptr) {
2418e745fdaSopenharmony_ci        NETMGR_EXT_LOG_E("param is nullptr.");
2428e745fdaSopenharmony_ci        return FIREWALL_ERR_INTERNAL;
2438e745fdaSopenharmony_ci    }
2448e745fdaSopenharmony_ci    if (param->page < 1 || param->page > FIREWALL_USER_MAX_RULE || param->pageSize < 1 ||
2458e745fdaSopenharmony_ci        param->pageSize > static_cast<int32_t>(MAX_PAGE_SIZE)) {
2468e745fdaSopenharmony_ci        NETMANAGER_EXT_LOGE("ParsePageParam page or pageSize is error");
2478e745fdaSopenharmony_ci        return FIREWALL_ERR_INVALID_PARAMETER;
2488e745fdaSopenharmony_ci    }
2498e745fdaSopenharmony_ci    sptr<FirewallRulePage> info = new (std::nothrow) FirewallRulePage();
2508e745fdaSopenharmony_ci    int32_t ret = GetNetFirewallRules(userId, param, info);
2518e745fdaSopenharmony_ci    if (ret == FIREWALL_SUCCESS) {
2528e745fdaSopenharmony_ci        if (!info->Marshalling(reply)) {
2538e745fdaSopenharmony_ci            return NETMANAGER_EXT_ERR_WRITE_REPLY_FAIL;
2548e745fdaSopenharmony_ci        }
2558e745fdaSopenharmony_ci    }
2568e745fdaSopenharmony_ci    NetFirewallHisysEvent::SendFirewallRequestReport(userId, ret);
2578e745fdaSopenharmony_ci    return ret;
2588e745fdaSopenharmony_ci}
2598e745fdaSopenharmony_ci
2608e745fdaSopenharmony_ciint32_t NetFirewallStub::OnGetNetFirewallRule(MessageParcel &data, MessageParcel &reply)
2618e745fdaSopenharmony_ci{
2628e745fdaSopenharmony_ci    int32_t userId;
2638e745fdaSopenharmony_ci    if (!data.ReadInt32(userId)) {
2648e745fdaSopenharmony_ci        return NETMANAGER_EXT_ERR_READ_DATA_FAIL;
2658e745fdaSopenharmony_ci    }
2668e745fdaSopenharmony_ci    int32_t ruleId;
2678e745fdaSopenharmony_ci    if (!data.ReadInt32(ruleId)) {
2688e745fdaSopenharmony_ci        return NETMANAGER_EXT_ERR_READ_DATA_FAIL;
2698e745fdaSopenharmony_ci    }
2708e745fdaSopenharmony_ci    if (userId <= 0 || ruleId <= 0) {
2718e745fdaSopenharmony_ci        NETMGR_EXT_LOG_E("Parameter error.");
2728e745fdaSopenharmony_ci        return FIREWALL_ERR_INVALID_PARAMETER;
2738e745fdaSopenharmony_ci    }
2748e745fdaSopenharmony_ci    sptr<NetFirewallRule> rule = new (std::nothrow) NetFirewallRule();
2758e745fdaSopenharmony_ci    int32_t ret = GetNetFirewallRule(userId, ruleId, rule);
2768e745fdaSopenharmony_ci    if (ret == FIREWALL_SUCCESS) {
2778e745fdaSopenharmony_ci        if (!rule->Marshalling(reply)) {
2788e745fdaSopenharmony_ci            return NETMANAGER_EXT_ERR_WRITE_REPLY_FAIL;
2798e745fdaSopenharmony_ci        }
2808e745fdaSopenharmony_ci    }
2818e745fdaSopenharmony_ci    NetFirewallHisysEvent::SendFirewallRequestReport(userId, ret);
2828e745fdaSopenharmony_ci    return ret;
2838e745fdaSopenharmony_ci}
2848e745fdaSopenharmony_ci
2858e745fdaSopenharmony_ciint32_t NetFirewallStub::OnGetInterceptRecords(MessageParcel &data, MessageParcel &reply)
2868e745fdaSopenharmony_ci{
2878e745fdaSopenharmony_ci    int32_t userId;
2888e745fdaSopenharmony_ci    if (!data.ReadInt32(userId)) {
2898e745fdaSopenharmony_ci        return NETMANAGER_EXT_ERR_READ_DATA_FAIL;
2908e745fdaSopenharmony_ci    }
2918e745fdaSopenharmony_ci    if (userId <= 0) {
2928e745fdaSopenharmony_ci        NETMGR_EXT_LOG_E("Parameter error.");
2938e745fdaSopenharmony_ci        return FIREWALL_ERR_INVALID_PARAMETER;
2948e745fdaSopenharmony_ci    }
2958e745fdaSopenharmony_ci    sptr<RequestParam> param = RequestParam::Unmarshalling(data);
2968e745fdaSopenharmony_ci    if (param == nullptr) {
2978e745fdaSopenharmony_ci        NETMGR_EXT_LOG_E("param is nullptr.");
2988e745fdaSopenharmony_ci        return FIREWALL_ERR_INTERNAL;
2998e745fdaSopenharmony_ci    }
3008e745fdaSopenharmony_ci    if (param->page < 1 || param->page > FIREWALL_USER_MAX_RULE || param->pageSize < 1 ||
3018e745fdaSopenharmony_ci        param->pageSize > static_cast<int32_t>(MAX_PAGE_SIZE)) {
3028e745fdaSopenharmony_ci        NETMANAGER_EXT_LOGE("ParsePageParam page or pageSize is error");
3038e745fdaSopenharmony_ci        return FIREWALL_ERR_INVALID_PARAMETER;
3048e745fdaSopenharmony_ci    }
3058e745fdaSopenharmony_ci    sptr<InterceptRecordPage> info = new (std::nothrow) InterceptRecordPage();
3068e745fdaSopenharmony_ci    int32_t ret = GetInterceptRecords(userId, param, info);
3078e745fdaSopenharmony_ci    if (ret == FIREWALL_SUCCESS) {
3088e745fdaSopenharmony_ci        if (!info->Marshalling(reply)) {
3098e745fdaSopenharmony_ci            return NETMANAGER_EXT_ERR_WRITE_REPLY_FAIL;
3108e745fdaSopenharmony_ci        }
3118e745fdaSopenharmony_ci    }
3128e745fdaSopenharmony_ci    NetFirewallHisysEvent::SendRecordRequestReport(userId, ret);
3138e745fdaSopenharmony_ci    return ret;
3148e745fdaSopenharmony_ci}
3158e745fdaSopenharmony_ci} // namespace NetManagerStandard
3168e745fdaSopenharmony_ci} // namespace OHOS
317