1 /*
2 * Copyright (C) 2023 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 "database_manager.h"
17
18 #include "config_data_manager.h"
19 #include "risk_event_rdb_helper.h"
20 #include "security_guard_define.h"
21 #include "security_guard_log.h"
22 #include "store_define.h"
23 #include "security_guard_utils.h"
24 #include "bigdata.h"
25 #include "task_handler.h"
26
27 namespace OHOS::Security::SecurityGuard {
GetInstance()28 DatabaseManager &DatabaseManager::GetInstance()
29 {
30 static DatabaseManager instance;
31 return instance;
32 }
33
Init()34 void DatabaseManager::Init()
35 {
36 // init database
37 int32_t ret = RiskEventRdbHelper::GetInstance().Init();
38 SGLOGI("risk event rdb init result is %{public}d", ret);
39 }
40
InsertEvent(uint32_t source,SecEvent & event)41 int DatabaseManager::InsertEvent(uint32_t source, SecEvent& event)
42 {
43 EventCfg config;
44 bool success = ConfigDataManager::GetInstance().GetEventConfig(event.eventId, config);
45 if (!success) {
46 SGLOGE("not found event, id=%{public}" PRId64 "", event.eventId);
47 return NOT_FOUND;
48 }
49
50 if (config.source == source) {
51 std::string table = ConfigDataManager::GetInstance().GetTableFromEventId(event.eventId);
52 SGLOGD("table=%{public}s, eventId=%{public}" PRId64 "", table.c_str(), config.eventId);
53 if (table == AUDIT_TABLE) {
54 SGLOGD("audit event insert");
55 DbChanged(IDbListener::INSERT, event);
56 return SUCCESS;
57 }
58 SGLOGD("risk event insert, eventId=%{public}" PRId64 "", event.eventId);
59 // Check whether the upper limit is reached.
60 int64_t count = RiskEventRdbHelper::GetInstance().CountEventByEventId(event.eventId);
61 if (count >= config.storageRomNums) {
62 (void) RiskEventRdbHelper::GetInstance().DeleteOldEventByEventId(event.eventId,
63 count + 1 - config.storageRomNums);
64 }
65 DbChanged(IDbListener::INSERT, event);
66 return RiskEventRdbHelper::GetInstance().InsertEvent(event);
67 }
68
69 // notify changed
70 DbChanged(IDbListener::INSERT, event);
71 return SUCCESS;
72 }
73
QueryAllEvent(std::string table,std::vector<SecEvent> & events)74 int DatabaseManager::QueryAllEvent(std::string table, std::vector<SecEvent> &events)
75 {
76 if (table == RISK_TABLE) {
77 return RiskEventRdbHelper::GetInstance().QueryAllEvent(events);
78 }
79 return NOT_SUPPORT;
80 }
81
QueryRecentEventByEventId(int64_t eventId,SecEvent & event)82 int DatabaseManager::QueryRecentEventByEventId(int64_t eventId, SecEvent &event)
83 {
84 std::string table = ConfigDataManager::GetInstance().GetTableFromEventId(eventId);
85 if (table == RISK_TABLE) {
86 return RiskEventRdbHelper::GetInstance().QueryRecentEventByEventId(eventId, event);
87 }
88 return NOT_SUPPORT;
89 }
90
QueryRecentEventByEventId(std::string table,const std::vector<int64_t> & eventId,std::vector<SecEvent> & event)91 int DatabaseManager::QueryRecentEventByEventId(std::string table, const std::vector<int64_t> &eventId,
92 std::vector<SecEvent> &event)
93 {
94 if (table == RISK_TABLE) {
95 return RiskEventRdbHelper::GetInstance().QueryRecentEventByEventId(eventId, event);
96 }
97 return NOT_SUPPORT;
98 }
99
QueryEventByEventIdAndDate(std::string table,std::vector<int64_t> & eventIds,std::vector<SecEvent> & events,std::string beginTime,std::string endTime)100 int DatabaseManager::QueryEventByEventIdAndDate(std::string table, std::vector<int64_t> &eventIds,
101 std::vector<SecEvent> &events, std::string beginTime, std::string endTime)
102 {
103 if (table == RISK_TABLE) {
104 return RiskEventRdbHelper::GetInstance().QueryEventByEventIdAndDate(eventIds, events, beginTime, endTime);
105 }
106 return NOT_SUPPORT;
107 }
108
QueryEventByEventId(int64_t eventId,std::vector<SecEvent> & events)109 int DatabaseManager::QueryEventByEventId(int64_t eventId, std::vector<SecEvent> &events)
110 {
111 std::string table = ConfigDataManager::GetInstance().GetTableFromEventId(eventId);
112 if (table == RISK_TABLE) {
113 return RiskEventRdbHelper::GetInstance().QueryEventByEventId(eventId, events);
114 }
115 return NOT_SUPPORT;
116 }
117
QueryEventByEventId(std::string table,std::vector<int64_t> & eventIds,std::vector<SecEvent> & events)118 int DatabaseManager::QueryEventByEventId(std::string table, std::vector<int64_t> &eventIds,
119 std::vector<SecEvent> &events)
120 {
121 if (table == RISK_TABLE) {
122 return RiskEventRdbHelper::GetInstance().QueryEventByEventId(eventIds, events);
123 }
124 return NOT_SUPPORT;
125 }
126
QueryEventByEventType(std::string table,int32_t eventType,std::vector<SecEvent> & events)127 int DatabaseManager::QueryEventByEventType(std::string table, int32_t eventType, std::vector<SecEvent> &events)
128 {
129 if (table == RISK_TABLE) {
130 return RiskEventRdbHelper::GetInstance().QueryEventByEventType(eventType, events);
131 }
132 return NOT_SUPPORT;
133 }
134
QueryEventByLevel(std::string table,int32_t level,std::vector<SecEvent> & events)135 int DatabaseManager::QueryEventByLevel(std::string table, int32_t level, std::vector<SecEvent> &events)
136 {
137 if (table == RISK_TABLE) {
138 return RiskEventRdbHelper::GetInstance().QueryEventByLevel(level, events);
139 }
140 return NOT_SUPPORT;
141 }
142
QueryEventByOwner(std::string table,std::string owner,std::vector<SecEvent> & events)143 int DatabaseManager::QueryEventByOwner(std::string table, std::string owner, std::vector<SecEvent> &events)
144 {
145 if (table == RISK_TABLE) {
146 return RiskEventRdbHelper::GetInstance().QueryEventByOwner(owner, events);
147 }
148 return NOT_SUPPORT;
149 }
150
CountAllEvent(std::string table)151 int64_t DatabaseManager::CountAllEvent(std::string table)
152 {
153 if (table == RISK_TABLE) {
154 return RiskEventRdbHelper::GetInstance().CountAllEvent();
155 }
156 return 0;
157 }
158
CountEventByEventId(int64_t eventId)159 int64_t DatabaseManager::CountEventByEventId(int64_t eventId)
160 {
161 std::string table = ConfigDataManager::GetInstance().GetTableFromEventId(eventId);
162 if (table == RISK_TABLE) {
163 return RiskEventRdbHelper::GetInstance().CountEventByEventId(eventId);
164 }
165 return 0;
166 }
167
DeleteOldEventByEventId(int64_t eventId,int64_t count)168 int DatabaseManager::DeleteOldEventByEventId(int64_t eventId, int64_t count)
169 {
170 std::string table = ConfigDataManager::GetInstance().GetTableFromEventId(eventId);
171 if (table == RISK_TABLE) {
172 return RiskEventRdbHelper::GetInstance().DeleteOldEventByEventId(eventId, count);
173 }
174 return NOT_SUPPORT;
175 }
176
DeleteAllEventByEventId(int64_t eventId)177 int DatabaseManager::DeleteAllEventByEventId(int64_t eventId)
178 {
179 std::string table = ConfigDataManager::GetInstance().GetTableFromEventId(eventId);
180 if (table == RISK_TABLE) {
181 return RiskEventRdbHelper::GetInstance().DeleteAllEventByEventId(eventId);
182 }
183 return NOT_SUPPORT;
184 }
185
SubscribeDb(std::vector<int64_t> eventIds,std::shared_ptr<IDbListener> listener)186 int32_t DatabaseManager::SubscribeDb(std::vector<int64_t> eventIds, std::shared_ptr<IDbListener> listener)
187 {
188 if (listener == nullptr) {
189 SGLOGE("listener is nullptr");
190 return NULL_OBJECT;
191 }
192 std::lock_guard<std::mutex> lock(mutex_);
193 for (int64_t eventId : eventIds) {
194 SGLOGI("SubscribeDb EVENTID %{public}" PRId64 "", eventId);
195 listenerMap_[eventId].insert(listener);
196 }
197 return SUCCESS;
198 }
199
UnSubscribeDb(std::vector<int64_t> eventIds,std::shared_ptr<IDbListener> listener)200 int32_t DatabaseManager::UnSubscribeDb(std::vector<int64_t> eventIds, std::shared_ptr<IDbListener> listener)
201 {
202 if (listener == nullptr) {
203 return NULL_OBJECT;
204 }
205 std::lock_guard<std::mutex> lock(mutex_);
206 for (int64_t eventId : eventIds) {
207 listenerMap_[eventId].erase(listener);
208 SGLOGI("size=%{public}u", static_cast<int32_t>(listenerMap_[eventId].size()));
209 if (listenerMap_[eventId].size() == 0) {
210 listenerMap_.erase(eventId);
211 }
212 }
213 return SUCCESS;
214 }
215
DbChanged(int32_t optType,const SecEvent & event)216 void DatabaseManager::DbChanged(int32_t optType, const SecEvent &event)
217 {
218 std::lock_guard<std::mutex> lock(mutex_);
219 std::set<std::shared_ptr<IDbListener>> listeners = listenerMap_[event.eventId];
220 if (listeners.empty()) {
221 return;
222 }
223 SGLOGI("eventId=%{public}" PRId64 ", listener size=%{public}u",
224 event.eventId, static_cast<int32_t>(listeners.size()));
225 SecurityGuard::TaskHandler::Task task = [listeners, optType, event] () {
226 for (auto &listener : listeners) {
227 if (listener != nullptr) {
228 listener->OnChange(optType, event);
229 }
230 }
231 };
232 SecurityGuard::TaskHandler::GetInstance()->AddTask(task);
233 return;
234 }
235 } // namespace OHOS::Security::SecurityGuard