• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 &param : 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 &param : vec) {
112         const uint8_t *data = reinterpret_cast<const uint8_t *>(&param);
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 &param : 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), &param.ipv4.startIp, sizeof(uint32_t));
917             memcpy_s(&dbip.ipv4.endIp, sizeof(uint32_t), &param.ipv4.endIp, sizeof(uint32_t));
918         } else {
919             memcpy_s(&dbip.ipv6.startIp, sizeof(in6_addr), &param.ipv6.startIp, sizeof(in6_addr));
920             memcpy_s(&dbip.ipv6.endIp, sizeof(in6_addr), &param.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 &param : 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), &param.ipv4.startIp, sizeof(uint32_t));
935             memcpy_s(&dbip.ipv4.endIp, sizeof(uint32_t), &param.ipv4.endIp, sizeof(uint32_t));
936         } else {
937             memcpy_s(&dbip.ipv6.startIp, sizeof(in6_addr), &param.ipv6.startIp, sizeof(in6_addr));
938             memcpy_s(&dbip.ipv6.endIp, sizeof(in6_addr), &param.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 &param : 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 &param : 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