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