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