1 /*
2 * Copyright (c) 2024 Huawei Device Co., Ltd.
3 * Licensed under the Apache License, Version 2.0 (the "License");
4 * you may not use this file except in compliance with the License.
5 * You may obtain a copy of the License at
6 *
7 * http://www.apache.org/licenses/LICENSE-2.0
8 *
9 * Unless required by applicable law or agreed to in writing, software
10 * distributed under the License is distributed on an "AS IS" BASIS,
11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 * See the License for the specific language governing permissions and
13 * limitations under the License.
14 */
15
16 #include <securec.h>
17 #include <string>
18
19 #include "netmgr_ext_log_wrapper.h"
20 #include "netfirewall_db_helper.h"
21
22 using namespace OHOS::NativeRdb;
23 namespace {
24 const std::string DATABASE_ID = "id";
25 const std::string RULE_ID = "ruleId";
26 const std::string DOMAIN_NUM = "domainNum";
27 const std::string FUZZY_NUM = "fuzzyDomainNum";
28 const std::string SQL_SUM = "SELECT SUM(";
29 const std::string SQL_FROM = ") FROM ";
30 }
31
32 namespace OHOS {
33 namespace NetManagerStandard {
NetFirewallDbHelper()34 NetFirewallDbHelper::NetFirewallDbHelper()
35 {
36 firewallDatabase_ = NetFirewallDataBase::GetInstance();
37 }
38
~NetFirewallDbHelper()39 NetFirewallDbHelper::~NetFirewallDbHelper()
40 {
41 firewallDatabase_ = nullptr;
42 }
43
GetInstance()44 NetFirewallDbHelper &NetFirewallDbHelper::GetInstance()
45 {
46 static NetFirewallDbHelper instance;
47 return instance;
48 }
49
DomainListToBlob(const std::vector<NetFirewallDomainParam> & vec,std::vector<uint8_t> & blob,uint32_t & fuzzyNum)50 bool NetFirewallDbHelper::DomainListToBlob(const std::vector<NetFirewallDomainParam> &vec, std::vector<uint8_t> &blob,
51 uint32_t &fuzzyNum)
52 {
53 blob.clear();
54 for (const auto ¶m : vec) {
55 if (param.isWildcard) {
56 fuzzyNum++;
57 }
58 // 1 put isWildcard
59 blob.emplace_back(param.isWildcard ? 1 : 0);
60 // 2 for those with a string type, calculate the string size
61 uint16_t size = (uint16_t)(param.domain.length());
62 uint8_t *sizePtr = (uint8_t *)&size;
63 blob.emplace_back(sizePtr[0]);
64 blob.emplace_back(sizePtr[1]);
65 // 3 store string
66 std::vector<uint8_t> domain(param.domain.begin(), param.domain.end());
67 blob.insert(blob.end(), domain.begin(), domain.end());
68 }
69 return blob.size() > 0;
70 }
71
BlobToDomainList(const std::vector<uint8_t> & blob,std::vector<NetFirewallDomainParam> & vec)72 bool NetFirewallDbHelper::BlobToDomainList(const std::vector<uint8_t> &blob, std::vector<NetFirewallDomainParam> &vec)
73 {
74 vec.clear();
75 size_t blobSize = blob.size();
76 if (blobSize < 1) {
77 return false;
78 }
79
80 size_t i = 0;
81 size_t lenSize = sizeof(uint16_t);
82 while (i < blobSize) {
83 NetFirewallDomainParam param;
84 // 1 get isWildcard
85 param.isWildcard = blob[i] ? true : false;
86 // 2 get size
87 i++;
88 if (i >= blobSize || (blobSize - i) < lenSize) {
89 return true;
90 }
91 const uint8_t *sizePtr = &blob[i];
92 uint16_t size = *((uint16_t *)sizePtr);
93 size_t index = i + lenSize;
94 if (index >= blobSize || (blobSize - index) < size) {
95 return true;
96 }
97 // 3 get string
98 auto it = blob.begin() + index;
99 param.domain = std::string(it, it + size);
100 vec.emplace_back(param);
101 i += size + lenSize;
102 }
103
104 return vec.size() > 0;
105 }
106
ListToBlob(const std::vector<T> & vec,std::vector<uint8_t> & blob)107 template <typename T> void NetFirewallDbHelper::ListToBlob(const std::vector<T> &vec, std::vector<uint8_t> &blob)
108 {
109 blob.clear();
110 size_t size = sizeof(T);
111 for (const auto ¶m : vec) {
112 const uint8_t *data = reinterpret_cast<const uint8_t *>(¶m);
113 std::vector<uint8_t> item(data, data + size);
114 // 1 store each object
115 blob.insert(blob.end(), item.begin(), item.end());
116 }
117 }
118
BlobToList(const std::vector<uint8_t> & blob,std::vector<T> & vec)119 template <typename T> void NetFirewallDbHelper::BlobToList(const std::vector<uint8_t> &blob, std::vector<T> &vec)
120 {
121 vec.clear();
122 size_t blobSize = blob.size();
123 if (blobSize < 1) {
124 return;
125 }
126
127 size_t i = 0;
128 size_t size = sizeof(T);
129 while (i < blobSize) {
130 if ((blobSize - i) < size) {
131 return;
132 }
133 T value;
134 memset_s(&value, size, 0, size);
135 memcpy_s(&value, size, &blob[i], size);
136 vec.emplace_back(value);
137 i += size;
138 }
139 }
140
FillValuesOfFirewallRule(ValuesBucket & values,const NetFirewallRule & rule)141 int32_t NetFirewallDbHelper::FillValuesOfFirewallRule(ValuesBucket &values, const NetFirewallRule &rule)
142 {
143 values.Clear();
144
145 values.PutInt(NET_FIREWALL_USER_ID, rule.userId);
146 values.PutString(NET_FIREWALL_RULE_NAME, rule.ruleName);
147 values.PutString(NET_FIREWALL_RULE_DESC, rule.ruleDescription);
148 values.PutInt(NET_FIREWALL_RULE_DIR, static_cast<int32_t>(rule.ruleDirection));
149 values.PutInt(NET_FIREWALL_RULE_ACTION, static_cast<int32_t>(rule.ruleAction));
150 values.PutInt(NET_FIREWALL_RULE_TYPE, static_cast<int32_t>(rule.ruleType));
151 values.PutInt(NET_FIREWALL_IS_ENABLED, rule.isEnabled);
152 values.PutInt(NET_FIREWALL_APP_ID, rule.appUid);
153 std::vector<uint8_t> blob;
154 std::vector<DataBaseIp> dbIPs;
155 std::vector<DataBasePort> dbPorts;
156 switch (rule.ruleType) {
157 case NetFirewallRuleType::RULE_IP: {
158 values.PutInt(NET_FIREWALL_PROTOCOL, static_cast<int32_t>(rule.protocol));
159 FirewallIpToDbIp(rule.localIps, dbIPs);
160 ListToBlob(dbIPs, blob);
161 values.PutBlob(NET_FIREWALL_LOCAL_IP, blob);
162
163 FirewallIpToDbIp(rule.remoteIps, dbIPs);
164 ListToBlob(dbIPs, blob);
165 values.PutBlob(NET_FIREWALL_REMOTE_IP, blob);
166
167 FirewallPortToDbPort(rule.localPorts, dbPorts);
168 ListToBlob(dbPorts, blob);
169 values.PutBlob(NET_FIREWALL_LOCAL_PORT, blob);
170
171 FirewallPortToDbPort(rule.remotePorts, dbPorts);
172 ListToBlob(dbPorts, blob);
173 values.PutBlob(NET_FIREWALL_REMOTE_PORT, blob);
174 break;
175 }
176 case NetFirewallRuleType::RULE_DNS: {
177 values.PutString(NET_FIREWALL_DNS_PRIMARY, rule.dns.primaryDns);
178 values.PutString(NET_FIREWALL_DNS_STANDY, rule.dns.standbyDns);
179 break;
180 }
181 case NetFirewallRuleType::RULE_DOMAIN: {
182 values.PutInt(DOMAIN_NUM, rule.domains.size());
183 uint32_t fuzzyNum = 0;
184 DomainListToBlob(rule.domains, blob, fuzzyNum);
185 values.PutInt(FUZZY_NUM, fuzzyNum);
186 values.PutBlob(NET_FIREWALL_RULE_DOMAIN, blob);
187 break;
188 }
189 default:
190 break;
191 }
192 return FIREWALL_OK;
193 }
194
195
AddFirewallRule(NativeRdb::ValuesBucket & values,const NetFirewallRule & rule)196 int32_t NetFirewallDbHelper::AddFirewallRule(NativeRdb::ValuesBucket &values, const NetFirewallRule &rule)
197 {
198 FillValuesOfFirewallRule(values, rule);
199 return firewallDatabase_->Insert(values, FIREWALL_TABLE_NAME);
200 }
201
AddFirewallRuleRecord(const NetFirewallRule & rule)202 int32_t NetFirewallDbHelper::AddFirewallRuleRecord(const NetFirewallRule &rule)
203 {
204 std::lock_guard<std::mutex> guard(databaseMutex_);
205 ValuesBucket values;
206 int32_t ret = AddFirewallRule(values, rule);
207 if (ret < FIREWALL_OK) {
208 NETMGR_EXT_LOG_E("AddFirewallRule Insert error: %{public}d", ret);
209 (void)firewallDatabase_->RollBack();
210 }
211 return ret;
212 }
213
CheckIfNeedUpdateEx(const std::string & tableName,bool & isUpdate,int32_t ruleId,NetFirewallRule & oldRule)214 int32_t NetFirewallDbHelper::CheckIfNeedUpdateEx(const std::string &tableName, bool &isUpdate, int32_t ruleId,
215 NetFirewallRule &oldRule)
216 {
217 std::vector<std::string> columns;
218 RdbPredicates rdbPredicates(tableName);
219 rdbPredicates.BeginWrap()->EqualTo(RULE_ID, std::to_string(ruleId))->EndWrap();
220 auto resultSet = firewallDatabase_->Query(rdbPredicates, columns);
221 if (resultSet == nullptr) {
222 NETMGR_EXT_LOG_E("Query error");
223 return FIREWALL_RDB_EXECUTE_FAILTURE;
224 }
225 int32_t rowCount = 0;
226 if (resultSet->GetRowCount(rowCount) != E_OK) {
227 NETMGR_EXT_LOG_E("GetRowCount error");
228 return FIREWALL_RDB_EXECUTE_FAILTURE;
229 }
230 std::vector<NetFirewallRule> rules;
231 GetResultRightRecordEx(resultSet, rules);
232 isUpdate = rowCount > 0 && !rules.empty();
233 if (!rules.empty()) {
234 oldRule.ruleId = rules[0].ruleId;
235 oldRule.userId = rules[0].userId;
236 oldRule.ruleType = rules[0].ruleType;
237 oldRule.isEnabled = rules[0].isEnabled;
238 }
239 return FIREWALL_OK;
240 }
241
UpdateFirewallRuleRecord(const NetFirewallRule & rule)242 int32_t NetFirewallDbHelper::UpdateFirewallRuleRecord(const NetFirewallRule &rule)
243 {
244 std::lock_guard<std::mutex> guard(databaseMutex_);
245
246 ValuesBucket values;
247 FillValuesOfFirewallRule(values, rule);
248 int32_t changedRows = 0;
249 int32_t ret = firewallDatabase_->Update(FIREWALL_TABLE_NAME, changedRows, values, "ruleId = ?",
250 std::vector<std::string> { std::to_string(rule.ruleId) });
251 if (ret < FIREWALL_OK) {
252 NETMGR_EXT_LOG_E("Update error: %{public}d", ret);
253 (void)firewallDatabase_->RollBack();
254 }
255 return ret;
256 }
257
GetParamRuleInfoFormResultSet(std::string & columnName,int32_t index,NetFirewallRuleInfo & table)258 void NetFirewallDbHelper::GetParamRuleInfoFormResultSet(std::string &columnName, int32_t index,
259 NetFirewallRuleInfo &table)
260 {
261 if (columnName == NET_FIREWALL_PROTOCOL) {
262 table.protocolIndex = index;
263 return;
264 }
265 if (columnName == NET_FIREWALL_LOCAL_IP) {
266 table.localIpsIndex = index;
267 return;
268 }
269 if (columnName == NET_FIREWALL_REMOTE_IP) {
270 table.remoteIpsIndex = index;
271 return;
272 }
273 if (columnName == NET_FIREWALL_LOCAL_PORT) {
274 table.localPortsIndex = index;
275 return;
276 }
277 if (columnName == NET_FIREWALL_REMOTE_PORT) {
278 table.remotePortsIndex = index;
279 return;
280 }
281 if (columnName == NET_FIREWALL_RULE_DOMAIN) {
282 table.domainsIndex = index;
283 return;
284 }
285 if (columnName == NET_FIREWALL_DNS_PRIMARY) {
286 table.primaryDnsIndex = index;
287 return;
288 }
289 if (columnName == NET_FIREWALL_DNS_STANDY) {
290 table.standbyDnsIndex = index;
291 }
292 }
293
GetResultSetTableInfo(const std::shared_ptr<OHOS::NativeRdb::ResultSet> & resultSet,NetFirewallRuleInfo & table)294 int32_t NetFirewallDbHelper::GetResultSetTableInfo(const std::shared_ptr<OHOS::NativeRdb::ResultSet> &resultSet,
295 NetFirewallRuleInfo &table)
296 {
297 std::vector<std::string> columnNames;
298 if (resultSet->GetRowCount(table.rowCount) != E_OK || resultSet->GetAllColumnNames(columnNames) != E_OK) {
299 NETMGR_EXT_LOG_E("get table info failed");
300 return FIREWALL_RDB_EXECUTE_FAILTURE;
301 }
302 int32_t columnNamesCount = static_cast<int32_t>(columnNames.size());
303 for (int32_t i = 0; i < columnNamesCount; i++) {
304 std::string &columnName = columnNames.at(i);
305 if (columnName == RULE_ID) {
306 table.ruleIdIndex = i;
307 continue;
308 }
309 if (columnName == NET_FIREWALL_USER_ID) {
310 table.userIdIndex = i;
311 continue;
312 }
313 if (columnName == NET_FIREWALL_RULE_NAME) {
314 table.ruleNameIndex = i;
315 continue;
316 }
317 if (columnName == NET_FIREWALL_RULE_DESC) {
318 table.ruleDescriptionIndex = i;
319 continue;
320 }
321 if (columnName == NET_FIREWALL_RULE_DIR) {
322 table.ruleDirectionIndex = i;
323 continue;
324 }
325 if (columnName == NET_FIREWALL_RULE_ACTION) {
326 table.ruleActionIndex = i;
327 continue;
328 }
329 if (columnName == NET_FIREWALL_RULE_TYPE) {
330 table.ruleTypeIndex = i;
331 continue;
332 }
333 if (columnName == NET_FIREWALL_IS_ENABLED) {
334 table.isEnabledIndex = i;
335 continue;
336 }
337 if (columnName == NET_FIREWALL_APP_ID) {
338 table.appUidIndex = i;
339 continue;
340 }
341 GetParamRuleInfoFormResultSet(columnName, i, table);
342 }
343 return FIREWALL_OK;
344 }
345
GetResultSetTableInfo(const std::shared_ptr<OHOS::NativeRdb::ResultSet> & resultSet,NetInterceptRecordInfo & table)346 int32_t NetFirewallDbHelper::GetResultSetTableInfo(const std::shared_ptr<OHOS::NativeRdb::ResultSet> &resultSet,
347 NetInterceptRecordInfo &table)
348 {
349 int32_t rowCount = 0;
350 std::vector<std::string> columnNames;
351 if (resultSet->GetRowCount(rowCount) != E_OK || resultSet->GetAllColumnNames(columnNames) != E_OK) {
352 NETMGR_EXT_LOG_E("get table info failed");
353 return FIREWALL_RDB_EXECUTE_FAILTURE;
354 }
355 int32_t columnNamesCount = static_cast<int32_t>(columnNames.size());
356 for (int32_t i = 0; i < columnNamesCount; i++) {
357 std::string &columnName = columnNames.at(i);
358 if (columnName == NET_FIREWALL_RECORD_TIME) {
359 table.timeIndex = i;
360 continue;
361 }
362 if (columnName == NET_FIREWALL_RECORD_LOCAL_IP) {
363 table.localIpIndex = i;
364 continue;
365 }
366 if (columnName == NET_FIREWALL_RECORD_REMOTE_IP) {
367 table.remoteIpIndex = i;
368 continue;
369 }
370 if (columnName == NET_FIREWALL_RECORD_LOCAL_PORT) {
371 table.localPortIndex = i;
372 continue;
373 }
374 if (columnName == NET_FIREWALL_RECORD_REMOTE_PORT) {
375 table.remotePortIndex = i;
376 continue;
377 }
378 if (columnName == NET_FIREWALL_RECORD_PROTOCOL) {
379 table.protocolIndex = i;
380 continue;
381 }
382 if (columnName == NET_FIREWALL_RECORD_UID) {
383 table.appUidIndex = i;
384 continue;
385 }
386 if (columnName == NET_FIREWALL_DOMAIN) {
387 table.domainIndex = i;
388 }
389 }
390 table.rowCount = rowCount;
391 return FIREWALL_OK;
392 }
393
GetRuleDataFromResultSet(const std::shared_ptr<OHOS::NativeRdb::ResultSet> & resultSet,const NetFirewallRuleInfo & table,NetFirewallRule & info)394 void NetFirewallDbHelper::GetRuleDataFromResultSet(const std::shared_ptr<OHOS::NativeRdb::ResultSet> &resultSet,
395 const NetFirewallRuleInfo &table, NetFirewallRule &info)
396 {
397 resultSet->GetInt(table.userIdIndex, info.userId);
398 resultSet->GetString(table.ruleNameIndex, info.ruleName);
399 resultSet->GetString(table.ruleDescriptionIndex, info.ruleDescription);
400 int ruleDirection = 0;
401 if (resultSet->GetInt(table.ruleDirectionIndex, ruleDirection) == E_OK) {
402 info.ruleDirection = static_cast<NetFirewallRuleDirection>(ruleDirection);
403 }
404 int ruleAction = 0;
405 if (resultSet->GetInt(table.ruleActionIndex, ruleAction) == E_OK) {
406 info.ruleAction = static_cast<FirewallRuleAction>(ruleAction);
407 }
408 int ruleType = 0;
409 if (resultSet->GetInt(table.ruleTypeIndex, ruleType) == E_OK) {
410 info.ruleType = static_cast<NetFirewallRuleType>(ruleType);
411 }
412 int isEnabled = 0;
413 if (resultSet->GetInt(table.isEnabledIndex, isEnabled) == E_OK) {
414 info.isEnabled = static_cast<bool>(isEnabled);
415 }
416 resultSet->GetInt(table.appUidIndex, info.appUid);
417 GetRuleListParamFromResultSet(resultSet, table, info);
418 }
419
GetRuleListParamFromResultSet(const std::shared_ptr<OHOS::NativeRdb::ResultSet> & resultSet,const NetFirewallRuleInfo & table,NetFirewallRule & info)420 void NetFirewallDbHelper::GetRuleListParamFromResultSet(const std::shared_ptr<OHOS::NativeRdb::ResultSet> &resultSet,
421 const NetFirewallRuleInfo &table, NetFirewallRule &info)
422 {
423 std::vector<uint8_t> value;
424 std::vector<DataBaseIp> dbIPs;
425 std::vector<DataBasePort> dbPorts;
426 switch (info.ruleType) {
427 case NetFirewallRuleType::RULE_IP: {
428 int protocol = 0;
429 if (resultSet->GetInt(table.protocolIndex, protocol) == E_OK) {
430 info.protocol = static_cast<NetworkProtocol>(protocol);
431 }
432 resultSet->GetBlob(table.localIpsIndex, value);
433 BlobToList(value, dbIPs);
434 DbIpToFirewallIp(dbIPs, info.localIps);
435 value.clear();
436 resultSet->GetBlob(table.remoteIpsIndex, value);
437 BlobToList(value, dbIPs);
438 DbIpToFirewallIp(dbIPs, info.remoteIps);
439 value.clear();
440 resultSet->GetBlob(table.localPortsIndex, value);
441 BlobToList(value, dbPorts);
442 DbPortToFirewallPort(dbPorts, info.localPorts);
443 value.clear();
444 resultSet->GetBlob(table.remotePortsIndex, value);
445 BlobToList(value, dbPorts);
446 DbPortToFirewallPort(dbPorts, info.remotePorts);
447 break;
448 }
449 case NetFirewallRuleType::RULE_DNS: {
450 resultSet->GetString(table.primaryDnsIndex, info.dns.primaryDns);
451 resultSet->GetString(table.standbyDnsIndex, info.dns.standbyDns);
452 break;
453 }
454
455 case NetFirewallRuleType::RULE_DOMAIN: {
456 resultSet->GetBlob(table.domainsIndex, value);
457 BlobToDomainList(value, info.domains);
458 break;
459 }
460 default:
461 break;
462 }
463 }
464
GetResultRightRecordEx(const std::shared_ptr<OHOS::NativeRdb::ResultSet> & resultSet,std::vector<NetFirewallRule> & rules)465 int32_t NetFirewallDbHelper::GetResultRightRecordEx(const std::shared_ptr<OHOS::NativeRdb::ResultSet> &resultSet,
466 std::vector<NetFirewallRule> &rules)
467 {
468 NetFirewallRuleInfo table;
469 int32_t ret = GetResultSetTableInfo(resultSet, table);
470 if (ret < FIREWALL_OK) {
471 NETMGR_EXT_LOG_E("GetResultSetTableInfo failed");
472 return ret;
473 }
474
475 bool endFlag = false;
476 NetFirewallRule info;
477 for (int32_t i = 0; (i < table.rowCount) && !endFlag; i++) {
478 if (resultSet->GoToRow(i) != E_OK) {
479 NETMGR_EXT_LOG_E("GoToRow %{public}d", i);
480 break;
481 }
482 resultSet->GetInt(table.ruleIdIndex, info.ruleId);
483 if (info.ruleId > 0) {
484 GetRuleDataFromResultSet(resultSet, table, info);
485 rules.emplace_back(std::move(info));
486 }
487
488 resultSet->IsEnded(endFlag);
489 }
490 resultSet->Close();
491 return rules.size();
492 }
493
GetResultRightRecordEx(const std::shared_ptr<OHOS::NativeRdb::ResultSet> & resultSet,std::vector<InterceptRecord> & rules)494 int32_t NetFirewallDbHelper::GetResultRightRecordEx(const std::shared_ptr<OHOS::NativeRdb::ResultSet> &resultSet,
495 std::vector<InterceptRecord> &rules)
496 {
497 NetInterceptRecordInfo table;
498 int32_t ret = GetResultSetTableInfo(resultSet, table);
499 if (ret < FIREWALL_OK) {
500 NETMGR_EXT_LOG_E("GetResultSetTableInfo failed");
501 return ret;
502 }
503
504 bool endFlag = false;
505 int32_t localPort = 0;
506 int32_t remotePort = 0;
507 int32_t protocol = 0;
508 InterceptRecord info;
509 for (int32_t i = 0; (i < table.rowCount) && !endFlag; i++) {
510 if (resultSet->GoToRow(i) != E_OK) {
511 NETMGR_EXT_LOG_E("GetResultRightRecordEx GoToRow %{public}d", i);
512 break;
513 }
514 resultSet->GetInt(table.timeIndex, info.time);
515 resultSet->GetString(table.localIpIndex, info.localIp);
516 resultSet->GetString(table.remoteIpIndex, info.remoteIp);
517 if (resultSet->GetInt(table.localPortIndex, localPort) == E_OK) {
518 info.localPort = static_cast<uint16_t>(localPort);
519 }
520 if (resultSet->GetInt(table.remotePortIndex, remotePort) == E_OK) {
521 info.remotePort = static_cast<uint16_t>(remotePort);
522 }
523 if (resultSet->GetInt(table.protocolIndex, protocol) == E_OK) {
524 info.protocol = static_cast<uint16_t>(protocol);
525 }
526 resultSet->GetInt(table.appUidIndex, info.appUid);
527 resultSet->GetString(table.domainIndex, info.domain);
528 if (info.time > 0) {
529 rules.emplace_back(std::move(info));
530 }
531 resultSet->IsEnded(endFlag);
532 }
533 int32_t index = 0;
534 resultSet->GetRowIndex(index);
535 resultSet->IsEnded(endFlag);
536 NETMGR_EXT_LOG_I("row=%{public}d pos=%{public}d ret=%{public}zu end=%{public}s", table.rowCount, index,
537 rules.size(), (endFlag ? "yes" : "no"));
538
539 resultSet->Close();
540 return rules.size();
541 }
542
543 template <typename T>
QueryAndGetResult(const NativeRdb::RdbPredicates & rdbPredicates,const std::vector<std::string> & columns,std::vector<T> & rules)544 int32_t NetFirewallDbHelper::QueryAndGetResult(const NativeRdb::RdbPredicates &rdbPredicates,
545 const std::vector<std::string> &columns, std::vector<T> &rules)
546 {
547 auto resultSet = firewallDatabase_->Query(rdbPredicates, columns);
548 if (resultSet == nullptr) {
549 NETMGR_EXT_LOG_E("Query error");
550 return FIREWALL_RDB_EXECUTE_FAILTURE;
551 }
552 return GetResultRightRecordEx(resultSet, rules);
553 }
554
QueryAllFirewallRuleRecord(std::vector<NetFirewallRule> & rules)555 int32_t NetFirewallDbHelper::QueryAllFirewallRuleRecord(std::vector<NetFirewallRule> &rules)
556 {
557 std::lock_guard<std::mutex> guard(databaseMutex_);
558 NETMGR_EXT_LOG_I("Query detail: all user");
559 std::vector<std::string> columns;
560 RdbPredicates rdbPredicates(FIREWALL_TABLE_NAME);
561 return QueryFirewallRuleRecord(rdbPredicates, columns, rules);
562 }
563
QueryAllUserEnabledFirewallRules(std::vector<NetFirewallRule> & rules,NetFirewallRuleType type)564 int32_t NetFirewallDbHelper::QueryAllUserEnabledFirewallRules(std::vector<NetFirewallRule> &rules,
565 NetFirewallRuleType type)
566 {
567 std::lock_guard<std::mutex> guard(databaseMutex_);
568 NETMGR_EXT_LOG_I("Query detail: all user");
569 std::vector<std::string> columns;
570 RdbPredicates rdbPredicates(FIREWALL_TABLE_NAME);
571 rdbPredicates.BeginWrap()->EqualTo(NET_FIREWALL_IS_ENABLED, "1");
572 if (type != NetFirewallRuleType::RULE_ALL && type != NetFirewallRuleType::RULE_INVALID) {
573 rdbPredicates.And()->EqualTo(NET_FIREWALL_RULE_TYPE, std::to_string(static_cast<int32_t>(type)));
574 }
575 rdbPredicates.EndWrap();
576 return QueryFirewallRuleRecord(rdbPredicates, columns, rules);
577 }
578
QueryEnabledFirewallRules(int32_t userId,int32_t appUid,std::vector<NetFirewallRule> & rules)579 int32_t NetFirewallDbHelper::QueryEnabledFirewallRules(int32_t userId, int32_t appUid,
580 std::vector<NetFirewallRule> &rules)
581 {
582 std::lock_guard<std::mutex> guard(databaseMutex_);
583 NETMGR_EXT_LOG_I("QueryEnabledFirewallRules : userId=%{public}d ", userId);
584 std::vector<std::string> columns;
585 RdbPredicates rdbPredicates(FIREWALL_TABLE_NAME);
586 rdbPredicates.BeginWrap()
587 ->EqualTo(NET_FIREWALL_USER_ID, std::to_string(userId))
588 ->And()
589 ->EqualTo(NET_FIREWALL_IS_ENABLED, "1")
590 ->And()
591 ->EqualTo(NET_FIREWALL_APP_ID, appUid)
592 ->EndWrap();
593 return QueryFirewallRuleRecord(rdbPredicates, columns, rules);
594 }
595
QueryFirewallRuleRecord(int32_t ruleId,int32_t userId,std::vector<NetFirewallRule> & rules)596 int32_t NetFirewallDbHelper::QueryFirewallRuleRecord(int32_t ruleId, int32_t userId,
597 std::vector<NetFirewallRule> &rules)
598 {
599 std::lock_guard<std::mutex> guard(databaseMutex_);
600 NETMGR_EXT_LOG_I("Query detail: ruleId=%{public}d userId=%{public}d", ruleId, userId);
601 std::vector<std::string> columns;
602 RdbPredicates rdbPredicates(FIREWALL_TABLE_NAME);
603 rdbPredicates.BeginWrap()
604 ->EqualTo(RULE_ID, std::to_string(ruleId))
605 ->And()
606 ->EqualTo(NET_FIREWALL_USER_ID, std::to_string(userId))
607 ->EndWrap();
608
609 return QueryFirewallRuleRecord(rdbPredicates, columns, rules);
610 }
611
QueryFirewallRuleRecord(const NativeRdb::RdbPredicates & rdbPredicates,const std::vector<std::string> & columns,std::vector<NetFirewallRule> & rules)612 int32_t NetFirewallDbHelper::QueryFirewallRuleRecord(const NativeRdb::RdbPredicates &rdbPredicates,
613 const std::vector<std::string> &columns, std::vector<NetFirewallRule> &rules)
614 {
615 int32_t ret = QueryAndGetResult(rdbPredicates, columns, rules);
616 if (ret < 0) {
617 NETMGR_EXT_LOG_E("QueryFirewallRuleRecord error.");
618 return ret;
619 }
620 size_t size = rules.size();
621 if (size == 0) {
622 NETMGR_EXT_LOG_I("QueryFirewallRuleRecord rule empty");
623 return FIREWALL_OK;
624 }
625 NETMGR_EXT_LOG_I("QueryFirewallRuleRecord rule size: %{public}zu", size);
626 return FIREWALL_OK;
627 }
628
DeleteAndNoOtherOperation(const std::string & whereClause,const std::vector<std::string> & whereArgs)629 int32_t NetFirewallDbHelper::DeleteAndNoOtherOperation(const std::string &whereClause,
630 const std::vector<std::string> &whereArgs)
631 {
632 int32_t changedRows = 0;
633 int32_t ret = firewallDatabase_->Delete(FIREWALL_TABLE_NAME, changedRows, whereClause, whereArgs);
634 if (ret < FIREWALL_OK) {
635 (void)firewallDatabase_->RollBack();
636 return FIREWALL_FAILURE;
637 }
638 return ret;
639 }
640
DeleteFirewallRuleRecord(int32_t userId,int32_t ruleId)641 int32_t NetFirewallDbHelper::DeleteFirewallRuleRecord(int32_t userId, int32_t ruleId)
642 {
643 std::lock_guard<std::mutex> guard(databaseMutex_);
644 std::string whereClause = { "userId = ? AND ruleId = ?" };
645 std::vector<std::string> whereArgs = { std::to_string(userId), std::to_string(ruleId) };
646 int32_t ret = DeleteAndNoOtherOperation(whereClause, whereArgs);
647 if (ret != FIREWALL_OK) {
648 NETMGR_EXT_LOG_E("failed: detale(ruleId): %{public}d", ret);
649 }
650 return ret;
651 }
652
DeleteFirewallRuleRecordByUserId(int32_t userId)653 int32_t NetFirewallDbHelper::DeleteFirewallRuleRecordByUserId(int32_t userId)
654 {
655 std::lock_guard<std::mutex> guard(databaseMutex_);
656 std::string whereClause = { "userId = ?" };
657 std::vector<std::string> whereArgs = { std::to_string(userId) };
658 int32_t ret = DeleteAndNoOtherOperation(whereClause, whereArgs);
659 if (ret != FIREWALL_OK) {
660 NETMGR_EXT_LOG_E("failed: detale(ruleId): %{public}d", ret);
661 }
662 return ret;
663 }
664
DeleteFirewallRuleRecordByAppId(int32_t appUid)665 int32_t NetFirewallDbHelper::DeleteFirewallRuleRecordByAppId(int32_t appUid)
666 {
667 std::lock_guard<std::mutex> guard(databaseMutex_);
668 std::string whereClause = { "appUid = ?" };
669 std::vector<std::string> whereArgs = { std::to_string(appUid) };
670 int32_t ret = DeleteAndNoOtherOperation(whereClause, whereArgs);
671 if (ret != FIREWALL_OK) {
672 NETMGR_EXT_LOG_E("failed: detale(ruleId): %{public}d", ret);
673 }
674 return ret;
675 }
676
IsFirewallRuleExist(int32_t ruleId,NetFirewallRule & oldRule)677 bool NetFirewallDbHelper::IsFirewallRuleExist(int32_t ruleId, NetFirewallRule &oldRule)
678 {
679 std::lock_guard<std::mutex> guard(databaseMutex_);
680 bool isExist = false;
681 int32_t ret = CheckIfNeedUpdateEx(FIREWALL_TABLE_NAME, isExist, ruleId, oldRule);
682 if (ret < FIREWALL_OK) {
683 NETMGR_EXT_LOG_E("check if need update error: %{public}d", ret);
684 }
685 return isExist;
686 }
687
QueryFirewallRuleByUserIdCount(int32_t userId,int64_t & rowCount)688 int32_t NetFirewallDbHelper::QueryFirewallRuleByUserIdCount(int32_t userId, int64_t &rowCount)
689 {
690 RdbPredicates rdbPredicates(FIREWALL_TABLE_NAME);
691 rdbPredicates.BeginWrap()->EqualTo(NET_FIREWALL_USER_ID, std::to_string(userId))->EndWrap();
692
693 return Count(rowCount, rdbPredicates);
694 }
695
QueryFirewallRuleAllCount(int64_t & rowCount)696 int32_t NetFirewallDbHelper::QueryFirewallRuleAllCount(int64_t &rowCount)
697 {
698 RdbPredicates rdbPredicates(FIREWALL_TABLE_NAME);
699 return Count(rowCount, rdbPredicates);
700 }
701
QueryFirewallRuleAllDomainCount()702 int32_t NetFirewallDbHelper::QueryFirewallRuleAllDomainCount()
703 {
704 return QuerySql(SQL_SUM + DOMAIN_NUM + SQL_FROM + FIREWALL_TABLE_NAME);
705 }
706
QueryFirewallRuleAllFuzzyDomainCount()707 int32_t NetFirewallDbHelper::QueryFirewallRuleAllFuzzyDomainCount()
708 {
709 return QuerySql(SQL_SUM + FUZZY_NUM + SQL_FROM + FIREWALL_TABLE_NAME);
710 }
711
QueryFirewallRuleDomainByUserIdCount(int32_t userId)712 int32_t NetFirewallDbHelper::QueryFirewallRuleDomainByUserIdCount(int32_t userId)
713 {
714 return QuerySql(SQL_SUM + DOMAIN_NUM + SQL_FROM + FIREWALL_TABLE_NAME + " WHERE (" + NET_FIREWALL_USER_ID + " = " +
715 std::to_string(userId) + ")");
716 }
717
QueryFirewallRule(const int32_t userId,const sptr<RequestParam> & requestParam,sptr<FirewallRulePage> & info)718 int32_t NetFirewallDbHelper::QueryFirewallRule(const int32_t userId, const sptr<RequestParam> &requestParam,
719 sptr<FirewallRulePage> &info)
720 {
721 std::lock_guard<std::mutex> guard(databaseMutex_);
722 int64_t rowCount = 0;
723 RdbPredicates rdbPredicates(FIREWALL_TABLE_NAME);
724 rdbPredicates.BeginWrap()->EqualTo(NET_FIREWALL_USER_ID, std::to_string(userId))->EndWrap();
725 firewallDatabase_->Count(rowCount, rdbPredicates);
726 if (rowCount == 0) {
727 NETMGR_EXT_LOG_I("QueryFirewallRule: no rule found");
728 return FIREWALL_OK;
729 }
730 info->totalPage = rowCount / requestParam->pageSize;
731 int32_t remainder = rowCount % requestParam->pageSize;
732 if (remainder > 0) {
733 info->totalPage += 1;
734 }
735 NETMGR_EXT_LOG_I("QueryFirewallRule: userId=%{public}d page=%{public}d pageSize=%{public}d total=%{public}d",
736 userId, requestParam->page, requestParam->pageSize, info->totalPage);
737 if (info->totalPage < requestParam->page) {
738 return FIREWALL_FAILURE;
739 }
740 std::vector<std::string> columns;
741 rdbPredicates.Clear();
742 rdbPredicates.BeginWrap()->EqualTo(NET_FIREWALL_USER_ID, std::to_string(userId));
743 if (requestParam->orderType == NetFirewallOrderType::ORDER_ASC) {
744 rdbPredicates.OrderByAsc(NET_FIREWALL_RULE_NAME);
745 } else {
746 rdbPredicates.OrderByDesc(NET_FIREWALL_RULE_NAME);
747 }
748 rdbPredicates.Limit((requestParam->page - 1) * requestParam->pageSize, requestParam->pageSize)->EndWrap();
749 return QueryFirewallRuleRecord(rdbPredicates, columns, info->data);
750 }
751
Count(int64_t & outValue,const OHOS::NativeRdb::AbsRdbPredicates & predicates)752 int32_t NetFirewallDbHelper::Count(int64_t &outValue, const OHOS::NativeRdb::AbsRdbPredicates &predicates)
753 {
754 std::lock_guard<std::mutex> guard(databaseMutex_);
755 int32_t ret = firewallDatabase_->Count(outValue, predicates);
756 if (ret < FIREWALL_OK) {
757 NETMGR_EXT_LOG_E("Count error");
758 return -1;
759 }
760 return ret;
761 }
762
QuerySql(const std::string & sql)763 int32_t NetFirewallDbHelper::QuerySql(const std::string &sql)
764 {
765 std::lock_guard<std::mutex> guard(databaseMutex_);
766 std::vector<std::string> selectionArgs;
767 auto resultSet = firewallDatabase_->QuerySql(sql, selectionArgs);
768 if (resultSet == nullptr) {
769 NETMGR_EXT_LOG_E("QuerySql error");
770 return FIREWALL_RDB_EXECUTE_FAILTURE;
771 }
772 int32_t rowCount = 0;
773 if (resultSet->GetRowCount(rowCount) != E_OK || resultSet->GoToRow(0) != E_OK) {
774 return FIREWALL_RDB_EXECUTE_FAILTURE;
775 }
776 int32_t value = 0;
777 resultSet->GetInt(0, value);
778 return value;
779 }
780
IsDnsRuleExist(const sptr<NetFirewallRule> & rule)781 bool NetFirewallDbHelper::IsDnsRuleExist(const sptr<NetFirewallRule> &rule)
782 {
783 if (rule->ruleType != NetFirewallRuleType::RULE_DNS) {
784 return false;
785 }
786 std::lock_guard<std::mutex> guard(databaseMutex_);
787 RdbPredicates rdbPredicates(FIREWALL_TABLE_NAME);
788 rdbPredicates.BeginWrap()
789 ->EqualTo(NET_FIREWALL_USER_ID, std::to_string(rule->userId))
790 ->And()
791 ->EqualTo(NET_FIREWALL_RULE_TYPE, std::to_string(static_cast<int32_t>(rule->ruleType)))
792 ->And()
793 ->EqualTo(NET_FIREWALL_APP_ID, std::to_string(rule->appUid))
794 ->And()
795 ->BeginWrap()
796 ->EqualTo(NET_FIREWALL_DNS_PRIMARY, rule->dns.primaryDns)
797 ->Or()
798 ->EqualTo(NET_FIREWALL_DNS_STANDY, rule->dns.standbyDns)
799 ->EndWrap()
800 ->Limit(1)
801 ->EndWrap();
802 std::vector<std::string> columns;
803 auto resultSet = firewallDatabase_->Query(rdbPredicates, columns);
804 if (resultSet == nullptr) {
805 NETMGR_EXT_LOG_E("IsDnsRuleExist Query error");
806 return false;
807 }
808 int32_t rowCount = 0;
809 resultSet->GetRowCount(rowCount);
810 return rowCount > 0;
811 }
812
AddInterceptRecord(const int32_t userId,std::vector<sptr<InterceptRecord>> & records)813 int32_t NetFirewallDbHelper::AddInterceptRecord(const int32_t userId, std::vector<sptr<InterceptRecord>> &records)
814 {
815 std::lock_guard<std::mutex> guard(databaseMutex_);
816 int32_t ret = firewallDatabase_->BeginTransaction();
817 // Aging by date, record up to 8 days of data
818 std::string whereClause = { "userId = ? AND time < ?" };
819 std::vector<std::string> whereArgs = { std::to_string(userId),
820 std::to_string(records.back()->time - RECORD_MAX_SAVE_TIME) };
821 int32_t changedRows = 0;
822 ret = firewallDatabase_->Delete(INTERCEPT_RECORD_TABLE, changedRows, whereClause, whereArgs);
823
824 int64_t currentRows = 0;
825 RdbPredicates rdbPredicates(INTERCEPT_RECORD_TABLE);
826 rdbPredicates.BeginWrap()->EqualTo(NET_FIREWALL_USER_ID, std::to_string(userId))->EndWrap();
827 firewallDatabase_->Count(currentRows, rdbPredicates);
828 // Aging by number, record up to 1000 pieces of data
829 size_t size = records.size();
830 size_t leftRows = static_cast<size_t>(RECORD_MAX_DATA_NUM - currentRows);
831 if (leftRows < size) {
832 std::string whereClause("id in (select id from ");
833 whereClause += INTERCEPT_RECORD_TABLE;
834 whereClause += " where userId = ? order by id limit ? )";
835 std::vector<std::string> whereArgs = { std::to_string(userId), std::to_string(size - leftRows) };
836 ret = firewallDatabase_->Delete(INTERCEPT_RECORD_TABLE, changedRows, whereClause, whereArgs);
837 }
838 // New data written to the database
839 ValuesBucket values;
840 for (size_t i = 0; i < size; i++) {
841 values.Clear();
842 values.PutInt(NET_FIREWALL_USER_ID, userId);
843 values.PutInt(NET_FIREWALL_RECORD_TIME, records[i]->time);
844 values.PutString(NET_FIREWALL_RECORD_LOCAL_IP, records[i]->localIp);
845 values.PutString(NET_FIREWALL_RECORD_REMOTE_IP, records[i]->remoteIp);
846 values.PutInt(NET_FIREWALL_RECORD_LOCAL_PORT, static_cast<int32_t>(records[i]->localPort));
847 values.PutInt(NET_FIREWALL_RECORD_REMOTE_PORT, static_cast<int32_t>(records[i]->remotePort));
848 values.PutInt(NET_FIREWALL_RECORD_PROTOCOL, static_cast<int32_t>(records[i]->protocol));
849 values.PutInt(NET_FIREWALL_RECORD_UID, records[i]->appUid);
850 values.PutString(NET_FIREWALL_DOMAIN, records[i]->domain);
851
852 ret = firewallDatabase_->Insert(values, INTERCEPT_RECORD_TABLE);
853 if (ret < FIREWALL_OK) {
854 NETMGR_EXT_LOG_E("AddInterceptRecord error: %{public}d", ret);
855 firewallDatabase_->Commit();
856 return -1;
857 }
858 }
859 return firewallDatabase_->Commit();
860 }
861
DeleteInterceptRecord(const int32_t userId)862 int32_t NetFirewallDbHelper::DeleteInterceptRecord(const int32_t userId)
863 {
864 std::lock_guard<std::mutex> guard(databaseMutex_);
865 std::string whereClause = { "userId = ?" };
866 std::vector<std::string> whereArgs = { std::to_string(userId) };
867 int32_t changedRows = 0;
868 int32_t ret = firewallDatabase_->Delete(INTERCEPT_RECORD_TABLE, changedRows, whereClause, whereArgs);
869 if (ret < FIREWALL_OK) {
870 NETMGR_EXT_LOG_E("DeleteInterceptRecord error: %{public}d", ret);
871 return -1;
872 }
873 return ret;
874 }
875
QueryInterceptRecord(const int32_t userId,const sptr<RequestParam> & requestParam,sptr<InterceptRecordPage> & info)876 int32_t NetFirewallDbHelper::QueryInterceptRecord(const int32_t userId, const sptr<RequestParam> &requestParam,
877 sptr<InterceptRecordPage> &info)
878 {
879 std::lock_guard<std::mutex> guard(databaseMutex_);
880 int64_t rowCount = 0;
881 RdbPredicates rdbPredicates(INTERCEPT_RECORD_TABLE);
882 rdbPredicates.BeginWrap()->EqualTo(NET_FIREWALL_USER_ID, std::to_string(userId))->EndWrap();
883 firewallDatabase_->Count(rowCount, rdbPredicates);
884 info->totalPage = rowCount / requestParam->pageSize;
885 int32_t remainder = rowCount % requestParam->pageSize;
886 if (remainder > 0) {
887 info->totalPage += 1;
888 }
889 NETMGR_EXT_LOG_I("QueryInterceptRecord: userId=%{public}d page=%{public}d pageSize=%{public}d total=%{public}d",
890 userId, requestParam->page, requestParam->pageSize, info->totalPage);
891 if (info->totalPage < requestParam->page) {
892 return FIREWALL_FAILURE;
893 }
894 info->page = requestParam->page;
895 std::vector<std::string> columns;
896 rdbPredicates.Clear();
897 rdbPredicates.BeginWrap()->EqualTo(NET_FIREWALL_USER_ID, std::to_string(userId));
898 if (requestParam->orderType == NetFirewallOrderType::ORDER_ASC) {
899 rdbPredicates.OrderByAsc(NET_FIREWALL_RECORD_TIME);
900 } else {
901 rdbPredicates.OrderByDesc(NET_FIREWALL_RECORD_TIME);
902 }
903 rdbPredicates.Limit((requestParam->page - 1) * requestParam->pageSize, requestParam->pageSize)->EndWrap();
904 return QueryAndGetResult(rdbPredicates, columns, info->data);
905 }
906
FirewallIpToDbIp(const std::vector<NetFirewallIpParam> & ips,std::vector<DataBaseIp> & dbips)907 void NetFirewallDbHelper::FirewallIpToDbIp(const std::vector<NetFirewallIpParam> &ips, std::vector<DataBaseIp> &dbips)
908 {
909 dbips.clear();
910 DataBaseIp dbip;
911 for (const NetFirewallIpParam ¶m : ips) {
912 dbip.family = param.family;
913 dbip.mask = param.mask;
914 dbip.type = param.type;
915 if (dbip.family == FAMILY_IPV4) {
916 memcpy_s(&dbip.ipv4.startIp, sizeof(uint32_t), ¶m.ipv4.startIp, sizeof(uint32_t));
917 memcpy_s(&dbip.ipv4.endIp, sizeof(uint32_t), ¶m.ipv4.endIp, sizeof(uint32_t));
918 } else {
919 memcpy_s(&dbip.ipv6.startIp, sizeof(in6_addr), ¶m.ipv6.startIp, sizeof(in6_addr));
920 memcpy_s(&dbip.ipv6.endIp, sizeof(in6_addr), ¶m.ipv6.endIp, sizeof(in6_addr));
921 }
922 dbips.emplace_back(std::move(dbip));
923 }
924 }
DbIpToFirewallIp(const std::vector<DataBaseIp> & dbips,std::vector<NetFirewallIpParam> & ips)925 void NetFirewallDbHelper::DbIpToFirewallIp(const std::vector<DataBaseIp> &dbips, std::vector<NetFirewallIpParam> &ips)
926 {
927 ips.clear();
928 NetFirewallIpParam dbip;
929 for (const DataBaseIp ¶m : dbips) {
930 dbip.family = param.family;
931 dbip.mask = param.mask;
932 dbip.type = param.type;
933 if (dbip.family == FAMILY_IPV4) {
934 memcpy_s(&dbip.ipv4.startIp, sizeof(uint32_t), ¶m.ipv4.startIp, sizeof(uint32_t));
935 memcpy_s(&dbip.ipv4.endIp, sizeof(uint32_t), ¶m.ipv4.endIp, sizeof(uint32_t));
936 } else {
937 memcpy_s(&dbip.ipv6.startIp, sizeof(in6_addr), ¶m.ipv6.startIp, sizeof(in6_addr));
938 memcpy_s(&dbip.ipv6.endIp, sizeof(in6_addr), ¶m.ipv6.endIp, sizeof(in6_addr));
939 }
940 ips.emplace_back(std::move(dbip));
941 }
942 }
FirewallPortToDbPort(const std::vector<NetFirewallPortParam> & ports,std::vector<DataBasePort> & dbports)943 void NetFirewallDbHelper::FirewallPortToDbPort(const std::vector<NetFirewallPortParam> &ports,
944 std::vector<DataBasePort> &dbports)
945 {
946 dbports.clear();
947 DataBasePort dbport;
948 for (const NetFirewallPortParam ¶m : ports) {
949 dbport.startPort = param.startPort;
950 dbport.endPort = param.endPort;
951 dbports.emplace_back(std::move(dbport));
952 }
953 }
954
DbPortToFirewallPort(const std::vector<DataBasePort> & dbports,std::vector<NetFirewallPortParam> & ports)955 void NetFirewallDbHelper::DbPortToFirewallPort(const std::vector<DataBasePort> &dbports,
956 std::vector<NetFirewallPortParam> &ports)
957 {
958 ports.clear();
959 NetFirewallPortParam dbport;
960 for (const DataBasePort ¶m : dbports) {
961 dbport.startPort = param.startPort;
962 dbport.endPort = param.endPort;
963 ports.emplace_back(std::move(dbport));
964 }
965 }
966 } // namespace NetManagerStandard
967 } // namespace OHOS