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