1 /*
2  * Copyright (c) 2021-2024 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 "bundle_mgr_host_impl.h"
17 
18 #include "account_helper.h"
19 #include "app_log_tag_wrapper.h"
20 #include "app_mgr_interface.h"
21 #include "aot/aot_handler.h"
22 #include "bms_extension_client.h"
23 #include "bundle_parser.h"
24 #include "bundle_permission_mgr.h"
25 #ifdef DISTRIBUTED_BUNDLE_FRAMEWORK
26 #include "distributed_bms_proxy.h"
27 #endif
28 #include "hitrace_meter.h"
29 #include "installd_client.h"
30 #include "ipc_skeleton.h"
31 #include "iservice_registry.h"
32 #include "system_ability_helper.h"
33 #include "inner_bundle_clone_common.h"
34 #ifdef DEVICE_USAGE_STATISTICS_ENABLED
35 #include "bundle_active_client.h"
36 #include "bundle_active_period_stats.h"
37 #endif
38 #include "system_ability_definition.h"
39 #include "scope_guard.h"
40 #include "xcollie_helper.h"
41 
42 namespace OHOS {
43 namespace AppExecFwk {
44 namespace {
45 constexpr const char* SYSTEM_APP = "system";
46 constexpr const char* THIRD_PARTY_APP = "third-party";
47 constexpr const char* APP_LINKING = "applinking";
48 constexpr const char* EMPTY_ABILITY_NAME = "";
49 const std::string FUNCATION_GET_NAME_FOR_UID = "BundleMgrHostImpl::GetNameForUid";
50 const std::string FUNCATION_GET_OVERLAY_MANAGER_PROXY = "BundleMgrHostImpl::GetOverlayManagerProxy";
51 const std::string FUNCATION_GET_BUNDLE_RESOURCE_PROXY = "BundleMgrHostImpl::GetBundleResourceProxy";
52 const std::string FUNCATION_VERIFY_SYSTEM_API = "BundleMgrHostImpl::VerifySystemApi";
53 const std::string FUNCATION_VERIFY_CALLING_PERMISSION = "BundleMgrHostImpl::VerifyCallingPermission";
54 const std::string FUNCATION_GET_CLONE_BUNDLE_INFO = "BundleMgrHostImpl::GetCloneBundleInfo";
55 const std::string FUNCATION_GET_SHARED_BUNDLE_INFO_BY_SELF = "BundleMgrHostImpl::GetSharedBundleInfoBySelf";
56 const std::string FUNCATION_GET_HAP_MODULE_INFO = "BundleMgrHostImpl::GetHapModuleInfo";
57 const std::string FUNCATION_BATCH_BUNDLE_INFO = "BundleMgrHostImpl::BatchGetBundleInfo";
58 const std::string FUNCATION_GET_BUNDLE_INFO = "BundleMgrHostImpl::GetBundleInfo";
59 }
60 
GetApplicationInfo( const std::string &appName, const ApplicationFlag flag, const int userId, ApplicationInfo &appInfo)61 bool BundleMgrHostImpl::GetApplicationInfo(
62     const std::string &appName, const ApplicationFlag flag, const int userId, ApplicationInfo &appInfo)
63 {
64     return GetApplicationInfo(appName, static_cast<int32_t>(flag), userId, appInfo);
65 }
66 
GetApplicationInfo( const std::string &appName, int32_t flags, int32_t userId, ApplicationInfo &appInfo)67 bool BundleMgrHostImpl::GetApplicationInfo(
68     const std::string &appName, int32_t flags, int32_t userId, ApplicationInfo &appInfo)
69 {
70     LOG_D(BMS_TAG_QUERY, "GetApplicationInfo bundleName:%{public}s flags:%{public}d userId:%{public}d",
71         appName.c_str(), flags, userId);
72     if (!BundlePermissionMgr::IsSystemApp() &&
73         !BundlePermissionMgr::VerifyCallingBundleSdkVersion(ServiceConstants::API_VERSION_NINE)) {
74         LOG_D(BMS_TAG_QUERY, "non-system app calling system api");
75         return true;
76     }
77     if (!BundlePermissionMgr::VerifyCallingPermissionsForAll({Constants::PERMISSION_GET_BUNDLE_INFO_PRIVILEGED,
78         Constants::PERMISSION_GET_BUNDLE_INFO}) &&
79         !BundlePermissionMgr::IsBundleSelfCalling(appName)) {
80         LOG_E(BMS_TAG_QUERY, "verify permission failed");
81         return false;
82     }
83     auto dataMgr = GetDataMgrFromService();
84     if (dataMgr == nullptr) {
85         LOG_E(BMS_TAG_QUERY, "DataMgr is nullptr");
86         return false;
87     }
88     return dataMgr->GetApplicationInfo(appName, flags, userId, appInfo);
89 }
90 
GetApplicationInfoV9( const std::string &appName, int32_t flags, int32_t userId, ApplicationInfo &appInfo)91 ErrCode BundleMgrHostImpl::GetApplicationInfoV9(
92     const std::string &appName, int32_t flags, int32_t userId, ApplicationInfo &appInfo)
93 {
94     HITRACE_METER_NAME(HITRACE_TAG_APP, __PRETTY_FUNCTION__);
95     LOG_D(BMS_TAG_QUERY, "GetApplicationInfoV9 bundleName:%{public}s flags:%{public}d userId:%{public}d",
96         appName.c_str(), flags, userId);
97     if (!BundlePermissionMgr::IsSystemApp()) {
98         LOG_E(BMS_TAG_QUERY, "non-system app calling system api");
99         return ERR_BUNDLE_MANAGER_SYSTEM_API_DENIED;
100     }
101     if (!BundlePermissionMgr::VerifyCallingPermissionsForAll({Constants::PERMISSION_GET_BUNDLE_INFO_PRIVILEGED,
102         Constants::PERMISSION_GET_BUNDLE_INFO}) &&
103         !BundlePermissionMgr::IsBundleSelfCalling(appName)) {
104         LOG_E(BMS_TAG_QUERY, "verify permission failed");
105         return ERR_BUNDLE_MANAGER_PERMISSION_DENIED;
106     }
107     auto dataMgr = GetDataMgrFromService();
108     if (dataMgr == nullptr) {
109         LOG_E(BMS_TAG_QUERY, "DataMgr is nullptr");
110         return ERR_BUNDLE_MANAGER_INTERNAL_ERROR;
111     }
112     return dataMgr->GetApplicationInfoV9(appName, flags, userId, appInfo);
113 }
114 
GetApplicationInfos( const ApplicationFlag flag, const int userId, std::vector<ApplicationInfo> &appInfos)115 bool BundleMgrHostImpl::GetApplicationInfos(
116     const ApplicationFlag flag, const int userId, std::vector<ApplicationInfo> &appInfos)
117 {
118     return GetApplicationInfos(static_cast<int32_t>(flag), userId, appInfos);
119 }
120 
GetApplicationInfos( int32_t flags, int32_t userId, std::vector<ApplicationInfo> &appInfos)121 bool BundleMgrHostImpl::GetApplicationInfos(
122     int32_t flags, int32_t userId, std::vector<ApplicationInfo> &appInfos)
123 {
124     LOG_D(BMS_TAG_QUERY, "GetApplicationInfos flags:%{public}d userId:%{public}d", flags, userId);
125     if (!BundlePermissionMgr::IsSystemApp() &&
126         !BundlePermissionMgr::VerifyCallingBundleSdkVersion(ServiceConstants::API_VERSION_NINE)) {
127         LOG_D(BMS_TAG_QUERY, "non-system app calling system api");
128         return true;
129     }
130     if (!BundlePermissionMgr::VerifyCallingPermissionForAll(Constants::PERMISSION_GET_BUNDLE_INFO_PRIVILEGED)) {
131         LOG_E(BMS_TAG_QUERY, "verify permission failed");
132         return false;
133     }
134     if (!BundlePermissionMgr::IsNativeTokenType() &&
135         (BundlePermissionMgr::GetHapApiVersion() >= ServiceConstants::API_VERSION_NINE)) {
136         LOG_D(BMS_TAG_QUERY,
137             "GetApplicationInfos return empty, not support target level greater than or equal to api9");
138         return true;
139     }
140     auto dataMgr = GetDataMgrFromService();
141     if (dataMgr == nullptr) {
142         LOG_E(BMS_TAG_QUERY, "DataMgr is nullptr");
143         return false;
144     }
145     return dataMgr->GetApplicationInfos(flags, userId, appInfos);
146 }
147 
GetApplicationInfosV9( int32_t flags, int32_t userId, std::vector<ApplicationInfo> &appInfos)148 ErrCode BundleMgrHostImpl::GetApplicationInfosV9(
149     int32_t flags, int32_t userId, std::vector<ApplicationInfo> &appInfos)
150 {
151     LOG_D(BMS_TAG_QUERY, "GetApplicationInfosV9 flags:%{public}d userId:%{public}d", flags, userId);
152     if (!BundlePermissionMgr::IsSystemApp()) {
153         LOG_E(BMS_TAG_QUERY, "non-system app calling system api");
154         return ERR_BUNDLE_MANAGER_SYSTEM_API_DENIED;
155     }
156     if (!BundlePermissionMgr::VerifyCallingPermissionForAll(Constants::PERMISSION_GET_INSTALLED_BUNDLE_LIST)) {
157         LOG_E(BMS_TAG_QUERY, "verify permission failed");
158         return ERR_BUNDLE_MANAGER_PERMISSION_DENIED;
159     }
160     auto dataMgr = GetDataMgrFromService();
161     if (dataMgr == nullptr) {
162         LOG_E(BMS_TAG_QUERY, "DataMgr is nullptr");
163         BundlePermissionMgr::AddPermissionUsedRecord(Constants::PERMISSION_GET_INSTALLED_BUNDLE_LIST, 0, 1);
164         return ERR_BUNDLE_MANAGER_INTERNAL_ERROR;
165     }
166     auto ret = dataMgr->GetApplicationInfosV9(flags, userId, appInfos);
167     if (ret == ERR_OK) {
168         BundlePermissionMgr::AddPermissionUsedRecord(Constants::PERMISSION_GET_INSTALLED_BUNDLE_LIST, 1, 0);
169     } else {
170         BundlePermissionMgr::AddPermissionUsedRecord(Constants::PERMISSION_GET_INSTALLED_BUNDLE_LIST, 0, 1);
171     }
172     return ret;
173 }
174 
GetBundleInfo( const std::string &bundleName, const BundleFlag flag, BundleInfo &bundleInfo, int32_t userId)175 bool BundleMgrHostImpl::GetBundleInfo(
176     const std::string &bundleName, const BundleFlag flag, BundleInfo &bundleInfo, int32_t userId)
177 {
178     return GetBundleInfo(bundleName, static_cast<int32_t>(flag), bundleInfo, userId);
179 }
180 
GetBundleInfo( const std::string &bundleName, int32_t flags, BundleInfo &bundleInfo, int32_t userId)181 bool BundleMgrHostImpl::GetBundleInfo(
182     const std::string &bundleName, int32_t flags, BundleInfo &bundleInfo, int32_t userId)
183 {
184     HITRACE_METER_NAME(HITRACE_TAG_APP, __PRETTY_FUNCTION__);
185     LOG_D(BMS_TAG_QUERY,
186         "start GetBundleInfo, bundleName : %{public}s, flags : %{public}d, userId : %{public}d",
187         bundleName.c_str(), flags, userId);
188     int32_t timerId = XCollieHelper::SetRecoveryTimer(FUNCATION_GET_BUNDLE_INFO);
189     ScopeGuard cancelTimerIdGuard([timerId] { XCollieHelper::CancelTimer(timerId); });
190     // API9 need to be system app
191     if (!BundlePermissionMgr::IsSystemApp() &&
192         !BundlePermissionMgr::VerifyCallingBundleSdkVersion(ServiceConstants::API_VERSION_NINE)) {
193         LOG_D(BMS_TAG_QUERY, "non-system app calling system api");
194         return true;
195     }
196     if (!BundlePermissionMgr::VerifyCallingPermissionsForAll({Constants::PERMISSION_GET_BUNDLE_INFO_PRIVILEGED,
197         Constants::PERMISSION_GET_BUNDLE_INFO}) &&
198         !BundlePermissionMgr::IsBundleSelfCalling(bundleName)) {
199         LOG_E(BMS_TAG_QUERY, "verify permission failed");
200         return false;
201     }
202     LOG_D(BMS_TAG_QUERY, "verify permission success, begin to GetBundleInfo");
203     auto dataMgr = GetDataMgrFromService();
204     if (dataMgr == nullptr) {
205         LOG_E(BMS_TAG_QUERY, "DataMgr is nullptr");
206         return false;
207     }
208     bool res = dataMgr->GetBundleInfo(bundleName, flags, bundleInfo, userId);
209     if (!res) {
210         if (isBrokerServiceExisted_) {
211             auto bmsExtensionClient = std::make_shared<BmsExtensionClient>();
212             return bmsExtensionClient->GetBundleInfo(bundleName, flags, bundleInfo, userId) == ERR_OK;
213         }
214     }
215     return res;
216 }
217 
GetBaseSharedBundleInfos(const std::string &bundleName, std::vector<BaseSharedBundleInfo> &baseSharedBundleInfos, GetDependentBundleInfoFlag flag)218 ErrCode BundleMgrHostImpl::GetBaseSharedBundleInfos(const std::string &bundleName,
219     std::vector<BaseSharedBundleInfo> &baseSharedBundleInfos, GetDependentBundleInfoFlag flag)
220 {
221     APP_LOGD("start GetBaseSharedBundleInfos, bundleName : %{public}s", bundleName.c_str());
222     if (!BundlePermissionMgr::VerifyCallingPermissionForAll(Constants::PERMISSION_GET_BUNDLE_INFO_PRIVILEGED) &&
223         !BundlePermissionMgr::IsBundleSelfCalling(bundleName)) {
224         APP_LOGE("verify permission failed");
225         return ERR_BUNDLE_MANAGER_PERMISSION_DENIED;
226     }
227     auto dataMgr = GetDataMgrFromService();
228     if (dataMgr == nullptr) {
229         APP_LOGE("DataMgr is nullptr");
230         return ERR_BUNDLE_MANAGER_INTERNAL_ERROR;
231     }
232     return dataMgr->GetBaseSharedBundleInfos(bundleName, baseSharedBundleInfos, flag);
233 }
234 
GetBundleInfoV9( const std::string &bundleName, int32_t flags, BundleInfo &bundleInfo, int32_t userId)235 ErrCode BundleMgrHostImpl::GetBundleInfoV9(
236     const std::string &bundleName, int32_t flags, BundleInfo &bundleInfo, int32_t userId)
237 {
238     HITRACE_METER_NAME(HITRACE_TAG_APP, __PRETTY_FUNCTION__);
239     LOG_D(BMS_TAG_QUERY, "GetBundleInfoV9, bundleName:%{public}s, flags:%{public}d, userId:%{public}d",
240         bundleName.c_str(), flags, userId);
241     if (!BundlePermissionMgr::IsSystemApp()) {
242         LOG_E(BMS_TAG_QUERY, "non-system app calling system api");
243         return ERR_BUNDLE_MANAGER_SYSTEM_API_DENIED;
244     }
245     if (!BundlePermissionMgr::VerifyCallingPermissionsForAll({Constants::PERMISSION_GET_BUNDLE_INFO_PRIVILEGED,
246         Constants::PERMISSION_GET_BUNDLE_INFO}) &&
247         !BundlePermissionMgr::IsBundleSelfCalling(bundleName)) {
248         LOG_E(BMS_TAG_QUERY, "verify permission failed");
249         return ERR_BUNDLE_MANAGER_PERMISSION_DENIED;
250     }
251     LOG_D(BMS_TAG_QUERY, "verify permission success, begin to GetBundleInfoV9");
252     auto dataMgr = GetDataMgrFromService();
253     if (dataMgr == nullptr) {
254         LOG_E(BMS_TAG_QUERY, "DataMgr is nullptr");
255         return ERR_BUNDLE_MANAGER_INTERNAL_ERROR;
256     }
257     auto res = dataMgr->GetBundleInfoV9(bundleName, flags, bundleInfo, userId);
258     if (res != ERR_OK) {
259         if (isBrokerServiceExisted_) {
260             auto bmsExtensionClient = std::make_shared<BmsExtensionClient>();
261             if (bmsExtensionClient->GetBundleInfo(bundleName, flags, bundleInfo, userId, true) == ERR_OK) {
262                 return ERR_OK;
263             }
264         }
265     }
266     return res;
267 }
268 
BatchGetBundleInfo(const std::vector<std::string> &bundleNames, int32_t flags, std::vector<BundleInfo> &bundleInfos, int32_t userId)269 ErrCode BundleMgrHostImpl::BatchGetBundleInfo(const std::vector<std::string> &bundleNames, int32_t flags,
270     std::vector<BundleInfo> &bundleInfos, int32_t userId)
271 {
272     APP_LOGI("start BatchGetBundleInfo, bundleName : %{public}s, flags : %{public}d, userId : %{public}d",
273         BundleUtil::ToString(bundleNames).c_str(), flags, userId);
274     int32_t timerId = XCollieHelper::SetRecoveryTimer(FUNCATION_BATCH_BUNDLE_INFO);
275     ScopeGuard cancelTimerIdGuard([timerId] { XCollieHelper::CancelTimer(timerId); });
276     if (!BundlePermissionMgr::VerifyCallingPermissionsForAll({Constants::PERMISSION_GET_BUNDLE_INFO_PRIVILEGED})) {
277         APP_LOGE("verify permission failed");
278         return ERR_BUNDLE_MANAGER_PERMISSION_DENIED;
279     }
280     APP_LOGD("verify permission success, begin to BatchGetBundleInfo");
281     auto dataMgr = GetDataMgrFromService();
282     if (dataMgr == nullptr) {
283         APP_LOGE("DataMgr is nullptr");
284         return ERR_BUNDLE_MANAGER_INTERNAL_ERROR;
285     }
286     dataMgr->BatchGetBundleInfo(bundleNames, flags, bundleInfos, userId);
287     if (bundleInfos.size() == bundleNames.size()) {
288         return ERR_OK;
289     }
290     if (isBrokerServiceExisted_) {
291         auto bmsExtensionClient = std::make_shared<BmsExtensionClient>();
292         bmsExtensionClient->BatchGetBundleInfo(bundleNames, flags, bundleInfos, userId, true);
293     }
294     return bundleInfos.empty() ? ERR_BUNDLE_MANAGER_BUNDLE_NOT_EXIST : ERR_OK;
295 }
296 
GetBundleInfoForSelf(int32_t flags, BundleInfo &bundleInfo)297 ErrCode BundleMgrHostImpl::GetBundleInfoForSelf(int32_t flags, BundleInfo &bundleInfo)
298 {
299     HITRACE_METER_NAME(HITRACE_TAG_APP, __PRETTY_FUNCTION__);
300     auto uid = IPCSkeleton::GetCallingUid();
301     int32_t userId = uid / Constants::BASE_USER_RANGE;
302     std::string bundleName;
303     auto dataMgr = GetDataMgrFromService();
304     if (dataMgr == nullptr) {
305         LOG_E(BMS_TAG_QUERY, "DataMgr is nullptr");
306         return ERR_BUNDLE_MANAGER_INTERNAL_ERROR;
307     }
308     int32_t appIndex = 0;
309     auto ret = dataMgr->GetBundleNameAndIndexForUid(uid, bundleName, appIndex);
310     if (ret != ERR_OK) {
311         LOG_NOFUNC_E(BMS_TAG_QUERY, "GetBundleNameForUid failed uid:%{public}d", uid);
312         return ERR_BUNDLE_MANAGER_BUNDLE_NOT_EXIST;
313     }
314     return dataMgr->GetBundleInfoV9(bundleName, flags, bundleInfo, userId, appIndex);
315 }
316 
GetDependentBundleInfo(const std::string &sharedBundleName, BundleInfo &sharedBundleInfo, GetDependentBundleInfoFlag flag)317 ErrCode BundleMgrHostImpl::GetDependentBundleInfo(const std::string &sharedBundleName,
318     BundleInfo &sharedBundleInfo, GetDependentBundleInfoFlag flag)
319 {
320     auto dataMgr = GetDataMgrFromService();
321     if (dataMgr == nullptr) {
322         APP_LOGE("DataMgr is nullptr");
323         return ERR_BUNDLE_MANAGER_INTERNAL_ERROR;
324     }
325 
326     int32_t bundleInfoFlags = static_cast<uint32_t>(GetBundleInfoFlag::GET_BUNDLE_INFO_WITH_HAP_MODULE) |
327         static_cast<uint32_t>(GetBundleInfoFlag::GET_BUNDLE_INFO_WITH_APPLICATION);
328     switch (flag) {
329         case GetDependentBundleInfoFlag::GET_APP_CROSS_HSP_BUNDLE_INFO: {
330             if (!VerifyDependency(sharedBundleName)) {
331                 APP_LOGE("failed");
332                 return ERR_BUNDLE_MANAGER_PERMISSION_DENIED;
333             }
334             return dataMgr->GetSharedBundleInfo(sharedBundleName, bundleInfoFlags, sharedBundleInfo);
335         }
336         case GetDependentBundleInfoFlag::GET_APP_SERVICE_HSP_BUNDLE_INFO: {
337             // no need to check permission for app service hsp
338             return dataMgr->GetAppServiceHspBundleInfo(sharedBundleName, sharedBundleInfo);
339         }
340         case GetDependentBundleInfoFlag::GET_ALL_DEPENDENT_BUNDLE_INFO: {
341             if (dataMgr->GetAppServiceHspBundleInfo(sharedBundleName, sharedBundleInfo) == ERR_OK) {
342                 return ERR_OK;
343             }
344             if (!VerifyDependency(sharedBundleName)) {
345                 APP_LOGE("failed");
346                 return ERR_BUNDLE_MANAGER_PERMISSION_DENIED;
347             }
348             return dataMgr->GetSharedBundleInfo(sharedBundleName, bundleInfoFlags, sharedBundleInfo);
349         }
350         default:
351             return ERR_BUNDLE_MANAGER_PARAM_ERROR;
352     }
353 }
354 
GetBundlePackInfo( const std::string &bundleName, const BundlePackFlag flag, BundlePackInfo &bundlePackInfo, int32_t userId)355 ErrCode BundleMgrHostImpl::GetBundlePackInfo(
356     const std::string &bundleName, const BundlePackFlag flag, BundlePackInfo &bundlePackInfo, int32_t userId)
357 {
358     return GetBundlePackInfo(bundleName, static_cast<int32_t>(flag), bundlePackInfo, userId);
359 }
360 
GetBundlePackInfo( const std::string &bundleName, int32_t flags, BundlePackInfo &bundlePackInfo, int32_t userId)361 ErrCode BundleMgrHostImpl::GetBundlePackInfo(
362     const std::string &bundleName, int32_t flags, BundlePackInfo &bundlePackInfo, int32_t userId)
363 {
364     // check permission
365     if (!BundlePermissionMgr::IsSystemApp()) {
366         APP_LOGE("non-system app calling system api");
367         return ERR_BUNDLE_MANAGER_SYSTEM_API_DENIED;
368     }
369     if (!BundlePermissionMgr::VerifyCallingPermissionForAll(Constants::PERMISSION_GET_BUNDLE_INFO_PRIVILEGED)) {
370         APP_LOGE("GetBundlePackInfo failed due to lack of permission");
371         return ERR_BUNDLE_MANAGER_PERMISSION_DENIED;
372     }
373     auto dataMgr = GetDataMgrFromService();
374     if (dataMgr == nullptr) {
375         APP_LOGE("DataMgr is nullptr");
376         return ERR_APPEXECFWK_SERVICE_INTERNAL_ERROR;
377     }
378     return dataMgr->GetBundlePackInfo(bundleName, flags, bundlePackInfo, userId);
379 }
380 
GetBundleUserInfo( const std::string &bundleName, int32_t userId, InnerBundleUserInfo &innerBundleUserInfo)381 bool BundleMgrHostImpl::GetBundleUserInfo(
382     const std::string &bundleName, int32_t userId, InnerBundleUserInfo &innerBundleUserInfo)
383 {
384     auto dataMgr = GetDataMgrFromService();
385     if (dataMgr == nullptr) {
386         APP_LOGE("DataMgr is nullptr");
387         return false;
388     }
389     return dataMgr->GetInnerBundleUserInfoByUserId(bundleName, userId, innerBundleUserInfo);
390 }
391 
GetBundleUserInfos( const std::string &bundleName, std::vector<InnerBundleUserInfo> &innerBundleUserInfos)392 bool BundleMgrHostImpl::GetBundleUserInfos(
393     const std::string &bundleName, std::vector<InnerBundleUserInfo> &innerBundleUserInfos)
394 {
395     auto dataMgr = GetDataMgrFromService();
396     if (dataMgr == nullptr) {
397         APP_LOGE("DataMgr is nullptr");
398         return false;
399     }
400     return dataMgr->GetInnerBundleUserInfos(bundleName, innerBundleUserInfos);
401 }
402 
GetBundleInfos(const BundleFlag flag, std::vector<BundleInfo> &bundleInfos, int32_t userId)403 bool BundleMgrHostImpl::GetBundleInfos(const BundleFlag flag, std::vector<BundleInfo> &bundleInfos, int32_t userId)
404 {
405     return GetBundleInfos(static_cast<int32_t>(flag), bundleInfos, userId);
406 }
407 
GetBundleInfos(int32_t flags, std::vector<BundleInfo> &bundleInfos, int32_t userId)408 bool BundleMgrHostImpl::GetBundleInfos(int32_t flags, std::vector<BundleInfo> &bundleInfos, int32_t userId)
409 {
410     LOG_I(BMS_TAG_QUERY, "-f: %{public}d, -u: %{public}d uid:%{public}d", flags,
411         userId, IPCSkeleton::GetCallingUid());
412     // API9 need to be system app
413     if (!BundlePermissionMgr::IsSystemApp() &&
414         !BundlePermissionMgr::VerifyCallingBundleSdkVersion(ServiceConstants::API_VERSION_NINE)) {
415         LOG_D(BMS_TAG_QUERY, "non-system app calling system api");
416         return true;
417     }
418     if (!BundlePermissionMgr::VerifyCallingPermissionForAll(Constants::PERMISSION_GET_BUNDLE_INFO_PRIVILEGED)) {
419         LOG_E(BMS_TAG_QUERY, "verify permission failed");
420         return false;
421     }
422     LOG_D(BMS_TAG_QUERY, "verify permission success, begin to GetBundleInfos");
423     if (!BundlePermissionMgr::IsNativeTokenType() &&
424         (BundlePermissionMgr::GetHapApiVersion() >= ServiceConstants::API_VERSION_NINE)) {
425         LOG_D(BMS_TAG_QUERY,
426             "GetBundleInfos return empty, not support target level greater than or equal to api9");
427         return true;
428     }
429     auto dataMgr = GetDataMgrFromService();
430     if (dataMgr == nullptr) {
431         LOG_E(BMS_TAG_QUERY, "DataMgr is nullptr");
432         return false;
433     }
434     dataMgr->GetBundleInfos(flags, bundleInfos, userId);
435     if (isBrokerServiceExisted_) {
436         auto bmsExtensionClient = std::make_shared<BmsExtensionClient>();
437         bmsExtensionClient->GetBundleInfos(flags, bundleInfos, userId);
438     }
439     return !bundleInfos.empty();
440 }
441 
GetBundleInfosV9(int32_t flags, std::vector<BundleInfo> &bundleInfos, int32_t userId)442 ErrCode BundleMgrHostImpl::GetBundleInfosV9(int32_t flags, std::vector<BundleInfo> &bundleInfos, int32_t userId)
443 {
444     LOG_I(BMS_TAG_QUERY, "-f: %{public}d, -u: %{public}d uid:%{public}d", flags,
445         userId, IPCSkeleton::GetCallingUid());
446     if (!BundlePermissionMgr::IsSystemApp()) {
447         LOG_E(BMS_TAG_QUERY, "non-system app calling system api");
448         return ERR_BUNDLE_MANAGER_SYSTEM_API_DENIED;
449     }
450     if (!BundlePermissionMgr::VerifyCallingPermissionForAll(Constants::PERMISSION_GET_INSTALLED_BUNDLE_LIST)) {
451         LOG_E(BMS_TAG_QUERY, "verify permission failed");
452         return ERR_BUNDLE_MANAGER_PERMISSION_DENIED;
453     }
454     LOG_D(BMS_TAG_QUERY, "verify permission success, begin to GetBundleInfosV9");
455     auto dataMgr = GetDataMgrFromService();
456     if (dataMgr == nullptr) {
457         LOG_E(BMS_TAG_QUERY, "DataMgr is nullptr");
458         BundlePermissionMgr::AddPermissionUsedRecord(Constants::PERMISSION_GET_INSTALLED_BUNDLE_LIST, 0, 1);
459         return ERR_BUNDLE_MANAGER_INTERNAL_ERROR;
460     }
461     auto res = dataMgr->GetBundleInfosV9(flags, bundleInfos, userId);
462     // menu profile is currently not supported in BrokerService
463     bool getMenu = ((static_cast<uint32_t>(flags) & BundleFlag::GET_BUNDLE_WITH_MENU)
464         == BundleFlag::GET_BUNDLE_WITH_MENU);
465     if (isBrokerServiceExisted_ && !getMenu) {
466         auto bmsExtensionClient = std::make_shared<BmsExtensionClient>();
467         if (bmsExtensionClient->GetBundleInfos(flags, bundleInfos, userId, true) == ERR_OK) {
468             LOG_D(BMS_TAG_QUERY, "query bundle infos from bms extension successfully");
469             BundlePermissionMgr::AddPermissionUsedRecord(Constants::PERMISSION_GET_INSTALLED_BUNDLE_LIST, 1, 0);
470             return ERR_OK;
471         }
472     }
473     if (res == ERR_OK) {
474         BundlePermissionMgr::AddPermissionUsedRecord(Constants::PERMISSION_GET_INSTALLED_BUNDLE_LIST, 1, 0);
475     } else {
476         BundlePermissionMgr::AddPermissionUsedRecord(Constants::PERMISSION_GET_INSTALLED_BUNDLE_LIST, 0, 1);
477     }
478     return res;
479 }
480 
GetBundleNameForUid(const int uid, std::string &bundleName)481 bool BundleMgrHostImpl::GetBundleNameForUid(const int uid, std::string &bundleName)
482 {
483     APP_LOGD("start GetBundleNameForUid, uid : %{public}d", uid);
484     if (!BundlePermissionMgr::IsSystemApp() &&
485         !BundlePermissionMgr::VerifyCallingBundleSdkVersion(ServiceConstants::API_VERSION_NINE)) {
486         APP_LOGE("non-system app calling system api");
487         return false;
488     }
489     if (!BundlePermissionMgr::VerifyCallingPermissionsForAll({Constants::PERMISSION_GET_BUNDLE_INFO_PRIVILEGED,
490         Constants::PERMISSION_GET_BUNDLE_INFO})) {
491         APP_LOGE("verify query permission failed");
492         return false;
493     }
494     auto dataMgr = GetDataMgrFromService();
495     if (dataMgr == nullptr) {
496         APP_LOGE("DataMgr is nullptr");
497         return false;
498     }
499     return dataMgr->GetBundleNameForUid(uid, bundleName);
500 }
501 
GetBundlesForUid(const int uid, std::vector<std::string> &bundleNames)502 bool BundleMgrHostImpl::GetBundlesForUid(const int uid, std::vector<std::string> &bundleNames)
503 {
504     APP_LOGD("start GetBundlesForUid, uid : %{public}d", uid);
505     if (!BundlePermissionMgr::IsSystemApp()) {
506         APP_LOGE("non-system app calling system api");
507         return false;
508     }
509     if (!BundlePermissionMgr::VerifyCallingPermissionsForAll({Constants::PERMISSION_GET_BUNDLE_INFO_PRIVILEGED,
510         Constants::PERMISSION_GET_BUNDLE_INFO})) {
511         APP_LOGE("verify permission failed");
512         return false;
513     }
514     auto dataMgr = GetDataMgrFromService();
515     if (dataMgr == nullptr) {
516         APP_LOGE("DataMgr is nullptr");
517         return false;
518     }
519     return dataMgr->GetBundlesForUid(uid, bundleNames);
520 }
521 
GetNameForUid(const int uid, std::string &name)522 ErrCode BundleMgrHostImpl::GetNameForUid(const int uid, std::string &name)
523 {
524     HITRACE_METER_NAME(HITRACE_TAG_APP, __PRETTY_FUNCTION__);
525     APP_LOGD("start GetNameForUid, uid : %{public}d", uid);
526     int32_t timerId = XCollieHelper::SetRecoveryTimer(FUNCATION_GET_NAME_FOR_UID);
527     ScopeGuard cancelTimerIdGuard([timerId] { XCollieHelper::CancelTimer(timerId); });
528     if (!BundlePermissionMgr::IsSystemApp() &&
529         !BundlePermissionMgr::VerifyCallingBundleSdkVersion(ServiceConstants::API_VERSION_NINE)) {
530         APP_LOGE("non-system app calling system api");
531         return ERR_BUNDLE_MANAGER_SYSTEM_API_DENIED;
532     }
533     if (!BundlePermissionMgr::VerifyCallingPermissionsForAll({Constants::PERMISSION_GET_BUNDLE_INFO_PRIVILEGED,
534         Constants::PERMISSION_GET_BUNDLE_INFO})) {
535         APP_LOGE("verify query permission failed");
536         return ERR_BUNDLE_MANAGER_PERMISSION_DENIED;
537     }
538     auto dataMgr = GetDataMgrFromService();
539     if (dataMgr == nullptr) {
540         APP_LOGE("DataMgr is nullptr");
541         return ERR_BUNDLE_MANAGER_INTERNAL_ERROR;
542     }
543     auto ret = dataMgr->GetNameForUid(uid, name);
544     if (ret != ERR_OK && isBrokerServiceExisted_) {
545         auto bmsExtensionClient = std::make_shared<BmsExtensionClient>();
546         ret = bmsExtensionClient->GetBundleNameByUid(uid, name);
547         if (ret != ERR_OK) {
548             return ERR_BUNDLE_MANAGER_INVALID_UID;
549         }
550     }
551     return ret;
552 }
553 
GetNameAndIndexForUid(const int uid, std::string &bundleName, int32_t &appIndex)554 ErrCode BundleMgrHostImpl::GetNameAndIndexForUid(const int uid, std::string &bundleName, int32_t &appIndex)
555 {
556     HITRACE_METER_NAME(HITRACE_TAG_APP, __PRETTY_FUNCTION__);
557     APP_LOGD("start GetNameAndIndexForUid, uid : %{public}d", uid);
558     if (!BundlePermissionMgr::IsSystemApp()) {
559         APP_LOGE("non-system app calling system api");
560         return ERR_BUNDLE_MANAGER_SYSTEM_API_DENIED;
561     }
562     if (!BundlePermissionMgr::VerifyCallingPermissionsForAll({Constants::PERMISSION_GET_BUNDLE_INFO_PRIVILEGED,
563         Constants::PERMISSION_GET_BUNDLE_INFO})) {
564         APP_LOGE("verify query permission failed");
565         return ERR_BUNDLE_MANAGER_PERMISSION_DENIED;
566     }
567     auto dataMgr = GetDataMgrFromService();
568     if (dataMgr == nullptr) {
569         APP_LOGE("DataMgr is nullptr");
570         return ERR_BUNDLE_MANAGER_INTERNAL_ERROR;
571     }
572     return dataMgr->GetBundleNameAndIndexForUid(uid, bundleName, appIndex);
573 }
574 
GetBundleGids(const std::string &bundleName, std::vector<int> &gids)575 bool BundleMgrHostImpl::GetBundleGids(const std::string &bundleName, std::vector<int> &gids)
576 {
577     APP_LOGD("start GetBundleGids, bundleName : %{public}s", bundleName.c_str());
578     if (!BundlePermissionMgr::VerifyCallingPermissionForAll(Constants::PERMISSION_GET_BUNDLE_INFO_PRIVILEGED) &&
579         !BundlePermissionMgr::IsBundleSelfCalling(bundleName)) {
580         APP_LOGE("verify token type failed");
581         return false;
582     }
583     auto dataMgr = GetDataMgrFromService();
584     if (dataMgr == nullptr) {
585         APP_LOGE("DataMgr is nullptr");
586         return false;
587     }
588     return dataMgr->GetBundleGids(bundleName, gids);
589 }
590 
GetBundleGidsByUid(const std::string &bundleName, const int &uid, std::vector<int> &gids)591 bool BundleMgrHostImpl::GetBundleGidsByUid(const std::string &bundleName, const int &uid, std::vector<int> &gids)
592 {
593     APP_LOGD("start GetBundleGidsByUid, bundleName : %{public}s, uid : %{public}d", bundleName.c_str(), uid);
594     if (!BundlePermissionMgr::VerifyCallingPermissionForAll(Constants::PERMISSION_GET_BUNDLE_INFO_PRIVILEGED) &&
595         !BundlePermissionMgr::IsBundleSelfCalling(bundleName)) {
596         APP_LOGE("verify token type failed");
597         return false;
598     }
599     auto dataMgr = GetDataMgrFromService();
600     if (dataMgr == nullptr) {
601         APP_LOGE("DataMgr is nullptr");
602         return false;
603     }
604     return dataMgr->GetBundleGidsByUid(bundleName, uid, gids);
605 }
606 
CheckIsSystemAppByUid(const int uid)607 bool BundleMgrHostImpl::CheckIsSystemAppByUid(const int uid)
608 {
609     APP_LOGD("start CheckIsSystemAppByUid, uid : %{public}d", uid);
610     if (!BundlePermissionMgr::IsSystemApp()) {
611         APP_LOGE("non-system app calling system api");
612         return false;
613     }
614     if (!BundlePermissionMgr::VerifyCallingPermissionForAll(Constants::PERMISSION_GET_BUNDLE_INFO_PRIVILEGED)) {
615         APP_LOGE("verify permission failed");
616         return false;
617     }
618     auto dataMgr = GetDataMgrFromService();
619     if (dataMgr == nullptr) {
620         APP_LOGE("DataMgr is nullptr");
621         return false;
622     }
623     return dataMgr->CheckIsSystemAppByUid(uid);
624 }
625 
GetBundleInfosByMetaData(const std::string &metaData, std::vector<BundleInfo> &bundleInfos)626 bool BundleMgrHostImpl::GetBundleInfosByMetaData(const std::string &metaData, std::vector<BundleInfo> &bundleInfos)
627 {
628     APP_LOGD("start GetBundleInfosByMetaData, metaData : %{public}s", metaData.c_str());
629     if (!BundlePermissionMgr::VerifyCallingPermissionForAll(Constants::PERMISSION_GET_BUNDLE_INFO_PRIVILEGED)) {
630         APP_LOGE("verify permission failed");
631         return false;
632     }
633     auto dataMgr = GetDataMgrFromService();
634     if (dataMgr == nullptr) {
635         APP_LOGE("DataMgr is nullptr");
636         return false;
637     }
638     return dataMgr->GetBundleInfosByMetaData(metaData, bundleInfos);
639 }
640 
QueryAbilityInfo(const Want &want, AbilityInfo &abilityInfo)641 bool BundleMgrHostImpl::QueryAbilityInfo(const Want &want, AbilityInfo &abilityInfo)
642 {
643     return QueryAbilityInfo(want, GET_ABILITY_INFO_WITH_APPLICATION, Constants::UNSPECIFIED_USERID, abilityInfo);
644 }
645 
646 #ifdef BUNDLE_FRAMEWORK_FREE_INSTALL
QueryAbilityInfo(const Want &want, int32_t flags, int32_t userId, AbilityInfo &abilityInfo, const sptr<IRemoteObject> &callBack)647 bool BundleMgrHostImpl::QueryAbilityInfo(const Want &want, int32_t flags, int32_t userId,
648     AbilityInfo &abilityInfo, const sptr<IRemoteObject> &callBack)
649 {
650     if (!BundlePermissionMgr::IsSystemApp()) {
651         LOG_E(BMS_TAG_QUERY, "check is system app failed");
652         return false;
653     }
654     if (!BundlePermissionMgr::VerifyCallingPermissionsForAll({Constants::PERMISSION_GET_BUNDLE_INFO_PRIVILEGED,
655         Constants::PERMISSION_GET_BUNDLE_INFO})) {
656         LOG_E(BMS_TAG_QUERY, "verify permission failed");
657         return false;
658     }
659     auto connectAbilityMgr = GetConnectAbilityMgrFromService();
660     if (connectAbilityMgr == nullptr) {
661         LOG_E(BMS_TAG_QUERY, "connectAbilityMgr is nullptr");
662         return false;
663     }
664     return connectAbilityMgr->QueryAbilityInfo(want, flags, userId, abilityInfo, callBack);
665 }
666 
SilentInstall(const Want &want, int32_t userId, const sptr<IRemoteObject> &callBack)667 bool BundleMgrHostImpl::SilentInstall(const Want &want, int32_t userId, const sptr<IRemoteObject> &callBack)
668 {
669     APP_LOGD("SilentInstall in");
670     auto connectMgr = GetConnectAbilityMgrFromService();
671     if (connectMgr == nullptr) {
672         APP_LOGE("connectMgr is nullptr");
673         return false;
674     }
675     return connectMgr->SilentInstall(want, userId, callBack);
676 }
677 
UpgradeAtomicService(const Want &want, int32_t userId)678 void BundleMgrHostImpl::UpgradeAtomicService(const Want &want, int32_t userId)
679 {
680     if (!BundlePermissionMgr::IsSystemApp()) {
681         APP_LOGE("check is system app failed");
682         return;
683     }
684 
685     if (!BundlePermissionMgr::VerifyCallingPermissionForAll(Constants::PERMISSION_GET_BUNDLE_INFO_PRIVILEGED)) {
686         APP_LOGE("verify permission failed");
687         return;
688     }
689     auto connectAbilityMgr = GetConnectAbilityMgrFromService();
690     if (connectAbilityMgr == nullptr) {
691         APP_LOGE("connectAbilityMgr is nullptr");
692         return;
693     }
694     connectAbilityMgr->UpgradeAtomicService(want, userId);
695 }
696 
CheckAbilityEnableInstall( const Want &want, int32_t missionId, int32_t userId, const sptr<IRemoteObject> &callback)697 bool BundleMgrHostImpl::CheckAbilityEnableInstall(
698     const Want &want, int32_t missionId, int32_t userId, const sptr<IRemoteObject> &callback)
699 {
700     if (!BundlePermissionMgr::IsSystemApp()) {
701         APP_LOGE("check is system app failed");
702         return false;
703     }
704 
705     if (!BundlePermissionMgr::VerifyCallingPermissionForAll(Constants::PERMISSION_GET_BUNDLE_INFO_PRIVILEGED)) {
706         APP_LOGE("verify permission failed");
707         return false;
708     }
709     auto elementName = want.GetElement();
710     if (elementName.GetDeviceID().empty() || elementName.GetBundleName().empty() ||
711         elementName.GetAbilityName().empty()) {
712         APP_LOGE("check ability install parameter is invalid");
713         return false;
714     }
715     auto bundleDistributedManager = DelayedSingleton<BundleMgrService>::GetInstance()->GetBundleDistributedManager();
716     if (bundleDistributedManager == nullptr) {
717         APP_LOGE("bundleDistributedManager failed");
718         return false;
719     }
720     return bundleDistributedManager->CheckAbilityEnableInstall(want, missionId, userId, callback);
721 }
722 
ProcessPreload(const Want &want)723 bool BundleMgrHostImpl::ProcessPreload(const Want &want)
724 {
725     if (!BundlePermissionMgr::VerifyPreload(want)) {
726         APP_LOGE("ProcessPreload verify failed");
727         return false;
728     }
729     APP_LOGD("begin to process preload");
730     auto connectAbilityMgr = GetConnectAbilityMgrFromService();
731     if (connectAbilityMgr == nullptr) {
732         APP_LOGE("connectAbilityMgr is nullptr");
733         return false;
734     }
735     return connectAbilityMgr->ProcessPreload(want);
736 }
737 #endif
738 
QueryAbilityInfo(const Want &want, int32_t flags, int32_t userId, AbilityInfo &abilityInfo)739 bool BundleMgrHostImpl::QueryAbilityInfo(const Want &want, int32_t flags, int32_t userId, AbilityInfo &abilityInfo)
740 {
741     LOG_D(BMS_TAG_QUERY, "start QueryAbilityInfo, flags : %{public}d, userId : %{public}d", flags, userId);
742     if (!BundlePermissionMgr::IsSystemApp() &&
743         !BundlePermissionMgr::VerifyCallingBundleSdkVersion(ServiceConstants::API_VERSION_NINE)) {
744         LOG_D(BMS_TAG_QUERY, "non-system app calling system api");
745         return true;
746     }
747     if (!BundlePermissionMgr::VerifyCallingPermissionsForAll({Constants::PERMISSION_GET_BUNDLE_INFO_PRIVILEGED,
748         Constants::PERMISSION_GET_BUNDLE_INFO}) &&
749         !BundlePermissionMgr::IsBundleSelfCalling(want.GetElement().GetBundleName())) {
750         LOG_E(BMS_TAG_QUERY, "verify permission failed");
751         return false;
752     }
753     APP_LOGD("verify permission success, begin to QueryAbilityInfo");
754     auto dataMgr = GetDataMgrFromService();
755     if (dataMgr == nullptr) {
756         LOG_E(BMS_TAG_QUERY, "DataMgr is nullptr");
757         return false;
758     }
759     bool res = dataMgr->QueryAbilityInfo(want, flags, userId, abilityInfo);
760     if (!res) {
761         if (!IsAppLinking(flags) && isBrokerServiceExisted_) {
762             auto bmsExtensionClient = std::make_shared<BmsExtensionClient>();
763             return (bmsExtensionClient->QueryAbilityInfo(want, flags, userId, abilityInfo) == ERR_OK);
764         }
765     }
766     return res;
767 }
768 
QueryAbilityInfos(const Want &want, std::vector<AbilityInfo> &abilityInfos)769 bool BundleMgrHostImpl::QueryAbilityInfos(const Want &want, std::vector<AbilityInfo> &abilityInfos)
770 {
771     return QueryAbilityInfos(
772         want, GET_ABILITY_INFO_WITH_APPLICATION, Constants::UNSPECIFIED_USERID, abilityInfos);
773 }
774 
QueryAbilityInfos( const Want &want, int32_t flags, int32_t userId, std::vector<AbilityInfo> &abilityInfos)775 bool BundleMgrHostImpl::QueryAbilityInfos(
776     const Want &want, int32_t flags, int32_t userId, std::vector<AbilityInfo> &abilityInfos)
777 {
778     HITRACE_METER_NAME(HITRACE_TAG_APP, __PRETTY_FUNCTION__);
779     LOG_D(BMS_TAG_QUERY, "start QueryAbilityInfos, flags : %{public}d, userId : %{public}d", flags, userId);
780     if (!BundlePermissionMgr::IsSystemApp() &&
781         !BundlePermissionMgr::VerifyCallingBundleSdkVersion(ServiceConstants::API_VERSION_NINE)) {
782         LOG_D(BMS_TAG_QUERY, "non-system app calling system api");
783         return true;
784     }
785     if (!BundlePermissionMgr::VerifyCallingPermissionsForAll({Constants::PERMISSION_GET_BUNDLE_INFO_PRIVILEGED,
786         Constants::PERMISSION_GET_BUNDLE_INFO}) &&
787         !BundlePermissionMgr::IsBundleSelfCalling(want.GetElement().GetBundleName())) {
788         LOG_E(BMS_TAG_QUERY, "verify permission failed");
789         return false;
790     }
791     auto dataMgr = GetDataMgrFromService();
792     if (dataMgr == nullptr) {
793         LOG_E(BMS_TAG_QUERY, "DataMgr is nullptr");
794         return false;
795     }
796     dataMgr->QueryAbilityInfos(want, flags, userId, abilityInfos);
797     if (!IsAppLinking(flags) && isBrokerServiceExisted_) {
798         auto bmsExtensionClient = std::make_shared<BmsExtensionClient>();
799         bmsExtensionClient->QueryAbilityInfos(want, flags, userId, abilityInfos);
800     }
801     return !abilityInfos.empty();
802 }
803 
QueryAbilityInfosV9( const Want &want, int32_t flags, int32_t userId, std::vector<AbilityInfo> &abilityInfos)804 ErrCode BundleMgrHostImpl::QueryAbilityInfosV9(
805     const Want &want, int32_t flags, int32_t userId, std::vector<AbilityInfo> &abilityInfos)
806 {
807     HITRACE_METER_NAME(HITRACE_TAG_APP, __PRETTY_FUNCTION__);
808     LOG_D(BMS_TAG_QUERY, "start QueryAbilityInfosV9, flags : %{public}d, userId : %{public}d", flags, userId);
809     if (!BundlePermissionMgr::IsSystemApp()) {
810         LOG_E(BMS_TAG_QUERY, "non-system app calling system api");
811         return ERR_BUNDLE_MANAGER_SYSTEM_API_DENIED;
812     }
813     if (!BundlePermissionMgr::VerifyCallingPermissionsForAll({Constants::PERMISSION_GET_BUNDLE_INFO_PRIVILEGED,
814         Constants::PERMISSION_GET_BUNDLE_INFO}) &&
815         !BundlePermissionMgr::IsBundleSelfCalling(want.GetElement().GetBundleName())) {
816         LOG_E(BMS_TAG_QUERY, "verify permission failed");
817         return ERR_BUNDLE_MANAGER_PERMISSION_DENIED;
818     }
819     auto dataMgr = GetDataMgrFromService();
820     if (dataMgr == nullptr) {
821         LOG_E(BMS_TAG_QUERY, "DataMgr is nullptr");
822         return ERR_BUNDLE_MANAGER_INTERNAL_ERROR;
823     }
824     auto res = dataMgr->QueryAbilityInfosV9(want, flags, userId, abilityInfos);
825     auto bmsExtensionClient = std::make_shared<BmsExtensionClient>();
826     if (!IsAppLinking(flags) && isBrokerServiceExisted_ &&
827         bmsExtensionClient->QueryAbilityInfos(want, flags, userId, abilityInfos, true) == ERR_OK) {
828         LOG_D(BMS_TAG_QUERY, "query ability infos from bms extension successfully");
829         return ERR_OK;
830     }
831     return res;
832 }
833 
BatchQueryAbilityInfos( const std::vector<Want> &wants, int32_t flags, int32_t userId, std::vector<AbilityInfo> &abilityInfos)834 ErrCode BundleMgrHostImpl::BatchQueryAbilityInfos(
835     const std::vector<Want> &wants, int32_t flags, int32_t userId, std::vector<AbilityInfo> &abilityInfos)
836 {
837     APP_LOGD("start BatchQueryAbilityInfos, flags : %{public}d, userId : %{public}d", flags, userId);
838     if (!BundlePermissionMgr::IsSystemApp()) {
839         APP_LOGE("non-system app calling system api");
840         return ERR_BUNDLE_MANAGER_SYSTEM_API_DENIED;
841     }
842     bool callingPermission = BundlePermissionMgr::VerifyCallingPermissionsForAll(
843         { Constants::PERMISSION_GET_BUNDLE_INFO_PRIVILEGED, Constants::PERMISSION_GET_BUNDLE_INFO });
844     for (size_t i = 0; i < wants.size(); i++) {
845         if (!callingPermission && !BundlePermissionMgr::IsBundleSelfCalling(wants[i].GetElement().GetBundleName())) {
846             APP_LOGE("verify is bundle self calling failed");
847             return ERR_BUNDLE_MANAGER_PERMISSION_DENIED;
848         }
849     }
850     APP_LOGD("verify permission success, begin to BatchQueryAbilityInfos");
851     auto dataMgr = GetDataMgrFromService();
852     if (dataMgr == nullptr) {
853         APP_LOGE("DataMgr is nullptr");
854         return ERR_BUNDLE_MANAGER_INTERNAL_ERROR;
855     }
856     auto res = dataMgr->BatchQueryAbilityInfos(wants, flags, userId, abilityInfos);
857     auto bmsExtensionClient = std::make_shared<BmsExtensionClient>();
858     if (!IsAppLinking(flags) && isBrokerServiceExisted_ &&
859         bmsExtensionClient->BatchQueryAbilityInfos(wants, flags, userId, abilityInfos, true) == ERR_OK) {
860         APP_LOGD("query ability infos from bms extension successfully");
861         return ERR_OK;
862     }
863     return res;
864 }
865 
QueryLauncherAbilityInfos( const Want &want, int32_t userId, std::vector<AbilityInfo> &abilityInfos)866 ErrCode BundleMgrHostImpl::QueryLauncherAbilityInfos(
867     const Want &want, int32_t userId, std::vector<AbilityInfo> &abilityInfos)
868 {
869     HITRACE_METER_NAME(HITRACE_TAG_APP, __PRETTY_FUNCTION__);
870     LOG_D(BMS_TAG_QUERY, "start QueryLauncherAbilityInfos, userId : %{public}d", userId);
871     if (!BundlePermissionMgr::IsSystemApp()) {
872         LOG_E(BMS_TAG_QUERY, "non-system app calling system api");
873         return ERR_BUNDLE_MANAGER_SYSTEM_API_DENIED;
874     }
875     if (!BundlePermissionMgr::VerifyCallingPermissionForAll(Constants::PERMISSION_GET_BUNDLE_INFO_PRIVILEGED)) {
876         LOG_E(BMS_TAG_QUERY, "verify permission failed");
877         return ERR_BUNDLE_MANAGER_PERMISSION_DENIED;
878     }
879     APP_LOGD("verify permission success, begin to QueryLauncherAbilityInfos");
880     auto dataMgr = GetDataMgrFromService();
881     if (dataMgr == nullptr) {
882         LOG_E(BMS_TAG_QUERY, "DataMgr is nullptr");
883         return ERR_BUNDLE_MANAGER_INTERNAL_ERROR;
884     }
885 
886     auto ret = dataMgr->QueryLauncherAbilityInfos(want, userId, abilityInfos);
887     auto bmsExtensionClient = std::make_shared<BmsExtensionClient>();
888     if (bmsExtensionClient->QueryLauncherAbility(want, userId, abilityInfos) == ERR_OK) {
889         LOG_D(BMS_TAG_QUERY, "query launcher ability infos from bms extension successfully");
890         return ERR_OK;
891     }
892     return ret;
893 }
894 
QueryAllAbilityInfos(const Want &want, int32_t userId, std::vector<AbilityInfo> &abilityInfos)895 bool BundleMgrHostImpl::QueryAllAbilityInfos(const Want &want, int32_t userId, std::vector<AbilityInfo> &abilityInfos)
896 {
897     LOG_D(BMS_TAG_QUERY, "start QueryAllAbilityInfos, userId : %{public}d", userId);
898     if (!BundlePermissionMgr::IsSystemApp() &&
899         !BundlePermissionMgr::VerifyCallingBundleSdkVersion(ServiceConstants::API_VERSION_NINE)) {
900         LOG_D(BMS_TAG_QUERY, "non-system app calling system api");
901         return true;
902     }
903     if (!BundlePermissionMgr::VerifyCallingPermissionForAll(Constants::PERMISSION_GET_BUNDLE_INFO_PRIVILEGED)) {
904         LOG_E(BMS_TAG_QUERY, "verify permission failed");
905         return false;
906     }
907     APP_LOGD("verify permission success, begin to QueryAllAbilityInfos");
908     auto dataMgr = GetDataMgrFromService();
909     if (dataMgr == nullptr) {
910         LOG_E(BMS_TAG_QUERY, "DataMgr is nullptr");
911         return false;
912     }
913     bool res = dataMgr->QueryLauncherAbilityInfos(want, userId, abilityInfos) == ERR_OK;
914     auto bmsExtensionClient = std::make_shared<BmsExtensionClient>();
915     if (bmsExtensionClient->QueryLauncherAbility(want, userId, abilityInfos) == ERR_OK) {
916         LOG_D(BMS_TAG_QUERY, "query launcher ability infos from bms extension successfully");
917         return true;
918     }
919     return res;
920 }
921 
QueryAbilityInfoByUri(const std::string &abilityUri, AbilityInfo &abilityInfo)922 bool BundleMgrHostImpl::QueryAbilityInfoByUri(const std::string &abilityUri, AbilityInfo &abilityInfo)
923 {
924     LOG_D(BMS_TAG_QUERY, "start QueryAbilityInfoByUri, uri : %{private}s", abilityUri.c_str());
925     // API9 need to be system app, otherwise return empty data
926     if (!BundlePermissionMgr::IsSystemApp() &&
927         !BundlePermissionMgr::VerifyCallingBundleSdkVersion(ServiceConstants::API_VERSION_NINE)) {
928         LOG_D(BMS_TAG_QUERY, "non-system app calling system api");
929         return true;
930     }
931     if (!BundlePermissionMgr::VerifyCallingPermissionsForAll({Constants::PERMISSION_GET_BUNDLE_INFO_PRIVILEGED,
932         Constants::PERMISSION_GET_BUNDLE_INFO})) {
933         LOG_E(BMS_TAG_QUERY, "verify query permission failed");
934         return false;
935     }
936     auto dataMgr = GetDataMgrFromService();
937     if (dataMgr == nullptr) {
938         LOG_E(BMS_TAG_QUERY, "DataMgr is nullptr");
939         return false;
940     }
941     return dataMgr->QueryAbilityInfoByUri(abilityUri, Constants::UNSPECIFIED_USERID, abilityInfo);
942 }
943 
QueryAbilityInfosByUri(const std::string &abilityUri, std::vector<AbilityInfo> &abilityInfos)944 bool BundleMgrHostImpl::QueryAbilityInfosByUri(const std::string &abilityUri, std::vector<AbilityInfo> &abilityInfos)
945 {
946     LOG_D(BMS_TAG_QUERY, "start QueryAbilityInfosByUri, uri : %{private}s", abilityUri.c_str());
947     // API9 need to be system app, otherwise return empty data
948     if (!BundlePermissionMgr::IsSystemApp() &&
949         !BundlePermissionMgr::VerifyCallingBundleSdkVersion(ServiceConstants::API_VERSION_NINE)) {
950         return true;
951     }
952     if (!BundlePermissionMgr::VerifyCallingPermissionForAll(Constants::PERMISSION_GET_BUNDLE_INFO_PRIVILEGED)) {
953         LOG_E(BMS_TAG_QUERY, "verify permission failed");
954         return false;
955     }
956     auto dataMgr = GetDataMgrFromService();
957     if (dataMgr == nullptr) {
958         LOG_E(BMS_TAG_QUERY, "DataMgr is nullptr");
959         return false;
960     }
961     return dataMgr->QueryAbilityInfosByUri(abilityUri, abilityInfos);
962 }
963 
QueryAbilityInfoByUri( const std::string &abilityUri, int32_t userId, AbilityInfo &abilityInfo)964 bool BundleMgrHostImpl::QueryAbilityInfoByUri(
965     const std::string &abilityUri, int32_t userId, AbilityInfo &abilityInfo)
966 {
967     LOG_D(BMS_TAG_QUERY, "start QueryAbilityInfoByUri, uri : %{private}s, userId : %{public}d",
968         abilityUri.c_str(), userId);
969     if (!BundlePermissionMgr::IsSystemApp() &&
970         !BundlePermissionMgr::VerifyCallingBundleSdkVersion(ServiceConstants::API_VERSION_NINE)) {
971         LOG_D(BMS_TAG_QUERY, "non-system app calling system api");
972         return true;
973     }
974     if (!BundlePermissionMgr::VerifyCallingPermissionsForAll({Constants::PERMISSION_GET_BUNDLE_INFO,
975         Constants::PERMISSION_GET_BUNDLE_INFO_PRIVILEGED})) {
976         LOG_E(BMS_TAG_QUERY, "verify query permission failed");
977         return false;
978     }
979     auto dataMgr = GetDataMgrFromService();
980     if (dataMgr == nullptr) {
981         LOG_E(BMS_TAG_QUERY, "DataMgr is nullptr");
982         return false;
983     }
984     return dataMgr->QueryAbilityInfoByUri(abilityUri, userId, abilityInfo);
985 }
986 
QueryKeepAliveBundleInfos(std::vector<BundleInfo> &bundleInfos)987 bool BundleMgrHostImpl::QueryKeepAliveBundleInfos(std::vector<BundleInfo> &bundleInfos)
988 {
989     auto dataMgr = GetDataMgrFromService();
990     if (!BundlePermissionMgr::VerifyCallingPermissionForAll(Constants::PERMISSION_GET_BUNDLE_INFO_PRIVILEGED)) {
991         APP_LOGE("verify permission failed");
992         return false;
993     }
994     if (dataMgr == nullptr) {
995         APP_LOGE("DataMgr is nullptr");
996         return false;
997     }
998     return dataMgr->QueryKeepAliveBundleInfos(bundleInfos);
999 }
1000 
GetAbilityLabel(const std::string &bundleName, const std::string &abilityName)1001 std::string BundleMgrHostImpl::GetAbilityLabel(const std::string &bundleName, const std::string &abilityName)
1002 {
1003     HITRACE_METER_NAME(HITRACE_TAG_APP, __PRETTY_FUNCTION__);
1004     APP_LOGD("start GetAbilityLabel, bundleName : %{public}s, abilityName : %{public}s",
1005         bundleName.c_str(), abilityName.c_str());
1006     // API9 need to be system app otherwise return empty data
1007     if (!BundlePermissionMgr::IsSystemApp() &&
1008         !BundlePermissionMgr::VerifyCallingBundleSdkVersion(ServiceConstants::API_VERSION_NINE)) {
1009         APP_LOGD("non-system app calling system api");
1010         return Constants::EMPTY_STRING;
1011     }
1012     if (!BundlePermissionMgr::VerifyCallingPermissionsForAll({Constants::PERMISSION_GET_BUNDLE_INFO_PRIVILEGED,
1013         Constants::PERMISSION_GET_BUNDLE_INFO}) &&
1014         !BundlePermissionMgr::IsBundleSelfCalling(bundleName)) {
1015         APP_LOGE("verify permission failed");
1016         return Constants::EMPTY_STRING;
1017     }
1018     auto dataMgr = GetDataMgrFromService();
1019     if (dataMgr == nullptr) {
1020         APP_LOGE("DataMgr is nullptr");
1021         return Constants::EMPTY_STRING;
1022     }
1023     std::string label;
1024     ErrCode ret = dataMgr->GetAbilityLabel(bundleName, Constants::EMPTY_STRING, abilityName, label);
1025     if (ret != ERR_OK) {
1026         return Constants::EMPTY_STRING;
1027     }
1028     return label;
1029 }
1030 
GetAbilityLabel(const std::string &bundleName, const std::string &moduleName, const std::string &abilityName, std::string &label)1031 ErrCode BundleMgrHostImpl::GetAbilityLabel(const std::string &bundleName, const std::string &moduleName,
1032     const std::string &abilityName, std::string &label)
1033 {
1034     if (!BundlePermissionMgr::IsSystemApp()) {
1035         APP_LOGE("non-system app calling system api");
1036         return ERR_BUNDLE_MANAGER_SYSTEM_API_DENIED;
1037     }
1038     if (!BundlePermissionMgr::VerifyCallingPermissionsForAll({Constants::PERMISSION_GET_BUNDLE_INFO_PRIVILEGED,
1039         Constants::PERMISSION_GET_BUNDLE_INFO}) &&
1040         !BundlePermissionMgr::IsBundleSelfCalling(bundleName)) {
1041         APP_LOGE("verify permission failed");
1042         return ERR_BUNDLE_MANAGER_PERMISSION_DENIED;
1043     }
1044     auto dataMgr = GetDataMgrFromService();
1045     if (dataMgr == nullptr) {
1046         APP_LOGE("DataMgr is nullptr");
1047         return ERR_APPEXECFWK_SERVICE_NOT_READY;
1048     }
1049     return dataMgr->GetAbilityLabel(bundleName, moduleName, abilityName, label);
1050 }
1051 
GetBundleArchiveInfo( const std::string &hapFilePath, const BundleFlag flag, BundleInfo &bundleInfo)1052 bool BundleMgrHostImpl::GetBundleArchiveInfo(
1053     const std::string &hapFilePath, const BundleFlag flag, BundleInfo &bundleInfo)
1054 {
1055     return GetBundleArchiveInfo(hapFilePath, static_cast<int32_t>(flag), bundleInfo);
1056 }
1057 
GetBundleArchiveInfo( const std::string &hapFilePath, int32_t flags, BundleInfo &bundleInfo)1058 bool BundleMgrHostImpl::GetBundleArchiveInfo(
1059     const std::string &hapFilePath, int32_t flags, BundleInfo &bundleInfo)
1060 {
1061     APP_LOGD("start GetBundleArchiveInfo, hapFilePath : %{private}s, flags : %{public}d",
1062         hapFilePath.c_str(), flags);
1063     if (!BundlePermissionMgr::IsSystemApp() &&
1064         !BundlePermissionMgr::VerifyCallingBundleSdkVersion(ServiceConstants::API_VERSION_NINE)) {
1065         APP_LOGD("non-system app calling system api");
1066         return true;
1067     }
1068     if (hapFilePath.find(ServiceConstants::RELATIVE_PATH) != std::string::npos) {
1069         APP_LOGE("invalid hapFilePath");
1070         return false;
1071     }
1072     if (hapFilePath.find(ServiceConstants::SANDBOX_DATA_PATH) == std::string::npos) {
1073         std::string realPath;
1074         auto ret = BundleUtil::CheckFilePath(hapFilePath, realPath);
1075         if (ret != ERR_OK) {
1076             APP_LOGE("GetBundleArchiveInfo file path %{private}s invalid", hapFilePath.c_str());
1077             return false;
1078         }
1079 
1080         InnerBundleInfo info;
1081         BundleParser bundleParser;
1082         ret = bundleParser.Parse(realPath, info);
1083         if (ret != ERR_OK) {
1084             APP_LOGE("parse bundle info failed, error: %{public}d", ret);
1085             return false;
1086         }
1087         APP_LOGD("verify permission success, begin to GetBundleArchiveInfo");
1088         SetProvisionInfoToInnerBundleInfo(realPath, info);
1089         info.GetBundleInfo(flags, bundleInfo, ServiceConstants::NOT_EXIST_USERID);
1090         return true;
1091     } else {
1092         return GetBundleArchiveInfoBySandBoxPath(hapFilePath, flags, bundleInfo) == ERR_OK;
1093     }
1094 }
1095 
GetBundleArchiveInfoV9( const std::string &hapFilePath, int32_t flags, BundleInfo &bundleInfo)1096 ErrCode BundleMgrHostImpl::GetBundleArchiveInfoV9(
1097     const std::string &hapFilePath, int32_t flags, BundleInfo &bundleInfo)
1098 {
1099     APP_LOGD("start GetBundleArchiveInfoV9, hapFilePath : %{private}s, flags : %{public}d",
1100         hapFilePath.c_str(), flags);
1101     if (!BundlePermissionMgr::IsSystemApp()) {
1102         APP_LOGE("non-system app calling system api");
1103         return ERR_BUNDLE_MANAGER_SYSTEM_API_DENIED;
1104     }
1105     if (!BundlePermissionMgr::VerifyCallingPermissionForAll(Constants::PERMISSION_GET_BUNDLE_INFO_PRIVILEGED)) {
1106         APP_LOGE("verify permission failed");
1107         return ERR_BUNDLE_MANAGER_PERMISSION_DENIED;
1108     }
1109     if (hapFilePath.find(ServiceConstants::RELATIVE_PATH) != std::string::npos) {
1110         APP_LOGD("invalid hapFilePath");
1111         return ERR_BUNDLE_MANAGER_INVALID_HAP_PATH;
1112     }
1113     if (hapFilePath.find(ServiceConstants::SANDBOX_DATA_PATH) == 0) {
1114         APP_LOGD("sandbox path");
1115         return GetBundleArchiveInfoBySandBoxPath(hapFilePath, flags, bundleInfo, true);
1116     }
1117     std::string realPath;
1118     ErrCode ret = BundleUtil::CheckFilePath(hapFilePath, realPath);
1119     if (ret != ERR_OK) {
1120         APP_LOGE("GetBundleArchiveInfoV9 file path %{private}s invalid", hapFilePath.c_str());
1121         return ERR_BUNDLE_MANAGER_INVALID_HAP_PATH;
1122     }
1123     InnerBundleInfo info;
1124     BundleParser bundleParser;
1125     ret = bundleParser.Parse(realPath, info);
1126     if (ret != ERR_OK) {
1127         APP_LOGE("parse bundle info failed, error: %{public}d", ret);
1128         return ERR_BUNDLE_MANAGER_INVALID_HAP_PATH;
1129     }
1130     if ((static_cast<uint32_t>(flags) & static_cast<uint32_t>(GetBundleInfoFlag::GET_BUNDLE_INFO_WITH_SIGNATURE_INFO))
1131         == static_cast<uint32_t>(GetBundleInfoFlag::GET_BUNDLE_INFO_WITH_SIGNATURE_INFO)) {
1132         SetProvisionInfoToInnerBundleInfo(realPath, info);
1133     }
1134     info.GetBundleInfoV9(flags, bundleInfo, ServiceConstants::NOT_EXIST_USERID);
1135     return ERR_OK;
1136 }
1137 
GetBundleArchiveInfoBySandBoxPath(const std::string &hapFilePath, int32_t flags, BundleInfo &bundleInfo, bool fromV9)1138 ErrCode BundleMgrHostImpl::GetBundleArchiveInfoBySandBoxPath(const std::string &hapFilePath,
1139     int32_t flags, BundleInfo &bundleInfo, bool fromV9)
1140 {
1141     std::string bundleName;
1142     int32_t apiVersion = fromV9 ? Constants::INVALID_API_VERSION : ServiceConstants::API_VERSION_NINE;
1143     if (!BundlePermissionMgr::IsSystemApp() && !BundlePermissionMgr::VerifyCallingBundleSdkVersion(apiVersion)) {
1144         APP_LOGE("non-system app calling system api");
1145         return ERR_BUNDLE_MANAGER_SYSTEM_API_DENIED;
1146     }
1147     if (!ObtainCallingBundleName(bundleName)) {
1148         APP_LOGE("get calling bundleName failed");
1149         return ERR_BUNDLE_MANAGER_INTERNAL_ERROR;
1150     }
1151     std::string hapRealPath;
1152     if (!BundleUtil::RevertToRealPath(hapFilePath, bundleName, hapRealPath)) {
1153         APP_LOGE("GetBundleArchiveInfo RevertToRealPath failed");
1154         return ERR_BUNDLE_MANAGER_INTERNAL_ERROR;
1155     }
1156     std::string tempHapPath = std::string(ServiceConstants::BUNDLE_MANAGER_SERVICE_PATH) +
1157         ServiceConstants::PATH_SEPARATOR + std::to_string(BundleUtil::GetCurrentTimeNs());
1158     if (!BundleUtil::CreateDir(tempHapPath)) {
1159         APP_LOGE("GetBundleArchiveInfo make temp dir failed");
1160         return ERR_BUNDLE_MANAGER_INTERNAL_ERROR;
1161     }
1162     std::string hapName = hapFilePath.substr(hapFilePath.find_last_of("//") + 1);
1163     std::string tempHapFile = tempHapPath + ServiceConstants::PATH_SEPARATOR + hapName;
1164     if (InstalldClient::GetInstance()->CopyFile(hapRealPath, tempHapFile) != ERR_OK) {
1165         APP_LOGE("GetBundleArchiveInfo copy hap file failed");
1166         return ERR_BUNDLE_MANAGER_INTERNAL_ERROR;
1167     }
1168     std::string realPath;
1169     auto ret = BundleUtil::CheckFilePath(tempHapFile, realPath);
1170     if (ret != ERR_OK) {
1171         APP_LOGE("CheckFilePath failed");
1172         return ERR_BUNDLE_MANAGER_INTERNAL_ERROR;
1173     }
1174     InnerBundleInfo info;
1175     BundleParser bundleParser;
1176     ret = bundleParser.Parse(realPath, info);
1177     if (ret != ERR_OK) {
1178         APP_LOGE("parse bundle info failed, error: %{public}d", ret);
1179         BundleUtil::DeleteDir(tempHapPath);
1180         return ERR_BUNDLE_MANAGER_INTERNAL_ERROR;
1181     }
1182     SetProvisionInfoToInnerBundleInfo(realPath, info);
1183     BundleUtil::DeleteDir(tempHapPath);
1184     if (fromV9) {
1185         info.GetBundleInfoV9(flags, bundleInfo, ServiceConstants::NOT_EXIST_USERID);
1186     } else {
1187         info.GetBundleInfo(flags, bundleInfo, ServiceConstants::NOT_EXIST_USERID);
1188     }
1189     return ERR_OK;
1190 }
1191 
GetHapModuleInfo(const AbilityInfo &abilityInfo, HapModuleInfo &hapModuleInfo)1192 bool BundleMgrHostImpl::GetHapModuleInfo(const AbilityInfo &abilityInfo, HapModuleInfo &hapModuleInfo)
1193 {
1194     APP_LOGD("start GetHapModuleInfo");
1195     return GetHapModuleInfo(abilityInfo, Constants::UNSPECIFIED_USERID, hapModuleInfo);
1196 }
1197 
GetHapModuleInfo(const AbilityInfo &abilityInfo, int32_t userId, HapModuleInfo &hapModuleInfo)1198 bool BundleMgrHostImpl::GetHapModuleInfo(const AbilityInfo &abilityInfo, int32_t userId, HapModuleInfo &hapModuleInfo)
1199 {
1200     APP_LOGD("start GetHapModuleInfo with bundleName %{public}s and userId: %{public}d",
1201         abilityInfo.bundleName.c_str(), userId);
1202     int32_t timerId = XCollieHelper::SetRecoveryTimer(FUNCATION_GET_HAP_MODULE_INFO);
1203     ScopeGuard cancelTimerIdGuard([timerId] { XCollieHelper::CancelTimer(timerId); });
1204     if (!BundlePermissionMgr::VerifyCallingPermissionForAll(Constants::PERMISSION_GET_BUNDLE_INFO_PRIVILEGED) &&
1205         !BundlePermissionMgr::IsBundleSelfCalling(abilityInfo.bundleName)) {
1206         APP_LOGE("verify permission failed");
1207         return false;
1208     }
1209     if (abilityInfo.bundleName.empty() || abilityInfo.package.empty()) {
1210         APP_LOGE("fail to GetHapModuleInfo due to params empty");
1211         return false;
1212     }
1213     auto dataMgr = GetDataMgrFromService();
1214     if (dataMgr == nullptr) {
1215         APP_LOGE("DataMgr is nullptr");
1216         return false;
1217     }
1218     return dataMgr->GetHapModuleInfo(abilityInfo, hapModuleInfo, userId);
1219 }
1220 
GetLaunchWantForBundle(const std::string &bundleName, Want &want, int32_t userId)1221 ErrCode BundleMgrHostImpl::GetLaunchWantForBundle(const std::string &bundleName, Want &want, int32_t userId)
1222 {
1223     HITRACE_METER_NAME(HITRACE_TAG_APP, __PRETTY_FUNCTION__);
1224     APP_LOGD("start GetLaunchWantForBundle, bundleName : %{public}s", bundleName.c_str());
1225     if (!BundlePermissionMgr::IsSystemApp() &&
1226         !BundlePermissionMgr::VerifyCallingBundleSdkVersion(ServiceConstants::API_VERSION_NINE)) {
1227         APP_LOGE("non-system app calling system api");
1228         return ERR_BUNDLE_MANAGER_SYSTEM_API_DENIED;
1229     }
1230     if (!BundlePermissionMgr::VerifyCallingPermissionForAll(Constants::PERMISSION_GET_BUNDLE_INFO_PRIVILEGED)) {
1231         APP_LOGE("verify permission failed");
1232         return ERR_BUNDLE_MANAGER_PERMISSION_DENIED;
1233     }
1234 
1235     APP_LOGD("verify permission success, begin to GetLaunchWantForBundle");
1236     auto dataMgr = GetDataMgrFromService();
1237     if (dataMgr == nullptr) {
1238         APP_LOGE("DataMgr is nullptr");
1239         return ERR_BUNDLE_MANAGER_INTERNAL_ERROR;
1240     }
1241 
1242     return dataMgr->GetLaunchWantForBundle(bundleName, want, userId);
1243 }
1244 
GetPermissionDef(const std::string &permissionName, PermissionDef &permissionDef)1245 ErrCode BundleMgrHostImpl::GetPermissionDef(const std::string &permissionName, PermissionDef &permissionDef)
1246 {
1247     if (!BundlePermissionMgr::IsSystemApp()) {
1248         APP_LOGE("non-system app calling system api");
1249         return ERR_BUNDLE_MANAGER_SYSTEM_API_DENIED;
1250     }
1251     if (!BundlePermissionMgr::VerifyCallingPermissionForAll(Constants::PERMISSION_GET_BUNDLE_INFO_PRIVILEGED)) {
1252         APP_LOGE("verify GET_BUNDLE_INFO_PRIVILEGED failed");
1253         return ERR_BUNDLE_MANAGER_PERMISSION_DENIED;
1254     }
1255     if (permissionName.empty()) {
1256         APP_LOGW("fail to GetPermissionDef due to params empty");
1257         return ERR_BUNDLE_MANAGER_QUERY_PERMISSION_DEFINE_FAILED;
1258     }
1259     return BundlePermissionMgr::GetPermissionDef(permissionName, permissionDef);
1260 }
1261 
CleanBundleCacheFilesAutomatic(uint64_t cacheSize)1262 ErrCode BundleMgrHostImpl::CleanBundleCacheFilesAutomatic(uint64_t cacheSize)
1263 {
1264     if (cacheSize == 0) {
1265         APP_LOGE("parameter error, cache size must be greater than 0");
1266         return ERR_BUNDLE_MANAGER_INVALID_PARAMETER;
1267     }
1268 
1269     if (!BundlePermissionMgr::VerifyCallingPermissionForAll(Constants::PERMISSION_REMOVECACHEFILE)) {
1270         APP_LOGE("ohos.permission.REMOVE_CACHE_FILES permission denied");
1271         return ERR_BUNDLE_MANAGER_PERMISSION_DENIED;
1272     }
1273 
1274     // Get current active userId
1275     int32_t currentUserId = AccountHelper::GetCurrentActiveUserId();
1276     APP_LOGI("current active userId is %{public}d", currentUserId);
1277     if (currentUserId == Constants::INVALID_USERID) {
1278         APP_LOGE("currentUserId %{public}d is invalid", currentUserId);
1279         return ERR_BUNDLE_MANAGER_INVALID_USER_ID;
1280     }
1281 
1282     // Get apps use time under the current active user
1283     int64_t startTime = 0;
1284     int64_t endTime = BundleUtil::GetCurrentTimeMs();
1285     const int32_t PERIOD_ANNUALLY = 4; // 4 is the number of the period ANN
1286     uint32_t notRunningSum = 0; // The total amount of application that is not running
1287 #ifdef DEVICE_USAGE_STATISTICS_ENABLED
1288     std::vector<DeviceUsageStats::BundleActivePackageStats> useStats;
1289     DeviceUsageStats::BundleActiveClient::GetInstance().QueryBundleStatsInfoByInterval(
1290         useStats, PERIOD_ANNUALLY, startTime, endTime, currentUserId);
1291 
1292     if (useStats.empty()) {
1293         APP_LOGE("useStats under the current active user is empty");
1294         return ERR_BUNDLE_MANAGER_DEVICE_USAGE_STATS_EMPTY;
1295     }
1296 
1297     // Sort apps use time from small to large under the current active user
1298     std::sort(useStats.begin(), useStats.end(),
1299         [](DeviceUsageStats::BundleActivePackageStats a,
1300         DeviceUsageStats::BundleActivePackageStats b) {
1301             return a.totalInFrontTime_ < b.totalInFrontTime_;
1302         });
1303 
1304     // Get all running apps
1305     sptr<IAppMgr> appMgrProxy =
1306         iface_cast<IAppMgr>(SystemAbilityHelper::GetSystemAbility(APP_MGR_SERVICE_ID));
1307     if (appMgrProxy == nullptr) {
1308         APP_LOGE("fail to find the app mgr service to check app is running");
1309         return ERR_BUNDLE_MANAGER_GET_SYSTEM_ABILITY_FAILED;
1310     }
1311 
1312     std::vector<RunningProcessInfo> runningList;
1313     int result = appMgrProxy->GetAllRunningProcesses(runningList);
1314     if (result != ERR_OK) {
1315         APP_LOGE("GetAllRunningProcesses failed");
1316         return ERR_BUNDLE_MANAGER_GET_ALL_RUNNING_PROCESSES_FAILED;
1317     }
1318 
1319     std::unordered_set<std::string> runningSet;
1320     for (const auto &info : runningList) {
1321         runningSet.insert(info.bundleNames.begin(), info.bundleNames.end());
1322     }
1323 
1324     uint64_t cleanCacheSum = 0; // The total amount of application cache currently cleaned
1325     for (auto useStat : useStats) {
1326         if (runningSet.find(useStat.bundleName_) == runningSet.end()) {
1327             notRunningSum++;
1328             uint64_t cleanCacheSize = 0; // The cache size of a single application cleaned up
1329             ErrCode ret = CleanBundleCacheFilesGetCleanSize(useStat.bundleName_, currentUserId, cleanCacheSize);
1330             if (ret != ERR_OK) {
1331                 return ret;
1332             }
1333             APP_LOGI("bundleName : %{public}s, cleanCacheSize: %{public}" PRIu64 "",
1334                 useStat.bundleName_.c_str(), cleanCacheSize);
1335             cleanCacheSum += cleanCacheSize;
1336             if (cleanCacheSum >= cacheSize) {
1337                 return ERR_OK;
1338             }
1339         }
1340     }
1341 #endif
1342     if (notRunningSum == 0) {
1343         APP_LOGE("All apps are running under the current active user");
1344         return ERR_BUNDLE_MANAGER_ALL_BUNDLES_ARE_RUNNING;
1345     }
1346 
1347     return ERR_OK;
1348 }
1349 
CleanBundleCacheFilesGetCleanSize(const std::string &bundleName, int32_t userId, uint64_t &cleanCacheSize)1350 ErrCode BundleMgrHostImpl::CleanBundleCacheFilesGetCleanSize(const std::string &bundleName,
1351     int32_t userId, uint64_t &cleanCacheSize)
1352 {
1353     APP_LOGI("start CleanBundleCacheFilesGetCleanSize, bundleName : %{public}s, userId : %{public}d",
1354         bundleName.c_str(), userId);
1355 
1356     if (!BundlePermissionMgr::IsSystemApp()) {
1357         APP_LOGE("non-system app calling system api");
1358         return ERR_BUNDLE_MANAGER_SYSTEM_API_DENIED;
1359     }
1360 
1361     if (userId < 0) {
1362         APP_LOGE("userId is invalid");
1363         EventReport::SendCleanCacheSysEvent(bundleName, userId, true, true);
1364         return ERR_BUNDLE_MANAGER_INVALID_USER_ID;
1365     }
1366 
1367     if (bundleName.empty()) {
1368         APP_LOGE("the bundleName empty");
1369         EventReport::SendCleanCacheSysEvent(bundleName, userId, true, true);
1370         return ERR_BUNDLE_MANAGER_PARAM_ERROR;
1371     }
1372 
1373     ApplicationInfo applicationInfo;
1374     auto dataMgr = GetDataMgrFromService();
1375     if (dataMgr == nullptr) {
1376         APP_LOGE("DataMgr is nullptr");
1377         EventReport::SendCleanCacheSysEvent(bundleName, userId, true, true);
1378         return ERR_APPEXECFWK_SERVICE_INTERNAL_ERROR;
1379     }
1380 
1381     auto ret = dataMgr->GetApplicationInfoWithResponseId(bundleName,
1382         static_cast<int32_t>(GetApplicationFlag::GET_APPLICATION_INFO_WITH_DISABLE), userId, applicationInfo);
1383     if (ret != ERR_OK) {
1384         APP_LOGE("can not get application info of %{public}s", bundleName.c_str());
1385         EventReport::SendCleanCacheSysEvent(bundleName, userId, true, true);
1386         return ret;
1387     }
1388 
1389     if (!applicationInfo.userDataClearable) {
1390         APP_LOGE("can not clean cacheFiles of %{public}s due to userDataClearable is false", bundleName.c_str());
1391         EventReport::SendCleanCacheSysEvent(bundleName, userId, true, true);
1392         return ERR_BUNDLE_MANAGER_CAN_NOT_CLEAR_USER_DATA;
1393     }
1394 
1395     CleanBundleCacheTaskGetCleanSize(bundleName, userId, cleanCacheSize);
1396     return ERR_OK;
1397 }
1398 
CleanBundleCacheTaskGetCleanSize(const std::string &bundleName, int32_t userId, uint64_t &cleanCacheSize)1399 void BundleMgrHostImpl::CleanBundleCacheTaskGetCleanSize(const std::string &bundleName,
1400     int32_t userId, uint64_t &cleanCacheSize)
1401 {
1402     std::vector<std::string> rootDir;
1403     for (const auto &el : ServiceConstants::BUNDLE_EL) {
1404         std::string dataDir = ServiceConstants::BUNDLE_APP_DATA_BASE_DIR + el +
1405             ServiceConstants::PATH_SEPARATOR + std::to_string(userId) + ServiceConstants::BASE + bundleName;
1406         rootDir.emplace_back(dataDir);
1407     }
1408 
1409     std::vector<std::string> caches;
1410     for (const auto &st : rootDir) {
1411         std::vector<std::string> cache;
1412         if (InstalldClient::GetInstance()->GetBundleCachePath(st, cache) != ERR_OK) {
1413             APP_LOGE("GetBundleCachePath failed, path: %{public}s", st.c_str());
1414         }
1415         std::copy(cache.begin(), cache.end(), std::back_inserter(caches));
1416     }
1417 
1418     bool succeed = true;
1419     if (!caches.empty()) {
1420         for (const auto& cache : caches) {
1421             int64_t cacheSize = InstalldClient::GetInstance()->GetDiskUsage(cache, true);
1422             ErrCode ret = InstalldClient::GetInstance()->CleanBundleDataDir(cache);
1423             if (ret != ERR_OK) {
1424                 APP_LOGE("CleanBundleDataDir failed, path: %{public}s", cache.c_str());
1425                 succeed = false;
1426             }
1427             cleanCacheSize += static_cast<uint64_t>(cacheSize);
1428         }
1429     }
1430     EventReport::SendCleanCacheSysEvent(bundleName, userId, true, !succeed);
1431     APP_LOGI("CleanBundleCacheFiles with succeed %{public}d", succeed);
1432     InnerBundleUserInfo innerBundleUserInfo;
1433     if (!this->GetBundleUserInfo(bundleName, userId, innerBundleUserInfo)) {
1434         APP_LOGE("Get calling userInfo in bundle(%{public}s) failed", bundleName.c_str());
1435         return;
1436     }
1437     NotifyBundleEvents installRes = {
1438         .type = NotifyType::BUNDLE_CACHE_CLEARED,
1439         .resultCode = ERR_OK,
1440         .accessTokenId = innerBundleUserInfo.accessTokenId,
1441         .uid = innerBundleUserInfo.uid,
1442         .bundleName = bundleName
1443     };
1444     NotifyBundleStatus(installRes);
1445 }
1446 
CheckAppIndex(const std::string &bundleName, int32_t userId, int32_t appIndex)1447 bool BundleMgrHostImpl::CheckAppIndex(const std::string &bundleName, int32_t userId, int32_t appIndex)
1448 {
1449     if (appIndex == 0) {
1450         return true;
1451     }
1452     if (appIndex < 0) {
1453         APP_LOGE("appIndex is invalid");
1454         return false;
1455     }
1456     auto dataMgr = GetDataMgrFromService();
1457     if (dataMgr == nullptr) {
1458         APP_LOGE("DataMgr is nullptr");
1459         return false;
1460     }
1461     std::vector<int32_t> appIndexes = dataMgr->GetCloneAppIndexes(bundleName, userId);
1462     bool isAppIndexValid = std::find(appIndexes.cbegin(), appIndexes.cend(), appIndex) == appIndexes.cend();
1463     if (isAppIndexValid) {
1464         APP_LOGE("appIndex is not in the installed appIndexes range");
1465         return false;
1466     }
1467     return true;
1468 }
1469 
CleanBundleCacheFiles( const std::string &bundleName, const sptr<ICleanCacheCallback> cleanCacheCallback, int32_t userId, int32_t appIndex)1470 ErrCode BundleMgrHostImpl::CleanBundleCacheFiles(
1471     const std::string &bundleName, const sptr<ICleanCacheCallback> cleanCacheCallback,
1472     int32_t userId, int32_t appIndex)
1473 {
1474     if (userId == Constants::UNSPECIFIED_USERID) {
1475         userId = BundleUtil::GetUserIdByCallingUid();
1476     }
1477     APP_LOGI("start -n %{public}s -u %{public}d -i %{public}d", bundleName.c_str(), userId, appIndex);
1478     if (!BundlePermissionMgr::IsSystemApp()) {
1479         APP_LOGE("non-system app calling system api");
1480         return ERR_BUNDLE_MANAGER_SYSTEM_API_DENIED;
1481     }
1482     if (userId < 0) {
1483         APP_LOGE("userId is invalid");
1484         EventReport::SendCleanCacheSysEventWithIndex(bundleName, userId, appIndex, true, true);
1485         return ERR_BUNDLE_MANAGER_INVALID_USER_ID;
1486     }
1487     if (!CheckAppIndex(bundleName, userId, appIndex)) {
1488         EventReport::SendCleanCacheSysEventWithIndex(bundleName, userId, appIndex, true, true);
1489         return ERR_APPEXECFWK_APP_INDEX_OUT_OF_RANGE;
1490     }
1491     if (bundleName.empty() || !cleanCacheCallback) {
1492         APP_LOGE("the cleanCacheCallback is nullptr or bundleName empty");
1493         EventReport::SendCleanCacheSysEventWithIndex(bundleName, userId, appIndex, true, true);
1494         return ERR_BUNDLE_MANAGER_PARAM_ERROR;
1495     }
1496 
1497     if (!BundlePermissionMgr::VerifyCallingPermissionForAll(Constants::PERMISSION_REMOVECACHEFILE) &&
1498         !BundlePermissionMgr::IsBundleSelfCalling(bundleName)) {
1499         APP_LOGE("ohos.permission.REMOVE_CACHE_FILES permission denied");
1500         EventReport::SendCleanCacheSysEventWithIndex(bundleName, userId, appIndex, true, true);
1501         return ERR_BUNDLE_MANAGER_PERMISSION_DENIED;
1502     }
1503 
1504     if (isBrokerServiceExisted_ && !IsBundleExist(bundleName)) {
1505         return ClearCache(bundleName, cleanCacheCallback, userId);
1506     }
1507 
1508     ApplicationInfo applicationInfo;
1509     auto dataMgr = GetDataMgrFromService();
1510     if (dataMgr == nullptr) {
1511         APP_LOGE("DataMgr is nullptr");
1512         EventReport::SendCleanCacheSysEventWithIndex(bundleName, userId, appIndex, true, true);
1513         return ERR_APPEXECFWK_SERVICE_INTERNAL_ERROR;
1514     }
1515 
1516     auto ret = dataMgr->GetApplicationInfoWithResponseId(bundleName,
1517         static_cast<int32_t>(GetApplicationFlag::GET_APPLICATION_INFO_WITH_DISABLE), userId, applicationInfo);
1518     if (ret != ERR_OK) {
1519         APP_LOGE("can not get application info of %{public}s", bundleName.c_str());
1520         EventReport::SendCleanCacheSysEventWithIndex(bundleName, userId, appIndex, true, true);
1521         return ret;
1522     }
1523 
1524     if (!applicationInfo.userDataClearable) {
1525         APP_LOGE("can not clean cacheFiles of %{public}s due to userDataClearable is false", bundleName.c_str());
1526         EventReport::SendCleanCacheSysEventWithIndex(bundleName, userId, appIndex, true, true);
1527         return ERR_BUNDLE_MANAGER_CAN_NOT_CLEAR_USER_DATA;
1528     }
1529 
1530     CleanBundleCacheTask(bundleName, cleanCacheCallback, dataMgr, userId, appIndex);
1531     return ERR_OK;
1532 }
1533 
CleanBundleCacheTask(const std::string &bundleName, const sptr<ICleanCacheCallback> cleanCacheCallback, const std::shared_ptr<BundleDataMgr> &dataMgr, int32_t userId, int32_t appIndex)1534 void BundleMgrHostImpl::CleanBundleCacheTask(const std::string &bundleName,
1535     const sptr<ICleanCacheCallback> cleanCacheCallback,
1536     const std::shared_ptr<BundleDataMgr> &dataMgr,
1537     int32_t userId, int32_t appIndex)
1538 {
1539     std::vector<std::string> rootDir;
1540     std::string suffixName = bundleName;
1541     if (appIndex > 0) {
1542         suffixName = BundleCloneCommonHelper::GetCloneDataDir(bundleName, appIndex);
1543     }
1544 
1545     std::vector<std::string> bundleEls = ServiceConstants::BUNDLE_EL;
1546     bundleEls.push_back(ServiceConstants::DIR_EL5);
1547     for (const auto &el : bundleEls) {
1548         std::string dataDir = ServiceConstants::BUNDLE_APP_DATA_BASE_DIR + el +
1549             ServiceConstants::PATH_SEPARATOR + std::to_string(userId) + ServiceConstants::BASE + suffixName;
1550         rootDir.emplace_back(dataDir);
1551     }
1552 
1553     auto cleanCache = [bundleName, userId, rootDir, dataMgr, cleanCacheCallback, appIndex, this]() {
1554         std::vector<std::string> caches;
1555         for (const auto &st : rootDir) {
1556             std::vector<std::string> cache;
1557             if (InstalldClient::GetInstance()->GetBundleCachePath(st, cache) != ERR_OK) {
1558                 APP_LOGW("GetBundleCachePath failed, path: %{public}s", st.c_str());
1559             }
1560             std::copy(cache.begin(), cache.end(), std::back_inserter(caches));
1561         }
1562 
1563         std::string shaderCachePath;
1564         shaderCachePath.append(ServiceConstants::SHADER_CACHE_PATH).append(bundleName);
1565         caches.push_back(shaderCachePath);
1566 
1567         bool succeed = true;
1568         if (!caches.empty()) {
1569             for (const auto& cache : caches) {
1570                 ErrCode ret = InstalldClient::GetInstance()->CleanBundleDataDir(cache);
1571                 if (ret != ERR_OK) {
1572                     APP_LOGE("CleanBundleDataDir failed, path: %{private}s", cache.c_str());
1573                     succeed = false;
1574                 }
1575             }
1576         }
1577         EventReport::SendCleanCacheSysEvent(bundleName, userId, true, !succeed);
1578         APP_LOGD("CleanBundleCacheFiles with succeed %{public}d", succeed);
1579         cleanCacheCallback->OnCleanCacheFinished(succeed);
1580         InnerBundleUserInfo innerBundleUserInfo;
1581         if (!this->GetBundleUserInfo(bundleName, userId, innerBundleUserInfo)) {
1582             APP_LOGW("Get calling userInfo in bundle(%{public}s) failed", bundleName.c_str());
1583             return;
1584         }
1585         NotifyBundleEvents installRes;
1586         if (appIndex > 0) {
1587             std::map<std::string, InnerBundleCloneInfo> cloneInfos = innerBundleUserInfo.cloneInfos;
1588             auto cloneInfoIter = cloneInfos.find(std::to_string(appIndex));
1589             if (cloneInfoIter == cloneInfos.end()) {
1590                 APP_LOGW("Get calling userCloneInfo in bundle(%{public}s) failed, appIndex:%{public}d",
1591                     bundleName.c_str(), appIndex);
1592                 return;
1593             }
1594             int32_t uid = cloneInfoIter->second.uid;
1595             installRes = {
1596                 .type = NotifyType::BUNDLE_CACHE_CLEARED,
1597                 .resultCode = ERR_OK,
1598                 .accessTokenId = innerBundleUserInfo.accessTokenId,
1599                 .uid = uid,
1600                 .appIndex = appIndex,
1601                 .bundleName = bundleName
1602             };
1603             NotifyBundleStatus(installRes);
1604             return;
1605         }
1606         installRes = {
1607             .type = NotifyType::BUNDLE_CACHE_CLEARED,
1608             .resultCode = ERR_OK,
1609             .accessTokenId = innerBundleUserInfo.accessTokenId,
1610             .uid = innerBundleUserInfo.uid,
1611             .bundleName = bundleName
1612         };
1613         NotifyBundleStatus(installRes);
1614     };
1615     ffrt::submit(cleanCache);
1616 }
1617 
CleanBundleDataFiles(const std::string &bundleName, const int userId, const int appIndex)1618 bool BundleMgrHostImpl::CleanBundleDataFiles(const std::string &bundleName, const int userId, const int appIndex)
1619 {
1620     APP_LOGI("start CleanBundleDataFiles, bundleName : %{public}s, userId:%{public}d, appIndex:%{public}d",
1621         bundleName.c_str(), userId, appIndex);
1622     if (!BundlePermissionMgr::IsSystemApp()) {
1623         APP_LOGE("ohos.permission.REMOVE_CACHE_FILES system api denied");
1624         EventReport::SendCleanCacheSysEventWithIndex(bundleName, userId, appIndex, false, true);
1625         return false;
1626     }
1627     if (bundleName.empty() || userId < 0) {
1628         APP_LOGE("the  bundleName empty or invalid userid");
1629         EventReport::SendCleanCacheSysEventWithIndex(bundleName, userId, appIndex, false, true);
1630         return false;
1631     }
1632     if (!CheckAppIndex(bundleName, userId, appIndex)) {
1633         EventReport::SendCleanCacheSysEventWithIndex(bundleName, userId, appIndex, false, true);
1634         return false;
1635     }
1636     if (!BundlePermissionMgr::VerifyCallingPermissionForAll(Constants::PERMISSION_REMOVECACHEFILE)) {
1637         APP_LOGE("ohos.permission.REMOVE_CACHE_FILES permission denied");
1638         EventReport::SendCleanCacheSysEventWithIndex(bundleName, userId, appIndex, false, true);
1639         return false;
1640     }
1641     if (isBrokerServiceExisted_ && !IsBundleExist(bundleName)) {
1642         auto bmsExtensionClient = std::make_shared<BmsExtensionClient>();
1643         ErrCode ret = bmsExtensionClient->ClearData(bundleName, userId);
1644         APP_LOGI("ret : %{public}d", ret);
1645         EventReport::SendCleanCacheSysEventWithIndex(bundleName, userId, appIndex, false, ret != ERR_OK);
1646         return ret == ERR_OK;
1647     }
1648     ApplicationInfo applicationInfo;
1649     auto dataMgr = GetDataMgrFromService();
1650     if (dataMgr == nullptr || dataMgr->GetApplicationInfoV9(bundleName,
1651         static_cast<int32_t>(GetApplicationFlag::GET_APPLICATION_INFO_WITH_DISABLE),
1652         userId, applicationInfo, appIndex) != ERR_OK) {
1653         APP_LOGE("can not get application info of %{public}s", bundleName.c_str());
1654         EventReport::SendCleanCacheSysEventWithIndex(bundleName, userId, appIndex, false, true);
1655         return false;
1656     }
1657 
1658     if (!applicationInfo.userDataClearable) {
1659         APP_LOGE("can not clean dataFiles of %{public}s due to userDataClearable is false", bundleName.c_str());
1660         EventReport::SendCleanCacheSysEventWithIndex(bundleName, userId, appIndex, false, true);
1661         return false;
1662     }
1663     InnerBundleUserInfo innerBundleUserInfo;
1664     if (!GetBundleUserInfo(bundleName, userId, innerBundleUserInfo)) {
1665         APP_LOGE("%{public}s, userId:%{public}d, GetBundleUserInfo failed", bundleName.c_str(), userId);
1666         EventReport::SendCleanCacheSysEventWithIndex(bundleName, userId, appIndex, false, true);
1667         return false;
1668     }
1669     if (BundlePermissionMgr::ClearUserGrantedPermissionState(applicationInfo.accessTokenId)) {
1670         APP_LOGE("%{public}s, ClearUserGrantedPermissionState failed", bundleName.c_str());
1671         EventReport::SendCleanCacheSysEventWithIndex(bundleName, userId, appIndex, false, true);
1672         return false;
1673     }
1674     if (InstalldClient::GetInstance()->CleanBundleDataDirByName(bundleName, userId, appIndex) != ERR_OK) {
1675         APP_LOGE("%{public}s, CleanBundleDataDirByName failed", bundleName.c_str());
1676         EventReport::SendCleanCacheSysEventWithIndex(bundleName, userId, appIndex, false, true);
1677         return false;
1678     }
1679     EventReport::SendCleanCacheSysEventWithIndex(bundleName, userId, appIndex, false, false);
1680     return true;
1681 }
1682 
RegisterBundleStatusCallback(const sptr<IBundleStatusCallback> &bundleStatusCallback)1683 bool BundleMgrHostImpl::RegisterBundleStatusCallback(const sptr<IBundleStatusCallback> &bundleStatusCallback)
1684 {
1685     APP_LOGD("start RegisterBundleStatusCallback");
1686     if ((!bundleStatusCallback) || (bundleStatusCallback->GetBundleName().empty())) {
1687         APP_LOGE("the bundleStatusCallback is nullptr or bundleName empty");
1688         return false;
1689     }
1690     // check permission
1691     if (!BundlePermissionMgr::VerifyCallingPermissionForAll(Constants::LISTEN_BUNDLE_CHANGE)) {
1692         APP_LOGE("register bundle status callback failed due to lack of permission");
1693         return false;
1694     }
1695 
1696     auto dataMgr = GetDataMgrFromService();
1697     if (dataMgr == nullptr) {
1698         APP_LOGE("DataMgr is nullptr");
1699         return false;
1700     }
1701     return dataMgr->RegisterBundleStatusCallback(bundleStatusCallback);
1702 }
1703 
RegisterBundleEventCallback(const sptr<IBundleEventCallback> &bundleEventCallback)1704 bool BundleMgrHostImpl::RegisterBundleEventCallback(const sptr<IBundleEventCallback> &bundleEventCallback)
1705 {
1706     APP_LOGD("begin to RegisterBundleEventCallback");
1707     if (bundleEventCallback == nullptr) {
1708         APP_LOGE("bundleEventCallback is null");
1709         return false;
1710     }
1711     auto uid = IPCSkeleton::GetCallingUid();
1712     if (uid != Constants::FOUNDATION_UID && uid != Constants::CODE_PROTECT_UID) {
1713         APP_LOGE("verify calling uid failed, uid : %{public}d", uid);
1714         return false;
1715     }
1716     auto dataMgr = GetDataMgrFromService();
1717     if (dataMgr == nullptr) {
1718         APP_LOGE("DataMgr is nullptr");
1719         return false;
1720     }
1721     return dataMgr->RegisterBundleEventCallback(bundleEventCallback);
1722 }
1723 
UnregisterBundleEventCallback(const sptr<IBundleEventCallback> &bundleEventCallback)1724 bool BundleMgrHostImpl::UnregisterBundleEventCallback(const sptr<IBundleEventCallback> &bundleEventCallback)
1725 {
1726     APP_LOGD("begin to UnregisterBundleEventCallback");
1727     if (bundleEventCallback == nullptr) {
1728         APP_LOGE("bundleEventCallback is null");
1729         return false;
1730     }
1731     auto uid = IPCSkeleton::GetCallingUid();
1732     if (uid != Constants::FOUNDATION_UID) {
1733         APP_LOGE("verify calling uid failed, uid : %{public}d", uid);
1734         return false;
1735     }
1736     auto dataMgr = GetDataMgrFromService();
1737     if (dataMgr == nullptr) {
1738         APP_LOGE("DataMgr is nullptr");
1739         return false;
1740     }
1741     return dataMgr->UnregisterBundleEventCallback(bundleEventCallback);
1742 }
1743 
ClearBundleStatusCallback(const sptr<IBundleStatusCallback> &bundleStatusCallback)1744 bool BundleMgrHostImpl::ClearBundleStatusCallback(const sptr<IBundleStatusCallback> &bundleStatusCallback)
1745 {
1746     APP_LOGD("start ClearBundleStatusCallback");
1747     if (!bundleStatusCallback) {
1748         APP_LOGE("the bundleStatusCallback is nullptr");
1749         return false;
1750     }
1751 
1752     // check permission
1753     if (!BundlePermissionMgr::VerifyCallingPermissionForAll(Constants::LISTEN_BUNDLE_CHANGE)) {
1754         APP_LOGE("register bundle status callback failed due to lack of permission");
1755         return false;
1756     }
1757 
1758     auto dataMgr = GetDataMgrFromService();
1759     if (dataMgr == nullptr) {
1760         APP_LOGE("DataMgr is nullptr");
1761         return false;
1762     }
1763     return dataMgr->ClearBundleStatusCallback(bundleStatusCallback);
1764 }
1765 
UnregisterBundleStatusCallback()1766 bool BundleMgrHostImpl::UnregisterBundleStatusCallback()
1767 {
1768     APP_LOGD("start UnregisterBundleStatusCallback");
1769     // check permission
1770     if (!BundlePermissionMgr::VerifyCallingPermissionForAll(Constants::LISTEN_BUNDLE_CHANGE)) {
1771         APP_LOGE("register bundle status callback failed due to lack of permission");
1772         return false;
1773     }
1774 
1775     auto dataMgr = GetDataMgrFromService();
1776     if (dataMgr == nullptr) {
1777         APP_LOGE("DataMgr is nullptr");
1778         return false;
1779     }
1780     return dataMgr->UnregisterBundleStatusCallback();
1781 }
1782 
CompileProcessAOT(const std::string &bundleName, const std::string &compileMode, bool isAllBundle, std::vector<std::string> &compileResults)1783 ErrCode BundleMgrHostImpl::CompileProcessAOT(const std::string &bundleName, const std::string &compileMode,
1784     bool isAllBundle, std::vector<std::string> &compileResults)
1785 {
1786     if (!BundlePermissionMgr::VerifyCallingPermissionForAll(Constants::PERMISSION_GET_BUNDLE_INFO_PRIVILEGED)) {
1787         APP_LOGE("verify permission failed");
1788         return ERR_BUNDLE_MANAGER_PERMISSION_DENIED;
1789     }
1790     return AOTHandler::GetInstance().HandleCompile(bundleName, compileMode, isAllBundle, compileResults);
1791 }
1792 
CompileReset(const std::string &bundleName, bool isAllBundle)1793 ErrCode BundleMgrHostImpl::CompileReset(const std::string &bundleName, bool isAllBundle)
1794 {
1795     if (!BundlePermissionMgr::VerifyCallingPermissionForAll(Constants::PERMISSION_GET_BUNDLE_INFO_PRIVILEGED)) {
1796         APP_LOGE("verify permission failed");
1797         return ERR_BUNDLE_MANAGER_PERMISSION_DENIED;
1798     }
1799     AOTHandler::GetInstance().HandleResetAOT(bundleName, isAllBundle);
1800     return ERR_OK;
1801 }
1802 
CopyAp(const std::string &bundleName, bool isAllBundle, std::vector<std::string> &results)1803 ErrCode BundleMgrHostImpl::CopyAp(const std::string &bundleName, bool isAllBundle, std::vector<std::string> &results)
1804 {
1805     if (!BundlePermissionMgr::VerifyCallingPermissionForAll(Constants::PERMISSION_GET_BUNDLE_INFO_PRIVILEGED)) {
1806         APP_LOGE("verify permission failed");
1807         return ERR_BUNDLE_MANAGER_PERMISSION_DENIED;
1808     }
1809     return AOTHandler::GetInstance().HandleCopyAp(bundleName, isAllBundle, results);
1810 }
1811 
DumpInfos( const DumpFlag flag, const std::string &bundleName, int32_t userId, std::string &result)1812 bool BundleMgrHostImpl::DumpInfos(
1813     const DumpFlag flag, const std::string &bundleName, int32_t userId, std::string &result)
1814 {
1815     if (!BundlePermissionMgr::VerifyCallingPermissionForAll(Constants::PERMISSION_GET_BUNDLE_INFO_PRIVILEGED)) {
1816         APP_LOGE("verify permission failed");
1817         return false;
1818     }
1819     bool ret = false;
1820     switch (flag) {
1821         case DumpFlag::DUMP_BUNDLE_LIST: {
1822             ret = DumpAllBundleInfoNames(userId, result);
1823             break;
1824         }
1825         case DumpFlag::DUMP_BUNDLE_INFO: {
1826             ret = DumpBundleInfo(bundleName, userId, result);
1827             break;
1828         }
1829         case DumpFlag::DUMP_SHORTCUT_INFO: {
1830             ret = DumpShortcutInfo(bundleName, userId, result);
1831             break;
1832         }
1833         default:
1834             APP_LOGE("dump flag error");
1835             return false;
1836     }
1837     return ret;
1838 }
1839 
DumpAllBundleInfoNames(int32_t userId, std::string &result)1840 bool BundleMgrHostImpl::DumpAllBundleInfoNames(int32_t userId, std::string &result)
1841 {
1842     APP_LOGD("DumpAllBundleInfoNames begin");
1843     if (userId != Constants::ALL_USERID) {
1844         return DumpAllBundleInfoNamesByUserId(userId, result);
1845     }
1846 
1847     auto userIds = GetExistsCommonUserIs();
1848     for (auto userId : userIds) {
1849         DumpAllBundleInfoNamesByUserId(userId, result);
1850     }
1851 
1852     APP_LOGD("DumpAllBundleInfoNames success");
1853     return true;
1854 }
1855 
DumpAllBundleInfoNamesByUserId(int32_t userId, std::string &result)1856 bool BundleMgrHostImpl::DumpAllBundleInfoNamesByUserId(int32_t userId, std::string &result)
1857 {
1858     APP_LOGI("DumpAllBundleInfoNamesByUserId begin");
1859     auto dataMgr = GetDataMgrFromService();
1860     if (dataMgr == nullptr) {
1861         APP_LOGE("DataMgr is nullptr");
1862         return false;
1863     }
1864 
1865     std::vector<std::string> bundleNames;
1866     if (!dataMgr->GetBundleList(bundleNames, userId)) {
1867         APP_LOGE("get bundle list failed by userId(%{public}d)", userId);
1868         return false;
1869     }
1870 
1871     result.append("ID: ");
1872     result.append(std::to_string(userId));
1873     result.append(":\n");
1874     for (const auto &name : bundleNames) {
1875         result.append("\t");
1876         result.append(name);
1877         result.append("\n");
1878     }
1879     APP_LOGI("DumpAllBundleInfoNamesByUserId successfully");
1880     return true;
1881 }
1882 
DumpBundleInfo( const std::string &bundleName, int32_t userId, std::string &result)1883 bool BundleMgrHostImpl::DumpBundleInfo(
1884     const std::string &bundleName, int32_t userId, std::string &result)
1885 {
1886     APP_LOGD("DumpBundleInfo begin");
1887     std::vector<InnerBundleUserInfo> innerBundleUserInfos;
1888     InnerBundleUserInfo innerBundleUserInfo;
1889     if (!GetBundleUserInfo(bundleName, userId, innerBundleUserInfo) &&
1890         !GetBundleUserInfo(bundleName, Constants::DEFAULT_USERID, innerBundleUserInfo)) {
1891         APP_LOGE("get all userInfos in bundle(%{public}s) failed", bundleName.c_str());
1892         return false;
1893     }
1894     innerBundleUserInfos.emplace_back(innerBundleUserInfo);
1895 
1896     BundleInfo bundleInfo;
1897     if (!GetBundleInfo(bundleName,
1898         BundleFlag::GET_BUNDLE_WITH_ABILITIES |
1899         BundleFlag::GET_BUNDLE_WITH_REQUESTED_PERMISSION |
1900         BundleFlag::GET_BUNDLE_WITH_EXTENSION_INFO |
1901         BundleFlag::GET_BUNDLE_WITH_HASH_VALUE |
1902         BundleFlag::GET_BUNDLE_WITH_MENU |
1903         BundleFlag::GET_BUNDLE_WITH_ROUTER_MAP, bundleInfo, userId)) {
1904         APP_LOGE("get bundleInfo(%{public}s) failed", bundleName.c_str());
1905         return false;
1906     }
1907 
1908     result.append(bundleName);
1909     result.append(":\n");
1910     nlohmann::json jsonObject = bundleInfo;
1911     jsonObject.erase("abilityInfos");
1912     jsonObject.erase("signatureInfo");
1913     jsonObject.erase("extensionAbilityInfo");
1914     jsonObject["applicationInfo"] = bundleInfo.applicationInfo;
1915     jsonObject["userInfo"] = innerBundleUserInfos;
1916     jsonObject["appIdentifier"] = bundleInfo.signatureInfo.appIdentifier;
1917     result.append(jsonObject.dump(Constants::DUMP_INDENT));
1918     result.append("\n");
1919     APP_LOGD("DumpBundleInfo success with bundleName %{public}s", bundleName.c_str());
1920     return true;
1921 }
1922 
DumpShortcutInfo( const std::string &bundleName, int32_t userId, std::string &result)1923 bool BundleMgrHostImpl::DumpShortcutInfo(
1924     const std::string &bundleName, int32_t userId, std::string &result)
1925 {
1926     APP_LOGD("DumpShortcutInfo begin");
1927     std::vector<ShortcutInfo> shortcutInfos;
1928     if (userId == Constants::ALL_USERID) {
1929         std::vector<InnerBundleUserInfo> innerBundleUserInfos;
1930         if (!GetBundleUserInfos(bundleName, innerBundleUserInfos)) {
1931             APP_LOGE("get all userInfos in bundle(%{public}s) failed", bundleName.c_str());
1932             return false;
1933         }
1934         userId = innerBundleUserInfos.begin()->bundleUserInfo.userId;
1935     }
1936 
1937     if (!GetShortcutInfos(bundleName, userId, shortcutInfos)) {
1938         APP_LOGE("get all shortcut info by bundle(%{public}s) failed", bundleName.c_str());
1939         return false;
1940     }
1941 
1942     result.append("shortcuts");
1943     result.append(":\n");
1944     for (const auto &info : shortcutInfos) {
1945         result.append("\"shortcut\"");
1946         result.append(":\n");
1947         nlohmann::json jsonObject = info;
1948         result.append(jsonObject.dump(Constants::DUMP_INDENT));
1949         result.append("\n");
1950     }
1951     APP_LOGD("DumpShortcutInfo success with bundleName %{public}s", bundleName.c_str());
1952     return true;
1953 }
1954 
IsModuleRemovable(const std::string &bundleName, const std::string &moduleName, bool &isRemovable)1955 ErrCode BundleMgrHostImpl::IsModuleRemovable(const std::string &bundleName, const std::string &moduleName,
1956     bool &isRemovable)
1957 {
1958     // check permission
1959     if (!BundlePermissionMgr::IsSystemApp()) {
1960         APP_LOGE("non-system app calling system api");
1961         return ERR_BUNDLE_MANAGER_SYSTEM_API_DENIED;
1962     }
1963     if (!BundlePermissionMgr::VerifyCallingPermissionForAll(Constants::PERMISSION_GET_BUNDLE_INFO_PRIVILEGED)) {
1964         APP_LOGE("IsModuleRemovable failed due to lack of permission");
1965         return ERR_BUNDLE_MANAGER_PERMISSION_DENIED;
1966     }
1967     auto dataMgr = GetDataMgrFromService();
1968     if (dataMgr == nullptr) {
1969         APP_LOGE("DataMgr is nullptr");
1970         return ERR_APPEXECFWK_SERVICE_INTERNAL_ERROR;
1971     }
1972     return dataMgr->IsModuleRemovable(bundleName, moduleName, isRemovable);
1973 }
1974 
SetModuleRemovable(const std::string &bundleName, const std::string &moduleName, bool isEnable)1975 bool BundleMgrHostImpl::SetModuleRemovable(const std::string &bundleName, const std::string &moduleName, bool isEnable)
1976 {
1977     if (!BundlePermissionMgr::VerifyCallingPermissionForAll(Constants::PERMISSION_GET_BUNDLE_INFO_PRIVILEGED)) {
1978         APP_LOGE("SetModuleRemovable failed due to lack of permission");
1979         return false;
1980     }
1981     auto dataMgr = GetDataMgrFromService();
1982     if (dataMgr == nullptr) {
1983         APP_LOGE("DataMgr is nullptr");
1984         return false;
1985     }
1986     return dataMgr->SetModuleRemovable(bundleName, moduleName, isEnable);
1987 }
1988 
GetModuleUpgradeFlag(const std::string &bundleName, const std::string &moduleName)1989 bool BundleMgrHostImpl::GetModuleUpgradeFlag(const std::string &bundleName, const std::string &moduleName)
1990 {
1991     if (!BundlePermissionMgr::VerifyCallingPermissionForAll(Constants::PERMISSION_INSTALL_BUNDLE)) {
1992         APP_LOGE("GetModuleUpgradeFlag failed due to lack of permission");
1993         return false;
1994     }
1995     auto dataMgr = GetDataMgrFromService();
1996     if (dataMgr == nullptr) {
1997         APP_LOGE("DataMgr is nullptr");
1998         return false;
1999     }
2000     return dataMgr->GetModuleUpgradeFlag(bundleName, moduleName);
2001 }
2002 
SetModuleUpgradeFlag(const std::string &bundleName, const std::string &moduleName, int32_t upgradeFlag)2003 ErrCode BundleMgrHostImpl::SetModuleUpgradeFlag(const std::string &bundleName,
2004     const std::string &moduleName, int32_t upgradeFlag)
2005 {
2006     // check permission
2007     if (!BundlePermissionMgr::IsSystemApp()) {
2008         APP_LOGE("non-system app calling system api");
2009         return ERR_BUNDLE_MANAGER_SYSTEM_API_DENIED;
2010     }
2011     if (!BundlePermissionMgr::VerifyCallingPermissionForAll(Constants::PERMISSION_INSTALL_BUNDLE)) {
2012         APP_LOGE("SetModuleUpgradeFlag failed due to lack of permission");
2013         return ERR_BUNDLE_MANAGER_PERMISSION_DENIED;
2014     }
2015     auto dataMgr = GetDataMgrFromService();
2016     if (dataMgr == nullptr) {
2017         APP_LOGE("DataMgr is nullptr");
2018         return ERR_APPEXECFWK_SERVICE_INTERNAL_ERROR;
2019     }
2020     return dataMgr->SetModuleUpgradeFlag(bundleName, moduleName, upgradeFlag);
2021 }
2022 
IsApplicationEnabled(const std::string &bundleName, bool &isEnable)2023 ErrCode BundleMgrHostImpl::IsApplicationEnabled(const std::string &bundleName, bool &isEnable)
2024 {
2025     HITRACE_METER_NAME(HITRACE_TAG_APP, __PRETTY_FUNCTION__);
2026     APP_LOGD("start IsApplicationEnabled, bundleName : %{public}s", bundleName.c_str());
2027     if (!BundlePermissionMgr::IsSystemApp() &&
2028         !BundlePermissionMgr::VerifyCallingBundleSdkVersion(ServiceConstants::API_VERSION_NINE)) {
2029         APP_LOGE("non-system app calling system api");
2030         return ERR_BUNDLE_MANAGER_SYSTEM_API_DENIED;
2031     }
2032     auto dataMgr = GetDataMgrFromService();
2033     if (dataMgr == nullptr) {
2034         APP_LOGE("DataMgr is nullptr");
2035         return ERR_APPEXECFWK_SERVICE_NOT_READY;
2036     }
2037     return dataMgr->IsApplicationEnabled(bundleName, 0, isEnable);
2038 }
2039 
IsCloneApplicationEnabled(const std::string &bundleName, int32_t appIndex, bool &isEnable)2040 ErrCode BundleMgrHostImpl::IsCloneApplicationEnabled(const std::string &bundleName, int32_t appIndex, bool &isEnable)
2041 {
2042     HITRACE_METER_NAME(HITRACE_TAG_APP, __PRETTY_FUNCTION__);
2043     APP_LOGD("start IsCloneApplicationEnabled, bundleName: %{public}s appIndex: %{public}d",
2044         bundleName.c_str(), appIndex);
2045     if (!BundlePermissionMgr::IsSystemApp()) {
2046         APP_LOGE("non-system app calling system api");
2047         return ERR_BUNDLE_MANAGER_SYSTEM_API_DENIED;
2048     }
2049     auto dataMgr = GetDataMgrFromService();
2050     if (dataMgr == nullptr) {
2051         APP_LOGE("DataMgr is nullptr");
2052         return ERR_APPEXECFWK_SERVICE_NOT_READY;
2053     }
2054     return dataMgr->IsApplicationEnabled(bundleName, appIndex, isEnable);
2055 }
2056 
SetApplicationEnabled(const std::string &bundleName, bool isEnable, int32_t userId)2057 ErrCode BundleMgrHostImpl::SetApplicationEnabled(const std::string &bundleName, bool isEnable, int32_t userId)
2058 {
2059     int32_t callingUid = IPCSkeleton::GetCallingUid();
2060     APP_LOGW_NOFUNC("SetApplicationEnabled %{public}s %{public}d %{public}d callingUid:%{public}d",
2061         bundleName.c_str(), isEnable, userId, callingUid);
2062     if (userId == Constants::UNSPECIFIED_USERID) {
2063         userId = BundleUtil::GetUserIdByCallingUid();
2064     }
2065     if (!BundlePermissionMgr::IsSystemApp()) {
2066         APP_LOGE("non-system app calling system api");
2067         return ERR_BUNDLE_MANAGER_SYSTEM_API_DENIED;
2068     }
2069     if (!BundlePermissionMgr::VerifyCallingPermissionForAll(Constants::PERMISSION_CHANGE_ABILITY_ENABLED_STATE)) {
2070         APP_LOGE("verify permission failed");
2071         EventReport::SendComponentStateSysEventForException(bundleName, "", userId, isEnable, 0);
2072         return ERR_BUNDLE_MANAGER_PERMISSION_DENIED;
2073     }
2074     if (!CheckCanSetEnable(bundleName)) {
2075         APP_LOGE("bundle in white-list");
2076         return ERR_BUNDLE_MANAGER_PERMISSION_DENIED;
2077     }
2078     auto dataMgr = GetDataMgrFromService();
2079     if (dataMgr == nullptr) {
2080         APP_LOGE("DataMgr is nullptr");
2081         EventReport::SendComponentStateSysEventForException(bundleName, "", userId, isEnable, 0);
2082         return ERR_APPEXECFWK_SERVICE_NOT_READY;
2083     }
2084 
2085     auto ret = dataMgr->SetApplicationEnabled(bundleName, 0, isEnable, userId);
2086     if (ret != ERR_OK) {
2087         APP_LOGE("Set application(%{public}s) enabled value faile", bundleName.c_str());
2088         EventReport::SendComponentStateSysEventForException(bundleName, "", userId, isEnable, 0);
2089         return ret;
2090     }
2091 
2092     EventReport::SendComponentStateSysEvent(bundleName, "", userId, isEnable, 0);
2093     InnerBundleUserInfo innerBundleUserInfo;
2094     if (!GetBundleUserInfo(bundleName, userId, innerBundleUserInfo)) {
2095         APP_LOGE("Get calling userInfo in bundle(%{public}s) failed", bundleName.c_str());
2096         return ERR_BUNDLE_MANAGER_BUNDLE_NOT_EXIST;
2097     }
2098 
2099     NotifyBundleEvents installRes = {
2100         .isApplicationEnabled = isEnable,
2101         .type = NotifyType::APPLICATION_ENABLE,
2102         .resultCode = ERR_OK,
2103         .accessTokenId = innerBundleUserInfo.accessTokenId,
2104         .uid = innerBundleUserInfo.uid,
2105         .bundleName = bundleName
2106     };
2107     std::string identity = IPCSkeleton::ResetCallingIdentity();
2108     NotifyBundleStatus(installRes);
2109     IPCSkeleton::SetCallingIdentity(identity);
2110     return ERR_OK;
2111 }
2112 
SetCloneApplicationEnabled( const std::string &bundleName, int32_t appIndex, bool isEnable, int32_t userId)2113 ErrCode BundleMgrHostImpl::SetCloneApplicationEnabled(
2114     const std::string &bundleName, int32_t appIndex, bool isEnable, int32_t userId)
2115 {
2116     APP_LOGI("SetCloneApplicationEnabled param %{public}s %{public}d %{public}d %{public}d",
2117         bundleName.c_str(), appIndex, isEnable, userId);
2118     if (!BundlePermissionMgr::IsSystemApp()) {
2119         APP_LOGE("non-system app calling system api");
2120         return ERR_BUNDLE_MANAGER_SYSTEM_API_DENIED;
2121     }
2122     if (!BundlePermissionMgr::VerifyCallingPermissionForAll(Constants::PERMISSION_CHANGE_ABILITY_ENABLED_STATE)) {
2123         APP_LOGE("verify permission failed");
2124         EventReport::SendComponentStateSysEventForException(bundleName, "", userId, isEnable, appIndex);
2125         return ERR_BUNDLE_MANAGER_PERMISSION_DENIED;
2126     }
2127     if (userId == Constants::UNSPECIFIED_USERID) {
2128         userId = BundleUtil::GetUserIdByCallingUid();
2129     }
2130     APP_LOGD("verify permission success, begin to SetCloneApplicationEnabled");
2131     auto dataMgr = GetDataMgrFromService();
2132     if (dataMgr == nullptr) {
2133         APP_LOGE("DataMgr is nullptr");
2134         EventReport::SendComponentStateSysEventForException(bundleName, "", userId, isEnable, appIndex);
2135         return ERR_APPEXECFWK_SERVICE_NOT_READY;
2136     }
2137 
2138     auto ret = dataMgr->SetApplicationEnabled(bundleName, appIndex, isEnable, userId);
2139     if (ret != ERR_OK) {
2140         APP_LOGE("Set application(%{public}s) enabled value fail", bundleName.c_str());
2141         EventReport::SendComponentStateSysEventForException(bundleName, "", userId, isEnable, appIndex);
2142         return ret;
2143     }
2144 
2145     EventReport::SendComponentStateSysEvent(bundleName, "", userId, isEnable, appIndex);
2146     InnerBundleUserInfo innerBundleUserInfo;
2147     if (!GetBundleUserInfo(bundleName, userId, innerBundleUserInfo)) {
2148         APP_LOGE("Get calling userInfo in bundle(%{public}s) failed", bundleName.c_str());
2149         return ERR_BUNDLE_MANAGER_BUNDLE_NOT_EXIST;
2150     }
2151 
2152     NotifyBundleEvents installRes = {
2153         .type = NotifyType::APPLICATION_ENABLE,
2154         .resultCode = ERR_OK,
2155         .accessTokenId = innerBundleUserInfo.accessTokenId,
2156         .uid = innerBundleUserInfo.uid,
2157         .appIndex = appIndex,
2158         .bundleName = bundleName
2159     };
2160     NotifyBundleStatus(installRes);
2161     APP_LOGD("SetCloneApplicationEnabled finish");
2162     return ERR_OK;
2163 }
2164 
IsAbilityEnabled(const AbilityInfo &abilityInfo, bool &isEnable)2165 ErrCode BundleMgrHostImpl::IsAbilityEnabled(const AbilityInfo &abilityInfo, bool &isEnable)
2166 {
2167     HITRACE_METER_NAME(HITRACE_TAG_APP, __PRETTY_FUNCTION__);
2168     APP_LOGD("start IsAbilityEnabled");
2169     if (!BundlePermissionMgr::IsSystemApp() &&
2170         !BundlePermissionMgr::VerifyCallingBundleSdkVersion(ServiceConstants::API_VERSION_NINE)) {
2171         APP_LOGE("non-system app calling system api");
2172         return ERR_BUNDLE_MANAGER_SYSTEM_API_DENIED;
2173     }
2174     auto dataMgr = GetDataMgrFromService();
2175     if (dataMgr == nullptr) {
2176         APP_LOGE("DataMgr is nullptr");
2177         return ERR_APPEXECFWK_SERVICE_NOT_READY;
2178     }
2179     return dataMgr->IsAbilityEnabled(abilityInfo, 0, isEnable);
2180 }
2181 
IsCloneAbilityEnabled(const AbilityInfo &abilityInfo, int32_t appIndex, bool &isEnable)2182 ErrCode BundleMgrHostImpl::IsCloneAbilityEnabled(const AbilityInfo &abilityInfo, int32_t appIndex, bool &isEnable)
2183 {
2184     HITRACE_METER_NAME(HITRACE_TAG_APP, __PRETTY_FUNCTION__);
2185     APP_LOGD("start IsCloneAbilityEnabled");
2186     if (!BundlePermissionMgr::IsSystemApp()) {
2187         APP_LOGE("non-system app calling system api");
2188         return ERR_BUNDLE_MANAGER_SYSTEM_API_DENIED;
2189     }
2190     auto dataMgr = GetDataMgrFromService();
2191     if (dataMgr == nullptr) {
2192         APP_LOGE("DataMgr is nullptr");
2193         return ERR_APPEXECFWK_SERVICE_NOT_READY;
2194     }
2195     return dataMgr->IsAbilityEnabled(abilityInfo, appIndex, isEnable);
2196 }
2197 
SetAbilityEnabled(const AbilityInfo &abilityInfo, bool isEnabled, int32_t userId)2198 ErrCode BundleMgrHostImpl::SetAbilityEnabled(const AbilityInfo &abilityInfo, bool isEnabled, int32_t userId)
2199 {
2200     int32_t callingUid = IPCSkeleton::GetCallingUid();
2201     APP_LOGW_NOFUNC("SetAbilityEnabled %{public}s %{public}d %{public}d callingUid:%{public}d",
2202         abilityInfo.name.c_str(), isEnabled, userId, callingUid);
2203     if (userId == Constants::UNSPECIFIED_USERID) {
2204         userId = BundleUtil::GetUserIdByCallingUid();
2205     }
2206     if (!BundlePermissionMgr::IsSystemApp()) {
2207         APP_LOGE("non-system app calling system api");
2208         return ERR_BUNDLE_MANAGER_SYSTEM_API_DENIED;
2209     }
2210     if (!BundlePermissionMgr::VerifyCallingPermissionForAll(Constants::PERMISSION_CHANGE_ABILITY_ENABLED_STATE)) {
2211         APP_LOGE("verify permission failed");
2212         EventReport::SendComponentStateSysEventForException(abilityInfo.bundleName, abilityInfo.name,
2213             userId, isEnabled, 0);
2214         return ERR_BUNDLE_MANAGER_PERMISSION_DENIED;
2215     }
2216     if (!CheckCanSetEnable(abilityInfo.bundleName)) {
2217         APP_LOGE("bundle in white-list");
2218         return ERR_BUNDLE_MANAGER_PERMISSION_DENIED;
2219     }
2220     auto dataMgr = GetDataMgrFromService();
2221     if (dataMgr == nullptr) {
2222         APP_LOGE("DataMgr is nullptr");
2223         EventReport::SendComponentStateSysEventForException(abilityInfo.bundleName, abilityInfo.name,
2224             userId, isEnabled, 0);
2225         return ERR_APPEXECFWK_SERVICE_NOT_READY;
2226     }
2227     auto ret = dataMgr->SetAbilityEnabled(abilityInfo, 0, isEnabled, userId);
2228     if (ret != ERR_OK) {
2229         APP_LOGE("Set ability(%{public}s) enabled value failed", abilityInfo.bundleName.c_str());
2230         EventReport::SendComponentStateSysEventForException(abilityInfo.bundleName, abilityInfo.name,
2231             userId, isEnabled, 0);
2232         return ret;
2233     }
2234     EventReport::SendComponentStateSysEvent(abilityInfo.bundleName, abilityInfo.name, userId, isEnabled, 0);
2235     InnerBundleUserInfo innerBundleUserInfo;
2236     if (!GetBundleUserInfo(abilityInfo.bundleName, userId, innerBundleUserInfo)) {
2237         APP_LOGE("Get calling userInfo in bundle(%{public}s) failed", abilityInfo.bundleName.c_str());
2238         return ERR_BUNDLE_MANAGER_BUNDLE_NOT_EXIST;
2239     }
2240     NotifyBundleEvents installRes = {
2241         .type = NotifyType::APPLICATION_ENABLE,
2242         .resultCode = ERR_OK,
2243         .accessTokenId = innerBundleUserInfo.accessTokenId,
2244         .uid = innerBundleUserInfo.uid,
2245         .bundleName = abilityInfo.bundleName,
2246         .abilityName = abilityInfo.name
2247     };
2248     NotifyBundleStatus(installRes);
2249     return ERR_OK;
2250 }
2251 
SetCloneAbilityEnabled(const AbilityInfo &abilityInfo, int32_t appIndex, bool isEnabled, int32_t userId)2252 ErrCode BundleMgrHostImpl::SetCloneAbilityEnabled(const AbilityInfo &abilityInfo,
2253     int32_t appIndex, bool isEnabled, int32_t userId)
2254 {
2255     APP_LOGD("start SetCloneAbilityEnabled");
2256     if (!BundlePermissionMgr::IsSystemApp()) {
2257         APP_LOGE("non-system app calling system api");
2258         return ERR_BUNDLE_MANAGER_SYSTEM_API_DENIED;
2259     }
2260     if (!BundlePermissionMgr::VerifyCallingPermissionForAll(Constants::PERMISSION_CHANGE_ABILITY_ENABLED_STATE)) {
2261         APP_LOGE("verify permission failed");
2262         EventReport::SendComponentStateSysEventForException(abilityInfo.bundleName, abilityInfo.name,
2263             userId, isEnabled, appIndex);
2264         return ERR_BUNDLE_MANAGER_PERMISSION_DENIED;
2265     }
2266     if (userId == Constants::UNSPECIFIED_USERID) {
2267         userId = BundleUtil::GetUserIdByCallingUid();
2268     }
2269     auto dataMgr = GetDataMgrFromService();
2270     if (dataMgr == nullptr) {
2271         APP_LOGE("DataMgr is nullptr");
2272         EventReport::SendComponentStateSysEventForException(abilityInfo.bundleName, abilityInfo.name,
2273             userId, isEnabled, appIndex);
2274         return ERR_APPEXECFWK_SERVICE_NOT_READY;
2275     }
2276     auto ret = dataMgr->SetAbilityEnabled(abilityInfo, appIndex, isEnabled, userId);
2277     if (ret != ERR_OK) {
2278         APP_LOGE("Set ability(%{public}s) enabled value failed", abilityInfo.bundleName.c_str());
2279         EventReport::SendComponentStateSysEventForException(abilityInfo.bundleName, abilityInfo.name,
2280             userId, isEnabled, appIndex);
2281         return ret;
2282     }
2283     EventReport::SendComponentStateSysEvent(abilityInfo.bundleName, abilityInfo.name, userId, isEnabled, appIndex);
2284     InnerBundleUserInfo innerBundleUserInfo;
2285     if (!GetBundleUserInfo(abilityInfo.bundleName, userId, innerBundleUserInfo)) {
2286         APP_LOGE("Get calling userInfo in bundle(%{public}s) failed", abilityInfo.bundleName.c_str());
2287         return ERR_BUNDLE_MANAGER_BUNDLE_NOT_EXIST;
2288     }
2289     NotifyBundleEvents installRes = {
2290         .type = NotifyType::APPLICATION_ENABLE,
2291         .resultCode = ERR_OK,
2292         .accessTokenId = innerBundleUserInfo.accessTokenId,
2293         .uid = innerBundleUserInfo.uid,
2294         .appIndex = appIndex,
2295         .bundleName = abilityInfo.bundleName,
2296         .abilityName = abilityInfo.name
2297     };
2298     NotifyBundleStatus(installRes);
2299     return ERR_OK;
2300 }
2301 
GetBundleInstaller()2302 sptr<IBundleInstaller> BundleMgrHostImpl::GetBundleInstaller()
2303 {
2304     HITRACE_METER_NAME(HITRACE_TAG_APP, __PRETTY_FUNCTION__);
2305     APP_LOGD("start GetBundleInstaller");
2306     if (!VerifySystemApi()) {
2307         APP_LOGE("non-system app calling system api");
2308         return nullptr;
2309     }
2310     return DelayedSingleton<BundleMgrService>::GetInstance()->GetBundleInstaller();
2311 }
2312 
GetBundleUserMgr()2313 sptr<IBundleUserMgr> BundleMgrHostImpl::GetBundleUserMgr()
2314 {
2315     int32_t callingUid = IPCSkeleton::GetCallingUid();
2316     if (callingUid != ServiceConstants::ACCOUNT_UID) {
2317         APP_LOGE("invalid calling uid %{public}d to GetbundleUserMgr", callingUid);
2318         return nullptr;
2319     }
2320     return DelayedSingleton<BundleMgrService>::GetInstance()->GetBundleUserMgr();
2321 }
2322 
GetVerifyManager()2323 sptr<IVerifyManager> BundleMgrHostImpl::GetVerifyManager()
2324 {
2325     return DelayedSingleton<BundleMgrService>::GetInstance()->GetVerifyManager();
2326 }
2327 
GetExtendResourceManager()2328 sptr<IExtendResourceManager> BundleMgrHostImpl::GetExtendResourceManager()
2329 {
2330     return DelayedSingleton<BundleMgrService>::GetInstance()->GetExtendResourceManager();
2331 }
2332 
GetAllFormsInfo(std::vector<FormInfo> &formInfos)2333 bool BundleMgrHostImpl::GetAllFormsInfo(std::vector<FormInfo> &formInfos)
2334 {
2335     APP_LOGD("start GetAllFormsInfo");
2336     if (!BundlePermissionMgr::VerifyCallingPermissionForAll(Constants::PERMISSION_GET_BUNDLE_INFO_PRIVILEGED)) {
2337         APP_LOGE("verify permission failed");
2338         return false;
2339     }
2340     auto dataMgr = GetDataMgrFromService();
2341     if (dataMgr == nullptr) {
2342         APP_LOGE("DataMgr is nullptr");
2343         return false;
2344     }
2345     return dataMgr->GetAllFormsInfo(formInfos);
2346 }
2347 
GetFormsInfoByApp(const std::string &bundleName, std::vector<FormInfo> &formInfos)2348 bool BundleMgrHostImpl::GetFormsInfoByApp(const std::string &bundleName, std::vector<FormInfo> &formInfos)
2349 {
2350     APP_LOGD("start GetFormsInfoByApp, bundleName : %{public}s", bundleName.c_str());
2351     if (!BundlePermissionMgr::VerifyCallingPermissionForAll(Constants::PERMISSION_GET_BUNDLE_INFO_PRIVILEGED) &&
2352         !BundlePermissionMgr::IsBundleSelfCalling(bundleName)) {
2353         APP_LOGE("verify permission failed");
2354         return false;
2355     }
2356     auto dataMgr = GetDataMgrFromService();
2357     if (dataMgr == nullptr) {
2358         APP_LOGE("DataMgr is nullptr");
2359         return false;
2360     }
2361     return dataMgr->GetFormsInfoByApp(bundleName, formInfos);
2362 }
2363 
GetFormsInfoByModule( const std::string &bundleName, const std::string &moduleName, std::vector<FormInfo> &formInfos)2364 bool BundleMgrHostImpl::GetFormsInfoByModule(
2365     const std::string &bundleName, const std::string &moduleName, std::vector<FormInfo> &formInfos)
2366 {
2367     APP_LOGD("start GetFormsInfoByModule, bundleName : %{public}s, moduleName : %{public}s",
2368         bundleName.c_str(), moduleName.c_str());
2369     if (!BundlePermissionMgr::VerifyCallingPermissionForAll(Constants::PERMISSION_GET_BUNDLE_INFO_PRIVILEGED) &&
2370         !BundlePermissionMgr::IsBundleSelfCalling(bundleName)) {
2371         APP_LOGE("verify permission failed");
2372         return false;
2373     }
2374     auto dataMgr = GetDataMgrFromService();
2375     if (dataMgr == nullptr) {
2376         APP_LOGE("DataMgr is nullptr");
2377         return false;
2378     }
2379     return dataMgr->GetFormsInfoByModule(bundleName, moduleName, formInfos);
2380 }
2381 
GetShortcutInfos( const std::string &bundleName, std::vector<ShortcutInfo> &shortcutInfos)2382 bool BundleMgrHostImpl::GetShortcutInfos(
2383     const std::string &bundleName, std::vector<ShortcutInfo> &shortcutInfos)
2384 {
2385     int32_t currentUserId = AccountHelper::GetCurrentActiveUserId();
2386     APP_LOGD("current active userId is %{public}d", currentUserId);
2387     if (currentUserId == Constants::INVALID_USERID) {
2388         APP_LOGW("current userId is invalid");
2389         return false;
2390     }
2391 
2392     return GetShortcutInfos(bundleName, currentUserId, shortcutInfos);
2393 }
2394 
GetShortcutInfos( const std::string &bundleName, int32_t userId, std::vector<ShortcutInfo> &shortcutInfos)2395 bool BundleMgrHostImpl::GetShortcutInfos(
2396     const std::string &bundleName, int32_t userId, std::vector<ShortcutInfo> &shortcutInfos)
2397 {
2398     APP_LOGD("start GetShortcutInfos, bundleName : %{public}s, userId : %{public}d", bundleName.c_str(), userId);
2399     // API9 need to be system app otherwise return empty data
2400     if (!BundlePermissionMgr::IsSystemApp() &&
2401         !BundlePermissionMgr::VerifyCallingBundleSdkVersion(ServiceConstants::API_VERSION_NINE)) {
2402         APP_LOGD("non-system app calling system api");
2403         return true;
2404     }
2405     if (!BundlePermissionMgr::VerifyCallingPermissionForAll(Constants::PERMISSION_GET_BUNDLE_INFO_PRIVILEGED)) {
2406         APP_LOGE("verify permission failed");
2407         return false;
2408     }
2409     APP_LOGD("verify permission success, begin to GetShortcutInfos");
2410     auto dataMgr = GetDataMgrFromService();
2411     if (dataMgr == nullptr) {
2412         APP_LOGE("DataMgr is nullptr");
2413         return false;
2414     }
2415     return dataMgr->GetShortcutInfos(bundleName, userId, shortcutInfos);
2416 }
2417 
GetShortcutInfoV9(const std::string &bundleName, std::vector<ShortcutInfo> &shortcutInfos, int32_t userId)2418 ErrCode BundleMgrHostImpl::GetShortcutInfoV9(const std::string &bundleName,
2419     std::vector<ShortcutInfo> &shortcutInfos, int32_t userId)
2420 {
2421     if (!BundlePermissionMgr::IsSystemApp()) {
2422         APP_LOGE("non-system app calling system api");
2423         return ERR_BUNDLE_MANAGER_SYSTEM_API_DENIED;
2424     }
2425     if (!BundlePermissionMgr::VerifyCallingPermissionsForAll({Constants::PERMISSION_GET_BUNDLE_INFO_PRIVILEGED,
2426         Constants::PERMISSION_GET_BUNDLE_INFO}) &&
2427         !BundlePermissionMgr::IsBundleSelfCalling(bundleName)) {
2428         APP_LOGE("verify permission failed");
2429         return ERR_BUNDLE_MANAGER_PERMISSION_DENIED;
2430     }
2431     auto dataMgr = GetDataMgrFromService();
2432     if (dataMgr == nullptr) {
2433         APP_LOGE("DataMgr is nullptr");
2434         return ERR_BUNDLE_MANAGER_INTERNAL_ERROR;
2435     }
2436     return dataMgr->GetShortcutInfoV9(bundleName, userId, shortcutInfos);
2437 }
2438 
GetAllCommonEventInfo(const std::string &eventKey, std::vector<CommonEventInfo> &commonEventInfos)2439 bool BundleMgrHostImpl::GetAllCommonEventInfo(const std::string &eventKey,
2440     std::vector<CommonEventInfo> &commonEventInfos)
2441 {
2442     APP_LOGD("start GetAllCommonEventInfo, eventKey : %{public}s", eventKey.c_str());
2443     if (!BundlePermissionMgr::VerifyCallingPermissionForAll(Constants::PERMISSION_GET_BUNDLE_INFO_PRIVILEGED)) {
2444         APP_LOGE("verify permission failed");
2445         return false;
2446     }
2447     auto dataMgr = GetDataMgrFromService();
2448     if (dataMgr == nullptr) {
2449         APP_LOGE("DataMgr is nullptr");
2450         return false;
2451     }
2452     return dataMgr->GetAllCommonEventInfo(eventKey, commonEventInfos);
2453 }
2454 
GetDistributedBundleInfo(const std::string &networkId, const std::string &bundleName, DistributedBundleInfo &distributedBundleInfo)2455 bool BundleMgrHostImpl::GetDistributedBundleInfo(const std::string &networkId, const std::string &bundleName,
2456     DistributedBundleInfo &distributedBundleInfo)
2457 {
2458     APP_LOGD("start GetDistributedBundleInfo, bundleName : %{public}s", bundleName.c_str());
2459 #ifdef DISTRIBUTED_BUNDLE_FRAMEWORK
2460     if (!BundlePermissionMgr::IsSystemApp()) {
2461         APP_LOGE("Non-system app calling system api");
2462         return ERR_BUNDLE_MANAGER_SYSTEM_API_DENIED;
2463     }
2464     if (!BundlePermissionMgr::VerifyCallingPermissionsForAll({Constants::PERMISSION_GET_BUNDLE_INFO_PRIVILEGED,
2465         Constants::PERMISSION_GET_BUNDLE_INFO}) &&
2466         !BundlePermissionMgr::IsBundleSelfCalling(bundleName)) {
2467         APP_LOGE("verify permission failed");
2468         return false;
2469     }
2470     auto distributedBundleMgr = GetDistributedBundleMgrService();
2471     if (distributedBundleMgr == nullptr) {
2472         APP_LOGE("DistributedBundleMgrService is nullptr");
2473         return false;
2474     }
2475     return distributedBundleMgr->GetDistributedBundleInfo(networkId, bundleName, distributedBundleInfo);
2476 #else
2477     APP_LOGW("DISTRIBUTED_BUNDLE_FRAMEWORK is false");
2478     return false;
2479 #endif
2480 }
2481 
QueryExtensionAbilityInfos(const Want &want, const int32_t &flag, const int32_t &userId, std::vector<ExtensionAbilityInfo> &extensionInfos)2482 bool BundleMgrHostImpl::QueryExtensionAbilityInfos(const Want &want, const int32_t &flag, const int32_t &userId,
2483     std::vector<ExtensionAbilityInfo> &extensionInfos)
2484 {
2485     LOG_D(BMS_TAG_QUERY, "QueryExtensionAbilityInfos without type begin");
2486     // API9 need to be system app, otherwise return empty data
2487     if (!BundlePermissionMgr::IsSystemApp() &&
2488         !BundlePermissionMgr::VerifyCallingBundleSdkVersion(ServiceConstants::API_VERSION_NINE)) {
2489         LOG_D(BMS_TAG_QUERY, "non-system app calling system api");
2490         return true;
2491     }
2492     if (!BundlePermissionMgr::VerifyCallingPermissionsForAll({Constants::PERMISSION_GET_BUNDLE_INFO_PRIVILEGED,
2493         Constants::PERMISSION_GET_BUNDLE_INFO}) &&
2494         !BundlePermissionMgr::IsBundleSelfCalling(want.GetElement().GetBundleName())) {
2495         LOG_E(BMS_TAG_QUERY, "verify permission failed");
2496         return false;
2497     }
2498     LOG_D(BMS_TAG_QUERY, "want uri is %{private}s", want.GetUriString().c_str());
2499     auto dataMgr = GetDataMgrFromService();
2500     if (dataMgr == nullptr) {
2501         LOG_E(BMS_TAG_QUERY, "DataMgr is nullptr");
2502         return false;
2503     }
2504     (void)dataMgr->QueryExtensionAbilityInfos(want, flag, userId, extensionInfos);
2505     dataMgr->QueryAllCloneExtensionInfos(want, flag, userId, extensionInfos);
2506     if (extensionInfos.empty()) {
2507         LOG_E(BMS_TAG_QUERY, "no valid extension info can be inquired");
2508         return false;
2509     }
2510     return true;
2511 }
2512 
QueryExtensionAbilityInfosV9(const Want &want, int32_t flags, int32_t userId, std::vector<ExtensionAbilityInfo> &extensionInfos)2513 ErrCode BundleMgrHostImpl::QueryExtensionAbilityInfosV9(const Want &want, int32_t flags, int32_t userId,
2514     std::vector<ExtensionAbilityInfo> &extensionInfos)
2515 {
2516     HITRACE_METER_NAME(HITRACE_TAG_APP, __PRETTY_FUNCTION__);
2517     LOG_D(BMS_TAG_QUERY, "QueryExtensionAbilityInfosV9 without type begin");
2518     if (!BundlePermissionMgr::IsSystemApp()) {
2519         LOG_E(BMS_TAG_QUERY, "non-system app calling system api");
2520         return ERR_BUNDLE_MANAGER_SYSTEM_API_DENIED;
2521     }
2522     if (!BundlePermissionMgr::VerifyCallingPermissionsForAll({Constants::PERMISSION_GET_BUNDLE_INFO_PRIVILEGED,
2523         Constants::PERMISSION_GET_BUNDLE_INFO}) &&
2524         !BundlePermissionMgr::IsBundleSelfCalling(want.GetElement().GetBundleName())) {
2525         LOG_E(BMS_TAG_QUERY, "verify permission failed");
2526         return ERR_BUNDLE_MANAGER_PERMISSION_DENIED;
2527     }
2528     LOG_D(BMS_TAG_QUERY, "want uri is %{private}s", want.GetUriString().c_str());
2529     auto dataMgr = GetDataMgrFromService();
2530     if (dataMgr == nullptr) {
2531         LOG_E(BMS_TAG_QUERY, "DataMgr is nullptr");
2532         return ERR_BUNDLE_MANAGER_INTERNAL_ERROR;
2533     }
2534     ErrCode ret = dataMgr->QueryExtensionAbilityInfosV9(want, flags, userId, extensionInfos);
2535     dataMgr->QueryAllCloneExtensionInfosV9(want, flags, userId, extensionInfos);
2536 
2537     if (extensionInfos.empty()) {
2538         if (ret != ERR_OK) {
2539             LOG_E(BMS_TAG_QUERY, "query extension ability fail, %{public}d", ret);
2540             return ret;
2541         }
2542         LOG_E(BMS_TAG_QUERY, "no valid extension info can be inquired");
2543         return ERR_BUNDLE_MANAGER_ABILITY_NOT_EXIST;
2544     }
2545     return ERR_OK;
2546 }
2547 
QueryExtensionAbilityInfos(const Want &want, const ExtensionAbilityType &extensionType, const int32_t &flag, const int32_t &userId, std::vector<ExtensionAbilityInfo> &extensionInfos)2548 bool BundleMgrHostImpl::QueryExtensionAbilityInfos(const Want &want, const ExtensionAbilityType &extensionType,
2549     const int32_t &flag, const int32_t &userId, std::vector<ExtensionAbilityInfo> &extensionInfos)
2550 {
2551     LOG_D(BMS_TAG_QUERY, "QueryExtensionAbilityInfos begin");
2552     // API9 need to be system app, otherwise return empty data
2553     if (!BundlePermissionMgr::IsSystemApp() &&
2554         !BundlePermissionMgr::VerifyCallingBundleSdkVersion(ServiceConstants::API_VERSION_NINE)) {
2555         LOG_D(BMS_TAG_QUERY, "non-system app calling system api");
2556         return true;
2557     }
2558     if (!BundlePermissionMgr::VerifyCallingPermissionsForAll({Constants::PERMISSION_GET_BUNDLE_INFO_PRIVILEGED,
2559         Constants::PERMISSION_GET_BUNDLE_INFO}) &&
2560         !BundlePermissionMgr::IsBundleSelfCalling(want.GetElement().GetBundleName())) {
2561         LOG_E(BMS_TAG_QUERY, "verify permission failed");
2562         return false;
2563     }
2564     auto dataMgr = GetDataMgrFromService();
2565     if (dataMgr == nullptr) {
2566         LOG_E(BMS_TAG_QUERY, "DataMgr is nullptr");
2567         return false;
2568     }
2569     std::vector<ExtensionAbilityInfo> infos;
2570     (void)dataMgr->QueryExtensionAbilityInfos(want, flag, userId, infos);
2571     dataMgr->QueryAllCloneExtensionInfos(want, flag, userId, infos);
2572 
2573     for_each(infos.begin(), infos.end(), [&extensionType, &extensionInfos](const auto &info)->decltype(auto) {
2574         LOG_D(BMS_TAG_QUERY, "QueryExtensionAbilityInfos extensionType:%{public}d info.type:%{public}d",
2575             static_cast<int32_t>(extensionType), static_cast<int32_t>(info.type));
2576         if (extensionType == info.type) {
2577             extensionInfos.emplace_back(info);
2578         }
2579     });
2580     if (extensionInfos.empty()) {
2581         LOG_E(BMS_TAG_QUERY, "no valid extension info can be inquired");
2582         return false;
2583     }
2584     return true;
2585 }
2586 
QueryExtensionAbilityInfosV9(const Want &want, const ExtensionAbilityType &extensionType, int32_t flags, int32_t userId, std::vector<ExtensionAbilityInfo> &extensionInfos)2587 ErrCode BundleMgrHostImpl::QueryExtensionAbilityInfosV9(const Want &want, const ExtensionAbilityType &extensionType,
2588     int32_t flags, int32_t userId, std::vector<ExtensionAbilityInfo> &extensionInfos)
2589 {
2590     HITRACE_METER_NAME(HITRACE_TAG_APP, __PRETTY_FUNCTION__);
2591     LOG_D(BMS_TAG_QUERY, "QueryExtensionAbilityInfosV9 begin");
2592     if (!BundlePermissionMgr::IsSystemApp()) {
2593         LOG_E(BMS_TAG_QUERY, "non-system app calling system api");
2594         return ERR_BUNDLE_MANAGER_SYSTEM_API_DENIED;
2595     }
2596     if (!BundlePermissionMgr::VerifyCallingPermissionsForAll({Constants::PERMISSION_GET_BUNDLE_INFO_PRIVILEGED,
2597         Constants::PERMISSION_GET_BUNDLE_INFO}) &&
2598         !BundlePermissionMgr::IsBundleSelfCalling(want.GetElement().GetBundleName())) {
2599         LOG_E(BMS_TAG_QUERY, "verify permission failed");
2600         return ERR_BUNDLE_MANAGER_PERMISSION_DENIED;
2601     }
2602     auto dataMgr = GetDataMgrFromService();
2603     if (dataMgr == nullptr) {
2604         LOG_E(BMS_TAG_QUERY, "DataMgr is nullptr");
2605         return ERR_BUNDLE_MANAGER_INTERNAL_ERROR;
2606     }
2607     std::vector<ExtensionAbilityInfo> infos;
2608     ErrCode ret = dataMgr->QueryExtensionAbilityInfosV9(want, flags, userId, infos);
2609     dataMgr->QueryAllCloneExtensionInfosV9(want, flags, userId, infos);
2610     for_each(infos.begin(), infos.end(), [&extensionType, &extensionInfos](const auto &info)->decltype(auto) {
2611         LOG_D(BMS_TAG_QUERY, "QueryExtensionAbilityInfosV9 extensionType:%{public}d info.type:%{public}d",
2612             static_cast<int32_t>(extensionType), static_cast<int32_t>(info.type));
2613         if (extensionType == info.type) {
2614             extensionInfos.emplace_back(info);
2615         }
2616     });
2617     if (extensionInfos.empty()) {
2618         if (ret != ERR_OK) {
2619             LOG_E(BMS_TAG_QUERY, "query extension ability fail, %{public}d", ret);
2620             return ret;
2621         }
2622         LOG_E(BMS_TAG_QUERY, "no valid extension info can be inquired");
2623         return ERR_BUNDLE_MANAGER_ABILITY_NOT_EXIST;
2624     }
2625     return ERR_OK;
2626 }
2627 
QueryExtensionAbilityInfos(const ExtensionAbilityType &extensionType, const int32_t &userId, std::vector<ExtensionAbilityInfo> &extensionInfos)2628 bool BundleMgrHostImpl::QueryExtensionAbilityInfos(const ExtensionAbilityType &extensionType, const int32_t &userId,
2629     std::vector<ExtensionAbilityInfo> &extensionInfos)
2630 {
2631     LOG_D(BMS_TAG_QUERY, "QueryExtensionAbilityInfos with type begin");
2632     // API9 need to be system app, otherwise return empty data
2633     if (!BundlePermissionMgr::IsSystemApp() &&
2634         !BundlePermissionMgr::VerifyCallingBundleSdkVersion(ServiceConstants::API_VERSION_NINE)) {
2635         LOG_D(BMS_TAG_QUERY, "non-system app calling system api");
2636         return true;
2637     }
2638     if (!BundlePermissionMgr::VerifyCallingPermissionsForAll({Constants::PERMISSION_GET_BUNDLE_INFO_PRIVILEGED,
2639         Constants::PERMISSION_GET_BUNDLE_INFO})) {
2640         LOG_E(BMS_TAG_QUERY, "verify permission failed");
2641         return false;
2642     }
2643     auto dataMgr = GetDataMgrFromService();
2644     if (dataMgr == nullptr) {
2645         LOG_E(BMS_TAG_QUERY, "DataMgr is nullptr");
2646         return false;
2647     }
2648     bool ret = dataMgr->QueryExtensionAbilityInfos(extensionType, userId, extensionInfos);
2649     if (!ret) {
2650         LOG_E(BMS_TAG_QUERY, "QueryExtensionAbilityInfos is failed");
2651         return false;
2652     }
2653 
2654     if (extensionInfos.empty()) {
2655         LOG_E(BMS_TAG_QUERY, "no valid extension info can be inquired");
2656         return false;
2657     }
2658     return true;
2659 }
2660 
GetDataMgrFromService()2661 const std::shared_ptr<BundleDataMgr> BundleMgrHostImpl::GetDataMgrFromService()
2662 {
2663     return DelayedSingleton<BundleMgrService>::GetInstance()->GetDataMgr();
2664 }
2665 
2666 #ifdef DISTRIBUTED_BUNDLE_FRAMEWORK
GetDistributedBundleMgrService()2667 const OHOS::sptr<IDistributedBms> BundleMgrHostImpl::GetDistributedBundleMgrService()
2668 {
2669     auto saMgr = OHOS::SystemAbilityManagerClient::GetInstance().GetSystemAbilityManager();
2670     if (saMgr == nullptr) {
2671         APP_LOGE("saMgr is nullptr");
2672         return nullptr;
2673     }
2674     OHOS::sptr<OHOS::IRemoteObject> remoteObject =
2675         saMgr->CheckSystemAbility(OHOS::DISTRIBUTED_BUNDLE_MGR_SERVICE_SYS_ABILITY_ID);
2676     return OHOS::iface_cast<IDistributedBms>(remoteObject);
2677 }
2678 #endif
2679 
2680 #ifdef BUNDLE_FRAMEWORK_FREE_INSTALL
GetConnectAbilityMgrFromService()2681 const std::shared_ptr<BundleConnectAbilityMgr> BundleMgrHostImpl::GetConnectAbilityMgrFromService()
2682 {
2683     int32_t currentUserId = AccountHelper::GetCurrentActiveUserId();
2684     return DelayedSingleton<BundleMgrService>::GetInstance()->GetConnectAbility(currentUserId);
2685 }
2686 #endif
2687 
GetExistsCommonUserIs()2688 std::set<int32_t> BundleMgrHostImpl::GetExistsCommonUserIs()
2689 {
2690     std::set<int32_t> userIds;
2691     auto dataMgr = GetDataMgrFromService();
2692     if (dataMgr == nullptr) {
2693         APP_LOGE("Get dataMgr shared_ptr nullptr");
2694         return userIds;
2695     }
2696 
2697     for (auto userId : dataMgr->GetAllUser()) {
2698         if (userId >= Constants::START_USERID) {
2699             userIds.insert(userId);
2700         }
2701     }
2702     return userIds;
2703 }
2704 
GetAppPrivilegeLevel(const std::string &bundleName, int32_t userId)2705 std::string BundleMgrHostImpl::GetAppPrivilegeLevel(const std::string &bundleName, int32_t userId)
2706 {
2707     APP_LOGD("start GetAppPrivilegeLevel");
2708     if (!BundlePermissionMgr::VerifyCallingPermissionForAll(Constants::PERMISSION_GET_BUNDLE_INFO_PRIVILEGED) &&
2709         !BundlePermissionMgr::IsBundleSelfCalling(bundleName)) {
2710         APP_LOGE("verify permission failed");
2711         return Constants::EMPTY_STRING;
2712     }
2713     auto dataMgr = GetDataMgrFromService();
2714     if (dataMgr == nullptr) {
2715         APP_LOGE("DataMgr is nullptr");
2716         return Constants::EMPTY_STRING;
2717     }
2718     return dataMgr->GetAppPrivilegeLevel(bundleName, userId);
2719 }
2720 
VerifyCallingPermission(const std::string &permission)2721 bool BundleMgrHostImpl::VerifyCallingPermission(const std::string &permission)
2722 {
2723     APP_LOGD("VerifyCallingPermission begin");
2724     int32_t timerId = XCollieHelper::SetRecoveryTimer(FUNCATION_VERIFY_CALLING_PERMISSION);
2725     ScopeGuard cancelTimerIdGuard([timerId] { XCollieHelper::CancelTimer(timerId); });
2726     return BundlePermissionMgr::VerifyCallingPermissionForAll(permission);
2727 }
2728 
QueryExtensionAbilityInfoByUri(const std::string &uri, int32_t userId, ExtensionAbilityInfo &extensionAbilityInfo)2729 bool BundleMgrHostImpl::QueryExtensionAbilityInfoByUri(const std::string &uri, int32_t userId,
2730     ExtensionAbilityInfo &extensionAbilityInfo)
2731 {
2732     LOG_I(BMS_TAG_QUERY, "uri:%{private}s -u %{public}d", uri.c_str(), userId);
2733     // API9 need to be system app, otherwise return empty data
2734     if (!BundlePermissionMgr::IsSystemApp() &&
2735         !BundlePermissionMgr::VerifyCallingBundleSdkVersion(ServiceConstants::API_VERSION_NINE)) {
2736         LOG_D(BMS_TAG_QUERY, "non-system app calling system api");
2737         return true;
2738     }
2739     if (!BundlePermissionMgr::VerifyCallingPermissionsForAll({Constants::PERMISSION_GET_BUNDLE_INFO_PRIVILEGED,
2740         Constants::PERMISSION_GET_BUNDLE_INFO})) {
2741         LOG_E(BMS_TAG_QUERY, "verify query permission failed");
2742         return false;
2743     }
2744     auto dataMgr = GetDataMgrFromService();
2745     if (dataMgr == nullptr) {
2746         LOG_E(BMS_TAG_QUERY, "DataMgr is nullptr");
2747         return false;
2748     }
2749     return dataMgr->QueryExtensionAbilityInfoByUri(uri, userId, extensionAbilityInfo);
2750 }
2751 
GetAppIdByBundleName(const std::string &bundleName, const int userId)2752 std::string BundleMgrHostImpl::GetAppIdByBundleName(const std::string &bundleName, const int userId)
2753 {
2754     APP_LOGD("bundleName : %{public}s, userId : %{public}d", bundleName.c_str(), userId);
2755     if (!BundlePermissionMgr::VerifyCallingPermissionForAll(Constants::PERMISSION_GET_BUNDLE_INFO_PRIVILEGED) &&
2756         !BundlePermissionMgr::IsBundleSelfCalling(bundleName)) {
2757         APP_LOGE("verify query permission failed");
2758         return Constants::EMPTY_STRING;
2759     }
2760     auto dataMgr = GetDataMgrFromService();
2761     if (dataMgr == nullptr) {
2762         APP_LOGE("DataMgr is nullptr");
2763         return Constants::EMPTY_STRING;
2764     }
2765     BundleInfo bundleInfo;
2766     bool ret = dataMgr->GetBundleInfo(bundleName, GET_BUNDLE_DEFAULT, bundleInfo, userId);
2767     if (!ret) {
2768         APP_LOGE("get bundleInfo failed");
2769         return Constants::EMPTY_STRING;
2770     }
2771     APP_LOGD("appId is %{private}s", bundleInfo.appId.c_str());
2772     return bundleInfo.appId;
2773 }
2774 
GetAppType(const std::string &bundleName)2775 std::string BundleMgrHostImpl::GetAppType(const std::string &bundleName)
2776 {
2777     APP_LOGD("bundleName : %{public}s", bundleName.c_str());
2778     if (!BundlePermissionMgr::VerifyCallingPermissionForAll(Constants::PERMISSION_GET_BUNDLE_INFO_PRIVILEGED) &&
2779         !BundlePermissionMgr::IsBundleSelfCalling(bundleName)) {
2780         APP_LOGE("verify permission failed");
2781         return Constants::EMPTY_STRING;
2782     }
2783     auto dataMgr = GetDataMgrFromService();
2784     if (dataMgr == nullptr) {
2785         APP_LOGE("DataMgr is nullptr");
2786         return Constants::EMPTY_STRING;
2787     }
2788     BundleInfo bundleInfo;
2789     bool ret = dataMgr->GetBundleInfo(bundleName, GET_BUNDLE_DEFAULT, bundleInfo, Constants::UNSPECIFIED_USERID);
2790     if (!ret) {
2791         APP_LOGE("get bundleInfo failed");
2792         return Constants::EMPTY_STRING;
2793     }
2794     bool isSystemApp = bundleInfo.applicationInfo.isSystemApp;
2795     std::string appType = isSystemApp ? SYSTEM_APP : THIRD_PARTY_APP;
2796     APP_LOGD("appType is %{public}s", appType.c_str());
2797     return appType;
2798 }
2799 
GetUidByBundleName(const std::string &bundleName, const int32_t userId)2800 int32_t BundleMgrHostImpl::GetUidByBundleName(const std::string &bundleName, const int32_t userId)
2801 {
2802     return GetUidByBundleName(bundleName, userId, 0);
2803 }
2804 
GetUidByBundleName(const std::string &bundleName, const int32_t userId, int32_t appIndex)2805 int32_t BundleMgrHostImpl::GetUidByBundleName(const std::string &bundleName, const int32_t userId, int32_t appIndex)
2806 {
2807     APP_LOGD("bundleName : %{public}s, userId : %{public}d", bundleName.c_str(), userId);
2808     if (!BundlePermissionMgr::VerifyCallingPermissionForAll(Constants::PERMISSION_GET_BUNDLE_INFO_PRIVILEGED) &&
2809         !BundlePermissionMgr::IsBundleSelfCalling(bundleName)) {
2810         APP_LOGE("verify token type failed");
2811         return Constants::INVALID_UID;
2812     }
2813     auto dataMgr = GetDataMgrFromService();
2814     if (dataMgr == nullptr) {
2815         APP_LOGE("DataMgr is nullptr");
2816         return Constants::INVALID_UID;
2817     }
2818     BundleInfo bundleInfo;
2819     int32_t uid = Constants::INVALID_UID;
2820     ErrCode ret = dataMgr->GetBundleInfoV9(bundleName, GET_BUNDLE_DEFAULT, bundleInfo, userId, appIndex);
2821     if (ret == ERR_OK) {
2822         uid = bundleInfo.uid;
2823         APP_LOGD("get bundle uid success, uid is %{public}d", uid);
2824     } else {
2825         APP_LOGE_NOFUNC("get bundleInfo uid fail");
2826     }
2827     return uid;
2828 }
2829 
GetUidByDebugBundleName(const std::string &bundleName, const int userId)2830 int BundleMgrHostImpl::GetUidByDebugBundleName(const std::string &bundleName, const int userId)
2831 {
2832     APP_LOGD("bundleName : %{public}s, userId : %{public}d", bundleName.c_str(), userId);
2833     if (!BundlePermissionMgr::VerifyCallingPermissionsForAll({Constants::PERMISSION_GET_BUNDLE_INFO_PRIVILEGED,
2834         Constants::PERMISSION_GET_BUNDLE_INFO}) &&
2835         !BundlePermissionMgr::IsBundleSelfCalling(bundleName)) {
2836         APP_LOGE("verify token type failed");
2837         return Constants::INVALID_UID;
2838     }
2839     auto dataMgr = GetDataMgrFromService();
2840     if (dataMgr == nullptr) {
2841         APP_LOGE("DataMgr is nullptr");
2842         return Constants::INVALID_UID;
2843     }
2844     ApplicationInfo appInfo;
2845     int32_t uid = Constants::INVALID_UID;
2846     bool ret = dataMgr->GetApplicationInfo(bundleName, GET_BUNDLE_DEFAULT, userId, appInfo);
2847     if (ret && appInfo.debug) {
2848         uid = appInfo.uid;
2849         APP_LOGD("get debug bundle uid success, uid is %{public}d", uid);
2850     } else {
2851         APP_LOGE("can not get bundleInfo's uid");
2852     }
2853     return uid;
2854 }
2855 
GetAbilityInfo( const std::string &bundleName, const std::string &abilityName, AbilityInfo &abilityInfo)2856 bool BundleMgrHostImpl::GetAbilityInfo(
2857     const std::string &bundleName, const std::string &abilityName, AbilityInfo &abilityInfo)
2858 {
2859     LOG_D(BMS_TAG_QUERY, "start GetAbilityInfo, bundleName:%{public}s abilityName:%{public}s",
2860         bundleName.c_str(), abilityName.c_str());
2861     ElementName elementName("", bundleName, abilityName);
2862     Want want;
2863     want.SetElement(elementName);
2864     return QueryAbilityInfo(want, abilityInfo);
2865 }
2866 
GetAbilityInfo( const std::string &bundleName, const std::string &moduleName, const std::string &abilityName, AbilityInfo &abilityInfo)2867 bool BundleMgrHostImpl::GetAbilityInfo(
2868     const std::string &bundleName, const std::string &moduleName,
2869     const std::string &abilityName, AbilityInfo &abilityInfo)
2870 {
2871     LOG_D(BMS_TAG_QUERY,
2872         "start GetAbilityInfo bundleName:%{public}s moduleName:%{public}s abilityName:%{public}s",
2873         bundleName.c_str(), moduleName.c_str(), abilityName.c_str());
2874     if (!VerifySystemApi(ServiceConstants::API_VERSION_NINE)) {
2875         LOG_D(BMS_TAG_QUERY, "non-system app calling system api");
2876         return true;
2877     }
2878     ElementName elementName("", bundleName, abilityName, moduleName);
2879     Want want;
2880     want.SetElement(elementName);
2881     return QueryAbilityInfo(want, abilityInfo);
2882 }
2883 
ImplicitQueryInfoByPriority(const Want &want, int32_t flags, int32_t userId, AbilityInfo &abilityInfo, ExtensionAbilityInfo &extensionInfo)2884 bool BundleMgrHostImpl::ImplicitQueryInfoByPriority(const Want &want, int32_t flags, int32_t userId,
2885     AbilityInfo &abilityInfo, ExtensionAbilityInfo &extensionInfo)
2886 {
2887     APP_LOGD("start ImplicitQueryInfoByPriority, flags : %{public}d, userId : %{public}d", flags, userId);
2888     if (!BundlePermissionMgr::IsSystemApp() &&
2889         !BundlePermissionMgr::VerifyCallingBundleSdkVersion(ServiceConstants::API_VERSION_NINE)) {
2890         APP_LOGD("non-system app calling system api");
2891         return true;
2892     }
2893     if (!BundlePermissionMgr::VerifyCallingPermissionsForAll({Constants::PERMISSION_GET_BUNDLE_INFO_PRIVILEGED,
2894         Constants::PERMISSION_GET_BUNDLE_INFO}) &&
2895         !BundlePermissionMgr::IsBundleSelfCalling(want.GetElement().GetBundleName())) {
2896         APP_LOGE("verify permission failed");
2897         return false;
2898     }
2899     auto dataMgr = GetDataMgrFromService();
2900     if (dataMgr == nullptr) {
2901         APP_LOGE("DataMgr is nullptr");
2902         return false;
2903     }
2904     return dataMgr->ImplicitQueryInfoByPriority(want, flags, userId, abilityInfo, extensionInfo);
2905 }
2906 
ImplicitQueryInfos(const Want &want, int32_t flags, int32_t userId, bool withDefault, std::vector<AbilityInfo> &abilityInfos, std::vector<ExtensionAbilityInfo> &extensionInfos, bool &findDefaultApp)2907 bool BundleMgrHostImpl::ImplicitQueryInfos(const Want &want, int32_t flags, int32_t userId,  bool withDefault,
2908     std::vector<AbilityInfo> &abilityInfos, std::vector<ExtensionAbilityInfo> &extensionInfos, bool &findDefaultApp)
2909 {
2910     APP_LOGD("begin to ImplicitQueryInfos, flags : %{public}d, userId : %{public}d", flags, userId);
2911     if (!BundlePermissionMgr::IsSystemApp() &&
2912         !BundlePermissionMgr::VerifyCallingBundleSdkVersion(ServiceConstants::API_VERSION_NINE)) {
2913         APP_LOGD("non-system app calling system api");
2914         return true;
2915     }
2916     if (!BundlePermissionMgr::VerifyCallingPermissionsForAll({Constants::PERMISSION_GET_BUNDLE_INFO_PRIVILEGED,
2917         Constants::PERMISSION_GET_BUNDLE_INFO}) &&
2918         !BundlePermissionMgr::IsBundleSelfCalling(want.GetElement().GetBundleName())) {
2919         APP_LOGE("verify permission failed");
2920         return false;
2921     }
2922     auto dataMgr = GetDataMgrFromService();
2923     if (dataMgr == nullptr) {
2924         APP_LOGE("DataMgr is nullptr");
2925         return false;
2926     }
2927     findDefaultApp = false;
2928     auto ret = dataMgr->ImplicitQueryInfos(
2929         want, flags, userId, withDefault, abilityInfos, extensionInfos, findDefaultApp);
2930     if (ret && findDefaultApp) {
2931         APP_LOGD("default app has been found and unnecessary to find from bms extension");
2932         return ret;
2933     }
2934     auto bmsExtensionClient = std::make_shared<BmsExtensionClient>();
2935     if (!IsAppLinking(flags) && isBrokerServiceExisted_ &&
2936         bmsExtensionClient->ImplicitQueryAbilityInfos(want, flags, userId, abilityInfos, false) == ERR_OK) {
2937         APP_LOGD("implicitly query from bms extension successfully");
2938         FilterAbilityInfos(abilityInfos);
2939         APP_LOGI_NOFUNC("ImplicitQueryInfos ret a.size:%{public}zu e.size:%{public}zu",
2940             abilityInfos.size(), extensionInfos.size());
2941         return true;
2942     }
2943     APP_LOGI_NOFUNC("ImplicitQueryInfos ret a.size:%{public}zu e.size:%{public}zu",
2944         abilityInfos.size(), extensionInfos.size());
2945     return ret;
2946 }
2947 
FilterAbilityInfos(std::vector<AbilityInfo> &abilityInfos)2948 void BundleMgrHostImpl::FilterAbilityInfos(std::vector<AbilityInfo> &abilityInfos)
2949 {
2950     AbilityInfo appLinkingAbility;
2951     bool hasAppLinking = false;
2952     for (const auto& ability : abilityInfos) {
2953         if (ability.kind == APP_LINKING) {
2954             appLinkingAbility = ability;
2955             hasAppLinking = true;
2956             break;
2957         }
2958     }
2959     if (hasAppLinking) {
2960         abilityInfos.clear();
2961         abilityInfos.push_back(appLinkingAbility);
2962     }
2963 }
2964 
Dump(int fd, const std::vector<std::u16string> &args)2965 int BundleMgrHostImpl::Dump(int fd, const std::vector<std::u16string> &args)
2966 {
2967     std::string result;
2968     std::vector<std::string> argsStr;
2969     for (auto item : args) {
2970         argsStr.emplace_back(Str16ToStr8(item));
2971     }
2972 
2973     if (!DelayedSingleton<BundleMgrService>::GetInstance()->Hidump(argsStr, result)) {
2974         APP_LOGE("Hidump error");
2975         return ERR_APPEXECFWK_HIDUMP_ERROR;
2976     }
2977 
2978     int ret = dprintf(fd, "%s\n", result.c_str());
2979     if (ret < 0) {
2980         APP_LOGE("dprintf error");
2981         return ERR_APPEXECFWK_HIDUMP_ERROR;
2982     }
2983 
2984     return ERR_OK;
2985 }
2986 
GetAllDependentModuleNames(const std::string &bundleName, const std::string &moduleName, std::vector<std::string> &dependentModuleNames)2987 bool BundleMgrHostImpl::GetAllDependentModuleNames(const std::string &bundleName, const std::string &moduleName,
2988     std::vector<std::string> &dependentModuleNames)
2989 {
2990     APP_LOGD("GetAllDependentModuleNames: bundleName: %{public}s, moduleName: %{public}s",
2991         bundleName.c_str(), moduleName.c_str());
2992     if (!BundlePermissionMgr::VerifyCallingPermissionsForAll({Constants::PERMISSION_GET_BUNDLE_INFO_PRIVILEGED,
2993         Constants::PERMISSION_GET_BUNDLE_INFO}) &&
2994         !BundlePermissionMgr::IsBundleSelfCalling(bundleName)) {
2995         APP_LOGE("verify permission failed");
2996         return false;
2997     }
2998     auto dataMgr = GetDataMgrFromService();
2999     if (dataMgr == nullptr) {
3000         APP_LOGE("DataMgr is nullptr");
3001         return false;
3002     }
3003     return dataMgr->GetAllDependentModuleNames(bundleName, moduleName, dependentModuleNames);
3004 }
3005 
GetSandboxBundleInfo( const std::string &bundleName, int32_t appIndex, int32_t userId, BundleInfo &info)3006 ErrCode BundleMgrHostImpl::GetSandboxBundleInfo(
3007     const std::string &bundleName, int32_t appIndex, int32_t userId, BundleInfo &info)
3008 {
3009     APP_LOGD("start GetSandboxBundleInfo, bundleName : %{public}s, appIndex : %{public}d, userId : %{public}d",
3010         bundleName.c_str(), appIndex, userId);
3011     // check bundle name
3012     if (bundleName.empty()) {
3013         APP_LOGE("GetSandboxBundleInfo failed due to empty bundleName");
3014         return ERR_APPEXECFWK_SANDBOX_INSTALL_PARAM_ERROR;
3015     }
3016     // check appIndex
3017     if (appIndex <= Constants::INITIAL_SANDBOX_APP_INDEX || appIndex > Constants::MAX_SANDBOX_APP_INDEX) {
3018         APP_LOGE("the appIndex %{public}d is invalid", appIndex);
3019         return ERR_APPEXECFWK_SANDBOX_INSTALL_PARAM_ERROR;
3020     }
3021     if (!BundlePermissionMgr::VerifyCallingPermissionsForAll({Constants::PERMISSION_GET_BUNDLE_INFO_PRIVILEGED,
3022         Constants::PERMISSION_GET_BUNDLE_INFO}) &&
3023         !BundlePermissionMgr::IsBundleSelfCalling(bundleName)) {
3024         APP_LOGE("verify permission failed");
3025         return ERR_APPEXECFWK_PERMISSION_DENIED;
3026     }
3027     auto dataMgr = GetDataMgrFromService();
3028     if (dataMgr == nullptr) {
3029         APP_LOGE("DataMgr is nullptr");
3030         return ERR_APPEXECFWK_SANDBOX_INSTALL_INTERNAL_ERROR;
3031     }
3032     auto sandboxAppHelper = dataMgr->GetSandboxAppHelper();
3033     if (sandboxAppHelper == nullptr) {
3034         APP_LOGE("sandboxAppHelper is nullptr");
3035         return ERR_APPEXECFWK_SANDBOX_INSTALL_INTERNAL_ERROR;
3036     }
3037     int32_t requestUserId = dataMgr->GetUserId(userId);
3038     if (requestUserId == Constants::INVALID_USERID) {
3039         return ERR_APPEXECFWK_SANDBOX_QUERY_INVALID_USER_ID;
3040     }
3041     return sandboxAppHelper->GetSandboxAppBundleInfo(bundleName, appIndex, requestUserId, info);
3042 }
3043 
ObtainCallingBundleName(std::string &bundleName)3044 bool BundleMgrHostImpl::ObtainCallingBundleName(std::string &bundleName)
3045 {
3046     auto dataMgr = GetDataMgrFromService();
3047     if (dataMgr == nullptr) {
3048         APP_LOGE("DataMgr is nullptr");
3049         return ERR_BUNDLE_MANAGER_INTERNAL_ERROR;
3050     }
3051     bool ret = dataMgr->GetBundleNameForUid(IPCSkeleton::GetCallingUid(), bundleName);
3052     if (!ret) {
3053         APP_LOGE("query calling bundle name failed");
3054         return false;
3055     }
3056     APP_LOGD("calling bundleName is : %{public}s", bundleName.c_str());
3057     return ret;
3058 }
3059 
GetBundleStats(const std::string &bundleName, int32_t userId, std::vector<int64_t> &bundleStats, int32_t appIndex)3060 bool BundleMgrHostImpl::GetBundleStats(const std::string &bundleName, int32_t userId,
3061     std::vector<int64_t> &bundleStats, int32_t appIndex)
3062 {
3063     if (!BundlePermissionMgr::VerifyCallingPermissionsForAll({Constants::PERMISSION_GET_BUNDLE_INFO_PRIVILEGED,
3064         Constants::PERMISSION_GET_BUNDLE_INFO}) &&
3065         !BundlePermissionMgr::IsBundleSelfCalling(bundleName)) {
3066         APP_LOGE("verify permission failed");
3067         return false;
3068     }
3069     if (bundleName.empty()) {
3070         APP_LOGE("bundleName empty");
3071         return false;
3072     }
3073     if (!CheckAppIndex(bundleName, userId, appIndex)) {
3074         return false;
3075     }
3076     auto dataMgr = GetDataMgrFromService();
3077     if (dataMgr == nullptr) {
3078         APP_LOGE("DataMgr is nullptr");
3079         return false;
3080     }
3081     if (isBrokerServiceExisted_ && !IsBundleExist(bundleName)) {
3082         auto bmsExtensionClient = std::make_shared<BmsExtensionClient>();
3083         ErrCode ret = bmsExtensionClient->GetBundleStats(bundleName, userId, bundleStats);
3084         APP_LOGI("ret : %{public}d", ret);
3085         return ret == ERR_OK;
3086     }
3087     return dataMgr->GetBundleStats(bundleName, userId, bundleStats, appIndex);
3088 }
3089 
GetAllBundleStats(int32_t userId, std::vector<int64_t> &bundleStats)3090 bool BundleMgrHostImpl::GetAllBundleStats(int32_t userId, std::vector<int64_t> &bundleStats)
3091 {
3092     if (!BundlePermissionMgr::VerifyCallingPermissionsForAll({Constants::PERMISSION_GET_BUNDLE_INFO_PRIVILEGED,
3093         Constants::PERMISSION_GET_BUNDLE_INFO})) {
3094         APP_LOGE("verify permission failed");
3095         return false;
3096     }
3097     auto dataMgr = GetDataMgrFromService();
3098     if (dataMgr == nullptr) {
3099         APP_LOGE("DataMgr is nullptr");
3100         return false;
3101     }
3102     return dataMgr->GetAllBundleStats(userId, bundleStats);
3103 }
3104 
GetStringById(const std::string &bundleName, const std::string &moduleName, uint32_t resId, int32_t userId, const std::string &localeInfo)3105 std::string BundleMgrHostImpl::GetStringById(const std::string &bundleName, const std::string &moduleName,
3106     uint32_t resId, int32_t userId, const std::string &localeInfo)
3107 {
3108     if (!BundlePermissionMgr::VerifyCallingPermissionsForAll({Constants::PERMISSION_GET_BUNDLE_INFO_PRIVILEGED,
3109         Constants::PERMISSION_GET_BUNDLE_INFO}) &&
3110         !BundlePermissionMgr::IsBundleSelfCalling(bundleName)) {
3111         APP_LOGE("verify token type failed");
3112         return Constants::EMPTY_STRING;
3113     }
3114     auto dataMgr = GetDataMgrFromService();
3115     if (dataMgr == nullptr) {
3116         APP_LOGE("DataMgr is nullptr");
3117         return Constants::EMPTY_STRING;
3118     }
3119     return dataMgr->GetStringById(bundleName, moduleName, resId, userId, localeInfo);
3120 }
3121 
GetIconById( const std::string &bundleName, const std::string &moduleName, uint32_t resId, uint32_t density, int32_t userId)3122 std::string BundleMgrHostImpl::GetIconById(
3123     const std::string &bundleName, const std::string &moduleName, uint32_t resId, uint32_t density, int32_t userId)
3124 {
3125     if (!BundlePermissionMgr::VerifyCallingPermissionsForAll({Constants::PERMISSION_GET_BUNDLE_INFO_PRIVILEGED,
3126         Constants::PERMISSION_GET_BUNDLE_INFO}) &&
3127         !BundlePermissionMgr::IsBundleSelfCalling(bundleName)) {
3128         APP_LOGE("verify token type failed");
3129         return Constants::EMPTY_STRING;
3130     }
3131     auto dataMgr = GetDataMgrFromService();
3132     if (dataMgr == nullptr) {
3133         APP_LOGE("DataMgr is nullptr");
3134         return Constants::EMPTY_STRING;
3135     }
3136     return dataMgr->GetIconById(bundleName, moduleName, resId, density, userId);
3137 }
3138 
3139 #ifdef BUNDLE_FRAMEWORK_DEFAULT_APP
GetDefaultAppProxy()3140 sptr<IDefaultApp> BundleMgrHostImpl::GetDefaultAppProxy()
3141 {
3142     return DelayedSingleton<BundleMgrService>::GetInstance()->GetDefaultAppProxy();
3143 }
3144 #endif
3145 
3146 #ifdef BUNDLE_FRAMEWORK_APP_CONTROL
GetAppControlProxy()3147 sptr<IAppControlMgr> BundleMgrHostImpl::GetAppControlProxy()
3148 {
3149     return DelayedSingleton<BundleMgrService>::GetInstance()->GetAppControlProxy();
3150 }
3151 #endif
3152 
GetQuickFixManagerProxy()3153 sptr<IQuickFixManager> BundleMgrHostImpl::GetQuickFixManagerProxy()
3154 {
3155 #ifdef BUNDLE_FRAMEWORK_QUICK_FIX
3156     return DelayedSingleton<BundleMgrService>::GetInstance()->GetQuickFixManagerProxy();
3157 #else
3158     return nullptr;
3159 #endif
3160 }
3161 
GetOverlayManagerProxy()3162 sptr<IOverlayManager> BundleMgrHostImpl::GetOverlayManagerProxy()
3163 {
3164 #ifdef BUNDLE_FRAMEWORK_OVERLAY_INSTALLATION
3165     int32_t timerId = XCollieHelper::SetRecoveryTimer(FUNCATION_GET_OVERLAY_MANAGER_PROXY);
3166     ScopeGuard cancelTimerIdGuard([timerId] { XCollieHelper::CancelTimer(timerId); });
3167     return DelayedSingleton<BundleMgrService>::GetInstance()->GetOverlayManagerProxy();
3168 #else
3169     return nullptr;
3170 #endif
3171 }
3172 
GetSandboxAbilityInfo(const Want &want, int32_t appIndex, int32_t flags, int32_t userId, AbilityInfo &info)3173 ErrCode BundleMgrHostImpl::GetSandboxAbilityInfo(const Want &want, int32_t appIndex, int32_t flags, int32_t userId,
3174     AbilityInfo &info)
3175 {
3176     APP_LOGD("start GetSandboxAbilityInfo appIndex : %{public}d, userId : %{public}d", appIndex, userId);
3177     // check appIndex
3178     if (appIndex <= Constants::INITIAL_SANDBOX_APP_INDEX || appIndex > Constants::MAX_SANDBOX_APP_INDEX) {
3179         APP_LOGE("the appIndex %{public}d is invalid", appIndex);
3180         return ERR_APPEXECFWK_SANDBOX_INSTALL_PARAM_ERROR;
3181     }
3182     if (!BundlePermissionMgr::VerifyCallingPermissionsForAll({Constants::PERMISSION_GET_BUNDLE_INFO_PRIVILEGED,
3183         Constants::PERMISSION_GET_BUNDLE_INFO}) &&
3184         !BundlePermissionMgr::IsBundleSelfCalling(want.GetElement().GetBundleName())) {
3185         APP_LOGE("verify permission failed");
3186         return ERR_APPEXECFWK_PERMISSION_DENIED;
3187     }
3188     auto dataMgr = GetDataMgrFromService();
3189     if (dataMgr == nullptr) {
3190         APP_LOGE("DataMgr is nullptr");
3191         return ERR_APPEXECFWK_SANDBOX_QUERY_INTERNAL_ERROR;
3192     }
3193 
3194     if (!(dataMgr->QueryAbilityInfo(want, flags, userId, info, appIndex)
3195         || dataMgr->QueryAbilityInfo(want, flags, Constants::DEFAULT_USERID, info, appIndex))) {
3196         APP_LOGE("query ability info failed");
3197         return ERR_APPEXECFWK_SANDBOX_QUERY_INTERNAL_ERROR;
3198     }
3199     return ERR_OK;
3200 }
3201 
GetSandboxExtAbilityInfos(const Want &want, int32_t appIndex, int32_t flags, int32_t userId, std::vector<ExtensionAbilityInfo> &infos)3202 ErrCode BundleMgrHostImpl::GetSandboxExtAbilityInfos(const Want &want, int32_t appIndex, int32_t flags,
3203     int32_t userId, std::vector<ExtensionAbilityInfo> &infos)
3204 {
3205     APP_LOGD("start GetSandboxExtAbilityInfos appIndex : %{public}d, userId : %{public}d", appIndex, userId);
3206     // check appIndex
3207     if (appIndex <= Constants::INITIAL_SANDBOX_APP_INDEX || appIndex > Constants::MAX_SANDBOX_APP_INDEX) {
3208         APP_LOGE("the appIndex %{public}d is invalid", appIndex);
3209         return ERR_APPEXECFWK_SANDBOX_INSTALL_PARAM_ERROR;
3210     }
3211     if (!BundlePermissionMgr::VerifyCallingPermissionsForAll({Constants::PERMISSION_GET_BUNDLE_INFO_PRIVILEGED,
3212         Constants::PERMISSION_GET_BUNDLE_INFO}) &&
3213         !BundlePermissionMgr::IsBundleSelfCalling(want.GetElement().GetBundleName())) {
3214         APP_LOGE("verify permission failed");
3215         return ERR_APPEXECFWK_PERMISSION_DENIED;
3216     }
3217     auto dataMgr = GetDataMgrFromService();
3218     if (dataMgr == nullptr) {
3219         APP_LOGE("DataMgr is nullptr");
3220         return ERR_APPEXECFWK_SANDBOX_QUERY_INTERNAL_ERROR;
3221     }
3222 
3223     if (!(dataMgr->QueryExtensionAbilityInfos(want, flags, userId, infos, appIndex)
3224         || dataMgr->QueryExtensionAbilityInfos(want, flags, Constants::DEFAULT_USERID, infos, appIndex))) {
3225         APP_LOGE("query extension ability info failed");
3226         return ERR_APPEXECFWK_SANDBOX_QUERY_INTERNAL_ERROR;
3227     }
3228     return ERR_OK;
3229 }
3230 
GetSandboxHapModuleInfo(const AbilityInfo &abilityInfo, int32_t appIndex, int32_t userId, HapModuleInfo &info)3231 ErrCode BundleMgrHostImpl::GetSandboxHapModuleInfo(const AbilityInfo &abilityInfo, int32_t appIndex, int32_t userId,
3232     HapModuleInfo &info)
3233 {
3234     APP_LOGD("start GetSandboxHapModuleInfo appIndex : %{public}d, userId : %{public}d", appIndex, userId);
3235     // check appIndex
3236     if (appIndex <= Constants::INITIAL_SANDBOX_APP_INDEX || appIndex > Constants::MAX_SANDBOX_APP_INDEX) {
3237         APP_LOGE("the appIndex %{public}d is invalid", appIndex);
3238         return ERR_APPEXECFWK_SANDBOX_INSTALL_PARAM_ERROR;
3239     }
3240     if (!BundlePermissionMgr::VerifyCallingPermissionsForAll({Constants::PERMISSION_GET_BUNDLE_INFO_PRIVILEGED,
3241         Constants::PERMISSION_GET_BUNDLE_INFO}) &&
3242         !BundlePermissionMgr::IsBundleSelfCalling(abilityInfo.bundleName)) {
3243         APP_LOGE("verify permission failed");
3244         return ERR_APPEXECFWK_PERMISSION_DENIED;
3245     }
3246     auto dataMgr = GetDataMgrFromService();
3247     if (dataMgr == nullptr) {
3248         APP_LOGE("DataMgr is nullptr");
3249         return ERR_APPEXECFWK_SANDBOX_QUERY_INTERNAL_ERROR;
3250     }
3251     auto sandboxAppHelper = dataMgr->GetSandboxAppHelper();
3252     if (sandboxAppHelper == nullptr) {
3253         APP_LOGE("sandboxAppHelper is nullptr");
3254         return ERR_APPEXECFWK_SANDBOX_QUERY_INTERNAL_ERROR;
3255     }
3256     int32_t requestUserId = dataMgr->GetUserId(userId);
3257     if (requestUserId == Constants::INVALID_USERID) {
3258         return ERR_APPEXECFWK_SANDBOX_QUERY_INVALID_USER_ID;
3259     }
3260     return sandboxAppHelper->GetSandboxHapModuleInfo(abilityInfo, appIndex, requestUserId, info);
3261 }
3262 
GetMediaData(const std::string &bundleName, const std::string &moduleName, const std::string &abilityName, std::unique_ptr<uint8_t[]> &mediaDataPtr, size_t &len, int32_t userId)3263 ErrCode BundleMgrHostImpl::GetMediaData(const std::string &bundleName, const std::string &moduleName,
3264     const std::string &abilityName, std::unique_ptr<uint8_t[]> &mediaDataPtr, size_t &len, int32_t userId)
3265 {
3266     // API9 need to be system app, otherwise return empty data
3267     if (!BundlePermissionMgr::IsSystemApp() &&
3268         !BundlePermissionMgr::VerifyCallingBundleSdkVersion(ServiceConstants::API_VERSION_NINE)) {
3269         APP_LOGE("non-system app calling system api");
3270         return ERR_BUNDLE_MANAGER_SYSTEM_API_DENIED;
3271     }
3272     if (!BundlePermissionMgr::VerifyCallingPermissionsForAll({Constants::PERMISSION_GET_BUNDLE_INFO_PRIVILEGED,
3273         Constants::PERMISSION_GET_BUNDLE_INFO}) &&
3274         !BundlePermissionMgr::IsBundleSelfCalling(bundleName)) {
3275         APP_LOGE("verify permission failed");
3276         return ERR_BUNDLE_MANAGER_PERMISSION_DENIED;
3277     }
3278     auto dataMgr = GetDataMgrFromService();
3279     if (dataMgr == nullptr) {
3280         APP_LOGE("DataMgr is nullptr");
3281         return ERR_BUNDLE_MANAGER_INTERNAL_ERROR;
3282     }
3283     return dataMgr->GetMediaData(bundleName, moduleName, abilityName, mediaDataPtr, len, userId);
3284 }
3285 
NotifyBundleStatus(const NotifyBundleEvents &installRes)3286 void BundleMgrHostImpl::NotifyBundleStatus(const NotifyBundleEvents &installRes)
3287 {
3288     std::shared_ptr<BundleCommonEventMgr> commonEventMgr = std::make_shared<BundleCommonEventMgr>();
3289     commonEventMgr->NotifyBundleStatus(installRes, nullptr);
3290 }
3291 
SetDebugMode(bool isDebug)3292 ErrCode BundleMgrHostImpl::SetDebugMode(bool isDebug)
3293 {
3294     int32_t callingUid = IPCSkeleton::GetCallingUid();
3295     if (callingUid != Constants::ROOT_UID && callingUid != ServiceConstants::BMS_UID) {
3296         APP_LOGE("invalid calling uid %{public}d to set debug mode", callingUid);
3297         return ERR_BUNDLEMANAGER_SET_DEBUG_MODE_UID_CHECK_FAILED;
3298     }
3299     if (isDebug) {
3300         BundleVerifyMgr::EnableDebug();
3301     } else {
3302         BundleVerifyMgr::DisableDebug();
3303     }
3304     return ERR_OK;
3305 }
3306 
VerifySystemApi(int32_t beginApiVersion)3307 bool BundleMgrHostImpl::VerifySystemApi(int32_t beginApiVersion)
3308 {
3309     APP_LOGD("begin to verify system app");
3310     int32_t timerId = XCollieHelper::SetRecoveryTimer(FUNCATION_VERIFY_SYSTEM_API);
3311     ScopeGuard cancelTimerIdGuard([timerId] { XCollieHelper::CancelTimer(timerId); });
3312     return BundlePermissionMgr::VerifySystemApp(beginApiVersion);
3313 }
3314 
GetAppProvisionInfo(const std::string &bundleName, int32_t userId, AppProvisionInfo &appProvisionInfo)3315 ErrCode BundleMgrHostImpl::GetAppProvisionInfo(const std::string &bundleName, int32_t userId,
3316     AppProvisionInfo &appProvisionInfo)
3317 {
3318     APP_LOGD("begin to GetAppProvisionInfo bundleName: %{public}s, userId: %{public}d", bundleName.c_str(),
3319         userId);
3320     if (!BundlePermissionMgr::IsSystemApp()) {
3321         APP_LOGE("non-system app calling system api");
3322         return ERR_BUNDLE_MANAGER_SYSTEM_API_DENIED;
3323     }
3324     if (!BundlePermissionMgr::VerifyCallingPermissionForAll(Constants::PERMISSION_GET_BUNDLE_INFO_PRIVILEGED) &&
3325         !BundlePermissionMgr::IsBundleSelfCalling(bundleName)) {
3326         APP_LOGE("verify permission failed");
3327         return ERR_BUNDLE_MANAGER_PERMISSION_DENIED;
3328     }
3329     auto dataMgr = GetDataMgrFromService();
3330     if (dataMgr == nullptr) {
3331         APP_LOGE("DataMgr is nullptr");
3332         return ERR_BUNDLE_MANAGER_INTERNAL_ERROR;
3333     }
3334     return dataMgr->GetAppProvisionInfo(bundleName, userId, appProvisionInfo);
3335 }
3336 
GetProvisionMetadata(const std::string &bundleName, int32_t userId, std::vector<Metadata> &provisionMetadatas)3337 ErrCode BundleMgrHostImpl::GetProvisionMetadata(const std::string &bundleName, int32_t userId,
3338     std::vector<Metadata> &provisionMetadatas)
3339 {
3340     if (!BundlePermissionMgr::VerifyCallingPermissionsForAll({Constants::PERMISSION_GET_BUNDLE_INFO_PRIVILEGED,
3341         Constants::PERMISSION_GET_BUNDLE_INFO}) &&
3342         !BundlePermissionMgr::IsBundleSelfCalling(bundleName)) {
3343         APP_LOGE("verify permission failed");
3344         return ERR_BUNDLE_MANAGER_PERMISSION_DENIED;
3345     }
3346     auto dataMgr = GetDataMgrFromService();
3347     if (dataMgr == nullptr) {
3348         APP_LOGE("DataMgr is nullptr");
3349         return ERR_BUNDLE_MANAGER_INTERNAL_ERROR;
3350     }
3351     return dataMgr->GetProvisionMetadata(bundleName, userId, provisionMetadatas);
3352 }
3353 
GetAllSharedBundleInfo(std::vector<SharedBundleInfo> &sharedBundles)3354 ErrCode BundleMgrHostImpl::GetAllSharedBundleInfo(std::vector<SharedBundleInfo> &sharedBundles)
3355 {
3356     APP_LOGD("begin to GetAllSharedBundleInfo");
3357     if (!BundlePermissionMgr::IsSystemApp()) {
3358         APP_LOGE("non-system app calling system api");
3359         return ERR_BUNDLE_MANAGER_SYSTEM_API_DENIED;
3360     }
3361     if (!BundlePermissionMgr::VerifyCallingPermissionForAll(Constants::PERMISSION_GET_BUNDLE_INFO_PRIVILEGED)) {
3362         APP_LOGE("verify permission failed");
3363         return ERR_BUNDLE_MANAGER_PERMISSION_DENIED;
3364     }
3365 
3366     auto dataMgr = GetDataMgrFromService();
3367     if (dataMgr == nullptr) {
3368         APP_LOGE("dataMgr is nullptr");
3369         return ERR_BUNDLE_MANAGER_INTERNAL_ERROR;
3370     }
3371     return dataMgr->GetAllSharedBundleInfo(sharedBundles);
3372 }
3373 
GetSharedBundleInfo(const std::string &bundleName, const std::string &moduleName, std::vector<SharedBundleInfo> &sharedBundles)3374 ErrCode BundleMgrHostImpl::GetSharedBundleInfo(const std::string &bundleName, const std::string &moduleName,
3375     std::vector<SharedBundleInfo> &sharedBundles)
3376 {
3377     APP_LOGD("GetSharedBundleInfo: bundleName: %{public}s, moduleName: %{public}s",
3378         bundleName.c_str(), moduleName.c_str());
3379     if (!BundlePermissionMgr::IsSystemApp()) {
3380         APP_LOGE("non-system app calling system api");
3381         return ERR_BUNDLE_MANAGER_SYSTEM_API_DENIED;
3382     }
3383     if (!BundlePermissionMgr::VerifyCallingPermissionForAll(Constants::PERMISSION_GET_BUNDLE_INFO_PRIVILEGED) &&
3384         !BundlePermissionMgr::IsBundleSelfCalling(bundleName)) {
3385         APP_LOGE("verify permission failed");
3386         return ERR_BUNDLE_MANAGER_PERMISSION_DENIED;
3387     }
3388 
3389     auto dataMgr = GetDataMgrFromService();
3390     if (dataMgr == nullptr) {
3391         APP_LOGE("dataMgr is nullptr");
3392         return ERR_BUNDLE_MANAGER_INTERNAL_ERROR;
3393     }
3394     return dataMgr->GetSharedBundleInfo(bundleName, moduleName, sharedBundles);
3395 }
3396 
GetSharedBundleInfoBySelf(const std::string &bundleName, SharedBundleInfo &sharedBundleInfo)3397 ErrCode BundleMgrHostImpl::GetSharedBundleInfoBySelf(const std::string &bundleName,
3398     SharedBundleInfo &sharedBundleInfo)
3399 {
3400     APP_LOGD("begin to GetSharedBundleInfoBySelf bundleName: %{public}s", bundleName.c_str());
3401     int32_t timerId = XCollieHelper::SetRecoveryTimer(FUNCATION_GET_SHARED_BUNDLE_INFO_BY_SELF);
3402     ScopeGuard cancelTimerIdGuard([timerId] { XCollieHelper::CancelTimer(timerId); });
3403     if (!BundlePermissionMgr::IsSystemApp()) {
3404         APP_LOGE("non-system app calling system api");
3405         return ERR_BUNDLE_MANAGER_SYSTEM_API_DENIED;
3406     }
3407     if (!BundlePermissionMgr::VerifyCallingPermissionsForAll({Constants::PERMISSION_GET_BUNDLE_INFO_PRIVILEGED,
3408         Constants::PERMISSION_GET_BUNDLE_INFO}) &&
3409         !BundlePermissionMgr::IsBundleSelfCalling(bundleName)) {
3410         APP_LOGE("verify permission failed");
3411         return ERR_BUNDLE_MANAGER_PERMISSION_DENIED;
3412     }
3413 
3414     auto dataMgr = GetDataMgrFromService();
3415     if (dataMgr == nullptr) {
3416         APP_LOGE("DataMgr is nullptr");
3417         return ERR_BUNDLE_MANAGER_INTERNAL_ERROR;
3418     }
3419     return dataMgr->GetSharedBundleInfoBySelf(bundleName, sharedBundleInfo);
3420 }
3421 
GetSharedDependencies(const std::string &bundleName, const std::string &moduleName, std::vector<Dependency> &dependencies)3422 ErrCode BundleMgrHostImpl::GetSharedDependencies(const std::string &bundleName, const std::string &moduleName,
3423     std::vector<Dependency> &dependencies)
3424 {
3425     APP_LOGD("GetSharedDependencies: bundleName: %{public}s, moduleName: %{public}s",
3426         bundleName.c_str(), moduleName.c_str());
3427     if (!BundlePermissionMgr::VerifyCallingPermissionForAll(Constants::PERMISSION_GET_BUNDLE_INFO_PRIVILEGED) &&
3428         !BundlePermissionMgr::IsBundleSelfCalling(bundleName)) {
3429         APP_LOGE("verify permission failed");
3430         return ERR_BUNDLE_MANAGER_PERMISSION_DENIED;
3431     }
3432     auto dataMgr = GetDataMgrFromService();
3433     if (dataMgr == nullptr) {
3434         APP_LOGE("DataMgr is nullptr");
3435         return ERR_BUNDLE_MANAGER_INTERNAL_ERROR;
3436     }
3437     return dataMgr->GetSharedDependencies(bundleName, moduleName, dependencies);
3438 }
3439 
VerifyDependency(const std::string &sharedBundleName)3440 bool BundleMgrHostImpl::VerifyDependency(const std::string &sharedBundleName)
3441 {
3442     auto dataMgr = GetDataMgrFromService();
3443     if (dataMgr == nullptr) {
3444         APP_LOGE("DataMgr is nullptr");
3445         return false;
3446     }
3447 
3448     std::string callingBundleName;
3449     bool ret = dataMgr->GetBundleNameForUid(IPCSkeleton::GetCallingUid(), callingBundleName);
3450     if (!ret) {
3451         APP_LOGE("GetBundleNameForUid failed");
3452         return false;
3453     }
3454 
3455     InnerBundleInfo callingBundleInfo;
3456     if (!dataMgr->FetchInnerBundleInfo(callingBundleName, callingBundleInfo)) {
3457         APP_LOGE("get %{public}s failed", callingBundleName.c_str());
3458         return false;
3459     }
3460 
3461     // check whether callingBundleName is dependent on sharedBundleName
3462     const auto& dependencies = callingBundleInfo.GetDependencies();
3463     auto iter = std::find_if(dependencies.begin(), dependencies.end(), [&sharedBundleName](const auto &dependency) {
3464         return dependency.bundleName == sharedBundleName;
3465     });
3466     if (iter == dependencies.end()) {
3467         APP_LOGE("%{public}s is not dependent on %{public}s", callingBundleName.c_str(), sharedBundleName.c_str());
3468         return false;
3469     }
3470     APP_LOGD("verify dependency successfully");
3471     return true;
3472 }
3473 
IsPreInstallApp(const std::string &bundleName)3474 bool BundleMgrHostImpl::IsPreInstallApp(const std::string &bundleName)
3475 {
3476     auto dataMgr = GetDataMgrFromService();
3477     if (dataMgr == nullptr) {
3478         APP_LOGE("DataMgr is nullptr");
3479         return false;
3480     }
3481     return dataMgr->IsPreInstallApp(bundleName);
3482 }
3483 
GetProxyDataInfos(const std::string &bundleName, const std::string &moduleName, std::vector<ProxyData> &proxyDatas, int32_t userId)3484 ErrCode BundleMgrHostImpl::GetProxyDataInfos(const std::string &bundleName, const std::string &moduleName,
3485     std::vector<ProxyData> &proxyDatas, int32_t userId)
3486 {
3487     if (!BundlePermissionMgr::VerifyCallingPermissionForAll(Constants::PERMISSION_GET_BUNDLE_INFO_PRIVILEGED)) {
3488         APP_LOGE("verify token type failed");
3489         return ERR_BUNDLE_MANAGER_PERMISSION_DENIED;
3490     }
3491     auto dataMgr = GetDataMgrFromService();
3492     if (dataMgr == nullptr) {
3493         APP_LOGE("DataMgr is nullptr");
3494         return ERR_BUNDLE_MANAGER_INTERNAL_ERROR;
3495     }
3496     return dataMgr->GetProxyDataInfos(bundleName, moduleName, userId, proxyDatas);
3497 }
3498 
GetAllProxyDataInfos(std::vector<ProxyData> &proxyDatas, int32_t userId)3499 ErrCode BundleMgrHostImpl::GetAllProxyDataInfos(std::vector<ProxyData> &proxyDatas, int32_t userId)
3500 {
3501     if (!BundlePermissionMgr::VerifyCallingPermissionForAll(Constants::PERMISSION_GET_BUNDLE_INFO_PRIVILEGED)) {
3502         APP_LOGE("verify token type failed");
3503         return ERR_BUNDLE_MANAGER_PERMISSION_DENIED;
3504     }
3505     auto dataMgr = GetDataMgrFromService();
3506     if (dataMgr == nullptr) {
3507         APP_LOGE("DataMgr is nullptr");
3508         return ERR_BUNDLE_MANAGER_INTERNAL_ERROR;
3509     }
3510     return dataMgr->GetAllProxyDataInfos(userId, proxyDatas);
3511 }
3512 
GetSpecifiedDistributionType(const std::string &bundleName, std::string &specifiedDistributionType)3513 ErrCode BundleMgrHostImpl::GetSpecifiedDistributionType(const std::string &bundleName,
3514     std::string &specifiedDistributionType)
3515 {
3516     APP_LOGD("GetSpecifiedDistributionType bundleName: %{public}s", bundleName.c_str());
3517     if (!BundlePermissionMgr::IsSystemApp()) {
3518         APP_LOGE("non-system app calling system api");
3519         return ERR_BUNDLE_MANAGER_SYSTEM_API_DENIED;
3520     }
3521     if (!BundlePermissionMgr::VerifyCallingPermissionForAll(Constants::PERMISSION_GET_BUNDLE_INFO_PRIVILEGED) &&
3522         !BundlePermissionMgr::IsBundleSelfCalling(bundleName)) {
3523         APP_LOGE("verify permission failed");
3524         return ERR_BUNDLE_MANAGER_PERMISSION_DENIED;
3525     }
3526 
3527     auto dataMgr = GetDataMgrFromService();
3528     if (dataMgr == nullptr) {
3529         APP_LOGE("dataMgr is nullptr");
3530         return ERR_BUNDLE_MANAGER_INTERNAL_ERROR;
3531     }
3532     return dataMgr->GetSpecifiedDistributionType(bundleName, specifiedDistributionType);
3533 }
3534 
GetAdditionalInfo(const std::string &bundleName, std::string &additionalInfo)3535 ErrCode BundleMgrHostImpl::GetAdditionalInfo(const std::string &bundleName,
3536     std::string &additionalInfo)
3537 {
3538     APP_LOGD("GetAdditionalInfo bundleName: %{public}s", bundleName.c_str());
3539     if (!BundlePermissionMgr::IsSystemApp()) {
3540         APP_LOGE("non-system app calling system api");
3541         return ERR_BUNDLE_MANAGER_SYSTEM_API_DENIED;
3542     }
3543     if (!BundlePermissionMgr::VerifyCallingPermissionForAll(Constants::PERMISSION_GET_BUNDLE_INFO_PRIVILEGED)) {
3544         APP_LOGE("verify permission failed");
3545         return ERR_BUNDLE_MANAGER_PERMISSION_DENIED;
3546     }
3547 
3548     auto dataMgr = GetDataMgrFromService();
3549     if (dataMgr == nullptr) {
3550         APP_LOGE("dataMgr is nullptr");
3551         return ERR_BUNDLE_MANAGER_INTERNAL_ERROR;
3552     }
3553     return dataMgr->GetAdditionalInfo(bundleName, additionalInfo);
3554 }
3555 
SetExtNameOrMIMEToApp(const std::string &bundleName, const std::string &moduleName, const std::string &abilityName, const std::string &extName, const std::string &mimeType)3556 ErrCode BundleMgrHostImpl::SetExtNameOrMIMEToApp(const std::string &bundleName, const std::string &moduleName,
3557     const std::string &abilityName, const std::string &extName, const std::string &mimeType)
3558 {
3559     APP_LOGD("SetExtNameOrMIMEToApp bundleName: %{public}s, moduleName: %{public}s, \
3560         abilityName: %{public}s, extName: %{public}s, mimeType: %{public}s",
3561         bundleName.c_str(), moduleName.c_str(), abilityName.c_str(), extName.c_str(), mimeType.c_str());
3562     if (!BundlePermissionMgr::VerifyCallingPermissionForAll(Constants::PERMISSION_GET_BUNDLE_INFO_PRIVILEGED)) {
3563         APP_LOGE("verify permission failed");
3564         return ERR_BUNDLE_MANAGER_PERMISSION_DENIED;
3565     }
3566     auto dataMgr = GetDataMgrFromService();
3567     if (dataMgr == nullptr) {
3568         APP_LOGE("dataMgr is nullptr");
3569         return ERR_BUNDLE_MANAGER_INTERNAL_ERROR;
3570     }
3571     return dataMgr->SetExtNameOrMIMEToApp(bundleName, moduleName, abilityName, extName, mimeType);
3572 }
3573 
DelExtNameOrMIMEToApp(const std::string &bundleName, const std::string &moduleName, const std::string &abilityName, const std::string &extName, const std::string &mimeType)3574 ErrCode BundleMgrHostImpl::DelExtNameOrMIMEToApp(const std::string &bundleName, const std::string &moduleName,
3575     const std::string &abilityName, const std::string &extName, const std::string &mimeType)
3576 {
3577     APP_LOGD("DelExtNameOrMIMEToApp bundleName: %{public}s, moduleName: %{public}s, \
3578         abilityName: %{public}s, extName: %{public}s, mimeType: %{public}s",
3579         bundleName.c_str(), moduleName.c_str(), abilityName.c_str(), extName.c_str(), mimeType.c_str());
3580     if (!BundlePermissionMgr::VerifyCallingPermissionForAll(Constants::PERMISSION_GET_BUNDLE_INFO_PRIVILEGED)) {
3581         APP_LOGE("verify permission failed");
3582         return ERR_BUNDLE_MANAGER_PERMISSION_DENIED;
3583     }
3584     auto dataMgr = GetDataMgrFromService();
3585     if (dataMgr == nullptr) {
3586         APP_LOGE("dataMgr is nullptr");
3587         return ERR_BUNDLE_MANAGER_INTERNAL_ERROR;
3588     }
3589     return dataMgr->DelExtNameOrMIMEToApp(bundleName, moduleName, abilityName, extName, mimeType);
3590 }
3591 
QueryDataGroupInfos(const std::string &bundleName, int32_t userId, std::vector<DataGroupInfo> &infos)3592 bool BundleMgrHostImpl::QueryDataGroupInfos(const std::string &bundleName, int32_t userId,
3593     std::vector<DataGroupInfo> &infos)
3594 {
3595     APP_LOGD("QueryDataGroupInfos bundleName: %{public}s, userId: %{public}d", bundleName.c_str(), userId);
3596     if (!BundlePermissionMgr::VerifyCallingPermissionForAll(Constants::PERMISSION_GET_BUNDLE_INFO_PRIVILEGED)) {
3597         APP_LOGE("verify permission failed");
3598         return false;
3599     }
3600     auto dataMgr = GetDataMgrFromService();
3601     if (dataMgr == nullptr) {
3602         APP_LOGE("dataMgr is nullptr");
3603         return false;
3604     }
3605     return dataMgr->QueryDataGroupInfos(bundleName, userId, infos);
3606 }
3607 
GetGroupDir(const std::string &dataGroupId, std::string &dir)3608 bool BundleMgrHostImpl::GetGroupDir(const std::string &dataGroupId, std::string &dir)
3609 {
3610     APP_LOGD("GetGroupDir dataGroupId: %{public}s", dataGroupId.c_str());
3611     auto dataMgr = GetDataMgrFromService();
3612     if (dataMgr == nullptr) {
3613         APP_LOGE("dataMgr is nullptr");
3614         return false;
3615     }
3616     return dataMgr->GetGroupDir(dataGroupId, dir);
3617 }
3618 
SetBrokerServiceStatus(bool isServiceExisted)3619 void BundleMgrHostImpl::SetBrokerServiceStatus(bool isServiceExisted)
3620 {
3621     APP_LOGD("broker service status is %{public}d", isServiceExisted);
3622     isBrokerServiceExisted_ = isServiceExisted;
3623 }
3624 
QueryAppGalleryBundleName(std::string &bundleName)3625 bool BundleMgrHostImpl::QueryAppGalleryBundleName(std::string &bundleName)
3626 {
3627     APP_LOGD("QueryAppGalleryBundleName in bundle host impl start");
3628     auto dataMgr = GetDataMgrFromService();
3629     if (dataMgr == nullptr) {
3630         APP_LOGE("DataMgr is nullptr");
3631         return false;
3632     }
3633     std::string abilityName;
3634     bool ret = dataMgr->QueryAppGalleryAbilityName(bundleName, abilityName);
3635     if (!ret) {
3636         APP_LOGE("get bundleName failed");
3637         return false;
3638     }
3639     APP_LOGD("bundleName is %{public}s", bundleName.c_str());
3640     return  true;
3641 }
3642 
QueryExtensionAbilityInfosWithTypeName(const Want &want, const std::string &typeName, int32_t flags, int32_t userId, std::vector<ExtensionAbilityInfo> &extensionInfos)3643 ErrCode BundleMgrHostImpl::QueryExtensionAbilityInfosWithTypeName(const Want &want, const std::string &typeName,
3644     int32_t flags, int32_t userId, std::vector<ExtensionAbilityInfo> &extensionInfos)
3645 {
3646     if (!BundlePermissionMgr::IsSystemApp()) {
3647         LOG_E(BMS_TAG_QUERY, "Non-system app calling system api");
3648         return ERR_BUNDLE_MANAGER_SYSTEM_API_DENIED;
3649     }
3650     if (!BundlePermissionMgr::VerifyCallingPermissionsForAll({Constants::PERMISSION_GET_BUNDLE_INFO_PRIVILEGED,
3651         Constants::PERMISSION_GET_BUNDLE_INFO}) &&
3652         !BundlePermissionMgr::IsBundleSelfCalling(want.GetElement().GetBundleName())) {
3653         LOG_E(BMS_TAG_QUERY, "Verify permission failed");
3654         return ERR_BUNDLE_MANAGER_PERMISSION_DENIED;
3655     }
3656     auto dataMgr = GetDataMgrFromService();
3657     if (dataMgr == nullptr) {
3658         LOG_E(BMS_TAG_QUERY, "DataMgr is nullptr");
3659         return ERR_BUNDLE_MANAGER_INTERNAL_ERROR;
3660     }
3661     std::vector<ExtensionAbilityInfo> infos;
3662     ErrCode ret = dataMgr->QueryExtensionAbilityInfosV9(want, flags, userId, infos);
3663     if (ret != ERR_OK) {
3664         LOG_E(BMS_TAG_QUERY, "QueryExtensionAbilityInfosV9 is failed");
3665         return ret;
3666     }
3667     if (typeName.empty()) {
3668         extensionInfos = infos;
3669     } else {
3670         for_each(infos.begin(), infos.end(), [&typeName, &extensionInfos](const auto &info)->decltype(auto) {
3671             APP_LOGD("Input typeName is %{public}s, info.type is %{public}s",
3672                 typeName.c_str(), info.extensionTypeName.c_str());
3673             if (typeName == info.extensionTypeName) {
3674                 extensionInfos.emplace_back(info);
3675             }
3676         });
3677     }
3678     if (extensionInfos.empty()) {
3679         LOG_E(BMS_TAG_QUERY, "No valid extension info can be inquired");
3680         return ERR_BUNDLE_MANAGER_ABILITY_NOT_EXIST;
3681     }
3682     return ERR_OK;
3683 }
3684 
QueryExtensionAbilityInfosOnlyWithTypeName(const std::string &typeName, uint32_t flags, int32_t userId, std::vector<ExtensionAbilityInfo> &extensionInfos)3685 ErrCode BundleMgrHostImpl::QueryExtensionAbilityInfosOnlyWithTypeName(const std::string &typeName,
3686     uint32_t flags, int32_t userId, std::vector<ExtensionAbilityInfo> &extensionInfos)
3687 {
3688     if (!BundlePermissionMgr::IsSystemApp()) {
3689         APP_LOGE("Non-system app calling system api");
3690         return ERR_BUNDLE_MANAGER_SYSTEM_API_DENIED;
3691     }
3692     if (!BundlePermissionMgr::VerifyCallingPermissionsForAll({Constants::PERMISSION_GET_BUNDLE_INFO_PRIVILEGED,
3693         Constants::PERMISSION_GET_BUNDLE_INFO})) {
3694         APP_LOGE("Verify permission failed");
3695         return ERR_BUNDLE_MANAGER_PERMISSION_DENIED;
3696     }
3697     auto dataMgr = GetDataMgrFromService();
3698     if (dataMgr == nullptr) {
3699         APP_LOGE("DataMgr is nullptr");
3700         return ERR_BUNDLE_MANAGER_INTERNAL_ERROR;
3701     }
3702     if (typeName.empty()) {
3703         APP_LOGE("Input typeName is empty");
3704         return ERR_BUNDLE_MANAGER_ABILITY_NOT_EXIST;
3705     }
3706     std::vector<ExtensionAbilityInfo> infos;
3707     ErrCode ret = dataMgr->QueryExtensionAbilityInfosByExtensionTypeName(typeName, flags, userId, infos);
3708     if (ret != ERR_OK) {
3709         APP_LOGE("QueryExtensionAbilityInfos is failed");
3710         return ret;
3711     }
3712     if ((flags &
3713         static_cast<uint32_t>(GetExtensionAbilityInfoFlag::GET_EXTENSION_ABILITY_INFO_BY_TYPE_NAME)) ==
3714         static_cast<uint32_t>(GetExtensionAbilityInfoFlag::GET_EXTENSION_ABILITY_INFO_BY_TYPE_NAME)) {
3715         extensionInfos = infos;
3716         return ret;
3717     }
3718     for_each(infos.begin(), infos.end(), [&typeName, &extensionInfos](const auto &info)->decltype(auto) {
3719         APP_LOGD("Input typeName is %{public}s, info.type is %{public}s",
3720             typeName.c_str(), info.extensionTypeName.c_str());
3721         if (typeName == info.extensionTypeName) {
3722             extensionInfos.emplace_back(info);
3723         }
3724     });
3725     if (extensionInfos.empty()) {
3726         APP_LOGE("No valid extension info can be inquired");
3727         return ERR_BUNDLE_MANAGER_ABILITY_NOT_EXIST;
3728     }
3729     return ERR_OK;
3730 }
3731 
ResetAOTCompileStatus(const std::string &bundleName, const std::string &moduleName, int32_t triggerMode)3732 ErrCode BundleMgrHostImpl::ResetAOTCompileStatus(const std::string &bundleName, const std::string &moduleName,
3733     int32_t triggerMode)
3734 {
3735     APP_LOGD("ResetAOTCompileStatus begin");
3736     auto dataMgr = GetDataMgrFromService();
3737     if (dataMgr == nullptr) {
3738         APP_LOGE("dataMgr is null");
3739         return ERR_BUNDLE_MANAGER_INTERNAL_ERROR;
3740     }
3741     std::string callingBundleName;
3742     ErrCode ret = dataMgr->GetNameForUid(IPCSkeleton::GetCallingUid(), callingBundleName);
3743     if (ret != ERR_OK || bundleName != callingBundleName) {
3744         APP_LOGE("verify permission failed");
3745         return ERR_BUNDLE_MANAGER_PERMISSION_DENIED;
3746     }
3747     return dataMgr->ResetAOTCompileStatus(bundleName, moduleName, triggerMode);
3748 }
3749 
GetJsonProfile(ProfileType profileType, const std::string &bundleName, const std::string &moduleName, std::string &profile, int32_t userId)3750 ErrCode BundleMgrHostImpl::GetJsonProfile(ProfileType profileType, const std::string &bundleName,
3751     const std::string &moduleName, std::string &profile, int32_t userId)
3752 {
3753     APP_LOGD("GetJsonProfile profileType: %{public}d, bundleName: %{public}s, moduleName: %{public}s"
3754         "userId: %{public}d", profileType, bundleName.c_str(), moduleName.c_str(), userId);
3755     if (!BundlePermissionMgr::VerifyCallingPermissionsForAll({Constants::PERMISSION_GET_BUNDLE_INFO_PRIVILEGED,
3756         Constants::PERMISSION_GET_BUNDLE_INFO}) &&
3757         !BundlePermissionMgr::IsBundleSelfCalling(bundleName)) {
3758         APP_LOGE("verify permission failed");
3759         return ERR_BUNDLE_MANAGER_PERMISSION_DENIED;
3760     }
3761     if (!BundlePermissionMgr::IsSystemApp() &&
3762         profileType != ProfileType::NETWORK_PROFILE &&
3763         profileType != ProfileType::PKG_CONTEXT_PROFILE) {
3764         APP_LOGE("non-system app calling system api");
3765         return ERR_BUNDLE_MANAGER_SYSTEM_API_DENIED;
3766     }
3767     auto dataMgr = GetDataMgrFromService();
3768     if (dataMgr == nullptr) {
3769         APP_LOGE("dataMgr is nullptr");
3770         return ERR_BUNDLE_MANAGER_INTERNAL_ERROR;
3771     }
3772     return dataMgr->GetJsonProfile(profileType, bundleName, moduleName, profile, userId);
3773 }
3774 
SetAdditionalInfo(const std::string &bundleName, const std::string &additionalInfo)3775 ErrCode BundleMgrHostImpl::SetAdditionalInfo(const std::string &bundleName, const std::string &additionalInfo)
3776 {
3777     APP_LOGD("Called. BundleName: %{public}s", bundleName.c_str());
3778     if (!BundlePermissionMgr::IsSystemApp()) {
3779         APP_LOGE("Non-system app calling system api");
3780         return ERR_BUNDLE_MANAGER_SYSTEM_API_DENIED;
3781     }
3782 
3783     if (!BundlePermissionMgr::VerifyCallingPermissionForAll(Constants::PERMISSION_GET_BUNDLE_INFO_PRIVILEGED)) {
3784         APP_LOGE("Verify permission failed");
3785         return ERR_BUNDLE_MANAGER_PERMISSION_DENIED;
3786     }
3787 
3788     std::string appGalleryBundleName;
3789     QueryAppGalleryBundleName(appGalleryBundleName);
3790 
3791     std::string callingBundleName;
3792     ObtainCallingBundleName(callingBundleName);
3793 
3794     if (appGalleryBundleName.empty() || callingBundleName.empty() || appGalleryBundleName != callingBundleName) {
3795         APP_LOGE("Failed, appGalleryBundleName: %{public}s. callingBundleName: %{public}s",
3796             appGalleryBundleName.c_str(), callingBundleName.c_str());
3797         return ERR_BUNDLE_MANAGER_NOT_APP_GALLERY_CALL;
3798     }
3799 
3800     auto dataMgr = GetDataMgrFromService();
3801     if (dataMgr == nullptr) {
3802         APP_LOGE("DataMgr is nullptr");
3803         return ERR_BUNDLE_MANAGER_INTERNAL_ERROR;
3804     }
3805     return dataMgr->SetAdditionalInfo(bundleName, additionalInfo);
3806 }
3807 
CreateBundleDataDir(int32_t userId)3808 ErrCode BundleMgrHostImpl::CreateBundleDataDir(int32_t userId)
3809 {
3810     if (!BundlePermissionMgr::IsCallingUidValid(Constants::ROOT_UID)) {
3811         APP_LOGE("IsCallingUidValid failed");
3812         return ERR_BUNDLE_MANAGER_PERMISSION_DENIED;
3813     }
3814 
3815     auto dataMgr = GetDataMgrFromService();
3816     if (dataMgr == nullptr) {
3817         APP_LOGE("DataMgr is nullptr");
3818         return ERR_BUNDLE_MANAGER_INTERNAL_ERROR;
3819     }
3820     return dataMgr->CreateBundleDataDir(userId);
3821 }
3822 
UpdateAppEncryptedStatus(const std::string &bundleName, bool isExisted, int32_t appIndex)3823 ErrCode BundleMgrHostImpl::UpdateAppEncryptedStatus(const std::string &bundleName, bool isExisted, int32_t appIndex)
3824 {
3825     if (!BundlePermissionMgr::IsCallingUidValid(Constants::CODE_PROTECT_UID)) {
3826         APP_LOGE("IsCallingUidValid failed");
3827         return ERR_BUNDLE_MANAGER_PERMISSION_DENIED;
3828     }
3829 
3830     auto dataMgr = GetDataMgrFromService();
3831     if (dataMgr == nullptr) {
3832         APP_LOGE("DataMgr is nullptr");
3833         return ERR_BUNDLE_MANAGER_INTERNAL_ERROR;
3834     }
3835     return dataMgr->UpdateAppEncryptedStatus(bundleName, isExisted, appIndex);
3836 }
3837 
GetBundleResourceProxy()3838 sptr<IBundleResource> BundleMgrHostImpl::GetBundleResourceProxy()
3839 {
3840 #ifdef BUNDLE_FRAMEWORK_BUNDLE_RESOURCE
3841     int32_t timerId = XCollieHelper::SetRecoveryTimer(FUNCATION_GET_BUNDLE_RESOURCE_PROXY);
3842     ScopeGuard cancelTimerIdGuard([timerId] { XCollieHelper::CancelTimer(timerId); });
3843     return DelayedSingleton<BundleMgrService>::GetInstance()->GetBundleResourceProxy();
3844 #else
3845     return nullptr;
3846 #endif
3847 }
3848 
GetPreferableBundleInfoFromHapPaths(const std::vector<std::string> &hapPaths, BundleInfo &bundleInfo)3849 bool BundleMgrHostImpl::GetPreferableBundleInfoFromHapPaths(const std::vector<std::string> &hapPaths,
3850     BundleInfo &bundleInfo)
3851 {
3852     if (hapPaths.empty()) {
3853         return false;
3854     }
3855     for (auto hapPath: hapPaths) {
3856         BundleInfo resultBundleInfo;
3857         if (!GetBundleArchiveInfo(hapPath, GET_BUNDLE_DEFAULT, resultBundleInfo)) {
3858             return false;
3859         }
3860         bundleInfo = resultBundleInfo;
3861         if (!bundleInfo.hapModuleInfos.empty()) {
3862             bundleInfo.hapModuleInfos[0].hapPath = hapPath;
3863             if (bundleInfo.hapModuleInfos[0].moduleType == ModuleType::ENTRY) {
3864                 return true;
3865             }
3866         }
3867     }
3868     return true;
3869 }
3870 
GetRecoverableApplicationInfo( std::vector<RecoverableApplicationInfo> &recoverableApplicaitons)3871 ErrCode BundleMgrHostImpl::GetRecoverableApplicationInfo(
3872     std::vector<RecoverableApplicationInfo> &recoverableApplicaitons)
3873 {
3874     APP_LOGD("begin to GetRecoverableApplicationInfo");
3875     if (!BundlePermissionMgr::IsSystemApp()) {
3876         APP_LOGE("non-system app calling system api");
3877         return ERR_BUNDLE_MANAGER_SYSTEM_API_DENIED;
3878     }
3879     if (!BundlePermissionMgr::VerifyCallingPermissionForAll(Constants::PERMISSION_GET_BUNDLE_INFO_PRIVILEGED)) {
3880         APP_LOGE("verify permission failed");
3881         return ERR_BUNDLE_MANAGER_PERMISSION_DENIED;
3882     }
3883     auto dataMgr = GetDataMgrFromService();
3884     if (dataMgr == nullptr) {
3885         APP_LOGE("dataMgr is nullptr");
3886         return ERR_BUNDLE_MANAGER_INTERNAL_ERROR;
3887     }
3888     int32_t userId = AccountHelper::GetCurrentActiveUserId();
3889     if (userId == Constants::INVALID_USERID) {
3890         APP_LOGE("userId %{public}d is invalid", userId);
3891         return ERR_BUNDLE_MANAGER_INVALID_USER_ID;
3892     }
3893     BmsExtensionDataMgr bmsExtensionDataMgr;
3894     std::vector<PreInstallBundleInfo> recoverableBundleInfos = dataMgr->GetRecoverablePreInstallBundleInfos();
3895     for (auto recoverableBundleInfo: recoverableBundleInfos) {
3896         std::string bundleName = recoverableBundleInfo.GetBundleName();
3897         if (bmsExtensionDataMgr.IsAppInBlocklist(bundleName, userId)) {
3898             APP_LOGI("recover app %{public}s is in blocklist", bundleName.c_str());
3899             continue;
3900         }
3901         RecoverableApplicationInfo recoverableApplication;
3902         recoverableApplication.bundleName = bundleName;
3903         recoverableApplication.labelId = recoverableBundleInfo.GetLabelId();
3904         recoverableApplication.iconId = recoverableBundleInfo.GetIconId();
3905         recoverableApplication.systemApp = recoverableBundleInfo.GetSystemApp();
3906         recoverableApplication.codePaths = recoverableBundleInfo.GetBundlePaths();
3907         recoverableApplication.moduleName = recoverableBundleInfo.GetModuleName();
3908         recoverableApplication.bundleType = recoverableBundleInfo.GetBundleType();
3909         recoverableApplicaitons.emplace_back(recoverableApplication);
3910     }
3911     return ERR_OK;
3912 }
3913 
GetUninstalledBundleInfo(const std::string bundleName, BundleInfo &bundleInfo)3914 ErrCode BundleMgrHostImpl::GetUninstalledBundleInfo(const std::string bundleName, BundleInfo &bundleInfo)
3915 {
3916     APP_LOGD("begin to GetUninstalledBundleInfo");
3917     if (!BundlePermissionMgr::IsSystemApp()) {
3918         APP_LOGE("non-system app calling system api");
3919         return ERR_BUNDLE_MANAGER_SYSTEM_API_DENIED;
3920     }
3921     if (!BundlePermissionMgr::VerifyCallingPermissionForAll(Constants::PERMISSION_GET_BUNDLE_INFO_PRIVILEGED)) {
3922         APP_LOGE("verify permission failed");
3923         return ERR_BUNDLE_MANAGER_PERMISSION_DENIED;
3924     }
3925     auto dataMgr = GetDataMgrFromService();
3926     if (dataMgr == nullptr) {
3927         APP_LOGE("dataMgr is nullptr");
3928         return ERR_BUNDLE_MANAGER_INTERNAL_ERROR;
3929     }
3930     int32_t userId = AccountHelper::GetCurrentActiveUserId();
3931     if (userId == Constants::INVALID_USERID) {
3932         APP_LOGE("userId %{public}d is invalid", userId);
3933         return ERR_BUNDLE_MANAGER_INVALID_USER_ID;
3934     }
3935     if (dataMgr->HasUserInstallInBundle(bundleName, Constants::DEFAULT_USERID) ||
3936         dataMgr->HasUserInstallInBundle(bundleName, userId)) {
3937         APP_LOGE("bundle has installed");
3938         return ERR_APPEXECFWK_FAILED_GET_BUNDLE_INFO;
3939     }
3940     PreInstallBundleInfo preInstallBundleInfo;
3941     if (!dataMgr->GetPreInstallBundleInfo(bundleName, preInstallBundleInfo)) {
3942         APP_LOGE("get preinstallBundleInfo failed");
3943         return ERR_APPEXECFWK_FAILED_GET_BUNDLE_INFO;
3944     }
3945     if (!GetPreferableBundleInfoFromHapPaths(
3946         preInstallBundleInfo.GetBundlePaths(), bundleInfo)) {
3947         APP_LOGE("prefect bundle is not found");
3948         return ERR_APPEXECFWK_FAILED_GET_BUNDLE_INFO;
3949     }
3950     return ERR_OK;
3951 }
3952 
IsBundleExist(const std::string &bundleName)3953 bool BundleMgrHostImpl::IsBundleExist(const std::string &bundleName)
3954 {
3955     auto dataMgr = GetDataMgrFromService();
3956     if (dataMgr == nullptr) {
3957         APP_LOGE("dataMgr is nullptr");
3958         return false;
3959     }
3960     return dataMgr->IsBundleExist(bundleName);
3961 }
3962 
ClearCache(const std::string &bundleName, const sptr<ICleanCacheCallback> cleanCacheCallback, int32_t userId)3963 ErrCode BundleMgrHostImpl::ClearCache(const std::string &bundleName,
3964     const sptr<ICleanCacheCallback> cleanCacheCallback, int32_t userId)
3965 {
3966     auto bmsExtensionClient = std::make_shared<BmsExtensionClient>();
3967     ErrCode ret = bmsExtensionClient->ClearCache(bundleName, cleanCacheCallback->AsObject(), userId);
3968     APP_LOGI("ret : %{public}d", ret);
3969     if (ret != ERR_OK) {
3970         ret = ERR_BUNDLE_MANAGER_BUNDLE_NOT_EXIST;
3971     }
3972     EventReport::SendCleanCacheSysEvent(bundleName, userId, true, ret != ERR_OK);
3973     return ret;
3974 }
3975 
CanOpenLink( const std::string &link, bool &canOpen)3976 ErrCode BundleMgrHostImpl::CanOpenLink(
3977     const std::string &link, bool &canOpen)
3978 {
3979     APP_LOGD("start CanOpenLink, link : %{public}s", link.c_str());
3980     auto dataMgr = GetDataMgrFromService();
3981     if (dataMgr == nullptr) {
3982         APP_LOGE("DataMgr is nullptr");
3983         return ERR_BUNDLE_MANAGER_INTERNAL_ERROR;
3984     }
3985     return dataMgr->CanOpenLink(link, canOpen);
3986 }
3987 
GetOdid(std::string &odid)3988 ErrCode BundleMgrHostImpl::GetOdid(std::string &odid)
3989 {
3990     APP_LOGD("start GetOdid");
3991     auto dataMgr = GetDataMgrFromService();
3992     if (dataMgr == nullptr) {
3993         APP_LOGE("DataMgr is nullptr");
3994         return ERR_BUNDLE_MANAGER_INTERNAL_ERROR;
3995     }
3996     return dataMgr->GetOdid(odid);
3997 }
3998 
GetAllPreinstalledApplicationInfos( std::vector<PreinstalledApplicationInfo> &preinstalledApplicationInfos)3999 ErrCode BundleMgrHostImpl::GetAllPreinstalledApplicationInfos(
4000     std::vector<PreinstalledApplicationInfo> &preinstalledApplicationInfos)
4001 {
4002     if (!BundlePermissionMgr::IsSystemApp()) {
4003         APP_LOGE("Non-system app calling system api");
4004         return ERR_BUNDLE_MANAGER_SYSTEM_API_DENIED;
4005     }
4006     if (!BundlePermissionMgr::VerifyCallingPermissionForAll(Constants::PERMISSION_GET_BUNDLE_INFO_PRIVILEGED)) {
4007         APP_LOGE("Verify permission failed");
4008         return ERR_BUNDLE_MANAGER_PERMISSION_DENIED;
4009     }
4010     auto dataMgr = GetDataMgrFromService();
4011     if (dataMgr == nullptr) {
4012         APP_LOGE("DataMgr is nullptr");
4013         return ERR_BUNDLE_MANAGER_INTERNAL_ERROR;
4014     }
4015     std::vector<PreInstallBundleInfo> preInstallBundleInfos = dataMgr->GetAllPreInstallBundleInfos();
4016     for (auto &preInstallBundleInfo: preInstallBundleInfos) {
4017         PreinstalledApplicationInfo preinstalledApplicationInfo;
4018         preinstalledApplicationInfo.bundleName = preInstallBundleInfo.GetBundleName();
4019         preinstalledApplicationInfo.moduleName = preInstallBundleInfo.GetModuleName();
4020         preinstalledApplicationInfo.labelId = preInstallBundleInfo.GetLabelId();
4021         preinstalledApplicationInfo.iconId = preInstallBundleInfo.GetIconId();
4022         preinstalledApplicationInfos.emplace_back(preinstalledApplicationInfo);
4023     }
4024     return ERR_OK;
4025 }
4026 
GetAllBundleInfoByDeveloperId(const std::string &developerId, std::vector<BundleInfo> &bundleInfos, int32_t userId)4027 ErrCode BundleMgrHostImpl::GetAllBundleInfoByDeveloperId(const std::string &developerId,
4028     std::vector<BundleInfo> &bundleInfos, int32_t userId)
4029 {
4030     APP_LOGI("start GetAllBundleInfoByDeveloperId for developerId: %{public}s with user: %{public}d",
4031         developerId.c_str(), userId);
4032     if (!BundlePermissionMgr::IsSystemApp()) {
4033         APP_LOGE("non-system app calling system api");
4034         return ERR_BUNDLE_MANAGER_SYSTEM_API_DENIED;
4035     }
4036     if (!BundlePermissionMgr::VerifyCallingPermissionForAll(Constants::PERMISSION_GET_BUNDLE_INFO_PRIVILEGED)) {
4037         APP_LOGE("verify permission failed");
4038         return ERR_BUNDLE_MANAGER_PERMISSION_DENIED;
4039     }
4040     APP_LOGI("verify permission success, begin to GetAllBundleInfoByDeveloperId");
4041     auto dataMgr = GetDataMgrFromService();
4042     if (dataMgr == nullptr) {
4043         APP_LOGE("DataMgr is nullptr");
4044         return ERR_BUNDLE_MANAGER_INTERNAL_ERROR;
4045     }
4046     return dataMgr->GetAllBundleInfoByDeveloperId(developerId, bundleInfos, userId);
4047 }
4048 
GetDeveloperIds(const std::string &appDistributionType, std::vector<std::string> &developerIdList, int32_t userId)4049 ErrCode BundleMgrHostImpl::GetDeveloperIds(const std::string &appDistributionType,
4050     std::vector<std::string> &developerIdList, int32_t userId)
4051 {
4052     APP_LOGI("start GetDeveloperIds for appDistributionType: %{public}s with user: %{public}d",
4053         appDistributionType.c_str(), userId);
4054     if (!BundlePermissionMgr::IsSystemApp()) {
4055         APP_LOGE("non-system app calling system api");
4056         return ERR_BUNDLE_MANAGER_SYSTEM_API_DENIED;
4057     }
4058     if (!BundlePermissionMgr::VerifyCallingPermissionForAll(Constants::PERMISSION_GET_BUNDLE_INFO_PRIVILEGED)) {
4059         APP_LOGE("verify permission failed");
4060         return ERR_BUNDLE_MANAGER_PERMISSION_DENIED;
4061     }
4062     APP_LOGI("verify permission success, begin to GetDeveloperIds");
4063     auto dataMgr = GetDataMgrFromService();
4064     if (dataMgr == nullptr) {
4065         APP_LOGE("DataMgr is nullptr");
4066         return ERR_BUNDLE_MANAGER_INTERNAL_ERROR;
4067     }
4068     return dataMgr->GetDeveloperIds(appDistributionType, developerIdList, userId);
4069 }
4070 
SwitchUninstallState(const std::string &bundleName, const bool &state, bool isNeedSendNotify)4071 ErrCode BundleMgrHostImpl::SwitchUninstallState(const std::string &bundleName, const bool &state,
4072     bool isNeedSendNotify)
4073 {
4074     APP_LOGD("start SwitchUninstallState, bundleName : %{public}s, state : %{public}d", bundleName.c_str(), state);
4075     if (!BundlePermissionMgr::IsSystemApp()) {
4076         APP_LOGE("non-system app calling system api");
4077         return ERR_BUNDLE_MANAGER_SYSTEM_API_DENIED;
4078     }
4079     if (!BundlePermissionMgr::VerifyCallingPermissionForAll(
4080         ServiceConstants::PERMISSION_CHANGE_BUNDLE_UNINSTALL_STATE)) {
4081         APP_LOGE("verify permission failed");
4082         return ERR_BUNDLE_MANAGER_PERMISSION_DENIED;
4083     }
4084     APP_LOGD("verify permission success, begin to SwitchUninstallState");
4085     auto dataMgr = GetDataMgrFromService();
4086     if (dataMgr == nullptr) {
4087         APP_LOGE("DataMgr is nullptr");
4088         return ERR_BUNDLE_MANAGER_INTERNAL_ERROR;
4089     }
4090     auto resCode = dataMgr->SwitchUninstallState(bundleName, state, isNeedSendNotify);
4091     if (resCode != ERR_OK) {
4092         APP_LOGE("set status fail");
4093         return resCode;
4094     }
4095     if (!isNeedSendNotify) {
4096         APP_LOGI("no need notify %{public}s", bundleName.c_str());
4097         return resCode;
4098     }
4099     InnerBundleInfo innerBundleInfo;
4100     bool isSuccess = dataMgr->FetchInnerBundleInfo(bundleName, innerBundleInfo);
4101     if (!isSuccess) {
4102         APP_LOGE("get innerBundleInfo fail");
4103         return resCode;
4104     }
4105     AbilityInfo mainAbilityInfo;
4106     int32_t currentActiveUserId = AccountHelper::GetCurrentActiveUserId();
4107     innerBundleInfo.GetMainAbilityInfo(mainAbilityInfo);
4108     NotifyBundleEvents installRes = {
4109         .isModuleUpdate = true,
4110         .type = NotifyType::UPDATE,
4111         .resultCode = ERR_OK,
4112         .accessTokenId = innerBundleInfo.GetAccessTokenId(currentActiveUserId),
4113         .uid = innerBundleInfo.GetUid(currentActiveUserId),
4114         .bundleType = static_cast<int32_t>(innerBundleInfo.GetApplicationBundleType()),
4115         .bundleName = innerBundleInfo.GetBundleName(),
4116         .modulePackage = innerBundleInfo.GetModuleNameVec()[0],
4117         .abilityName = mainAbilityInfo.name,
4118         .appDistributionType = innerBundleInfo.GetAppDistributionType(),
4119     };
4120     std::shared_ptr<BundleCommonEventMgr> commonEventMgr = std::make_shared<BundleCommonEventMgr>();
4121     commonEventMgr->NotifyBundleStatus(installRes, dataMgr);
4122     return resCode;
4123 }
4124 
SetProvisionInfoToInnerBundleInfo(const std::string &hapPath, InnerBundleInfo &info)4125 void BundleMgrHostImpl::SetProvisionInfoToInnerBundleInfo(const std::string &hapPath, InnerBundleInfo &info)
4126 {
4127     Security::Verify::HapVerifyResult hapVerifyResult;
4128     ErrCode verifyRes = BundleVerifyMgr::HapVerify(hapPath, hapVerifyResult);
4129     if (verifyRes != ERR_OK) {
4130         return;
4131     }
4132     Security::Verify::ProvisionInfo provisionInfo = hapVerifyResult.GetProvisionInfo();
4133     bool isSystemApp = provisionInfo.bundleInfo.appFeature == ServiceConstants::HOS_SYSTEM_APP;
4134     info.SetAppType(isSystemApp ? Constants::AppType::SYSTEM_APP : Constants::AppType::THIRD_PARTY_APP);
4135     info.SetProvisionId(provisionInfo.appId);
4136     info.SetCertificateFingerprint(provisionInfo.fingerprint);
4137     info.SetAppIdentifier(provisionInfo.bundleInfo.appIdentifier);
4138     if (provisionInfo.type == Security::Verify::ProvisionType::DEBUG) {
4139         info.SetCertificate(provisionInfo.bundleInfo.developmentCertificate);
4140     } else {
4141         info.SetCertificate(provisionInfo.bundleInfo.distributionCertificate);
4142     }
4143     info.SetAppPrivilegeLevel(provisionInfo.bundleInfo.apl);
4144     bool isDebug = provisionInfo.type == Security::Verify::ProvisionType::DEBUG;
4145     info.SetAppProvisionType(isDebug ? Constants::APP_PROVISION_TYPE_DEBUG : Constants::APP_PROVISION_TYPE_RELEASE);
4146     std::string distributionType;
4147     auto typeIter = APP_DISTRIBUTION_TYPE_MAPS.find(provisionInfo.distributionType);
4148     if (typeIter == APP_DISTRIBUTION_TYPE_MAPS.end()) {
4149         distributionType = Constants::APP_DISTRIBUTION_TYPE_NONE;
4150     }
4151     distributionType = typeIter->second;
4152     info.SetAppDistributionType(distributionType);
4153 }
4154 
QueryAbilityInfoByContinueType(const std::string &bundleName, const std::string &continueType, AbilityInfo &abilityInfo, int32_t userId)4155 ErrCode BundleMgrHostImpl::QueryAbilityInfoByContinueType(const std::string &bundleName,
4156     const std::string &continueType, AbilityInfo &abilityInfo, int32_t userId)
4157 {
4158     APP_LOGD("QueryAbilityInfoByContinueType, bundleName : %{public}s, continueType : %{public}s, userId: %{public}d",
4159         bundleName.c_str(), continueType.c_str(), userId);
4160     if (!BundlePermissionMgr::IsSystemApp()) {
4161         APP_LOGE("non-system app calling system api");
4162         EventReport::SendQueryAbilityInfoByContinueTypeSysEvent(bundleName, EMPTY_ABILITY_NAME,
4163             ERR_BUNDLE_MANAGER_SYSTEM_API_DENIED, userId, continueType);
4164         return ERR_BUNDLE_MANAGER_SYSTEM_API_DENIED;
4165     }
4166     if (!BundlePermissionMgr::VerifyCallingPermissionsForAll({Constants::PERMISSION_GET_BUNDLE_INFO_PRIVILEGED}) &&
4167         !BundlePermissionMgr::IsBundleSelfCalling(bundleName)) {
4168         APP_LOGE("verify permission failed");
4169         EventReport::SendQueryAbilityInfoByContinueTypeSysEvent(bundleName, EMPTY_ABILITY_NAME,
4170             ERR_BUNDLE_MANAGER_PERMISSION_DENIED, userId, continueType);
4171         return ERR_BUNDLE_MANAGER_PERMISSION_DENIED;
4172     }
4173     APP_LOGD("verify permission success, begin to QueryAbilityInfoByContinueType");
4174     auto dataMgr = GetDataMgrFromService();
4175     if (dataMgr == nullptr) {
4176         APP_LOGE("DataMgr is nullptr");
4177         EventReport::SendQueryAbilityInfoByContinueTypeSysEvent(bundleName, EMPTY_ABILITY_NAME,
4178             ERR_BUNDLE_MANAGER_INTERNAL_ERROR, userId, continueType);
4179         return ERR_BUNDLE_MANAGER_INTERNAL_ERROR;
4180     }
4181     ErrCode res = dataMgr->QueryAbilityInfoByContinueType(bundleName, continueType, abilityInfo, userId);
4182     std::string abilityName;
4183     if (res == ERR_OK) {
4184         abilityName = abilityInfo.name;
4185     }
4186     EventReport::SendQueryAbilityInfoByContinueTypeSysEvent(bundleName, abilityName, res, userId, continueType);
4187     return res;
4188 }
4189 
QueryCloneAbilityInfo(const ElementName &element, int32_t flags, int32_t appIndex, AbilityInfo &abilityInfo, int32_t userId)4190 ErrCode BundleMgrHostImpl::QueryCloneAbilityInfo(const ElementName &element,
4191     int32_t flags, int32_t appIndex, AbilityInfo &abilityInfo, int32_t userId)
4192 {
4193     HITRACE_METER_NAME(HITRACE_TAG_APP, __PRETTY_FUNCTION__);
4194     std::string bundleName = element.GetBundleName();
4195     std::string abilityName = element.GetAbilityName();
4196     LOG_D(BMS_TAG_QUERY,
4197         "flags : %{public}d, userId : %{public}d, bundleName: %{public}s, abilityName: %{public}s",
4198         flags, userId, bundleName.c_str(), abilityName.c_str());
4199 
4200     if (bundleName.empty() || abilityName.empty()) {
4201         LOG_E(BMS_TAG_QUERY, "invalid params");
4202         return ERR_APPEXECFWK_CLONE_QUERY_PARAM_ERROR;
4203     }
4204     if (!BundlePermissionMgr::IsSystemApp()) {
4205         LOG_E(BMS_TAG_QUERY, "non-system app calling system api");
4206         return ERR_BUNDLE_MANAGER_SYSTEM_API_DENIED;
4207     }
4208     if (!BundlePermissionMgr::VerifyCallingPermissionsForAll({Constants::PERMISSION_GET_BUNDLE_INFO_PRIVILEGED})
4209         && !BundlePermissionMgr::IsBundleSelfCalling(bundleName)) {
4210         LOG_E(BMS_TAG_QUERY, "verify permission failed");
4211         return ERR_BUNDLE_MANAGER_PERMISSION_DENIED;
4212     }
4213     auto dataMgr = GetDataMgrFromService();
4214     if (dataMgr == nullptr) {
4215         LOG_E(BMS_TAG_QUERY, "DataMgr is nullptr");
4216         return ERR_BUNDLE_MANAGER_INTERNAL_ERROR;
4217     }
4218     auto res = dataMgr->QueryCloneAbilityInfo(element, flags, userId, appIndex, abilityInfo);
4219     if (res != ERR_OK) {
4220         LOG_E(BMS_TAG_QUERY, "QueryCloneAbilityInfo fail, err: %{public}d", res);
4221         return res;
4222     }
4223     return ERR_OK;
4224 }
4225 
GetCloneBundleInfo(const std::string &bundleName, int32_t flags, int32_t appIndex, BundleInfo &bundleInfo, int32_t userId)4226 ErrCode BundleMgrHostImpl::GetCloneBundleInfo(const std::string &bundleName, int32_t flags,
4227     int32_t appIndex, BundleInfo &bundleInfo, int32_t userId)
4228 {
4229     int32_t timerId = XCollieHelper::SetRecoveryTimer(FUNCATION_GET_CLONE_BUNDLE_INFO);
4230     ScopeGuard cancelTimerIdGuard([timerId] { XCollieHelper::CancelTimer(timerId); });
4231     if (!BundlePermissionMgr::IsSystemApp()) {
4232         APP_LOGE("non-system app calling system api");
4233         return ERR_BUNDLE_MANAGER_SYSTEM_API_DENIED;
4234     }
4235     if (!BundlePermissionMgr::VerifyCallingPermissionForAll(Constants::PERMISSION_GET_BUNDLE_INFO_PRIVILEGED)
4236         && !BundlePermissionMgr::IsBundleSelfCalling(bundleName)) {
4237         APP_LOGE("verify permission failed");
4238         return ERR_BUNDLE_MANAGER_PERMISSION_DENIED;
4239     }
4240     APP_LOGD("verify permission success, begin to GetCloneBundleInfo");
4241     auto dataMgr = GetDataMgrFromService();
4242     if (dataMgr == nullptr) {
4243         APP_LOGE("DataMgr is nullptr");
4244         return ERR_BUNDLE_MANAGER_INTERNAL_ERROR;
4245     }
4246     auto res = dataMgr->GetCloneBundleInfo(bundleName, flags, appIndex, bundleInfo, userId);
4247     if (res != ERR_OK) {
4248         APP_LOGE_NOFUNC("GetCloneBundleInfo fail -n %{public}s -u %{public}d -i %{public}d -f %{public}d"
4249             " err:%{public}d", bundleName.c_str(), userId, appIndex, flags, res);
4250         return res;
4251     }
4252     return ERR_OK;
4253 }
4254 
GetCloneAppIndexes(const std::string &bundleName, std::vector<int32_t> &appIndexes, int32_t userId)4255 ErrCode BundleMgrHostImpl::GetCloneAppIndexes(const std::string &bundleName, std::vector<int32_t> &appIndexes,
4256     int32_t userId)
4257 {
4258     APP_LOGD("start GetCloneAppIndexes bundleName = %{public}s, userId = %{public}d", bundleName.c_str(), userId);
4259     if (!BundlePermissionMgr::IsSystemApp()) {
4260         APP_LOGE("non-system app calling system api");
4261         return ERR_BUNDLE_MANAGER_SYSTEM_API_DENIED;
4262     }
4263     if (!BundlePermissionMgr::VerifyCallingPermissionForAll(Constants::PERMISSION_GET_BUNDLE_INFO_PRIVILEGED)
4264         && !BundlePermissionMgr::IsBundleSelfCalling(bundleName)) {
4265         APP_LOGE("verify permission failed");
4266         return ERR_BUNDLE_MANAGER_PERMISSION_DENIED;
4267     }
4268     APP_LOGD("verify permission success, begin to GetCloneAppIndexes");
4269     auto dataMgr = GetDataMgrFromService();
4270     if (dataMgr == nullptr) {
4271         APP_LOGE("DataMgr is nullptr");
4272         return ERR_BUNDLE_MANAGER_INTERNAL_ERROR;
4273     }
4274     appIndexes = dataMgr->GetCloneAppIndexes(bundleName, userId);
4275     return ERR_OK;
4276 }
4277 
GetLaunchWant(Want &want)4278 ErrCode BundleMgrHostImpl::GetLaunchWant(Want &want)
4279 {
4280     APP_LOGD("start GetLaunchWant");
4281     auto dataMgr = GetDataMgrFromService();
4282     if (dataMgr == nullptr) {
4283         LOG_E(BMS_TAG_QUERY, "DataMgr is nullptr");
4284         return ERR_BUNDLE_MANAGER_INTERNAL_ERROR;
4285     }
4286     auto uid = IPCSkeleton::GetCallingUid();
4287     std::string bundleName;
4288     auto ret = dataMgr->GetBundleNameForUid(uid, bundleName);
4289     if (!ret) {
4290         LOG_NOFUNC_E(BMS_TAG_QUERY, "GetBundleNameForUid failed uid:%{public}d", uid);
4291         return ERR_BUNDLE_MANAGER_BUNDLE_NOT_EXIST;
4292     }
4293     int32_t userId = AccountHelper::GetOsAccountLocalIdFromUid(uid);
4294     return dataMgr->GetLaunchWantForBundle(bundleName, want, userId);
4295 }
4296 
QueryCloneExtensionAbilityInfoWithAppIndex(const ElementName &element, int32_t flags, int32_t appIndex, ExtensionAbilityInfo &extensionAbilityInfo, int32_t userId)4297 ErrCode BundleMgrHostImpl::QueryCloneExtensionAbilityInfoWithAppIndex(const ElementName &element, int32_t flags,
4298     int32_t appIndex, ExtensionAbilityInfo &extensionAbilityInfo, int32_t userId)
4299 {
4300     HITRACE_METER_NAME(HITRACE_TAG_APP, __PRETTY_FUNCTION__);
4301     LOG_D(BMS_TAG_QUERY, "QueryCloneExtensionAbilityInfoWithAppIndex without type begin");
4302     if (!BundlePermissionMgr::VerifyCallingPermissionsForAll({Constants::PERMISSION_GET_BUNDLE_INFO_PRIVILEGED})) {
4303         LOG_E(BMS_TAG_QUERY, "verify permission failed");
4304         return ERR_BUNDLE_MANAGER_PERMISSION_DENIED;
4305     }
4306     auto dataMgr = GetDataMgrFromService();
4307     if (dataMgr == nullptr) {
4308         LOG_E(BMS_TAG_QUERY, "DataMgr is nullptr");
4309         return ERR_BUNDLE_MANAGER_INTERNAL_ERROR;
4310     }
4311     std::string bundleName = element.GetBundleName();
4312     std::string extensionName = element.GetAbilityName();
4313     if (bundleName.empty() || extensionName.empty()) {
4314         LOG_E(BMS_TAG_QUERY,
4315             "QueryCloneExtensionAbilityInfoWithAppIndex is failed, bundleName:%{public}s, extensionName:%{public}s",
4316             bundleName.c_str(), extensionName.c_str());
4317         return ERR_BUNDLE_MANAGER_PARAM_ERROR;
4318     }
4319 
4320     Want want;
4321     want.SetElement(element);
4322     ErrCode ret = dataMgr->ExplicitQueryExtensionInfoV9(want, flags, userId, extensionAbilityInfo, appIndex);
4323     if (ret != ERR_OK) {
4324         LOG_D(BMS_TAG_QUERY, "explicit queryExtensionInfo error");
4325         return ERR_BUNDLE_MANAGER_ABILITY_NOT_EXIST;
4326     }
4327     return ERR_OK;
4328 }
4329 
GetSignatureInfoByBundleName(const std::string &bundleName, SignatureInfo &signatureInfo)4330 ErrCode BundleMgrHostImpl::GetSignatureInfoByBundleName(const std::string &bundleName, SignatureInfo &signatureInfo)
4331 {
4332     HITRACE_METER_NAME(HITRACE_TAG_APP, __PRETTY_FUNCTION__);
4333     int32_t uid = OHOS::IPCSkeleton::GetCallingUid();
4334     if (uid != Constants::FOUNDATION_UID) {
4335         LOG_E(BMS_TAG_DEFAULT, "uid: %{public}d not foundation", uid);
4336         return ERR_BUNDLE_MANAGER_PERMISSION_DENIED;
4337     }
4338     auto dataMgr = GetDataMgrFromService();
4339     if (dataMgr == nullptr) {
4340         LOG_E(BMS_TAG_DEFAULT, "DataMgr is nullptr");
4341         return ERR_BUNDLE_MANAGER_INTERNAL_ERROR;
4342     }
4343     return dataMgr->GetSignatureInfoByBundleName(bundleName, signatureInfo);
4344 }
4345 
CheckCanSetEnable(const std::string &bundleName)4346 bool BundleMgrHostImpl::CheckCanSetEnable(const std::string &bundleName)
4347 {
4348     std::vector<std::string> noDisablingList;
4349     std::string configPath = BundleUtil::GetNoDisablingConfigPath();
4350     ErrCode ret = BundleParser::ParseNoDisablingList(configPath, noDisablingList);
4351     if (ret != ERR_OK) {
4352         LOG_W(BMS_TAG_DEFAULT, "GetNoDisablingList failed");
4353         return true;
4354     }
4355     auto it = std::find(noDisablingList.begin(), noDisablingList.end(), bundleName);
4356     if (it == noDisablingList.end()) {
4357         return true;
4358     }
4359     return false;
4360 }
4361 
AddDesktopShortcutInfo(const ShortcutInfo &shortcutInfo, int32_t userId)4362 ErrCode BundleMgrHostImpl::AddDesktopShortcutInfo(const ShortcutInfo &shortcutInfo, int32_t userId)
4363 {
4364     if (!BundlePermissionMgr::IsSystemApp()) {
4365         APP_LOGE("Non-system app calling system api");
4366         return ERR_BUNDLE_MANAGER_SYSTEM_API_DENIED;
4367     }
4368     if (!BundlePermissionMgr::VerifyCallingPermissionForAll(Constants::PERMISSION_MANAGER_SHORTCUT)) {
4369         APP_LOGE("Verify permission failed");
4370         return ERR_BUNDLE_MANAGER_PERMISSION_DENIED;
4371     }
4372     auto dataMgr = GetDataMgrFromService();
4373     if (dataMgr == nullptr) {
4374         APP_LOGE("DataMgr is nullptr");
4375         return ERR_BUNDLE_MANAGER_INTERNAL_ERROR;
4376     }
4377     return dataMgr->AddDesktopShortcutInfo(shortcutInfo, userId);
4378 }
4379 
DeleteDesktopShortcutInfo(const ShortcutInfo &shortcutInfo, int32_t userId)4380 ErrCode BundleMgrHostImpl::DeleteDesktopShortcutInfo(const ShortcutInfo &shortcutInfo, int32_t userId)
4381 {
4382     if (!BundlePermissionMgr::IsSystemApp()) {
4383         APP_LOGE("Non-system app calling system api");
4384         return ERR_BUNDLE_MANAGER_SYSTEM_API_DENIED;
4385     }
4386     if (!BundlePermissionMgr::VerifyCallingPermissionForAll(Constants::PERMISSION_MANAGER_SHORTCUT)) {
4387         APP_LOGE("Verify permission failed");
4388         return ERR_BUNDLE_MANAGER_PERMISSION_DENIED;
4389     }
4390     auto dataMgr = GetDataMgrFromService();
4391     if (dataMgr == nullptr) {
4392         APP_LOGE("DataMgr is nullptr");
4393         return ERR_BUNDLE_MANAGER_INTERNAL_ERROR;
4394     }
4395     return dataMgr->DeleteDesktopShortcutInfo(shortcutInfo, userId);
4396 }
4397 
GetAllDesktopShortcutInfo(int32_t userId, std::vector<ShortcutInfo> &shortcutInfos)4398 ErrCode BundleMgrHostImpl::GetAllDesktopShortcutInfo(int32_t userId, std::vector<ShortcutInfo> &shortcutInfos)
4399 {
4400     if (!BundlePermissionMgr::IsSystemApp()) {
4401         APP_LOGE("Non-system app calling system api");
4402         return ERR_BUNDLE_MANAGER_SYSTEM_API_DENIED;
4403     }
4404     if (!BundlePermissionMgr::VerifyCallingPermissionForAll(Constants::PERMISSION_MANAGER_SHORTCUT)) {
4405         APP_LOGE("Verify permission failed");
4406         return ERR_BUNDLE_MANAGER_PERMISSION_DENIED;
4407     }
4408     auto dataMgr = GetDataMgrFromService();
4409     if (dataMgr == nullptr) {
4410         APP_LOGE("DataMgr is nullptr");
4411         return ERR_BUNDLE_MANAGER_INTERNAL_ERROR;
4412     }
4413     return dataMgr->GetAllDesktopShortcutInfo(userId, shortcutInfos);
4414 }
4415 
IsAppLinking(int32_t flags) const4416 bool BundleMgrHostImpl::IsAppLinking(int32_t flags) const
4417 {
4418     if ((static_cast<uint32_t>(flags) &
4419         static_cast<uint32_t>(GetAbilityInfoFlag::GET_ABILITY_INFO_WITH_APP_LINKING)) ==
4420         static_cast<uint32_t>(GetAbilityInfoFlag::GET_ABILITY_INFO_WITH_APP_LINKING)) {
4421         APP_LOGI("contains app linking flag, no need to query from bms extension");
4422         return true;
4423     }
4424     return false;
4425 }
4426 
GetOdidByBundleName(const std::string &bundleName, std::string &odid)4427 ErrCode BundleMgrHostImpl::GetOdidByBundleName(const std::string &bundleName, std::string &odid)
4428 {
4429     APP_LOGD("start GetOdidByBundleName");
4430     if (!BundlePermissionMgr::VerifyCallingPermissionForAll(Constants::PERMISSION_GET_BUNDLE_INFO_PRIVILEGED)) {
4431         APP_LOGE("Verify permission failed");
4432         return ERR_BUNDLE_MANAGER_PERMISSION_DENIED;
4433     }
4434     auto dataMgr = GetDataMgrFromService();
4435     if (dataMgr == nullptr) {
4436         APP_LOGE("DataMgr is nullptr");
4437         return ERR_BUNDLE_MANAGER_INTERNAL_ERROR;
4438     }
4439     return dataMgr->GetOdidByBundleName(bundleName, odid);
4440 }
4441 
GetBundleInfosForContinuation(int32_t flags, std::vector<BundleInfo> &bundleInfos, int32_t userId)4442 bool BundleMgrHostImpl::GetBundleInfosForContinuation(int32_t flags, std::vector<BundleInfo> &bundleInfos,
4443     int32_t userId)
4444 {
4445     GetBundleInfos(flags, bundleInfos, userId);
4446     auto dataMgr = GetDataMgrFromService();
4447     dataMgr->GetBundleInfosForContinuation(bundleInfos);
4448     return !bundleInfos.empty();
4449 }
4450 
GetContinueBundleNames( const std::string &continueBundleName, std::vector<std::string> &bundleNames, int32_t userId)4451 ErrCode BundleMgrHostImpl::GetContinueBundleNames(
4452     const std::string &continueBundleName, std::vector<std::string> &bundleNames, int32_t userId)
4453 {
4454     if (continueBundleName.empty()) {
4455         return ERR_BUNDLE_MANAGER_INVALID_PARAMETER;
4456     }
4457 
4458     if (!BundlePermissionMgr::VerifyCallingPermissionForAll(Constants::PERMISSION_GET_BUNDLE_INFO_PRIVILEGED)) {
4459         APP_LOGE("Verify permission failed");
4460         return ERR_BUNDLE_MANAGER_PERMISSION_DENIED;
4461     }
4462 
4463     auto dataMgr = GetDataMgrFromService();
4464     if (dataMgr == nullptr) {
4465         APP_LOGE("DataMgr is nullptr");
4466         return ERR_BUNDLE_MANAGER_INTERNAL_ERROR;
4467     }
4468     return dataMgr->GetContinueBundleNames(continueBundleName, bundleNames, userId);
4469 }
4470 
IsBundleInstalled(const std::string &bundleName, int32_t userId, int32_t appIndex, bool &isInstalled)4471 ErrCode BundleMgrHostImpl::IsBundleInstalled(const std::string &bundleName, int32_t userId,
4472     int32_t appIndex, bool &isInstalled)
4473 {
4474     APP_LOGD("IsBundleInstalled -n %{public}s -u %{public}d -i %{public}d", bundleName.c_str(), userId, appIndex);
4475     if (!BundlePermissionMgr::IsSystemApp()) {
4476         APP_LOGE("Non-system app calling system api");
4477         return ERR_BUNDLE_MANAGER_SYSTEM_API_DENIED;
4478     }
4479     if (!BundlePermissionMgr::VerifyCallingPermissionForAll(Constants::PERMISSION_GET_BUNDLE_INFO_PRIVILEGED)) {
4480         APP_LOGE("Verify permission failed");
4481         return ERR_BUNDLE_MANAGER_PERMISSION_DENIED;
4482     }
4483 
4484     auto dataMgr = GetDataMgrFromService();
4485     if (dataMgr == nullptr) {
4486         APP_LOGE("DataMgr is nullptr");
4487         return ERR_BUNDLE_MANAGER_INTERNAL_ERROR;
4488     }
4489     return dataMgr->IsBundleInstalled(bundleName, userId, appIndex, isInstalled);
4490 }
4491 }  // namespace AppExecFwk
4492 }  // namespace OHOS
4493