• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 }