18e745fdaSopenharmony_ci/* 28e745fdaSopenharmony_ci * Copyright (c) 2024 Huawei Device Co., Ltd. 38e745fdaSopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License"); 48e745fdaSopenharmony_ci * you may not use this file except in compliance with the License. 58e745fdaSopenharmony_ci * You may obtain a copy of the License at 68e745fdaSopenharmony_ci * 78e745fdaSopenharmony_ci * http://www.apache.org/licenses/LICENSE-2.0 88e745fdaSopenharmony_ci * 98e745fdaSopenharmony_ci * Unless required by applicable law or agreed to in writing, software 108e745fdaSopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS, 118e745fdaSopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 128e745fdaSopenharmony_ci * See the License for the specific language governing permissions and 138e745fdaSopenharmony_ci * limitations under the License. 148e745fdaSopenharmony_ci */ 158e745fdaSopenharmony_ci 168e745fdaSopenharmony_ci#ifndef FIREWALL_DB_HELPER_H 178e745fdaSopenharmony_ci#define FIREWALL_DB_HELPER_H 188e745fdaSopenharmony_ci 198e745fdaSopenharmony_ci#include <string> 208e745fdaSopenharmony_ci 218e745fdaSopenharmony_ci#include "netfirewall_database.h" 228e745fdaSopenharmony_ci#include "netfirewall_common.h" 238e745fdaSopenharmony_ci#include "rdb_common.h" 248e745fdaSopenharmony_ci#include "rdb_errno.h" 258e745fdaSopenharmony_ci#include "rdb_helper.h" 268e745fdaSopenharmony_ci#include "rdb_open_callback.h" 278e745fdaSopenharmony_ci#include "rdb_predicates.h" 288e745fdaSopenharmony_ci#include "rdb_store.h" 298e745fdaSopenharmony_ci#include "result_set.h" 308e745fdaSopenharmony_ci#include "system_ability.h" 318e745fdaSopenharmony_ci#include "value_object.h" 328e745fdaSopenharmony_ci 338e745fdaSopenharmony_cinamespace OHOS { 348e745fdaSopenharmony_cinamespace NetManagerStandard { 358e745fdaSopenharmony_ci// The data index of NetFirewallRule 368e745fdaSopenharmony_cistruct NetFirewallRuleInfo { 378e745fdaSopenharmony_ci int32_t rowCount; 388e745fdaSopenharmony_ci int32_t ruleIdIndex; 398e745fdaSopenharmony_ci int32_t ruleNameIndex; 408e745fdaSopenharmony_ci int32_t ruleDescriptionIndex; 418e745fdaSopenharmony_ci int32_t ruleDirectionIndex; 428e745fdaSopenharmony_ci int32_t ruleActionIndex; 438e745fdaSopenharmony_ci int32_t ruleTypeIndex; 448e745fdaSopenharmony_ci int32_t isEnabledIndex; 458e745fdaSopenharmony_ci int32_t appUidIndex; 468e745fdaSopenharmony_ci int32_t protocolIndex; 478e745fdaSopenharmony_ci int32_t primaryDnsIndex; 488e745fdaSopenharmony_ci int32_t standbyDnsIndex; 498e745fdaSopenharmony_ci int32_t localIpsIndex; 508e745fdaSopenharmony_ci int32_t remoteIpsIndex; 518e745fdaSopenharmony_ci int32_t localPortsIndex; 528e745fdaSopenharmony_ci int32_t remotePortsIndex; 538e745fdaSopenharmony_ci int32_t domainsIndex; 548e745fdaSopenharmony_ci int32_t userIdIndex; 558e745fdaSopenharmony_ci}; 568e745fdaSopenharmony_ci 578e745fdaSopenharmony_ci// Intercept the structure of records in the database 588e745fdaSopenharmony_cistruct NetInterceptRecordInfo { 598e745fdaSopenharmony_ci int32_t rowCount; 608e745fdaSopenharmony_ci int32_t idIndex; 618e745fdaSopenharmony_ci int32_t timeIndex; 628e745fdaSopenharmony_ci int32_t localIpIndex; 638e745fdaSopenharmony_ci int32_t remoteIpIndex; 648e745fdaSopenharmony_ci int32_t localPortIndex; 658e745fdaSopenharmony_ci int32_t remotePortIndex; 668e745fdaSopenharmony_ci int32_t protocolIndex; 678e745fdaSopenharmony_ci int32_t appUidIndex; 688e745fdaSopenharmony_ci int32_t domainIndex; 698e745fdaSopenharmony_ci}; 708e745fdaSopenharmony_ci 718e745fdaSopenharmony_ci// save to database @see NetFirewallIpParam 728e745fdaSopenharmony_cistruct DataBaseIp { 738e745fdaSopenharmony_ci uint8_t family; 748e745fdaSopenharmony_ci uint8_t type; 758e745fdaSopenharmony_ci uint8_t mask; 768e745fdaSopenharmony_ci union { 778e745fdaSopenharmony_ci struct { 788e745fdaSopenharmony_ci in_addr startIp; 798e745fdaSopenharmony_ci in_addr endIp; 808e745fdaSopenharmony_ci } ipv4; 818e745fdaSopenharmony_ci struct { 828e745fdaSopenharmony_ci in6_addr startIp; 838e745fdaSopenharmony_ci in6_addr endIp; 848e745fdaSopenharmony_ci } ipv6; 858e745fdaSopenharmony_ci }; 868e745fdaSopenharmony_ci}; 878e745fdaSopenharmony_ci 888e745fdaSopenharmony_ci// save to database @see NetFirewallPortParam 898e745fdaSopenharmony_cistruct DataBasePort { 908e745fdaSopenharmony_ci uint16_t startPort; 918e745fdaSopenharmony_ci uint16_t endPort; 928e745fdaSopenharmony_ci}; 938e745fdaSopenharmony_ci 948e745fdaSopenharmony_ciclass NetFirewallDbHelper : public NoCopyable { 958e745fdaSopenharmony_cipublic: 968e745fdaSopenharmony_ci static NetFirewallDbHelper &GetInstance(); 978e745fdaSopenharmony_ci 988e745fdaSopenharmony_ci /** 998e745fdaSopenharmony_ci * add NetFirewallRule data record 1008e745fdaSopenharmony_ci * 1018e745fdaSopenharmony_ci * @param rule net firewall rule 1028e745fdaSopenharmony_ci * @return Returns 0 success. Otherwise fail 1038e745fdaSopenharmony_ci */ 1048e745fdaSopenharmony_ci int32_t AddFirewallRuleRecord(const NetFirewallRule &rule); 1058e745fdaSopenharmony_ci 1068e745fdaSopenharmony_ci /** 1078e745fdaSopenharmony_ci * Add interception logs 1088e745fdaSopenharmony_ci * 1098e745fdaSopenharmony_ci * @param userId User id 1108e745fdaSopenharmony_ci * @param records intercept records 1118e745fdaSopenharmony_ci * @return Returns 0 success. Otherwise fail 1128e745fdaSopenharmony_ci */ 1138e745fdaSopenharmony_ci int32_t AddInterceptRecord(const int32_t userId, std::vector<sptr<InterceptRecord>> &records); 1148e745fdaSopenharmony_ci 1158e745fdaSopenharmony_ci /** 1168e745fdaSopenharmony_ci * Query enabled rule set 1178e745fdaSopenharmony_ci * 1188e745fdaSopenharmony_ci * @param rules List of rules obtained from query 1198e745fdaSopenharmony_ci * @return Returns 0 success. Otherwise fail 1208e745fdaSopenharmony_ci */ 1218e745fdaSopenharmony_ci int32_t QueryAllUserEnabledFirewallRules(std::vector<NetFirewallRule> &rules, 1228e745fdaSopenharmony_ci NetFirewallRuleType type = NetFirewallRuleType::RULE_ALL); 1238e745fdaSopenharmony_ci 1248e745fdaSopenharmony_ci /** 1258e745fdaSopenharmony_ci * Query enabled rule set 1268e745fdaSopenharmony_ci * 1278e745fdaSopenharmony_ci * @param userId User id 1288e745fdaSopenharmony_ci * @param appUid The UID of an application or service 1298e745fdaSopenharmony_ci * @param rules List of rules obtained from query 1308e745fdaSopenharmony_ci * @return Returns 0 success. Otherwise fail 1318e745fdaSopenharmony_ci */ 1328e745fdaSopenharmony_ci int32_t QueryEnabledFirewallRules(int32_t userId, int32_t appUid, std::vector<NetFirewallRule> &rules); 1338e745fdaSopenharmony_ci 1348e745fdaSopenharmony_ci /** 1358e745fdaSopenharmony_ci * Query all rules 1368e745fdaSopenharmony_ci * 1378e745fdaSopenharmony_ci * @param rules List of rules obtained from query 1388e745fdaSopenharmony_ci * @return Returns 0 success. Otherwise fail 1398e745fdaSopenharmony_ci */ 1408e745fdaSopenharmony_ci int32_t QueryAllFirewallRuleRecord(std::vector<NetFirewallRule> &rules); 1418e745fdaSopenharmony_ci 1428e745fdaSopenharmony_ci /** 1438e745fdaSopenharmony_ci * Query firewall rule 1448e745fdaSopenharmony_ci * 1458e745fdaSopenharmony_ci * @param ruleId Rule id 1468e745fdaSopenharmony_ci * @param userId User id 1478e745fdaSopenharmony_ci * @param rules List of rules obtained from query 1488e745fdaSopenharmony_ci * @return Returns 0 success. Otherwise fail 1498e745fdaSopenharmony_ci */ 1508e745fdaSopenharmony_ci int32_t QueryFirewallRuleRecord(int32_t ruleId, int32_t userId, std::vector<NetFirewallRule> &rules); 1518e745fdaSopenharmony_ci 1528e745fdaSopenharmony_ci /** 1538e745fdaSopenharmony_ci * Paging query firewall rules 1548e745fdaSopenharmony_ci * 1558e745fdaSopenharmony_ci * @param userId User id 1568e745fdaSopenharmony_ci * @param requestParam Pagination query input 1578e745fdaSopenharmony_ci * @param rules List of rules obtained from query 1588e745fdaSopenharmony_ci * @return Returns 0 success. Otherwise fail 1598e745fdaSopenharmony_ci */ 1608e745fdaSopenharmony_ci int32_t QueryFirewallRule(const int32_t userId, const sptr<RequestParam> &requestParam, 1618e745fdaSopenharmony_ci sptr<FirewallRulePage> &info); 1628e745fdaSopenharmony_ci 1638e745fdaSopenharmony_ci /** 1648e745fdaSopenharmony_ci * Paging query interception records 1658e745fdaSopenharmony_ci * 1668e745fdaSopenharmony_ci * @param userId User id 1678e745fdaSopenharmony_ci * @param requestParam Pagination query input 1688e745fdaSopenharmony_ci * @param rules List of record obtained from query 1698e745fdaSopenharmony_ci * @return Returns 0 success. Otherwise fail 1708e745fdaSopenharmony_ci */ 1718e745fdaSopenharmony_ci int32_t QueryInterceptRecord(const int32_t userId, const sptr<RequestParam> &requestParam, 1728e745fdaSopenharmony_ci sptr<InterceptRecordPage> &info); 1738e745fdaSopenharmony_ci 1748e745fdaSopenharmony_ci /** 1758e745fdaSopenharmony_ci * Query the number of firewall rules for a specified user 1768e745fdaSopenharmony_ci * 1778e745fdaSopenharmony_ci * @param userId User id 1788e745fdaSopenharmony_ci * @param rowCount Number of queries found 1798e745fdaSopenharmony_ci * @return Returns 0 success. Otherwise fail 1808e745fdaSopenharmony_ci */ 1818e745fdaSopenharmony_ci int32_t QueryFirewallRuleByUserIdCount(const int32_t userId, int64_t &rowCount); 1828e745fdaSopenharmony_ci 1838e745fdaSopenharmony_ci /** 1848e745fdaSopenharmony_ci * Query the number of all firewall rules 1858e745fdaSopenharmony_ci * 1868e745fdaSopenharmony_ci * @param rowCount Number of queries found 1878e745fdaSopenharmony_ci * @return Returns 0 success. Otherwise fail 1888e745fdaSopenharmony_ci */ 1898e745fdaSopenharmony_ci int32_t QueryFirewallRuleAllCount(int64_t &rowCount); 1908e745fdaSopenharmony_ci 1918e745fdaSopenharmony_ci /** 1928e745fdaSopenharmony_ci * Query the number of all domain rules 1938e745fdaSopenharmony_ci * 1948e745fdaSopenharmony_ci * @return Number of queries found 1958e745fdaSopenharmony_ci */ 1968e745fdaSopenharmony_ci int32_t QueryFirewallRuleAllDomainCount(); 1978e745fdaSopenharmony_ci 1988e745fdaSopenharmony_ci /** 1998e745fdaSopenharmony_ci * Query the number of ambiguous domain names 2008e745fdaSopenharmony_ci * 2018e745fdaSopenharmony_ci * @return Number of queries found 2028e745fdaSopenharmony_ci */ 2038e745fdaSopenharmony_ci int32_t QueryFirewallRuleAllFuzzyDomainCount(); 2048e745fdaSopenharmony_ci 2058e745fdaSopenharmony_ci /** 2068e745fdaSopenharmony_ci * Query the number of domain rules by userId 2078e745fdaSopenharmony_ci * 2088e745fdaSopenharmony_ci * @param userId User id 2098e745fdaSopenharmony_ci * @return Number of queries found 2108e745fdaSopenharmony_ci */ 2118e745fdaSopenharmony_ci int32_t QueryFirewallRuleDomainByUserIdCount(int32_t userId); 2128e745fdaSopenharmony_ci 2138e745fdaSopenharmony_ci /** 2148e745fdaSopenharmony_ci * Update firewall rule 2158e745fdaSopenharmony_ci * 2168e745fdaSopenharmony_ci * @param rule firewall ruele 2178e745fdaSopenharmony_ci * @return Returns 0 success. Otherwise fail 2188e745fdaSopenharmony_ci */ 2198e745fdaSopenharmony_ci int32_t UpdateFirewallRuleRecord(const NetFirewallRule &rule); 2208e745fdaSopenharmony_ci 2218e745fdaSopenharmony_ci /** 2228e745fdaSopenharmony_ci * Delete firewall rule 2238e745fdaSopenharmony_ci * 2248e745fdaSopenharmony_ci * @param userId User id 2258e745fdaSopenharmony_ci * @param ruleId Rule id 2268e745fdaSopenharmony_ci * @return Returns 0 success. Otherwise fail 2278e745fdaSopenharmony_ci */ 2288e745fdaSopenharmony_ci int32_t DeleteFirewallRuleRecord(int32_t userId, int32_t ruleId); 2298e745fdaSopenharmony_ci 2308e745fdaSopenharmony_ci /** 2318e745fdaSopenharmony_ci * Delete firewall rule by user id 2328e745fdaSopenharmony_ci * 2338e745fdaSopenharmony_ci * @param userId User id 2348e745fdaSopenharmony_ci * @return Returns 0 success. Otherwise fail 2358e745fdaSopenharmony_ci */ 2368e745fdaSopenharmony_ci int32_t DeleteFirewallRuleRecordByUserId(int32_t userId); 2378e745fdaSopenharmony_ci 2388e745fdaSopenharmony_ci /** 2398e745fdaSopenharmony_ci * Delete firewall rule by app uid 2408e745fdaSopenharmony_ci * 2418e745fdaSopenharmony_ci * @param appUid The UID of an application or service 2428e745fdaSopenharmony_ci * @return Returns 0 success. Otherwise fail 2438e745fdaSopenharmony_ci */ 2448e745fdaSopenharmony_ci int32_t DeleteFirewallRuleRecordByAppId(int32_t appUid); 2458e745fdaSopenharmony_ci 2468e745fdaSopenharmony_ci /** 2478e745fdaSopenharmony_ci * Delete intercept record by user id 2488e745fdaSopenharmony_ci * 2498e745fdaSopenharmony_ci * @param userId User id 2508e745fdaSopenharmony_ci * @return Returns 0 success. Otherwise fail 2518e745fdaSopenharmony_ci */ 2528e745fdaSopenharmony_ci int32_t DeleteInterceptRecord(int32_t userId); 2538e745fdaSopenharmony_ci 2548e745fdaSopenharmony_ci /** 2558e745fdaSopenharmony_ci * Does the specified firewall rule exist 2568e745fdaSopenharmony_ci * 2578e745fdaSopenharmony_ci * @param oldRule Current existing rules 2588e745fdaSopenharmony_ci * @return If there is a return to true, otherwise it will be false 2598e745fdaSopenharmony_ci */ 2608e745fdaSopenharmony_ci bool IsFirewallRuleExist(int32_t ruleId, NetFirewallRule &oldRule); 2618e745fdaSopenharmony_ci 2628e745fdaSopenharmony_ci /** 2638e745fdaSopenharmony_ci * Does the specified dns rule exist 2648e745fdaSopenharmony_ci * 2658e745fdaSopenharmony_ci * @param oldRule Current existing rules 2668e745fdaSopenharmony_ci * @return If there is a return to true, otherwise it will be false 2678e745fdaSopenharmony_ci */ 2688e745fdaSopenharmony_ci bool IsDnsRuleExist(const sptr<NetFirewallRule> &rule); 2698e745fdaSopenharmony_ci 2708e745fdaSopenharmony_ci /** 2718e745fdaSopenharmony_ci * Query the number of query databases 2728e745fdaSopenharmony_ci * 2738e745fdaSopenharmony_ci * @param outValue Number of queries found 2748e745fdaSopenharmony_ci * @param predicates Matching criteria 2758e745fdaSopenharmony_ci * @return Returns 0 success. Otherwise fail 2768e745fdaSopenharmony_ci */ 2778e745fdaSopenharmony_ci int32_t Count(int64_t &outValue, const OHOS::NativeRdb::AbsRdbPredicates &predicates); 2788e745fdaSopenharmony_ci 2798e745fdaSopenharmony_ci int32_t QuerySql(const std::string &sql); 2808e745fdaSopenharmony_ci 2818e745fdaSopenharmony_ciprivate: 2828e745fdaSopenharmony_ci NetFirewallDbHelper(); 2838e745fdaSopenharmony_ci ~NetFirewallDbHelper(); 2848e745fdaSopenharmony_ci 2858e745fdaSopenharmony_ci // Fill in firewall rule data 2868e745fdaSopenharmony_ci int32_t FillValuesOfFirewallRule(NativeRdb::ValuesBucket &values, const NetFirewallRule &rule); 2878e745fdaSopenharmony_ci 2888e745fdaSopenharmony_ci // Check if data needs to be updated 2898e745fdaSopenharmony_ci int32_t CheckIfNeedUpdateEx(const std::string &tableName, bool &isUpdate, int32_t ruleId, NetFirewallRule &oldRule); 2908e745fdaSopenharmony_ci 2918e745fdaSopenharmony_ci int32_t QueryFirewallRuleRecord(const NativeRdb::RdbPredicates &rdbPredicates, 2928e745fdaSopenharmony_ci const std::vector<std::string> &columns, std::vector<NetFirewallRule> &rules); 2938e745fdaSopenharmony_ci 2948e745fdaSopenharmony_ci int32_t DeleteAndNoOtherOperation(const std::string &whereClause, const std::vector<std::string> &whereArgs); 2958e745fdaSopenharmony_ci 2968e745fdaSopenharmony_ci template <typename T> 2978e745fdaSopenharmony_ci int32_t QueryAndGetResult(const NativeRdb::RdbPredicates &rdbPredicates, const std::vector<std::string> &columns, 2988e745fdaSopenharmony_ci std::vector<T> &rules); 2998e745fdaSopenharmony_ci 3008e745fdaSopenharmony_ci void GetParamRuleInfoFormResultSet(std::string &columnName, int32_t index, NetFirewallRuleInfo &table); 3018e745fdaSopenharmony_ci 3028e745fdaSopenharmony_ci int32_t GetResultSetTableInfo(const std::shared_ptr<OHOS::NativeRdb::ResultSet> &resultSet, 3038e745fdaSopenharmony_ci struct NetFirewallRuleInfo &table); 3048e745fdaSopenharmony_ci 3058e745fdaSopenharmony_ci int32_t GetResultSetTableInfo(const std::shared_ptr<OHOS::NativeRdb::ResultSet> &resultSet, 3068e745fdaSopenharmony_ci NetInterceptRecordInfo &table); 3078e745fdaSopenharmony_ci 3088e745fdaSopenharmony_ci // Convert query result ResultSet 3098e745fdaSopenharmony_ci int32_t GetResultRightRecordEx(const std::shared_ptr<OHOS::NativeRdb::ResultSet> &resultSet, 3108e745fdaSopenharmony_ci std::vector<NetFirewallRule> &rules); 3118e745fdaSopenharmony_ci 3128e745fdaSopenharmony_ci int32_t GetResultRightRecordEx(const std::shared_ptr<OHOS::NativeRdb::ResultSet> &resultSet, 3138e745fdaSopenharmony_ci std::vector<InterceptRecord> &rules); 3148e745fdaSopenharmony_ci 3158e745fdaSopenharmony_ci int32_t AddFirewallRule(NativeRdb::ValuesBucket &values, const NetFirewallRule &rule); 3168e745fdaSopenharmony_ci 3178e745fdaSopenharmony_ci void GetRuleDataFromResultSet(const std::shared_ptr<OHOS::NativeRdb::ResultSet> &resultSet, 3188e745fdaSopenharmony_ci const NetFirewallRuleInfo &table, NetFirewallRule &info); 3198e745fdaSopenharmony_ci void GetRuleListParamFromResultSet(const std::shared_ptr<OHOS::NativeRdb::ResultSet> &resultSet, 3208e745fdaSopenharmony_ci const NetFirewallRuleInfo &table, NetFirewallRule &info); 3218e745fdaSopenharmony_ci static bool DomainListToBlob(const std::vector<NetFirewallDomainParam> &vec, std::vector<uint8_t> &blob, 3228e745fdaSopenharmony_ci uint32_t &fuzzyNum); 3238e745fdaSopenharmony_ci static bool BlobToDomainList(const std::vector<uint8_t> &blob, std::vector<NetFirewallDomainParam> &vec); 3248e745fdaSopenharmony_ci template <typename T> static void ListToBlob(const std::vector<T> &vec, std::vector<uint8_t> &blob); 3258e745fdaSopenharmony_ci template <typename T> static void BlobToList(const std::vector<uint8_t> &blob, std::vector<T> &vec); 3268e745fdaSopenharmony_ci 3278e745fdaSopenharmony_ci void FirewallIpToDbIp(const std::vector<NetFirewallIpParam> &ips, std::vector<DataBaseIp> &dbips); 3288e745fdaSopenharmony_ci void DbIpToFirewallIp(const std::vector<DataBaseIp> &dbips, std::vector<NetFirewallIpParam> &ips); 3298e745fdaSopenharmony_ci void FirewallPortToDbPort(const std::vector<NetFirewallPortParam> &ports, std::vector<DataBasePort> &dbports); 3308e745fdaSopenharmony_ci void DbPortToFirewallPort(const std::vector<DataBasePort> &dbports, std::vector<NetFirewallPortParam> &ports); 3318e745fdaSopenharmony_ci 3328e745fdaSopenharmony_ciprivate: 3338e745fdaSopenharmony_ci static std::shared_ptr<NetFirewallDbHelper> instance_; 3348e745fdaSopenharmony_ci std::mutex databaseMutex_; 3358e745fdaSopenharmony_ci std::shared_ptr<NetFirewallDataBase> firewallDatabase_; 3368e745fdaSopenharmony_ci}; 3378e745fdaSopenharmony_ci} // namespace NetManagerStandard 3388e745fdaSopenharmony_ci} // namespace OHOS 3398e745fdaSopenharmony_ci 3408e745fdaSopenharmony_ci#endif // FIREWALL_DB_HELPER_H