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 <filesystem>
17 #include <system_error>
18 
19 #include "hilog/log.h"
20 #include "netmgr_ext_log_wrapper.h"
21 #include "netfirewall_database.h"
22 
23 using namespace OHOS::NativeRdb;
24 
25 namespace OHOS {
26 namespace NetManagerStandard {
27 std::shared_ptr<NetFirewallDataBase> NetFirewallDataBase::instance_ = nullptr;
28 
NetFirewallDataBase()29 NetFirewallDataBase::NetFirewallDataBase()
30 {
31     if (!std::filesystem::exists(FIREWALL_DB_PATH)) {
32         std::error_code ec;
33         if (std::filesystem::create_directories(FIREWALL_DB_PATH, ec)) {
34             NETMGR_EXT_LOG_D("create_directories success :%{public}s", FIREWALL_DB_PATH.c_str());
35         } else {
36             NETMGR_EXT_LOG_E("create_directories error :%{public}s : %s", FIREWALL_DB_PATH.c_str(),
37                 ec.message().c_str());
38         }
39     }
40     std::string firewallDatabaseName = FIREWALL_DB_PATH + FIREWALL_DB_NAME;
41     int32_t errCode = OHOS::NativeRdb::E_OK;
42     OHOS::NativeRdb::RdbStoreConfig config(firewallDatabaseName);
43     config.SetSecurityLevel(NativeRdb::SecurityLevel::S1);
44     NetFirewallDataBaseCallBack sqliteOpenHelperCallback;
45     store_ = OHOS::NativeRdb::RdbHelper::GetRdbStore(config, DATABASE_OPEN_VERSION, sqliteOpenHelperCallback, errCode);
46     if (errCode != OHOS::NativeRdb::E_OK) {
47         NETMGR_EXT_LOG_E("GetRdbStore errCode :%{public}d", errCode);
48     } else {
49         NETMGR_EXT_LOG_D("GetRdbStore success :%{public}d", errCode);
50     }
51 }
52 
GetInstance()53 std::shared_ptr<NetFirewallDataBase> NetFirewallDataBase::GetInstance()
54 {
55     if (instance_ == nullptr) {
56         NETMGR_EXT_LOG_W("reset to new instance");
57         instance_.reset(new NetFirewallDataBase());
58         return instance_;
59     }
60     return instance_;
61 }
62 
BeginTransaction()63 int32_t NetFirewallDataBase::BeginTransaction()
64 {
65     if (store_ == nullptr) {
66         NETMGR_EXT_LOG_E("BeginTransaction store_ is nullptr");
67         return FIREWALL_RDB_NO_INIT;
68     }
69     int32_t ret = store_->BeginTransaction();
70     if (ret != OHOS::NativeRdb::E_OK) {
71         NETMGR_EXT_LOG_E("BeginTransaction fail :%{public}d", ret);
72         return FIREWALL_RDB_EXECUTE_FAILTURE;
73     }
74     return FIREWALL_OK;
75 }
76 
Commit()77 int32_t NetFirewallDataBase::Commit()
78 {
79     if (store_ == nullptr) {
80         NETMGR_EXT_LOG_E("Commit store_ is nullptr");
81         return FIREWALL_RDB_NO_INIT;
82     }
83     int32_t ret = store_->Commit();
84     if (ret != OHOS::NativeRdb::E_OK) {
85         NETMGR_EXT_LOG_E("Commit fail :%{public}d", ret);
86         return FIREWALL_RDB_EXECUTE_FAILTURE;
87     }
88     return FIREWALL_OK;
89 }
90 
RollBack()91 int32_t NetFirewallDataBase::RollBack()
92 {
93     if (store_ == nullptr) {
94         NETMGR_EXT_LOG_E("RollBack store_ is nullptr");
95         return FIREWALL_RDB_NO_INIT;
96     }
97     int32_t ret = store_->RollBack();
98     if (ret != OHOS::NativeRdb::E_OK) {
99         NETMGR_EXT_LOG_E("RollBack fail :%{public}d", ret);
100         return FIREWALL_RDB_EXECUTE_FAILTURE;
101     }
102     return FIREWALL_OK;
103 }
104 
Insert(const OHOS::NativeRdb::ValuesBucket & insertValues,const std::string tableName)105 int64_t NetFirewallDataBase::Insert(const OHOS::NativeRdb::ValuesBucket &insertValues, const std::string tableName)
106 {
107     if (store_ == nullptr) {
108         NETMGR_EXT_LOG_E("Insert store_ is  nullptr");
109         return FIREWALL_RDB_NO_INIT;
110     }
111     int64_t outRowId = 0;
112     int32_t ret = store_->Insert(outRowId, tableName, insertValues);
113     NETMGR_EXT_LOG_D("Insert id=%{public}" PRIu64 "", outRowId);
114     if (ret != OHOS::NativeRdb::E_OK) {
115         NETMGR_EXT_LOG_E("Insert ret :%{public}d", ret);
116         return FIREWALL_RDB_EXECUTE_FAILTURE;
117     }
118     return outRowId;
119 }
120 
121 
Update(const std::string & tableName,int32_t & changedRows,const OHOS::NativeRdb::ValuesBucket & values,const std::string & whereClause,const std::vector<std::string> & whereArgs)122 int32_t NetFirewallDataBase::Update(const std::string &tableName, int32_t &changedRows,
123     const OHOS::NativeRdb::ValuesBucket &values, const std::string &whereClause,
124     const std::vector<std::string> &whereArgs)
125 {
126     if (store_ == nullptr) {
127         NETMGR_EXT_LOG_E("Update(whereClause) store_ is nullptr");
128         return FIREWALL_RDB_NO_INIT;
129     }
130     int32_t ret = store_->Update(changedRows, tableName, values, whereClause, whereArgs);
131     if (ret != OHOS::NativeRdb::E_OK) {
132         NETMGR_EXT_LOG_E("Update(whereClause) ret :%{public}d", ret);
133         return FIREWALL_RDB_EXECUTE_FAILTURE;
134     }
135     return FIREWALL_OK;
136 }
137 
138 
Delete(const std::string & tableName,int32_t & changedRows,const std::string & whereClause,const std::vector<std::string> & whereArgs)139 int32_t NetFirewallDataBase::Delete(const std::string &tableName, int32_t &changedRows, const std::string &whereClause,
140     const std::vector<std::string> &whereArgs)
141 {
142     if (store_ == nullptr) {
143         NETMGR_EXT_LOG_E("Delete store_ is nullptr");
144         return FIREWALL_RDB_NO_INIT;
145     }
146     int32_t ret = store_->Delete(changedRows, tableName, whereClause, whereArgs);
147     if (ret != OHOS::NativeRdb::E_OK) {
148         NETMGR_EXT_LOG_E("Delete(whereClause) ret :%{public}d", ret);
149         return FIREWALL_RDB_EXECUTE_FAILTURE;
150     }
151     return FIREWALL_OK;
152 }
153 
154 
Query(const OHOS::NativeRdb::AbsRdbPredicates & predicates,const std::vector<std::string> & columns)155 std::shared_ptr<OHOS::NativeRdb::ResultSet> NetFirewallDataBase::Query(
156     const OHOS::NativeRdb::AbsRdbPredicates &predicates, const std::vector<std::string> &columns)
157 {
158     if (store_ == nullptr) {
159         NETMGR_EXT_LOG_E("Query(AbsRdbPredicates) store_ is nullptr");
160         return nullptr;
161     }
162     return store_->Query(predicates, columns);
163 }
164 
Count(int64_t & outValue,const OHOS::NativeRdb::AbsRdbPredicates & predicates)165 int32_t NetFirewallDataBase::Count(int64_t &outValue, const OHOS::NativeRdb::AbsRdbPredicates &predicates)
166 {
167     if (store_ == nullptr) {
168         NETMGR_EXT_LOG_E("Count(AbsRdbPredicates) store_ is nullptr");
169         return FIREWALL_RDB_NO_INIT;
170     }
171     return store_->Count(outValue, predicates);
172 }
173 
QuerySql(const std::string & sql,const std::vector<std::string> & selectionArgs)174 std::shared_ptr<OHOS::NativeRdb::ResultSet> NetFirewallDataBase::QuerySql(const std::string &sql,
175     const std::vector<std::string> &selectionArgs)
176 {
177     if (store_ == nullptr) {
178         NETMGR_EXT_LOG_E("QuerySql(AbsRdbPredicates) store_ is nullptr");
179         return nullptr;
180     }
181     return store_->QuerySql(sql, selectionArgs);
182 }
183 
OnCreate(OHOS::NativeRdb::RdbStore & store)184 int32_t NetFirewallDataBaseCallBack::OnCreate(OHOS::NativeRdb::RdbStore &store)
185 {
186     std::map<std::string, std::string> netfirewallTableMap;
187     netfirewallTableMap.insert(std::pair<std::string, std::string>(FIREWALL_TABLE_NAME, CREATE_FIREWALL_TABLE));
188     netfirewallTableMap.insert(std::pair<std::string, std::string>(INTERCEPT_RECORD_TABLE, CREATE_RECORD_TABLE));
189     for (const auto &pair : netfirewallTableMap) {
190         std::string sql = pair.second;
191         int32_t ret = store.ExecuteSql(sql);
192         if (ret != OHOS::NativeRdb::E_OK) {
193             NETMGR_EXT_LOG_E("OnCreate %{public}s, failed: %{public}d", pair.first.c_str(), ret);
194             return FIREWALL_RDB_EXECUTE_FAILTURE;
195         }
196         NETMGR_EXT_LOG_D("DB OnCreate Done %{public}s ", pair.first.c_str());
197     }
198     return FIREWALL_OK;
199 }
200 
OnUpgrade(OHOS::NativeRdb::RdbStore & store,int32_t oldVersion,int32_t newVersion)201 int32_t NetFirewallDataBaseCallBack::OnUpgrade(OHOS::NativeRdb::RdbStore &store, int32_t oldVersion, int32_t newVersion)
202 {
203     NETMGR_EXT_LOG_D("DB OnUpgrade Enter");
204     (void)store;
205     (void)oldVersion;
206     (void)newVersion;
207     return FIREWALL_OK;
208 }
209 
OnDowngrade(OHOS::NativeRdb::RdbStore & store,int32_t oldVersion,int32_t newVersion)210 int32_t NetFirewallDataBaseCallBack::OnDowngrade(OHOS::NativeRdb::RdbStore &store, int32_t oldVersion,
211     int32_t newVersion)
212 {
213     NETMGR_EXT_LOG_D("DB OnDowngrade Enter");
214     (void)store;
215     (void)oldVersion;
216     (void)newVersion;
217     return FIREWALL_OK;
218 }
219 } // namespace NetManagerStandard
220 } // namespace OHOS