• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2021-2023 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 <dirent.h>
19 #include <future>
20 #include <set>
21 #include <string>
22 
23 #include "app_log_wrapper.h"
24 #include "app_privilege_capability.h"
25 #include "bundle_mgr_service.h"
26 #include "bundle_parser.h"
27 #include "bundle_permission_mgr.h"
28 #include "bundle_sandbox_app_helper.h"
29 #include "bundle_util.h"
30 #include "bundle_verify_mgr.h"
31 #include "directory_ex.h"
32 #ifdef DISTRIBUTED_BUNDLE_FRAMEWORK
33 #include "distributed_bms_proxy.h"
34 #endif
35 #include "element_name.h"
36 #include "if_system_ability_manager.h"
37 #include "installd_client.h"
38 #include "ipc_skeleton.h"
39 #include "iservice_registry.h"
40 #include "json_serializer.h"
41 #include "system_ability_definition.h"
42 
43 namespace OHOS {
44 namespace AppExecFwk {
GetApplicationInfo(const std::string & appName,const ApplicationFlag flag,const int userId,ApplicationInfo & appInfo)45 bool BundleMgrHostImpl::GetApplicationInfo(
46     const std::string &appName, const ApplicationFlag flag, const int userId, ApplicationInfo &appInfo)
47 {
48     return GetApplicationInfo(appName, static_cast<int32_t>(flag), userId, appInfo);
49 }
50 
GetApplicationInfo(const std::string & appName,int32_t flags,int32_t userId,ApplicationInfo & appInfo)51 bool BundleMgrHostImpl::GetApplicationInfo(
52     const std::string &appName, int32_t flags, int32_t userId, ApplicationInfo &appInfo)
53 {
54     APP_LOGD("start GetApplicationInfo, bundleName : %{public}s, flags : %{public}d, userId : %{public}d",
55         appName.c_str(), flags, userId);
56     if (!VerifySystemApi(Constants::API_VERSION_NINE)) {
57         APP_LOGD("non-system app calling system api");
58         return true;
59     }
60     if (!VerifyQueryPermission(appName)) {
61         APP_LOGE("verify permission failed");
62         return false;
63     }
64     APP_LOGD("verify permission success, begin to GetApplicationInfo");
65     auto dataMgr = GetDataMgrFromService();
66     if (dataMgr == nullptr) {
67         APP_LOGE("DataMgr is nullptr");
68         return false;
69     }
70     return dataMgr->GetApplicationInfo(appName, flags, userId, appInfo);
71 }
72 
GetApplicationInfoV9(const std::string & appName,int32_t flags,int32_t userId,ApplicationInfo & appInfo)73 ErrCode BundleMgrHostImpl::GetApplicationInfoV9(
74     const std::string &appName, int32_t flags, int32_t userId, ApplicationInfo &appInfo)
75 {
76     APP_LOGD("start GetApplicationInfoV9, bundleName : %{public}s, flags : %{public}d, userId : %{public}d",
77         appName.c_str(), flags, userId);
78     if (!VerifySystemApi()) {
79         APP_LOGE("non-system app calling system api");
80         return ERR_BUNDLE_MANAGER_SYSTEM_API_DENIED;
81     }
82     if (!VerifyQueryPermission(appName)) {
83         APP_LOGE("verify permission failed");
84         return ERR_BUNDLE_MANAGER_PERMISSION_DENIED;
85     }
86     APP_LOGD("verify permission success, bgein to GetApplicationInfoV9");
87     auto dataMgr = GetDataMgrFromService();
88     if (dataMgr == nullptr) {
89         APP_LOGE("DataMgr is nullptr");
90         return ERR_BUNDLE_MANAGER_INTERNAL_ERROR;
91     }
92     return dataMgr->GetApplicationInfoV9(appName, flags, userId, appInfo);
93 }
94 
GetApplicationInfos(const ApplicationFlag flag,const int userId,std::vector<ApplicationInfo> & appInfos)95 bool BundleMgrHostImpl::GetApplicationInfos(
96     const ApplicationFlag flag, const int userId, std::vector<ApplicationInfo> &appInfos)
97 {
98     return GetApplicationInfos(static_cast<int32_t>(flag), userId, appInfos);
99 }
100 
GetApplicationInfos(int32_t flags,int32_t userId,std::vector<ApplicationInfo> & appInfos)101 bool BundleMgrHostImpl::GetApplicationInfos(
102     int32_t flags, int32_t userId, std::vector<ApplicationInfo> &appInfos)
103 {
104     APP_LOGD("start GetApplicationInfos, flags : %{public}d, userId : %{public}d", flags, userId);
105     if (!VerifySystemApi(Constants::API_VERSION_NINE)) {
106         APP_LOGD("non-system app calling system api");
107         return true;
108     }
109     if (!BundlePermissionMgr::VerifyCallingPermission(Constants::PERMISSION_GET_BUNDLE_INFO_PRIVILEGED)) {
110         APP_LOGE("verify permission failed");
111         return false;
112     }
113     APP_LOGD("verify permission success, begin to GetApplicationInfos");
114     auto dataMgr = GetDataMgrFromService();
115     if (dataMgr == nullptr) {
116         APP_LOGE("DataMgr is nullptr");
117         return false;
118     }
119     return dataMgr->GetApplicationInfos(flags, userId, appInfos);
120 }
121 
GetApplicationInfosV9(int32_t flags,int32_t userId,std::vector<ApplicationInfo> & appInfos)122 ErrCode BundleMgrHostImpl::GetApplicationInfosV9(
123     int32_t flags, int32_t userId, std::vector<ApplicationInfo> &appInfos)
124 {
125     APP_LOGD("start GetApplicationInfosV9, flags : %{public}d, userId : %{public}d", flags, userId);
126     if (!VerifySystemApi()) {
127         APP_LOGE("non-system app calling system api");
128         return ERR_BUNDLE_MANAGER_SYSTEM_API_DENIED;
129     }
130     if (!BundlePermissionMgr::VerifyCallingPermission(Constants::PERMISSION_GET_BUNDLE_INFO_PRIVILEGED)) {
131         APP_LOGE("verify permission failed");
132         return ERR_BUNDLE_MANAGER_PERMISSION_DENIED;
133     }
134     APP_LOGD("verify permission success, begin to GetApplicationInfosV9");
135     auto dataMgr = GetDataMgrFromService();
136     if (dataMgr == nullptr) {
137         APP_LOGE("DataMgr is nullptr");
138         return ERR_BUNDLE_MANAGER_INTERNAL_ERROR;
139     }
140     return dataMgr->GetApplicationInfosV9(flags, userId, appInfos);
141 }
142 
GetBundleInfo(const std::string & bundleName,const BundleFlag flag,BundleInfo & bundleInfo,int32_t userId)143 bool BundleMgrHostImpl::GetBundleInfo(
144     const std::string &bundleName, const BundleFlag flag, BundleInfo &bundleInfo, int32_t userId)
145 {
146     return GetBundleInfo(bundleName, static_cast<int32_t>(flag), bundleInfo, userId);
147 }
148 
GetBundleInfo(const std::string & bundleName,int32_t flags,BundleInfo & bundleInfo,int32_t userId)149 bool BundleMgrHostImpl::GetBundleInfo(
150     const std::string &bundleName, int32_t flags, BundleInfo &bundleInfo, int32_t userId)
151 {
152     APP_LOGD("start GetBundleInfo, bundleName : %{public}s, flags : %{public}d, userId : %{public}d",
153         bundleName.c_str(), flags, userId);
154     if (!VerifySystemApi(Constants::API_VERSION_NINE)) {
155         APP_LOGD("non-system app calling system api");
156         return true;
157     }
158     if (!VerifyQueryPermission(bundleName)) {
159         APP_LOGE("verify permission failed");
160         return false;
161     }
162     APP_LOGD("verify permission success, begin to GetBundleInfo");
163     auto dataMgr = GetDataMgrFromService();
164     if (dataMgr == nullptr) {
165         APP_LOGE("DataMgr is nullptr");
166         return false;
167     }
168     return dataMgr->GetBundleInfo(bundleName, flags, bundleInfo, userId);
169 }
170 
GetBundleInfoV9(const std::string & bundleName,int32_t flags,BundleInfo & bundleInfo,int32_t userId)171 ErrCode BundleMgrHostImpl::GetBundleInfoV9(
172     const std::string &bundleName, int32_t flags, BundleInfo &bundleInfo, int32_t userId)
173 {
174     APP_LOGD("start GetBundleInfoV9, bundleName : %{public}s, flags : %{public}d, userId : %{public}d",
175         bundleName.c_str(), flags, userId);
176     if (!VerifySystemApi()) {
177         APP_LOGE("non-system app calling system api");
178         return ERR_BUNDLE_MANAGER_SYSTEM_API_DENIED;
179     }
180     if (!VerifyQueryPermission(bundleName)) {
181         APP_LOGE("verify permission failed");
182         return ERR_BUNDLE_MANAGER_PERMISSION_DENIED;
183     }
184     APP_LOGD("verify permission success, begin to GetBundleInfoV9");
185     auto dataMgr = GetDataMgrFromService();
186     if (dataMgr == nullptr) {
187         APP_LOGE("DataMgr is nullptr");
188         return ERR_BUNDLE_MANAGER_INTERNAL_ERROR;
189     }
190     return dataMgr->GetBundleInfoV9(bundleName, flags, bundleInfo, userId);
191 }
192 
GetBundleInfoForSelf(int32_t flags,BundleInfo & bundleInfo)193 ErrCode BundleMgrHostImpl::GetBundleInfoForSelf(int32_t flags, BundleInfo &bundleInfo)
194 {
195     auto uid = IPCSkeleton::GetCallingUid();
196     int32_t userId = uid / Constants::BASE_USER_RANGE;
197     std::string bundleName;
198     bool ret = GetBundleNameForUid(uid, bundleName);
199     if (!ret) {
200         APP_LOGE("GetBundleNameForUid failed");
201         return ERR_BUNDLE_MANAGER_INTERNAL_ERROR;
202     }
203     auto dataMgr = GetDataMgrFromService();
204     if (dataMgr == nullptr) {
205         APP_LOGE("DataMgr is nullptr");
206         return ERR_BUNDLE_MANAGER_INTERNAL_ERROR;
207     }
208     return dataMgr->GetBundleInfoV9(bundleName, flags, bundleInfo, userId);
209 }
210 
GetBundlePackInfo(const std::string & bundleName,const BundlePackFlag flag,BundlePackInfo & bundlePackInfo,int32_t userId)211 ErrCode BundleMgrHostImpl::GetBundlePackInfo(
212     const std::string &bundleName, const BundlePackFlag flag, BundlePackInfo &bundlePackInfo, int32_t userId)
213 {
214     return GetBundlePackInfo(bundleName, static_cast<int32_t>(flag), bundlePackInfo, userId);
215 }
216 
GetBundlePackInfo(const std::string & bundleName,int32_t flags,BundlePackInfo & bundlePackInfo,int32_t userId)217 ErrCode BundleMgrHostImpl::GetBundlePackInfo(
218     const std::string &bundleName, int32_t flags, BundlePackInfo &bundlePackInfo, int32_t userId)
219 {
220     // check permission
221     if (!VerifySystemApi()) {
222         APP_LOGE("non-system app calling system api");
223         return ERR_BUNDLE_MANAGER_SYSTEM_API_DENIED;
224     }
225     if (!BundlePermissionMgr::VerifyCallingPermission(Constants::PERMISSION_GET_BUNDLE_INFO_PRIVILEGED)) {
226         APP_LOGE("SetModuleUpgradeFlag failed due to lack of permission");
227         return ERR_BUNDLE_MANAGER_PERMISSION_DENIED;
228     }
229     auto dataMgr = GetDataMgrFromService();
230     if (dataMgr == nullptr) {
231         APP_LOGE("DataMgr is nullptr");
232         return ERR_APPEXECFWK_SERVICE_INTERNAL_ERROR;
233     }
234     return dataMgr->GetBundlePackInfo(bundleName, flags, bundlePackInfo, userId);
235 }
236 
GetBundleUserInfo(const std::string & bundleName,int32_t userId,InnerBundleUserInfo & innerBundleUserInfo)237 bool BundleMgrHostImpl::GetBundleUserInfo(
238     const std::string &bundleName, int32_t userId, InnerBundleUserInfo &innerBundleUserInfo)
239 {
240     auto dataMgr = GetDataMgrFromService();
241     if (dataMgr == nullptr) {
242         APP_LOGE("DataMgr is nullptr");
243         return false;
244     }
245     return dataMgr->GetInnerBundleUserInfoByUserId(bundleName, userId, innerBundleUserInfo);
246 }
247 
GetBundleUserInfos(const std::string & bundleName,std::vector<InnerBundleUserInfo> & innerBundleUserInfos)248 bool BundleMgrHostImpl::GetBundleUserInfos(
249     const std::string &bundleName, std::vector<InnerBundleUserInfo> &innerBundleUserInfos)
250 {
251     auto dataMgr = GetDataMgrFromService();
252     if (dataMgr == nullptr) {
253         APP_LOGE("DataMgr is nullptr");
254         return false;
255     }
256     return dataMgr->GetInnerBundleUserInfos(bundleName, innerBundleUserInfos);
257 }
258 
GetBundleInfos(const BundleFlag flag,std::vector<BundleInfo> & bundleInfos,int32_t userId)259 bool BundleMgrHostImpl::GetBundleInfos(const BundleFlag flag, std::vector<BundleInfo> &bundleInfos, int32_t userId)
260 {
261     return GetBundleInfos(static_cast<int32_t>(flag), bundleInfos, userId);
262 }
263 
GetBundleInfos(int32_t flags,std::vector<BundleInfo> & bundleInfos,int32_t userId)264 bool BundleMgrHostImpl::GetBundleInfos(int32_t flags, std::vector<BundleInfo> &bundleInfos, int32_t userId)
265 {
266     APP_LOGD("start GetBundleInfos, flags : %{public}d, userId : %{public}d", flags, userId);
267     if (!VerifySystemApi(Constants::API_VERSION_NINE)) {
268         APP_LOGD("non-system app calling system api");
269         return true;
270     }
271     if (!BundlePermissionMgr::VerifyCallingPermission(Constants::PERMISSION_GET_BUNDLE_INFO_PRIVILEGED)) {
272         APP_LOGE("verify permission failed");
273         return false;
274     }
275     APP_LOGD("verify permission success, begin to GetBundleInfos");
276     auto dataMgr = GetDataMgrFromService();
277     if (dataMgr == nullptr) {
278         APP_LOGE("DataMgr is nullptr");
279         return false;
280     }
281     return dataMgr->GetBundleInfos(flags, bundleInfos, userId);
282 }
283 
GetBundleInfosV9(int32_t flags,std::vector<BundleInfo> & bundleInfos,int32_t userId)284 ErrCode BundleMgrHostImpl::GetBundleInfosV9(int32_t flags, std::vector<BundleInfo> &bundleInfos, int32_t userId)
285 {
286     APP_LOGD("start GetBundleInfosV9, flags : %{public}d, userId : %{public}d", flags, userId);
287     if (!VerifySystemApi()) {
288         APP_LOGE("non-system app calling system api");
289         return ERR_BUNDLE_MANAGER_SYSTEM_API_DENIED;
290     }
291     if (!BundlePermissionMgr::VerifyCallingPermission(Constants::PERMISSION_GET_BUNDLE_INFO_PRIVILEGED)) {
292         APP_LOGE("verify permission failed");
293         return ERR_BUNDLE_MANAGER_PERMISSION_DENIED;
294     }
295     APP_LOGD("verify permission success, begin to GetBundleInfosV9");
296     auto dataMgr = GetDataMgrFromService();
297     if (dataMgr == nullptr) {
298         APP_LOGE("DataMgr is nullptr");
299         return ERR_BUNDLE_MANAGER_INTERNAL_ERROR;
300     }
301     return dataMgr->GetBundleInfosV9(flags, bundleInfos, userId);
302 }
303 
GetBundleNameForUid(const int uid,std::string & bundleName)304 bool BundleMgrHostImpl::GetBundleNameForUid(const int uid, std::string &bundleName)
305 {
306     APP_LOGD("start GetBundleNameForUid, uid : %{public}d", uid);
307     auto dataMgr = GetDataMgrFromService();
308     if (dataMgr == nullptr) {
309         APP_LOGE("DataMgr is nullptr");
310         return false;
311     }
312     return dataMgr->GetBundleNameForUid(uid, bundleName);
313 }
314 
GetBundlesForUid(const int uid,std::vector<std::string> & bundleNames)315 bool BundleMgrHostImpl::GetBundlesForUid(const int uid, std::vector<std::string> &bundleNames)
316 {
317     APP_LOGD("start GetBundlesForUid, uid : %{public}d", uid);
318     if (!BundlePermissionMgr::IsNativeTokenType()) {
319         APP_LOGE("verify token type failed");
320         return false;
321     }
322     auto dataMgr = GetDataMgrFromService();
323     if (dataMgr == nullptr) {
324         APP_LOGE("DataMgr is nullptr");
325         return false;
326     }
327     return dataMgr->GetBundlesForUid(uid, bundleNames);
328 }
329 
GetNameForUid(const int uid,std::string & name)330 ErrCode BundleMgrHostImpl::GetNameForUid(const int uid, std::string &name)
331 {
332     APP_LOGD("start GetNameForUid, uid : %{public}d", uid);
333     if (!VerifySystemApi(Constants::API_VERSION_NINE)) {
334         APP_LOGE("non-system app calling system api");
335         return ERR_BUNDLE_MANAGER_SYSTEM_API_DENIED;
336     }
337     if (!BundlePermissionMgr::VerifyCallingPermission(Constants::PERMISSION_GET_BUNDLE_INFO) &&
338         !BundlePermissionMgr::VerifyCallingPermission(Constants::PERMISSION_GET_BUNDLE_INFO_PRIVILEGED)) {
339         APP_LOGE("verify query permission failed");
340         return ERR_BUNDLE_MANAGER_PERMISSION_DENIED;
341     }
342     auto dataMgr = GetDataMgrFromService();
343     if (dataMgr == nullptr) {
344         APP_LOGE("DataMgr is nullptr");
345         return ERR_BUNDLE_MANAGER_INTERNAL_ERROR;
346     }
347     return dataMgr->GetNameForUid(uid, name);
348 }
349 
GetBundleGids(const std::string & bundleName,std::vector<int> & gids)350 bool BundleMgrHostImpl::GetBundleGids(const std::string &bundleName, std::vector<int> &gids)
351 {
352     APP_LOGD("start GetBundleGids, bundleName : %{public}s", bundleName.c_str());
353     if (!BundlePermissionMgr::IsNativeTokenType()) {
354         APP_LOGE("verify token type failed");
355         return false;
356     }
357     auto dataMgr = GetDataMgrFromService();
358     if (dataMgr == nullptr) {
359         APP_LOGE("DataMgr is nullptr");
360         return false;
361     }
362     return dataMgr->GetBundleGids(bundleName, gids);
363 }
364 
GetBundleGidsByUid(const std::string & bundleName,const int & uid,std::vector<int> & gids)365 bool BundleMgrHostImpl::GetBundleGidsByUid(const std::string &bundleName, const int &uid, std::vector<int> &gids)
366 {
367     APP_LOGD("start GetBundleGidsByUid, bundleName : %{public}s, uid : %{public}d", bundleName.c_str(), uid);
368     auto dataMgr = GetDataMgrFromService();
369     if (dataMgr == nullptr) {
370         APP_LOGE("DataMgr is nullptr");
371         return false;
372     }
373     return dataMgr->GetBundleGidsByUid(bundleName, uid, gids);
374 }
375 
CheckIsSystemAppByUid(const int uid)376 bool BundleMgrHostImpl::CheckIsSystemAppByUid(const int uid)
377 {
378     APP_LOGD("start CheckIsSystemAppByUid, uid : %{public}d", uid);
379     auto dataMgr = GetDataMgrFromService();
380     if (dataMgr == nullptr) {
381         APP_LOGE("DataMgr is nullptr");
382         return false;
383     }
384     return dataMgr->CheckIsSystemAppByUid(uid);
385 }
386 
GetBundleInfosByMetaData(const std::string & metaData,std::vector<BundleInfo> & bundleInfos)387 bool BundleMgrHostImpl::GetBundleInfosByMetaData(const std::string &metaData, std::vector<BundleInfo> &bundleInfos)
388 {
389     APP_LOGD("start GetBundleInfosByMetaData, metaData : %{public}s", metaData.c_str());
390     if (!BundlePermissionMgr::VerifyCallingPermission(Constants::PERMISSION_GET_BUNDLE_INFO_PRIVILEGED)) {
391         APP_LOGE("verify permission failed");
392         return false;
393     }
394     auto dataMgr = GetDataMgrFromService();
395     if (dataMgr == nullptr) {
396         APP_LOGE("DataMgr is nullptr");
397         return false;
398     }
399     return dataMgr->GetBundleInfosByMetaData(metaData, bundleInfos);
400 }
401 
QueryAbilityInfo(const Want & want,AbilityInfo & abilityInfo)402 bool BundleMgrHostImpl::QueryAbilityInfo(const Want &want, AbilityInfo &abilityInfo)
403 {
404     return QueryAbilityInfo(want, GET_ABILITY_INFO_WITH_APPLICATION, Constants::UNSPECIFIED_USERID, abilityInfo);
405 }
406 
407 #ifdef BUNDLE_FRAMEWORK_FREE_INSTALL
QueryAbilityInfo(const Want & want,int32_t flags,int32_t userId,AbilityInfo & abilityInfo,const sptr<IRemoteObject> & callBack)408 bool BundleMgrHostImpl::QueryAbilityInfo(const Want &want, int32_t flags, int32_t userId,
409     AbilityInfo &abilityInfo, const sptr<IRemoteObject> &callBack)
410 {
411     if (!BundlePermissionMgr::VerifyCallingUid()) {
412         APP_LOGE("QueryAbilityInfo verify failed.");
413         return false;
414     }
415     auto connectAbilityMgr = GetConnectAbilityMgrFromService();
416     if (connectAbilityMgr == nullptr) {
417         APP_LOGE("connectAbilityMgr is nullptr");
418         return false;
419     }
420     return connectAbilityMgr->QueryAbilityInfo(want, flags, userId, abilityInfo, callBack);
421 }
422 
SilentInstall(const Want & want,int32_t userId,const sptr<IRemoteObject> & callBack)423 bool BundleMgrHostImpl::SilentInstall(const Want &want, int32_t userId, const sptr<IRemoteObject> &callBack)
424 {
425     APP_LOGD("SilentInstall in");
426     auto connectMgr = GetConnectAbilityMgrFromService();
427     if (connectMgr == nullptr) {
428         APP_LOGE("connectMgr is nullptr");
429         return false;
430     }
431     return connectMgr->SilentInstall(want, userId, callBack);
432 }
433 
UpgradeAtomicService(const Want & want,int32_t userId)434 void BundleMgrHostImpl::UpgradeAtomicService(const Want &want, int32_t userId)
435 {
436     if (!BundlePermissionMgr::VerifyCallingUid()) {
437         APP_LOGE("UpgradeAtomicService verify failed.");
438         return;
439     }
440     auto connectAbilityMgr = GetConnectAbilityMgrFromService();
441     if (connectAbilityMgr == nullptr) {
442         APP_LOGE("connectAbilityMgr is nullptr");
443         return;
444     }
445     connectAbilityMgr->UpgradeAtomicService(want, userId);
446 }
447 
CheckAbilityEnableInstall(const Want & want,int32_t missionId,int32_t userId,const sptr<IRemoteObject> & callback)448 bool BundleMgrHostImpl::CheckAbilityEnableInstall(
449     const Want &want, int32_t missionId, int32_t userId, const sptr<IRemoteObject> &callback)
450 {
451     if (!BundlePermissionMgr::IsNativeTokenType()) {
452         APP_LOGE("verify token type failed");
453         return false;
454     }
455     auto elementName = want.GetElement();
456     if (elementName.GetDeviceID().empty() || elementName.GetBundleName().empty() ||
457         elementName.GetAbilityName().empty()) {
458         APP_LOGE("check ability install parameter is invalid");
459         return false;
460     }
461     auto bundleDistributedManager = DelayedSingleton<BundleMgrService>::GetInstance()->GetBundleDistributedManager();
462     if (bundleDistributedManager == nullptr) {
463         APP_LOGE("bundleDistributedManager failed");
464         return false;
465     }
466     return bundleDistributedManager->CheckAbilityEnableInstall(want, missionId, userId, callback);
467 }
468 
ProcessPreload(const Want & want)469 void BundleMgrHostImpl::ProcessPreload(const Want &want)
470 {
471     if (!BundlePermissionMgr::VerifyPreload(want)) {
472         APP_LOGE("ProcessPreload verify failed.");
473         return;
474     }
475     APP_LOGD("begin to process preload.");
476     auto connectAbilityMgr = GetConnectAbilityMgrFromService();
477     if (connectAbilityMgr == nullptr) {
478         APP_LOGE("connectAbilityMgr is nullptr");
479         return;
480     }
481     connectAbilityMgr->ProcessPreload(want);
482 }
483 #endif
484 
QueryAbilityInfo(const Want & want,int32_t flags,int32_t userId,AbilityInfo & abilityInfo)485 bool BundleMgrHostImpl::QueryAbilityInfo(const Want &want, int32_t flags, int32_t userId, AbilityInfo &abilityInfo)
486 {
487     APP_LOGD("start QueryAbilityInfo, flags : %{public}d, userId : %{public}d", flags, userId);
488     if (!VerifySystemApi(Constants::API_VERSION_NINE)) {
489         APP_LOGD("non-system app calling system api");
490         return true;
491     }
492     if (!VerifyQueryPermission(want.GetElement().GetBundleName())) {
493         APP_LOGE("verify permission failed");
494         return false;
495     }
496     APP_LOGD("verify permission success, begin to QueryAbilityInfo");
497     auto dataMgr = GetDataMgrFromService();
498     if (dataMgr == nullptr) {
499         APP_LOGE("DataMgr is nullptr");
500         return false;
501     }
502     return dataMgr->QueryAbilityInfo(want, flags, userId, abilityInfo);
503 }
504 
QueryAbilityInfos(const Want & want,std::vector<AbilityInfo> & abilityInfos)505 bool BundleMgrHostImpl::QueryAbilityInfos(const Want &want, std::vector<AbilityInfo> &abilityInfos)
506 {
507     return QueryAbilityInfos(
508         want, GET_ABILITY_INFO_WITH_APPLICATION, Constants::UNSPECIFIED_USERID, abilityInfos);
509 }
510 
QueryAbilityInfos(const Want & want,int32_t flags,int32_t userId,std::vector<AbilityInfo> & abilityInfos)511 bool BundleMgrHostImpl::QueryAbilityInfos(
512     const Want &want, int32_t flags, int32_t userId, std::vector<AbilityInfo> &abilityInfos)
513 {
514     APP_LOGD("start QueryAbilityInfos, flags : %{public}d, userId : %{public}d", flags, userId);
515     if (!VerifySystemApi(Constants::API_VERSION_NINE)) {
516         APP_LOGD("non-system app calling system api");
517         return true;
518     }
519     if (!VerifyQueryPermission(want.GetElement().GetBundleName())) {
520         APP_LOGE("verify permission failed");
521         return false;
522     }
523     APP_LOGD("verify permission success, begin to QueryAbilityInfos");
524     auto dataMgr = GetDataMgrFromService();
525     if (dataMgr == nullptr) {
526         APP_LOGE("DataMgr is nullptr");
527         return false;
528     }
529     return dataMgr->QueryAbilityInfos(want, flags, userId, abilityInfos);
530 }
531 
QueryAbilityInfosV9(const Want & want,int32_t flags,int32_t userId,std::vector<AbilityInfo> & abilityInfos)532 ErrCode BundleMgrHostImpl::QueryAbilityInfosV9(
533     const Want &want, int32_t flags, int32_t userId, std::vector<AbilityInfo> &abilityInfos)
534 {
535     APP_LOGD("start QueryAbilityInfosV9, flags : %{public}d, userId : %{public}d", flags, userId);
536     if (!VerifySystemApi()) {
537         APP_LOGE("non-system app calling system api");
538         return ERR_BUNDLE_MANAGER_SYSTEM_API_DENIED;
539     }
540     if (!VerifyQueryPermission(want.GetElement().GetBundleName())) {
541         APP_LOGE("verify permission failed");
542         return ERR_BUNDLE_MANAGER_PERMISSION_DENIED;
543     }
544     APP_LOGD("verify permission success, begin to QueryAbilityInfosV9");
545     auto dataMgr = GetDataMgrFromService();
546     if (dataMgr == nullptr) {
547         APP_LOGE("DataMgr is nullptr");
548         return ERR_BUNDLE_MANAGER_INTERNAL_ERROR;
549     }
550     return dataMgr->QueryAbilityInfosV9(want, flags, userId, abilityInfos);
551 }
552 
QueryAllAbilityInfos(const Want & want,int32_t userId,std::vector<AbilityInfo> & abilityInfos)553 bool BundleMgrHostImpl::QueryAllAbilityInfos(const Want &want, int32_t userId, std::vector<AbilityInfo> &abilityInfos)
554 {
555     APP_LOGD("start QueryAllAbilityInfos, userId : %{public}d", userId);
556     if (!VerifySystemApi(Constants::API_VERSION_NINE)) {
557         APP_LOGD("non-system app calling system api");
558         return true;
559     }
560     if (!BundlePermissionMgr::VerifyCallingPermission(Constants::PERMISSION_GET_BUNDLE_INFO_PRIVILEGED)) {
561         APP_LOGE("verify permission failed");
562         return false;
563     }
564     APP_LOGD("verify permission success, begin to QueryAllAbilityInfos");
565     auto dataMgr = GetDataMgrFromService();
566     if (dataMgr == nullptr) {
567         APP_LOGE("DataMgr is nullptr");
568         return false;
569     }
570     return dataMgr->QueryLauncherAbilityInfos(want, userId, abilityInfos);
571 }
572 
QueryAbilityInfoByUri(const std::string & abilityUri,AbilityInfo & abilityInfo)573 bool BundleMgrHostImpl::QueryAbilityInfoByUri(const std::string &abilityUri, AbilityInfo &abilityInfo)
574 {
575     APP_LOGD("start QueryAbilityInfoByUri, uri : %{private}s", abilityUri.c_str());
576     if (!VerifySystemApi(Constants::API_VERSION_NINE)) {
577         APP_LOGE("non-system app calling system api");
578         return true;
579     }
580     if (!BundlePermissionMgr::VerifyCallingPermission(Constants::PERMISSION_GET_BUNDLE_INFO) &&
581         !BundlePermissionMgr::VerifyCallingPermission(Constants::PERMISSION_GET_BUNDLE_INFO_PRIVILEGED)) {
582         APP_LOGE("verify query permission failed");
583         return false;
584     }
585     auto dataMgr = GetDataMgrFromService();
586     if (dataMgr == nullptr) {
587         APP_LOGE("DataMgr is nullptr");
588         return false;
589     }
590     return dataMgr->QueryAbilityInfoByUri(abilityUri, Constants::UNSPECIFIED_USERID, abilityInfo);
591 }
592 
QueryAbilityInfosByUri(const std::string & abilityUri,std::vector<AbilityInfo> & abilityInfos)593 bool BundleMgrHostImpl::QueryAbilityInfosByUri(const std::string &abilityUri, std::vector<AbilityInfo> &abilityInfos)
594 {
595     APP_LOGD("start QueryAbilityInfosByUri, uri : %{private}s", abilityUri.c_str());
596     if (!VerifySystemApi(Constants::API_VERSION_NINE)) {
597         APP_LOGD("non-system app calling system api");
598         return true;
599     }
600     if (!BundlePermissionMgr::VerifyCallingPermission(Constants::PERMISSION_GET_BUNDLE_INFO_PRIVILEGED)) {
601         APP_LOGE("verify permission failed");
602         return false;
603     }
604     auto dataMgr = GetDataMgrFromService();
605     if (dataMgr == nullptr) {
606         APP_LOGE("DataMgr is nullptr");
607         return false;
608     }
609     return dataMgr->QueryAbilityInfosByUri(abilityUri, abilityInfos);
610 }
611 
QueryAbilityInfoByUri(const std::string & abilityUri,int32_t userId,AbilityInfo & abilityInfo)612 bool BundleMgrHostImpl::QueryAbilityInfoByUri(
613     const std::string &abilityUri, int32_t userId, AbilityInfo &abilityInfo)
614 {
615     APP_LOGD("start QueryAbilityInfoByUri, uri : %{private}s, userId : %{public}d", abilityUri.c_str(), userId);
616     if (!VerifySystemApi(Constants::API_VERSION_NINE)) {
617         APP_LOGE("non-system app calling system api");
618         return true;
619     }
620     if (!BundlePermissionMgr::VerifyCallingPermission(Constants::PERMISSION_GET_BUNDLE_INFO) &&
621         !BundlePermissionMgr::VerifyCallingPermission(Constants::PERMISSION_GET_BUNDLE_INFO_PRIVILEGED)) {
622         APP_LOGE("verify query permission failed");
623         return false;
624     }
625     auto dataMgr = GetDataMgrFromService();
626     if (dataMgr == nullptr) {
627         APP_LOGE("DataMgr is nullptr");
628         return false;
629     }
630     return dataMgr->QueryAbilityInfoByUri(abilityUri, userId, abilityInfo);
631 }
632 
QueryKeepAliveBundleInfos(std::vector<BundleInfo> & bundleInfos)633 bool BundleMgrHostImpl::QueryKeepAliveBundleInfos(std::vector<BundleInfo> &bundleInfos)
634 {
635     auto dataMgr = GetDataMgrFromService();
636     if (!BundlePermissionMgr::VerifyCallingPermission(Constants::PERMISSION_GET_BUNDLE_INFO_PRIVILEGED)) {
637         APP_LOGE("verify permission failed");
638         return false;
639     }
640     if (dataMgr == nullptr) {
641         APP_LOGE("DataMgr is nullptr");
642         return false;
643     }
644     return dataMgr->QueryKeepAliveBundleInfos(bundleInfos);
645 }
646 
GetAbilityLabel(const std::string & bundleName,const std::string & abilityName)647 std::string BundleMgrHostImpl::GetAbilityLabel(const std::string &bundleName, const std::string &abilityName)
648 {
649     APP_LOGD("start GetAbilityLabel, bundleName : %{public}s, abilityName : %{public}s",
650         bundleName.c_str(), abilityName.c_str());
651     if (!VerifySystemApi(Constants::API_VERSION_NINE)) {
652         APP_LOGD("non-system app calling system api");
653         return Constants::EMPTY_STRING;
654     }
655     if (!VerifyQueryPermission(bundleName)) {
656         APP_LOGE("verify permission failed");
657         return Constants::EMPTY_STRING;
658     }
659     auto dataMgr = GetDataMgrFromService();
660     if (dataMgr == nullptr) {
661         APP_LOGE("DataMgr is nullptr");
662         return Constants::EMPTY_STRING;
663     }
664     std::string label;
665     ErrCode ret = dataMgr->GetAbilityLabel(bundleName, Constants::EMPTY_STRING, abilityName, label);
666     if (ret != ERR_OK) {
667         return Constants::EMPTY_STRING;
668     }
669     return label;
670 }
671 
GetAbilityLabel(const std::string & bundleName,const std::string & moduleName,const std::string & abilityName,std::string & label)672 ErrCode BundleMgrHostImpl::GetAbilityLabel(const std::string &bundleName, const std::string &moduleName,
673     const std::string &abilityName, std::string &label)
674 {
675     if (!VerifySystemApi(Constants::API_VERSION_NINE)) {
676         APP_LOGE("non-system app calling system api");
677         return ERR_BUNDLE_MANAGER_SYSTEM_API_DENIED;
678     }
679     if (!VerifyQueryPermission(bundleName)) {
680         APP_LOGE("verify permission failed");
681         return ERR_BUNDLE_MANAGER_PERMISSION_DENIED;
682     }
683     auto dataMgr = GetDataMgrFromService();
684     if (dataMgr == nullptr) {
685         APP_LOGE("DataMgr is nullptr");
686         return ERR_APPEXECFWK_SERVICE_NOT_READY;
687     }
688     return dataMgr->GetAbilityLabel(bundleName, moduleName, abilityName, label);
689 }
690 
GetBundleArchiveInfo(const std::string & hapFilePath,const BundleFlag flag,BundleInfo & bundleInfo)691 bool BundleMgrHostImpl::GetBundleArchiveInfo(
692     const std::string &hapFilePath, const BundleFlag flag, BundleInfo &bundleInfo)
693 {
694     return GetBundleArchiveInfo(hapFilePath, static_cast<int32_t>(flag), bundleInfo);
695 }
696 
GetBundleArchiveInfo(const std::string & hapFilePath,int32_t flags,BundleInfo & bundleInfo)697 bool BundleMgrHostImpl::GetBundleArchiveInfo(
698     const std::string &hapFilePath, int32_t flags, BundleInfo &bundleInfo)
699 {
700     APP_LOGD("start GetBundleArchiveInfo, hapFilePath : %{public}s, flags : %{public}d", hapFilePath.c_str(), flags);
701     if (!VerifySystemApi(Constants::API_VERSION_NINE)) {
702         APP_LOGD("non-system app calling system api");
703         return true;
704     }
705     if (hapFilePath.find(Constants::SANDBOX_DATA_PATH) == std::string::npos) {
706         std::string realPath;
707         auto ret = BundleUtil::CheckFilePath(hapFilePath, realPath);
708         if (ret != ERR_OK) {
709             APP_LOGE("GetBundleArchiveInfo file path %{private}s invalid", hapFilePath.c_str());
710             return false;
711         }
712 
713         InnerBundleInfo info;
714         BundleParser bundleParser;
715         ret = bundleParser.Parse(realPath, info);
716         if (ret != ERR_OK) {
717             APP_LOGE("parse bundle info failed, error: %{public}d", ret);
718             return false;
719         }
720         APP_LOGD("verify permission success, begin to GetBundleArchiveInfo");
721         info.GetBundleInfo(flags, bundleInfo, Constants::NOT_EXIST_USERID);
722         return true;
723     } else {
724         return GetBundleArchiveInfoBySandBoxPath(hapFilePath, flags, bundleInfo) == ERR_OK;
725     }
726 }
727 
GetBundleArchiveInfoV9(const std::string & hapFilePath,int32_t flags,BundleInfo & bundleInfo)728 ErrCode BundleMgrHostImpl::GetBundleArchiveInfoV9(
729     const std::string &hapFilePath, int32_t flags, BundleInfo &bundleInfo)
730 {
731     APP_LOGD("start GetBundleArchiveInfoV9, hapFilePath : %{public}s, flags : %{public}d", hapFilePath.c_str(), flags);
732     if (!VerifySystemApi()) {
733         APP_LOGE("non-system app calling system api");
734         return ERR_BUNDLE_MANAGER_SYSTEM_API_DENIED;
735     }
736     if (!BundlePermissionMgr::VerifyCallingPermission(Constants::PERMISSION_GET_BUNDLE_INFO_PRIVILEGED)) {
737         APP_LOGE("verify permission failed");
738         return ERR_BUNDLE_MANAGER_PERMISSION_DENIED;
739     }
740     if (hapFilePath.find(Constants::SANDBOX_DATA_PATH) == 0) {
741         APP_LOGD("sandbox path");
742         return GetBundleArchiveInfoBySandBoxPath(hapFilePath, flags, bundleInfo, true);
743     }
744     std::string realPath;
745     ErrCode ret = BundleUtil::CheckFilePath(hapFilePath, realPath);
746     if (ret != ERR_OK) {
747         APP_LOGE("GetBundleArchiveInfoV9 file path %{private}s invalid", hapFilePath.c_str());
748         return ERR_BUNDLE_MANAGER_INVALID_HAP_PATH;
749     }
750     InnerBundleInfo info;
751     BundleParser bundleParser;
752     ret = bundleParser.Parse(realPath, info);
753     if (ret != ERR_OK) {
754         APP_LOGE("parse bundle info failed, error: %{public}d", ret);
755         return ERR_BUNDLE_MANAGER_INVALID_HAP_PATH;
756     }
757     info.GetBundleInfoV9(flags, bundleInfo, Constants::NOT_EXIST_USERID);
758     return ERR_OK;
759 }
760 
GetBundleArchiveInfoBySandBoxPath(const std::string & hapFilePath,int32_t flags,BundleInfo & bundleInfo,bool fromV9)761 ErrCode BundleMgrHostImpl::GetBundleArchiveInfoBySandBoxPath(const std::string &hapFilePath,
762     int32_t flags, BundleInfo &bundleInfo, bool fromV9)
763 {
764     std::string bundleName;
765     int32_t apiVersion = fromV9 ? Constants::INVALID_API_VERSION : Constants::API_VERSION_NINE;
766     if (!VerifySystemApi(apiVersion)) {
767         APP_LOGE("non-system app calling system api");
768         return ERR_BUNDLE_MANAGER_SYSTEM_API_DENIED;
769     }
770     if (!ObtainCallingBundleName(bundleName)) {
771         APP_LOGE("get calling bundleName failed");
772         return ERR_BUNDLE_MANAGER_INTERNAL_ERROR;
773     }
774     std::string hapRealPath;
775     if (!BundleUtil::RevertToRealPath(hapFilePath, bundleName, hapRealPath)) {
776         APP_LOGE("GetBundleArchiveInfo RevertToRealPath failed");
777         return ERR_BUNDLE_MANAGER_INTERNAL_ERROR;
778     }
779     std::string tempHapPath = Constants::BUNDLE_MANAGER_SERVICE_PATH +
780         Constants::PATH_SEPARATOR + std::to_string(BundleUtil::GetCurrentTime());
781     if (!BundleUtil::CreateDir(tempHapPath)) {
782         APP_LOGE("GetBundleArchiveInfo make temp dir failed");
783         return ERR_BUNDLE_MANAGER_INTERNAL_ERROR;
784     }
785     std::string hapName = hapFilePath.substr(hapFilePath.find_last_of("//") + 1);
786     std::string tempHapFile = tempHapPath + Constants::PATH_SEPARATOR + hapName;
787     if (InstalldClient::GetInstance()->CopyFile(hapRealPath, tempHapFile) != ERR_OK) {
788         APP_LOGE("GetBundleArchiveInfo copy hap file failed");
789         return ERR_BUNDLE_MANAGER_INTERNAL_ERROR;
790     }
791     std::string realPath;
792     auto ret = BundleUtil::CheckFilePath(tempHapFile, realPath);
793     if (ret != ERR_OK) {
794         APP_LOGE("CheckFilePath failed");
795         return ERR_BUNDLE_MANAGER_INTERNAL_ERROR;
796     }
797     InnerBundleInfo info;
798     BundleParser bundleParser;
799     ret = bundleParser.Parse(realPath, info);
800     if (ret != ERR_OK) {
801         APP_LOGE("parse bundle info failed, error: %{public}d", ret);
802         BundleUtil::DeleteDir(tempHapPath);
803         return ERR_BUNDLE_MANAGER_INTERNAL_ERROR;
804     }
805     BundleUtil::DeleteDir(tempHapPath);
806     APP_LOGD("verify permission success, begin to GetBundleArchiveInfo");
807     if (fromV9) {
808         info.GetBundleInfoV9(flags, bundleInfo, Constants::NOT_EXIST_USERID);
809     } else {
810         info.GetBundleInfo(flags, bundleInfo, Constants::NOT_EXIST_USERID);
811     }
812     return ERR_OK;
813 }
814 
GetHapModuleInfo(const AbilityInfo & abilityInfo,HapModuleInfo & hapModuleInfo)815 bool BundleMgrHostImpl::GetHapModuleInfo(const AbilityInfo &abilityInfo, HapModuleInfo &hapModuleInfo)
816 {
817     APP_LOGD("start GetHapModuleInfo");
818     return GetHapModuleInfo(abilityInfo, Constants::UNSPECIFIED_USERID, hapModuleInfo);
819 }
820 
GetHapModuleInfo(const AbilityInfo & abilityInfo,int32_t userId,HapModuleInfo & hapModuleInfo)821 bool BundleMgrHostImpl::GetHapModuleInfo(const AbilityInfo &abilityInfo, int32_t userId, HapModuleInfo &hapModuleInfo)
822 {
823     APP_LOGD("start GetHapModuleInfo with userId: %{public}d", userId);
824     if (!VerifyQueryPermission(abilityInfo.bundleName)) {
825         APP_LOGE("verify permission failed");
826         return false;
827     }
828     if (abilityInfo.bundleName.empty() || abilityInfo.package.empty()) {
829         APP_LOGE("fail to GetHapModuleInfo due to params empty");
830         return false;
831     }
832     auto dataMgr = GetDataMgrFromService();
833     if (dataMgr == nullptr) {
834         APP_LOGE("DataMgr is nullptr");
835         return false;
836     }
837     return dataMgr->GetHapModuleInfo(abilityInfo, hapModuleInfo, userId);
838 }
839 
GetLaunchWantForBundle(const std::string & bundleName,Want & want,int32_t userId)840 ErrCode BundleMgrHostImpl::GetLaunchWantForBundle(const std::string &bundleName, Want &want, int32_t userId)
841 {
842     APP_LOGD("start GetLaunchWantForBundle, bundleName : %{public}s", bundleName.c_str());
843     if (!VerifySystemApi(Constants::API_VERSION_NINE)) {
844         APP_LOGE("non-system app calling system api");
845         return ERR_BUNDLE_MANAGER_SYSTEM_API_DENIED;
846     }
847     if (!BundlePermissionMgr::VerifyCallingPermission(Constants::PERMISSION_GET_BUNDLE_INFO_PRIVILEGED)) {
848         APP_LOGE("verify permission failed");
849         return ERR_BUNDLE_MANAGER_PERMISSION_DENIED;
850     }
851 
852     APP_LOGD("verify permission success, begin to GetLaunchWantForBundle");
853     auto dataMgr = GetDataMgrFromService();
854     if (dataMgr == nullptr) {
855         APP_LOGE("DataMgr is nullptr");
856         return ERR_BUNDLE_MANAGER_INTERNAL_ERROR;
857     }
858 
859     return dataMgr->GetLaunchWantForBundle(bundleName, want, userId);
860 }
861 
CheckPublicKeys(const std::string & firstBundleName,const std::string & secondBundleName)862 int BundleMgrHostImpl::CheckPublicKeys(const std::string &firstBundleName, const std::string &secondBundleName)
863 {
864     APP_LOGD("start CheckPublicKeys, firstBundleName : %{public}s, secondBundleName : %{public}s",
865         firstBundleName.c_str(), secondBundleName.c_str());
866     if (!BundlePermissionMgr::IsNativeTokenType()) {
867         APP_LOGE("verify token type failed");
868         return ERR_BUNDLE_MANAGER_PERMISSION_DENIED;
869     }
870     auto dataMgr = GetDataMgrFromService();
871     if (dataMgr == nullptr) {
872         APP_LOGE("DataMgr is nullptr");
873         return false;
874     }
875     return dataMgr->CheckPublicKeys(firstBundleName, secondBundleName);
876 }
877 
GetPermissionDef(const std::string & permissionName,PermissionDef & permissionDef)878 ErrCode BundleMgrHostImpl::GetPermissionDef(const std::string &permissionName, PermissionDef &permissionDef)
879 {
880     if (!VerifySystemApi()) {
881         APP_LOGE("non-system app calling system api");
882         return ERR_BUNDLE_MANAGER_SYSTEM_API_DENIED;
883     }
884     if (!BundlePermissionMgr::VerifyCallingPermission(Constants::PERMISSION_GET_BUNDLE_INFO_PRIVILEGED)) {
885         APP_LOGE("verify GET_BUNDLE_INFO_PRIVILEGED failed");
886         return ERR_BUNDLE_MANAGER_PERMISSION_DENIED;
887     }
888     if (permissionName.empty()) {
889         APP_LOGW("fail to GetPermissionDef due to params empty");
890         return ERR_BUNDLE_MANAGER_QUERY_PERMISSION_DEFINE_FAILED;
891     }
892     return BundlePermissionMgr::GetPermissionDef(permissionName, permissionDef);
893 }
894 
HasSystemCapability(const std::string & capName)895 bool BundleMgrHostImpl::HasSystemCapability(const std::string &capName)
896 {
897     return true;
898 }
899 
GetSystemAvailableCapabilities(std::vector<std::string> & systemCaps)900 bool BundleMgrHostImpl::GetSystemAvailableCapabilities(std::vector<std::string> &systemCaps)
901 {
902     return true;
903 }
904 
IsSafeMode()905 bool BundleMgrHostImpl::IsSafeMode()
906 {
907     return true;
908 }
909 
CleanBundleCacheFiles(const std::string & bundleName,const sptr<ICleanCacheCallback> & cleanCacheCallback,int32_t userId)910 ErrCode BundleMgrHostImpl::CleanBundleCacheFiles(
911     const std::string &bundleName, const sptr<ICleanCacheCallback> &cleanCacheCallback,
912     int32_t userId)
913 {
914     if (userId == Constants::UNSPECIFIED_USERID) {
915         userId = BundleUtil::GetUserIdByCallingUid();
916     }
917 
918     APP_LOGD("start CleanBundleCacheFiles, bundleName : %{public}s, userId : %{public}d", bundleName.c_str(), userId);
919     if (!VerifySystemApi()) {
920         APP_LOGE("non-system app calling system api");
921         return ERR_BUNDLE_MANAGER_SYSTEM_API_DENIED;
922     }
923     if (userId < 0) {
924         APP_LOGE("userId is invalid");
925         EventReport::SendCleanCacheSysEvent(bundleName, userId, true, true);
926         return ERR_BUNDLE_MANAGER_INVALID_USER_ID;
927     }
928 
929     if (bundleName.empty() || !cleanCacheCallback) {
930         APP_LOGE("the cleanCacheCallback is nullptr or bundleName empty");
931         EventReport::SendCleanCacheSysEvent(bundleName, userId, true, true);
932         return ERR_BUNDLE_MANAGER_PARAM_ERROR;
933     }
934 
935     if (!BundlePermissionMgr::VerifyCallingPermission(Constants::PERMISSION_REMOVECACHEFILE)) {
936         APP_LOGE("ohos.permission.REMOVE_CACHE_FILES permission denied");
937         EventReport::SendCleanCacheSysEvent(bundleName, userId, true, true);
938         return ERR_BUNDLE_MANAGER_PERMISSION_DENIED;
939     }
940 
941     ApplicationInfo applicationInfo;
942     auto dataMgr = GetDataMgrFromService();
943     if (dataMgr == nullptr) {
944         APP_LOGE("DataMgr is nullptr");
945         EventReport::SendCleanCacheSysEvent(bundleName, userId, true, true);
946         return ERR_APPEXECFWK_SERVICE_INTERNAL_ERROR;
947     }
948 
949     auto ret = dataMgr->GetApplicationInfoV9(bundleName,
950         static_cast<int32_t>(GetApplicationFlag::GET_APPLICATION_INFO_WITH_DISABLE), userId, applicationInfo);
951     if (ret != ERR_OK) {
952         APP_LOGE("can not get application info of %{public}s", bundleName.c_str());
953         EventReport::SendCleanCacheSysEvent(bundleName, userId, true, true);
954         return ret;
955     }
956 
957     if (applicationInfo.isSystemApp && !applicationInfo.userDataClearable) {
958         APP_LOGE("can not clean cacheFiles of %{public}s due to userDataClearable is false", bundleName.c_str());
959         EventReport::SendCleanCacheSysEvent(bundleName, userId, true, true);
960         return ERR_BUNDLE_MANAGER_CAN_NOT_CLEAR_USER_DATA;
961     }
962 
963     CleanBundleCacheTask(bundleName, cleanCacheCallback, dataMgr, userId);
964     return ERR_OK;
965 }
966 
CleanBundleCacheTask(const std::string & bundleName,const sptr<ICleanCacheCallback> & cleanCacheCallback,const std::shared_ptr<BundleDataMgr> & dataMgr,int32_t userId)967 void BundleMgrHostImpl::CleanBundleCacheTask(const std::string &bundleName,
968     const sptr<ICleanCacheCallback> &cleanCacheCallback,
969     const std::shared_ptr<BundleDataMgr> &dataMgr,
970     int32_t userId)
971 {
972     std::vector<std::string> rootDir;
973     for (const auto &el : Constants::BUNDLE_EL) {
974         std::string dataDir = Constants::BUNDLE_APP_DATA_BASE_DIR + el +
975             Constants::PATH_SEPARATOR + std::to_string(userId) + Constants::BASE + bundleName;
976         rootDir.emplace_back(dataDir);
977     }
978 
979     auto cleanCache = [bundleName, userId, rootDir, dataMgr, cleanCacheCallback, this]() {
980         std::vector<std::string> caches;
981         for (const auto &st : rootDir) {
982             std::vector<std::string> cache;
983             if (InstalldClient::GetInstance()->GetBundleCachePath(st, cache) != ERR_OK) {
984                 APP_LOGW("GetBundleCachePath failed, path: %{public}s", st.c_str());
985             }
986             std::copy(cache.begin(), cache.end(), std::back_inserter(caches));
987         }
988 
989         bool succeed = true;
990         if (!caches.empty()) {
991             for (const auto& cache : caches) {
992                 ErrCode ret = InstalldClient::GetInstance()->CleanBundleDataDir(cache);
993                 if (ret != ERR_OK) {
994                     APP_LOGE("CleanBundleDataDir failed, path: %{private}s", cache.c_str());
995                     succeed = false;
996                 }
997             }
998         }
999         EventReport::SendCleanCacheSysEvent(bundleName, userId, true, !succeed);
1000         APP_LOGD("CleanBundleCacheFiles with succeed %{public}d", succeed);
1001         cleanCacheCallback->OnCleanCacheFinished(succeed);
1002         InnerBundleUserInfo innerBundleUserInfo;
1003         if (!this->GetBundleUserInfo(bundleName, userId, innerBundleUserInfo)) {
1004             APP_LOGW("Get calling userInfo in bundle(%{public}s) failed", bundleName.c_str());
1005             return;
1006         }
1007         NotifyBundleEvents installRes = {
1008             .bundleName = bundleName,
1009             .resultCode = ERR_OK,
1010             .type = NotifyType::BUNDLE_CACHE_CLEARED,
1011             .uid = innerBundleUserInfo.uid,
1012             .accessTokenId = innerBundleUserInfo.accessTokenId
1013         };
1014         NotifyBundleStatus(installRes);
1015     };
1016     handler_->PostTask(cleanCache);
1017 }
1018 
CleanBundleDataFiles(const std::string & bundleName,const int userId)1019 bool BundleMgrHostImpl::CleanBundleDataFiles(const std::string &bundleName, const int userId)
1020 {
1021     APP_LOGD("start CleanBundleDataFiles, bundleName : %{public}s, userId : %{public}d", bundleName.c_str(), userId);
1022     if (!VerifySystemApi()) {
1023         APP_LOGE("ohos.permission.REMOVE_CACHE_FILES system api denied");
1024         EventReport::SendCleanCacheSysEvent(bundleName, userId, false, true);
1025         return false;
1026     }
1027     if (bundleName.empty() || userId < 0) {
1028         APP_LOGE("the  bundleName empty or invalid userid");
1029         EventReport::SendCleanCacheSysEvent(bundleName, userId, false, true);
1030         return false;
1031     }
1032     if (!BundlePermissionMgr::VerifyCallingPermission(Constants::PERMISSION_REMOVECACHEFILE)) {
1033         APP_LOGE("ohos.permission.REMOVE_CACHE_FILES permission denied");
1034         EventReport::SendCleanCacheSysEvent(bundleName, userId, false, true);
1035         return false;
1036     }
1037     ApplicationInfo applicationInfo;
1038     if (GetApplicationInfoV9(bundleName, static_cast<int32_t>(GetApplicationFlag::GET_APPLICATION_INFO_WITH_DISABLE),
1039         userId, applicationInfo) != ERR_OK) {
1040         APP_LOGE("can not get application info of %{public}s", bundleName.c_str());
1041         EventReport::SendCleanCacheSysEvent(bundleName, userId, false, true);
1042         return false;
1043     }
1044 
1045     if (applicationInfo.isSystemApp && !applicationInfo.userDataClearable) {
1046         APP_LOGE("can not clean dataFiles of %{public}s due to userDataClearable is false", bundleName.c_str());
1047         EventReport::SendCleanCacheSysEvent(bundleName, userId, false, true);
1048         return false;
1049     }
1050 
1051     InnerBundleUserInfo innerBundleUserInfo;
1052     if (!GetBundleUserInfo(bundleName, userId, innerBundleUserInfo)) {
1053         APP_LOGE("%{public}s, userId:%{public}d, GetBundleUserInfo failed", bundleName.c_str(), userId);
1054         EventReport::SendCleanCacheSysEvent(bundleName, userId, false, true);
1055         return false;
1056     }
1057 
1058     if (BundlePermissionMgr::ClearUserGrantedPermissionState(applicationInfo.accessTokenId)) {
1059         APP_LOGE("%{public}s, ClearUserGrantedPermissionState failed", bundleName.c_str());
1060         EventReport::SendCleanCacheSysEvent(bundleName, userId, false, true);
1061         return false;
1062     }
1063 
1064     if (InstalldClient::GetInstance()->RemoveBundleDataDir(bundleName, userId) != ERR_OK) {
1065         APP_LOGE("%{public}s, RemoveBundleDataDir failed", bundleName.c_str());
1066         EventReport::SendCleanCacheSysEvent(bundleName, userId, false, true);
1067         return false;
1068     }
1069 
1070     if (InstalldClient::GetInstance()->CreateBundleDataDir(bundleName, userId, innerBundleUserInfo.uid,
1071         innerBundleUserInfo.uid, GetAppPrivilegeLevel(bundleName, userId))) {
1072         APP_LOGE("%{public}s, CreateBundleDataDir failed", bundleName.c_str());
1073         EventReport::SendCleanCacheSysEvent(bundleName, userId, false, true);
1074         return false;
1075     }
1076 
1077     EventReport::SendCleanCacheSysEvent(bundleName, userId, false, false);
1078     return true;
1079 }
1080 
RegisterBundleStatusCallback(const sptr<IBundleStatusCallback> & bundleStatusCallback)1081 bool BundleMgrHostImpl::RegisterBundleStatusCallback(const sptr<IBundleStatusCallback> &bundleStatusCallback)
1082 {
1083     APP_LOGD("start RegisterBundleStatusCallback");
1084     if ((!bundleStatusCallback) || (bundleStatusCallback->GetBundleName().empty())) {
1085         APP_LOGE("the bundleStatusCallback is nullptr or bundleName empty");
1086         return false;
1087     }
1088     // check permission
1089     if (!BundlePermissionMgr::VerifyCallingPermission(Constants::LISTEN_BUNDLE_CHANGE)) {
1090         APP_LOGE("register bundle status callback failed due to lack of permission");
1091         return false;
1092     }
1093 
1094     auto dataMgr = GetDataMgrFromService();
1095     if (dataMgr == nullptr) {
1096         APP_LOGE("DataMgr is nullptr");
1097         return false;
1098     }
1099     return dataMgr->RegisterBundleStatusCallback(bundleStatusCallback);
1100 }
1101 
RegisterBundleEventCallback(const sptr<IBundleEventCallback> & bundleEventCallback)1102 bool BundleMgrHostImpl::RegisterBundleEventCallback(const sptr<IBundleEventCallback> &bundleEventCallback)
1103 {
1104     APP_LOGD("begin to RegisterBundleEventCallback");
1105     if (bundleEventCallback == nullptr) {
1106         APP_LOGE("bundleEventCallback is null");
1107         return false;
1108     }
1109     if (IPCSkeleton::GetCallingUid() != Constants::FOUNDATION_UID) {
1110         APP_LOGE("verify calling uid failed");
1111         return false;
1112     }
1113     auto dataMgr = GetDataMgrFromService();
1114     if (dataMgr == nullptr) {
1115         APP_LOGE("DataMgr is nullptr");
1116         return false;
1117     }
1118     return dataMgr->RegisterBundleEventCallback(bundleEventCallback);
1119 }
1120 
UnregisterBundleEventCallback(const sptr<IBundleEventCallback> & bundleEventCallback)1121 bool BundleMgrHostImpl::UnregisterBundleEventCallback(const sptr<IBundleEventCallback> &bundleEventCallback)
1122 {
1123     APP_LOGD("begin to UnregisterBundleEventCallback");
1124     if (bundleEventCallback == nullptr) {
1125         APP_LOGE("bundleEventCallback is null");
1126         return false;
1127     }
1128     if (IPCSkeleton::GetCallingUid() != Constants::FOUNDATION_UID) {
1129         APP_LOGE("verify calling uid failed");
1130         return false;
1131     }
1132     auto dataMgr = GetDataMgrFromService();
1133     if (dataMgr == nullptr) {
1134         APP_LOGE("DataMgr is nullptr");
1135         return false;
1136     }
1137     return dataMgr->UnregisterBundleEventCallback(bundleEventCallback);
1138 }
1139 
ClearBundleStatusCallback(const sptr<IBundleStatusCallback> & bundleStatusCallback)1140 bool BundleMgrHostImpl::ClearBundleStatusCallback(const sptr<IBundleStatusCallback> &bundleStatusCallback)
1141 {
1142     APP_LOGD("start ClearBundleStatusCallback");
1143     if (!bundleStatusCallback) {
1144         APP_LOGE("the bundleStatusCallback is nullptr");
1145         return false;
1146     }
1147 
1148     // check permission
1149     if (!BundlePermissionMgr::VerifyCallingPermission(Constants::LISTEN_BUNDLE_CHANGE)) {
1150         APP_LOGE("register bundle status callback failed due to lack of permission");
1151         return false;
1152     }
1153 
1154     auto dataMgr = GetDataMgrFromService();
1155     if (dataMgr == nullptr) {
1156         APP_LOGE("DataMgr is nullptr");
1157         return false;
1158     }
1159     return dataMgr->ClearBundleStatusCallback(bundleStatusCallback);
1160 }
1161 
UnregisterBundleStatusCallback()1162 bool BundleMgrHostImpl::UnregisterBundleStatusCallback()
1163 {
1164     APP_LOGD("start UnregisterBundleStatusCallback");
1165     // check permission
1166     if (!BundlePermissionMgr::VerifyCallingPermission(Constants::LISTEN_BUNDLE_CHANGE)) {
1167         APP_LOGE("register bundle status callback failed due to lack of permission");
1168         return false;
1169     }
1170 
1171     auto dataMgr = GetDataMgrFromService();
1172     if (dataMgr == nullptr) {
1173         APP_LOGE("DataMgr is nullptr");
1174         return false;
1175     }
1176     return dataMgr->UnregisterBundleStatusCallback();
1177 }
1178 
DumpInfos(const DumpFlag flag,const std::string & bundleName,int32_t userId,std::string & result)1179 bool BundleMgrHostImpl::DumpInfos(
1180     const DumpFlag flag, const std::string &bundleName, int32_t userId, std::string &result)
1181 {
1182     if (!BundlePermissionMgr::VerifyCallingPermission(Constants::PERMISSION_GET_BUNDLE_INFO_PRIVILEGED)) {
1183         APP_LOGE("verify permission failed");
1184         return false;
1185     }
1186     bool ret = false;
1187     switch (flag) {
1188         case DumpFlag::DUMP_BUNDLE_LIST: {
1189             ret = DumpAllBundleInfoNames(userId, result);
1190             break;
1191         }
1192         case DumpFlag::DUMP_BUNDLE_INFO: {
1193             ret = DumpBundleInfo(bundleName, userId, result);
1194             break;
1195         }
1196         case DumpFlag::DUMP_SHORTCUT_INFO: {
1197             ret = DumpShortcutInfo(bundleName, userId, result);
1198             break;
1199         }
1200         default:
1201             APP_LOGE("dump flag error");
1202             return false;
1203     }
1204     return ret;
1205 }
1206 
DumpAllBundleInfoNames(int32_t userId,std::string & result)1207 bool BundleMgrHostImpl::DumpAllBundleInfoNames(int32_t userId, std::string &result)
1208 {
1209     APP_LOGD("DumpAllBundleInfoNames begin");
1210     if (userId != Constants::ALL_USERID) {
1211         return DumpAllBundleInfoNamesByUserId(userId, result);
1212     }
1213 
1214     auto userIds = GetExistsCommonUserIs();
1215     for (auto userId : userIds) {
1216         DumpAllBundleInfoNamesByUserId(userId, result);
1217     }
1218 
1219     APP_LOGD("DumpAllBundleInfoNames success");
1220     return true;
1221 }
1222 
DumpAllBundleInfoNamesByUserId(int32_t userId,std::string & result)1223 bool BundleMgrHostImpl::DumpAllBundleInfoNamesByUserId(int32_t userId, std::string &result)
1224 {
1225     APP_LOGI("DumpAllBundleInfoNamesByUserId begin");
1226     auto dataMgr = GetDataMgrFromService();
1227     if (dataMgr == nullptr) {
1228         APP_LOGE("DataMgr is nullptr");
1229         return false;
1230     }
1231 
1232     std::vector<std::string> bundleNames;
1233     if (!dataMgr->GetBundleList(bundleNames, userId)) {
1234         APP_LOGE("get bundle list failed by userId(%{public}d)", userId);
1235         return false;
1236     }
1237 
1238     result.append("ID: ");
1239     result.append(std::to_string(userId));
1240     result.append(":\n");
1241     for (const auto &name : bundleNames) {
1242         result.append("\t");
1243         result.append(name);
1244         result.append("\n");
1245     }
1246     APP_LOGI("DumpAllBundleInfoNamesByUserId successfully");
1247     return true;
1248 }
1249 
DumpBundleInfo(const std::string & bundleName,int32_t userId,std::string & result)1250 bool BundleMgrHostImpl::DumpBundleInfo(
1251     const std::string &bundleName, int32_t userId, std::string &result)
1252 {
1253     APP_LOGD("DumpBundleInfo begin");
1254     std::vector<InnerBundleUserInfo> innerBundleUserInfos;
1255     if (userId == Constants::ALL_USERID) {
1256         if (!GetBundleUserInfos(bundleName, innerBundleUserInfos)) {
1257             APP_LOGE("get all userInfos in bundle(%{public}s) failed", bundleName.c_str());
1258             return false;
1259         }
1260         userId = innerBundleUserInfos.begin()->bundleUserInfo.userId;
1261     } else {
1262         InnerBundleUserInfo innerBundleUserInfo;
1263         if (!GetBundleUserInfo(bundleName, userId, innerBundleUserInfo)) {
1264             APP_LOGI("get userInfo in bundle(%{public}s) failed", bundleName.c_str());
1265         }
1266         innerBundleUserInfos.emplace_back(innerBundleUserInfo);
1267     }
1268 
1269     BundleInfo bundleInfo;
1270     if (!GetBundleInfo(bundleName,
1271         BundleFlag::GET_BUNDLE_WITH_ABILITIES |
1272         BundleFlag::GET_BUNDLE_WITH_REQUESTED_PERMISSION |
1273         BundleFlag::GET_BUNDLE_WITH_EXTENSION_INFO |
1274         BundleFlag::GET_BUNDLE_WITH_HASH_VALUE, bundleInfo, userId)) {
1275         APP_LOGE("get bundleInfo(%{public}s) failed", bundleName.c_str());
1276         return false;
1277     }
1278 
1279     result.append(bundleName);
1280     result.append(":\n");
1281     nlohmann::json jsonObject = bundleInfo;
1282     jsonObject.erase("abilityInfos");
1283     jsonObject.erase("extensionAbilityInfo");
1284     for (auto &hapModule : jsonObject["hapModuleInfos"]) {
1285         for (auto &ability : hapModule["abilityInfos"]) {
1286             ability.erase("applicationInfo");
1287         }
1288         for (auto &extension : hapModule["extensionInfos"]) {
1289             extension.erase("applicationInfo");
1290         }
1291     }
1292     jsonObject["userInfo"] = innerBundleUserInfos;
1293     result.append(jsonObject.dump(Constants::DUMP_INDENT));
1294     result.append("\n");
1295     APP_LOGI("DumpBundleInfo success with bundleName %{public}s", bundleName.c_str());
1296     return true;
1297 }
1298 
DumpShortcutInfo(const std::string & bundleName,int32_t userId,std::string & result)1299 bool BundleMgrHostImpl::DumpShortcutInfo(
1300     const std::string &bundleName, int32_t userId, std::string &result)
1301 {
1302     APP_LOGD("DumpShortcutInfo begin");
1303     std::vector<ShortcutInfo> shortcutInfos;
1304     if (userId == Constants::ALL_USERID) {
1305         std::vector<InnerBundleUserInfo> innerBundleUserInfos;
1306         if (!GetBundleUserInfos(bundleName, innerBundleUserInfos)) {
1307             APP_LOGE("get all userInfos in bundle(%{public}s) failed", bundleName.c_str());
1308             return false;
1309         }
1310         userId = innerBundleUserInfos.begin()->bundleUserInfo.userId;
1311     }
1312 
1313     if (!GetShortcutInfos(bundleName, userId, shortcutInfos)) {
1314         APP_LOGE("get all shortcut info by bundle(%{public}s) failed", bundleName.c_str());
1315         return false;
1316     }
1317 
1318     result.append("shortcuts");
1319     result.append(":\n");
1320     for (const auto &info : shortcutInfos) {
1321         result.append("\"shortcut\"");
1322         result.append(":\n");
1323         nlohmann::json jsonObject = info;
1324         result.append(jsonObject.dump(Constants::DUMP_INDENT));
1325         result.append("\n");
1326     }
1327     APP_LOGD("DumpShortcutInfo success with bundleName %{public}s", bundleName.c_str());
1328     return true;
1329 }
1330 
IsModuleRemovable(const std::string & bundleName,const std::string & moduleName,bool & isRemovable)1331 ErrCode BundleMgrHostImpl::IsModuleRemovable(const std::string &bundleName, const std::string &moduleName,
1332     bool &isRemovable)
1333 {
1334     // check permission
1335     if (!VerifySystemApi()) {
1336         APP_LOGE("non-system app calling system api");
1337         return ERR_BUNDLE_MANAGER_SYSTEM_API_DENIED;
1338     }
1339     if (!BundlePermissionMgr::VerifyCallingPermission(Constants::PERMISSION_GET_BUNDLE_INFO_PRIVILEGED)) {
1340         APP_LOGE("IsModuleRemovable failed due to lack of permission");
1341         return ERR_BUNDLE_MANAGER_PERMISSION_DENIED;
1342     }
1343     auto dataMgr = GetDataMgrFromService();
1344     if (dataMgr == nullptr) {
1345         APP_LOGE("DataMgr is nullptr");
1346         return ERR_APPEXECFWK_SERVICE_INTERNAL_ERROR;
1347     }
1348     return dataMgr->IsModuleRemovable(bundleName, moduleName, isRemovable);
1349 }
1350 
SetModuleRemovable(const std::string & bundleName,const std::string & moduleName,bool isEnable)1351 bool BundleMgrHostImpl::SetModuleRemovable(const std::string &bundleName, const std::string &moduleName, bool isEnable)
1352 {
1353     if (!BundlePermissionMgr::VerifyCallingPermission(Constants::PERMISSION_GET_BUNDLE_INFO_PRIVILEGED)) {
1354         APP_LOGE("SetModuleRemovable failed due to lack of permission");
1355         return false;
1356     }
1357     auto dataMgr = GetDataMgrFromService();
1358     if (dataMgr == nullptr) {
1359         APP_LOGE("DataMgr is nullptr");
1360         return false;
1361     }
1362     return dataMgr->SetModuleRemovable(bundleName, moduleName, isEnable);
1363 }
1364 
GetModuleUpgradeFlag(const std::string & bundleName,const std::string & moduleName)1365 bool BundleMgrHostImpl::GetModuleUpgradeFlag(const std::string &bundleName, const std::string &moduleName)
1366 {
1367     if (!BundlePermissionMgr::VerifyCallingPermission(Constants::PERMISSION_INSTALL_BUNDLE)) {
1368         APP_LOGE("GetModuleUpgradeFlag failed due to lack of permission");
1369         return false;
1370     }
1371     auto dataMgr = GetDataMgrFromService();
1372     if (dataMgr == nullptr) {
1373         APP_LOGE("DataMgr is nullptr");
1374         return false;
1375     }
1376     return dataMgr->GetModuleUpgradeFlag(bundleName, moduleName);
1377 }
1378 
SetModuleUpgradeFlag(const std::string & bundleName,const std::string & moduleName,int32_t upgradeFlag)1379 ErrCode BundleMgrHostImpl::SetModuleUpgradeFlag(const std::string &bundleName,
1380     const std::string &moduleName, int32_t upgradeFlag)
1381 {
1382     // check permission
1383     if (!VerifySystemApi(Constants::API_VERSION_NINE)) {
1384         APP_LOGE("non-system app calling system api");
1385         return ERR_BUNDLE_MANAGER_SYSTEM_API_DENIED;
1386     }
1387     if (!BundlePermissionMgr::VerifyCallingPermission(Constants::PERMISSION_INSTALL_BUNDLE)) {
1388         APP_LOGE("SetModuleUpgradeFlag failed due to lack of permission");
1389         return ERR_BUNDLE_MANAGER_PERMISSION_DENIED;
1390     }
1391     auto dataMgr = GetDataMgrFromService();
1392     if (dataMgr == nullptr) {
1393         APP_LOGE("DataMgr is nullptr");
1394         return ERR_APPEXECFWK_SERVICE_INTERNAL_ERROR;
1395     }
1396     return dataMgr->SetModuleUpgradeFlag(bundleName, moduleName, upgradeFlag);
1397 }
1398 
IsApplicationEnabled(const std::string & bundleName,bool & isEnable)1399 ErrCode BundleMgrHostImpl::IsApplicationEnabled(const std::string &bundleName, bool &isEnable)
1400 {
1401     APP_LOGD("start IsApplicationEnabled, bundleName : %{public}s", bundleName.c_str());
1402     if (!VerifySystemApi(Constants::API_VERSION_NINE)) {
1403         APP_LOGE("non-system app calling system api");
1404         return ERR_BUNDLE_MANAGER_SYSTEM_API_DENIED;
1405     }
1406     auto dataMgr = GetDataMgrFromService();
1407     if (dataMgr == nullptr) {
1408         APP_LOGE("DataMgr is nullptr");
1409         return ERR_APPEXECFWK_SERVICE_NOT_READY;
1410     }
1411     return dataMgr->IsApplicationEnabled(bundleName, isEnable);
1412 }
1413 
SetApplicationEnabled(const std::string & bundleName,bool isEnable,int32_t userId)1414 ErrCode BundleMgrHostImpl::SetApplicationEnabled(const std::string &bundleName, bool isEnable, int32_t userId)
1415 {
1416     APP_LOGD("SetApplicationEnabled begin");
1417     if (userId == Constants::UNSPECIFIED_USERID) {
1418         userId = BundleUtil::GetUserIdByCallingUid();
1419     }
1420     if (!VerifySystemApi()) {
1421         APP_LOGE("non-system app calling system api");
1422         return ERR_BUNDLE_MANAGER_SYSTEM_API_DENIED;
1423     }
1424     if (!BundlePermissionMgr::VerifyCallingPermission(Constants::PERMISSION_CHANGE_ABILITY_ENABLED_STATE)) {
1425         APP_LOGE("verify permission failed");
1426         EventReport::SendComponentStateSysEvent(bundleName, "", userId, isEnable, true);
1427         return ERR_BUNDLE_MANAGER_PERMISSION_DENIED;
1428     }
1429     APP_LOGD("verify permission success, begin to SetApplicationEnabled");
1430     auto dataMgr = GetDataMgrFromService();
1431     if (dataMgr == nullptr) {
1432         APP_LOGE("DataMgr is nullptr");
1433         EventReport::SendComponentStateSysEvent(bundleName, "", userId, isEnable, true);
1434         return ERR_APPEXECFWK_SERVICE_NOT_READY;
1435     }
1436 
1437     auto ret = dataMgr->SetApplicationEnabled(bundleName, isEnable, userId);
1438     if (ret != ERR_OK) {
1439         APP_LOGE("Set application(%{public}s) enabled value faile.", bundleName.c_str());
1440         EventReport::SendComponentStateSysEvent(bundleName, "", userId, isEnable, true);
1441         return ret;
1442     }
1443 
1444     EventReport::SendComponentStateSysEvent(bundleName, "", userId, isEnable, false);
1445     InnerBundleUserInfo innerBundleUserInfo;
1446     if (!GetBundleUserInfo(bundleName, userId, innerBundleUserInfo)) {
1447         APP_LOGE("Get calling userInfo in bundle(%{public}s) failed", bundleName.c_str());
1448         return ERR_BUNDLE_MANAGER_BUNDLE_NOT_EXIST;
1449     }
1450 
1451     NotifyBundleEvents installRes = {
1452         .bundleName = bundleName,
1453         .resultCode = ERR_OK,
1454         .type = NotifyType::APPLICATION_ENABLE,
1455         .uid = innerBundleUserInfo.uid,
1456         .accessTokenId = innerBundleUserInfo.accessTokenId
1457     };
1458     NotifyBundleStatus(installRes);
1459     APP_LOGD("SetApplicationEnabled finish");
1460     return ERR_OK;
1461 }
1462 
IsAbilityEnabled(const AbilityInfo & abilityInfo,bool & isEnable)1463 ErrCode BundleMgrHostImpl::IsAbilityEnabled(const AbilityInfo &abilityInfo, bool &isEnable)
1464 {
1465     APP_LOGD("start IsAbilityEnabled");
1466     if (!VerifySystemApi(Constants::API_VERSION_NINE)) {
1467         APP_LOGE("non-system app calling system api");
1468         return ERR_BUNDLE_MANAGER_SYSTEM_API_DENIED;
1469     }
1470     auto dataMgr = GetDataMgrFromService();
1471     if (dataMgr == nullptr) {
1472         APP_LOGE("DataMgr is nullptr");
1473         return ERR_APPEXECFWK_SERVICE_NOT_READY;
1474     }
1475     return dataMgr->IsAbilityEnabled(abilityInfo, isEnable);
1476 }
1477 
SetAbilityEnabled(const AbilityInfo & abilityInfo,bool isEnabled,int32_t userId)1478 ErrCode BundleMgrHostImpl::SetAbilityEnabled(const AbilityInfo &abilityInfo, bool isEnabled, int32_t userId)
1479 {
1480     APP_LOGD("start SetAbilityEnabled");
1481     if (userId == Constants::UNSPECIFIED_USERID) {
1482         userId = BundleUtil::GetUserIdByCallingUid();
1483     }
1484     if (!VerifySystemApi()) {
1485         APP_LOGE("non-system app calling system api");
1486         return ERR_BUNDLE_MANAGER_SYSTEM_API_DENIED;
1487     }
1488     if (!BundlePermissionMgr::VerifyCallingPermission(Constants::PERMISSION_CHANGE_ABILITY_ENABLED_STATE)) {
1489         APP_LOGE("verify permission failed");
1490         EventReport::SendComponentStateSysEvent(
1491             abilityInfo.bundleName, abilityInfo.name, userId, isEnabled, true);
1492         return ERR_BUNDLE_MANAGER_PERMISSION_DENIED;
1493     }
1494 
1495     APP_LOGD("verify permission success, begin to SetAbilityEnabled");
1496     auto dataMgr = GetDataMgrFromService();
1497     if (dataMgr == nullptr) {
1498         APP_LOGE("DataMgr is nullptr");
1499         EventReport::SendComponentStateSysEvent(
1500             abilityInfo.bundleName, abilityInfo.name, userId, isEnabled, true);
1501         return ERR_APPEXECFWK_SERVICE_NOT_READY;
1502     }
1503     auto ret = dataMgr->SetAbilityEnabled(abilityInfo, isEnabled, userId);
1504     if (ret != ERR_OK) {
1505         APP_LOGE("Set ability(%{public}s) enabled value failed.", abilityInfo.bundleName.c_str());
1506         EventReport::SendComponentStateSysEvent(
1507             abilityInfo.bundleName, abilityInfo.name, userId, isEnabled, true);
1508         return ret;
1509     }
1510 
1511     EventReport::SendComponentStateSysEvent(
1512         abilityInfo.bundleName, abilityInfo.name, userId, isEnabled, false);
1513     InnerBundleUserInfo innerBundleUserInfo;
1514     if (!GetBundleUserInfo(abilityInfo.bundleName, userId, innerBundleUserInfo)) {
1515         APP_LOGE("Get calling userInfo in bundle(%{public}s) failed", abilityInfo.bundleName.c_str());
1516         return ERR_BUNDLE_MANAGER_BUNDLE_NOT_EXIST;
1517     }
1518 
1519     NotifyBundleEvents installRes = {
1520         .bundleName = abilityInfo.bundleName,
1521         .abilityName = abilityInfo.name,
1522         .resultCode = ERR_OK,
1523         .type = NotifyType::APPLICATION_ENABLE,
1524         .uid = innerBundleUserInfo.uid,
1525         .accessTokenId = innerBundleUserInfo.accessTokenId,
1526     };
1527     NotifyBundleStatus(installRes);
1528     return ERR_OK;
1529 }
1530 
GetBundleInstaller()1531 sptr<IBundleInstaller> BundleMgrHostImpl::GetBundleInstaller()
1532 {
1533     APP_LOGD("start GetBundleInstaller");
1534     if (!VerifySystemApi()) {
1535         APP_LOGE("non-system app calling system api");
1536         return nullptr;
1537     }
1538     return DelayedSingleton<BundleMgrService>::GetInstance()->GetBundleInstaller();
1539 }
1540 
GetBundleUserMgr()1541 sptr<IBundleUserMgr> BundleMgrHostImpl::GetBundleUserMgr()
1542 {
1543     int32_t callingUid = IPCSkeleton::GetCallingUid();
1544     if (callingUid != Constants::ACCOUNT_UID) {
1545         APP_LOGE("invalid calling uid %{public}d to GetbundleUserMgr", callingUid);
1546         return nullptr;
1547     }
1548     return DelayedSingleton<BundleMgrService>::GetInstance()->GetBundleUserMgr();
1549 }
1550 
GetAllFormsInfo(std::vector<FormInfo> & formInfos)1551 bool BundleMgrHostImpl::GetAllFormsInfo(std::vector<FormInfo> &formInfos)
1552 {
1553     APP_LOGD("start GetAllFormsInfo");
1554     if (!BundlePermissionMgr::VerifyCallingPermission(Constants::PERMISSION_GET_BUNDLE_INFO_PRIVILEGED)) {
1555         APP_LOGE("verify permission failed");
1556         return false;
1557     }
1558     auto dataMgr = GetDataMgrFromService();
1559     if (dataMgr == nullptr) {
1560         APP_LOGE("DataMgr is nullptr");
1561         return false;
1562     }
1563     return dataMgr->GetAllFormsInfo(formInfos);
1564 }
1565 
GetFormsInfoByApp(const std::string & bundleName,std::vector<FormInfo> & formInfos)1566 bool BundleMgrHostImpl::GetFormsInfoByApp(const std::string &bundleName, std::vector<FormInfo> &formInfos)
1567 {
1568     APP_LOGD("start GetFormsInfoByApp, bundleName : %{public}s", bundleName.c_str());
1569     if (!VerifyQueryPermission(bundleName)) {
1570         APP_LOGE("verify permission failed");
1571         return false;
1572     }
1573     auto dataMgr = GetDataMgrFromService();
1574     if (dataMgr == nullptr) {
1575         APP_LOGE("DataMgr is nullptr");
1576         return false;
1577     }
1578     return dataMgr->GetFormsInfoByApp(bundleName, formInfos);
1579 }
1580 
GetFormsInfoByModule(const std::string & bundleName,const std::string & moduleName,std::vector<FormInfo> & formInfos)1581 bool BundleMgrHostImpl::GetFormsInfoByModule(
1582     const std::string &bundleName, const std::string &moduleName, std::vector<FormInfo> &formInfos)
1583 {
1584     APP_LOGD("start GetFormsInfoByModule, bundleName : %{public}s, moduleName : %{public}s",
1585         bundleName.c_str(), moduleName.c_str());
1586     if (!VerifyQueryPermission(bundleName)) {
1587         APP_LOGE("verify permission failed");
1588         return false;
1589     }
1590     auto dataMgr = GetDataMgrFromService();
1591     if (dataMgr == nullptr) {
1592         APP_LOGE("DataMgr is nullptr");
1593         return false;
1594     }
1595     return dataMgr->GetFormsInfoByModule(bundleName, moduleName, formInfos);
1596 }
1597 
GetShortcutInfos(const std::string & bundleName,std::vector<ShortcutInfo> & shortcutInfos)1598 bool BundleMgrHostImpl::GetShortcutInfos(
1599     const std::string &bundleName, std::vector<ShortcutInfo> &shortcutInfos)
1600 {
1601     return GetShortcutInfos(bundleName, Constants::UNSPECIFIED_USERID, shortcutInfos);
1602 }
1603 
GetShortcutInfos(const std::string & bundleName,int32_t userId,std::vector<ShortcutInfo> & shortcutInfos)1604 bool BundleMgrHostImpl::GetShortcutInfos(
1605     const std::string &bundleName, int32_t userId, std::vector<ShortcutInfo> &shortcutInfos)
1606 {
1607     APP_LOGD("start GetShortcutInfos, bundleName : %{public}s, userId : %{public}d", bundleName.c_str(), userId);
1608     if (!VerifySystemApi(Constants::API_VERSION_NINE)) {
1609         APP_LOGD("non-system app calling system api");
1610         return true;
1611     }
1612     if (!BundlePermissionMgr::VerifyCallingPermission(Constants::PERMISSION_GET_BUNDLE_INFO_PRIVILEGED)) {
1613         APP_LOGE("verify permission failed");
1614         return false;
1615     }
1616     APP_LOGD("verify permission success, begin to GetShortcutInfos");
1617     auto dataMgr = GetDataMgrFromService();
1618     if (dataMgr == nullptr) {
1619         APP_LOGE("DataMgr is nullptr");
1620         return false;
1621     }
1622     return dataMgr->GetShortcutInfos(bundleName, userId, shortcutInfos);
1623 }
1624 
GetShortcutInfoV9(const std::string & bundleName,std::vector<ShortcutInfo> & shortcutInfos)1625 ErrCode BundleMgrHostImpl::GetShortcutInfoV9(const std::string &bundleName, std::vector<ShortcutInfo> &shortcutInfos)
1626 {
1627     if (!VerifySystemApi()) {
1628         APP_LOGE("non-system app calling system api");
1629         return ERR_BUNDLE_MANAGER_SYSTEM_API_DENIED;
1630     }
1631     if (!VerifyPrivilegedPermission(bundleName)) {
1632         APP_LOGE("verify permission failed");
1633         return ERR_BUNDLE_MANAGER_PERMISSION_DENIED;
1634     }
1635     auto dataMgr = GetDataMgrFromService();
1636     if (dataMgr == nullptr) {
1637         APP_LOGE("DataMgr is nullptr");
1638         return ERR_BUNDLE_MANAGER_INTERNAL_ERROR;
1639     }
1640     return dataMgr->GetShortcutInfoV9(bundleName, Constants::UNSPECIFIED_USERID, shortcutInfos);
1641 }
1642 
GetAllCommonEventInfo(const std::string & eventKey,std::vector<CommonEventInfo> & commonEventInfos)1643 bool BundleMgrHostImpl::GetAllCommonEventInfo(const std::string &eventKey,
1644     std::vector<CommonEventInfo> &commonEventInfos)
1645 {
1646     APP_LOGD("start GetAllCommonEventInfo, eventKey : %{public}s", eventKey.c_str());
1647     if (!BundlePermissionMgr::VerifyCallingPermission(Constants::PERMISSION_GET_BUNDLE_INFO_PRIVILEGED)) {
1648         APP_LOGE("verify permission failed");
1649         return false;
1650     }
1651     auto dataMgr = GetDataMgrFromService();
1652     if (dataMgr == nullptr) {
1653         APP_LOGE("DataMgr is nullptr");
1654         return false;
1655     }
1656     return dataMgr->GetAllCommonEventInfo(eventKey, commonEventInfos);
1657 }
1658 
GetDistributedBundleInfo(const std::string & networkId,const std::string & bundleName,DistributedBundleInfo & distributedBundleInfo)1659 bool BundleMgrHostImpl::GetDistributedBundleInfo(const std::string &networkId, const std::string &bundleName,
1660     DistributedBundleInfo &distributedBundleInfo)
1661 {
1662     APP_LOGD("start GetDistributedBundleInfo, bundleName : %{public}s", bundleName.c_str());
1663 #ifdef DISTRIBUTED_BUNDLE_FRAMEWORK
1664     if (!VerifyQueryPermission(bundleName)) {
1665         APP_LOGE("verify permission failed");
1666         return false;
1667     }
1668     auto distributedBundleMgr = GetDistributedBundleMgrService();
1669     if (distributedBundleMgr == nullptr) {
1670         APP_LOGE("DistributedBundleMgrService is nullptr");
1671         return false;
1672     }
1673     return distributedBundleMgr->GetDistributedBundleInfo(networkId, bundleName, distributedBundleInfo);
1674 #else
1675     APP_LOGW("DISTRIBUTED_BUNDLE_FRAMEWORK is false");
1676     return false;
1677 #endif
1678 }
1679 
QueryExtensionAbilityInfos(const Want & want,const int32_t & flag,const int32_t & userId,std::vector<ExtensionAbilityInfo> & extensionInfos)1680 bool BundleMgrHostImpl::QueryExtensionAbilityInfos(const Want &want, const int32_t &flag, const int32_t &userId,
1681     std::vector<ExtensionAbilityInfo> &extensionInfos)
1682 {
1683     APP_LOGD("QueryExtensionAbilityInfos without type begin");
1684     if (!VerifySystemApi(Constants::API_VERSION_NINE)) {
1685         APP_LOGD("non-system app calling system api");
1686         return true;
1687     }
1688     if (!VerifyQueryPermission(want.GetElement().GetBundleName())) {
1689         APP_LOGE("verify permission failed");
1690         return false;
1691     }
1692     APP_LOGD("want uri is %{private}s", want.GetUriString().c_str());
1693     auto dataMgr = GetDataMgrFromService();
1694     if (dataMgr == nullptr) {
1695         APP_LOGE("DataMgr is nullptr");
1696         return false;
1697     }
1698     bool ret = dataMgr->QueryExtensionAbilityInfos(want, flag, userId, extensionInfos);
1699     if (!ret) {
1700         APP_LOGE("QueryExtensionAbilityInfos is failed");
1701         return false;
1702     }
1703     if (extensionInfos.empty()) {
1704         APP_LOGE("no valid extension info can be inquired");
1705         return false;
1706     }
1707     return true;
1708 }
1709 
QueryExtensionAbilityInfosV9(const Want & want,int32_t flags,int32_t userId,std::vector<ExtensionAbilityInfo> & extensionInfos)1710 ErrCode BundleMgrHostImpl::QueryExtensionAbilityInfosV9(const Want &want, int32_t flags, int32_t userId,
1711     std::vector<ExtensionAbilityInfo> &extensionInfos)
1712 {
1713     APP_LOGD("QueryExtensionAbilityInfosV9 without type begin");
1714     if (!VerifySystemApi()) {
1715         APP_LOGE("non-system app calling system api");
1716         return ERR_BUNDLE_MANAGER_SYSTEM_API_DENIED;
1717     }
1718     if (!VerifyQueryPermission(want.GetElement().GetBundleName())) {
1719         APP_LOGE("verify permission failed");
1720         return ERR_BUNDLE_MANAGER_PERMISSION_DENIED;
1721     }
1722     APP_LOGD("want uri is %{private}s", want.GetUriString().c_str());
1723     auto dataMgr = GetDataMgrFromService();
1724     if (dataMgr == nullptr) {
1725         APP_LOGE("DataMgr is nullptr");
1726         return ERR_BUNDLE_MANAGER_INTERNAL_ERROR;
1727     }
1728     ErrCode ret = dataMgr->QueryExtensionAbilityInfosV9(want, flags, userId, extensionInfos);
1729     if (ret != ERR_OK) {
1730         APP_LOGE("QueryExtensionAbilityInfosV9 is failed");
1731         return ret;
1732     }
1733     if (extensionInfos.empty()) {
1734         APP_LOGE("no valid extension info can be inquired");
1735         return ERR_BUNDLE_MANAGER_ABILITY_NOT_EXIST;
1736     }
1737     return ERR_OK;
1738 }
1739 
QueryExtensionAbilityInfos(const Want & want,const ExtensionAbilityType & extensionType,const int32_t & flag,const int32_t & userId,std::vector<ExtensionAbilityInfo> & extensionInfos)1740 bool BundleMgrHostImpl::QueryExtensionAbilityInfos(const Want &want, const ExtensionAbilityType &extensionType,
1741     const int32_t &flag, const int32_t &userId, std::vector<ExtensionAbilityInfo> &extensionInfos)
1742 {
1743     APP_LOGD("QueryExtensionAbilityInfos begin");
1744     if (!VerifySystemApi(Constants::API_VERSION_NINE)) {
1745         APP_LOGD("non-system app calling system api");
1746         return true;
1747     }
1748     if (!VerifyQueryPermission(want.GetElement().GetBundleName())) {
1749         APP_LOGE("verify permission failed");
1750         return false;
1751     }
1752     auto dataMgr = GetDataMgrFromService();
1753     if (dataMgr == nullptr) {
1754         APP_LOGE("DataMgr is nullptr");
1755         return false;
1756     }
1757     std::vector<ExtensionAbilityInfo> infos;
1758     bool ret = dataMgr->QueryExtensionAbilityInfos(want, flag, userId, infos);
1759     if (!ret) {
1760         APP_LOGE("QueryExtensionAbilityInfos is failed");
1761         return false;
1762     }
1763     for_each(infos.begin(), infos.end(), [&extensionType, &extensionInfos](const auto &info)->decltype(auto) {
1764         APP_LOGD("QueryExtensionAbilityInfos extensionType is %{public}d, info.type is %{public}d",
1765             static_cast<int32_t>(extensionType), static_cast<int32_t>(info.type));
1766         if (extensionType == info.type) {
1767             extensionInfos.emplace_back(info);
1768         }
1769     });
1770     if (extensionInfos.empty()) {
1771         APP_LOGE("no valid extension info can be inquired");
1772         return false;
1773     }
1774     return true;
1775 }
1776 
QueryExtensionAbilityInfosV9(const Want & want,const ExtensionAbilityType & extensionType,int32_t flags,int32_t userId,std::vector<ExtensionAbilityInfo> & extensionInfos)1777 ErrCode BundleMgrHostImpl::QueryExtensionAbilityInfosV9(const Want &want, const ExtensionAbilityType &extensionType,
1778     int32_t flags, int32_t userId, std::vector<ExtensionAbilityInfo> &extensionInfos)
1779 {
1780     APP_LOGD("QueryExtensionAbilityInfosV9 begin");
1781     if (!VerifySystemApi()) {
1782         APP_LOGE("non-system app calling system api");
1783         return ERR_BUNDLE_MANAGER_SYSTEM_API_DENIED;
1784     }
1785     if (!VerifyQueryPermission(want.GetElement().GetBundleName())) {
1786         APP_LOGE("verify permission failed");
1787         return ERR_BUNDLE_MANAGER_PERMISSION_DENIED;
1788     }
1789     auto dataMgr = GetDataMgrFromService();
1790     if (dataMgr == nullptr) {
1791         APP_LOGE("DataMgr is nullptr");
1792         return ERR_BUNDLE_MANAGER_INTERNAL_ERROR;
1793     }
1794     std::vector<ExtensionAbilityInfo> infos;
1795     ErrCode ret = dataMgr->QueryExtensionAbilityInfosV9(want, flags, userId, infos);
1796     if (ret != ERR_OK) {
1797         APP_LOGE("QueryExtensionAbilityInfosV9 is failed");
1798         return ret;
1799     }
1800     for_each(infos.begin(), infos.end(), [&extensionType, &extensionInfos](const auto &info)->decltype(auto) {
1801         APP_LOGD("QueryExtensionAbilityInfosV9 extensionType is %{public}d, info.type is %{public}d",
1802             static_cast<int32_t>(extensionType), static_cast<int32_t>(info.type));
1803         if (extensionType == info.type) {
1804             extensionInfos.emplace_back(info);
1805         }
1806     });
1807     if (extensionInfos.empty()) {
1808         APP_LOGE("no valid extension info can be inquired");
1809         return ERR_BUNDLE_MANAGER_ABILITY_NOT_EXIST;
1810     }
1811     return ERR_OK;
1812 }
1813 
QueryExtensionAbilityInfos(const ExtensionAbilityType & extensionType,const int32_t & userId,std::vector<ExtensionAbilityInfo> & extensionInfos)1814 bool BundleMgrHostImpl::QueryExtensionAbilityInfos(const ExtensionAbilityType &extensionType, const int32_t &userId,
1815     std::vector<ExtensionAbilityInfo> &extensionInfos)
1816 {
1817     APP_LOGD("QueryExtensionAbilityInfos with type begin");
1818     if (!VerifySystemApi(Constants::API_VERSION_NINE)) {
1819         APP_LOGD("non-system app calling system api");
1820         return true;
1821     }
1822     if (!BundlePermissionMgr::VerifyCallingPermission(Constants::PERMISSION_GET_BUNDLE_INFO_PRIVILEGED)) {
1823         APP_LOGE("verify permission failed");
1824         return false;
1825     }
1826     auto dataMgr = GetDataMgrFromService();
1827     if (dataMgr == nullptr) {
1828         APP_LOGE("DataMgr is nullptr");
1829         return false;
1830     }
1831     bool ret = dataMgr->QueryExtensionAbilityInfos(extensionType, userId, extensionInfos);
1832     if (!ret) {
1833         APP_LOGE("QueryExtensionAbilityInfos is failed");
1834         return false;
1835     }
1836 
1837     if (extensionInfos.empty()) {
1838         APP_LOGE("no valid extension info can be inquired");
1839         return false;
1840     }
1841     return true;
1842 }
1843 
GetDataMgrFromService()1844 const std::shared_ptr<BundleDataMgr> BundleMgrHostImpl::GetDataMgrFromService()
1845 {
1846     return DelayedSingleton<BundleMgrService>::GetInstance()->GetDataMgr();
1847 }
1848 
1849 #ifdef DISTRIBUTED_BUNDLE_FRAMEWORK
GetDistributedBundleMgrService()1850 const OHOS::sptr<IDistributedBms> BundleMgrHostImpl::GetDistributedBundleMgrService()
1851 {
1852     auto saMgr = OHOS::SystemAbilityManagerClient::GetInstance().GetSystemAbilityManager();
1853     if (saMgr == nullptr) {
1854         APP_LOGE("saMgr is nullptr");
1855         return nullptr;
1856     }
1857     OHOS::sptr<OHOS::IRemoteObject> remoteObject =
1858         saMgr->CheckSystemAbility(OHOS::DISTRIBUTED_BUNDLE_MGR_SERVICE_SYS_ABILITY_ID);
1859     return OHOS::iface_cast<IDistributedBms>(remoteObject);
1860 }
1861 #endif
1862 
1863 #ifdef BUNDLE_FRAMEWORK_FREE_INSTALL
GetConnectAbilityMgrFromService()1864 const std::shared_ptr<BundleConnectAbilityMgr> BundleMgrHostImpl::GetConnectAbilityMgrFromService()
1865 {
1866     return DelayedSingleton<BundleMgrService>::GetInstance()->GetConnectAbility();
1867 }
1868 #endif
1869 
GetExistsCommonUserIs()1870 std::set<int32_t> BundleMgrHostImpl::GetExistsCommonUserIs()
1871 {
1872     std::set<int32_t> userIds;
1873     auto dataMgr = GetDataMgrFromService();
1874     if (dataMgr == nullptr) {
1875         APP_LOGE("Get dataMgr shared_ptr nullptr");
1876         return userIds;
1877     }
1878 
1879     for (auto userId : dataMgr->GetAllUser()) {
1880         if (userId >= Constants::START_USERID) {
1881             userIds.insert(userId);
1882         }
1883     }
1884     return userIds;
1885 }
1886 
VerifyQueryPermission(const std::string & queryBundleName)1887 bool BundleMgrHostImpl::VerifyQueryPermission(const std::string &queryBundleName)
1888 {
1889     std::string callingBundleName;
1890     bool ret = GetBundleNameForUid(IPCSkeleton::GetCallingUid(), callingBundleName);
1891     APP_LOGD("callingBundleName : %{public}s", callingBundleName.c_str());
1892     if (ret && (queryBundleName == callingBundleName)) {
1893         APP_LOGD("query own info, verify success");
1894         return true;
1895     }
1896     if (!BundlePermissionMgr::VerifyCallingPermission(Constants::PERMISSION_GET_BUNDLE_INFO) &&
1897         !BundlePermissionMgr::VerifyCallingPermission(Constants::PERMISSION_GET_BUNDLE_INFO_PRIVILEGED)) {
1898         APP_LOGE("verify query permission failed");
1899         return false;
1900     }
1901     APP_LOGD("verify query permission successfully");
1902     return true;
1903 }
1904 
VerifyPrivilegedPermission(const std::string & queryBundleName)1905 bool BundleMgrHostImpl::VerifyPrivilegedPermission(const std::string &queryBundleName)
1906 {
1907     std::string callingBundleName;
1908     bool ret = GetBundleNameForUid(IPCSkeleton::GetCallingUid(), callingBundleName);
1909     APP_LOGD("callingBundleName : %{public}s", callingBundleName.c_str());
1910     if (ret && (queryBundleName == callingBundleName)) {
1911         APP_LOGD("query own info, verify success");
1912         return true;
1913     }
1914     if (!BundlePermissionMgr::VerifyCallingPermission(Constants::PERMISSION_GET_BUNDLE_INFO_PRIVILEGED)) {
1915         APP_LOGE("verify query permission failed");
1916         return false;
1917     }
1918     APP_LOGD("verify query permission successfully");
1919     return true;
1920 }
1921 
GetAppPrivilegeLevel(const std::string & bundleName,int32_t userId)1922 std::string BundleMgrHostImpl::GetAppPrivilegeLevel(const std::string &bundleName, int32_t userId)
1923 {
1924     APP_LOGD("start GetAppPrivilegeLevel");
1925     if (!VerifyQueryPermission(bundleName)) {
1926         APP_LOGE("verify permission failed");
1927         return Constants::EMPTY_STRING;
1928     }
1929     auto dataMgr = GetDataMgrFromService();
1930     if (dataMgr == nullptr) {
1931         APP_LOGE("DataMgr is nullptr");
1932         return Constants::EMPTY_STRING;
1933     }
1934     return dataMgr->GetAppPrivilegeLevel(bundleName, userId);
1935 }
1936 
VerifyCallingPermission(const std::string & permission)1937 bool BundleMgrHostImpl::VerifyCallingPermission(const std::string &permission)
1938 {
1939     APP_LOGD("VerifyCallingPermission begin");
1940     return BundlePermissionMgr::VerifyCallingPermission(permission);
1941 }
1942 
GetAccessibleAppCodePaths(int32_t userId)1943 std::vector<std::string> BundleMgrHostImpl::GetAccessibleAppCodePaths(int32_t userId)
1944 {
1945     APP_LOGD("GetAccessibleAppCodePaths begin");
1946     if (!BundlePermissionMgr::IsNativeTokenType()) {
1947         APP_LOGE("verify token type failed");
1948         std::vector<std::string> vec;
1949         return vec;
1950     }
1951     auto dataMgr = GetDataMgrFromService();
1952     if (dataMgr == nullptr) {
1953         APP_LOGE("DataMgr is nullptr");
1954         std::vector<std::string> vec;
1955         return vec;
1956     }
1957 
1958     return dataMgr->GetAccessibleAppCodePaths(userId);
1959 }
1960 
QueryExtensionAbilityInfoByUri(const std::string & uri,int32_t userId,ExtensionAbilityInfo & extensionAbilityInfo)1961 bool BundleMgrHostImpl::QueryExtensionAbilityInfoByUri(const std::string &uri, int32_t userId,
1962     ExtensionAbilityInfo &extensionAbilityInfo)
1963 {
1964     APP_LOGD("uri : %{private}s, userId : %{public}d", uri.c_str(), userId);
1965     if (!VerifySystemApi(Constants::API_VERSION_NINE)) {
1966         APP_LOGE("non-system app calling system api");
1967         return true;
1968     }
1969     if (!BundlePermissionMgr::VerifyCallingPermission(Constants::PERMISSION_GET_BUNDLE_INFO) &&
1970         !BundlePermissionMgr::VerifyCallingPermission(Constants::PERMISSION_GET_BUNDLE_INFO_PRIVILEGED)) {
1971         APP_LOGE("verify query permission failed");
1972         return false;
1973     }
1974     auto dataMgr = GetDataMgrFromService();
1975     if (dataMgr == nullptr) {
1976         APP_LOGE("DataMgr is nullptr");
1977         return false;
1978     }
1979     return dataMgr->QueryExtensionAbilityInfoByUri(uri, userId, extensionAbilityInfo);
1980 }
1981 
GetAppIdByBundleName(const std::string & bundleName,const int userId)1982 std::string BundleMgrHostImpl::GetAppIdByBundleName(const std::string &bundleName, const int userId)
1983 {
1984     APP_LOGD("bundleName : %{public}s, userId : %{public}d", bundleName.c_str(), userId);
1985     if (!BundlePermissionMgr::VerifyCallingPermission(Constants::PERMISSION_GET_BUNDLE_INFO) &&
1986         !BundlePermissionMgr::VerifyCallingPermission(Constants::PERMISSION_GET_BUNDLE_INFO_PRIVILEGED)) {
1987         APP_LOGE("verify query permission failed");
1988         return Constants::EMPTY_STRING;
1989     }
1990     auto dataMgr = GetDataMgrFromService();
1991     if (dataMgr == nullptr) {
1992         APP_LOGE("DataMgr is nullptr");
1993         return Constants::EMPTY_STRING;
1994     }
1995     BundleInfo bundleInfo;
1996     bool ret = dataMgr->GetBundleInfo(bundleName, GET_BUNDLE_DEFAULT, bundleInfo, userId);
1997     if (!ret) {
1998         APP_LOGE("get bundleInfo failed");
1999         return Constants::EMPTY_STRING;
2000     }
2001     APP_LOGD("appId is %{private}s", bundleInfo.appId.c_str());
2002     return bundleInfo.appId;
2003 }
2004 
GetAppType(const std::string & bundleName)2005 std::string BundleMgrHostImpl::GetAppType(const std::string &bundleName)
2006 {
2007     APP_LOGD("bundleName : %{public}s", bundleName.c_str());
2008     if (!VerifyQueryPermission(bundleName)) {
2009         APP_LOGE("verify permission failed");
2010         return Constants::EMPTY_STRING;
2011     }
2012     auto dataMgr = GetDataMgrFromService();
2013     if (dataMgr == nullptr) {
2014         APP_LOGE("DataMgr is nullptr");
2015         return Constants::EMPTY_STRING;
2016     }
2017     BundleInfo bundleInfo;
2018     bool ret = dataMgr->GetBundleInfo(bundleName, GET_BUNDLE_DEFAULT, bundleInfo, Constants::UNSPECIFIED_USERID);
2019     if (!ret) {
2020         APP_LOGE("get bundleInfo failed");
2021         return Constants::EMPTY_STRING;
2022     }
2023     bool isSystemApp = bundleInfo.applicationInfo.isSystemApp;
2024     std::string appType = isSystemApp ? Constants::SYSTEM_APP : Constants::THIRD_PARTY_APP;
2025     APP_LOGD("appType is %{public}s", appType.c_str());
2026     return appType;
2027 }
2028 
GetUidByBundleName(const std::string & bundleName,const int userId)2029 int BundleMgrHostImpl::GetUidByBundleName(const std::string &bundleName, const int userId)
2030 {
2031     APP_LOGD("bundleName : %{public}s, userId : %{public}d", bundleName.c_str(), userId);
2032     if (!BundlePermissionMgr::IsNativeTokenType()) {
2033         APP_LOGE("verify token type failed");
2034         return Constants::INVALID_UID;
2035     }
2036     auto dataMgr = GetDataMgrFromService();
2037     if (dataMgr == nullptr) {
2038         APP_LOGE("DataMgr is nullptr");
2039         return Constants::INVALID_UID;
2040     }
2041     std::vector<BundleInfo> bundleInfos;
2042     int32_t uid = Constants::INVALID_UID;
2043     bool ret = dataMgr->GetBundleInfos(GET_BUNDLE_DEFAULT, bundleInfos, userId);
2044     if (ret) {
2045         for (auto bundleInfo : bundleInfos) {
2046             if (bundleInfo.name == bundleName) {
2047                 uid = bundleInfo.uid;
2048                 break;
2049             }
2050         }
2051         APP_LOGD("get bundle uid success");
2052     } else {
2053         APP_LOGE("can not get bundleInfo's uid");
2054     }
2055     APP_LOGD("uid is %{public}d", uid);
2056     return uid;
2057 }
2058 
GetUidByDebugBundleName(const std::string & bundleName,const int userId)2059 int BundleMgrHostImpl::GetUidByDebugBundleName(const std::string &bundleName, const int userId)
2060 {
2061     APP_LOGD("bundleName : %{public}s, userId : %{public}d", bundleName.c_str(), userId);
2062     auto dataMgr = GetDataMgrFromService();
2063     if (dataMgr == nullptr) {
2064         APP_LOGE("DataMgr is nullptr");
2065         return Constants::INVALID_UID;
2066     }
2067     ApplicationInfo appInfo;
2068     int32_t uid = Constants::INVALID_UID;
2069     bool ret = dataMgr->GetApplicationInfo(bundleName, GET_BUNDLE_DEFAULT, userId, appInfo);
2070     if (ret && appInfo.debug) {
2071         uid = appInfo.uid;
2072         APP_LOGD("get debug bundle uid success, uid is %{public}d", uid);
2073     } else {
2074         APP_LOGE("can not get bundleInfo's uid");
2075     }
2076     return uid;
2077 }
2078 
GetAbilityInfo(const std::string & bundleName,const std::string & abilityName,AbilityInfo & abilityInfo)2079 bool BundleMgrHostImpl::GetAbilityInfo(
2080     const std::string &bundleName, const std::string &abilityName, AbilityInfo &abilityInfo)
2081 {
2082     APP_LOGD("start GetAbilityInfo, bundleName : %{public}s, abilityName : %{public}s",
2083         bundleName.c_str(), abilityName.c_str());
2084     ElementName elementName("", bundleName, abilityName);
2085     Want want;
2086     want.SetElement(elementName);
2087     return QueryAbilityInfo(want, abilityInfo);
2088 }
2089 
GetAbilityInfo(const std::string & bundleName,const std::string & moduleName,const std::string & abilityName,AbilityInfo & abilityInfo)2090 bool BundleMgrHostImpl::GetAbilityInfo(
2091     const std::string &bundleName, const std::string &moduleName,
2092     const std::string &abilityName, AbilityInfo &abilityInfo)
2093 {
2094     APP_LOGD("start GetAbilityInfo, bundleName : %{public}s, moduleName : %{public}s, abilityName : %{public}s",
2095         bundleName.c_str(), moduleName.c_str(), abilityName.c_str());
2096     if (!VerifySystemApi(Constants::API_VERSION_NINE)) {
2097         APP_LOGD("non-system app calling system api");
2098         return true;
2099     }
2100     ElementName elementName("", bundleName, abilityName, moduleName);
2101     Want want;
2102     want.SetElement(elementName);
2103     return QueryAbilityInfo(want, abilityInfo);
2104 }
2105 
ImplicitQueryInfoByPriority(const Want & want,int32_t flags,int32_t userId,AbilityInfo & abilityInfo,ExtensionAbilityInfo & extensionInfo)2106 bool BundleMgrHostImpl::ImplicitQueryInfoByPriority(const Want &want, int32_t flags, int32_t userId,
2107     AbilityInfo &abilityInfo, ExtensionAbilityInfo &extensionInfo)
2108 {
2109     APP_LOGD("start ImplicitQueryInfoByPriority, flags : %{public}d, userId : %{public}d", flags, userId);
2110     if (!VerifySystemApi(Constants::API_VERSION_NINE)) {
2111         APP_LOGD("non-system app calling system api");
2112         return true;
2113     }
2114     if (!VerifyQueryPermission(want.GetElement().GetBundleName())) {
2115         APP_LOGE("verify permission failed");
2116         return false;
2117     }
2118     auto dataMgr = GetDataMgrFromService();
2119     if (dataMgr == nullptr) {
2120         APP_LOGE("DataMgr is nullptr");
2121         return false;
2122     }
2123     return dataMgr->ImplicitQueryInfoByPriority(want, flags, userId, abilityInfo, extensionInfo);
2124 }
2125 
ImplicitQueryInfos(const Want & want,int32_t flags,int32_t userId,std::vector<AbilityInfo> & abilityInfos,std::vector<ExtensionAbilityInfo> & extensionInfos)2126 bool BundleMgrHostImpl::ImplicitQueryInfos(const Want &want, int32_t flags, int32_t userId,
2127     std::vector<AbilityInfo> &abilityInfos, std::vector<ExtensionAbilityInfo> &extensionInfos)
2128 {
2129     APP_LOGD("begin to ImplicitQueryInfos, flags : %{public}d, userId : %{public}d", flags, userId);
2130     if (!VerifySystemApi(Constants::API_VERSION_NINE)) {
2131         APP_LOGD("non-system app calling system api");
2132         return true;
2133     }
2134     if (!VerifyQueryPermission(want.GetElement().GetBundleName())) {
2135         APP_LOGE("verify permission failed");
2136         return false;
2137     }
2138     auto dataMgr = GetDataMgrFromService();
2139     if (dataMgr == nullptr) {
2140         APP_LOGE("DataMgr is nullptr");
2141         return false;
2142     }
2143     return dataMgr->ImplicitQueryInfos(want, flags, userId, abilityInfos, extensionInfos);
2144 }
2145 
Dump(int fd,const std::vector<std::u16string> & args)2146 int BundleMgrHostImpl::Dump(int fd, const std::vector<std::u16string> &args)
2147 {
2148     std::string result;
2149     std::vector<std::string> argsStr;
2150     for (auto item : args) {
2151         argsStr.emplace_back(Str16ToStr8(item));
2152     }
2153 
2154     if (!DelayedSingleton<BundleMgrService>::GetInstance()->Hidump(argsStr, result)) {
2155         APP_LOGE("Hidump error");
2156         return ERR_APPEXECFWK_HIDUMP_ERROR;
2157     }
2158 
2159     int ret = dprintf(fd, "%s\n", result.c_str());
2160     if (ret < 0) {
2161         APP_LOGE("dprintf error");
2162         return ERR_APPEXECFWK_HIDUMP_ERROR;
2163     }
2164 
2165     return ERR_OK;
2166 }
2167 
GetAllDependentModuleNames(const std::string & bundleName,const std::string & moduleName,std::vector<std::string> & dependentModuleNames)2168 bool BundleMgrHostImpl::GetAllDependentModuleNames(const std::string &bundleName, const std::string &moduleName,
2169     std::vector<std::string> &dependentModuleNames)
2170 {
2171     APP_LOGD("GetAllDependentModuleNames: bundleName: %{public}s, moduleName: %{public}s",
2172         bundleName.c_str(), moduleName.c_str());
2173     if (!VerifyQueryPermission(bundleName)) {
2174         APP_LOGE("verify permission failed");
2175         return false;
2176     }
2177     auto dataMgr = GetDataMgrFromService();
2178     if (dataMgr == nullptr) {
2179         APP_LOGE("DataMgr is nullptr");
2180         return false;
2181     }
2182     return dataMgr->GetAllDependentModuleNames(bundleName, moduleName, dependentModuleNames);
2183 }
2184 
GetSandboxBundleInfo(const std::string & bundleName,int32_t appIndex,int32_t userId,BundleInfo & info)2185 ErrCode BundleMgrHostImpl::GetSandboxBundleInfo(
2186     const std::string &bundleName, int32_t appIndex, int32_t userId, BundleInfo &info)
2187 {
2188     APP_LOGD("start GetSandboxBundleInfo, bundleName : %{public}s, appindex : %{public}d, userId : %{public}d",
2189         bundleName.c_str(), appIndex, userId);
2190     // check bundle name
2191     if (bundleName.empty()) {
2192         APP_LOGE("GetSandboxBundleInfo failed due to empty bundleName");
2193         return ERR_APPEXECFWK_SANDBOX_INSTALL_PARAM_ERROR;
2194     }
2195     // check appIndex
2196     if (appIndex <= Constants::INITIAL_APP_INDEX || appIndex > Constants::MAX_APP_INDEX) {
2197         APP_LOGE("the appIndex %{public}d is invalid", appIndex);
2198         return ERR_APPEXECFWK_SANDBOX_INSTALL_PARAM_ERROR;
2199     }
2200     if (!VerifyQueryPermission(bundleName)) {
2201         APP_LOGE("verify permission failed");
2202         return ERR_APPEXECFWK_PERMISSION_DENIED;
2203     }
2204     auto dataMgr = GetDataMgrFromService();
2205     if (dataMgr == nullptr) {
2206         APP_LOGE("DataMgr is nullptr");
2207         return ERR_APPEXECFWK_SANDBOX_INSTALL_INTERNAL_ERROR;
2208     }
2209     auto sandboxAppHelper = dataMgr->GetSandboxAppHelper();
2210     if (sandboxAppHelper == nullptr) {
2211         APP_LOGE("sandboxAppHelper is nullptr");
2212         return ERR_APPEXECFWK_SANDBOX_INSTALL_INTERNAL_ERROR;
2213     }
2214     int32_t requestUserId = dataMgr->GetUserId(userId);
2215     if (requestUserId == Constants::INVALID_USERID) {
2216         return ERR_APPEXECFWK_SANDBOX_QUERY_INVALID_USER_ID;
2217     }
2218     return sandboxAppHelper->GetSandboxAppBundleInfo(bundleName, appIndex, requestUserId, info);
2219 }
2220 
SetDisposedStatus(const std::string & bundleName,int32_t status)2221 bool BundleMgrHostImpl::SetDisposedStatus(const std::string &bundleName, int32_t status)
2222 {
2223     APP_LOGD("SetDisposedStatus: bundleName: %{public}s, status: %{public}d", bundleName.c_str(), status);
2224     // check permission
2225     if (!BundlePermissionMgr::VerifyCallingPermission(Constants::PERMISSION_MANAGE_DISPOSED_APP_STATUS)) {
2226         APP_LOGE("SetDisposedStatus bundleName: %{public}s failed due to lack of permission", bundleName.c_str());
2227         return false;
2228     }
2229     auto dataMgr = GetDataMgrFromService();
2230     if (dataMgr == nullptr) {
2231         APP_LOGE("DataMgr is nullptr");
2232         return false;
2233     }
2234     return dataMgr->SetDisposedStatus(bundleName, status);
2235 }
2236 
GetDisposedStatus(const std::string & bundleName)2237 int32_t BundleMgrHostImpl::GetDisposedStatus(const std::string &bundleName)
2238 {
2239     APP_LOGD("GetDisposedStatus: bundleName: %{public}s", bundleName.c_str());
2240     // check permission
2241     if (!BundlePermissionMgr::VerifyCallingPermission(Constants::PERMISSION_MANAGE_DISPOSED_APP_STATUS)) {
2242         APP_LOGE("GetDisposedStatus bundleName: %{public}s failed due to lack of permission", bundleName.c_str());
2243         return Constants::DEFAULT_DISPOSED_STATUS;
2244     }
2245     auto dataMgr = GetDataMgrFromService();
2246     if (dataMgr == nullptr) {
2247         APP_LOGE("DataMgr is nullptr");
2248         return Constants::DEFAULT_DISPOSED_STATUS;
2249     }
2250     return dataMgr->GetDisposedStatus(bundleName);
2251 }
2252 
ObtainCallingBundleName(std::string & bundleName)2253 bool BundleMgrHostImpl::ObtainCallingBundleName(std::string &bundleName)
2254 {
2255     bool ret = GetBundleNameForUid(IPCSkeleton::GetCallingUid(), bundleName);
2256     if (!ret) {
2257         APP_LOGE("query calling bundle name failed");
2258         return false;
2259     }
2260     APP_LOGD("calling bundleName is : %{public}s", bundleName.c_str());
2261     return ret;
2262 }
2263 
GetBundleStats(const std::string & bundleName,int32_t userId,std::vector<int64_t> & bundleStats)2264 bool BundleMgrHostImpl::GetBundleStats(const std::string &bundleName, int32_t userId,
2265     std::vector<int64_t> &bundleStats)
2266 {
2267     if (!VerifyQueryPermission(bundleName)) {
2268         APP_LOGE("verify permission failed");
2269         return false;
2270     }
2271     auto dataMgr = GetDataMgrFromService();
2272     if (dataMgr == nullptr) {
2273         APP_LOGE("DataMgr is nullptr");
2274         return false;
2275     }
2276     return dataMgr->GetBundleStats(bundleName, userId, bundleStats);
2277 }
2278 
GetStringById(const std::string & bundleName,const std::string & moduleName,uint32_t resId,int32_t userId,const std::string & localeInfo)2279 std::string BundleMgrHostImpl::GetStringById(const std::string &bundleName, const std::string &moduleName,
2280     uint32_t resId, int32_t userId, const std::string &localeInfo)
2281 {
2282     if (!BundlePermissionMgr::IsNativeTokenType()) {
2283         APP_LOGE("verify token type failed");
2284         return Constants::EMPTY_STRING;
2285     }
2286     auto dataMgr = GetDataMgrFromService();
2287     if (dataMgr == nullptr) {
2288         APP_LOGE("DataMgr is nullptr");
2289         return Constants::EMPTY_STRING;
2290     }
2291     return dataMgr->GetStringById(bundleName, moduleName, resId, userId, localeInfo);
2292 }
2293 
GetIconById(const std::string & bundleName,const std::string & moduleName,uint32_t resId,uint32_t density,int32_t userId)2294 std::string BundleMgrHostImpl::GetIconById(
2295     const std::string &bundleName, const std::string &moduleName, uint32_t resId, uint32_t density, int32_t userId)
2296 {
2297     if (!BundlePermissionMgr::IsNativeTokenType()) {
2298         APP_LOGE("verify token type failed");
2299         return Constants::EMPTY_STRING;
2300     }
2301     auto dataMgr = GetDataMgrFromService();
2302     if (dataMgr == nullptr) {
2303         APP_LOGE("DataMgr is nullptr");
2304         return Constants::EMPTY_STRING;
2305     }
2306     return dataMgr->GetIconById(bundleName, moduleName, resId, density, userId);
2307 }
2308 
GetUdidByNetworkId(const std::string & networkId,std::string & udid)2309 int32_t BundleMgrHostImpl::GetUdidByNetworkId(const std::string &networkId, std::string &udid)
2310 {
2311 #ifdef DEVICE_MANAGER_ENABLE
2312     if (!BundlePermissionMgr::VerifyCallingPermission(Constants::PERMISSION_GET_BUNDLE_INFO_PRIVILEGED)) {
2313         APP_LOGE("verify permission failed");
2314         return -1;
2315     }
2316     auto deviceManager = DelayedSingleton<BundleMgrService>::GetInstance()->GetDeviceManager();
2317     if (deviceManager == nullptr) {
2318         APP_LOGE("deviceManager is nullptr");
2319         return -1;
2320     }
2321     return deviceManager->GetUdidByNetworkId(networkId, udid);
2322 #else
2323     APP_LOGW("deviceManager is unable");
2324     return -1;
2325 #endif
2326 }
2327 
2328 #ifdef BUNDLE_FRAMEWORK_DEFAULT_APP
GetDefaultAppProxy()2329 sptr<IDefaultApp> BundleMgrHostImpl::GetDefaultAppProxy()
2330 {
2331     return DelayedSingleton<BundleMgrService>::GetInstance()->GetDefaultAppProxy();
2332 }
2333 #endif
2334 
2335 #ifdef BUNDLE_FRAMEWORK_APP_CONTROL
GetAppControlProxy()2336 sptr<IAppControlMgr> BundleMgrHostImpl::GetAppControlProxy()
2337 {
2338     return DelayedSingleton<BundleMgrService>::GetInstance()->GetAppControlProxy();
2339 }
2340 #endif
2341 
GetQuickFixManagerProxy()2342 sptr<IQuickFixManager> BundleMgrHostImpl::GetQuickFixManagerProxy()
2343 {
2344 #ifdef BUNDLE_FRAMEWORK_QUICK_FIX
2345     return DelayedSingleton<BundleMgrService>::GetInstance()->GetQuickFixManagerProxy();
2346 #else
2347     return nullptr;
2348 #endif
2349 }
2350 
GetSandboxAbilityInfo(const Want & want,int32_t appIndex,int32_t flags,int32_t userId,AbilityInfo & info)2351 ErrCode BundleMgrHostImpl::GetSandboxAbilityInfo(const Want &want, int32_t appIndex, int32_t flags, int32_t userId,
2352     AbilityInfo &info)
2353 {
2354     APP_LOGD("start GetSandboxAbilityInfo appIndex : %{public}d, userId : %{public}d", appIndex, userId);
2355     if (!VerifyQueryPermission(want.GetElement().GetBundleName())) {
2356         APP_LOGE("verify permission failed");
2357         return ERR_APPEXECFWK_PERMISSION_DENIED;
2358     }
2359     auto dataMgr = GetDataMgrFromService();
2360     if (dataMgr == nullptr) {
2361         APP_LOGE("DataMgr is nullptr");
2362         return ERR_APPEXECFWK_SANDBOX_QUERY_INTERNAL_ERROR;
2363     }
2364 
2365     if (!dataMgr->QueryAbilityInfo(want, flags, userId, info, appIndex)) {
2366         APP_LOGE("query ability info failed");
2367         return ERR_APPEXECFWK_SANDBOX_QUERY_INTERNAL_ERROR;
2368     }
2369     return ERR_OK;
2370 }
2371 
GetSandboxExtAbilityInfos(const Want & want,int32_t appIndex,int32_t flags,int32_t userId,std::vector<ExtensionAbilityInfo> & infos)2372 ErrCode BundleMgrHostImpl::GetSandboxExtAbilityInfos(const Want &want, int32_t appIndex, int32_t flags,
2373     int32_t userId, std::vector<ExtensionAbilityInfo> &infos)
2374 {
2375     APP_LOGD("start GetSandboxExtAbilityInfos appIndex : %{public}d, userId : %{public}d", appIndex, userId);
2376     if (!VerifyQueryPermission(want.GetElement().GetBundleName())) {
2377         APP_LOGE("verify permission failed");
2378         return ERR_BUNDLE_MANAGER_PERMISSION_DENIED;
2379     }
2380     auto dataMgr = GetDataMgrFromService();
2381     if (dataMgr == nullptr) {
2382         APP_LOGE("DataMgr is nullptr");
2383         return ERR_APPEXECFWK_SANDBOX_QUERY_INTERNAL_ERROR;
2384     }
2385 
2386     if (!dataMgr->QueryExtensionAbilityInfos(want, flags, userId, infos, appIndex)) {
2387         APP_LOGE("query extension ability info failed");
2388         return ERR_APPEXECFWK_SANDBOX_QUERY_INTERNAL_ERROR;
2389     }
2390     return ERR_OK;
2391 }
2392 
GetSandboxHapModuleInfo(const AbilityInfo & abilityInfo,int32_t appIndex,int32_t userId,HapModuleInfo & info)2393 ErrCode BundleMgrHostImpl::GetSandboxHapModuleInfo(const AbilityInfo &abilityInfo, int32_t appIndex, int32_t userId,
2394     HapModuleInfo &info)
2395 {
2396     APP_LOGD("start GetSandboxHapModuleInfo appIndex : %{public}d, userId : %{public}d", appIndex, userId);
2397     if (!VerifyQueryPermission(abilityInfo.bundleName)) {
2398         APP_LOGE("verify permission failed");
2399         return false;
2400     }
2401     auto dataMgr = GetDataMgrFromService();
2402     if (dataMgr == nullptr) {
2403         APP_LOGE("DataMgr is nullptr");
2404         return ERR_APPEXECFWK_SANDBOX_QUERY_INTERNAL_ERROR;
2405     }
2406     auto sandboxAppHelper = dataMgr->GetSandboxAppHelper();
2407     if (sandboxAppHelper == nullptr) {
2408         APP_LOGE("sandboxAppHelper is nullptr");
2409         return ERR_APPEXECFWK_SANDBOX_QUERY_INTERNAL_ERROR;
2410     }
2411     int32_t requestUserId = dataMgr->GetUserId(userId);
2412     if (requestUserId == Constants::INVALID_USERID) {
2413         return ERR_APPEXECFWK_SANDBOX_QUERY_INVALID_USER_ID;
2414     }
2415     return sandboxAppHelper->GetSandboxHapModuleInfo(abilityInfo, appIndex, requestUserId, info);
2416 }
2417 
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)2418 ErrCode BundleMgrHostImpl::GetMediaData(const std::string &bundleName, const std::string &moduleName,
2419     const std::string &abilityName, std::unique_ptr<uint8_t[]> &mediaDataPtr, size_t &len, int32_t userId)
2420 {
2421     if (!VerifySystemApi(Constants::API_VERSION_NINE)) {
2422         APP_LOGE("non-system app calling system api");
2423         return ERR_BUNDLE_MANAGER_SYSTEM_API_DENIED;
2424     }
2425     if (!VerifyQueryPermission(bundleName)) {
2426         APP_LOGE("verify permission failed");
2427         return ERR_BUNDLE_MANAGER_PERMISSION_DENIED;
2428     }
2429     auto dataMgr = GetDataMgrFromService();
2430     if (dataMgr == nullptr) {
2431         APP_LOGE("DataMgr is nullptr");
2432         return ERR_BUNDLE_MANAGER_INTERNAL_ERROR;
2433     }
2434     return dataMgr->GetMediaData(bundleName, moduleName, abilityName, mediaDataPtr, len, userId);
2435 }
2436 
NotifyBundleStatus(const NotifyBundleEvents & installRes)2437 void BundleMgrHostImpl::NotifyBundleStatus(const NotifyBundleEvents &installRes)
2438 {
2439     std::shared_ptr<BundleCommonEventMgr> commonEventMgr = std::make_shared<BundleCommonEventMgr>();
2440     commonEventMgr->NotifyBundleStatus(installRes, nullptr);
2441 }
2442 
SetDebugMode(bool isDebug)2443 ErrCode BundleMgrHostImpl::SetDebugMode(bool isDebug)
2444 {
2445     int32_t callingUid = IPCSkeleton::GetCallingUid();
2446     if (callingUid != Constants::ROOT_UID && callingUid != Constants::BMS_UID) {
2447         APP_LOGE("invalid calling uid %{public}d to set debug mode", callingUid);
2448         return ERR_BUNDLEMANAGER_SET_DEBUG_MODE_UID_CHECK_FAILED;
2449     }
2450     if (isDebug) {
2451         BundleVerifyMgr::EnableDebug();
2452     } else {
2453         BundleVerifyMgr::DisableDebug();
2454     }
2455     return ERR_OK;
2456 }
2457 
VerifySystemApi(int32_t beginApiVersion)2458 bool BundleMgrHostImpl::VerifySystemApi(int32_t beginApiVersion)
2459 {
2460     APP_LOGD("begin to verify system app");
2461     return BundlePermissionMgr::VerifySystemApp(beginApiVersion);
2462 }
2463 
GetProvisionMetadata(const std::string & bundleName,int32_t userId,std::vector<Metadata> & provisionMetadatas)2464 ErrCode BundleMgrHostImpl::GetProvisionMetadata(const std::string &bundleName, int32_t userId,
2465     std::vector<Metadata> &provisionMetadatas)
2466 {
2467     if (!VerifyQueryPermission(bundleName)) {
2468         APP_LOGE("verify permission failed");
2469         return ERR_BUNDLE_MANAGER_PERMISSION_DENIED;
2470     }
2471     auto dataMgr = GetDataMgrFromService();
2472     if (dataMgr == nullptr) {
2473         APP_LOGE("DataMgr is nullptr");
2474         return ERR_BUNDLE_MANAGER_INTERNAL_ERROR;
2475     }
2476     return dataMgr->GetProvisionMetadata(bundleName, userId, provisionMetadatas);
2477 }
2478 }  // namespace AppExecFwk
2479 }  // namespace OHOS
2480