1 /*
2 * Copyright (c) 2022 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 "app_control_manager_rdb.h"
17
18 #include "app_control_constants.h"
19 #include "app_log_tag_wrapper.h"
20 #include "bms_extension_client.h"
21 #include "bundle_util.h"
22 #include "event_report.h"
23 #include "hitrace_meter.h"
24 #include "scope_guard.h"
25
26 namespace OHOS {
27 namespace AppExecFwk {
28 namespace {
29 constexpr const char* APP_CONTROL_RDB_TABLE_NAME = "app_control";
30 constexpr const char* RUNNING_CONTROL = "RunningControl";
31 constexpr const char* DISPOSED_RULE = "DisposedRule";
32 constexpr const char* UNINSTALL_DISPOSED_RULE = "UninstallDisposedRule";
33 constexpr const char* APP_CONTROL_EDM_DEFAULT_MESSAGE = "The app has been disabled by EDM";
34 constexpr const char* DEFAULT = "default";
35 constexpr int8_t CALLING_NAME_INDEX = 1;
36 constexpr int8_t APP_ID_INDEX = 4;
37 constexpr int8_t CONTROL_MESSAGE_INDEX = 5;
38 constexpr int8_t DISPOSED_STATUS_INDEX = 6;
39 constexpr int8_t TIME_STAMP_INDEX = 8;
40 // app control table key
41 constexpr const char* CALLING_NAME = "CALLING_NAME";
42 constexpr const char* APP_CONTROL_LIST = "APP_CONTROL_LIST";
43 constexpr const char* USER_ID = "USER_ID";
44 constexpr const char* APP_ID = "APP_ID";
45 constexpr const char* CONTROL_MESSAGE = "CONTROL_MESSAGE";
46 constexpr const char* DISPOSED_STATUS = "DISPOSED_STATUS";
47 constexpr const char* PRIORITY = "PRIORITY";
48 constexpr const char* TIME_STAMP = "TIME_STAMP";
49 constexpr const char* APP_INDEX = "APP_INDEX";
50
51 enum class PRIORITY : uint16_t {
52 EDM = 100,
53 APP_MARKET = 200,
54 };
55 }
AppControlManagerRdb()56 AppControlManagerRdb::AppControlManagerRdb()
57 {
58 LOG_D(BMS_TAG_DEFAULT, "create AppControlManagerRdb");
59 BmsRdbConfig bmsRdbConfig;
60 bmsRdbConfig.dbName = ServiceConstants::BUNDLE_RDB_NAME;
61 bmsRdbConfig.tableName = APP_CONTROL_RDB_TABLE_NAME;
62 bmsRdbConfig.createTableSql = std::string(
63 "CREATE TABLE IF NOT EXISTS "
64 + std::string(APP_CONTROL_RDB_TABLE_NAME)
65 + "(ID INTEGER PRIMARY KEY AUTOINCREMENT, CALLING_NAME TEXT NOT NULL, "
66 + "APP_CONTROL_LIST TEXT, USER_ID INTEGER, APP_ID TEXT, CONTROL_MESSAGE TEXT, "
67 + "DISPOSED_STATUS TEXT, PRIORITY INTEGER, TIME_STAMP INTEGER);");
68 bmsRdbConfig.insertColumnSql.push_back(std::string("ALTER TABLE " + std::string(APP_CONTROL_RDB_TABLE_NAME) +
69 " ADD APP_INDEX INTEGER DEFAULT 0;"));
70 rdbDataManager_ = std::make_shared<RdbDataManager>(bmsRdbConfig);
71 rdbDataManager_->CreateTable();
72 }
73
~AppControlManagerRdb()74 AppControlManagerRdb::~AppControlManagerRdb()
75 {
76 LOG_D(BMS_TAG_DEFAULT, "destroy AppControlManagerRdb");
77 }
78
AddAppInstallControlRule(const std::string & callingName,const std::vector<std::string> & appIds,const std::string & controlRuleType,int32_t userId)79 ErrCode AppControlManagerRdb::AddAppInstallControlRule(const std::string &callingName,
80 const std::vector<std::string> &appIds, const std::string &controlRuleType, int32_t userId)
81 {
82 int64_t timeStamp = BundleUtil::GetCurrentTime();
83 std::vector<NativeRdb::ValuesBucket> valuesBuckets;
84 for (auto appId : appIds) {
85 ErrCode result = DeleteOldControlRule(callingName, controlRuleType, appId, userId);
86 if (result != ERR_OK) {
87 LOG_E(BMS_TAG_DEFAULT, "DeleteOldControlRule failed");
88 return result;
89 }
90 NativeRdb::ValuesBucket valuesBucket;
91 valuesBucket.PutString(CALLING_NAME, callingName);
92 valuesBucket.PutString(APP_CONTROL_LIST, controlRuleType);
93 valuesBucket.PutInt(USER_ID, static_cast<int>(userId));
94 valuesBucket.PutString(APP_ID, appId);
95 valuesBucket.PutInt(TIME_STAMP, timeStamp);
96 valuesBuckets.emplace_back(valuesBucket);
97 }
98 int64_t insertNum = 0;
99 bool ret = rdbDataManager_->BatchInsert(insertNum, valuesBuckets);
100 if (!ret) {
101 LOG_E(BMS_TAG_DEFAULT, "BatchInsert failed");
102 return ERR_APPEXECFWK_DB_BATCH_INSERT_ERROR;
103 }
104 EventInfo info;
105 info.callingName = callingName;
106 info.userId = userId;
107 info.appIds = appIds;
108 info.rule = controlRuleType;
109 info.operationType = static_cast<int32_t>(OPERATION_TYPE_ENUM::OPERATION_TYPE_ADD_RULE);
110 info.actionType = static_cast<int32_t>(ACTION_TYPE_ENUM::ACTION_TYPE_OF_INSTALL);
111 EventReport::SendAppControlRuleEvent(info);
112 if (valuesBuckets.size() != static_cast<uint64_t>(insertNum)) {
113 LOG_E(BMS_TAG_DEFAULT, "BatchInsert size not expected");
114 return ERR_APPEXECFWK_DB_BATCH_INSERT_ERROR;
115 }
116 return ERR_OK;
117 }
118
DeleteAppInstallControlRule(const std::string & callingName,const std::string & controlRuleType,const std::vector<std::string> & appIds,int32_t userId)119 ErrCode AppControlManagerRdb::DeleteAppInstallControlRule(const std::string &callingName,
120 const std::string &controlRuleType, const std::vector<std::string> &appIds, int32_t userId)
121 {
122 for (const auto &appId : appIds) {
123 NativeRdb::AbsRdbPredicates absRdbPredicates(APP_CONTROL_RDB_TABLE_NAME);
124 absRdbPredicates.EqualTo(CALLING_NAME, callingName);
125 absRdbPredicates.EqualTo(APP_CONTROL_LIST, controlRuleType);
126 absRdbPredicates.EqualTo(USER_ID, std::to_string(userId));
127 absRdbPredicates.EqualTo(APP_ID, appId);
128 bool ret = rdbDataManager_->DeleteData(absRdbPredicates);
129 if (!ret) {
130 LOG_E(BMS_TAG_DEFAULT, "Delete failed callingName:%{public}s appId:%{private}s userId:%{public}d",
131 callingName.c_str(), appId.c_str(), userId);
132 return ERR_APPEXECFWK_DB_DELETE_ERROR;
133 }
134 EventInfo info;
135 info.callingName = callingName;
136 info.userId = userId;
137 info.appIds.push_back(appId);
138 info.rule = controlRuleType;
139 info.operationType = static_cast<int32_t>(OPERATION_TYPE_ENUM::OPERATION_TYPE_REMOVE_RULE);
140 info.actionType = static_cast<int32_t>(ACTION_TYPE_ENUM::ACTION_TYPE_OF_INSTALL);
141 EventReport::SendAppControlRuleEvent(info);
142 }
143 return ERR_OK;
144 }
145
DeleteAppInstallControlRule(const std::string & callingName,const std::string & controlRuleType,int32_t userId)146 ErrCode AppControlManagerRdb::DeleteAppInstallControlRule(const std::string &callingName,
147 const std::string &controlRuleType, int32_t userId)
148 {
149 NativeRdb::AbsRdbPredicates absRdbPredicates(APP_CONTROL_RDB_TABLE_NAME);
150 absRdbPredicates.EqualTo(CALLING_NAME, callingName);
151 absRdbPredicates.EqualTo(APP_CONTROL_LIST, controlRuleType);
152 absRdbPredicates.EqualTo(USER_ID, std::to_string(userId));
153 bool ret = rdbDataManager_->DeleteData(absRdbPredicates);
154 if (!ret) {
155 LOG_E(BMS_TAG_DEFAULT, "DeleteData callingName:%{public}s controlRuleType:%{public}s failed",
156 callingName.c_str(), controlRuleType.c_str());
157 return ERR_APPEXECFWK_DB_DELETE_ERROR;
158 }
159 EventInfo info;
160 info.callingName = callingName;
161 info.userId = userId;
162 info.rule = controlRuleType;
163 info.operationType = static_cast<int32_t>(OPERATION_TYPE_ENUM::OPERATION_TYPE_REMOVE_RULE);
164 info.actionType = static_cast<int32_t>(ACTION_TYPE_ENUM::ACTION_TYPE_OF_INSTALL);
165 EventReport::SendAppControlRuleEvent(info);
166 return ERR_OK;
167 }
168
GetAppInstallControlRule(const std::string & callingName,const std::string & controlRuleType,int32_t userId,std::vector<std::string> & appIds)169 ErrCode AppControlManagerRdb::GetAppInstallControlRule(const std::string &callingName,
170 const std::string &controlRuleType, int32_t userId, std::vector<std::string> &appIds)
171 {
172 NativeRdb::AbsRdbPredicates absRdbPredicates(APP_CONTROL_RDB_TABLE_NAME);
173 absRdbPredicates.EqualTo(CALLING_NAME, callingName);
174 absRdbPredicates.EqualTo(APP_CONTROL_LIST, controlRuleType);
175 absRdbPredicates.EqualTo(USER_ID, std::to_string(userId));
176 auto absSharedResultSet = rdbDataManager_->QueryData(absRdbPredicates);
177 if (absSharedResultSet == nullptr) {
178 LOG_E(BMS_TAG_DEFAULT, "GetAppInstallControlRule failed");
179 return ERR_APPEXECFWK_DB_RESULT_SET_EMPTY;
180 }
181 ScopeGuard stateGuard([&] { absSharedResultSet->Close(); });
182 int32_t count;
183 int ret = absSharedResultSet->GetRowCount(count);
184 if (ret != NativeRdb::E_OK) {
185 LOG_E(BMS_TAG_DEFAULT, "GetRowCount failed, ret: %{public}d", ret);
186 return ERR_APPEXECFWK_DB_RESULT_SET_EMPTY;
187 }
188 if (count == 0) {
189 LOG_D(BMS_TAG_DEFAULT, "GetAppInstallControlRule size 0");
190 return ERR_OK;
191 }
192
193 ret = absSharedResultSet->GoToFirstRow();
194 if (ret != NativeRdb::E_OK) {
195 LOG_E(BMS_TAG_DEFAULT, "GoToFirstRow failed, ret: %{public}d", ret);
196 return ERR_APPEXECFWK_DB_RESULT_SET_OPT_ERROR;
197 }
198 do {
199 std::string appId;
200 ret = absSharedResultSet->GetString(APP_ID_INDEX, appId);
201 if (ret != NativeRdb::E_OK) {
202 LOG_E(BMS_TAG_DEFAULT, "GetString appId failed, ret: %{public}d", ret);
203 return ERR_APPEXECFWK_DB_RESULT_SET_OPT_ERROR;
204 }
205 appIds.push_back(appId);
206 } while (absSharedResultSet->GoToNextRow() == NativeRdb::E_OK);
207 return ERR_OK;
208 }
209
AddAppRunningControlRule(const std::string & callingName,const std::vector<AppRunningControlRule> & controlRules,int32_t userId)210 ErrCode AppControlManagerRdb::AddAppRunningControlRule(const std::string &callingName,
211 const std::vector<AppRunningControlRule> &controlRules, int32_t userId)
212 {
213 int64_t timeStamp = BundleUtil::GetCurrentTime();
214 std::vector<NativeRdb::ValuesBucket> valuesBuckets;
215 for (auto &controlRule : controlRules) {
216 ErrCode result = DeleteOldControlRule(callingName, RUNNING_CONTROL, controlRule.appId, userId);
217 if (result != ERR_OK) {
218 LOG_E(BMS_TAG_DEFAULT, "DeleteOldControlRule failed");
219 return result;
220 }
221 NativeRdb::ValuesBucket valuesBucket;
222 valuesBucket.PutString(CALLING_NAME, callingName);
223 valuesBucket.PutString(APP_CONTROL_LIST, RUNNING_CONTROL);
224 valuesBucket.PutInt(USER_ID, static_cast<int>(userId));
225 valuesBucket.PutString(APP_ID, controlRule.appId);
226 valuesBucket.PutString(CONTROL_MESSAGE, controlRule.controlMessage);
227 valuesBucket.PutInt(PRIORITY, static_cast<int>(PRIORITY::EDM));
228 valuesBucket.PutInt(TIME_STAMP, timeStamp);
229 valuesBuckets.emplace_back(valuesBucket);
230 }
231 int64_t insertNum = 0;
232 bool ret = rdbDataManager_->BatchInsert(insertNum, valuesBuckets);
233 if (!ret) {
234 LOG_E(BMS_TAG_DEFAULT, "BatchInsert AddAppRunningControlRule failed");
235 return ERR_APPEXECFWK_DB_BATCH_INSERT_ERROR;
236 }
237 for (auto &controlRule : controlRules) {
238 EventInfo info;
239 info.callingName = callingName;
240 info.userId = userId;
241 info.rule = controlRule.controlMessage;
242 info.appIds.push_back(controlRule.appId);
243 info.operationType = static_cast<int32_t>(OPERATION_TYPE_ENUM::OPERATION_TYPE_ADD_RULE);
244 info.actionType = static_cast<int32_t>(ACTION_TYPE_ENUM::ACTION_TYPE_OF_RUNUING);
245 EventReport::SendAppControlRuleEvent(info);
246 }
247 if (valuesBuckets.size() != static_cast<uint64_t>(insertNum)) {
248 LOG_E(BMS_TAG_DEFAULT, "BatchInsert size not expected");
249 return ERR_APPEXECFWK_DB_BATCH_INSERT_ERROR;
250 }
251 return ERR_OK;
252 }
253
DeleteAppRunningControlRule(const std::string & callingName,const std::vector<AppRunningControlRule> & controlRules,int32_t userId)254 ErrCode AppControlManagerRdb::DeleteAppRunningControlRule(const std::string &callingName,
255 const std::vector<AppRunningControlRule> &controlRules, int32_t userId)
256 {
257 for (auto &rule : controlRules) {
258 NativeRdb::AbsRdbPredicates absRdbPredicates(APP_CONTROL_RDB_TABLE_NAME);
259 absRdbPredicates.EqualTo(CALLING_NAME, callingName);
260 absRdbPredicates.EqualTo(APP_CONTROL_LIST, RUNNING_CONTROL);
261 absRdbPredicates.EqualTo(USER_ID, std::to_string(userId));
262 absRdbPredicates.EqualTo(APP_ID, rule.appId);
263 bool ret = rdbDataManager_->DeleteData(absRdbPredicates);
264 if (!ret) {
265 LOG_E(BMS_TAG_DEFAULT, "Delete failed callingName:%{public}s appid:%{private}s userId:%{public}d",
266 callingName.c_str(), rule.appId.c_str(), userId);
267 return ERR_APPEXECFWK_DB_DELETE_ERROR;
268 }
269 EventInfo info;
270 info.callingName = callingName;
271 info.userId = userId;
272 info.appIds.push_back(rule.appId);
273 info.operationType = static_cast<int32_t>(OPERATION_TYPE_ENUM::OPERATION_TYPE_REMOVE_RULE);
274 info.actionType = static_cast<int32_t>(ACTION_TYPE_ENUM::ACTION_TYPE_OF_RUNUING);
275 EventReport::SendAppControlRuleEvent(info);
276 }
277 return ERR_OK;
278 }
DeleteAppRunningControlRule(const std::string & callingName,int32_t userId)279 ErrCode AppControlManagerRdb::DeleteAppRunningControlRule(const std::string &callingName, int32_t userId)
280 {
281 NativeRdb::AbsRdbPredicates absRdbPredicates(APP_CONTROL_RDB_TABLE_NAME);
282 absRdbPredicates.EqualTo(CALLING_NAME, callingName);
283 absRdbPredicates.EqualTo(APP_CONTROL_LIST, RUNNING_CONTROL);
284 absRdbPredicates.EqualTo(USER_ID, std::to_string(userId));
285 bool ret = rdbDataManager_->DeleteData(absRdbPredicates);
286 if (!ret) {
287 LOG_E(BMS_TAG_DEFAULT, "DeleteAppRunningControlRule callingName:%{public}s userId:%{public}d failed",
288 callingName.c_str(), userId);
289 return ERR_APPEXECFWK_DB_DELETE_ERROR;
290 }
291 EventInfo info;
292 info.callingName = callingName;
293 info.userId = userId;
294 info.operationType = static_cast<int32_t>(OPERATION_TYPE_ENUM::OPERATION_TYPE_REMOVE_RULE);
295 info.actionType = static_cast<int32_t>(ACTION_TYPE_ENUM::ACTION_TYPE_OF_RUNUING);
296 EventReport::SendAppControlRuleEvent(info);
297 return ERR_OK;
298 }
299
GetAppRunningControlRule(const std::string & callingName,int32_t userId,std::vector<std::string> & appIds)300 ErrCode AppControlManagerRdb::GetAppRunningControlRule(const std::string &callingName,
301 int32_t userId, std::vector<std::string> &appIds)
302 {
303 HITRACE_METER_NAME(HITRACE_TAG_APP, __PRETTY_FUNCTION__);
304 NativeRdb::AbsRdbPredicates absRdbPredicates(APP_CONTROL_RDB_TABLE_NAME);
305 absRdbPredicates.EqualTo(CALLING_NAME, callingName);
306 absRdbPredicates.EqualTo(APP_CONTROL_LIST, RUNNING_CONTROL);
307 absRdbPredicates.EqualTo(USER_ID, std::to_string(userId));
308 auto absSharedResultSet = rdbDataManager_->QueryData(absRdbPredicates);
309 if (absSharedResultSet == nullptr) {
310 LOG_E(BMS_TAG_DEFAULT, "QueryData failed");
311 return ERR_APPEXECFWK_DB_RESULT_SET_EMPTY;
312 }
313 ScopeGuard stateGuard([&] { absSharedResultSet->Close(); });
314 int32_t count;
315 int ret = absSharedResultSet->GetRowCount(count);
316 if (ret != NativeRdb::E_OK) {
317 LOG_E(BMS_TAG_DEFAULT, "GetRowCount failed, ret: %{public}d", ret);
318 return ERR_APPEXECFWK_DB_RESULT_SET_OPT_ERROR;
319 }
320 if (count == 0) {
321 LOG_D(BMS_TAG_DEFAULT, "GetAppRunningControlRule size 0");
322 return ERR_OK;
323 }
324 ret = absSharedResultSet->GoToFirstRow();
325 if (ret != NativeRdb::E_OK) {
326 LOG_E(BMS_TAG_DEFAULT, "GoToFirstRow failed, ret: %{public}d", ret);
327 return ERR_APPEXECFWK_DB_RESULT_SET_OPT_ERROR;
328 }
329 do {
330 std::string appId;
331 ret = absSharedResultSet->GetString(APP_ID_INDEX, appId);
332 if (ret != NativeRdb::E_OK) {
333 LOG_E(BMS_TAG_DEFAULT, "GetString appId failed, ret: %{public}d", ret);
334 return ERR_APPEXECFWK_DB_RESULT_SET_OPT_ERROR;
335 }
336 appIds.push_back(appId);
337 } while (absSharedResultSet->GoToNextRow() == NativeRdb::E_OK);
338 return ERR_OK;
339 }
340
GetAppRunningControlRule(const std::string & appId,int32_t userId,AppRunningControlRuleResult & controlRuleResult)341 ErrCode AppControlManagerRdb::GetAppRunningControlRule(const std::string &appId,
342 int32_t userId, AppRunningControlRuleResult &controlRuleResult)
343 {
344 HITRACE_METER_NAME(HITRACE_TAG_APP, __PRETTY_FUNCTION__);
345 NativeRdb::AbsRdbPredicates absRdbPredicates(APP_CONTROL_RDB_TABLE_NAME);
346 absRdbPredicates.EqualTo(APP_ID, appId);
347 absRdbPredicates.EqualTo(APP_CONTROL_LIST, RUNNING_CONTROL);
348 absRdbPredicates.EqualTo(USER_ID, std::to_string(userId));
349 absRdbPredicates.OrderByAsc(PRIORITY); // ascending
350 auto absSharedResultSet = rdbDataManager_->QueryData(absRdbPredicates);
351 if (absSharedResultSet == nullptr) {
352 LOG_E(BMS_TAG_DEFAULT, "QueryData failed");
353 return ERR_APPEXECFWK_DB_RESULT_SET_EMPTY;
354 }
355 ScopeGuard stateGuard([&] { absSharedResultSet->Close(); });
356 int32_t count;
357 int ret = absSharedResultSet->GetRowCount(count);
358 if (ret != NativeRdb::E_OK) {
359 LOG_E(BMS_TAG_DEFAULT, "GetRowCount failed, ret: %{public}d", ret);
360 return ERR_APPEXECFWK_DB_RESULT_SET_OPT_ERROR;
361 }
362 if (count == 0) {
363 LOG_NOFUNC_W(BMS_TAG_DEFAULT, "control rule invalid size 0");
364 return ERR_BUNDLE_MANAGER_BUNDLE_NOT_SET_CONTROL;
365 }
366 ret = absSharedResultSet->GoToFirstRow();
367 if (ret != NativeRdb::E_OK) {
368 LOG_E(BMS_TAG_DEFAULT, "GoToFirstRow failed, ret: %{public}d", ret);
369 return ERR_APPEXECFWK_DB_RESULT_SET_OPT_ERROR;
370 }
371 std::string callingName;
372 if (absSharedResultSet->GetString(CALLING_NAME_INDEX, callingName) != NativeRdb::E_OK) {
373 LOG_E(BMS_TAG_DEFAULT, "GetString callingName failed, ret: %{public}d", ret);
374 return ERR_APPEXECFWK_DB_RESULT_SET_OPT_ERROR;
375 }
376 ret = absSharedResultSet->GetString(CONTROL_MESSAGE_INDEX, controlRuleResult.controlMessage);
377 if (ret != NativeRdb::E_OK) {
378 LOG_W(BMS_TAG_DEFAULT, "GetString controlMessage failed, ret: %{public}d", ret);
379 return ERR_APPEXECFWK_DB_RESULT_SET_OPT_ERROR;
380 }
381 if (controlRuleResult.controlMessage.empty() && callingName == AppControlConstants::EDM_CALLING) {
382 LOG_D(BMS_TAG_DEFAULT, "GetString controlMessage default");
383 controlRuleResult.controlMessage = APP_CONTROL_EDM_DEFAULT_MESSAGE;
384 }
385 std::string wantString;
386 if (absSharedResultSet->GetString(DISPOSED_STATUS_INDEX, wantString) != NativeRdb::E_OK) {
387 LOG_E(BMS_TAG_DEFAULT, "GetString controlWant failed, ret: %{public}d", ret);
388 }
389 if (!wantString.empty()) {
390 std::unique_ptr<Want> wantPtr(Want::FromString(wantString));
391 if (wantPtr) {
392 controlRuleResult.controlWant = std::make_shared<Want>(*wantPtr);
393 } else {
394 LOG_E(BMS_TAG_DEFAULT, "wantPtr is null");
395 }
396 }
397 if (callingName == AppControlConstants::EDM_CALLING) {
398 controlRuleResult.isEdm = true;
399 }
400 return ERR_OK;
401 }
402
SetDisposedStatus(const std::string & callingName,const std::string & appId,const Want & want,int32_t userId)403 ErrCode AppControlManagerRdb::SetDisposedStatus(const std::string &callingName,
404 const std::string &appId, const Want &want, int32_t userId)
405 {
406 LOG_D(BMS_TAG_DEFAULT, "rdb begin to SetDisposedStatus");
407 ErrCode code = DeleteDisposedStatus(callingName, appId, userId);
408 if (code != ERR_OK) {
409 LOG_E(BMS_TAG_DEFAULT, "DeleteDisposedStatus failed");
410 return ERR_APPEXECFWK_DB_DELETE_ERROR;
411 }
412 int64_t timeStamp = BundleUtil::GetCurrentTime();
413 NativeRdb::ValuesBucket valuesBucket;
414 valuesBucket.PutString(CALLING_NAME, callingName);
415 valuesBucket.PutString(APP_CONTROL_LIST, RUNNING_CONTROL);
416 valuesBucket.PutString(APP_ID, appId);
417 valuesBucket.PutString(DISPOSED_STATUS, want.ToString());
418 valuesBucket.PutInt(PRIORITY, static_cast<int>(PRIORITY::APP_MARKET));
419 valuesBucket.PutInt(TIME_STAMP, timeStamp);
420 valuesBucket.PutString(USER_ID, std::to_string(userId));
421 bool ret = rdbDataManager_->InsertData(valuesBucket);
422 if (!ret) {
423 LOG_E(BMS_TAG_DEFAULT, "SetDisposedStatus callingName:%{public}s appId:%{private}s failed",
424 callingName.c_str(), appId.c_str());
425 return ERR_APPEXECFWK_DB_INSERT_ERROR;
426 }
427 EventInfo info;
428 info.callingName = callingName;
429 info.userId = userId;
430 info.appIds.push_back(appId);
431 info.rule = want.ToString();
432 info.operationType = static_cast<int32_t>(OPERATION_TYPE_ENUM::OPERATION_TYPE_ADD_RULE);
433 info.actionType = static_cast<int32_t>(ACTION_TYPE_ENUM::ACTION_TYPE_DISPOSE_STATUS);
434 EventReport::SendAppControlRuleEvent(info);
435 return ERR_OK;
436 }
437
DeleteDisposedStatus(const std::string & callingName,const std::string & appId,int32_t userId)438 ErrCode AppControlManagerRdb::DeleteDisposedStatus(const std::string &callingName,
439 const std::string &appId, int32_t userId)
440 {
441 LOG_D(BMS_TAG_DEFAULT, "rdb begin to DeleteDisposedStatus");
442 NativeRdb::AbsRdbPredicates absRdbPredicates(APP_CONTROL_RDB_TABLE_NAME);
443 absRdbPredicates.EqualTo(CALLING_NAME, callingName);
444 absRdbPredicates.EqualTo(APP_CONTROL_LIST, RUNNING_CONTROL);
445 absRdbPredicates.EqualTo(APP_ID, appId);
446 absRdbPredicates.EqualTo(USER_ID, std::to_string(userId));
447 bool ret = rdbDataManager_->DeleteData(absRdbPredicates);
448 if (!ret) {
449 LOG_E(BMS_TAG_DEFAULT, "DeleteDisposedStatus callingName:%{public}s appId:%{private}s failed",
450 callingName.c_str(), appId.c_str());
451 return ERR_APPEXECFWK_DB_DELETE_ERROR;
452 }
453 EventInfo info;
454 info.callingName = callingName;
455 info.userId = userId;
456 info.appIds.push_back(appId);
457 info.operationType = static_cast<int32_t>(OPERATION_TYPE_ENUM::OPERATION_TYPE_REMOVE_RULE);
458 info.actionType = static_cast<int32_t>(ACTION_TYPE_ENUM::ACTION_TYPE_DISPOSE_STATUS);
459 EventReport::SendAppControlRuleEvent(info);
460 return ERR_OK;
461 }
462
GetDisposedStatus(const std::string & callingName,const std::string & appId,Want & want,int32_t userId)463 ErrCode AppControlManagerRdb::GetDisposedStatus(const std::string &callingName,
464 const std::string &appId, Want &want, int32_t userId)
465 {
466 LOG_D(BMS_TAG_DEFAULT, "rdb begin to GetDisposedStatus");
467 NativeRdb::AbsRdbPredicates absRdbPredicates(APP_CONTROL_RDB_TABLE_NAME);
468 absRdbPredicates.EqualTo(CALLING_NAME, callingName);
469 absRdbPredicates.EqualTo(APP_CONTROL_LIST, RUNNING_CONTROL);
470 absRdbPredicates.EqualTo(APP_ID, appId);
471 absRdbPredicates.EqualTo(USER_ID, std::to_string(userId));
472 auto absSharedResultSet = rdbDataManager_->QueryData(absRdbPredicates);
473 if (absSharedResultSet == nullptr) {
474 LOG_E(BMS_TAG_DEFAULT, "GetAppInstallControlRule failed");
475 return ERR_APPEXECFWK_DB_RESULT_SET_EMPTY;
476 }
477 ScopeGuard stateGuard([&] { absSharedResultSet->Close(); });
478 int32_t count;
479 int ret = absSharedResultSet->GetRowCount(count);
480 if (ret != NativeRdb::E_OK) {
481 LOG_E(BMS_TAG_DEFAULT, "GetRowCount failed, ret: %{public}d", ret);
482 return ERR_APPEXECFWK_DB_RESULT_SET_OPT_ERROR;
483 }
484 if (count == 0) {
485 LOG_D(BMS_TAG_DEFAULT, "GetAppRunningControlRule size 0");
486 return ERR_OK;
487 }
488 ret = absSharedResultSet->GoToFirstRow();
489 if (ret != NativeRdb::E_OK) {
490 LOG_E(BMS_TAG_DEFAULT, "GoToFirstRow failed, ret: %{public}d", ret);
491 return ERR_APPEXECFWK_DB_RESULT_SET_OPT_ERROR;
492 }
493 std::string wantString;
494 ret = absSharedResultSet->GetString(DISPOSED_STATUS_INDEX, wantString);
495 if (ret != NativeRdb::E_OK) {
496 LOG_E(BMS_TAG_DEFAULT, "GetString DisposedStatus failed, ret: %{public}d", ret);
497 return ERR_APPEXECFWK_DB_RESULT_SET_OPT_ERROR;
498 }
499 std::unique_ptr<Want> wantPtr(Want::FromString(wantString));
500 if (!wantPtr) {
501 LOG_E(BMS_TAG_DEFAULT, "wantPtr is null");
502 return ERR_BUNDLE_MANAGER_APP_CONTROL_INTERNAL_ERROR;
503 }
504 want = *wantPtr;
505 return ERR_OK;
506 }
507
DeleteOldControlRule(const std::string & callingName,const std::string & controlRuleType,const std::string & appId,int32_t userId)508 ErrCode AppControlManagerRdb::DeleteOldControlRule(const std::string &callingName, const std::string &controlRuleType,
509 const std::string &appId, int32_t userId)
510 {
511 NativeRdb::AbsRdbPredicates absRdbPredicates(APP_CONTROL_RDB_TABLE_NAME);
512 absRdbPredicates.EqualTo(CALLING_NAME, callingName);
513 absRdbPredicates.EqualTo(APP_CONTROL_LIST, controlRuleType);
514 absRdbPredicates.EqualTo(USER_ID, std::to_string(userId));
515 absRdbPredicates.EqualTo(APP_ID, appId);
516 bool ret = rdbDataManager_->DeleteData(absRdbPredicates);
517 if (!ret) {
518 LOG_E(BMS_TAG_DEFAULT, "DeleteOldControlRule %{public}s, %{public}s, %{public}s, %{public}d failed",
519 callingName.c_str(), appId.c_str(), controlRuleType.c_str(), userId);
520 return ERR_APPEXECFWK_DB_DELETE_ERROR;
521 }
522 EventInfo info;
523 info.callingName = callingName;
524 info.userId = userId;
525 info.appIds.push_back(appId);
526 info.rule = controlRuleType;
527 info.operationType = static_cast<int32_t>(OPERATION_TYPE_ENUM::OPERATION_TYPE_REMOVE_RULE);
528 EventReport::SendAppControlRuleEvent(info);
529 return ERR_OK;
530 }
531
SetDisposedRule(const std::string & callingName,const std::string & appId,const DisposedRule & rule,int32_t appIndex,int32_t userId)532 ErrCode AppControlManagerRdb::SetDisposedRule(const std::string &callingName,
533 const std::string &appId, const DisposedRule &rule, int32_t appIndex, int32_t userId)
534 {
535 ErrCode code = DeleteDisposedRule(callingName, appId, appIndex, userId);
536 if (code != ERR_OK) {
537 LOG_E(BMS_TAG_DEFAULT, "DeleteDisposedStatus failed.");
538 return ERR_APPEXECFWK_DB_DELETE_ERROR;
539 }
540 int64_t timeStamp = BundleUtil::GetCurrentTime();
541 NativeRdb::ValuesBucket valuesBucket;
542 valuesBucket.PutString(CALLING_NAME, callingName);
543 valuesBucket.PutString(APP_CONTROL_LIST, DISPOSED_RULE);
544 valuesBucket.PutString(APP_ID, appId);
545 valuesBucket.PutString(DISPOSED_STATUS, rule.ToString());
546 valuesBucket.PutInt(PRIORITY, rule.priority);
547 valuesBucket.PutInt(TIME_STAMP, timeStamp);
548 valuesBucket.PutString(USER_ID, std::to_string(userId));
549 valuesBucket.PutString(APP_INDEX, std::to_string(appIndex));
550 bool ret = rdbDataManager_->InsertData(valuesBucket);
551 if (!ret) {
552 LOG_E(BMS_TAG_DEFAULT, "SetDisposedStatus callingName:%{public}s appId:%{private}s failed.",
553 callingName.c_str(), appId.c_str());
554 return ERR_APPEXECFWK_DB_INSERT_ERROR;
555 }
556 EventInfo info;
557 info.callingName = callingName;
558 info.userId = userId;
559 info.appIds.push_back(appId);
560 info.rule = rule.ToString();
561 info.operationType = static_cast<int32_t>(OPERATION_TYPE_ENUM::OPERATION_TYPE_ADD_RULE);
562 info.actionType = static_cast<int32_t>(ACTION_TYPE_ENUM::ACTION_TYPE_DISPOSE_RULE);
563 info.appIndex = appIndex;
564 EventReport::SendAppControlRuleEvent(info);
565 return ERR_OK;
566 }
567
DeleteDisposedRule(const std::string & callingName,const std::string & appId,int32_t appIndex,int32_t userId)568 ErrCode AppControlManagerRdb::DeleteDisposedRule(const std::string &callingName,
569 const std::string &appId, int32_t appIndex, int32_t userId)
570 {
571 NativeRdb::AbsRdbPredicates absRdbPredicates(APP_CONTROL_RDB_TABLE_NAME);
572 absRdbPredicates.EqualTo(CALLING_NAME, callingName);
573 absRdbPredicates.EqualTo(APP_CONTROL_LIST, DISPOSED_RULE);
574 absRdbPredicates.EqualTo(APP_ID, appId);
575 absRdbPredicates.EqualTo(USER_ID, std::to_string(userId));
576 absRdbPredicates.EqualTo(APP_INDEX, std::to_string(appIndex));
577 bool ret = rdbDataManager_->DeleteData(absRdbPredicates);
578 if (!ret) {
579 LOG_E(BMS_TAG_DEFAULT, "DeleteDisposedStatus callingName:%{public}s appId:%{private}s failed",
580 callingName.c_str(), appId.c_str());
581 return ERR_APPEXECFWK_DB_DELETE_ERROR;
582 }
583 EventInfo info;
584 info.callingName = callingName;
585 info.userId = userId;
586 info.appIds.push_back(appId);
587 info.operationType = static_cast<int32_t>(OPERATION_TYPE_ENUM::OPERATION_TYPE_REMOVE_RULE);
588 info.actionType = static_cast<int32_t>(ACTION_TYPE_ENUM::ACTION_TYPE_DISPOSE_RULE);
589 info.appIndex = appIndex;
590 EventReport::SendAppControlRuleEvent(info);
591 return ERR_OK;
592 }
593
DeleteAllDisposedRuleByBundle(const std::string & appId,int32_t appIndex,int32_t userId)594 ErrCode AppControlManagerRdb::DeleteAllDisposedRuleByBundle(const std::string &appId, int32_t appIndex, int32_t userId)
595 {
596 NativeRdb::AbsRdbPredicates absRdbPredicates(APP_CONTROL_RDB_TABLE_NAME);
597 std::vector<std::string> controlList = {DISPOSED_RULE, RUNNING_CONTROL, UNINSTALL_DISPOSED_RULE};
598 absRdbPredicates.In(APP_CONTROL_LIST, controlList);
599 absRdbPredicates.EqualTo(APP_ID, appId);
600 absRdbPredicates.EqualTo(USER_ID, std::to_string(userId));
601 // if appIndex is main app also clear all clone app
602 if (appIndex != Constants::MAIN_APP_INDEX) {
603 absRdbPredicates.EqualTo(APP_INDEX, std::to_string(appIndex));
604 }
605 bool ret = rdbDataManager_->DeleteData(absRdbPredicates);
606 if (!ret) {
607 LOG_E(BMS_TAG_DEFAULT, "DeleteAllDisposedRuleByBundle appId:%{private}s failed", appId.c_str());
608 return ERR_APPEXECFWK_DB_DELETE_ERROR;
609 }
610 EventInfo info;
611 info.userId = userId;
612 info.appIds.push_back(appId);
613 info.operationType = static_cast<int32_t>(OPERATION_TYPE_ENUM::OPERATION_TYPE_REMOVE_RULE);
614 info.actionType = static_cast<int32_t>(ACTION_TYPE_ENUM::ACTION_TYPE_DISPOSE_RULE);
615 info.appIndex = appIndex;
616 EventReport::SendAppControlRuleEvent(info);
617 return ERR_OK;
618 }
619
OptimizeDisposedPredicates(const std::string & callingName,const std::string & appId,int32_t userId,int32_t appIndex,NativeRdb::AbsRdbPredicates & absRdbPredicates)620 ErrCode AppControlManagerRdb::OptimizeDisposedPredicates(const std::string &callingName, const std::string &appId,
621 int32_t userId, int32_t appIndex, NativeRdb::AbsRdbPredicates &absRdbPredicates)
622 {
623 auto bmsExtensionClient = std::make_shared<BmsExtensionClient>();
624 return bmsExtensionClient->OptimizeDisposedPredicates(callingName, appId, userId, appIndex, absRdbPredicates);
625 }
626
GetDisposedRule(const std::string & callingName,const std::string & appId,DisposedRule & rule,int32_t appIndex,int32_t userId)627 ErrCode AppControlManagerRdb::GetDisposedRule(const std::string &callingName,
628 const std::string &appId, DisposedRule &rule, int32_t appIndex, int32_t userId)
629 {
630 LOG_D(BMS_TAG_DEFAULT, "rdb begin to GetDisposedRule");
631 NativeRdb::AbsRdbPredicates absRdbPredicates(APP_CONTROL_RDB_TABLE_NAME);
632 absRdbPredicates.EqualTo(CALLING_NAME, callingName);
633 absRdbPredicates.EqualTo(APP_CONTROL_LIST, DISPOSED_RULE);
634 absRdbPredicates.EqualTo(APP_ID, appId);
635 absRdbPredicates.EqualTo(USER_ID, std::to_string(userId));
636 absRdbPredicates.EqualTo(APP_INDEX, std::to_string(appIndex));
637 OptimizeDisposedPredicates(callingName, appId, userId, appIndex, absRdbPredicates);
638 auto absSharedResultSet = rdbDataManager_->QueryData(absRdbPredicates);
639 if (absSharedResultSet == nullptr) {
640 LOG_E(BMS_TAG_DEFAULT, "GetAppInstallControlRule failed");
641 return ERR_APPEXECFWK_DB_RESULT_SET_EMPTY;
642 }
643 ScopeGuard stateGuard([&] { absSharedResultSet->Close(); });
644 int32_t count;
645 int ret = absSharedResultSet->GetRowCount(count);
646 if (ret != NativeRdb::E_OK) {
647 LOG_E(BMS_TAG_DEFAULT, "GetRowCount failed, ret: %{public}d", ret);
648 return ERR_APPEXECFWK_DB_RESULT_SET_OPT_ERROR;
649 }
650 if (count == 0) {
651 LOG_D(BMS_TAG_DEFAULT, "GetDisposedRule size 0");
652 return ERR_OK;
653 }
654 ret = absSharedResultSet->GoToFirstRow();
655 if (ret != NativeRdb::E_OK) {
656 LOG_E(BMS_TAG_DEFAULT, "GoToFirstRow failed, ret: %{public}d", ret);
657 return ERR_APPEXECFWK_DB_RESULT_SET_OPT_ERROR;
658 }
659 std::string ruleString;
660 ret = absSharedResultSet->GetString(DISPOSED_STATUS_INDEX, ruleString);
661 if (ret != NativeRdb::E_OK) {
662 LOG_E(BMS_TAG_DEFAULT, "GetString DisposedStatus failed, ret: %{public}d", ret);
663 return ERR_APPEXECFWK_DB_RESULT_SET_OPT_ERROR;
664 }
665 DisposedRule::FromString(ruleString, rule);
666 return ERR_OK;
667 }
668
GetAbilityRunningControlRule(const std::string & appId,int32_t appIndex,int32_t userId,std::vector<DisposedRule> & disposedRules)669 ErrCode AppControlManagerRdb::GetAbilityRunningControlRule(
670 const std::string &appId, int32_t appIndex, int32_t userId, std::vector<DisposedRule>& disposedRules)
671 {
672 HITRACE_METER_NAME(HITRACE_TAG_APP, __PRETTY_FUNCTION__);
673 LOG_D(BMS_TAG_DEFAULT, "rdb begin to GetAbilityRunningControlRule");
674 NativeRdb::AbsRdbPredicates absRdbPredicates(APP_CONTROL_RDB_TABLE_NAME);
675 absRdbPredicates.EqualTo(APP_CONTROL_LIST, DISPOSED_RULE);
676 absRdbPredicates.EqualTo(APP_ID, appId);
677 absRdbPredicates.EqualTo(USER_ID, std::to_string(userId));
678 absRdbPredicates.EqualTo(APP_INDEX, std::to_string(appIndex));
679 absRdbPredicates.OrderByAsc(PRIORITY); // ascending
680 auto absSharedResultSet = rdbDataManager_->QueryData(absRdbPredicates);
681 if (absSharedResultSet == nullptr) {
682 LOG_E(BMS_TAG_DEFAULT, "GetAppInstallControlRule failed");
683 return ERR_APPEXECFWK_DB_RESULT_SET_EMPTY;
684 }
685 ScopeGuard stateGuard([&] { absSharedResultSet->Close(); });
686 int32_t count;
687 int ret = absSharedResultSet->GetRowCount(count);
688 if (ret != NativeRdb::E_OK) {
689 LOG_E(BMS_TAG_DEFAULT, "GetRowCount failed, ret: %{public}d", ret);
690 return ERR_APPEXECFWK_DB_RESULT_SET_OPT_ERROR;
691 }
692 if (count == 0) {
693 LOG_D(BMS_TAG_DEFAULT, "GetDisposedRule size 0");
694 return ERR_OK;
695 }
696 ret = absSharedResultSet->GoToFirstRow();
697 if (ret != NativeRdb::E_OK) {
698 LOG_E(BMS_TAG_DEFAULT, "GoToFirstRow failed, ret: %{public}d", ret);
699 return ERR_APPEXECFWK_DB_RESULT_SET_OPT_ERROR;
700 }
701 do {
702 ret = GetDisposedRuleFromResultSet(absSharedResultSet, disposedRules);
703 if (ret != ERR_OK) {
704 return ret;
705 }
706 } while (absSharedResultSet->GoToNextRow() == NativeRdb::E_OK);
707 return ERR_OK;
708 }
709
GetDisposedRuleFromResultSet(std::shared_ptr<NativeRdb::ResultSet> absSharedResultSet,std::vector<DisposedRule> & disposedRules)710 ErrCode AppControlManagerRdb::GetDisposedRuleFromResultSet(
711 std::shared_ptr<NativeRdb::ResultSet> absSharedResultSet, std::vector<DisposedRule> &disposedRules)
712 {
713 if (absSharedResultSet == nullptr) {
714 LOG_E(BMS_TAG_DEFAULT, "GetAppInstallControlRule failed");
715 return ERR_APPEXECFWK_DB_RESULT_SET_EMPTY;
716 }
717 std::string ruleString;
718 ErrCode ret = absSharedResultSet->GetString(DISPOSED_STATUS_INDEX, ruleString);
719 if (ret != NativeRdb::E_OK) {
720 LOG_E(BMS_TAG_DEFAULT, "GetString appId failed, ret: %{public}d", ret);
721 return ERR_APPEXECFWK_DB_RESULT_SET_OPT_ERROR;
722 }
723 std::string callerName;
724 ret = absSharedResultSet->GetString(CALLING_NAME_INDEX, callerName);
725 if (ret != NativeRdb::E_OK) {
726 callerName = "";
727 LOG_I(BMS_TAG_DEFAULT, "GetString callerName failed, ret: %{public}d", ret);
728 }
729 int32_t setTime = 0;
730 ret = absSharedResultSet->GetInt(TIME_STAMP_INDEX, setTime);
731 if (ret != NativeRdb::E_OK) {
732 setTime = 0;
733 LOG_I(BMS_TAG_DEFAULT, "GetInt setTime failed, ret: %{public}d", ret);
734 }
735 DisposedRule rule;
736 bool parseRet = DisposedRule::FromString(ruleString, rule);
737 if (!parseRet) {
738 LOG_W(BMS_TAG_DEFAULT, "parse DisposedRule failed");
739 }
740 rule.callerName = callerName;
741 rule.setTime = setTime;
742 disposedRules.push_back(rule);
743 return ERR_OK;
744 }
745
SetUninstallDisposedRule(const std::string & callingName,const std::string & appIdentifier,const UninstallDisposedRule & rule,int32_t appIndex,int32_t userId)746 ErrCode AppControlManagerRdb::SetUninstallDisposedRule(const std::string &callingName,
747 const std::string &appIdentifier, const UninstallDisposedRule &rule, int32_t appIndex, int32_t userId)
748 {
749 LOG_D(BMS_TAG_DEFAULT, "begin");
750 NativeRdb::AbsRdbPredicates absRdbPredicates(APP_CONTROL_RDB_TABLE_NAME);
751 absRdbPredicates.EqualTo(CALLING_NAME, callingName);
752 absRdbPredicates.EqualTo(APP_CONTROL_LIST, UNINSTALL_DISPOSED_RULE);
753 absRdbPredicates.EqualTo(APP_ID, appIdentifier);
754 absRdbPredicates.EqualTo(USER_ID, std::to_string(userId));
755 absRdbPredicates.EqualTo(APP_INDEX, std::to_string(appIndex));
756
757 int64_t timeStamp = BundleUtil::GetCurrentTime();
758 NativeRdb::ValuesBucket valuesBucket;
759 valuesBucket.PutString(CALLING_NAME, callingName);
760 valuesBucket.PutString(APP_CONTROL_LIST, UNINSTALL_DISPOSED_RULE);
761 valuesBucket.PutString(APP_ID, appIdentifier);
762 valuesBucket.PutString(DISPOSED_STATUS, rule.ToString());
763 valuesBucket.PutInt(PRIORITY, rule.priority);
764 valuesBucket.PutInt(TIME_STAMP, timeStamp);
765 valuesBucket.PutString(USER_ID, std::to_string(userId));
766 valuesBucket.PutString(APP_INDEX, std::to_string(appIndex));
767 bool ret = rdbDataManager_->UpdateOrInsertData(valuesBucket, absRdbPredicates);
768 if (!ret) {
769 LOG_E(BMS_TAG_DEFAULT, "callingName:%{public}s appIdentifier:%{private}s failed.",
770 callingName.c_str(), appIdentifier.c_str());
771 return ERR_APPEXECFWK_DB_UPDATE_ERROR;
772 }
773 return ERR_OK;
774 }
775
DeleteUninstallDisposedRule(const std::string & callingName,const std::string & appIdentifier,int32_t appIndex,int32_t userId)776 ErrCode AppControlManagerRdb::DeleteUninstallDisposedRule(const std::string &callingName,
777 const std::string &appIdentifier, int32_t appIndex, int32_t userId)
778 {
779 LOG_D(BMS_TAG_DEFAULT, "begin");
780 NativeRdb::AbsRdbPredicates absRdbPredicates(APP_CONTROL_RDB_TABLE_NAME);
781 absRdbPredicates.EqualTo(CALLING_NAME, callingName);
782 absRdbPredicates.EqualTo(APP_CONTROL_LIST, UNINSTALL_DISPOSED_RULE);
783 absRdbPredicates.EqualTo(APP_ID, appIdentifier);
784 absRdbPredicates.EqualTo(USER_ID, std::to_string(userId));
785 absRdbPredicates.EqualTo(APP_INDEX, std::to_string(appIndex));
786 bool ret = rdbDataManager_->DeleteData(absRdbPredicates);
787 if (!ret) {
788 LOG_E(BMS_TAG_DEFAULT, "callingName:%{public}s appIdentifier:%{private}s failed",
789 callingName.c_str(), appIdentifier.c_str());
790 return ERR_APPEXECFWK_DB_DELETE_ERROR;
791 }
792 return ERR_OK;
793 }
794
GetUninstallDisposedRule(const std::string & appIdentifier,int32_t appIndex,int32_t userId,UninstallDisposedRule & rule)795 ErrCode AppControlManagerRdb::GetUninstallDisposedRule(const std::string &appIdentifier,
796 int32_t appIndex, int32_t userId, UninstallDisposedRule &rule)
797 {
798 LOG_D(BMS_TAG_DEFAULT, "begin");
799 NativeRdb::AbsRdbPredicates absRdbPredicates(APP_CONTROL_RDB_TABLE_NAME);
800 absRdbPredicates.EqualTo(APP_CONTROL_LIST, UNINSTALL_DISPOSED_RULE);
801 absRdbPredicates.EqualTo(APP_ID, appIdentifier);
802 absRdbPredicates.EqualTo(USER_ID, std::to_string(userId));
803 absRdbPredicates.EqualTo(APP_INDEX, std::to_string(appIndex));
804 absRdbPredicates.OrderByAsc(PRIORITY);
805 absRdbPredicates.OrderByAsc(TIME_STAMP);
806 auto absSharedResultSet = rdbDataManager_->QueryData(absRdbPredicates);
807 if (absSharedResultSet == nullptr) {
808 LOG_E(BMS_TAG_DEFAULT, "null absSharedResultSet");
809 return ERR_APPEXECFWK_DB_RESULT_SET_EMPTY;
810 }
811 ScopeGuard stateGuard([&] { absSharedResultSet->Close(); });
812 int32_t count;
813 int ret = absSharedResultSet->GetRowCount(count);
814 if (ret != NativeRdb::E_OK) {
815 LOG_E(BMS_TAG_DEFAULT, "GetRowCount failed, ret: %{public}d", ret);
816 return ERR_APPEXECFWK_DB_RESULT_SET_OPT_ERROR;
817 }
818 if (count == 0) {
819 LOG_D(BMS_TAG_DEFAULT, "count size 0");
820 return ERR_OK;
821 }
822 ret = absSharedResultSet->GoToFirstRow();
823 if (ret != NativeRdb::E_OK) {
824 LOG_E(BMS_TAG_DEFAULT, "GoToFirstRow failed, ret: %{public}d", ret);
825 return ERR_APPEXECFWK_DB_RESULT_SET_OPT_ERROR;
826 }
827 std::string ruleString;
828 ret = absSharedResultSet->GetString(DISPOSED_STATUS_INDEX, ruleString);
829 if (ret != NativeRdb::E_OK) {
830 LOG_E(BMS_TAG_DEFAULT, "GetString failed, ret: %{public}d", ret);
831 return ERR_APPEXECFWK_DB_RESULT_SET_OPT_ERROR;
832 }
833 UninstallDisposedRule::FromString(ruleString, rule);
834 return ERR_OK;
835 }
836 }
837 }