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