1b1b8bc3fSopenharmony_ci/*
2b1b8bc3fSopenharmony_ci * Copyright (c) 2024 Huawei Device Co., Ltd.
3b1b8bc3fSopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License");
4b1b8bc3fSopenharmony_ci * you may not use this file except in compliance with the License.
5b1b8bc3fSopenharmony_ci * You may obtain a copy of the License at
6b1b8bc3fSopenharmony_ci *
7b1b8bc3fSopenharmony_ci * http://www.apache.org/licenses/LICENSE-2.0
8b1b8bc3fSopenharmony_ci *
9b1b8bc3fSopenharmony_ci * Unless required by applicable law or agreed to in writing, software
10b1b8bc3fSopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS,
11b1b8bc3fSopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12b1b8bc3fSopenharmony_ci * See the License for the specific language governing permissions and
13b1b8bc3fSopenharmony_ci * limitations under the License.
14b1b8bc3fSopenharmony_ci */
15b1b8bc3fSopenharmony_ci#include <arpa/inet.h>
16b1b8bc3fSopenharmony_ci#include <sstream>
17b1b8bc3fSopenharmony_ci
18b1b8bc3fSopenharmony_ci#include "netfirewall_parcel.h"
19b1b8bc3fSopenharmony_ci#include "net_mgr_log_wrapper.h"
20b1b8bc3fSopenharmony_ci#include "refbase.h"
21b1b8bc3fSopenharmony_ci
22b1b8bc3fSopenharmony_ci
23b1b8bc3fSopenharmony_cinamespace OHOS {
24b1b8bc3fSopenharmony_cinamespace NetManagerStandard {
25b1b8bc3fSopenharmony_cinamespace {
26b1b8bc3fSopenharmony_ciconstexpr uint32_t FIREWALL_MAX_LIST_SIZE = 100;
27b1b8bc3fSopenharmony_ci}
28b1b8bc3fSopenharmony_ci// Firewall IP parameters
29b1b8bc3fSopenharmony_cibool NetFirewallIpParam::Marshalling(Parcel &parcel) const
30b1b8bc3fSopenharmony_ci{
31b1b8bc3fSopenharmony_ci    parcel.WriteUint8(family);
32b1b8bc3fSopenharmony_ci    if (!parcel.WriteUint8(type)) {
33b1b8bc3fSopenharmony_ci        return false;
34b1b8bc3fSopenharmony_ci    }
35b1b8bc3fSopenharmony_ci    parcel.WriteUint8(mask);
36b1b8bc3fSopenharmony_ci    if (family == FAMILY_IPV4) {
37b1b8bc3fSopenharmony_ci        parcel.WriteUint32(ipv4.startIp.s_addr);
38b1b8bc3fSopenharmony_ci        if (type == MULTIPLE_IP) {
39b1b8bc3fSopenharmony_ci            parcel.WriteUint32(ipv4.endIp.s_addr);
40b1b8bc3fSopenharmony_ci        }
41b1b8bc3fSopenharmony_ci        return true;
42b1b8bc3fSopenharmony_ci    }
43b1b8bc3fSopenharmony_ci    for (int32_t index = 0; index < IPV6_ARRAY_SIZE; index++) {
44b1b8bc3fSopenharmony_ci        parcel.WriteUint8(ipv6.startIp.s6_addr[index]);
45b1b8bc3fSopenharmony_ci        if (type == MULTIPLE_IP) {
46b1b8bc3fSopenharmony_ci            parcel.WriteUint8(ipv6.endIp.s6_addr[index]);
47b1b8bc3fSopenharmony_ci        }
48b1b8bc3fSopenharmony_ci    }
49b1b8bc3fSopenharmony_ci    return true;
50b1b8bc3fSopenharmony_ci}
51b1b8bc3fSopenharmony_ci
52b1b8bc3fSopenharmony_cisptr<NetFirewallIpParam> NetFirewallIpParam::Unmarshalling(Parcel &parcel)
53b1b8bc3fSopenharmony_ci{
54b1b8bc3fSopenharmony_ci    sptr<NetFirewallIpParam> ptr = new (std::nothrow) NetFirewallIpParam();
55b1b8bc3fSopenharmony_ci    if (ptr == nullptr) {
56b1b8bc3fSopenharmony_ci        NETMGR_LOG_E("NetFirewallIpParam ptr is null");
57b1b8bc3fSopenharmony_ci        return nullptr;
58b1b8bc3fSopenharmony_ci    }
59b1b8bc3fSopenharmony_ci    parcel.ReadUint8(ptr->family);
60b1b8bc3fSopenharmony_ci    if (!parcel.ReadUint8(ptr->type)) {
61b1b8bc3fSopenharmony_ci        return nullptr;
62b1b8bc3fSopenharmony_ci    }
63b1b8bc3fSopenharmony_ci    parcel.ReadUint8(ptr->mask);
64b1b8bc3fSopenharmony_ci
65b1b8bc3fSopenharmony_ci    if (ptr->family == FAMILY_IPV4) {
66b1b8bc3fSopenharmony_ci        parcel.ReadUint32(ptr->ipv4.startIp.s_addr);
67b1b8bc3fSopenharmony_ci        if (ptr->type == MULTIPLE_IP) {
68b1b8bc3fSopenharmony_ci            parcel.ReadUint32(ptr->ipv4.endIp.s_addr);
69b1b8bc3fSopenharmony_ci        }
70b1b8bc3fSopenharmony_ci        return ptr;
71b1b8bc3fSopenharmony_ci    }
72b1b8bc3fSopenharmony_ci    for (int32_t index = 0; index < IPV6_ARRAY_SIZE; index++) {
73b1b8bc3fSopenharmony_ci        parcel.ReadUint8(ptr->ipv6.startIp.s6_addr[index]);
74b1b8bc3fSopenharmony_ci        if (ptr->type == MULTIPLE_IP) {
75b1b8bc3fSopenharmony_ci            parcel.ReadUint8(ptr->ipv6.endIp.s6_addr[index]);
76b1b8bc3fSopenharmony_ci        }
77b1b8bc3fSopenharmony_ci    }
78b1b8bc3fSopenharmony_ci    return ptr;
79b1b8bc3fSopenharmony_ci}
80b1b8bc3fSopenharmony_ci
81b1b8bc3fSopenharmony_cistd::vector<std::string> NetFirewallUtils::split(const std::string &text, char delim)
82b1b8bc3fSopenharmony_ci{
83b1b8bc3fSopenharmony_ci    std::vector<std::string> tokens;
84b1b8bc3fSopenharmony_ci    std::stringstream ss(text);
85b1b8bc3fSopenharmony_ci    std::string item;
86b1b8bc3fSopenharmony_ci    while (std::getline(ss, item, delim)) {
87b1b8bc3fSopenharmony_ci        if (!item.empty()) {
88b1b8bc3fSopenharmony_ci            tokens.emplace_back(item);
89b1b8bc3fSopenharmony_ci        }
90b1b8bc3fSopenharmony_ci    }
91b1b8bc3fSopenharmony_ci    return tokens;
92b1b8bc3fSopenharmony_ci}
93b1b8bc3fSopenharmony_ci
94b1b8bc3fSopenharmony_cistd::string NetFirewallUtils::erase(const std::string &src, const std::string &sub)
95b1b8bc3fSopenharmony_ci{
96b1b8bc3fSopenharmony_ci    size_t index = src.find(sub);
97b1b8bc3fSopenharmony_ci    if (index == std::string::npos) {
98b1b8bc3fSopenharmony_ci        return "";
99b1b8bc3fSopenharmony_ci    }
100b1b8bc3fSopenharmony_ci    return src.substr(index + sub.length(), src.length() - sub.length());
101b1b8bc3fSopenharmony_ci}
102b1b8bc3fSopenharmony_ci
103b1b8bc3fSopenharmony_cistd::string NetFirewallIpParam::GetStartIp() const
104b1b8bc3fSopenharmony_ci{
105b1b8bc3fSopenharmony_ci    char ip[INET6_ADDRSTRLEN] = {};
106b1b8bc3fSopenharmony_ci    if (this->family == FAMILY_IPV4) {
107b1b8bc3fSopenharmony_ci        inet_ntop(AF_INET, &(this->ipv4.startIp), ip, INET_ADDRSTRLEN);
108b1b8bc3fSopenharmony_ci    } else {
109b1b8bc3fSopenharmony_ci        inet_ntop(AF_INET6, &(this->ipv6.startIp), ip, INET6_ADDRSTRLEN);
110b1b8bc3fSopenharmony_ci    }
111b1b8bc3fSopenharmony_ci    return ip;
112b1b8bc3fSopenharmony_ci}
113b1b8bc3fSopenharmony_ci
114b1b8bc3fSopenharmony_cistd::string NetFirewallIpParam::GetEndIp() const
115b1b8bc3fSopenharmony_ci{
116b1b8bc3fSopenharmony_ci    if (this->type == SINGLE_IP) {
117b1b8bc3fSopenharmony_ci        return "";
118b1b8bc3fSopenharmony_ci    }
119b1b8bc3fSopenharmony_ci    char ip[INET6_ADDRSTRLEN] = {};
120b1b8bc3fSopenharmony_ci    if (this->family == FAMILY_IPV4) {
121b1b8bc3fSopenharmony_ci        inet_ntop(AF_INET, &(this->ipv4.endIp), ip, INET_ADDRSTRLEN);
122b1b8bc3fSopenharmony_ci    } else {
123b1b8bc3fSopenharmony_ci        inet_ntop(AF_INET6, &(this->ipv6.endIp), ip, INET6_ADDRSTRLEN);
124b1b8bc3fSopenharmony_ci    }
125b1b8bc3fSopenharmony_ci    return ip;
126b1b8bc3fSopenharmony_ci}
127b1b8bc3fSopenharmony_ci
128b1b8bc3fSopenharmony_ci// Firewall port parameters
129b1b8bc3fSopenharmony_cibool NetFirewallPortParam::Marshalling(Parcel &parcel) const
130b1b8bc3fSopenharmony_ci{
131b1b8bc3fSopenharmony_ci    if (!parcel.WriteUint16(startPort)) {
132b1b8bc3fSopenharmony_ci        return false;
133b1b8bc3fSopenharmony_ci    }
134b1b8bc3fSopenharmony_ci    if (!parcel.WriteUint16(endPort)) {
135b1b8bc3fSopenharmony_ci        return false;
136b1b8bc3fSopenharmony_ci    }
137b1b8bc3fSopenharmony_ci    return true;
138b1b8bc3fSopenharmony_ci}
139b1b8bc3fSopenharmony_ci
140b1b8bc3fSopenharmony_cisptr<NetFirewallPortParam> NetFirewallPortParam::Unmarshalling(Parcel &parcel)
141b1b8bc3fSopenharmony_ci{
142b1b8bc3fSopenharmony_ci    sptr<NetFirewallPortParam> ptr = new (std::nothrow) NetFirewallPortParam();
143b1b8bc3fSopenharmony_ci    if (ptr == nullptr) {
144b1b8bc3fSopenharmony_ci        NETMGR_LOG_E("NetFirewallPortParam ptr is null");
145b1b8bc3fSopenharmony_ci        return nullptr;
146b1b8bc3fSopenharmony_ci    }
147b1b8bc3fSopenharmony_ci    if (!parcel.ReadUint16(ptr->startPort)) {
148b1b8bc3fSopenharmony_ci        return nullptr;
149b1b8bc3fSopenharmony_ci    }
150b1b8bc3fSopenharmony_ci    if (!parcel.ReadUint16(ptr->endPort)) {
151b1b8bc3fSopenharmony_ci        return nullptr;
152b1b8bc3fSopenharmony_ci    }
153b1b8bc3fSopenharmony_ci    return ptr;
154b1b8bc3fSopenharmony_ci}
155b1b8bc3fSopenharmony_ci
156b1b8bc3fSopenharmony_ci// Firewall domain name parameters
157b1b8bc3fSopenharmony_cibool NetFirewallDomainParam::Marshalling(Parcel &parcel) const
158b1b8bc3fSopenharmony_ci{
159b1b8bc3fSopenharmony_ci    if (!parcel.WriteBool(isWildcard)) {
160b1b8bc3fSopenharmony_ci        return false;
161b1b8bc3fSopenharmony_ci    }
162b1b8bc3fSopenharmony_ci    if (!parcel.WriteString(domain)) {
163b1b8bc3fSopenharmony_ci        return false;
164b1b8bc3fSopenharmony_ci    }
165b1b8bc3fSopenharmony_ci    return true;
166b1b8bc3fSopenharmony_ci}
167b1b8bc3fSopenharmony_ci
168b1b8bc3fSopenharmony_cisptr<NetFirewallDomainParam> NetFirewallDomainParam::Unmarshalling(Parcel &parcel)
169b1b8bc3fSopenharmony_ci{
170b1b8bc3fSopenharmony_ci    sptr<NetFirewallDomainParam> ptr = new (std::nothrow) NetFirewallDomainParam();
171b1b8bc3fSopenharmony_ci    if (ptr == nullptr) {
172b1b8bc3fSopenharmony_ci        NETMGR_LOG_E("NetFirewallDomainParam ptr is null");
173b1b8bc3fSopenharmony_ci        return nullptr;
174b1b8bc3fSopenharmony_ci    }
175b1b8bc3fSopenharmony_ci    if (!parcel.ReadBool(ptr->isWildcard)) {
176b1b8bc3fSopenharmony_ci        return nullptr;
177b1b8bc3fSopenharmony_ci    }
178b1b8bc3fSopenharmony_ci    if (!parcel.ReadString(ptr->domain)) {
179b1b8bc3fSopenharmony_ci        return nullptr;
180b1b8bc3fSopenharmony_ci    }
181b1b8bc3fSopenharmony_ci    return ptr;
182b1b8bc3fSopenharmony_ci}
183b1b8bc3fSopenharmony_ci
184b1b8bc3fSopenharmony_ci// Firewall DNS parameters
185b1b8bc3fSopenharmony_cibool NetFirewallDnsParam::Marshalling(Parcel &parcel) const
186b1b8bc3fSopenharmony_ci{
187b1b8bc3fSopenharmony_ci    if (!parcel.WriteString(primaryDns)) {
188b1b8bc3fSopenharmony_ci        return false;
189b1b8bc3fSopenharmony_ci    }
190b1b8bc3fSopenharmony_ci    parcel.WriteString(standbyDns);
191b1b8bc3fSopenharmony_ci    return true;
192b1b8bc3fSopenharmony_ci}
193b1b8bc3fSopenharmony_ci
194b1b8bc3fSopenharmony_cisptr<NetFirewallDnsParam> NetFirewallDnsParam::Unmarshalling(Parcel &parcel)
195b1b8bc3fSopenharmony_ci{
196b1b8bc3fSopenharmony_ci    sptr<NetFirewallDnsParam> ptr = new (std::nothrow) NetFirewallDnsParam();
197b1b8bc3fSopenharmony_ci    if (ptr == nullptr) {
198b1b8bc3fSopenharmony_ci        NETMGR_LOG_E("NetFirewallDnsParam ptr is null");
199b1b8bc3fSopenharmony_ci        return nullptr;
200b1b8bc3fSopenharmony_ci    }
201b1b8bc3fSopenharmony_ci    if (!parcel.ReadString(ptr->primaryDns)) {
202b1b8bc3fSopenharmony_ci        return nullptr;
203b1b8bc3fSopenharmony_ci    }
204b1b8bc3fSopenharmony_ci    parcel.ReadString(ptr->standbyDns);
205b1b8bc3fSopenharmony_ci    return ptr;
206b1b8bc3fSopenharmony_ci}
207b1b8bc3fSopenharmony_ci
208b1b8bc3fSopenharmony_citemplate <typename T> bool NetFirewallUtils::MarshallingList(const std::vector<T> &list, Parcel &parcel)
209b1b8bc3fSopenharmony_ci{
210b1b8bc3fSopenharmony_ci    uint32_t size = static_cast<uint32_t>(list.size());
211b1b8bc3fSopenharmony_ci    size = std::min(size, FIREWALL_MAX_LIST_SIZE);
212b1b8bc3fSopenharmony_ci    if (!parcel.WriteUint32(size)) {
213b1b8bc3fSopenharmony_ci        NETMGR_LOG_E("write netAddrList size to parcel failed");
214b1b8bc3fSopenharmony_ci        return false;
215b1b8bc3fSopenharmony_ci    }
216b1b8bc3fSopenharmony_ci
217b1b8bc3fSopenharmony_ci    for (uint32_t index = 0; index < size; ++index) {
218b1b8bc3fSopenharmony_ci        auto value = list[index];
219b1b8bc3fSopenharmony_ci        if (!value.Marshalling(parcel)) {
220b1b8bc3fSopenharmony_ci            NETMGR_LOG_E("write MarshallingList to parcel failed");
221b1b8bc3fSopenharmony_ci            return false;
222b1b8bc3fSopenharmony_ci        }
223b1b8bc3fSopenharmony_ci    }
224b1b8bc3fSopenharmony_ci    return true;
225b1b8bc3fSopenharmony_ci}
226b1b8bc3fSopenharmony_ci
227b1b8bc3fSopenharmony_citemplate <typename T> bool NetFirewallUtils::UnmarshallingList(Parcel &parcel, std::vector<T> &list)
228b1b8bc3fSopenharmony_ci{
229b1b8bc3fSopenharmony_ci    std::vector<T>().swap(list);
230b1b8bc3fSopenharmony_ci
231b1b8bc3fSopenharmony_ci    uint32_t size = 0;
232b1b8bc3fSopenharmony_ci    if (!parcel.ReadUint32(size)) {
233b1b8bc3fSopenharmony_ci        NETMGR_LOG_E("Read UnmarshallingList list size failed");
234b1b8bc3fSopenharmony_ci        return false;
235b1b8bc3fSopenharmony_ci    }
236b1b8bc3fSopenharmony_ci    size = std::min(size, FIREWALL_MAX_LIST_SIZE);
237b1b8bc3fSopenharmony_ci    for (uint32_t i = 0; i < size; i++) {
238b1b8bc3fSopenharmony_ci        auto value = T::Unmarshalling(parcel);
239b1b8bc3fSopenharmony_ci        if (value == nullptr) {
240b1b8bc3fSopenharmony_ci            return false;
241b1b8bc3fSopenharmony_ci        }
242b1b8bc3fSopenharmony_ci        list.emplace_back(*value);
243b1b8bc3fSopenharmony_ci    }
244b1b8bc3fSopenharmony_ci    return true;
245b1b8bc3fSopenharmony_ci}
246b1b8bc3fSopenharmony_ci
247b1b8bc3fSopenharmony_ci// Firewall rules, external interfaces
248b1b8bc3fSopenharmony_cibool NetFirewallRule::Marshalling(Parcel &parcel) const
249b1b8bc3fSopenharmony_ci{
250b1b8bc3fSopenharmony_ci    parcel.WriteInt32(ruleId);
251b1b8bc3fSopenharmony_ci    if (!parcel.WriteString(ruleName)) {
252b1b8bc3fSopenharmony_ci        return false;
253b1b8bc3fSopenharmony_ci    }
254b1b8bc3fSopenharmony_ci    parcel.WriteString(ruleDescription);
255b1b8bc3fSopenharmony_ci    if (!parcel.WriteInt32(static_cast<int32_t>(ruleDirection))) {
256b1b8bc3fSopenharmony_ci        return false;
257b1b8bc3fSopenharmony_ci    }
258b1b8bc3fSopenharmony_ci    if (!parcel.WriteInt32(static_cast<int32_t>(ruleAction))) {
259b1b8bc3fSopenharmony_ci        return false;
260b1b8bc3fSopenharmony_ci    }
261b1b8bc3fSopenharmony_ci    if (!parcel.WriteInt32(static_cast<int32_t>(ruleType))) {
262b1b8bc3fSopenharmony_ci        return false;
263b1b8bc3fSopenharmony_ci    }
264b1b8bc3fSopenharmony_ci    parcel.WriteBool(isEnabled);
265b1b8bc3fSopenharmony_ci    parcel.WriteInt32(appUid);
266b1b8bc3fSopenharmony_ci    NetFirewallUtils::MarshallingList(localIps, parcel);
267b1b8bc3fSopenharmony_ci    NetFirewallUtils::MarshallingList(remoteIps, parcel);
268b1b8bc3fSopenharmony_ci    parcel.WriteInt32(static_cast<int32_t>(protocol));
269b1b8bc3fSopenharmony_ci    NetFirewallUtils::MarshallingList(localPorts, parcel);
270b1b8bc3fSopenharmony_ci    NetFirewallUtils::MarshallingList(remotePorts, parcel);
271b1b8bc3fSopenharmony_ci    NetFirewallUtils::MarshallingList(domains, parcel);
272b1b8bc3fSopenharmony_ci    dns.Marshalling(parcel);
273b1b8bc3fSopenharmony_ci    if (!parcel.WriteInt32(userId)) {
274b1b8bc3fSopenharmony_ci        return false;
275b1b8bc3fSopenharmony_ci    }
276b1b8bc3fSopenharmony_ci    return true;
277b1b8bc3fSopenharmony_ci}
278b1b8bc3fSopenharmony_ci
279b1b8bc3fSopenharmony_cisptr<NetFirewallRule> NetFirewallRule::Unmarshalling(Parcel &parcel)
280b1b8bc3fSopenharmony_ci{
281b1b8bc3fSopenharmony_ci    sptr<NetFirewallRule> ptr = new (std::nothrow) NetFirewallRule();
282b1b8bc3fSopenharmony_ci    if (ptr == nullptr) {
283b1b8bc3fSopenharmony_ci        NETMGR_LOG_E("NetFirewallRule ptr is null");
284b1b8bc3fSopenharmony_ci        return nullptr;
285b1b8bc3fSopenharmony_ci    }
286b1b8bc3fSopenharmony_ci    parcel.ReadInt32(ptr->ruleId);
287b1b8bc3fSopenharmony_ci
288b1b8bc3fSopenharmony_ci    if (!parcel.ReadString(ptr->ruleName)) {
289b1b8bc3fSopenharmony_ci        return nullptr;
290b1b8bc3fSopenharmony_ci    }
291b1b8bc3fSopenharmony_ci    parcel.ReadString(ptr->ruleDescription);
292b1b8bc3fSopenharmony_ci    int32_t ruleDirection = 0;
293b1b8bc3fSopenharmony_ci    if (!parcel.ReadInt32(ruleDirection)) {
294b1b8bc3fSopenharmony_ci        return nullptr;
295b1b8bc3fSopenharmony_ci    }
296b1b8bc3fSopenharmony_ci    ptr->ruleDirection = static_cast<NetFirewallRuleDirection>(ruleDirection);
297b1b8bc3fSopenharmony_ci    int32_t ruleAction = 0;
298b1b8bc3fSopenharmony_ci    if (!parcel.ReadInt32(ruleAction)) {
299b1b8bc3fSopenharmony_ci        return nullptr;
300b1b8bc3fSopenharmony_ci    }
301b1b8bc3fSopenharmony_ci    ptr->ruleAction = static_cast<FirewallRuleAction>(ruleAction);
302b1b8bc3fSopenharmony_ci    int32_t ruleType = 0;
303b1b8bc3fSopenharmony_ci    if (!parcel.ReadInt32(ruleType)) {
304b1b8bc3fSopenharmony_ci        return nullptr;
305b1b8bc3fSopenharmony_ci    }
306b1b8bc3fSopenharmony_ci    ptr->ruleType = static_cast<NetFirewallRuleType>(ruleType);
307b1b8bc3fSopenharmony_ci    parcel.ReadBool(ptr->isEnabled);
308b1b8bc3fSopenharmony_ci    parcel.ReadInt32(ptr->appUid);
309b1b8bc3fSopenharmony_ci    NetFirewallUtils::UnmarshallingList(parcel, ptr->localIps);
310b1b8bc3fSopenharmony_ci    NetFirewallUtils::UnmarshallingList(parcel, ptr->remoteIps);
311b1b8bc3fSopenharmony_ci    int32_t protocol = 0;
312b1b8bc3fSopenharmony_ci    if (parcel.ReadInt32(protocol)) {
313b1b8bc3fSopenharmony_ci        ptr->protocol = static_cast<NetworkProtocol>(protocol);
314b1b8bc3fSopenharmony_ci    }
315b1b8bc3fSopenharmony_ci    NetFirewallUtils::UnmarshallingList(parcel, ptr->localPorts);
316b1b8bc3fSopenharmony_ci    NetFirewallUtils::UnmarshallingList(parcel, ptr->remotePorts);
317b1b8bc3fSopenharmony_ci    NetFirewallUtils::UnmarshallingList(parcel, ptr->domains);
318b1b8bc3fSopenharmony_ci    sptr<NetFirewallDnsParam> dns = NetFirewallDnsParam::Unmarshalling(parcel);
319b1b8bc3fSopenharmony_ci    if (dns != nullptr) {
320b1b8bc3fSopenharmony_ci        ptr->dns = *dns;
321b1b8bc3fSopenharmony_ci    }
322b1b8bc3fSopenharmony_ci    if (!parcel.ReadInt32(ptr->userId)) {
323b1b8bc3fSopenharmony_ci        return nullptr;
324b1b8bc3fSopenharmony_ci    }
325b1b8bc3fSopenharmony_ci    return ptr;
326b1b8bc3fSopenharmony_ci}
327b1b8bc3fSopenharmony_ci
328b1b8bc3fSopenharmony_cistd::string NetFirewallRule::ToString() const
329b1b8bc3fSopenharmony_ci{
330b1b8bc3fSopenharmony_ci    const std::string size = " size=";
331b1b8bc3fSopenharmony_ci    std::stringstream ss;
332b1b8bc3fSopenharmony_ci    ss << "NetFirewallRule:{" << NET_FIREWALL_RULE_ID << EQUAL << this->ruleId << COMMA << NET_FIREWALL_RULE_NAME <<
333b1b8bc3fSopenharmony_ci        EQUAL << this->ruleName << COMMA << NET_FIREWALL_RULE_DESC << EQUAL << this->ruleDescription << COMMA <<
334b1b8bc3fSopenharmony_ci        NET_FIREWALL_RULE_DIR << EQUAL << int(this->ruleDirection) << COMMA << NET_FIREWALL_RULE_ACTION << EQUAL <<
335b1b8bc3fSopenharmony_ci        int(this->ruleAction) << COMMA << NET_FIREWALL_RULE_TYPE << EQUAL << int(this->ruleType) << COMMA <<
336b1b8bc3fSopenharmony_ci        NET_FIREWALL_IS_ENABLED << EQUAL << this->isEnabled << COMMA << NET_FIREWALL_APP_ID << EQUAL << this->appUid <<
337b1b8bc3fSopenharmony_ci        COMMA << NET_FIREWALL_PROTOCOL << EQUAL << int(this->protocol) << COMMA << NET_FIREWALL_USER_ID << EQUAL <<
338b1b8bc3fSopenharmony_ci        this->userId << COMMA << NET_FIREWALL_LOCAL_IP << size << this->localIps.size() << COMMA <<
339b1b8bc3fSopenharmony_ci        NET_FIREWALL_REMOTE_IP << size << this->remoteIps.size() << COMMA << NET_FIREWALL_LOCAL_PORT << size <<
340b1b8bc3fSopenharmony_ci        this->localPorts.size() << COMMA << NET_FIREWALL_DOMAIN << size << this->remotePorts.size() << COMMA <<
341b1b8bc3fSopenharmony_ci        NET_FIREWALL_REMOTE_PORT << size << this->domains.size() << "}";
342b1b8bc3fSopenharmony_ci    return ss.str();
343b1b8bc3fSopenharmony_ci}
344b1b8bc3fSopenharmony_ci
345b1b8bc3fSopenharmony_cibool NetFirewallBaseRule::Marshalling(Parcel &parcel) const
346b1b8bc3fSopenharmony_ci{
347b1b8bc3fSopenharmony_ci    parcel.WriteInt32(userId);
348b1b8bc3fSopenharmony_ci    parcel.WriteInt32(appUid);
349b1b8bc3fSopenharmony_ci    return true;
350b1b8bc3fSopenharmony_ci}
351b1b8bc3fSopenharmony_ci
352b1b8bc3fSopenharmony_cisptr<NetFirewallBaseRule> NetFirewallBaseRule::Unmarshalling(Parcel &parcel)
353b1b8bc3fSopenharmony_ci{
354b1b8bc3fSopenharmony_ci    sptr<NetFirewallBaseRule> ptr = new (std::nothrow) NetFirewallBaseRule();
355b1b8bc3fSopenharmony_ci    if (ptr == nullptr) {
356b1b8bc3fSopenharmony_ci        NETMGR_LOG_E("NetFirewallBaseRule ptr is null");
357b1b8bc3fSopenharmony_ci        return nullptr;
358b1b8bc3fSopenharmony_ci    }
359b1b8bc3fSopenharmony_ci    parcel.ReadInt32(ptr->userId);
360b1b8bc3fSopenharmony_ci    parcel.ReadInt32(ptr->appUid);
361b1b8bc3fSopenharmony_ci    return ptr;
362b1b8bc3fSopenharmony_ci}
363b1b8bc3fSopenharmony_ci
364b1b8bc3fSopenharmony_cibool NetFirewallBaseRule::UnmarshallingBase(Parcel &parcel, sptr<NetFirewallBaseRule> ptr)
365b1b8bc3fSopenharmony_ci{
366b1b8bc3fSopenharmony_ci    parcel.ReadInt32(ptr->userId);
367b1b8bc3fSopenharmony_ci    parcel.ReadInt32(ptr->appUid);
368b1b8bc3fSopenharmony_ci    return true;
369b1b8bc3fSopenharmony_ci}
370b1b8bc3fSopenharmony_ci
371b1b8bc3fSopenharmony_ci// IP rule data
372b1b8bc3fSopenharmony_cibool NetFirewallIpRule::Marshalling(Parcel &parcel) const
373b1b8bc3fSopenharmony_ci{
374b1b8bc3fSopenharmony_ci    NetFirewallBaseRule::Marshalling(parcel);
375b1b8bc3fSopenharmony_ci    if (!parcel.WriteInt32(static_cast<int32_t>(ruleDirection))) {
376b1b8bc3fSopenharmony_ci        return false;
377b1b8bc3fSopenharmony_ci    }
378b1b8bc3fSopenharmony_ci    if (!parcel.WriteInt32(static_cast<int32_t>(ruleAction))) {
379b1b8bc3fSopenharmony_ci        return false;
380b1b8bc3fSopenharmony_ci    }
381b1b8bc3fSopenharmony_ci    parcel.WriteInt32(static_cast<int32_t>(protocol));
382b1b8bc3fSopenharmony_ci    NetFirewallUtils::MarshallingList(localIps, parcel);
383b1b8bc3fSopenharmony_ci    NetFirewallUtils::MarshallingList(remoteIps, parcel);
384b1b8bc3fSopenharmony_ci    NetFirewallUtils::MarshallingList(localPorts, parcel);
385b1b8bc3fSopenharmony_ci    NetFirewallUtils::MarshallingList(remotePorts, parcel);
386b1b8bc3fSopenharmony_ci    return true;
387b1b8bc3fSopenharmony_ci}
388b1b8bc3fSopenharmony_ci
389b1b8bc3fSopenharmony_cisptr<NetFirewallIpRule> NetFirewallIpRule::Unmarshalling(Parcel &parcel)
390b1b8bc3fSopenharmony_ci{
391b1b8bc3fSopenharmony_ci    sptr<NetFirewallIpRule> ptr = new (std::nothrow) NetFirewallIpRule();
392b1b8bc3fSopenharmony_ci    if (ptr == nullptr) {
393b1b8bc3fSopenharmony_ci        NETMGR_LOG_E("NetFirewallIpRule ptr is null");
394b1b8bc3fSopenharmony_ci        return nullptr;
395b1b8bc3fSopenharmony_ci    }
396b1b8bc3fSopenharmony_ci    NetFirewallBaseRule::UnmarshallingBase(parcel, ptr);
397b1b8bc3fSopenharmony_ci    int32_t ruleDirection = 0;
398b1b8bc3fSopenharmony_ci    if (!parcel.ReadInt32(ruleDirection)) {
399b1b8bc3fSopenharmony_ci        return nullptr;
400b1b8bc3fSopenharmony_ci    }
401b1b8bc3fSopenharmony_ci    ptr->ruleDirection = static_cast<NetFirewallRuleDirection>(ruleDirection);
402b1b8bc3fSopenharmony_ci    int32_t ruleAction = 0;
403b1b8bc3fSopenharmony_ci    if (!parcel.ReadInt32(ruleAction)) {
404b1b8bc3fSopenharmony_ci        return nullptr;
405b1b8bc3fSopenharmony_ci    }
406b1b8bc3fSopenharmony_ci    ptr->ruleAction = static_cast<FirewallRuleAction>(ruleAction);
407b1b8bc3fSopenharmony_ci    int32_t protocol = 0;
408b1b8bc3fSopenharmony_ci    if (parcel.ReadInt32(protocol)) {
409b1b8bc3fSopenharmony_ci        ptr->protocol = static_cast<NetworkProtocol>(protocol);
410b1b8bc3fSopenharmony_ci    }
411b1b8bc3fSopenharmony_ci    NetFirewallUtils::UnmarshallingList(parcel, ptr->localIps);
412b1b8bc3fSopenharmony_ci    NetFirewallUtils::UnmarshallingList(parcel, ptr->remoteIps);
413b1b8bc3fSopenharmony_ci    NetFirewallUtils::UnmarshallingList(parcel, ptr->localPorts);
414b1b8bc3fSopenharmony_ci    NetFirewallUtils::UnmarshallingList(parcel, ptr->remotePorts);
415b1b8bc3fSopenharmony_ci    return ptr;
416b1b8bc3fSopenharmony_ci}
417b1b8bc3fSopenharmony_ci
418b1b8bc3fSopenharmony_ci// domain rule data
419b1b8bc3fSopenharmony_cibool NetFirewallDomainRule::Marshalling(Parcel &parcel) const
420b1b8bc3fSopenharmony_ci{
421b1b8bc3fSopenharmony_ci    NetFirewallBaseRule::Marshalling(parcel);
422b1b8bc3fSopenharmony_ci    if (!parcel.WriteInt32(static_cast<int32_t>(ruleAction))) {
423b1b8bc3fSopenharmony_ci        return false;
424b1b8bc3fSopenharmony_ci    }
425b1b8bc3fSopenharmony_ci    NetFirewallUtils::MarshallingList(domains, parcel);
426b1b8bc3fSopenharmony_ci    return true;
427b1b8bc3fSopenharmony_ci}
428b1b8bc3fSopenharmony_ci
429b1b8bc3fSopenharmony_cisptr<NetFirewallDomainRule> NetFirewallDomainRule::Unmarshalling(Parcel &parcel)
430b1b8bc3fSopenharmony_ci{
431b1b8bc3fSopenharmony_ci    sptr<NetFirewallDomainRule> ptr = new (std::nothrow) NetFirewallDomainRule();
432b1b8bc3fSopenharmony_ci    if (ptr == nullptr) {
433b1b8bc3fSopenharmony_ci        NETMGR_LOG_E("NetFirewallDomainRule ptr is null");
434b1b8bc3fSopenharmony_ci        return nullptr;
435b1b8bc3fSopenharmony_ci    }
436b1b8bc3fSopenharmony_ci    NetFirewallBaseRule::UnmarshallingBase(parcel, ptr);
437b1b8bc3fSopenharmony_ci    int32_t ruleAction = 0;
438b1b8bc3fSopenharmony_ci    if (!parcel.ReadInt32(ruleAction)) {
439b1b8bc3fSopenharmony_ci        return nullptr;
440b1b8bc3fSopenharmony_ci    }
441b1b8bc3fSopenharmony_ci    ptr->ruleAction = static_cast<FirewallRuleAction>(ruleAction);
442b1b8bc3fSopenharmony_ci    NetFirewallUtils::UnmarshallingList(parcel, ptr->domains);
443b1b8bc3fSopenharmony_ci    return ptr;
444b1b8bc3fSopenharmony_ci}
445b1b8bc3fSopenharmony_ci
446b1b8bc3fSopenharmony_ci// DNS rule data
447b1b8bc3fSopenharmony_cibool NetFirewallDnsRule::Marshalling(Parcel &parcel) const
448b1b8bc3fSopenharmony_ci{
449b1b8bc3fSopenharmony_ci    NetFirewallBaseRule::Marshalling(parcel);
450b1b8bc3fSopenharmony_ci    if (!parcel.WriteString(primaryDns)) {
451b1b8bc3fSopenharmony_ci        return false;
452b1b8bc3fSopenharmony_ci    }
453b1b8bc3fSopenharmony_ci    parcel.WriteString(standbyDns);
454b1b8bc3fSopenharmony_ci    return true;
455b1b8bc3fSopenharmony_ci}
456b1b8bc3fSopenharmony_ci
457b1b8bc3fSopenharmony_cisptr<NetFirewallDnsRule> NetFirewallDnsRule::Unmarshalling(Parcel &parcel)
458b1b8bc3fSopenharmony_ci{
459b1b8bc3fSopenharmony_ci    sptr<NetFirewallDnsRule> ptr = new (std::nothrow) NetFirewallDnsRule();
460b1b8bc3fSopenharmony_ci    if (ptr == nullptr) {
461b1b8bc3fSopenharmony_ci        NETMGR_LOG_E("NetFirewallDnsRule ptr is null");
462b1b8bc3fSopenharmony_ci        return nullptr;
463b1b8bc3fSopenharmony_ci    }
464b1b8bc3fSopenharmony_ci    NetFirewallBaseRule::UnmarshallingBase(parcel, ptr);
465b1b8bc3fSopenharmony_ci    if (!parcel.ReadString(ptr->primaryDns)) {
466b1b8bc3fSopenharmony_ci        return nullptr;
467b1b8bc3fSopenharmony_ci    }
468b1b8bc3fSopenharmony_ci    parcel.ReadString(ptr->standbyDns);
469b1b8bc3fSopenharmony_ci    return ptr;
470b1b8bc3fSopenharmony_ci}
471b1b8bc3fSopenharmony_ci
472b1b8bc3fSopenharmony_ci// Interception Record
473b1b8bc3fSopenharmony_cibool InterceptRecord::Marshalling(Parcel &parcel) const
474b1b8bc3fSopenharmony_ci{
475b1b8bc3fSopenharmony_ci    parcel.WriteUint16(localPort);
476b1b8bc3fSopenharmony_ci    parcel.WriteUint16(remotePort);
477b1b8bc3fSopenharmony_ci    parcel.WriteUint16(protocol);
478b1b8bc3fSopenharmony_ci    if (!parcel.WriteInt32(time)) {
479b1b8bc3fSopenharmony_ci        return false;
480b1b8bc3fSopenharmony_ci    }
481b1b8bc3fSopenharmony_ci    if (!parcel.WriteString(localIp)) {
482b1b8bc3fSopenharmony_ci        return false;
483b1b8bc3fSopenharmony_ci    }
484b1b8bc3fSopenharmony_ci    if (!parcel.WriteString(remoteIp)) {
485b1b8bc3fSopenharmony_ci        return false;
486b1b8bc3fSopenharmony_ci    }
487b1b8bc3fSopenharmony_ci    if (!parcel.WriteInt32(appUid)) {
488b1b8bc3fSopenharmony_ci        return false;
489b1b8bc3fSopenharmony_ci    }
490b1b8bc3fSopenharmony_ci    if (!parcel.WriteString(domain)) {
491b1b8bc3fSopenharmony_ci        return false;
492b1b8bc3fSopenharmony_ci    }
493b1b8bc3fSopenharmony_ci    return true;
494b1b8bc3fSopenharmony_ci}
495b1b8bc3fSopenharmony_ci
496b1b8bc3fSopenharmony_cisptr<InterceptRecord> InterceptRecord::Unmarshalling(Parcel &parcel)
497b1b8bc3fSopenharmony_ci{
498b1b8bc3fSopenharmony_ci    sptr<InterceptRecord> ptr = new (std::nothrow) InterceptRecord();
499b1b8bc3fSopenharmony_ci    if (ptr == nullptr) {
500b1b8bc3fSopenharmony_ci        NETMGR_LOG_E("InterceptRecord ptr is null");
501b1b8bc3fSopenharmony_ci        return nullptr;
502b1b8bc3fSopenharmony_ci    }
503b1b8bc3fSopenharmony_ci    parcel.ReadUint16(ptr->localPort);
504b1b8bc3fSopenharmony_ci    parcel.ReadUint16(ptr->remotePort);
505b1b8bc3fSopenharmony_ci    parcel.ReadUint16(ptr->protocol);
506b1b8bc3fSopenharmony_ci    if (!parcel.ReadInt32(ptr->time)) {
507b1b8bc3fSopenharmony_ci        return nullptr;
508b1b8bc3fSopenharmony_ci    }
509b1b8bc3fSopenharmony_ci    if (!parcel.ReadString(ptr->localIp)) {
510b1b8bc3fSopenharmony_ci        return nullptr;
511b1b8bc3fSopenharmony_ci    }
512b1b8bc3fSopenharmony_ci    if (!parcel.ReadString(ptr->remoteIp)) {
513b1b8bc3fSopenharmony_ci        return nullptr;
514b1b8bc3fSopenharmony_ci    }
515b1b8bc3fSopenharmony_ci    if (!parcel.ReadInt32(ptr->appUid)) {
516b1b8bc3fSopenharmony_ci        return nullptr;
517b1b8bc3fSopenharmony_ci    }
518b1b8bc3fSopenharmony_ci    if (!parcel.ReadString(ptr->domain)) {
519b1b8bc3fSopenharmony_ci        return nullptr;
520b1b8bc3fSopenharmony_ci    }
521b1b8bc3fSopenharmony_ci    return ptr;
522b1b8bc3fSopenharmony_ci}
523b1b8bc3fSopenharmony_ci} // namespace NetManagerStandard
524b1b8bc3fSopenharmony_ci} // namespace OHOS