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