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